Subversion Repositories spacemission

Compare Revisions

No changes between revisions

Ignore whitespace Rev HEAD → Rev 1

/ComInfo.pas
File deleted
/ComLevelReader.pas
File deleted
/LevEdit_Icon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/GamSplash.dfm
File deleted
/GamSplash.pas
File deleted
/LICENSE
File deleted
/ComInfo.dfm
File deleted
/TODO.md
File deleted
/.gitignore
File deleted
/GamMain.pas
File deleted
/GamSpeicherung.dfm
File deleted
/_SpacemissionGroup.groupproj
File deleted
/VCL_MARKDOWN/MarkdownProcessor.pas
File deleted
/VCL_MARKDOWN/MarkdownCommonMark.pas
File deleted
/VCL_MARKDOWN/MarkdownDaringFireball.pas
File deleted
/VCL_MARKDOWN/MarkdownUnicodeUtils.pas
File deleted
/VCL_MARKDOWN/MarkdownHTMLEntities.pas
File deleted
/VCL_MARKDOWN
Property changes:
Deleted: svn:global-ignores
-*.dcu
/SpaceMission.dproj
File deleted
/SpaceMission_Icon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/ENU/ComHilfe.dfm
File deleted
/ENU/ComHilfe.dfn
File deleted
/ENU/LevMain.dfm
File deleted
/ENU/LevMain.dfn
File deleted
/ENU/SpaceMission.dof
File deleted
/ENU/LevEdit_ENU.bdsproj
File deleted
/ENU/LevEdit_DRC.rcn
File deleted
/ENU/GamSpeicherung.dfm
File deleted
/ENU/LevOptions.dfm
File deleted
/ENU/GamSpeicherung.dfn
File deleted
/ENU/LevOptions.dfn
File deleted
/ENU/SpaceMission_DRC.RES
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/ENU/LevEdit.dpr
File deleted
/ENU/GamSplash.dfm
File deleted
/ENU/GamSplash.dfn
File deleted
/ENU/LevSpeicherung.dfm
File deleted
/ENU/LevSpeicherung.dfn
File deleted
/ENU/ComInfo.dfm
File deleted
/ENU/ComInfo.dfn
File deleted
/ENU/LevEdit.dof
File deleted
/ENU/SpaceMission_DRC.rcn
File deleted
/ENU/LevSplash.dfm
File deleted
/ENU/SpaceMission_ENU.bdsproj
File deleted
/ENU/LevSplash.dfn
File deleted
/ENU/LevEdit_DRC.RES
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/ENU/GamCheat.dfm
File deleted
/ENU/GamMain.dfm
File deleted
/ENU/GamCheat.dfn
File deleted
/ENU/GamMain.dfn
File deleted
/ENU/SpaceMission.dpr
File deleted
/ENU/LevEdit_DRC.rc
File deleted
/ENU/SpaceMission_DRC.rc
File deleted
/ENU
Property changes:
Deleted: svn:global-ignores
-*.local
/Global.pas
File deleted
/LevEdit.dproj
File deleted
/GamMain.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/AuthentiCode Sign/sign_single.bat
File deleted
/ComHilfe.pas
File deleted
/GamCheat.pas
File deleted
/ComHilfe.dfm
File deleted
/GamCheat.dfm
File deleted
/README.md
File deleted
/GamSpeicherung.pas
File deleted
/Help/EN_General.md
File deleted
\ No newline at end of file
/Help/DE_Changelog.md
File deleted
/Help/DE_General.md
File deleted
/Help/Style.css
File deleted
/Help/EN_Changelog.md
File deleted
/SplInfo.dfm
0,0 → 1,133
object InfoForm: TInfoForm
Left = 289
Top = 184
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Informationen'
ClientHeight = 193
ClientWidth = 321
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnCreate = FormCreate
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object HomeLbl: TLabel
Left = 32
Top = 136
Width = 48
Height = 13
Caption = 'Webseite:'
Transparent = True
end
object Image: TImage
Left = 8
Top = 8
Width = 65
Height = 57
Center = True
Stretch = True
end
object FirmaLbl: TLabel
Left = 88
Top = 8
Width = 31
Height = 13
Caption = 'Firma'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
Transparent = True
end
object NameLbl: TLabel
Left = 104
Top = 24
Width = 28
Height = 13
Caption = 'Name'
Transparent = True
end
object VersionLbl: TLabel
Left = 232
Top = 24
Width = 35
Height = 13
Caption = 'Version'
Transparent = True
end
object EMailLbl: TLabel
Left = 32
Top = 120
Width = 32
Height = 13
Caption = 'E-Mail:'
Transparent = True
end
object CopyrightLbl: TLabel
Left = 8
Top = 80
Width = 44
Height = 13
Caption = 'Copyright'
Transparent = True
end
object Copyright2Lbl: TLabel
Left = 8
Top = 96
Width = 117
Height = 13
Caption = 'Alle Rechte vorbehalten!'
Transparent = True
end
object URL2: TLabel
Left = 152
Top = 136
Width = 117
Height = 13
Cursor = crHandPoint
Caption = 'www.daniel-marschall.de'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
Transparent = True
OnClick = URL2Click
end
object URL1: TLabel
Left = 152
Top = 120
Width = 118
Height = 13
Cursor = crHandPoint
Caption = 'info@daniel-marschall.de'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
Transparent = True
OnClick = URL1Click
end
object ElPopupButton1: TButton
Left = 208
Top = 160
Width = 107
Height = 25
Caption = 'OK'
TabOrder = 0
OnClick = ElPopupButton1Click
end
end
/LevEdit.dpr
1,62 → 1,64
program LevEdit;
 
{$Description 'SpaceMission Leveleditor 1.1'}
 
{%ToDo 'LevEdit.todo'}
 
uses
Windows,
{$IF CompilerVersion >= 23.0}
System.UITypes,
{$IFEND }
Forms,
Dialogs,
SysUtils,
MMSystem,
LevMain in 'LevMain.pas' {MainForm},
LevText in 'LevText.pas' {TextForm},
LevSplash in 'LevSplash.pas' {SplashForm},
LevSpeicherung in 'LevSpeicherung.pas' {SpeicherungForm},
ComInfo in 'ComInfo.pas' {InfoForm},
LevOptions in 'LevOptions.pas' {LevelForm},
ComLevelReader in 'ComLevelReader.pas',
Global in 'Global.pas',
ComHilfe in 'ComHilfe.pas' {HilfeForm};
LevInfo in 'LevInfo.pas' {InfoForm},
LevSource in 'LevSource.pas' {SourceForm},
LevOptions in 'LevOptions.pas' {LevelForm};
 
{$R *.RES}
 
var
Fehler: boolean;
Sem: THandle;
directory: string;
 
resourcestring
SAlreadyStarted = 'Der Editor wurde bereits gestartet.';
STitel = 'SpaceMission Level-Editor';
SFileMissing = '%s fehlt. Bitte installieren Sie SpaceMission erneut.';
 
const
SemaphoreName = 'SpaceMission Level Editor';
 
begin
SpaceMission_SwitchLanguage;
{ Programm schon gestartet? }
Sem := CreateSemaphore(nil, 0, 1, SemaphoreName);
Sem := CreateSemaphore(nil, 0, 1, 'SpaceMission Leveleditor');
if (Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
begin
CloseHandle(Sem);
MessageDlg(SAlreadyStarted, mtInformation, [mbOK], 0);
MessageDlg('Der Editor wurde bereits gestartet.', mtInformation, [mbOK], 0);
exit;
end;
SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
SplashForm.Update;
SplashForm.Update;
Application.Initialize;
Application.ShowMainform := False;
Application.MainFormOnTaskBar := true;
Application.Title := STitel;
if not fileexists(OwnDirectory+DxgFile) then
Application.showmainform := False;
Application.Title := 'SpaceMission 1.1 - Leveleditor';
Fehler := false;
directory := extractfilepath(paramstr(0));
// if not fileexists(directory+'Bilder\Auswahl.bmp') then Fehler := true;
if not fileexists(directory+'DirectX\Graphic.dxg') then Fehler := true;
// if not fileexists(directory+'Texte\Mitwirkende.txt') then Fehler := true;
// if not fileexists(directory+'Dateien.doc') then Fehler := true;
if Fehler then
begin
MessageDLG(Format(SFilemissing, [DxgFile]), mtError, [mbOK], 0);
MessageDLG('Dateien, die die Programmstabilität gewährleisten, sind ' +
'nicht mehr vorhanden!'+#13#10+'Bitte installieren Sie SpaceMission erneut...',
mtWarning, [mbOK], 0);
exit;
end;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TTextForm, TextForm);
Application.CreateForm(TSpeicherungForm, SpeicherungForm);
Application.CreateForm(TInfoForm, InfoForm);
Application.CreateForm(TSourceForm, SourceForm);
Application.CreateForm(TLevelForm, LevelForm);
Application.CreateForm(THilfeForm, HilfeForm);
Application.Run;
end.
 
/LevEdit.identcache
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_InnoSetup/SpaceMission.iss
1,63 → 1,114
; SpaceMission Setup Script for InnoSetup
; SpaceMission Setup Script for InnoSetup 5.1.12
; by Daniel Marschall
 
; http://www.daniel-marschall.de/
 
; Shut-Down Game?!
 
[Setup]
AppName=SpaceMission
AppVerName=SpaceMission 1.2.2
AppVersion=1.2.2
AppCopyright=© Copyright 2001 - 2024 ViaThinkSoft
AppVerName=SpaceMission 1.1
AppVersion=1.1
AppCopyright=© Copyright 2001 - 2007 ViaThinkSoft.
AppPublisher=ViaThinkSoft
AppPublisherURL=https://www.viathinksoft.de/
AppSupportURL=https://www.daniel-marschall.de/
AppUpdatesURL=https://www.viathinksoft.de/
DefaultDirName={autopf}\SpaceMission
AppPublisherURL=http://www.viathinksoft.de/
AppSupportURL=http://www.daniel-marschall.de/
AppUpdatesURL=http://www.viathinksoft.de/
DefaultDirName={pf}\SpaceMission
DefaultGroupName=SpaceMission
VersionInfoCompany=ViaThinkSoft
VersionInfoCopyright=© Copyright 2001 - 2024 ViaThinkSoft
VersionInfoCopyright=© Copyright 2001 - 2007 ViaThinkSoft.
VersionInfoDescription=SpraceMission Setup
VersionInfoTextVersion=1.0.0.0
VersionInfoVersion=1.2.2
PrivilegesRequiredOverridesAllowed=dialog
UsePreviousPrivileges=no
ShowLanguageDialog=no
OutputBaseFilename=SpaceMission_Setup
OutputDir=.
; Configure Sign Tool in InnoSetup at "Tools => Configure Sign Tools" (adjust the path to your SVN repository location)
; Name = sign_single
; Command = "C:\SVN\...\sign_single.bat" $f
SignTool=sign_single
SignedUninstaller=yes
VersionInfoVersion=1.1
Compression=zip/9
 
[Languages]
Name: en; MessagesFile: "compiler:Default.isl"
Name: de; MessagesFile: "compiler:Languages\German.isl"
 
[LangOptions]
LanguageName=Deutsch
LanguageID=$0407
 
[Tasks]
Name: "desktopicon"; Description: "Erstelle eine Verknüpfung auf dem &Desktop"; GroupDescription: "Programmverknüpfungen:"; MinVersion: 4,4
Name: "levedit"; Description: "Installiere den &Leveleditor"; GroupDescription: "Zusatzprogramme:"; MinVersion: 4,4
Name: "compiler"; Description: "Installiere den Level&compiler"; GroupDescription: "Zusatzprogramme:"; MinVersion: 4,4
 
[Files]
Source: "..\SpaceMission.exe"; DestDir: "{app}"; Flags: ignoreversion signonce
Source: "..\LevEdit.exe"; DestDir: "{app}"; Flags: ignoreversion signonce
Source: "..\SpaceMission.enu"; DestDir: "{app}"; Flags: ignoreversion signonce
Source: "..\LevEdit.enu"; DestDir: "{app}"; Flags: ignoreversion signonce
Source: "..\Help\*.md"; DestDir: "{app}\Help"; Flags: ignoreversion
Source: "..\Help\*.css"; DestDir: "{app}\Help"; Flags: ignoreversion
Source: "..\DirectX\Graphics.dxg"; DestDir: "{app}\DirectX"; Flags: ignoreversion
Source: "..\DirectX\Music.dxm"; DestDir: "{app}\DirectX"; Flags: ignoreversion
Source: "..\SpaceMission.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\LevEdit.exe"; DestDir: "{app}"; Flags: ignoreversion; Tasks: levedit
Source: "..\Compiler.exe"; DestDir: "{app}"; Flags: ignoreversion; Tasks: compiler
Source: "..\Dokumentation.pdf"; DestDir: "{app}"; Flags: ignoreversion
Source: "..\Bilder\Auswahl.bmp"; DestDir: "{app}\Bilder"; Flags: ignoreversion; Tasks: levedit
Source: "..\Bilder\Delphi.bmp"; DestDir: "{app}\Bilder"; Flags: ignoreversion
Source: "..\Bilder\LevSplash.jpg"; DestDir: "{app}\Bilder"; Flags: ignoreversion; Tasks: levedit
Source: "..\Bilder\SplSplash.jpg"; DestDir: "{app}\Bilder"; Flags: ignoreversion
Source: "..\DirectX\Sound.dxw"; DestDir: "{app}\DirectX"; Flags: ignoreversion
Source: "..\Levels\*.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\DirectX\Graphic.dxg"; DestDir: "{app}\DirectX"; Flags: ignoreversion
Source: "..\Einstellungen\SpaceMission.ini"; DestDir: "{app}\Einstellungen"; Flags: ignoreversion
Source: "..\Levels\Level 1.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 2.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 3.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 4.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 5.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 6.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 7.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 8.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 9.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 10.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 11.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 12.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 13.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 14.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 15.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 16.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 17.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 18.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 19.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 20.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 21.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 22.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 23.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 24.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 25.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 26.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 27.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 28.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 29.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 30.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Levels\Level 31.lev"; DestDir: "{app}\Levels"; Flags: ignoreversion
Source: "..\Musik\Boss.mid"; DestDir: "{app}\Musik"; Flags: ignoreversion
Source: "..\Musik\Game.mid"; DestDir: "{app}\Musik"; Flags: ignoreversion
Source: "..\Musik\Scene.mid"; DestDir: "{app}\Musik"; Flags: ignoreversion
Source: "..\Musik\Title.mid"; DestDir: "{app}\Musik"; Flags: ignoreversion
Source: "..\Texte\Mitwirkende.txt"; DestDir: "{app}\Texte"; Flags: ignoreversion
 
;[Dirs]
;Name: "{group}\Webseiten"
[Dirs]
Name: "{app}\Spielstände"
Name: "{app}\Levels"
Name: "{app}\Eingabe"; Tasks: compiler
Name: "{app}\Ausgabe"; Tasks: compiler
Name: "{app}\Temp"; Tasks: compiler
Name: "{app}\Temp\1"; Tasks: compiler
Name: "{app}\Temp\2"; Tasks: compiler
Name: "{group}\Webseiten"
Name: "{group}\Ordner"
 
[Icons]
;Name: "{group}\Webseiten\Daniel Marschall"; Filename: "https://www.daniel-marschall.de/"
;Name: "{group}\Webseiten\ViaThinkSoft"; Filename: "https://www.viathinksoft.de/"
;Name: "{group}\Webseiten\Projektseite auf ViaThinkSoft"; Filename: "https://www.viathinksoft.de/index.php?page=projektanzeige&seite=projekt-19"
Name: "{group}\Webseiten\Daniel Marschalls Webportal"; Filename: "http://www.daniel-marschall.de/"
Name: "{group}\Webseiten\ViaThinkSoft"; Filename: "http://www.viathinksoft.de/"
Name: "{group}\Webseiten\Projektseite auf ViaThinkSoft"; Filename: "http://www.viathinksoft.de/index.php?page=projektanzeige&seite=projekt-19"
Name: "{group}\SpaceMission"; Filename: "{app}\SpaceMission.exe"
Name: "{group}\SpaceMission Level Editor"; Filename: "{app}\LevEdit.exe"
Name: "{autodesktop}\SpaceMission"; Filename: "{app}\SpaceMission.exe"; MinVersion: 4,4; Tasks: desktopicon
Name: "{autodesktop}\SpaceMission Level Editor"; Filename: "{app}\LevEdit.exe"; MinVersion: 4,4; Tasks: desktopicon
Name: "{group}\Dokumentation"; Filename: "{app}\Dokumentation.pdf"
Name: "{group}\Leveleditor"; Filename: "{app}\LevEdit.exe"; Tasks: levedit
Name: "{group}\Levelcompiler"; Filename: "{app}\Compiler.exe"; Tasks: compiler
Name: "{group}\Ordner\Levelordner"; Filename: "{app}\Levels\"
Name: "{group}\Ordner\Spielstände"; Filename: "{app}\Spielstände\"
Name: "{group}\Ordner\Compiler Eingabeordner"; Filename: "{app}\Eingabe\"; Tasks: compiler
Name: "{group}\Ordner\Compiler Ausgabeordner"; Filename: "{app}\Ausgabe\"; Tasks: compiler
Name: "{userdesktop}\SpaceMission"; Filename: "{app}\SpaceMission.exe"; MinVersion: 4,4; Tasks: desktopicon
Name: "{group}\SpaceMission deinstallieren"; Filename: "{uninstallexe}"
 
[Run]
Filename: "{app}\SpaceMission.exe"; Description: "SpaceMission starten"; Flags: nowait postinstall skipifsilent
/_InnoSetup
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/SplMain.pas
0,0 → 1,2464
unit SplMain;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, Dialogs,
StdCtrls, ExtCtrls, Menus, SplInfo, DIB, DXClass, DXSprite, DXDraws, DXInput,
DXSounds, PJVersionInfo, INIFiles, shellapi, wininet;
 
type
TGameScene = (
gsNone,
gsTitle,
gsMain,
gsGameOver,
gsNewLevel,
gsWin
);
 
TGameInterval = (
giMittel,
giLeicht,
giSchwer
);
 
TMusicTrack = (
mtNone,
mtGame,
mtBoss,
mtScene,
mtTitle
);
 
{TSoundFile = (
sfNone,
sfSceneMov,
sfExplosion,
sfHit,
sfShoot,
sfDanger,
sfEnde,
sfFrage,
sfLevIntro
);}
 
TMainForm = class(TDXForm)
MainMenu: TMainMenu;
Spiel: TMenuItem;
GameStart: TMenuItem;
GamePause: TMenuItem;
Beenden: TMenuItem;
Einstellungen: TMenuItem;
OptionFullScreen: TMenuItem;
OptionMusic: TMenuItem;
Leer2: TMenuItem;
Leer4: TMenuItem;
Hilfe: TMenuItem;
OptionSound: TMenuItem;
Mitarbeiter: TMenuItem;
Leer3: TMenuItem;
Spielstand: TMenuItem;
Leer5: TMenuItem;
Neustart: TMenuItem;
OptionBreitbild: TMenuItem;
Spielgeschwindigkeit: TMenuItem;
Leicht: TMenuItem;
Mittel: TMenuItem;
Schwer: TMenuItem;
Informationen: TMenuItem;
Leer6: TMenuItem;
Leer1: TMenuItem;
Cheat: TMenuItem;
AufUpdatesprfen1: TMenuItem;
procedure DXDrawFinalize(Sender: TObject);
procedure DXDrawInitialize(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
procedure DXTimerActivate(Sender: TObject);
procedure DXTimerDeactivate(Sender: TObject);
procedure OptionFullScreenClick(Sender: TObject);
procedure DXDrawInitializing(Sender: TObject);
procedure GameStartClick(Sender: TObject);
procedure GamePauseClick(Sender: TObject);
procedure BeendenClick(Sender: TObject);
procedure OptionSoundClick(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure OptionMusicClick(Sender: TObject);
procedure MitarbeiterClick(Sender: TObject);
procedure SpielstandClick(Sender: TObject);
procedure NeustartClick(Sender: TObject);
procedure OptionBreitbildClick(Sender: TObject);
procedure LeichtClick(Sender: TObject);
procedure MittelClick(Sender: TObject);
procedure SchwerClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure InformationenClick(Sender: TObject);
procedure CheatClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure AufUpdatesprfen1Click(Sender: TObject);
private
FInterval: TGameInterval;
FScene: TGameScene;
FMusic: TMusicTrack;
FBlink: DWORD;
FBlinkTime: DWORD;
FFrame, FAngle, FCounter, FEnemyAdventPos: Integer;
procedure StartScene(Scene: TGameScene);
procedure EndScene;
procedure BlinkStart;
procedure BlinkUpdate;
procedure StartSceneTitle;
procedure SceneTitle;
procedure EndSceneTitle;
procedure StartSceneMain;
procedure SceneMain;
procedure EndSceneMain;
procedure StartSceneGameOver;
procedure SceneGameOver;
procedure EndSceneGameOver;
procedure StartSceneWin;
procedure SceneWin;
procedure EndSceneWin;
procedure StartSceneNewLevel;
procedure SceneNewLevel;
procedure EndSceneNewLevel;
public
FDirectory: string;
FEngineVersion: string;
FNextScene: TGameScene;
FScore: Integer;
FNotSave: boolean;
FLife: integer;
FLevel: integer;
FMenuItem: integer;
FBossLife: integer;
FRestEnemys: integer;
FCheat: boolean;
{ VCL-Ersatz }
dxdraw: TDxDraw;
imagelist: TDxImageList;
spriteengine: tdxspriteengine;
dxsound: tdxsound;
wavelist: tdxwavelist;
dxinput: tdxinput;
dxtimer: tdxtimer;
versioninfo: tpjversioninfo;
{ Level-Routinen }
procedure NewLevel(lev: integer);
procedure DeleteArray;
{ MCI-Routinen }
function StatusMusic(Name: TMusicTrack): string;
procedure PlayMusic(Name: TMusicTrack);
//procedure StopMusic(Name: TMusicTrack);
procedure PauseMusic(Name: TMusicTrack);
procedure ResumeMusic(Name: TMusicTrack);
procedure DestroyMusic(Name: TMusicTrack);
procedure OpenMusic(Name: TMusicTrack);
{ Sound-Routinen }
function SoundKarte: boolean;
procedure PlaySound(Name: string; Wait: Boolean);
{ Initialisiations-Routinen }
procedure DXInit;
procedure SoundInit;
procedure MusicInit;
{ Einstellungs-Routinen }
procedure LoadOptions;
procedure WriteOptions;
{ Farb-Routinen }
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
end;
 
var
MainForm: TMainForm;
 
const
conleicht = 650 div 60;
conmittel = 1000 div 60;
conschwer = 1350 div 60;
lives = 6;
FCompVersion = '1.0';
 
implementation
 
uses
SplSplash, SplSpeicherung, SplText, SplCheat;
 
const
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
 
{$R *.DFM}
 
{$R WindowsXP.res}
 
type
 
TBackground = class(TBackgroundSprite)
private
FSpeed: Double;
protected
procedure DoMove(MoveCount: Integer); override;
end;
 
TBackgroundSpecial = class(TBackgroundSprite)
private
FSpeed: Double;
protected
procedure DoMove(MoveCount: Integer); override;
end;
 
TExplosion = class(TImageSprite)
private
FCounter: Integer;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TPlayerSprite = class(TImageSprite)
private
FCounter: Integer;
FMode: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TTamaSprite = class(TImageSprite)
private
FPlayerSprite: TPlayerSprite;
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
destructor Destroy; override;
end;
 
TEnemy = class(TImageSprite)
private
FCounter: Integer;
FLife: integer;
FMode: Integer;
procedure Hit; virtual;
protected
procedure HitEnemy(Deaded: Boolean); virtual;
public
constructor Create(AParent: TSprite); override;
destructor Destroy; override;
end;
 
TEnemyTama = class(TImageSprite)
private
FPlayerSprite: TSprite;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyMeteor= class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyUFO = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyUFO2 = class(TEnemy)
private
FCounter: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyAttacker = class(TEnemy)
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyAttacker2 = class(TEnemy)
private
FCounter: Integer;
FTamaF: Integer;
FTamaT: Integer;
FPutTama: Boolean;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyAttacker3 = class(TEnemy)
private
FCounter: Integer;
FTamaCount: Integer;
FOldTamaTime: Integer;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TEnemyBoss = class(TEnemy)
private
FCounter: Integer;
FTamaF: Integer;
FTamaT: Integer;
FPutTama: Boolean;
waiter1, waiter2: integer;
protected
procedure DoMove(MoveCount: Integer); override;
procedure HitEnemy(Deaded: Boolean); override;
public
constructor Create(AParent: TSprite); override;
end;
 
TNoting = class(TImageSprite);
 
TSpriteClass = class of TSprite;
 
TEnemyAdvent = record
c: TSpriteClass;
x: extended;
y: extended;
l: integer;
end;
 
var
EnemyAdventTable: array[0..9999] of TEnemyAdvent;
Crash2, ec: integer;
BossExists, Crash, crashsound, SpielerFliegtFort: boolean;
pos: array[1..4] of integer;
enemys: array[1..27] of TSpriteClass;
 
const
DXInputButton = [isButton1, isButton2, isButton3,
isButton4, isButton5, isButton6, isButton7, isButton8, isButton9, isButton10, isButton11,
isButton12, isButton13, isButton14, isButton15, isButton16, isButton17, isButton18,
isButton19, isButton20, isButton21, isButton22, isButton23, isButton24, isButton25,
isButton26, isButton27, isButton28, isButton29, isButton30, isButton31, isButton32];
 
constructor TPlayerSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Machine');
Width := Image.Width;
Height := Image.Height;
X := -70{20};
Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
Z := 2;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
FMode := 4;
end;
 
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if mainform.FCheat then exit;
if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
begin
if not crash then
begin
dec(MainForm.FLife);
Crash := true;
if MainForm.Flife=0 then
begin
MainForm.PlaySound('Explosion', false);
Collisioned := false;
FCounter := 0;
FMode := 1;
Done := false;
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end;
end
else
begin
if not crashsound then
begin
MainForm.PlaySound('Hit', False);
crashsound := true;
end;
end;
end;
end;
 
procedure TPlayerSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if SpielerFliegtFort then FMode := 3;
if FMode=0 then
begin
if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount;
if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount;
if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
if X<0 then X := 0;
if X>mainform.dxdraw.surfacewidth-Width then X := mainform.dxdraw.surfacewidth-Width;
if Y<0 then Y := 0;
if Y>mainform.dxdraw.surfaceheight-Height then Y := mainform.dxdraw.surfaceheight-Height;
if isButton1 in MainForm.DXInput.States then
begin
if (FTamaCount<8) and (FCounter-FOldTamaTime>=100) then
begin
Inc(FTamaCount);
with TTamaSprite.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X+Self.Width;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end;
Collision;
end else if FMode=1 then
begin
if FCounter>200 then
begin
FCounter := 0;
FMode := 2;
Visible := false;
end;
end else if FMode=2 then
begin
if FCounter>1500 then
begin
MainForm.FNextScene := gsGameOver;
MainForm.PlaySound('SceneMov', false);
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
end;
end else if FMode=3 then
begin
X := X + MoveCount*(300/1000);
if X > MainForm.DXDraw.Width+Width then
begin
Dead;
inc(mainform.FLevel);
MainForm.FNextScene := gsNewLevel;
MainForm.PlaySound('SceneMov', false);
MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
end;
end else if FMode=4 then
begin
X := X + MoveCount*(300/1000);
if X > 19 then FMode := 0;
end;
inc(FCounter, MoveCount);
end;
 
procedure TMainForm.DXInit;
begin
try
Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
OptionBreitBild.enabled := OptionFullScreen.checked;
DXDraw.Finalize;
if OptionFullScreen.Checked then
begin
if not (doFullScreen in DXDraw.Options) then StoreWindow;
DXDraw.Options := DXDraw.Options + [doFullScreen];
end else
begin
if doFullScreen in DXDraw.Options then RestoreWindow;
DXDraw.Options := DXDraw.Options - [doFullScreen];
end;
if not OptionBreitBild.checked then
begin
dxdraw.autosize := false;
dxdraw.Top := 0;
dxdraw.Left := 0;
dxdraw.width := 640;
dxdraw.height := 480;
dxdraw.surfacewidth := 640;
dxdraw.surfaceheight := 480;
end
else dxdraw.autosize := true;
DXDraw.Initialize;
except
//Imagelist.Items.clear;
//application.terminate;
end;
end;
 
constructor TTamaSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Bounce');
Z := 2;
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
MainForm.PlaySound('Shoot', False);
end;
 
destructor TTamaSprite.Destroy;
begin
inherited Destroy;
Dec(FPlayerSprite.FTamaCount);
end;
 
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if (Sprite is TEnemy) and (not (Sprite is TEnemyTama)) then
begin
TEnemy(Sprite).Hit;
Dead;
end;
Done := False;
end;
 
procedure TTamaSprite.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X+(800/1000)*MoveCount;
if X>=mainform.dxdraw.surfacewidth then Dead;
Collision;
end;
 
procedure TBackground.DoMove(MoveCount: Integer);
var
ran: integer;
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(60/1000)*FSpeed;
randomize;
ran := Random(1500);
if ran = 150 then
begin
with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Background-Planet1');
Width := Image.Width;
Height := Image.Height;
 
Y := random(mainform.dxdraw.height);
X := mainform.dxdraw.width;
 
ran := Random(2);
if ran = 0 then
begin
Z := -20;
FSpeed := 1.8;
end
else if ran = 1 then
begin
Z := -40;
FSpeed := 0.8;
end
else if ran = 2 then
begin
Z := -60;
FSpeed := 0.3;
end;
end;
end
else if ran = 500 then
begin
with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
ran := Random(4);
if ran = 0 then
Image := mainform.ImageList.Items.Find('Background-Red')
else if ran = 1 then
Image := mainform.ImageList.Items.Find('Background-Blue')
else if ran = 2 then
Image := mainform.ImageList.Items.Find('Background-Yellow')
else if ran = 3 then
Image := mainform.ImageList.Items.Find('Hintergrund-Rot');
Width := Image.Width;
Height := Image.Height;
 
Y := random(mainform.dxdraw.height);
X := mainform.dxdraw.width;
 
{ ran := Random(2);
if ran = 0 then
begin
Z := -20;
FSpeed := 1.8;
end
else if ran = 1 then
begin
Z := -40;
FSpeed := 0.8;
end
else if ran = 2 then
begin }
Z := -60;
FSpeed := 0.3;
{ end; }
end;
end;
end;
 
procedure TBackgroundSpecial.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(60/1000)*FSpeed;
if X<-Width then Dead;
end;
 
constructor TExplosion.Create(AParent: TSprite);
begin
inherited Create(AParent);
mainform.PlaySound('Explosion', false);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
AnimPos := Random(AnimCount);
end;
 
procedure TExplosion.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
inc(FCounter, MoveCount);
if FCounter > 2999 then dead;
end;
 
constructor TEnemyTama.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Bounce2');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
MainForm.PlaySound('Shoot', False);
end;
 
procedure TEnemyTama.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
X := X - MoveCount*(600/1000);
if X<-Width then Dead;
end;
 
procedure TEnemy.Hit;
begin
Dec(FLife);
if FLife<=0 then
begin
Collisioned := False;
HitEnemy(True);
end
else
HitEnemy(False);
end;
 
procedure TEnemy.HitEnemy(Deaded: Boolean);
begin
if Deaded then MainForm.PlaySound('Explosion', False);
end;
 
constructor TEnemyUFO.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-disk');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l;
end;
 
constructor TEnemy.Create(AParent: TSprite);
begin
inherited Create(AParent);
dec(mainform.FRestEnemys);
inc(ec);
end;
 
destructor TEnemy.Destroy;
begin
inherited Destroy;
dec(ec);
end;
 
procedure TEnemyUFO.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - MoveCount*(300/1000);
Y := Y + Cos256(FCounter div 15)*2;
if X<-Width then Dead;
if FCounter-FOldTamaTime>=100 then
begin
Inc(FTamaCount);
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
procedure TEnemyUFO2.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
constructor TEnemyUFO2.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-disk2');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l;
end;
 
procedure TEnemyUFO.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - MoveCount*(300/1000);
Y := Y + Cos256(FCounter div 15)*2;
if X<-Width then Dead;
end else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l;
end;
 
procedure TEnemyAttacker.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 1000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - MoveCount*(300/1000)-FCounter div 128;
if X < -Width then Dead;
end else if FMode=2 then
begin
X := X - MoveCount*(300/1000);
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyBoss.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-boss');
Width := Image.Width;
Height := Image.Height;
BossExists := true;
MainForm.PlayMusic(mtBoss);
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
Collisioned := False;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l;
MainForm.FBossLife := FLife;
waiter1 := 0;
waiter2 := 0;
end;
 
procedure TEnemyBoss.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 100000);
BossExists := false;
dec(MainForm.FBossLife);
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
dec(MainForm.FBossLife);
end;
end;
 
procedure TEnemyBoss.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
X := X - MoveCount*(300/1000)
else
begin
Collisioned := True;
FMode := 1;
FPutTama := True;
end;
Y := Y + Cos256(FCounter div 15)*5;
end else if FMode=1 then
begin
Y := Y + Cos256(FCounter div 15)*5;
if FPutTama then
begin
if FTamaT>100 then
begin
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
Z := 1;
X := Self.X-Width;
Y := Self.Y+Self.Height div 2-Height div 2;
end;
Inc(FTamaF);
if FTamaF>Random(30) then FPutTama := False;
FTamaT := 0;
end;
FTamaT := FTamaT + MoveCount;
end else
begin
FTamaT := FTamaT + MoveCount;
if FTamaT>2000+Random(500) then
begin
FPutTama := True;
FTamaF := 0;
FTamaT := 0;
end;
end;
end else if FMode=2 then
begin
inc(waiter1);
if waiter1 = 3 then
begin
waiter1 := 0;
inc(waiter2);
if waiter2 <= 20 then
begin
with TExplosion.Create(Engine) do
begin
Z := 10;
X := Self.X+Random(Self.Width)-16;
Y := Self.Y+Random(Self.Height)-16;
end;
end
else
begin
Inc(MainForm.FScore, 1000);
FMode := 3;
end;
end;
end else if FMode=3 then
begin
if FCounter>4000 then dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker2.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l;
end;
 
procedure TEnemyAttacker2.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 2;
FCounter := 0;
Inc(MainForm.FScore, 5000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
X := X - MoveCount*(300/1000)
else
begin
Collisioned := True;
FMode := 1;
FPutTama := True;
end;
Y := Y + Cos256(FCounter div 15)*5;
end else if FMode=1 then
begin
Y := Y + Cos256(FCounter div 15)*5;
if FPutTama then
begin
if FTamaT>100 then
begin
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
Z := 1;
X := Self.X-Width;
Y := Self.Y+Self.Height div 2-Height div 2;
end;
Inc(FTamaF);
if FTamaF>Random(30) then FPutTama := False;
FTamaT := 0;
end;
FTamaT := FTamaT + MoveCount;
end else
begin
FTamaT := FTamaT + MoveCount;
if FTamaT>2000+Random(500) then
begin
FPutTama := True;
FTamaF := 0;
FTamaT := 0;
end;
end;
end else if FMode=2 then
begin
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
procedure TEnemyAttacker3.HitEnemy(Deaded: Boolean);
begin
if Deaded then
begin
MainForm.PlaySound('Explosion', False);
FMode := 1;
FCounter := 0;
Inc(MainForm.FScore, 5000);
Image := MainForm.ImageList.Items.Find('Explosion');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := False;
AnimSpeed := 15/1000;
AnimPos := 0;
end else
begin
MainForm.PlaySound('Hit', False);
Inc(MainForm.FScore, 100);
end;
end;
 
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
begin
inherited DoMove(MoveCount);
if FMode=0 then
begin
X := X - (250/1000)*MoveCount;
if X<-Width then Dead;
if FCounter-FOldTamaTime>=100 then
begin
Inc(FTamaCount);
with TEnemyTama.Create(Engine) do
begin
FPlayerSprite := Self;
X := Self.X;
Y := Self.Y+Self.Height div 2-Height div 2;
Z := 10;
end;
FOldTamaTime := FCounter;
end;
end else if FMode=1 then
begin
if FCounter>200 then Dead;
end;
inc(FCounter, MoveCount);
end;
 
constructor TEnemyAttacker3.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
FLife := EnemyAdventTable[mainform.FEnemyAdventPos].l;
end;
 
function TMainForm.SoundKarte: boolean;
begin
result := WaveOutGetNumDevs > 0;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
var
Ergebnis: string;
daten: textfile;
i: integer;
punkt: integer;
ok: boolean;
begin
{ Beginne VCL-Ersatz }
versioninfo := tpjversioninfo.Create(self);
 
dxtimer := tdxtimer.Create(self);
dxtimer.Interval := 33;
dxtimer.OnActivate := DXTimerActivate;
dxtimer.OnDeactivate := DXTimerDeactivate;
dxtimer.OnTimer := DXTimerTimer;
dxtimer.ActiveOnly := false;
dxtimer.Enabled := false;
 
dxdraw := tdxdraw.Create(self);
dxdraw.Parent := self;
dxdraw.Align := alClient;
dxdraw.Left := 0;
dxdraw.Top := 0;
dxdraw.Width := 640;
dxdraw.Height := 480;
dxdraw.AutoInitialize := False;
dxdraw.AutoSize := False;
dxdraw.Color := clBlack;
dxdraw.Display.BitCount := 24;
dxdraw.Display.FixedBitCount := False;
dxdraw.Display.FixedRatio := False;
dxdraw.Display.FixedSize := False;
dxdraw.Display.Height := 600;
dxdraw.Display.Width := 800;
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, doRetainedMode, doHardware, doSelectDriver];
dxdraw.TabOrder := 0;
dxdraw.Visible := true;
dxdraw.OnFinalize := DXDrawFinalize;
dxdraw.OnInitialize := DXDrawInitialize;
dxdraw.OnInitializing := DXDrawInitializing;
 
dxsound := tdxsound.Create(self);
dxsound.AutoInitialize := false;
 
dxinput := tdxinput.Create(self);
dxinput.Joystick.ForceFeedback := true;
dxinput.Keyboard.ForceFeedback := true;
 
wavelist := tdxwavelist.Create(self);
wavelist.DXSound := dxsound;
 
imagelist := tdximagelist.create(self);
imagelist.DXDraw := dxdraw;
 
spriteengine := tdxspriteengine.create(self);
spriteengine.DXDraw := dxdraw;
 
{ Ende VCL-Ersatz }
 
punkt := 0;
FDirectory := extractfilepath(paramstr(0));
versioninfo.filename := paramstr(0);
for i := 1 to length(versioninfo.ProductVersion) do
begin
if copy(versioninfo.ProductVersion, i, 1) = '.' then inc(punkt);
if punkt < 2 then fengineversion := fengineversion+copy(versioninfo.ProductVersion, i, 1);
end;
Application.Title := 'SpaceMission '+FEngineVersion;
LoadOptions;
DXInit;
SoundInit;
MusicInit;
DeleteArray;
if (paramcount = 0) and (fileexists(paramstr(1))) then // (paramcount > 0)
begin
AssignFile(daten, paramstr(1));
Reset(daten);
ok := true;
ReadLN(daten, Ergebnis);
if Ergebnis <> '; SpaceMission '+mainform.FEngineVersion then ok := false;
ReadLN(daten, Ergebnis);
if ergebnis <> '; SAV-File' then ok := false;
if not ok then
begin
showmessage(FileError);
CloseFile(daten);
GameStartClick(GameStart);
exit;
end;
ReadLN(daten, mainform.FScore);
ReadLN(daten, mainform.FLife);
ReadLN(daten, mainform.Flevel);
ReadLN(daten, mainform.FMenuItem);
CloseFile(daten);
mainform.FNextScene := gsNewLevel;
exit;
end;
GameStartClick(GameStart);
end;
 
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssAlt in Shift) and (Key=VK_RETURN) then
OptionFullScreenClick(OptionFullScreen);
end;
 
procedure TMainForm.GameStartClick(Sender: TObject);
begin
StartScene(gsTitle);
end;
 
procedure TMainForm.GamePauseClick(Sender: TObject);
begin
GamePause.Checked := not GamePause.Checked;
DXTimer.Enabled := not GamePause.Checked;
if GamePause.Checked then PauseMusic(FMusic) else
ResumeMusic(FMusic);
end;
 
// http://www.delphipraxis.net/post43515.html
Function GetHTML(AUrl: string): string;
var
databuffer : array[0..4095] of char;
ResStr : string;
hSession, hfile: hInternet;
dwindex,dwcodelen,dwread,dwNumber: cardinal;
dwcode : array[1..20] of char;
res : pchar;
Str : pchar;
begin
ResStr:='';
if system.pos('http://',lowercase(AUrl))=0 then
AUrl:='http://'+AUrl;
 
// Hinzugefügt
application.ProcessMessages;
 
hSession:=InternetOpen('InetURL:/1.0',
INTERNET_OPEN_TYPE_PRECONFIG,
nil,
nil,
0);
if assigned(hsession) then
begin
// Hinzugefügt
application.ProcessMessages;
 
hfile:=InternetOpenUrl(
hsession,
pchar(AUrl),
nil,
0,
INTERNET_FLAG_RELOAD,
0);
dwIndex := 0;
dwCodeLen := 10;
 
// Hinzugefügt
application.ProcessMessages;
 
HttpQueryInfo(hfile,
HTTP_QUERY_STATUS_CODE,
@dwcode,
dwcodeLen,
dwIndex);
res := pchar(@dwcode);
dwNumber := sizeof(databuffer)-1;
if (res ='200') or (res ='302') then
begin
while (InternetReadfile(hfile,
@databuffer,
dwNumber,
DwRead)) do
begin
 
// Hinzugefügt
application.ProcessMessages;
 
if dwRead =0 then
break;
databuffer[dwread]:=#0;
Str := pchar(@databuffer);
resStr := resStr + Str;
end;
end
else
ResStr := 'Status:'+res;
if assigned(hfile) then
InternetCloseHandle(hfile);
end;
 
// Hinzugefügt
application.ProcessMessages;
 
InternetCloseHandle(hsession);
Result := resStr;
end;
 
procedure TMainForm.AufUpdatesprfen1Click(Sender: TObject);
var
temp: string;
begin
temp := GetHTML('http://www.viathinksoft.de/update/?id=spacemission');
if copy(temp, 0, 7) = 'Status:' then
begin
Application.MessageBox('Ein Fehler ist aufgetreten. Wahrscheinlich ist keine Internetverbindung aufgebaut, oder der der ViaThinkSoft-Server temporär offline.', 'Fehler', MB_OK + MB_ICONERROR)
end
else
begin
if GetHTML('http://www.viathinksoft.de/update/?id=spacemission') <> '1.1d' then
begin
if Application.MessageBox('Eine neue Programmversion ist vorhanden. Möchten Sie diese jetzt herunterladen?', 'Information', MB_YESNO + MB_ICONASTERISK) = ID_YES then
shellexecute(application.handle, 'open', pchar('http://www.viathinksoft.de/update/?id=@spacemission'), '', '', sw_normal);
end
else
begin
Application.MessageBox('Es ist keine neue Programmversion vorhanden.', 'Information', MB_OK + MB_ICONASTERISK);
end;
end;
end;
 
procedure TMainForm.BeendenClick(Sender: TObject);
begin
close;
end;
 
procedure TMainForm.OptionFullScreenClick(Sender: TObject);
begin
OptionFullScreen.Checked := not OptionFullScreen.Checked;
DXInit;
writeoptions;
end;
 
procedure TMainForm.OptionSoundClick(Sender: TObject);
begin
OptionSound.Checked := not OptionSound.Checked;
SoundInit;
WriteOptions;
end;
 
procedure TMainForm.SoundInit;
begin
if OptionSound.Checked then
begin
if not DXSound.Initialized then
begin
try
DXSound.Initialize;
WaveList.Items.LoadFromFile(FDirectory+'DirectX\Sound.dxw');
except
OptionSound.enabled := False;
WaveList.items.clear;
end;
end;
end
else DXSound.Finalize;
end;
 
procedure TMainForm.MusicInit;
begin
optionmusic.enabled := SoundKarte;
end;
 
procedure TMainForm.DestroyMusic(Name: TMusicTrack);
begin
if Name = mtBoss then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
end;
if Name = mtGame then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
end;
if Name = mtScene then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
end;
if Name = mtTitle then
begin
MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
MCISendString(pchar('close "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
end;
 
procedure TMainForm.OpenMusic(Name: TMusicTrack);
begin
if Name = mtBoss then
MCISendString(pchar('open "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
if Name = mtGame then
MCISendString(pchar('open "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
if Name = mtScene then
MCISendString(pchar('open "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
if Name = mtTitle then
MCISendString(pchar('open "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
procedure TMainForm.PauseMusic(Name: TMusicTrack);
begin
if not OptionMusic.checked then exit;
if Name = mtBoss then
MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
if Name = mtGame then
MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
if Name = mtScene then
MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
if Name = mtTitle then
MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
procedure TMainForm.DXDrawInitializing(Sender: TObject);
begin
if doFullScreen in DXDraw.Options then
begin
BorderStyle := bsNone;
DXDraw.Cursor := crNone;
end else
begin
BorderStyle := bsSingle;
DXDraw.Cursor := crDefault;
end;
end;
 
procedure TMainForm.DXDrawInitialize(Sender: TObject);
begin
DXTimer.Enabled := True;
end;
 
procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
DXTimer.Enabled := False;
end;
 
var
ProgrammGestartet: boolean;
 
procedure TMainForm.DXTimerActivate(Sender: TObject);
begin
Caption := Application.Title;
if not ProgrammGestartet then
begin
Programmgestartet := true;
exit;
end;
ResumeMusic(FMusic);
end;
 
procedure TMainForm.DXTimerDeactivate(Sender: TObject);
begin
Caption := Application.Title + ' [Pause]';
PauseMusic(FMusic);
end;
 
function TMainForm.StatusMusic(Name: TMusicTrack): string;
var
MCIStatus: array[0..255] of char;
begin
if not OptionMusic.checked then exit;
if FMusic = mtGame then
MCISendString(pchar('status "'+FDirectory+'Musik\Game.mid" mode'), MCIStatus, 255, 0);
if FMusic = mtBoss then
MCISendString(pchar('status "'+FDirectory+'Musik\Boss.mid" mode'), MCIStatus, 255, 0);
if FMusic = mtScene then
MCISendString(pchar('status "'+FDirectory+'Musik\Scene.mid" mode'), MCIStatus, 255, 0);
if FMusic = mtTitle then
MCISendString(pchar('status "'+FDirectory+'Musik\Title.mid" mode'), MCIStatus, 255, 0);
result := MCIStatus;
end;
 
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
if StatusMusic(FMusic) = 'stopped' then
PlayMusic(FMusic); {...}
if crash then
begin
inc(Crash2);
if crash2=30 then
begin
Crash2 := 0;
crash := false;
crashsound := false;
end;
end;
if not DXDraw.CanDraw then exit;
DXInput.Update;
case FScene of
gsTitle : SceneTitle;
gsMain : SceneMain;
gsGameOver: SceneGameOver;
gsWin : SceneWin;
gsNewLevel: SceneNewLevel;
end;
if FNextScene<>gsNone then
begin
StartScene(FNextScene);
FNextScene := gsNone;
end;
DXDraw.Flip;
end;
 
procedure TMainForm.BlinkStart;
begin
FBlink := 0;
FBlinkTime := GetTickCount;
end;
 
procedure TMainForm.WriteOptions;
var
INIDatei: TIniFile;
begin
INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
if OptionMusic.checked then INIDatei.WriteBool('Settings', 'Music', true)
else INIDatei.WriteBool('Settings', 'Music', false);
if OptionSound.checked then INIDatei.WriteBool('Settings', 'Sound', true)
else INIDatei.WriteBool('Settings', 'Sound', false);
if OptionFullScreen.checked then INIDatei.WriteBool('Settings', 'FullScreen', true)
else INIDatei.WriteBool('Settings', 'FullScreen', false);
if OptionBreitbild.checked then INIDatei.WriteBool('Settings', 'ScreenAutoSize', true)
else INIDatei.WriteBool('Settings', 'ScreenAutoSize', false);
if FInterval = giLeicht then INIDatei.WriteInteger('Settings', 'Speed', 1);
if FInterval = giMittel then INIDatei.WriteInteger('Settings', 'Speed', 2);
if FInterval = giSchwer then INIDatei.WriteInteger('Settings', 'Speed', 3);
INIDatei.Free;
end;
 
procedure TMainForm.LoadOptions;
var
INIDatei: TIniFile;
begin
INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
optionmusic.checked := INIDatei.ReadBool('Settings', 'Music', true);
optionsound.checked := INIDatei.ReadBool('Settings', 'Sound', true);
optionfullscreen.checked := INIDatei.ReadBool('Settings', 'fullscreen', false);
OptionBreitBild.checked := INIDatei.ReadBool('Settings', 'ScreenAutoSize', true);
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 1 then
begin
FInterval := giLeicht;
Leicht.checked := true;
end;
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 2 then
begin
FInterval := giMittel;
Mittel.checked := true;
end;
if INIDatei.ReadInteger('Settings', 'Speed', 2) = 3 then
begin
FInterval := giSchwer;
Schwer.checked := true;
end;
INIDatei.Free;
WriteOptions;
end;
 
procedure TMainForm.BlinkUpdate;
begin
if GetTickCount<>FBlinkTime then
begin
FBlink := FBlink + (GetTickCount-FBlinkTime);
FBlinkTime := GetTickCount;
end;
end;
 
procedure TMainForm.PlaySound(Name: string; Wait: Boolean);
begin
if (OptionSound.Checked) and (OptionSound.Enabled) then
WaveList.Items.Find(Name).Play(Wait);
end;
 
procedure TMainForm.PlayMusic(Name: TMusicTrack);
begin
if (not mainform.active) and (mainform.visible) then //1st Programmstart
exit;
if (OptionMusic.checked) and (OptionMusic.enabled) then
begin
DestroyMusic(FMusic);
OpenMusic(Name);
ResumeMusic(Name);
end;
FMusic := Name;
end;
 
function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
begin
with Result do
begin
rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
rgbReserved := 0;
end;
end;
 
procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
var
i: Integer;
t, t2: DWORD;
ChangePalette: Boolean;
c: Integer;
begin
if DXDraw.Initialized then
begin
c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
ChangePalette := False;
if DXDraw.CanPaletteAnimation then
begin
t := GetTickCount;
while Abs(GetTickCount-t)<Time do
begin
t2 := Trunc(Abs(GetTickCount-t)/Time*255);
for i := 0 to 255 do
DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
DXDraw.UpdatePalette;
ChangePalette := True;
end;
end else
Sleep(Time);
for i := 0 to 4 do
begin
DXDraw.Surface.Fill(c);
DXDraw.Flip;
end;
if ChangePalette then
begin
DXDraw.ColorTable := DXDraw.DefColorTable;
DXDraw.UpdatePalette;
end;
DXDraw.Surface.Fill(c);
DXDraw.Flip;
end;
end;
 
procedure TMainForm.StartScene(Scene: TGameScene);
begin
EndScene;
DXInput.States := DXInput.States - DXInputButton;
FScene := Scene;
BlinkStart;
case FScene of
gsTitle : StartSceneTitle;
gsMain : StartSceneMain;
gsGameOver: StartSceneGameOver;
gsWin : StartSceneWin;
gsNewLevel: StartSceneNewLevel;
end;
end;
 
procedure TMainForm.StartSceneTitle;
begin
sleep(500);
FCheat := false;
BossExists := false;
FLife := Lives;
FLevel := 0;
FScore := 0;
FNotSave := true;
Cheat.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
GameStart.enabled := false;
Spielgeschwindigkeit.enabled := false;
mainform.Visible := true;
PlayMusic(mtTitle);
end;
 
procedure TMainForm.StartSceneMain;
{var
i, j: Integer;}
begin
sleep(500);
SpielerFliegtFort := false;
FCounter := 0;
NewLevel(FLevel);
BossExists := false;
PlayMusic(mtGame);
FEnemyAdventPos := 1;
FFrame := -4;
TPlayerSprite.Create(SpriteEngine.Engine);
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Star3');
Z := -13;
Y := 40;
FSpeed := 1 / 2;
Tile := True;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Star2');
Z := -12;
Y := 30;
FSpeed := 1;
Tile := True;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := mainform.ImageList.Items.Find('Star1');
Z := -11;
Y := 10;
FSpeed := 2;
Tile := True;
end;
{with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Y := 10;
Z := -13;
FSpeed := 1 / 2;
Tile := True;
for i := 0 to MapHeight-1 do
begin
for j := 0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Y := 30;
Z := -12;
FSpeed := 1;
Tile := True;
for i := 0 to MapHeight-1 do
begin
for j := 0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(200, 10);
Y := 40;
Z := -11;
FSpeed := 2;
Tile := True;
for i := 0 to MapHeight-1 do
begin
for j := 0 to MapWidth-1 do
begin
Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
if Random(100)<95 then Chips[j, i] := -1;
end;
end;
end;}
FNotSave := false;
Cheat.enabled := true;
Neustart.enabled := true;
GamePause.enabled := true;
GameStart.enabled := true;
Spielgeschwindigkeit.enabled := true;
end;
 
procedure TMainForm.StartSceneGameOver;
begin
sleep(500);
FNotSave := true;
Cheat.enabled := false;
Spielgeschwindigkeit.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
PlayMusic(mtScene);
BossExists := false;
end;
 
procedure TMainForm.StartSceneWin;
begin
sleep(500);
FNotSave := true;
Cheat.enabled := false;
Spielgeschwindigkeit.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
PlayMusic(mtScene);
BossExists := false;
end;
 
procedure TMainForm.EndScene;
begin
case FScene of
gsTitle : EndSceneTitle;
gsMain : EndSceneMain;
gsGameOver: EndSceneGameOver;
gsWin : EndSceneWin;
gsNewLevel: EndSceneNewLevel;
end;
end;
 
procedure TMainForm.EndSceneTitle;
begin
{ Ende Title }
end;
 
procedure TMainForm.EndSceneMain;
begin
SpriteEngine.Engine.Clear;
end;
 
procedure TMainForm.EndSceneGameOver;
begin
{ Ende GameOver }
end;
 
procedure TMainForm.EndSceneWin;
begin
{ Ende Win }
end;
 
procedure TMainForm.DeleteArray();
var
i: integer;
begin
for i := 1 to 9999 do
begin
EnemyAdventTable[i].c := tnoting;
EnemyAdventTable[i].x := 0;
EnemyAdventTable[i].y := 0;
EnemyAdventTable[i].l := 0;
end;
FRestEnemys := 0;
end;
 
var
levact: integer;
 
procedure TMainForm.NewLevel(lev: integer);
var
act: integer;
filex: textfile;
ergebniss: string;
begin
DeleteArray;
if FMenuItem = 2 then
begin
enemys[1] := TEnemyAttacker;
enemys[2] := TEnemyMeteor;
enemys[3] := TEnemyUFO;
enemys[4] := TEnemyAttacker;
enemys[5] := TEnemyMeteor;
enemys[6] := TEnemyUFO;
enemys[7] := TEnemyAttacker;
enemys[8] := TEnemyMeteor;
enemys[9] := TEnemyUFO;
enemys[10] := TEnemyAttacker;
enemys[11] := TEnemyMeteor;
enemys[12] := TEnemyUFO;
enemys[13] := TEnemyAttacker;
enemys[14] := TEnemyMeteor;
enemys[15] := TEnemyUFO;
enemys[16] := TEnemyAttacker3;
enemys[17] := TEnemyAttacker;
enemys[18] := TEnemyMeteor;
enemys[19] := TEnemyUFO;
enemys[20] := TEnemyUFO2;
enemys[21] := TEnemyAttacker;
enemys[22] := TEnemyMeteor;
enemys[23] := TEnemyUFO;
enemys[24] := TEnemyAttacker2;
enemys[25] := TEnemyMeteor;
enemys[26] := TEnemyUFO;
enemys[27] := TEnemyAttacker;
randomize;
for act := 1 to lev*75-1 do
begin
inc(FRestEnemys);
EnemyAdventTable[act].c := enemys[random(lev+2)+1];
if EnemyAdventTable[act].c = TEnemyAttacker2 then EnemyAdventTable[act].c := enemys[random(lev+2)+1]; {O_o}
EnemyAdventTable[act].x := act*30 + random(85-(lev+(random(lev))*2)){O_o};
EnemyAdventTable[act].y := random(dxdraw.surfaceheight);
if (EnemyAdventTable[act].c <> TEnemyMeteor) and (EnemyAdventTable[act].c <> TEnemyAttacker2) then EnemyAdventTable[act].l := random(lev)+1;
if EnemyAdventTable[act].c = TEnemyAttacker2 then EnemyAdventTable[act].l := random(6)+1{O_o};
end;
EnemyAdventTable[lev*75].c := TEnemyBoss;
EnemyAdventTable[lev*75].x := lev*75*30{O_o} div lev;
EnemyAdventTable[lev*75].y := (dxdraw.surfaceheight div 2) - (MainForm.ImageList.Items.Find('Enemy-boss').height div 2);
EnemyAdventTable[lev*75].l := lev*5;
inc(FRestEnemys);
end
else
begin
enemys[1] := TEnemyAttacker;
enemys[2] := TEnemyAttacker2;
enemys[3] := TEnemyAttacker3;
enemys[4] := TEnemyMeteor;
enemys[5] := TEnemyUFO;
enemys[6] := TEnemyUFO2;
enemys[7] := TEnemyBoss;
if fileexists(FDirectory+'Levels\Level '+inttostr(lev)+'.lev') then
begin
levact := 0;
assignfile(filex, FDirectory+'Levels\Level '+inttostr(lev)+'.lev');
reset(filex);
while not seekEoF(filex) do
begin
if levact = 0 then
begin
readln(filex, ergebniss);
if ergebniss <> '; SpaceMission '+FCompVersion then
begin
showmessage('Das Level '+inttostr(lev)+' ist ungültig!'+#13#10+'Das Programm wird beendet.');
application.terminate;
exit;
end;
readln(filex, ergebniss);
if ergebniss <> '; LEV-File' then
begin
showmessage('Das Level '+inttostr(lev)+' ist ungültig!'+#13#10+'Das Programm wird beendet.');
application.terminate;
exit;
end;
readln(filex);
end;
inc(levact);
readln(filex, ergebniss);
if levact = 5 then levact := 1;
if levact = 1 then
begin
inc(pos[levact]);
inc(FRestEnemys);
EnemyAdventTable[pos[levact]].c := enemys[strtoint(ergebniss)];
end;
if levact = 2 then
begin
inc(pos[levact]);
EnemyAdventTable[pos[levact]].x := strtoint(ergebniss);
end;
if levact = 3 then
begin
inc(pos[levact]);
EnemyAdventTable[pos[levact]].y := strtoint(ergebniss);
end;
if levact = 4 then
begin
inc(pos[levact]);
EnemyAdventTable[pos[levact]].l := strtoint(ergebniss);
end;
end;
closefile(filex);
end;
end;
end;
 
procedure TMainForm.SceneTitle;
var
Logo: TPictureCollectionItem;
begin
DXDraw.Surface.Fill(0);
Logo := ImageList.Items.Find('Logo');
{Logo.DrawWaveX(DXDraw.Surface, (dxdraw.surfaceWidth div 2) - 181, 65, Logo.Width, Logo.Height, 0,
Trunc(16 - Cos256(FBlink div 60) * 16), 32, -FBlink div 5);}
Logo.DrawWaveX(DXDraw.Surface, trunc((dxdraw.surfaceWidth / 2) - (Logo.Width / 2)), 65, Logo.Width, Logo.Height, 0,
2, 80, Fangle * 4);
inc(Fangle);
with DXDraw.Surface.Canvas do
begin
if (isDown in MainForm.DXInput.States) and (FMenuItem=1) then FMenuItem := 2;
if ((isUp in MainForm.DXInput.States) and (FMenuItem=2)) or (FMenuItem=0) then FMenuItem := 1;
Brush.Style := bsClear;
Font.Size := 30;
if FMenuItem = 1 then
begin
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-52, '>');
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2)-50, '>');
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
end
else
begin
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-2, '>');
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2), '>');
end;
if (FBlink div 300) mod 2=0 then
begin
Font.Color := clGreen;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clLime;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
FLevel := 1;
if ((FMenuItem=1) and (fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev')=false)) or ((FMenuItem=2) and (FLevel > 20)) then
begin
//PlaySound('Frage', False);
exit;
end;
NewLevel(FLevel);
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsMain);
end;
end;
 
procedure TMainForm.SceneMain;
var
Enemy: TSprite;
begin
if FInterval = giLeicht then SpriteEngine.Move(conleicht);
if FInterval = giMittel then SpriteEngine.Move(conmittel);
if FInterval = giSchwer then SpriteEngine.Move(conschwer);
SpriteEngine.Dead;
while (Low(EnemyAdventTable)<=FEnemyAdventPos) and
(FEnemyAdventPos<=High(EnemyAdventTable)) and
((EnemyAdventTable[FEnemyAdventPos].x / 4)<=FFrame) and
(FRestEnemys>0) do
begin
if EnemyAdventTable[FEnemyAdventPos].c <> TNoting then
begin
with EnemyAdventTable[FEnemyAdventPos] do
begin
Enemy := c.Create(SpriteEngine.Engine);
Enemy.x := dxdraw.surfacewidth;
//Enemy.y := y;
if y <> 0 then Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
else Enemy.y := 0;
end;
end;
Inc(FEnemyAdventPos);
end;
Inc(FFrame);
DXDraw.Surface.Fill(0);
if FNextScene=gsNone then
begin
SpriteEngine.Draw;
if MainForm.flife > 0 then
begin
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Size := 20;
Font.Color := clOlive;
Textout(9, 9, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
Font.Color := clYellow;
Textout(10, 10, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
Font.Color := clMaroon;
Textout(dxdraw.surfacewidth-141, 9, 'Level: ' + IntToStr(MainForm.flevel));
Font.Color := clRed;
Textout(dxdraw.surfacewidth-140, 10, 'Level: ' + IntToStr(MainForm.flevel));
if FLife<0 then mainform.FLife := 0;
if FCheat then
begin
Font.Color := clPurple;
Textout(9, dxdraw.surfaceheight-41, 'Leben: ?');
Font.Color := clFuchsia;
Textout(10, dxdraw.surfaceheight-40, 'Leben: ?');
end
else
begin
if ((Flife = 1) and ((FBlink div 300) mod 2=0)) or (Flife <> 1) then
begin
Font.Color := clPurple;
Textout(9, dxdraw.surfaceheight-41, 'Leben: ' + IntToStr(MainForm.flife));
Font.Color := clFuchsia;
Textout(10, dxdraw.surfaceheight-40, 'Leben: ' + IntToStr(MainForm.flife));
end;
if Flife = 1 then BlinkUpdate;
end;
{if BossExists and (FBossLife>0) then
begin
Font.Color := clPurple;
Textout(449, 439, 'Boss: ' + IntToStr(FBossLife));
Font.Color := clFuchsia;
Textout(450, 440, 'Boss: ' + IntToStr(FBossLife));
end
else
if RestlicheEinheiten>0 then
begin
Font.Color := clPurple;
Textout(449, 439, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
Font.Color := clFuchsia;
Textout(450, 440, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
end;}
if BossExists and (FBossLife>0) and (FRestEnemys>0) then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-81, 'Boss: ' + IntToStr(FBossLife));
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife));
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
end;
if BossExists and (FBossLife>0) and (FRestEnemys<1) then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife));
end;
if (FRestEnemys>0) and (Bossexists=false) then
begin
Font.Color := clGreen;
Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
Font.Color := clLime;
Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
end;
Release;
end;
end
else
begin
DXDraw.Surface.Canvas.Font.Color := clGreen;
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission gescheitert!');
DXDraw.Surface.Canvas.Font.Color := clLime;
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission gescheitert!');
DXDraw.Surface.Canvas.Release;
end;
if FRestEnemys<0 then FRestEnemys := 0; //Muss das sein?
if (Ec=0) and (FRestEnemys=0){ and (SpielerFliegtFort = false)} then
begin
DXDraw.Surface.Canvas.Font.Color := clGreen;
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
DXDraw.Surface.Canvas.Font.Color := clLime;
DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
DXDraw.Surface.Canvas.Release;
Sleep(1);
inc(FCounter);
if FCounter>150{200} then SpielerFliegtFort := true;
end;
end;
end;
 
procedure TMainForm.SceneGameOver;
begin
DXDraw.Surface.Fill(0);
with DXDraw.Surface.Canvas do
begin
FNotSave := true;
Cheat.enabled := false;
GamePause.enabled := false;
Neustart.enabled := false;
Brush.Style := bsClear;
Font.Size := 35;
Font.Color := clMaroon;
Textout((dxdraw.surfacewidth div 2)-127, 98, 'Verloren!');
Font.Color := clRed;
Textout((dxdraw.surfacewidth div 2)-125, 100, 'Verloren!');
if (FBlink div 300) mod 2=0 then
begin
Font.Size := 30;
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsTitle);
end;
end;
 
procedure TMainForm.SceneWin;
begin
DXDraw.Surface.Fill(0);
with DXDraw.Surface.Canvas do
begin
FNotSave := true;
Cheat.enabled := false;
GamePause.enabled := false;
Neustart.enabled := false;
Brush.Style := bsClear;
Font.Size := 35;
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-127, 98, 'Gewonnen!');
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-125, 100, 'Gewonnen!');
if (FBlink div 300) mod 2=0 then
begin
Font.Size := 30;
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsTitle);
end;
end;
 
procedure TMainForm.StartSceneNewLevel;
begin
sleep(500);
FNotSave := false;
Cheat.enabled := false;
Neustart.enabled := false;
GamePause.enabled := false;
GameStart.enabled := true;
Spielgeschwindigkeit.enabled := false;
BossExists := false;
Spielgeschwindigkeit.enabled := false;
if ((FMenuItem=1) and (not fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev'))) or ((FMenuItem=2) and (FLevel > 25)) then
begin
//PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsWin);
exit;
end;
PlayMusic(mtScene);
end;
 
procedure TMainForm.EndSceneNewLevel;
begin
{ Ende NewLevel }
end;
 
procedure TMainForm.SceneNewLevel;
begin
DXDraw.Surface.Fill(0);
with DXDraw.Surface.Canvas do
begin
Brush.Style := bsClear;
Font.Size := 40;
Font.Color := clMaroon;
Textout((dxdraw.surfaceWidth div 2)-(83+(length(inttostr(flevel))*22)), 98, 'Level '+inttostr(flevel));
Font.Color := clRed;
Textout((dxdraw.surfaceWidth div 2)-(81+(length(inttostr(flevel))*22)), 100, 'Level '+inttostr(flevel));
if (FBlink div 300) mod 2=0 then
begin
Font.Size := 30;
Font.Color := clOlive;
Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
Font.Color := clYellow;
Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
end;
BlinkUpdate;
Release;
end;
if isButton1 in DXInput.States then
begin
PlaySound('SceneMov', False);
PalleteAnim(RGBQuad(0, 0, 0), 300);
Sleep(200);
StartScene(gsMain);
end;
end;
 
procedure TMainForm.OptionMusicClick(Sender: TObject);
begin
OptionMusic.Checked := not OptionMusic.Checked;
if OptionMusic.Checked then PlayMusic(FMusic)
else DestroyMusic(FMusic);
WriteOptions;
end;
 
procedure TMainForm.MitarbeiterClick(Sender: TObject);
begin
if not fileexists(mainform.fdirectory+'Texte\Mitwirkende.txt') then
begin
MessageDLG('Die Datei "Texte\Mitwirkende.txt" ist nicht mehr vorhanden. Die Aktion wird abgebrochen!',
mtWarning, [mbOK], 0);
end
else
begin
TextForm.memo1.lines.loadfromfile(mainform.FDirectory+'Texte\Mitwirkende.txt');
TextForm.showmodal;
end;
end;
 
procedure TEnemyMeteor.DoMove(MoveCount: Integer);
begin
X := X - MoveCount*(250/1000);
if X < -Width then Dead;
end;
 
procedure TEnemyMeteor.HitEnemy(Deaded: Boolean);
begin
if deaded then Collisioned := True;
MainForm.PlaySound('Hit', False);
end;
 
{procedure TMainForm.StopMusic;
begin
PauseMusic(FMusic);
MCISendString(pchar('seek "'+FDirectory+'Musik\Boss.mid" to start'), nil, 255, 0);
MCISendString(pchar('seek "'+FDirectory+'Musik\Game.mid" to start'), nil, 255, 0);
MCISendString(pchar('seek "'+FDirectory+'Musik\Title.mid" to start'), nil, 255, 0);
MCISendString(pchar('seek "'+FDirectory+'Musik\Scene.mid" to start'), nil, 255, 0);
end;}
 
procedure TMainForm.ResumeMusic(Name: TMusicTrack);
begin
if not OptionMusic.checked then exit;
if Name = mtBoss then
MCISendString(pchar('play "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
if Name = mtGame then
MCISendString(pchar('play "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
if Name = mtScene then
MCISendString(pchar('play "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
if Name = mtTitle then
MCISendString(pchar('play "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
end;
 
constructor TEnemyMeteor.Create(AParent: TSprite);
begin
inherited Create(AParent);
Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
Width := Image.Width;
Height := Image.Height;
AnimCount := Image.PatternCount;
AnimLooped := True;
AnimSpeed := 15/1000;
PixelCheck := True;
end;
 
procedure TMainForm.SpielstandClick(Sender: TObject);
begin
speicherungform.showmodal;
end;
 
procedure TMainForm.NeustartClick(Sender: TObject);
begin
FLife := Lives;
FLevel := 1; // ???
FScore := 0;
ec := 0;
StartScene(gsMain);
PlayMusic(mtGame);
end;
 
procedure TMainForm.OptionBreitbildClick(Sender: TObject);
begin
OptionBreitbild.Checked := not OptionBreitbild.Checked;
DXInit;
writeoptions;
end;
 
procedure TMainForm.LeichtClick(Sender: TObject);
begin
leicht.checked := true;
FInterval := giLeicht;
writeoptions;
end;
 
procedure TMainForm.MittelClick(Sender: TObject);
begin
mittel.checked := true;
FInterval := giMittel;
writeoptions;
end;
 
procedure TMainForm.SchwerClick(Sender: TObject);
begin
schwer.checked := true;
FInterval := giSchwer;
writeoptions;
end;
 
procedure TMainForm.FormShow(Sender: TObject);
begin
SplashForm.Hide;
SplashForm.Free;
 
dxtimer.Enabled := true;
dxtimer.ActiveOnly := true;
end;
 
procedure TMainForm.InformationenClick(Sender: TObject);
begin
InfoForm.showmodal;
end;
 
procedure TMainForm.CheatClick(Sender: TObject);
begin
CheatForm.showmodal;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if optionMusic.checked then DestroyMusic(FMusic);
SpriteEngine.Engine.Clear;
dxsound.Finalize;
dxinput.Destroy;
DXTimer.Enabled := False;
end;
 
procedure TMainForm.FormDestroy(Sender: TObject);
begin
versioninfo.free;
imagelist.free;
spriteengine.free;
dxdraw.Free;
wavelist.free;
dxsound.free;
//dxinput.free;
dxtimer.Free;
end;
 
end.
 
/Dokumentation.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevSpeicherung.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/ComMain.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevEdit.bdsproj
0,0 → 1,176
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType">VCLApplication</Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{599685DA-212E-4FDE-99E7-BC84B6909E31}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">LevEdit.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">1</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">0</Compiler>
<Compiler Name="R">0</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">1</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">False</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">1</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription">SpaceMission 1.1 - Leveleditor</Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath">VCL_DELPHIX_D6;VCL_PJVERSIONINFO</Directories>
<Directories Name="Packages">Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;DelphiX_for5;pielib</Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams"></Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">1</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1031</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Der Leveleditor zu SpaceMission...</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">SpaceMisson 1.1 - Leveleditor</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">© Copyright 2001 - 2007 ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks">Keine</VersionInfoKeys>
<VersionInfoKeys Name="OriginalFilename">LevEdit.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">SpaceMission 1.1</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Webseite">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
</VersionInfoKeys>
</Delphi.Personality>
</BorlandProject>
/LevText.dfm
0,0 → 1,39
object TextForm: TTextForm
Left = 432
Top = 156
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Informationen'
ClientHeight = 361
ClientWidth = 297
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object ElPopupButton1: TButton
Left = 64
Top = 328
Width = 169
Height = 25
Caption = '&OK'
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 8
Top = 8
Width = 281
Height = 313
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
end
end
/SplSpeicherung.dfm
0,0 → 1,205
object SpeicherungForm: TSpeicherungForm
Left = 280
Top = 152
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Spielst'#228'nde'
ClientHeight = 425
ClientWidth = 451
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Bevel1: TBevel
Left = 8
Top = 56
Width = 433
Height = 2
Shape = bsBottomLine
end
object Label2: TLabel
Left = 8
Top = 72
Width = 58
Height = 13
Caption = 'Spielst'#228'nde:'
end
object Label3: TLabel
Left = 8
Top = 336
Width = 67
Height = 13
Caption = 'Informationen:'
end
object Label1: TLabel
Left = 8
Top = 20
Width = 78
Height = 13
Caption = 'Spielstandname:'
Enabled = False
end
object LadenBtn: TButton
Left = 336
Top = 72
Width = 105
Height = 25
Caption = '&Laden'
Enabled = False
TabOrder = 0
OnClick = LadenBtnClick
end
object LoeschenBtn: TButton
Left = 336
Top = 104
Width = 105
Height = 25
Caption = 'L'#246'&schen'
Enabled = False
TabOrder = 1
OnClick = LoeschenBtnClick
end
object AktualisierenBtn: TButton
Left = 336
Top = 144
Width = 105
Height = 25
Caption = '&Aktualisieren'
TabOrder = 2
OnClick = DsFancyButton2Click
end
object SpeichernBtn: TButton
Left = 336
Top = 16
Width = 105
Height = 25
Caption = '&Speichern'
Enabled = False
TabOrder = 3
OnClick = SpeichernBtnClick
end
object AbbrechenBtn: TButton
Left = 336
Top = 392
Width = 105
Height = 25
Cancel = True
Caption = 'Schli&e'#223'en'
Default = True
ModalResult = 1
TabOrder = 4
OnClick = AbbrechenBtnClick
end
object LevelListBox: TListBox
Left = 112
Top = 72
Width = 201
Height = 249
ItemHeight = 13
TabOrder = 5
OnClick = LevelListBoxClick
OnDblClick = LevelListBoxDblClick
end
object LevelName: TEdit
Left = 112
Top = 16
Width = 201
Height = 21
Enabled = False
TabOrder = 6
end
object ElPanel1: TPanel
Left = 112
Top = 336
Width = 201
Height = 81
BevelOuter = bvLowered
Color = clWindow
TabOrder = 7
object li4a: TLabel
Left = 8
Top = 56
Width = 33
Height = 13
Caption = 'Leben:'
end
object li1: TLabel
Left = 8
Top = 8
Width = 17
Height = 13
Caption = 'n/a'
end
object li3b: TLabel
Left = 96
Top = 40
Width = 17
Height = 13
Caption = 'n/a'
end
object li3a: TLabel
Left = 8
Top = 40
Width = 29
Height = 13
Caption = 'Level:'
end
object li4b: TLabel
Left = 96
Top = 56
Width = 17
Height = 13
Caption = 'n/a'
end
object liu: TLabel
Left = 8
Top = 8
Width = 156
Height = 13
Caption = 'Der Spielstand ist nicht einlesbar!'
Font.Charset = DEFAULT_CHARSET
Font.Color = clMaroon
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Visible = False
end
object liw: TLabel
Left = 8
Top = 8
Width = 139
Height = 13
Caption = 'W'#228'hlen Sie einen Spielstand.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clNavy
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
Visible = False
end
object li2a: TLabel
Left = 8
Top = 24
Width = 37
Height = 13
Caption = 'Punkte:'
end
object li2b: TLabel
Left = 96
Top = 24
Width = 17
Height = 13
Caption = 'n/a'
end
end
end
/LevEdit.todo
0,0 → 1,0
{TODO : unsaubere levels akzeptieren! komet mit 1+ leben, einheiten, die nicht auf der linie sind, alte formate}{TODO : rückgängig}{TODO : Probleme mit Schiebebildchen...}{TODO : Quelltextfunktionen}{TODO : ((((auch sm) splash nach außen abblenden}{TODO : Wenn Level gelöscht, dass gerade geladen ist, dann LevChanged = true!}{TODO : Boss überschneidet Einheiten}{TODO : Länge der Karte?}{TODO : Auch nach Y Cor Sortieren}
/Compiler.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SpaceMission.dof
0,0 → 1,91
[FileVersion]
Version=6.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=1
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=SpaceMission 1.1
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=VCL_DELPHIX_D6;VCL_PJVERSIONINFO
Packages=VCL50;VCLX50;VCLSMP50;VCLDB50;VCLADO50;ibevnt50;VCLBDE50;VCLDBX50;QRPT50;TEEUI50;TEEDB50;TEE50;DSS50;TEEQR50;VCLIB50;VCLMID50;VCLIE50;INETDB50;INET50;NMFAST50;WEBMID50;dclocx50;dclaxserver50;packapi
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=0
MajorVer=1
MinorVer=1
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1031
CodePage=1252
[Version Info Keys]
CompanyName=ViaThinkSoft
FileDescription=Ein spannendes Weltraumspiel...
FileVersion=1.1.0.0
InternalName=SpaceMission 1.1
LegalCopyright=© Copyright 2001 - 2006 ViaThinkSoft
LegalTrademarks=Keine
OriginalFilename=SpaceMission.exe
ProductName=SpaceMission 1.1
ProductVersion=1.1.0.0
Homepage=www.viathinksoft.de
Projektleiter=Daniel Marschall - www.daniel-marschall.de
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=2
Item0=VCL_DELPHIX_D6;VCL_PJVERSIONINFO
Item1=VCL_DELPHIX_D6
/LevMain.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplMain.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/medikit.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/DevTools/dxgEdit.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/DevTools/dxwEdit.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/DevTools/dxmEdit.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/DevTools/DXGDumper.exe
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/medikit.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/medikit.psd
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/VCL.txt
File deleted
/_Private/Shoot (DelphiX 2000.07.17).zip
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/_Private/Schnecke.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/Schnecke.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/ToDo.txt
0,0 → 1,10
SPIEL
- Nach Treffer, zurückgeschleudert werden
- Übelster Hänger bei MIDI-Wechsel
- Vollbildwechsel geht nicht
- Tastenspeere bei runter+links+shot
- Schutzverletzung bei Spielstände aufr
 
LEVELEDITOR
- Kartengröße bleibt bei "Neu"
- "Beenden ohne Speichern?" bei leerem Level
/_Private/Font.txt
0,0 → 1,7
Schriften
=========
 
Spiel1: Arial West 36B
Spiel2: Arial West 12B
Leveleditor1: Arial West 20B
Leveleditor2: Arial West 20B
/_Private/Dokumentation.doc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/Thumbs.db
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/Versions.txt
0,0 → 1,11
0.1 1.exe
0.2 lev(); save(key/2lined); ini()
0.3 lev(*OLD FORMAT*); save(1line); ini(1lined)
 
2lined-files:
 
Daniel Marschall Computersoftware - SpaceMission 0.x - SaveGame
---------------------------------------------------------------
 
CryptK: CODEX 2.2
Key: 1 (?)
/_Private/Totenkopf.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/Totenkopf.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private/ToDo.doc
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/_Private
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/Einstellungen/SpaceMission.ini
0,0 → 1,6
[Settings]
Music=1
Sound=1
FullScreen=0
ScreenAutoSize=1
Speed=2
/SplCheat.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevSource.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SpaceMission.identcache
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplSplash.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplInfo.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevEdit.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/SplText.pas
0,0 → 1,44
unit SplText;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
 
type
TTextForm = class(TForm)
OKBtn: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
end;
 
var
TextForm: TTextForm;
 
implementation
 
uses
SplMain;
 
{$R *.DFM}
 
procedure TTextForm.Button1Click(Sender: TObject);
begin
close;
end;
 
procedure TTextForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
end;
 
procedure TTextForm.FormHide(Sender: TObject);
begin
mainform.dxtimer.enabled := true;
end;
 
end.
 
/SpaceMission.cfg
0,0 → 1,43
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J+
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"D:\Eigene Dateien\Borland Studio-Projekte\Bpl"
-LN"D:\Eigene Dateien\Borland Studio-Projekte\Bpl"
-U"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-O"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-I"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-R"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-w-HIDDEN_VIRTUAL
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
/Compiler.identcache
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Bilder/LevSplash.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Bilder/Auswahl.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Bilder/Delphi.bmp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Bilder/Thumbs.db
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Bilder/SplSplash.jpg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplSpeicherung.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Compiler.bdsproj.local
0,0 → 1,2
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject/>
/LevText.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplText.dfm
0,0 → 1,39
object TextForm: TTextForm
Left = 432
Top = 156
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Informationen'
ClientHeight = 361
ClientWidth = 297
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object OKBtn: TButton
Left = 64
Top = 328
Width = 169
Height = 25
Caption = '&OK'
TabOrder = 0
OnClick = Button1Click
end
object Memo1: TMemo
Left = 8
Top = 8
Width = 281
Height = 313
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 1
end
end
/SplMain.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplSplash.ddp
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Compiler.dof
0,0 → 1,89
[FileVersion]
Version=6.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=1
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=Levelcompiler 1.1
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=
Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;DelphiX_for5;pielib
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=0
MajorVer=1
MinorVer=1
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1031
CodePage=1252
[Version Info Keys]
CompanyName=ViaThinkSoft
FileDescription=Umwandlungssoftware...
FileVersion=1.1.0.0
InternalName=SpaceMission Compiler
LegalCopyright=© Copyright 2001 - 2005 ViaThinkSoft
LegalTrademarks=Keine
OriginalFilename=Compiler.exe
ProductName=SpaceMission 1.1
ProductVersion=1.1.0.0
Homepage=www.viathinksoft.de
Projektleiter=Daniel Marschall
[Excluded Packages]
C:\Programme\LMD2003\LMDEl40\Code\dceldbD6.bpl=LMD ElPack DB-Aware Controls (Design-time)
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
/SpaceMission.dpr
1,43 → 1,34
program SpaceMission;
 
{$Description 'SpaceMission 1.1'}
 
uses
Windows,
{$IF CompilerVersion >= 23.0}
System.UITypes,
{$IFEND }
Forms,
Dialogs,
SysUtils,
GamMain in 'GamMain.pas' {MainForm},
GamSplash in 'GamSplash.pas' {SplashForm},
GamSpeicherung in 'GamSpeicherung.pas' {SpeicherungForm},
ComInfo in 'ComInfo.pas' {InfoForm},
GamCheat in 'GamCheat.pas' {CheatForm},
ComLevelReader in 'ComLevelReader.pas',
Global in 'Global.pas',
ComHilfe in 'ComHilfe.pas' {HilfeForm};
MMSystem,
SplMain in 'SplMain.pas' {MainForm},
SplText in 'SplText.pas' {TextForm},
SplSplash in 'SplSplash.pas' {SplashForm},
SplSpeicherung in 'SplSpeicherung.pas' {SpeicherungForm},
SplInfo in 'SplInfo.pas' {InfoForm},
SplCheat in 'SplCheat.pas' {CheatForm};
 
{$R *.RES}
 
var
Fehler: boolean;
Sem: THandle;
directory: string;
 
resourcestring
SAlreadyStarted = 'Das Spiel wurde bereits gestartet.';
STitel = 'SpaceMission';
SFileMissing = '%s fehlt. Bitte installieren Sie SpaceMission erneut.';
 
const
SemaphoreName = 'SpaceMission';
 
begin
SpaceMission_SwitchLanguage;
{ Programm schon gestartet? }
Sem := CreateSemaphore(nil, 0, 1, SemaphoreName);
Sem := CreateSemaphore(nil, 0, 1, 'SpaceMission');
if (Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
begin
CloseHandle(Sem);
MessageDlg(SAlreadyStarted, mtInformation, [mbOK], 0);
MessageDlg('Das Spiel wurde bereits gestartet.', mtInformation, [mbOK], 0);
exit;
end;
SplashForm := TSplashForm.Create(Application);
44,19 → 35,38
SplashForm.Show;
SplashForm.Update;
Application.Initialize;
Application.ShowMainform := False;
Application.MainFormOnTaskBar := true;
Application.Title := STitel;
if not fileexists(OwnDirectory+DxgFile) then
Application.showmainform := False;
Application.Title := 'SpaceMission';
{ Dateien vorhanden? }
Fehler := false;
directory := extractfilepath(paramstr(0));
if not fileexists(directory+'Bilder\Delphi.bmp') then Fehler := true;
if not fileexists(directory+'Bilder\SplSplash.jpg') then Fehler := true;
if not fileexists(directory+'DirectX\Graphic.dxg') then Fehler := true;
if not fileexists(directory+'DirectX\Sound.dxw') then Fehler := true;
if not fileexists(directory+'Musik\Boss.mid') then Fehler := true;
if not fileexists(directory+'Musik\Game.mid') then Fehler := true;
if not fileexists(directory+'Musik\Scene.mid') then Fehler := true;
if not fileexists(directory+'Musik\Title.mid') then Fehler := true;
//if not fileexists(directory+'Texte\Mitwirkende.txt') then Fehler := true;
if Fehler then
begin
MessageDLG(Format(SFileMissing, [DxgFile]), mtError, [mbOK], 0);
MessageDLG('Dateien, die die Programmstabilität gewährleisten, sind ' +
'nicht mehr vorhanden!'+#13#10+'Bitte installieren Sie SpaceMission erneut...',
mtWarning, [mbOK], 0);
exit;
end;
{ Keine Soundkarte?! }
if WaveOutGetNumDevs < 1 then
MessageDlg('Es wurde keine Soundkarte gefunden!' + #13#10 +
'Entweder ist keine Soundkarte angeschlossen oder sie ist nicht ' +
'ordnungsgemäß installiert.' + #13#10 + 'Es können daher keine Musik und ' +
'keine Geräusche abgespielt werden.', mtError, [mbOK], 0);
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TTextForm, TextForm);
Application.CreateForm(TSpeicherungForm, SpeicherungForm);
Application.CreateForm(TInfoForm, InfoForm);
Application.CreateForm(TCheatForm, CheatForm);
Application.CreateForm(THilfeForm, HilfeForm);
Application.Run;
end.
 
/LevSplash.pas
4,13 → 4,12
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
jpeg, ExtCtrls, StdCtrls, Vcl.Imaging.pngimage;
jpeg, ExtCtrls, StdCtrls;
 
type
TSplashForm = class(TForm)
SplashImage: TImage;
v: TLabel;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
end;
 
var
23,5 → 22,14
 
{$R *.DFM}
 
procedure TSplashForm.FormCreate(Sender: TObject);
var
FDirectory: string;
begin
if copy(extractfiledir(application.ExeName), length(extractfiledir(application.ExeName))-1, 2) = ':\' then FDirectory := ''
else FDirectory := extractfiledir(application.ExeName)+'\';
SplashImage.Picture.loadfromfile(FDirectory+'Bilder\LevSplash.jpg');
end;
 
end.
 
/_Projektgruppe.bdsgroup
0,0 → 1,21
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Default.Personality</Option>
<Option Name="ProjectType"></Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{637A9A64-27A5-4C05-A11F-C60A2B40C1DB}</Option>
</Option>
</PersonalityInfo>
<Default.Personality>
<Projects>
<Projects Name="LevEdit.exe">LevEdit.bdsproj</Projects>
<Projects Name="SpaceMission.exe">SpaceMission.bdsproj</Projects>
<Projects Name="Compiler.exe">Compiler.bdsproj</Projects>
<Projects Name="Targets">LevEdit.exe SpaceMission.exe Compiler.exe</Projects>
</Projects>
<Dependencies/>
</Default.Personality>
</BorlandProject>
/LevInfo.pas
0,0 → 1,75
unit LevInfo;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellAPI, ExtCtrls;
 
type
TInfoForm = class(TForm)
ElPopupButton1: TButton;
HomeLbl: TLabel;
Image: TImage;
FirmaLbl: TLabel;
NameLbl: TLabel;
VersionLbl: TLabel;
EMailLbl: TLabel;
CopyrightLbl: TLabel;
Copyright2Lbl: TLabel;
URL2: TLabel;
URL1: TLabel;
procedure ElPopupButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure URL1Click(Sender: TObject);
procedure URL2Click(Sender: TObject);
end;
 
var
InfoForm: TInfoForm;
 
implementation
 
uses
LevMain;
 
{$R *.DFM}
 
procedure TInfoForm.ElPopupButton1Click(Sender: TObject);
begin
close;
end;
 
procedure TInfoForm.FormCreate(Sender: TObject);
begin
VersionLbl.caption := 'Version ' + mainform.fengineversion;
CopyrightLbl.caption := mainform.versioninfo.LegalCopyright + '.';
FirmaLbl.caption := mainform.versioninfo.CompanyName;
NameLbl.caption := 'SpaceMission' + #13#10 + 'Leveleditor'; // auslesen!
image.picture.loadfromfile(mainform.FDirectory + 'Bilder\Delphi.bmp');
end;
 
procedure TInfoForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
end;
 
procedure TInfoForm.FormHide(Sender: TObject);
begin
mainform.dxtimer.enabled := true;
end;
 
procedure TInfoForm.URL2Click(Sender: TObject);
begin
shellexecute(application.Handle, 'open', pchar('http://'+url2.caption+'/'), nil, nil, SW_SHOW);
end;
 
procedure TInfoForm.URL1Click(Sender: TObject);
begin
shellexecute(application.Handle, 'open', pchar('mailto:'+url1.Caption+'?subject=SpaceMission ' + mainform.fengineversion), nil, nil, SW_SHOW);
end;
 
end.
 
/LevOptions.pas
15,15 → 15,15
Panel1: TPanel;
ElLabel1: TLabel;
ElLabel2: TLabel;
Groesse: TSpinEdit;
Label2: TLabel;
Label3: TLabel;
LevName: TEdit;
LevAuthor: TEdit;
GroesseEdt: TEdit;
Groesse: TUpDown;
procedure ElPopupButton1Click(Sender: TObject);
procedure ElPopupButton2Click(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure GroesseClick(Sender: TObject; Button: TUDBtnType);
procedure GroesseEdtKeyPress(Sender: TObject; var Key: Char);
procedure GroesseEdtChange(Sender: TObject);
public
procedure Aktualisieren;
end;
39,16 → 39,12
 
procedure TLevelForm.Aktualisieren;
begin
Groesse.Value := MainForm.ScrollBar.Max;
LevName.Text := MainForm.LevData.LevelName;
LevAuthor.Text := MainForm.LevData.LevelAuthor;
Groesse.Position := MainForm.ScrollBar.Max;
end;
 
procedure TLevelForm.ElPopupButton1Click(Sender: TObject);
begin
MainForm.ScrollBar.Max := Groesse.Value;
MainForm.LevData.LevelName := LevName.Text;
MainForm.LevData.LevelAuthor := LevAuthor.Text;
MainForm.ScrollBar.Max := Groesse.Position;
MainForm.AnzeigeAct;
close;
end;
68,4 → 64,20
mainform.dxtimer.enabled := false;
end;
 
procedure TLevelForm.GroesseClick(Sender: TObject; Button: TUDBtnType);
begin
groesseedt.Text := inttostr(groesse.position);
end;
 
procedure TLevelForm.GroesseEdtKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [#13, #08, '0'..'9']) then
Key := #0;
end;
 
procedure TLevelForm.GroesseEdtChange(Sender: TObject);
begin
groesse.Position := strtoint(groesseedt.text);
end;
 
end.
/LevEdit.bdsproj.local
0,0 → 1,2
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject/>
/Musik/Game.MID
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Musik/Scene.MID
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Musik/Title.MID
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Musik/Boss.MID
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SpaceMission.bdsproj.local
0,0 → 1,2
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject/>
/SpaceMission.bdsproj
0,0 → 1,184
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType">VCLApplication</Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{3BF3030C-7166-4C6E-8DCC-7CFAE9EEFEBF}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">SpaceMission.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">1</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">0</Compiler>
<Compiler Name="R">0</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">1</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">False</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">1</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription">SpaceMission 1.1</Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath">VCL_DELPHIX_D6;VCL_PJVERSIONINFO</Directories>
<Directories Name="Packages">VCL50;VCLX50;VCLSMP50;VCLDB50;VCLADO50;ibevnt50;VCLBDE50;VCLDBX50;QRPT50;TEEUI50;TEEDB50;TEE50;DSS50;TEEQR50;VCLIB50;VCLMID50;VCLIE50;INETDB50;INET50;NMFAST50;WEBMID50;dclocx50;dclaxserver50;packapi</Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams"></Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">1</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1031</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Ein spannendes Weltraumspiel...</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">SpaceMission 1.1</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">© Copyright 2001 - 2007 ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks">Keine</VersionInfoKeys>
<VersionInfoKeys Name="OriginalFilename">SpaceMission.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">SpaceMission 1.1</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Homepage">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
<VersionInfoKeys Name="Webseite">www.viathinksoft.de</VersionInfoKeys>
</VersionInfoKeys> <Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclib100.bpl">Borland InterBase Express Components</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIntraweb_80_100.bpl">Intraweb 8.0 Design Package for Borland Development Studio 2006</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIndyCore100.bpl">Indy 10 Core Design Time</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclsmp100.bpl">Borland Sample Components</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dclIndyProtocols100.bpl">Indy 10 Protocols Design Time</Excluded_Packages>
<Excluded_Packages Name="c:\programme\borland\bds\4.0\Bin\dcltee100.bpl">TeeChart-Komponenten</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
</BorlandProject>
/LevEdit.dof
0,0 → 1,90
[FileVersion]
Version=6.0
[Compiler]
A=8
B=0
C=1
D=1
E=0
F=0
G=1
H=1
I=1
J=1
K=0
L=1
M=0
N=1
O=1
P=1
Q=0
R=0
S=0
T=0
U=0
V=1
W=0
X=1
Y=1
Z=1
ShowHints=1
ShowWarnings=1
UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[Linker]
MapFile=0
OutputObjs=0
ConsoleApp=1
DebugInfo=0
RemoteSymbols=0
MinStackSize=16384
MaxStackSize=1048576
ImageBase=4194304
ExeDescription=SpaceMission 1.1 - Leveleditor
[Directories]
OutputDir=
UnitOutputDir=
PackageDLLOutputDir=
PackageDCPOutputDir=
SearchPath=VCL_DELPHIX_D6
Packages=Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;DelphiX_for5;pielib
Conditionals=
DebugSourceDirs=
UsePackages=0
[Parameters]
RunParams=
HostApplication=
Launcher=
UseLauncher=0
DebugCWD=
[Version Info]
IncludeVerInfo=1
AutoIncBuild=0
MajorVer=1
MinorVer=1
Release=0
Build=0
Debug=0
PreRelease=0
Special=0
Private=0
DLL=0
Locale=1031
CodePage=1252
[Version Info Keys]
CompanyName=ViaThinkSoft
FileDescription=Der Leveleditor zu SpaceMission...
FileVersion=1.1.0.0
InternalName=SpaceMisson 1.1 - Leveleditor
LegalCopyright=© Copyright 2001 - 2006 ViaThinkSoft
LegalTrademarks=Keine
OriginalFilename=LevEdit.exe
ProductName=SpaceMission 1.1
ProductVersion=1.1.0.0
Webseite=www.viathinksoft.de
Projektleiter=Daniel Marschall - www.daniel-marschall.de
[HistoryLists\hlUnitAliases]
Count=1
Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
[HistoryLists\hlSearchPath]
Count=1
Item0=VCL_DELPHIX_D6
/LevSpeicherung.pas
4,7 → 4,7
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes{$IFEND};
StdCtrls, ExtCtrls, Spin, ComCtrls;
 
type
TSpeicherungForm = class(TForm)
25,10 → 25,10
li2b: TLabel;
li2a: TLabel;
li3b: TLabel;
li4: TLabel;
liu: TLabel;
liw: TLabel;
LevelNumber: TSpinEdit;
SpinEditEdt: TEdit;
SpinEdit: TUpDown;
procedure LoeschenBtnClick(Sender: TObject);
procedure LadenBtnClick(Sender: TObject);
procedure SpeichernBtnClick(Sender: TObject);
38,33 → 38,35
procedure DsFancyButton2Click(Sender: TObject);
procedure AbbrechenBtnClick(Sender: TObject);
procedure LevelNameChange(Sender: TObject);
procedure LevelListBoxDblClick(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
function GetListBoxSelectedLevelNumber: integer;
procedure SpinEditClick(Sender: TObject; Button: TUDBtnType);
procedure SpinEditEdtKeyPress(Sender: TObject; var Key: Char);
procedure SpinEditEdtChange(Sender: TObject);
public
procedure SearchLevels;
function RightStr(str: string; count: integer): string;
function Filter(n: integer; s: string): string;
end;
 
var
SpeicherungForm: TSpeicherungForm;
 
const
FCompVersion = '1.0';
 
implementation
 
uses
Global, LevMain, ComLevelReader;
LevMain;
 
{$R *.DFM}
 
resourcestring
SLevelListBox = 'Level %d';
SSelbsterstellt = 'Selbsterstellt';
SLevelFileNotFound = 'Leveldatei nicht gefunden';
 
procedure TSpeicherungForm.SearchLevels;
var
{sr: TSearchRec;
res: integer;}
i: integer;
fil: TLevelFile;
begin
//SpinEdit.Value := 1;
LevelListBox.items.clear;
74,34 → 76,40
li1b.visible := false;
li2b.visible := false;
li3b.visible := false;
li4.visible := false;
liu.Visible := false;
liw.visible := true;
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
for i := 1 to MaxPossibleLevels do
begin
fil := GetLevelFileName(i, false);
if fil.found then
{res := FindFirst(mainform.fdirectory+'Levels\*.lev', 0, sr);
try
while (res = 0) do
begin
if fil.isUser then
LevelListBox.items.Add(Format(SLevelListBox, [i])+' ('+SSelbsterstellt+')')
else
LevelListBox.items.Add(Format(SLevelListBox, [i]));
if (sr.name <> '.') and (sr.name <> '..') then
LevelListBox.items.Add(copy(sr.Name, 0, length(sr.name)-4));
res := FindNext(sr);
end;
finally
FindClose(sr);
end;}
for i := 1 to 9999 do
begin
if fileexists(mainform.fdirectory+'Levels\Level '+inttostr(i)+'.lev') then
LevelListBox.items.Add('Level ' + inttostr(i));
end;
end;
 
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
resourcestring
SReallyDeleteLevel = 'Dieses Level wirklich löschen?';
var
fil: TLevelFile;
Markiert: boolean;
i: integer;
begin
if LevelListBox.ItemIndex = -1 then exit;
 
if MessageDlg(SReallyDeleteLevel, mtConfirmation, mbYesNoCancel, 0) = mrYes then
Markiert := false;
for i := 0 to LevelListBox.items.Count-1 do
begin
if LevelListBox.Selected[i] then Markiert := true;
end;
if not Markiert then exit;
if MessageDlg('Dieses Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
li1a.visible := false;
li2a.visible := false;
li3a.visible := false;
108,59 → 116,154
li1b.visible := false;
li2b.visible := false;
li3b.visible := false;
li4.visible := false;
liu.visible := false;
liw.visible := true;
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
fil := GetLevelFileName(GetListBoxSelectedLevelNumber,false);
if not fil.found then raise Exception.Create(SLevelFileNotFound);
deletefile(fil.fileLocation);
deletefile(mainform.FDirectory+'Levels\'+
LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
SearchLevels;
end;
end;
 
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
resourcestring
SLoadNewLevelAndDiscardChanges = 'Neues Level laden und Änderungen verwerfen?';
var
fil: TLevelFile;
Markiert: boolean;
i, TempArtMain, TempLiveMain: integer;
SavGame: textfile;
Ergebnis: array[1..5] of string;
begin
if LevelListBox.ItemIndex = -1 then exit;
 
if MainForm.LevChanged and (MainForm.LevData.CountEnemies>0) then
Markiert := false;
for i := 0 to LevelListBox.items.Count-1 do
begin
if MessageDlg(SLoadNewLevelAndDiscardChanges, mtConfirmation, mbYesNoCancel, 0) <> mrYes then exit;
if LevelListBox.Selected[i] then Markiert := true;
end;
 
if not Markiert then exit;
if LevelListBox.items.count = 0 then
begin
li1a.visible := false;
li2a.visible := false;
li3a.visible := false;
li1b.visible := false;
li2b.visible := false;
li3b.visible := false;
liw.visible := true;
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
end;
// Da Button bei ungültigen Level deaktiviert wird, ist das nicht mehr nötig.
{if liu.visible or (LevelListBox.items.count=0) then
exit;}
 
// Vorbereiten
MainForm.DestroyLevel;
MainForm.LevData.RasterErzwingen := true;
fil := GetLevelFileName(GetListBoxSelectedLevelNumber,false);
if not fil.found then raise Exception.Create(SLevelFileNotFound);
MainForm.LevData.LoadFromFile(fil.fileLocation);
MainForm.RefreshFromLevData;
MainForm.LevChanged := false;
// Öffnen
AssignFile(SavGame, mainform.FDirectory+'Levels\'+
LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
Reset(SavGame);
// Laden
ReadLN(SavGame); // --> Copyrightinfo
ReadLN(SavGame); // --> Copyrightinfo
ReadLN(SavGame, Ergebnis[5]); // --> Länge der Karte
MainForm.ScrollBar.Max := strtoint(Ergebnis[5]);
MainForm.Enemys.Clear;
TempArtMain := MainForm.ArtChecked;
TempLiveMain := MainForm.LiveEdit;
while not seekEoF(SavGame) do
begin
ReadLN(SavGame, Ergebnis[3]);
ReadLN(SavGame, Ergebnis[1]);
ReadLN(SavGame, Ergebnis[2]);
ReadLN(SavGame, Ergebnis[4]);
MainForm.EnemyAdd(strtoint(Ergebnis[1]), strtoint(Ergebnis[2]), strtoint(Ergebnis[3]), strtoint(Ergebnis[4]));
MainForm.ArtChecked := strtoint(Ergebnis[3]);
MainForm.LiveEdit := strtoint(Ergebnis[4]);
MainForm.EnemyCreate(strtoint(Ergebnis[1]), strtoint(Ergebnis[2]));
inc(MainForm.NumEnemys);
if Ergebnis[3] = '7' then MainForm.Boss := true;
end;
MainForm.LiveEdit := TempLiveMain;
MainForm.ArtChecked := TempArtMain;
// Schließen
CloseFile(SavGame);
// Nacharbeiten
MainForm.AnzeigeAct;
close;
end;
 
function TSpeicherungForm.RightStr(str: string; count: integer): string;
begin
result := copy(str, length(str)-(count-1), count);
end;
 
function TSpeicherungForm.Filter(n: integer; s: string): string;
var
i, last: integer;
start, start2: boolean;
temp: string;
begin
last := 0;
start := false;
start2 := false;
temp := '';
if n = 1 then
begin
for i := 1 to length(s)+1 do
begin
if copy(s, i, 1) = '-' then
begin
last := i;
break;
end;
end;
temp := copy(s, 1, last-1);
end;
if n = 2 then
begin
for i := 1 to length(s)+1 do
begin
if start2 then start := true;
if copy(s, i, 1) = '-' then start2 := true;
if (copy(s, i, 1) = ':') and start then break;
if start then temp := temp + copy(s, i, 1)
end;
end;
if n = 3 then
begin
for i := 1 to length(s)+1 do
begin
if start2 then start := true;
if copy(s, i, 1) = ':' then start2 := true;
if (copy(s, i, 1) = '(') and start then break;
if start then temp := temp + copy(s, i, 1)
end;
end;
if n = 4 then
begin
for i := 1 to length(s)+1 do
begin
if start2 then start := true;
if copy(s, i, 1) = '(' then start2 := true;
if (copy(s, i, 1) = ')') and start then break;
if start then temp := temp + copy(s, i, 1)
end;
end;
result := temp;
end;
 
procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
resourcestring
SLevelIsEmpty = 'Das Level ist leer!';
SLevelAlreadyExists = 'Level ist bereits vorhanden. Ersetzen?';
SNoValidLevelName = 'Dies ist kein gültiger Levelname!';
var
SavGame: textfile;
i, j: integer;
puffer: string;
begin
if MainForm.LevData.CountEnemies = 0 then
if mainform.Enemys.count = 0 then
begin
MessageDlg(SLevelIsEmpty, mtError, [mbOK], 0);
LevelNumber.SetFocus;
MessageDlg('Das Level ist leer!', mtError, [mbOK], 0);
SpinEdit.SetFocus;
exit;
end;
{for i := 1 to length(LevelName.text) do
{for i := 0 to length(LevelName.text) do
begin
if (copy(LevelName.text, i, 1) = '\') or
(copy(LevelName.text, i, 1) = '/') or
172,22 → 275,45
(copy(LevelName.text, i, 1) = '>') or
(copy(LevelName.text, i, 1) = '|') then
begin
MessageDlg(SNoValidLevelName, mtError, [mbOK], 0);
MessageDlg('Dies ist kein gültiger Levelname!', mtError, [mbOK], 0);
LevelName.SetFocus;
exit;
end;
end;}
if (LevelListBox.items.IndexOf(Format(SLevelListBox, [LevelNumber.Value])) > -1) or
(LevelListBox.items.IndexOf(Format(SLevelListBox, [LevelNumber.Value])+' ('+SSelbsterstellt+')') > -1) then
if LevelListBox.items.IndexOf('Level ' + inttostr(SpinEdit.Position)) > -1 then
begin
if MessageDlg(SLevelAlreadyExists, mtConfirmation, mbYesNoCancel, 0) <> mrYes then
if MessageDlg('Level ist bereits vorhanden. Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
exit;
end;
 
// Öffnen oder erstellen
AssignFile(SavGame, mainform.FDirectory+'Levels\Level '+inttostr(SpinEdit.Position)+'.lev');
Rewrite(SavGame);
// Sortierung
for j := 0 to mainform.enemys.Count - 2 do
begin
for i := 0 to mainform.enemys.Count - 2 do
begin
if strtoint(filter(1, mainform.enemys.Strings[i])) > strtoint(filter(1, mainform.enemys.Strings[i + 1])) then
begin
puffer := mainform.enemys.Strings[i];
mainform.enemys.Strings[i] := mainform.enemys.Strings[i + 1];
mainform.enemys.Strings[i + 1] := puffer;
end;
end;
end;
// Speichern
MainForm.LevData.LevelEditorLength := MainForm.ScrollBar.Max;
MainForm.LevData.SaveToFile(GetLevelFileName(LevelNumber.Value,true).fileLocation);
 
WriteLN(SavGame, '; SpaceMission ' + FCompVersion);
WriteLN(SavGame, '; LEV-File');
WriteLN(SavGame, inttostr(MainForm.ScrollBar.Max)); // --> Länge der Karte
for i := 0 to mainform.enemys.count-1 do
begin
WriteLN(SavGame, filter(3, mainform.enemys.Strings[i]));
WriteLN(SavGame, filter(1, mainform.enemys.Strings[i]));
WriteLN(SavGame, filter(2, mainform.enemys.Strings[i]));
WriteLN(SavGame, filter(4, mainform.enemys.Strings[i]));
end;
// Schließen
CloseFile(SavGame);
// Nacharbeiten
MainForm.LevChanged := false;
MainForm.AnzeigeAct;
195,17 → 321,10
end;
 
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
resourcestring
SYes = 'Ja';
SNo = 'Nein';
SFields = '%d Felder';
SXbyY = '%s von %s';
var
LevelData: TLevelData;
boss: boolean;
i: Integer;
anzahlEinheiten: integer;
fil: TLevelFile;
Ergebnis, boss, l, temp: string;
SavGame: textfile;
x, a: integer;
begin
li1a.visible := false;
li2a.visible := false;
213,7 → 332,6
li1b.visible := false;
li2b.visible := false;
li3b.visible := false;
li4.visible := false;
liu.visible := false;
liw.visible := false;
if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
223,50 → 341,59
liw.visible := true;
exit;
end;
LevelNumber.Value := GetListBoxSelectedLevelNumber;
 
LevelData := TLevelData.Create;
try
try
LevelData.RasterErzwingen := true;
 
fil := GetLevelFileName(GetListBoxSelectedLevelNumber,false);
if not fil.found then raise Exception.Create(SLevelFileNotFound);
LevelData.LoadFromFile(fil.fileLocation);
 
boss := false;
anzahlEinheiten := Length(LevelData.EnemyAdventTable);
for i := 0 to anzahlEinheiten - 1 do
begin
if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then
begin
boss := true;
end;
end;
 
li1a.visible := true;
li2a.visible := true;
li3a.visible := true;
li1b.visible := true;
li2b.visible := true;
li3b.visible := true;
li4.visible := true;
LadenBtn.enabled := true;
LoeschenBtn.enabled := true;
li1b.caption := inttostr(anzahlEinheiten);
if boss then
li2b.caption := SYes
else
li2b.caption := SNo;
li3b.caption := Format(SFields, [LevelData.LevelEditorLength]);
li4.Caption := Trim(Format(SXbyY, [LevelData.LevelName, LevelData.LevelAuthor]));
finally
FreeAndNil(LevelData);
end;
except
temp := LevelListBox.Items.strings[LevelListBox.itemindex];
SpinEdit.Position := strtoint(RightStr(temp, length(temp)-6));
AssignFile(SavGame, mainform.FDirectory+'Levels\'+
LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
Reset(SavGame);
ReadLN(SavGame, Ergebnis);
if Ergebnis <> '; SpaceMission '+FCompVersion then
begin
liu.visible := true;
LadenBtn.enabled := false;
CloseFile(SavGame);
exit;
end;
ReadLN(SavGame, Ergebnis);
if Ergebnis <> '; LEV-File' then
begin
liu.visible := true;
LadenBtn.enabled := false;
CloseFile(SavGame);
exit;
end;
ReadLN(SavGame, l);
x := 0;
a := 0;
boss := 'Nein';
while not SeekEOF(SavGame) do
begin
ReadLN(SavGame, Ergebnis);
inc(a);
if a = 5 then a := 1;
if (a = 1) and (Ergebnis = '7') then boss := 'Ja';
inc(x);
end;
CloseFile(SavGame);
if a <> 4 then
begin
liu.visible := true;
LadenBtn.enabled := false;
end
else
begin
li1a.visible := true;
li2a.visible := true;
li3a.visible := true;
li1b.visible := true;
li2b.visible := true;
li3b.visible := true;
LadenBtn.enabled := true;
LoeschenBtn.enabled := true;
li1b.caption := inttostr(trunc(x / 4));
li2b.caption := boss;
li3b.caption := l + ' Felder';
end;
end;
 
procedure TSpeicherungForm.Button4Click(Sender: TObject);
280,23 → 407,6
SearchLevels;
end;
 
function TSpeicherungForm.GetListBoxSelectedLevelNumber: integer;
var
i: integer;
begin
result := -1;
if LevelListBox.itemindex = -1 then exit;
for i := 1 to MaxPossibleLevels do
begin
if (LevelListBox.Items.strings[LevelListBox.itemindex] = Format(SLevelListBox, [i])) or
(LevelListBox.Items.strings[LevelListBox.itemindex] = Format(SLevelListBox, [i])+' ('+SSelbstErstellt+')') then
begin
result := i;
exit;
end;
end;
end;
 
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
begin
SearchLevels;
312,11 → 422,9
{...}
end;
 
procedure TSpeicherungForm.FormCreate(Sender: TObject);
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
begin
LevelNumber.MinValue := 1;
LevelNumber.MaxValue := MaxPossibleLevels;
LevelNumber.Value := 1;
LadenBtn.click;
end;
 
procedure TSpeicherungForm.FormHide(Sender: TObject);
324,5 → 432,23
mainform.dxtimer.enabled := true;
end;
 
procedure TSpeicherungForm.SpinEditClick(Sender: TObject;
Button: TUDBtnType);
begin
SpinEditEdt.Text := inttostr(SpinEdit.position);
end;
 
procedure TSpeicherungForm.SpinEditEdtKeyPress(Sender: TObject;
var Key: Char);
begin
if not (Key in [#13, #08, '0'..'9']) then
Key := #0;
end;
 
procedure TSpeicherungForm.SpinEditEdtChange(Sender: TObject);
begin
SpinEdit.Position := strtoint(SpinEditEdt.text);
end;
 
end.
 
/ComMain.pas
0,0 → 1,276
unit ComMain;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Gauges, ShellAPI, ExtCtrls, ComCtrls;
 
type
TMainForm = class(TForm)
Run: TButton;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Bevel1: TBevel;
Label1: TLabel;
Label2: TLabel;
comb: TComboBox;
gauge: TProgressBar;
procedure RunClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
public
FDirectory: string;
procedure c02t03(von, an: string);
procedure c03t04(von, an: string);
procedure c04t10(von, an: string);
end;
 
var
MainForm: TMainForm;
m: array[1..5] of tstrings;
 
implementation
 
{$R *.DFM}
 
{$R WindowsXP.res}
 
procedure TMainForm.RunClick(Sender: TObject);
var
i: integer;
begin
if comb.ItemIndex = -1 then
begin
MessageDLG('Bitte Umwandlungsmethode wählen!', mtError, [mbOK], 0);
exit;
end;
if not DirectoryExists(FDirectory+'Temp') then CreateDir(FDirectory+'Temp');
if not DirectoryExists(FDirectory+'Temp\1') then CreateDir(FDirectory+'Temp\1');
if not DirectoryExists(FDirectory+'Temp\2') then CreateDir(FDirectory+'Temp\2');
if not DirectoryExists(FDirectory+'Eingabe') then CreateDir(FDirectory+'Eingabe');
if not DirectoryExists(FDirectory+'Ausgabe') then CreateDir(FDirectory+'Ausgabe');
for i := 1 to 999 do
begin
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A1.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A1.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A1.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A1.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A2.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A2.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A2.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A2.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A3.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A3.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A3.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A3.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A4.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A4.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A4.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A4.sav');
if fileexists(FDirectory+'Temp\1\Lev'+inttostr(i)+'A5.sav') then DeleteFile(FDirectory+'Temp\1\Lev'+inttostr(i)+'A5.sav');
if fileexists(FDirectory+'Temp\2\Lev'+inttostr(i)+'A5.sav') then DeleteFile(FDirectory+'Temp\2\Lev'+inttostr(i)+'A5.sav');
if fileexists(FDirectory+'Temp\1\Level '+inttostr(i)+'.lev') then DeleteFile(FDirectory+'Temp\1\Level '+inttostr(i)+'.lev');
if fileexists(FDirectory+'Temp\2\Level '+inttostr(i)+'.lev') then DeleteFile(FDirectory+'Temp\2\Level '+inttostr(i)+'.lev');
end;
if comb.ItemIndex = 0 then c02t03(FDirectory+'Eingabe', FDirectory+'Ausgabe');
if comb.ItemIndex = 1 then
begin
c02t03(FDirectory+'Eingabe', FDirectory+'Temp\1');
c03t04(FDirectory+'Temp\1', FDirectory+'Ausgabe');
end;
if comb.ItemIndex = 2 then c03t04(FDirectory+'Eingabe', FDirectory+'Ausgabe');
if comb.ItemIndex = 3 then c04t10(FDirectory+'Eingabe', FDirectory+'Ausgabe');
if comb.ItemIndex = 4 then
begin
c02t03(FDirectory+'Eingabe', FDirectory+'Temp\1');
c03t04(FDirectory+'Temp\1', FDirectory+'Test\2');
c04t10(FDirectory+'Temp\2', FDirectory+'Ausgabe');
end;
if comb.ItemIndex = 5 then
begin
c03t04(FDirectory+'Eingabe', FDirectory+'Temp\1');
c04t10(FDirectory+'Temp\1', FDirectory+'Ausgabe');
end;
end;
 
procedure TMainForm.c02t03(von, an: string);
var
daten: textfile;
lev, i, j: integer;
ergebnis, temp: string;
begin
for lev := 1 to 999 do
begin
gauge.Position := gauge.Position + 1;
if fileexists(von+'\Lev'+inttostr(lev)+'A1.sav') then
begin
m[1].loadfromfile(von+'\Lev'+inttostr(lev)+'A1.sav');
m[2].loadfromfile(von+'\Lev'+inttostr(lev)+'A2.sav');
m[3].loadfromfile(von+'\Lev'+inttostr(lev)+'A3.sav');
m[4].loadfromfile(von+'\Lev'+inttostr(lev)+'A4.sav');
m[5].loadfromfile(von+'\Lev'+inttostr(lev)+'A5.sav');
m[1].strings[0]:='-624';
if fileexists(an+'\Lev'+inttostr(lev)+'A6.sav') then
begin
assignfile(daten, an+'\Lev'+inttostr(lev)+'A6.sav');
reset(daten);
readln(daten, ergebnis);
temp:=ergebnis;
closefile(daten);
end
else
begin
temp:='30000';
end;
assignfile(daten, an+'\Level '+inttostr(lev)+'.lev');
rewrite(daten);
append(daten);
writeln(daten, '; SpaceMission 0.3');
writeln(daten, temp);
for j := 0 to m[1].count-2 do
begin
for i := 0 to m[1].count-2 do
begin
if strtoint(m[1].strings[i]) > strtoint(m[1].strings[i+1]) then
begin
m[1].exchange(i, i+1);
m[2].exchange(i, i+1);
m[3].exchange(i, i+1);
m[4].exchange(i, i+1);
m[5].exchange(i, i+1);
end;
end;
end;
for i := 0 to m[3].count-1 do
begin
for j := 1 to 4 do
begin
if j = 1 then writeln(daten, m[3].strings[i]);
if j = 2 then writeln(daten, m[1].strings[i]);
if j = 3 then writeln(daten, m[2].strings[i]);
if j = 4 then writeln(daten, m[4].strings[i]);
end;
end;
closefile(daten);
end;
end;
gauge.Position := 0;
end;
 
procedure TMainForm.c03t04(von, an: string);
var
daten, daten2: textfile;
lev: integer;
ergebniss: string;
begin
for lev := 1 to 999 do
begin
gauge.Position := gauge.Position + 1;
if fileexists(von+'\Level '+inttostr(lev)+'.lev') then
begin
assignfile(daten, von+'\Level '+inttostr(lev)+'.lev');
reset(daten);
assignfile(daten2, an+'\Level '+inttostr(lev)+'.lev');
rewrite(daten2);
while not seekeof(daten) do
begin
readln(daten, ergebniss);
if ergebniss = '; SpaceMission 0.3' then
begin
writeln(daten2, '; SpaceMission 0.4');
writeln(daten2, '; LEV-File');
end
else
begin
writeln(daten2, ergebniss);
end;
end;
closefile(daten2);
closefile(daten);
end;
end;
gauge.Position := 0;
end;
 
procedure TMainForm.c04t10(von, an: string);
var
daten, daten2: textfile;
lev, z, act: integer;
ergebnis: string;
begin
for lev := 1 to 999 do
begin
gauge.Position := gauge.Position + 1;
if fileexists(von+'\Level '+inttostr(lev)+'.lev') then
begin
assignfile(daten, von+'\Level '+inttostr(lev)+'.lev');
reset(daten);
assignfile(daten2, an+'\Level '+inttostr(lev)+'.lev');
rewrite(daten2);
z := 0;
act := 0;
while not seekeof(daten) do
begin
inc(z);
if z > 2 then inc(act);
if act = 5 then act := 1;
readln(daten, ergebnis);
if ergebnis = '; SpaceMission 0.4' then
writeln(daten2, '; SpaceMission 1.0')
else
begin
if (ergebnis = '30000') and (z = 3) then
writeln(daten2, '1200')
else
begin
//if not (((ergebnis = '0') and (z = 4)) or ((ergebnis = '-624') and (z = 5)) or ((ergebnis = '222') and (z = 6)) or ((ergebnis = '3') and (z = 7))) then
if (z < 4) or (z > 7) then
begin
if act = 4 then
writeln(daten2, inttostr(strtoint(ergebnis) + 32 - (5 * (strtoint(ergebnis) div 37))))
else
writeln(daten2, ergebnis);
end;
end;
end;
end;
closefile(daten2);
closefile(daten);
end;
end;
gauge.Position := 0;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
FDirectory := extractfilepath(paramstr(0));
m[1] := TStringList.create;
m[2] := TStringList.create;
m[3] := TStringList.create;
m[4] := TStringList.create;
m[5] := TStringList.create;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
m[1].Free;
m[2].Free;
m[3].Free;
m[4].Free;
m[5].Free;
end;
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar(FDirectory+'Eingabe\'), '', '', 1);
end;
 
procedure TMainForm.Button2Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar(FDirectory+'Ausgabe\'), '', '', 1);
end;
 
procedure TMainForm.Button3Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar(FDirectory+'Levels\'), '', '', 1);
end;
 
end.
 
/LevSplash.dfm
4,8 → 4,8
BorderIcons = []
BorderStyle = bsNone
Caption = 'Bitte warten...'
ClientHeight = 373
ClientWidth = 515
ClientHeight = 388
ClientWidth = 533
Color = clBlack
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
12,7625 → 12,17
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Position = poScreenCenter
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object SplashImage: TImage
Left = 0
Top = 0
Left = 8
Top = 8
Width = 515
Height = 373
AutoSize = True
Picture.Data = {
0954506E67496D61676589504E470D0A1A0A0000000D49484452000002030000
01750802000000FA2A7E410000000970485973000004BB000004BB016E1F0EAE
0000000467414D410000B18E7CFB51930000FFFF4944415478DAACBD09BC1C65
95367EAABAAAABF7BEB7EF9E3D842501059771FD3B8BCBA8333AA38E280E2202
82826C02814058022191254008B223A08220A39F333AE8B88C8EE8F867107101
04C2928424775F7BEFAEEEAAFA9EBE0F7D2CEE4DEE2738FDD3D0B7FAAD7739EF
79CF7ECE6B1886212FFF0441C02FA954AA542A45A351DFF7F170D5AA55CF3EFB
6C5757D7CCCC4C7F7FFFF8F8B8EBBA78DD34CD60F6C3EFDAA165599148043DD8
B6DDD3D333343474E8A1873EF5D453F829DC122FB27FB6AFD7EB788857D0A0D1
68A00D2650AD56F1B0B3B3339FCFA371269329140A68DF6C36D12C168BA1017A
E8E8E8C0DCF024994C562A15CFF3B8043EE7CC39167A8BCD7EF064DBB66D175D
741146C42BB55A0D0FD7AF5F7FC30D3760089DA12E902F62218F3DF618FAC758
E8906BC1ACA6A7A7B93AB6C777AC08FFA2653A9D2E168B0A55B459B264C99E3D
7BB00AFC8AE7E8842DF99DAFEB5EF0213E5832FB673FE81FF3C1CCBBBBBBB123
80D5DFFFFDDFFFEC673FC3D6E009FA674B4C126DD0091ADC7EFBEDC71D775C36
9BC5EB37DE78E329A79C82E70411B6696A6A0A73C017F496CBE5F0A7CE0D9D00
4AF8170DE2F138608EA1B1473A3D4C8CBF2AACF831421FB4C79CB94CAC3D9148
9C77DE79975F7E39F69DDB8A7ED000CD3004FAC18E707A6880113101FCA4F099
FFC1736CF4E4E4A42E8AAB466FE80A3D1355F01048522E97F545DD297D82B1D0
12000FFF0A24E42EE3C381FAFAFA46474715562B56ACD8B56B17BE1044C4528C
F5C10F7EF0473FFA1156818DE043C771F0A74283F3997F1E755D9C0311587744
CF1A61AB33C7776C315A02A461DCC3886CC6368B172F1E1C1CC4EBBA767EC7F4
082534DBBA75EBF9E79F8F11B93B6800ECD21EF0040BC14CD033C80200423C01
B40176B6E41A8190131313D87142000F095BFCA40F89DB3CD77A88B858FE0994
FBC8473EF2C0030F601442ACB7B7975D0163D1833FFB41334E8020E2409C0F77
EAB0C30E7BE6996788B1C43742896DF01DAFE3217673F7EEDD18176B242A7239
A44E5826668EB7D0092189D7F1135A1E7FFCF1BFF8C52F9E7FFE790C8177D127
09C5FEF0165DA10DFE45E71C88E0E5F2F12ECF3BBAC25E5C77DD75F8BECF7E88
541C85070A2FA2434563CE017FE23BB789AB30E6631E07C629C20A89C4A4F8F8
971B06D08F8D8D1164244FE13DD30EB10CB4C73C3EF4A10FDD79E79D3836EF7B
DFFB7EF0831F809AA331E9859209D2381C1EFC4B62C1DD65CFC0216C1E511047
115060E758037AC373B4212831731E338C8B6EB1046027DEC5AF8011CFEAC0C0
00DE226564637C416F981280B87CF9F2175F7C91209BC309385BFC4B228EF6A4
E36122AE6D785C312EFEC44F071E78201EEED8B10343006940A18E39E6986F7F
FBDBD8AA399C80679E678C98AA4C05BD01C50179C01F4F48AF89C1447D3C7CDD
EB5E0714C77256AE5C09D4C492D11E10036CD1214E4E983110E1F0840C069351
020738E05F34E3FC490230134C0CDB71D249278183BEF7BDEF7DF0C107959787
49FF1CC182BB4CE285B961A7B01C7C476F6F7BDBDB1E7EF8612588982D1B808C
E20BD685EF001A0F981E8FFD514CA2019016AFA3FFFBEFBF1F709E33BDA54B97
822451BCE034D01BBE285A921E11FE9C15F18158AD670C5FD6AC59F3777FF777
DFF9CE7740FD716400227085B56BD7DE76DB6DD814BC454A819F80754F3FFD34
90101D02DA980370003F81306114B22E4C9ED8B84F4E8077092525D39C64987B
6197714030DC73CF3D77EAA9A75E7FFDF56F7CE31B21B5E8C9D2A561624A4D30
07E221E1C0556BB7A441847C98872D5BB60CD3566E0AAC00B7BBF7DE7BD192B0
C58BC01F9E65EC9D028DF3241DC764889F60A8679E79E6C5175FCC51C28B0AE3
8F3EC7EBE8937B8781F01645133C21326392447215A17872219262742C1F6787
B48E8B22E7461B1E28C010B322C52486A319491F7AC6CC791C301FCC1FE36269
2035687FCE39E75C7AE9A5389B6849CAA93C35CCADE7EFAF724A4C03E8F18E77
BCE3273FF909C40E0CC16592ABF1BC2C203128CFD3A189C09824A64D91489FAB
50BE0F4E103E3394CD29A743C40001C513808020C34F1852E97578C348CE4838
7898B10C504330498A5A64DD121218B961688FE7E896B848FC03E8F913350000
5D052E0ECDC5903D60FB89A97C573758DAD23A9FA325C7529104F80424807C7A
E2892762CB81E573B416ED81A7050BC78B040E1EEAD1DA2727E0886436A429D0
B1705CD120AC07E8774A103CF9041499D9DFFCCDDF40E4E791A0CAC59F00310C
0138EB7A417A868787A9AC60E3C8EDB04CA21A27CC9EC94238163486B3CF3E1B
DDB2B112418A021212A5C95AB01C6E9F6A033A6DC58A39479A3A9C1E302E1CF3
4757243A6C09D2F0AE77BDEBBBDFFD2E87C35E8360E17491A02C701278CE495B
F554E064023EF815A0C013C53A6CA24AD961F88767AE5B8F1749E61433F55CA8
AEA08A88F236EE08F68EF8F6D6B7BEF557BFFA9512A039E2FC02EBA210805700
28526DE564AA1CF0432114C0C45B541CC99038130010DF5531A284A478C8F928
F5C17248C7EBB31F6211B666E7CE9D9FFBDCE7C0F0B81D175E7821F44BC001BF
A2438002EFE23471379510530B64574AA055100EEB5BBA41DC1DB228BC8E6638
9B18480F386514920BB2072E84FBA2947DD1A245E001E807CF6939A03640798E
1B817F2988E02DBE8B290138E8013FA125A04AB583B88D5F79D6C27C0ECB6763
1E4C9E0B15C0F7B7BF2A27B1074ABDCA7A95A6870D03FBC313EE9A3BFBC11780
94E414107BC31BDEF09BDFFC0688411CD6E3B65F4EA08A921E6F60215AE2FD2D
5BB69C7BEEB96CC99D53D084F198E492E84E0A422E4DA263B63FA405841A3640
993C255C5A36283850542789E702C8068E3AEAA8FBEEBB8F622CDF225A508622
EEAA984F4313CF03814B7A77DA69A7018FF93A9A4166874A88C69C3657C789C9
AC7588E26A5850C2874A19413ADF3A04FC23D1C41061394EA1A7D0507E13D609
F085E41EA3FFE55FFEE50F7FF84325D35826E643FA4B8188A225E826A921190F
8FB7AA11980CF6859091B6DCA7F640341B191909D33B7ED4CEA07C42F9105935
899D2E212C588419A40293980AE050A653C8108C981E280EFE3CE8A083204310
A9A8A0EC4FCB264791B666837F713EB904B2049C5852521E27C596F0AE29330E
7FC1EB7857ED1BF84E2306351BF257FCF99AD7BCE6D7BFFEB5B485564C18B21E
6810608BBD035939F2C8231F7AE821A80E383EE801F0C41C680AC3C416D00988
66619D403FA4929CC9FC7775D7544AA04E404B11D645EE15D67E14261B376EBC
E0820B489ED03F760A10A0DC060403B6A0254833640E7EA1E513679656232A22
1489301CE91A3711CBE77004294546BC48DC50794BF91CD9301AE87288CC611B
143EFCCE9345E11D0351E3E101A784C40E29AAAA4D090F69E409A32B96BC6EDD
BA8B2EBA886C181F2295B415C4E4EC07320A968F3F81CFB46A704A1435303419
C6FE28F8D1471FFDAD6F7D0B13C61E0137F890CC8CD0C04FA4C3181AFF12C9E7
7FC0F074FEF87EF8E187031B0125122E6C04E0433D8688246D81DEA0599020C3
D66260D20B6046D84AC5CD232C28C7E93901A0B1311800239133D3B8B1BF35EF
EFA3D450E54A9935F029E525E9A1F042018D74471185425F98EE68CF7A6054CF
529B38570138F0750C47B98FAC8B3C13DB03D0D35A475EC2C65835DAA001A9BC
D2B8F99C4027031512A4FCFBDFFF3E700ED48D5B129649C3566015045430C717
EC14A081F3008CE131D013CEA1B18FD83E72566EB69ABC6FB9E596534E390518
46E309CD6894D07954F02FDEBAECB2CB366CD8A02A140F30F101F30793A00444
5180679E82ED3E655B95EFB8A1E4F494B0A8117374AE022BA2C4407AA7EC1CF3
4433E027CFF3023211E6061029CC21B87CF39BDF042DC679BEE69A6B48AF4F3A
E9249C90C71E7B4C95DAF0AE2915D01DC42BE816EB8588C06E7926F99C4A003F
58055E5736A9544937827E1DE2F31C1B882CA813CC51F68957FA902F526200D0
3037F0A4279F7C52E51E502B1A9A89AB2452EADE503C24A6A9FC81E76803D219
6651EC533D55EA0653919C4A094F10BD3B2A7D135155B22402A31976075C47DA
A62A328CF99CE0F4D34F872282E79C36AD5ED44D95A92B0F80EE0222C8D7D5B9
0899EFFCF3CF0722A9F95E42FC5E669569AC051DF2F8AB5DE575AF7B1DC426BC
42EE428240FABE75EBD6F5EBD753F3C3736C2E66459EC473CDB52C4015B13A9C
4AB013C0109DEFDDBB57E9158F03B94298DAEC0F4F0025F02A2C01F3E469C5BB
F88EDE4E38E184AF7FFDEB801259F521871CB27DFB76FA6C5A671263ABE30B7F
8293ECD8B14366D573CC00C35364A078A89C196F6198175E78819BC78D516BF5
025CEB95720269B35685C2EAD5AB9F79E619695B2AB012CC0AE72A6C109CCF09
14E7E64C4CC9A83DFBA1E54465616A12442F40507D80BAEAB084CB79EED33A04
9287774932484039131A8E75EDCAA5D5424D3AA2BC010DB8BBD2B6FFA8B74DB5
C8B02F94BFAAA5E2F6DB6F877443370325711E06FADF788C57AE5C09491C2F62
81C4C8B0D0A474108DC94D756EAADCCC315EABF54F66C5283D5ABA3ABEAB9E5E
B6848485C68A991FF8C0077EF4A31FF170F20CEF0F8BD039E56BAC880C1E10A0
71E0EAD90FE68CCE0143AA7D73AC43737CB3EC16BFD2E8846E290F624369C3C5
1098219D19F889DB8AC61C1A2F6274104ABCA23637FE24B3D23AFEE5131A64F6
A7EB287556C2416CA1FE37C73AA4744D719B543B6C16E7F139EEB8E3FEE77FFE
E7E9A79FA6B41B96C4C9096856C2A248A778881830C2F34824E1795163322806
404109923D70686A092AB9530027BA52ADA4C2A726C7F9D6212C04A2034D58C4
1374A586787586D398C9C3CB3DD5F0133DFE615BB132544509BA48293071F26A
96A422AB24857026559C6F46262F54A962CE4E85A9107D726C89B700581C310C
44F8A8B18BD478613F9982426D954436EE3B250309D9F05F326630EA063F9330
AD5AB5EAA9A79EE2C909C34BF939BE63721C80363534C04F7805F3A6556701FD
FD957202DA882824860510F2037C07700129F5C5E936CFE104DC4E7509A0439E
6D501915F9C30229361E4FA8872A6439347829DE020480CAB4A248DBF7A206DC
F97E0269DB49814F071C7000E40B5052503A7D5DAD4312B2AEA84B879059B66C
D9AE5DBBA8D0C9AC3C422B99B4637BE8BDA04446C90BF3C4A2F090E8ABCAB532
332019A10ABE427E409B26DB2832A92514432F59B2E4E31FFFF895575E49A555
2DA7CAC6E658395427E02E9080A213AC852109A4111C941A864E00ABD8B66D1B
64465A1E6846D89F9C81AD446F73027E3873808E123DA566F48685031908F330
BE110FC39E83F047C51D4539527FD5A4156294B6A8B9629934F133B04D0DB8A4
65739067FE673E5994767C81A882DF6E401D97C61FAC9D7A2D6D14F897C48B54
4CA74ACC991395C4810E3AE820B00A5D2F8DF5738297A8A9D39F47030EC90D26
F0E637BFF957BFFA954A601A1B86A18F39E6989B6FBE995C16DD0220444EDA84
F7893F1865CD9A3550A6C933D4A31B769E93D5D1B32AED701A0C87E553520E63
32E40F5A63742DA06378F7BFFEEBBF783418938257F0E7F2E5CBD1C3A9A79EBA
79F36634A34F586DADD8596ABA1AFD41273FB67B4E34DDFE283895187488D38A
C34868A8C848F703158E053CCF24CBDC65CA0A34D1E35D9E7775DCAA4CD0022E
E453323D200404250025ACAA1310CAFA68A9E431C0171E89152B566063C2B3A1
70F7BF651DA2564B54C3BFDCBFB56BD76ED8B041B1194BC0D6AA2CB04F4E10F6
0B291E93C252E8660C2B1E62459FFCE427F1F0AEBBEEDAB3670F40445F05F95F
F80CA8F005D0D11827FB8922D55826251F1AF3A33A41D8E91A264F61AB85CA26
EAD550F99A561A2E21ACEDAA3D545572D21D7A4D20DB628BD5928E7952BD63D0
ADF6C33EE7780E48D4F85DBD1A0A99605E20AC848C783854EF7FFFFBEFBDF75E
B4574D6B8E990B2BC5771E5AAE97409B1F5B12DE6BF2091A15F1E49E7BEEF9D4
A73E4509400342A4CD11C3CE79E504EAA7E159A0C9853494FD84A3696901C727
AC742A33A342C3B1D42683F95F73CD351B376E5457ADE2E102275C2DF8AA83CE
4195397E26BA1F748DCAC0F8D16851EA7073BCD6BA6BFA9606F56A20294D1074
BDA89B477559B4017A00B54E38E1846F7CE31B009A46FD61AA0008B08B7C0802
01B48A700481C61104F3A248C16EC1306834A618A45C5F51825874C515578044
704768BBA615945E0DAE114BA09156A5076E2235091E10D595A9C16032D853F0
8070708784E424EEF81CDB8346972E6CD5D1F010B57F48C8B4A8BA7EF8DCCDF9
F00C127A00B22AA9340FD2A687876192485B880151EBAAABAED28EB05B679F7D
36381E04A8E79E7B8E411D8CC0C1D8CA120041AC4AF9366084B1B1431AB41E16
CFFF4C4E402323F5FDB0D90133BFE38E3B3022F91BC837E6093D668EEF5A42B1
1F61C204960EDAAD4181C0516A0C18823294AA631ADD817FDFF296B73CFAE8A3
D75F7FFDE9A79F4ECCD0E34DAB289A71866A97A4DAC42DC177004DC3B129A4A8
3D81984AFC53AA8D7ED03E6C28449F1ABD4393345D0214B5A46D7D92B63EC84E
48161966CE758503BDC2279F448443681433E91A46E4CE129F002B0001CC326C
22E32B4A88F99027814FAEBEFA6A3A21E948BFECB2CBCE3BEF3C028DE11F0C75
55873C0499A38E3A0A3C03AF533298233086A986E237F608E2022740E2AB944E
7D4E6132AAFED2818101DAC488F9848FBAD0341D045F48DC29A9B071D8A7C58C
0D7A5FB8950A1C1D51631F54329076D43FD9834A3FD42A28EEF050A87D4CC3DB
C902296A7CEC631FFBDEF7BE879680D5D2A54B3FFFF9CF6FDDBA95269DB0E2A5
B1E74AF4C3B100611F2CD921BFAB4750E6C5BCEDCF12400AA5364C5267D213BC
4219140FE9B6A1A1292CD390678028A119E9A3068C92E1A967957C050DCE3CF3
CCDB6EBB0DCB01BB05FE53D8553197890500C81C031A35D470CA05CF11A57E0D
BB22A81790F4B95E4CFBC8238FFCD77FFD57FC497FD8FEAC436A1442B774C5AB
456B9FEDB98FB4AC42D0F9977FF9174AFDDC44E55E61F11708096DE6861B6E60
581169949A075AC3D06BA76E00705D7A9FD5C6A7FC8D2D95D6A0EB9B6EBAE98C
33CEA014A9E44F9D54FF2B9C8084490DE898037815944A68FAC40F2C1B8D39AE
0656EECF634CE860B1AB57AF1E1919A1D84BF54D8D0678171A315AEEDCB913BF
2A55C2AFB4D091AE910A2BE5C2BFC40F1A8548CDF5D4E115025DD33DE8FF94B6
C9E8A31FFD28B693867BC8CB20AF5471D00310FAACB3CED2D41B66C1BCF6B5AF
C5F9F9E0073F78E28927B25B9A65F116F608871FAB231E87D3EBE861631A9DA2
2CD90F26C9FC0CEEF5AA55ABE8049AA35EA876C89DC204FEF33FFF136CF89967
9E9993F477E8A1870280B41662816F7AD39B7EFBDBDFE257BA37D44A80E30DFE
AD245E774163CFD046A3BF487198D1A6CA87BAD383D9A06C100260265EA462AA
BB8F49429423F9C3704466F5618445C270FE145569B461203639D9C5175FCCBC
10CC0A8DE991A3D0A73482832A3551168E06B7DE7AEB71C71DC79F56AE5C094C
A6394E234D756BD4898221D012741073662C23E9F29C6402601D70039BAB640E
9491BB83434DDA8439D081216DD5767EE85158A465D4104F227AC304683FFCDF
E204C0D5356BD660868003E7A3AADB9BDFFC663CA7AC4DCB06C6A58E4E158DA6
3FAC178D8148C05E50DE7FFBB77FC32B684FB30F71523D195FFBDAD78E3EFA68
42AFBFBF1F9301366262A07B20A9D85C9E6ECE44D92D75682200DEA29509AF90
1ECEFF5026C05BA024DBB76F57B56C7F564DE2F99CA00045C27D524B0D8252B3
A49AF82464CA030EA8F44917310E1A094B381AD5E0E92205C10600768C93C59F
38360C10643E024D60127286A83519C887A56EDAB40992320F181057B348FE4C
4E0092F7F8E38F63F618859E525A9F88AC7848675D1888B21F3F01A91E57A152
5E3870281C5DC713CEF83335F22829246D626E1E45549D001E9221D1A0C4734B
EA40E2AE065385AAFA4BE9B0A1124667B81ADF40F7711218BD4A34851E8AE951
E3A3E989EB65749DD24DEC0810059054DF8F92F2F9F93B61BEABC405FF6274C6
9BFEEDDFFEED4F7FFA5369273450D79EE3ACA318A2B113A40224A9340BF060D0
A38B5DC017B4E47A29BC90472A31A5D18F01F21476C2FC896786560E0656317C
000DB0763606707854745673082E519A4700B409FFD213ABF17254AE2FBDF4D2
4B2EB944CF85B2254DD7A4827FC41147FCFEF7BFD78077EE26B7064FE8BCA565
9979C5948B71E29873134E7824CFA6ED1818A2818944360608E9CE6AAE8CC6AE
E0988063EDD8B183C6194D619550580B236D643FF1A614CF4952DFF9CE773EF5
D4530BE4C1FC899C802A94F60CB0335789C79316766A21E1AC497E8006DC68B5
E85236E7290EC70BA1A59A7AC823F58CD09C3B67B6A4A4A4D7D47101490A49A0
3CD83BBC4EFBD81C3FCDFC0FB7296CB223FE2F0C1FE003E374D575B43F1D0288
8D4DFFC31FFE40440A879F802332E4878E7DAA95EA56E149D1D4EB3F72024D30
53D70149218DB614E8F49C2BF9E0D9537799AE90D487E8FBBFA5135C71C51510
C10820CCE49E7BEEF9C4273E41E4507CA5BA1A8EB3DEA74E206D01597383C91B
888E6A1D56C6A088CBF6C66C96166D358C9EC69418114156F49EF7BCE717BFF8
C505175CB061C306325E0DD8A00187A80F717BD7AE5DE1BC415A90989273EFBD
F71E73CC31F8F3E0830F7EF6D967C3145991189D28AD544192280B8E82D7C195
E90E254C34B88B6B51873FA9677817D09E59A9FC53CDE2F3EDD74C4C63CC89CC
4AD36472E1E042B0319054AAB1345FE095B02ECFEC714A5BEA60C7779086134E
38E1C61B6FE441C29F20826A75D1D7C30749457B35A3E1E8423F50BCE749C6AF
1415E9F4E2461BA15C62A237D158A33E5486C517BAD6D927890B78030B005074
00E5D5701A526A99573C80441C9BF5D0430FA97801290F9BFEF0C30F333F566D
65DC262A07CCCEC5582416AC7142295B662308D4814464E3FC3131DA09C3052A
78DC780428C052365746ABBB4F1908DD82FA60ED6AD47E759C200C4F752CB187
70DC47D83CCB66E0D0C016061A314286984C898A749CAFD368A1FA99DA51F11C
2FBEF5AD6FFDD9CF7E46EB1C8F033754655C4D7757231836FA5DEF7AD7D34F3F
CD8A3B980375B805647665A2CC96A034B3B03509D3C391A126BDB0F549AD7CCC
53416365729C39261CAEB962CC26FA013915AA4AE85E9A4098E290DCA88A3187
0A845566CA2F5A2846CD02612B1B3192C841A344B8A007252C1D856D888EB441
2B19529314D90FD64C659CCE2EA39D9B170EDE92B6B158753A8C8B4149B6346F
995C94A9255AFC20EC7333F6551F89DBF099CF7CE6E69B6F56FFA71E6609A5F2
127DD103C005CD1773608004FBA7399870C3BB201FC072124D8DF62324F113DE
A2AEA01BC1883A2AD11C5A836B0F38E00008058027D90350043A2FA82ACB1085
C97A9813686C06DE2281534C007020AB0E0E0EE2C9673FFBD9AF7FFDEB980FA5
481C4E5A63C2F1451A8BC5851038383F982DCDA0546E98484894603417B9DD1C
E71B2838FE5CB76EDDB66DDB8036147ED5972E2FF70349DBE2C165B22B86B260
2D60D2102C1844A4E98D0C3754F5E8F0C30F870E2A21791CA0C671021212ED31
10738BE85D0FC756A9BA76C30D377CF9CB5F663F9809964CAE4C3E47C6AF5202
16889FE84D25E70893300DBA07904920B85846AA7CEA539FFAF6B7BF8D33128E
AB0E47045177E18632A42408E53F868B44A1CD61871D063153B579C56ACC4759
BEB42D727F0E2750C76CD0CE75A7662F6D15904496CC98248FC49D6962AAE553
70C476D08DFCDEF7BEF7C73FFE31FE5473B722A4CC464FCAAC364FA11BA80B15
E781071E00E4D542AED2A45A2F31E7709935761EB4AB9C2D40D9C9068C7665B6
85AD431A17035E8B731A06DA3EDB9F74D2499018A09C91C6D2324C6D895E2B72
7D02211CF8A0A14DE154D6D658241FEA29251B2445A020CC180386900217D129
B0DF68A7BD3148430BC230E58AC71B9C8767FEAEBBEE827CC75788D980267ED5
58913909FAB7DC72CB69A79D8699003AE4752043D0CE5481A542BD3F4EA095AD
146B813D5AD74563F65595518AA0A13BD29631C37E48D25FDA82F127CFCC1C1B
0B28173012844683A96EBFFD76904E8C0B8CC41CE84E00404E3DF554E6A99276
68A6FB71C71D8757743EF44DA936007802BCCAFC9554A9A18C6B04CCD574A8D9
FFE8FCFEFBEFFFE8473FAAA53834BB5BD18EBC8781CC2CDAA1353FE6CB3E4C9B
640325FA5A990E5D61698CB20D677E526157FA8281343D82479D3883570E3DF4
D0279E7882150B0007025C42D9FCEAF1D60DC29F37DD741300CEA375ECB1C702
97D095D67BA0B4AE194012721D318E16FFFEC33FFCC3830F3E4834E629E261D6
2835F5BD4B5B27F8ABBFFAAB5FFEF2973C8DD4F1C947094CD5C61497C8A43101
06136BD674309BD14A3B09115569B15A54284330A28F522D453CEA2B6A4BD180
D170A4A026AF84B343B4F2230685520256C7BA787A4C9478612C2A9A0CBDFDF3
394138965FAB8771DAFA9306EFE30988384E160520B5D5007F202E68581DA398
C8FB49407860D18039C00C8FC416A01312130D9D521133BC5FD0E0DFF4A6377D
E31BDFD0787AEA0484D8FE6278A41D184A66C6E92DA0433024474231054A8216
6EAFA8ABFE39AC1AF4136B042501CD61A22517A5A9A01AB3FE47EB90B4CDCA12
CAE7562B18ED5C5473F0A1B010564595A131569A33D3105D1E5A0DB460F043B8
04A3F26AE6E9A83E1B96D1C2E0A0ED9E6C99E6E6F99C40428626EAC8CC55A136
A05224D992AE224CF4C3E3CEE7041421292CD0AAA0413B120AF9A2A087451186
543E34FA0DF88D7789E2000BABA24262DDB46913378229AC9ACCC2904A15D680
FDE804AF9C75D6595FFAD297D424A2C539280CF2C013C53996F29E305419100C
68609250932FBBECB28B2EBA88F9657A66884346BB842A8D03745A68314E0099
29876A13072DFEEA57BF8ACD2241A46380B51BD9217AC0138D32A07352CBAD48
283496A056149D7F36A82769603EB7150BE7705A76866792D23D73AD955C12EB
68E2A7F8ACF52464D698B37DFB76DAD90104BC1E2E81154EF60E8BD28C47D0F0
210A6EDC2930AD4F7FFAD3E80ACF7162B5768BDA2DB9AE39A61240126B79E185
1754F3A6558A61EF124AC6D443C428A630DCB473EAD94C5C97504E4C5871A477
9A4A9E024AA3F85E1D2708D7B3E32E0037B4E81069162B6062B114E13128F442
B076BAEE805D58324B526AFA15BBA5579CA7921636EC8846D3E1096928F500B2
4C5A20D5FDCB25935BE33BE65098FD68594C365B40C6D7CC0C2ABBEA1D5C208A
9460E1A6F09505AC431AFB4ED954130548D0E8AAA438A279607842DD3D2C04FC
91CC5222A3258BDE2DEA14322BF5A80D9ACF0174B4E4C6E8AE6BBF9C073D7BDC
75DA2EB8DF803BD09DF4541938260722A2D95E684F873879BB395B6F8EDA035E
819008A99076520A26FBB30E69E548A65931438FAC88966235B2AB5B264CF195
31ECD33A64B6EB38324883915B3CF05A1F915E448C4E8A43CECA23A705F27850
89C11A2CCF0E553CE74610D43C0C8CE6D2792AABD6480C094559F088028FB1C5
94B9C2F1308A526A2CA6F08E3F4937D580A3353259908BFBC258263F545A4ADA
128D8A66EC478D452A37E0DF638E3906320B8F160D1D9A7FA7D84885403512D5
1D29DB4A3BB199DD924930FE5251FCBAEBAEFBC217BE40AE46BF3AF19901E67A
DECC509910450F8D62E29CD7AE5DBB65CB16260C87C3C0A46D73E769D7BDD3FC
1D4C0C4F88AEB455AA84443A2E21678F84C47055C7D5AA4945219C304C983329
8F08C0D3C730303DA43C719AD640F1C80F7DF004DB4403AF320C129A7030BBDA
DFFF9C28D23027A040A6653054D8DABC7933A08DD9A267487EC03AB63CE59453
20FA70149E6E3D509A1EAB761B8DD839F9E493EFBBEF3E865768A014319F0667
8D8C20DDE32455750B4B78B431508839E9A493AEBFFEFA7DAE57ADD35A8A8E14
D958B09A08ADFF5A5E93C1C1FB8367D02EC0AC6673068B53475737BBD6EAD7F5
4A5BCA97700565991519687F544E1884CAB207A182911C4FDA128AC69E73F62C
7DCCC07F4E519377488235F1841E794AC1575C7105DEC21AA097B0064078C16A
4FD4A240E1749205FC04E10F74702D17A3529EC69E52A30F1B85D892A4619F7E
021636D1AA871AD21731FD9813142A92F52529C650362285A6649C48BE9E96F8
8CF8B1DE5CAD346954DD982155F414B196D95273ED92E754C417A72E49533CDF
F10CB7DE0C2C1393905822E28B5F2C5886340319B0CD21D397BA9DE8E936C621
8107271EF3D1FFBCED2BBB4CB1572EF6770E66A35DC55857A3F86CC2EB89644A
956235969232082988068EBF6B74381D664326FD49E829B144776D720214A689
C9C7A5E94A0CF301EE79CEE141E6F1E4744F3D6A38F658B5B8C44F3A99EE1D85
B1742A6A35CBE59A6B6662D55A33EDC4E9F809DBE5C88A5481500F10156462A4
1EC5F9F91F7FCA678EC6167E480B2F704CCB8E86836DC2BCDF08DDAE212F8F2C
304297409060D1F64AD68E061FFCE0071F7EF861F40C14D26C89B0B7FC258E12
4B5BF562C72107379F1935AC7CB2297B8D9C199D0EEA01A62856B45928753976
B10E9C485D70EB1DD79D748A1573CBB54AEB6862CB3CB182A82941241BABBAC5
583599127B02A8644A3C906A546235A925B391723EEB2F2BBA533D2B4B432399
64D5342215CBB3EAD2A8661A529554B4B354AE9839C3AFD6CC6AB62F97284C0D
D7121D09AB56C6934632E23419E4AA7AD2DD77DF0DB26BD6BCA634DC25B6541B
D624B88E31D3085276C62F152A209B5133DE104CB627021CAE57FA53D19152B7
DD3DD998AE473D0924E2C53C3F9074F380626E5CF245C976487D265B5859B227
BD642131D353E96CC652D3F5B2D80DC3722395BA8363215288193D8D8E697FBA
D92552320E6CBE66B2F962C92E980DB3DEE7CB684F87E535BC99B2E948AC7ACF
B93FF8CCA5EF77C04393F189C64CBA2B5D1CAE1956D4C4396CD63CE3E05861BB
8343E4F478F57120A86BA4D3B144A90AC1B4191812B552D8F9BA0B98FBD9406A
5913728B5173B2D22C61276D096A76421A95FEA4CC94A58EE9594B92A9F1D24C
2521DD157322D12D6E336B940A4DD731CCA82F55C35F12C48625525B55965179
F8A6FFF9EB933EE126765905A7E99B3D7DC9F1A9092306E049BD2091C0C67A41
9E5B701E681D796B14C290143C890631716B5DD2012A5312BF2AA69595467106
00803C72FEF9E75F78E1858C395497EDFE387130AF5AB55A65A1D3B7CEAF1AD4
82D94B2D2862D0C2A0745CDA85187906DEF9CE77BEE10D6FB8F3CE3BC9B195C3
D311077CFACE77BEF3810F7C80821B43A1C142316334C3D84C4D2465A72F345C
1887AE5D0D0B638E9286F1A2313D13941FF7C909C2466D5A48C06CA05732928F
D23A992D7969B86E9D92242534FBF313287094596A29E639744AE3A03010341E
C6B0B3AA256D38321B40A991A061270F87A60849FD80E2A1722FBD9183FDD39A
8CEF5FFEF2978F3BEE38B578A8CF1648C3902779B92F647F08F4BFFE51E22B6D
C104DBCAD4CD573187F99C400BF86804E79CDCB1B0F9D59C571F4943E9E8C865
50B584CCF4AC8B008C3DE288237EFDEB5FA3DBD7BEF6B5BFFBDDEFA42D1E6986
209941335F8F476A13B629AE23DD557342227657AA3E399D92AC99F20B959AE5
37B0B10959564B77958DDF0AF8703D1DB702F1CBD5663A3B5BF7D868F6D66383
D1D2A29EDED8B833E48EF5C456E76B6E4176A5C58C89ED431517AB0AB923263D
F19815ED18AE8F6425579EF19BD25CDC6F0F96A6C5950137E57724471BA3DB3E
BFE9DCBB6E92A961372DDD855CC96964B2715A54683C8420492776CE4C1B0765
DC17A63A9B9D652B594B4CF565AD922FF1C1F48C8CE7CDA2D8012414C7332392
A94A3938242ADBAB96644CCBF49A53D101A94E487F23392E55CFF0259D8B3467
BC6E5F06A5C35F51B0268C66C98E592D21CA08247021EB0804A058225DF18A20
7D20BA8DCEA4044D99313BCD62C14E24FA2A95DD09AFBF628CE0D7080427916E
3337B1B87CF9F11BEEBEE91B4393430D7722BEC4288D06AD71AD72A4D9E345C7
8DCEA5CDD1B8C45F306C2F519032DE0CFC5C671A1CCD6D0411CBC19E1B861BB8
E98811D4B1232EFE5F15A72A752B660D1C21CB9F6CFEB69936EB8DF285EBCEBC
E6B26D582FB852DAAF4E75744AB199F120ACE17C3A09B1AB781944C88FAFBF76
F3B7AEBB737AF7CC9414834C21559082C4318A13F1C1209B3E78A5196D390FAA
5D66A63C60FA7B0B3DD23329113F5E8A49B950F7E2E9A566AC562E8E432CB06A
1231D275FC271D93A9E2A1871EFAECB3CFAA8EB8F04D47F2F232C0ACBF843FE9
D03DEFBCF30C22AE56D025E924695EB366CD934F3EA9F6A270B16C5A09D858AB
BFA9104DC788AA8134E0AA9F9366E5D5AB57EFDDBB976AC46DB7DD76ECB1C786
27ADF6074825F8154B459FF8BE71E3469DB0BA7A649EC758EB88D11205360066
C0480F4DE3D63810B526A9A0BA4F12A99C201C80A4713E3AE29CC00C99D51834
5F49756AEAB37872EEB9E76EDBB68D8C2DDC27C3E3A872517F57EB0DFD3A7ACD
03357D4658D36EA6A000A305A8D1A716772303632897C68D98A14B725EA96CFE
2A68B75696F6DB3731295EBDA27EE6B7A701416B14D3B814F60CEB562AAE86DD
5146FB920C99556B40EB7FF9CB5F32905A0DA1CA5AC2BEDCF5EBD77FF18B5FE4
49C38B60B43820E8B9255A25ACA59DB1A1C14AA724269695641C804E67FC9A99
B4F3F95A20F6DBFFBFB7FDF3D11F3EE7CC2F9CFCA97FFEEADDF707870D14B60F
0F24FB1AC5BA6F59536E5E220D8949AFDB3F9619979219338C9AE54AD33C30F5
E672ED05D0ED4672B2D6D2F8414263ABEAFD7B2BBBCAF8B34364C6E9902EB1EA
33CDC90D175DB8E9B2CDE903EC99B1464F4A26861329C9C4FA4AD0456ACD2031
60559E7B4978A203F68FF185C988D4BD74538C885188055672D10176FCD9B117
242D465CA283D00B3AAC81E1F2B4F4640ECB8FFD01AC45AA4EB29989A7CC097F
7CEDA9673CF2FFFFD72F7EF37B5926B25BFAABBD19893CDB359598F43BE3CB46
1A2F78DDD8369149893725E544673CB761D9625846B5DA93EB2C4C61908EA2B9
C78B37023CEECB65B64FE5B232EA9B95A60F91270166919449F48089E49DB4D7
510F0A8DA46B3703CFF5932B22EE68F475FE5F3E557BA4D052B21CE99D909217
AB98B55E1F627636966C949A600562465A1BDB841C2E3DAE4CA42389B2E7A6A4
E148CF38F021339E9BC140D69EF8E2AEC376947E0D9D2C133DB0967FDE87A61E
11A7691AE2D772401147EA8144DD485E924BB2F5BDE5A4341BDDE2A5C4DF25AF
E9ECFB75AA24C3E5CE48D6ADD79A62D6B19149C30722CD9219C0399D4D0F8103
556CA7D100DC7351ABB2A8093E2E4559E20D344BD022662A69DF28BDA4FE2E5D
BA14F23743FFFDFD5730D4E724C8200820BF90DD2988934E1ABC1592F638D00B
72053C7CC73BDEF1C31FFE50DAB5EB689632DB17D728D9D24AB0D2362C6A3952
1A64692B00ED03C93BEBACB334C5236CF5D6501635866A346EF8F61246B3A96F
677FD6A13962B55A7EC3C6A57BEFBDF77BDFFB1E8E3AF51812719A118C500109
735FB76CD2DC1CCEC0D2EA9574A53235064FC06CAFBDF65AC2443D0A5BB76E7D
E491477EF4A31FEDD9B3472F075516A2DC9BB6667268D2263AF6B55998147244
8DC5661B2D0ACF15D18877E69967624A50DA1E7EF8619C793057B0494D23F2DB
F743309E988672AA11ACB103FE440BB8D5BE428EBE38CDF020A15CB812AD8618
D152CFB80E2DCBFE27720279B9358F30A4B604A8E20B83DF35754B297E980170
DFF527ED13C06730AEB4EDF57CC8486DBC0E38E03BAB36319D0D2B0219FDF8C7
3F0E3C276EB474F68823F9F1C4AC2FA3719115ED8C9427CD81B43D6C14560CF7
4EDF3216B852582ABDA7BE7E2CF2B4D46BD99D3DF95F8ECBB392F093A64417AF
5EB2FDB9274077E49296B1A863E680786474B8A39C76D2C77927DF7FFED609BB
299B9C6439E7948B53B7966E3FEDC79FFDDA916B26DC7C23180241956A2C2325
373EE0AE9A8A3E595F276F08DEB86BE363FED255F69E9171701867D2DEB428BA
7DAAF72703640000886E28165888BB7D13D6E89252EE14A82CA9E7B60C4B2D65
C74A8D462A766E29488A3162D8122FDEEE0D340E1BB67FF3BAF8B2DF15C631EE
6BDEB0F4774F8E25DDBEB2B15B36486A775FE907A391A14C446AEE79E9682A70
6B15C9D40E9E7C63636F7DF0E73BBCC18ACD1D114B8C683951C995531989EFEA
1DEFF878DFCCDDA38E97EAFA6434B624B7C31897CEDC929DE6DE3B5E10CF929A
6D899993BAB964E5C4DEE79CB494EB0EC695D450F9E4A6D99DEDFFEFFEC9FFD9
EE4C48212ECEF1E26533CD44A1FFA9E523FFF122C86BDCB3A3E964BE9C0702B5
D4925B25BE1BBCAC658EB1D356A3B6B8EBBEC9C95D2589755AA74D277AC51FB4
3B533D7BBE54E9292C1B8F3E6EBB56031C2A11E4BB9BDE07B28D4E438C19C9CE
5AB82662A95B539DD3B13D4BF75A1F88663B0F998C8E267735CA3F9B963DADFD
B5CD78DECF4BB489A125692C6F74BD189D904FCBE24876F08E821453B144D137
CCCE4F2C99EE9F854BBD5AB9633C3A9973ECA411CFE3ECE000FEF55FFFF5430F
3D047E0062B2406C1209AC962BA61C130E313024E40C7969EF0B0588EDCC77E5
F967D6DF2B951659F486EE97A09D77864308BAC38230CC2A7AF7BBDFFDC4134F
300E8C33A3B986BE04AAA8E41C1A1BCE1C1999AD1DC4E872A80BB7DC728B84BC
6DE4490C8F0B57C453283089038C91975DD04F452212CC56FCE05BFC69CED5A0
18EE9E7BEE21D0B5FA42F86A21752A86D37AF5215DA64A2BFDD03D0461CAAE8A
91D6F835DBD7D1842559EA108CDFD592DA7A3F0617C54C6C7C487049B6A86DC8
AC78CB7803BA0AC3691CE12AE5122A03CE00470D0CC3D0EC8181C8DC445D4E98
6AD3A7A2AE05CE96D178AF542750B22EA1C482700C06F39FFD79F5F8E839D054
B2FD71027979A299067186432F7870A07B811FA8BCA22A608BA7C6D3B5F2CC5F
BCE64D8F3CF9A85CDA1BAF46AA5F1E060112EF20A739BAB4BFF97CAC22EF8654
D92FF70FF694D64C5FF7BCF38455F97ED5DE1BEDEAEC1F2D8FFB8D7AAE33979E
2936FD5E5722E39DBB126BC52CF6946E1EEF5ADD3FF9DE99BE20327E7FD93F01
4B5ED47D51A19CC8576BE672BFCB3830D8353C6694CDD71EF8F6C707FF7BD1F1
2B677AF3956BA6E25E975B9DEC5E911CF5CB2B8E5AB12BB54BE23139AFA65759
85D341B2F1AEE960BCFB8CFE89DA887C53A46558B63B631DC1E76AA5CEA2F525
698C8977A5634C44E3DBFC4AA4BCA2D6BF2B3202E5A3B7B97C626F3D9F1C5AFE
E955F9BE42FC8A48B338DA94C8B453974B6549A967EFB6F1545D4A19F407F525
6E058E2FAEEF5662A08A004F7279B1FCA29716E72CA903A16E4A5AC391CCA5F5
A972FD24EF1D777CEDBF3B8EEEEF49F73F77EDEF5EDF58F1DB8E89659389D1E4
581D4C246FC6A5B7121FE93A7A917188E99D37BD78F91B9E1CFB458BD49D17B1
7391F8B9AED1B93C73B2B5E7AB2FC85E711A56B6B373AC308E06A948B2591F58
2CC61E998ABEBD226F4A960AA6FC684CCAB2EC0B8B775706E5869689A6B92962
E693C6964A7C99592ABA52347B9A96274625B6D8A93929294F3AF9DAD9E5C54E
EFE0D5439DAB96953F30DEA8F9C177FD96D7F04289FF215AFD46DD2ED98E952A
7945315A1C2869A74BD6CC92F3564C44A66B37E60582AE9D88D4BCCC66A339E3
176F74635559F6E1D80BCFD79C1D894AC38DF82F098BCC4322B908972A99CF09
683555679EDE2A7FDF7DF79D78E2892F79CFC241F71AA1C11829A63C40200DC7
78FD291F2D4DA32608B35DAF9817390D0E0EB25A0EDD127C8BF457830EC3B7A4
E22DCD2367E02305F333CE3803DC2531FBA1159E9788CACBD31495FB6955262A
C214F4980148C224ED68F139CE64D5060E3FFCF0DFFFFEF76186C71803A35D28
86FE648AE461731656E1CF56BAD6DA0C5EE896C770EC20ADCC582366B86EDDBA
071F7C70FBF6ED3477CCE104B41A318180EE4A26876BBAC6EAD5ABB1EB5080D0
FF91471E096588C9FD0032FAC1B6EA25B71ADCA238B072E54A401233BFFBEEBB
BFF4A52FFDE637BF61215F66EA3326123B059184656D289B283D0DFB4BF82746
0C5F1A4515849FFD89330B73823959056A1BD48C3609E5F7D2FE49249CEF1F0A
5B87007CAC912167E4D6733C37D859F048F4FCE28B2F6A215596DF8078C1EB56
5AD18AA6186939FDC8B3BEF5B5DB46CFE95AD5C8ECFCEA508FA487AABB5B0681
66CB3692EC4E342A95AC6315C69AF56B243D122F7EA51A9D8A0411CB8B067EB9
999044C52CC9ACCDA7EF73D97AC2FDDBA17FFCC99D3F338EA94E2F2F74DE6AE5
F7F419CB07E553D2E8EE34AF9E5E3ED4B113F435318EF6CED0619DB243B63546
A4E99C290372D0EEEE3D816D3823D5DA06C9B9C6F468101C184D6E6AA1FDFCF4
DDE566FFE8590DBB2752B9A6D431D1EBDBA389B4353405E1D81ACD8EC4F2B15A
AC2C5BC5A9C4BC736A86A4FD78CE335E94A81C16FB5069E4A1174F9F91D788F3
3950732BD28C74F5AD1A8B3C2567D8FD93FD23370E1BB5E4AA2302BB9C1A7ABE
98F702893620F78A2731683F8DC5236F1C8CFC83E9593ECE6E738344EA8EB7D1
9578562E9C31E3B61F6F648F4DE7C5956BEBFD1E38540FD69B3AACA7F1682FD6
5BDA5C2D61EDA78A1F9106F89CEF66EA7EE13C1C5719582FC331B137C483479A
C95F471B7B5D0CE9614857527626D1E597871A75AB9E3B3E6176C746BE3E95D8
ED245BBEFBEEF1C4708FD75FEC1AA99D299D999CB9AE962F984D33C08FDD117F
C2A80AB85A79D62EF7291988C971071E7FE771DF0FA47F5C9ECFD8E5CE46AB97
3DD7CBB2F2A2DDDB8622E0A0408E886F476211D74C88E15FD831E38DCB756EB7
BB32929C2A55F315BF2FB8705A3C43BE5C074805F37F4EE4EE6CBAD255941D1A
BA46DAB270B537A5305A04FE7DEF7B1F94090619B682DAC3A17238A2575D7515
F803B3FEB46CD3FFD317B1C0D8D216CFF5C4325B325C588607297CA9024F1DD8
1D7ED2D263E79C73CEB5D75E8BD96EDEBCF9FCF3CFF7DA775E92EE53A834DB97
5D906180BDA107B007DE35C898C870A2B6DE03AC9448B30418FA829E19F7C29C
00DA6AC27E729D3663DD94E5AA9B5EAF11C693134E38E12B5FF90A3B619006B5
0D350DA91CAD99076057581AD3468C7649D4B0CD8A1F901E66C0133358C94E9D
ED0CA394D92A6C2323231AA9C6F43DE5F16C4F3287E5A0138C7BF1C5176FD9B2
85FD00DA0C4F24AD643566E6FEE05D167258B366CDD34F3F1D5E4BB8C20FBE33
9991AA0065F370DCE7ABF884F901FBA4B4A1F63D691BF7683133DAF7F486E726
2FF718CF8FDEA3304106C35B7A68AC3BE8A08340FA3FF6B18F7DED6B5F937619
225D4BC619281823CBFB578DEC7EBE7E798B12C9508B58F46F5F52FAC5D4E2D1
25D3C55A41BC9AE43B1335A3D29CBAC258337DC8D35B9F591CEF1F2C8E5C70D5
FAFFF8E6F79E79F49954EA50B33E34161D4D6EE82B8F4DF45EEB34824AE54B52
2FCAF2F5998A0CD4E3DB9DF3653C2EC605B238911B4FD8F5C268DFA295ABE36F
7DACF640E9F37E8BC25E62D580686E23C8CA9A697976D30AEF865DFDE71F3E31
F5C499D5B3EFBAEB2E9C38C8891A6F8AE373E2D613B7ECBC510A55790033CF44
A5D18A224AC49B56D52FC497C821439D3B329FF52183A04174A2C375AA7667BD
3161F6C911A3B1DFCA8696DD21774566CA2E08C46EAF2BB02765BD58BE34FD96
2294F9B913D925138FD62362BB7127709AE2D6A4D6B2FB1FB261D9B37B4683AC
23CD8271A338A5546D4B293D6A2CBB66912DB11DF242F292E8F0B2A89C5C3AA0
33B5A3D814BB267E3C5E5E74F15DFFBC7E7A93A4C43933D2B062D112B48D664E
AAFEE5C93199597DF1C098744C5DF3F492B12553F78C4587A325A91CF817073F
F3BB67224DDB8A79752FD3B2F09C9F312C3FD854926657261A91DC8C143AA594
2CD8BBB267C54B8DB27797A40B7DD520EF899F887A65C0D790645DCAD06836A5
92CF3A95FF33138C452586936FF764A5385338E9D833BED47343F29944E57B15
A768D78C06E87BC430ED9A5DCBD5E58C44C2082A5BAB66A92BDE04FA155A70DE
508D4F4BF3CA162A055F840863F89717D30D6FBA6D50D5C2100B5F1369B46BB1
A88715C7107BAD95230C25012CF61496AD98326ACCD6EB7815BEC4F94AB78E85
D9B05E26044926C8D15C406396D1BE61584BAB6B72FF4B5EB8593264CED6C166
9F9A378B55312896CE74D02CADE04F6F2A0D291499157C545F3432D56C57F73E
E080032089ABA0142EBF31A7F83BE8359A311B9653D23B81A955AC5AB58A154B
C036C2C9EB1AC518A6EFD24E3E60343D88CED0D0906A73FBF35E680125BA7334
948896347A83FC97970BA5018A36258D3B26A0B466329F73E6AA21C5663F78B2
6DDBB68B2EBA88E61DA6B6AE5FBFFE861B6ED04BE7C37A215FC4421E7BEC3165
D85C0BEBE7BC22EAAF16A17D52701594F4F210AD23A2161E33740590CC8B4462
3138722C1A4883D0159264BDE1EAEBD49B39105378D0B82B0826400BDCCCB26C
62F7A79BF2CD89CC20C84526D836EC62331F14198BE4E28929A3983969596151
A56BCC9ABC63A4A7D2E356EB65ABD4B467330CAA563DDDCC1525D22DE32740E8
30E21B6DB36C95AFA948C38A5E107332CDA253CB9ED0ED343A0BD7156AF1D15C
556A9D0389E972C92ED4CECE4A229F9BB0A6BA16479BE3B91BEB238DCCCA7202
F24BB563B0F6058934A5E7CBFD4C3AC1E48F3FFEF83BEFBCF32505717D6D69A1
672C3D5E07F71ACB4C5C1B89FB76D11A332A0276629D9769BA85D53B7A9EFD77
28EB6214EC4E6954B27D8B0AF66ED91BDDB4B4620C0F4C39C376FA903163FBBF
0FCB5457266EA6FED919BA776F9F7FD074ADE4DE508C3F69B8DF2BC6064148AD
9A04B6659B4DAFBCB9D13FD63172EB4CCF494BC70F1F93CF9B07340FDEB1E9F7
60A29DA72D9906733F7050FE3188C425737976DA8E2C97C28B4DBB3BB0BD4CA1
7CCE806B8E748D5B93995ECB2B366F2C4810499512CEB9D5C9DE66F72D203E65
B95C168D2D1ABA66A8CBCD1683F251A71E7DFF3DDF9082D12DF5D1DC9268716F
FDE29677267749CBDA1FAD9580550144FE2F389274FF62D78A5FDFB5533AA2D1
092BEA5570BA7C4302D07437B33288ED34C6BCCB178B3F2E5F74FB5CA36248CA
EB194E8C39E765EB12C955EDA9AF8C3AA34E4C9C46C2AD04B5D9E871ABBE3958
3A9D1B8A8F7B8B24F3AC55BA29E93423D5D8946CE81677C2D92889864C9F2BD1
F822F7CA31B19A96FBD2790F676B2F108047C332D34D485568F4D6EA432F8951
540BE80AA3C873FFFDF77FE4231F51AFEF0295B5173EAB733C7554CCF5DE8670
197A09DD394E727FCB2DB7AC5BB78E055B284D736EB7DE7AEBC9279F4CD2C6EC
4D0D0FC5FC81C777DF7D373B01153BFBECB381D6BC8A400D205A44C56CDF4E25
ED240B9522F12F74028AD2242B8CE624D90D5F110712F0FAD7BFFE273FF989C6
AA635C66485217A3C24146C2982535259B2FBF914339010B45003E1FFAD08730
7F106268733FF8C10FB0E4A05D2E4642360D5A2768F4A0BD88530DDA55DED4C1
CBFA362ADD6B967FF81A230D6905D3A2FE88B5B36A021447BCA599EE5A321353
026269F9E8F95A8B4A034C32503D200C7C7EB437BD458722AA96B9659A6858D5
982376FC3F31533F4CC0868A79C1051768D5AC85B13D08959267F10C6336A7CC
6C575D550DAF550C555A265F71AC56A60658328E7D4CEAAEF49C981EEF8FCAF5
93CBA6D2BB53450894514B8CB312F55465D970DFEE6DA39D7ECA4AC6C6DD0910
C848D33133D9F8CC58E17A74974E6C2A42DE85105ADE64483A1E3DD3B7536E39
EEDA9F482CCA1C38BA79149C00345E3A66205C476AE26D028E46129FEF88C964
7963A61E29242ECC785288189611A4CA17CC38914E77F34B816A2A21BDE4D65A
2BD22DB1ABA43E6D053738326127374262AFB5A230937E2BF8F53D03BB0F1C8E
79C9DA4DE5F8945441AA979465A4E104523F4FA4479267774765627A8BF4967A
C7AE194B976D484F12A977F8627AD23C5F6A899C7BC55477B56F2239DA6230B6
C855D9D84CA1B63540773DE7CAB823727D579799324E7A71222BB90B964E4148
CFEE8A9E2C89B4155DD73196B4B3123DF1F27F2EEC18F9DE03FF3E74F224548A
C4055D71AC77AB447FDB57F8667E75AAEB99EAA05C6049A6B9F20F8B762E1B8A
3D9BA87DD7CD4CA52B52F462CD0008D88883134C983DB27EB215C773B174BAFD
D3B191642D598E5425DDD2AB0EFAF88AE70EDC2563225F91D8B4D4622D085BA9
6C502AF749624FAC209FCDC8D2829C9B71E2AE55AF457DC8FD8951BB228BC43C
CEF1EDFA01F9C5BBAE1F3CFE5DC7DEF3C3FB9D45C9E2F88C0145EB7CC8624DB9
4C1241BA7279552AD9D4868A2FD54A141A464C8CDA4025331E98CDC28CDC29FD
F925A3C6E02BA2C6EA31D6608D3915EE0CB590E81D43D20EF4A41D194FA808BF
529D205CE1C8685F434A071DE3964013D59BCA0F1E02FF78891DFE541D85F543
3055D61D94D9E01356A760AD957025063C616632893E391E4368345153939BB4
C8A884FC8D9A01A70E525E39A9F3D4E47EAA05186EC58A15CF3DF7DC9C28AE70
A895D693D1E46FE549732CE912BA5F349CAAAA226A10AA1BA3148D4C458B926A
BD20268AF3276A005A20411D395A77259CB1A985A4B4EA51382E8B69C0F45868
8A3876EDF2CB2F3FF1C413B1B36117FDFC0C700A040C7D631B7A9B75B132EB86
3DF6D863D7AC59837FD133B6181AA4EAC2C1BEEE7CFE135134CC096496E932B7
91C14B1AD1B4CF77A942A90B446FD8A6B4C475BD2C10391258D144506F44BC46
B46529B1800B715954DAFA87CAD46AB9F7A9FE1919290C64BC6AA7CC8C4A7F6D
CB48CFF4A2F1DB869293A050B500A2A02703B1BEA9A6A4CB85FCA668D3F7822D
A558D14A27A3E39755A42E875FB8745C3293C61FA2EBA4D4235D574A755CBA23
DD7BFC890E33E27B9677B1550A5CD9B4D832C69A6B2B9294D8C6542D28618919
A7ABBC69B2598E24AF8AB1501DB397B552BD75A1670511F3925A5CECC1F58D96
77F7F288449D6E3737618C24BD442D510E3E17EB4AA4C7B78EB4A65ACF8E18F9
78202DB3C865CE4C2C62AFEB6ACAEEE0E2FACAA9153BBFB22BEEA593B5E64C22
685A31A92565FDA093ECAA6F981CA8F48C75E5AD193F6E45F3474BA2BBE2A456
49355FEF98283B929E5CB1D2CA3C298F676BF64157AE9C96C28C35D2384B66BA
C4DE2CB122868B5B7DA637DD68B846724B6EA8342D97F59B32E29F956C85855E
5B4C4FC6EBA96CAA54AC3AE5EA6592A9A70AFF5E92DF89D38CFB46BDE1F89DD9
2E77CA2F47DD68B96C5FE294FB0239D3ED6F264712E56825DE69F78EFA8358AF
D1E5978EF196F70EBCB87947CBD353EB4907E3C52E7C919E725FC329A7CFEDDD
D3BB237A7E8F5B9B14D36FE501F8768FB3C8AFBB3529E7B715123BB295DBF37D
E6C0587922B05BDE83A867C53647FCBA17DDD8049C87AFC243C7DE647B11ABD9
98E9AFE646E25389B5BDD5E258F0EF22A346BA142D19AFC0A9266DD59919483C
2C94628D70DDA170DA1185598691F080E9E17CA59CC098975DA5A9E4747943DA
658130D61EC117AD8961B52FA9074D619541622726892F604B2CAC419B925AB7
A9FEA8B6AE7783B0EE394DD29AEF1ACE320FBB37FDD0FD27D2CE7EA2D0ADE21E
C941F8FE1969FB0934238F76210AEF5A7666CB962DE79E7B2EDB6B9D99394593
9413840B3918ED4C7469DBAF94D1AABF845E104E8F51F09A2448515DC558CD9B
3DEAA8A3EEBBEF3E6EBD86D872CE1A85A5623E0D4D0AB1A05D47F6B4D34EBBF1
C61B35E0153BBB7BF76E4610A98CACF8A3B77AA92EC87493F085742C60475BFC
F0F0B05AE4A1EA6DD8B0014066718239F7EEFEE9283A4727E05A4E39E5148082
49610B7BDE18A6A555DBDEF6B6B7FDFCE73FA79A4BE6AD26AFD6DA938154A4DF
E82D795E09D4029266BDE514954D628D8AF3F554FF78FF0E19918E202855241A
C836DB7A32D5FCCAB45174A0FBF5ADE819DD399C10AB11CF346253725A2457E8
CC3F58F5769617A593431798522ACAD562B98B83A5831DA7CB2464D5DBA5B760
4F99B166A4685A66AC11AD9C51937E915B5B9188F153326EB590DC9A2B16A682
56DAB921EB5BA2B773ADA3778169C8406B833634C4EC908DE54C2A5D583F6542
ABB9482CA33FEED78AC919299B92F165B3610C1A892D7ECC1B285A15D7C863DC
5490287CA6242B05D36B05FB9F29AB9FEB7BF6CBC5147430299563C5294FBA1B
89892D9568B3C3DD38D35D8D4FC4AA462D99137BB26FA6E55D1DB740A73BCEE8
ABDA56FDAAC1651DD9D2E7974C2577CB959E942BF125627D34598C78E92F07C9
C9FA183414BBDC22BB5032D7FB6EAFC895B3A19C6767A55CEABFD38BBC98F30F
5996DEBE774626C6B6752EF97D72EF77F7CA2464F05890F2EA4663CD8A43C777
4C8FD5A7C0CD929F8E96F726E4DE72BAE9953312293931DF29A6668C7224487B
729E7445BB8BE74DA465A01A8D79EECE3A04D766DCAAFACDFE7AD7897D93D3A3
729B64024906BD537EB36E365B49219E9F753AF2374CD97F4837BE3125237634
11F322ADE490841B9D5E5F969E457269114B93CB3D4C4CAE1123E889C978B72C
DD2323FD1774B95E636AEBB4D3E8A9778C1BF957968619A6C62AFD3386F0A506
5A70E3924B2E8140C772CA5A5C45A3775E8575688EC54AE9977A8CFF886D6DEE
C4104FB21F8CCB6BB334AC93A4137F628674D2B24C9516949659EDE1ECB3CFBE
F2CA2B59F59A7634CAC57A1D2B17CF2FE18B0CB5128BB4EF6960869D86D8F26C
D334AC8611ABFDD132035A0754DA11FA1A864876A2366B866CF13258ADE5C2CA
59AFC22B63EEEB7687F07D8AD28E5632DA19B3BA5EADE7A178337F1F0967A39D
7FCBD83509153A27CFE37D6D645D44388D4A649C222969305B044913FDC8C0D4
BAA58926BA53BC18807924BC2522CC09BCD0EDBEAF8813508A8712FCC637BEF1
C1071F945052C53EDFD5E44CDD564DA4E0437A14D403D1EDF7D9D29CB0C6EBDD
123BB62FD1199BBAFD459990CECFE4A697F7CAE61D9949B770AE74340DF3FA60
0AA2E567ADEC4867FE7BE332DABA47EAD8933EFDECEF9FFCC3AF1E2F4A2D7681
555BDC94756215BB9AD1C9AC2BF94CCABE14BACCE4E4D7EA7222766871C7A505
2F532F35ECC02C8B159592DFEDF54CF40E77BF67B1759F53901DE92B168F6E1F
34BF118356556FD42521F659A69D8955CEADE8753D3CA1ACE2693972F0314B9E
FA3F7BA529E6F9B2DCED1ADC38E9D9DDDE25134EB32B7175A451CBD76EB49BCF
970EFE41EFF8D3C9E9D44E89C66DCF595AECDBD1B77DF9070FCEDF518A25A647
D6554D39D8BF6AF6BE8D7392E235ADABEBD96662F2BA7A6247AE72F3789F1F1D
755CA9A7BAC49C8C14AC40E2FE8A627721F7D96ABE5AF5B74A879D9DFE5CCD1C
F0FD2F36C05A62FFD491757253F7EFE89F48ED591297CAA45849BB1EE9CAA747
7AF62CFAC0CAE0AB663E78A172BE64CB3DF9FF184F0E4A50CD55BACB7D27E646
D345E3C66A30EE453D478CA66BB4A27816F70E4C0CCEA4C59EB8A4D419CBB997
CD548268E054C04F21D8071BC5F1BA925B2CB73A53BAB22EE3D2779F531DEAAB
4727EB41396AF7642AF1626277FD14492D5B92BEB65998B66AC5B2674FCB0AE9
3EB2539A8D89074AE0628D2B3ABCDFD5BD1F57ED32D43BB113969BAF38623A9D
7EE63D99BD3F2A40EB8AAEB532A3A67F9B3955894AA42E9D75F9BC881B49DEE2
49BEAB9CB3ACA951EF555968F87DE9D2A5434343386894145F3A14E1747CB37D
7385925D4DEFD23B5DF747F1C3F95F8C54E1BB7A45140D148CAFA790AE2116CA
03CCF6A5CF3C6F6A6C0D5B2A80A3AF7FFDEB1F79E4115A093EF7B9CF4120255D
E69C9900415EC268D4B0BF170C6FE3C68D6042BC0099927B38C936ECDB0817E8
A76C4B13BCCC4640697E805ACF40AD34FA1EC4056B99C3F0B4942618557F7F3F
AF87D4C2C51AEAB3408DC357CA09A47D7D92D25CBDC6406D5F9A25AEE5C6E673
82F075EDE17195B3D2B3AA090DE1A84D1AA0796F947250AE7A0ED9D51445DAF1
40F1F51E128E82BDBBFDF6DBF7EEDD3B4727083B4E5E1127A06609EC55C7C3C2
752FC8ED342E0BDB0DD51653D26CF3399CC0CFF932252BFC6C49CA13D9A6F377
A960C0EB5B949D1E1D916D62363A0A4649524DE768BBFE9A20F9DB74AF11DBF9
C3612809B958AA546BF851A359AB9962DA86DFB9B163B43413B95272C1B2725F
3D353A9A97819A3D2C5B73D1413327FEC80D538BCBEF18CC3E32906F945AFA7E
0A9D2703A7BCB86E7C36961DEA2F770C39CFC74BCFE5E5713B6B274B8DB299B1
12FF68473AACE99BA679651B03ED0A85024FD396AF5EBDFED1DB3C237A4067CF
8EB127FD6F4E6527250F6AD5B01BE71A81E3661BD298C836EEF30EAC0E3C9D7A
6E85D1552A0713C1542CB06A034DE78C8CF76434F7DAC898331EB9D4CFE513CD
4CB66A0C0727A4EB472C5AFAABE29EF2983C62249E69003BA75B258792B14AD9
4898D5A89F99718AB17AB01EB865755DD2ECCF75FCE1423BFD8C5B3C3023B178
FAD129F98F8962D1890629BF52CB885B17AB6C54B34632BFA82C273A99C1BE60
D18C15294C5F214E75C5C1CB7A9E1879D4BC38ED438BBA0E32BA1DB39C46D3B5
1366B95E03B040EF4DDFCE49666CC354726F3271A7350ECE94AA44271DD7AC27
FC78ED3CDF8FD63BC0118B7D53374F1E122CDF9E7AC176630DA96593CBCC69AF
981A74D63BE517FDDC6DE9A9D854A266B53CF552A8AC10E31F23CEE28EDA78B5
6FD01E7D2C2F3B241E446AC0598C0A8CF502C948EF997F510530C7A66AE6847C
BF901D02A7773A0BF6F4DA8AD9E7FBD788943BA275AFB3519CEA8835F3AF983E
9040016F419F77EDDA45F2FE47E14FE33734C9369C3ACBE3BAF09D0C24F71A09
CAFAA3AC32ADA676994D08E005AA5A2041DDB61AFF47698B4574D571C789856F
8ED44BAB41DCDFFAD6B7FEF4A73FA56DC468DFB5A2644EDA5E4DC6C390B8E04F
2688EA8DCD0C1F22C5A41C0D3A8E21F4A640320CADC74B1A34A71637892FF498
A79E7A4A13CAD4B6AEEE018DD496F6556568C0B29D8018AD3AAFA2084FB0FF5B
A05917576B109181911FE03BF339C2F9C9FBE40466E8122B7608028D3F19C746
919F25F23916334534813C5CCDFF90430EC15B80006F2F083BEAB53E07F75D0B
07913D907FAB7B768E75E8D57102BDB38851D5E0E80B97BE607A0DBFD302C669
10A5E75B874C3BD511756AE5A972C4972E818C13EC0992D2514E8D8BD391CC5B
5E30511B10A948764A7AEC439E8F6E97BAE46CB352F51B80443221A6E7076EC6
4D4C9A2D1F5E24103B22B54A2E2A536E4E7ACB4BC69A7B21480EBC79E931EF39
E6CE4B6EE8E83276E44BF1A4D100D94D400CEEA848B5D6892F07B9B1E9526A42
4A92A8A422CD483DA8795011FB9AD29044F125AD51BD1DDCB5A5E2EC49D65BE6
1D30AC94041358756A7A71D9D86D80024BC98AFBB9AA39D69149554ABE9BAC08
54914612E30E54FAEA963BD539658DF7E6061C6378A62CF18E567D8591F154D0
324B5767AD374B445E484147708D6A039B6CD9526FC556AEAA75BD60031BF32D
4B1A46AF9AC089664C7A6B1092BDBC29B101A98D48DA6B25A65506B2B162A93E
1DF352F5CE52A6B5DE5435535D5990E1783C6DB9E3453F79F467CFFFD9DDD717
228D166F9C2C46BDACED98F95A3ED399A6485AADB6EEADAA7BB6F4955A61437B
336294224610B77B2AE698D1B0BC58532AADF5DA5DA5C2642595E828D93376B1
DFF64620D543BC9772C558D4CA175EDAB16ACFCE19E801D998E41B2D31BF950D
00C8D492665FD99D14A729512312441325B79AEA4C556BC545156B0F647F5FE2
5149C7E3E5DD55D38C15BB6A329E8AF63A6E69A655B1D200B3926CDCA81783FA
2BD7097846C289F12FE30446FB9A08BD23E2EAABAFBEE28A2BDEFEF6B75359E6
E90DEB11F3691093FBC3174EF120F1D8D0F7A07AB4D9BEA490A447FD8A0CBC0B
E737D052A4F79C842FCB9576740DABDBB3AC3193B9C02778433AC90A441BB404
9683EECBEC3D159C3628EFC73EF6B1BBEFBE9BE5E6799D24278F79FED33FFDD3
030F3C406244A339AD196A16A0D19C323EEF9CE115EA7AEF02D51796C3D44C05
9ABFA59D1987EF7A4DB17EC219D17F3E27D0BB90E8402654D7AE5DBB61C3064E
8CB7AF307744932AE673024DC7A3CF46DAB55A83769D74DACDF1102BFAE4273F
898777DD75D79E3D7B78FF381927A354A51DC5AFFA282F95E5256E9A5FC65B9A
09765E63A731428C9252758DB8F4A773D039D621C081F1BE7A3947F8C289F970
D6146BEA944C25A37AB14F8FB1B4C4BEAC2D71DFAB45A56943FC12633A82E548
47B3C3961E3732DC30ED5A23E1598371DB71ABF558C4A87B41C44ABA7E331057
8C201BEFF24B154B56E4B34F0725491B871462DBA529E996613D3B231381C4EB
46A1910E4C501E2756356B52CD49FF14D48BAE646CD2AA8194B7DCD5ADCEAC56
DCA867B6A21F2D23681A81E1DBD64BC931D495B5B079C30824E1B7E8D6A49748
76B88572441A951894918303191C97B867D52241299E90523193906A25ED4B39
27E971D0F098405A96FE6CF71BDE7EE8CFBEFB54C5F1A4E28A6B77E6FA538D7A
A53C38197141229DD28015A996933366CD497846D9AF0566A2C3B0668C427436
BE088F3B339958A930117163D6D26A6DA7D4725E6406D34EA7E255B71AA9D8F5
68C3F0FB821585C8CE5A326216E25EC28856AAAE935EEA4CECF1A4A76FD5A13B
773C94080083DCA27874AF572EBA4530A4A81D0BDCC0173F12355CCF954826E6
16C0829A99A454CAD1A6ED89E545AA7DDE81860C4F4AB21129DB66B9E949E0CF
AED7B00EE9486E2F4E485F2A3AD8888959CDC83F1CF577DFBEEBDB11AF050147
3A1CE99A964A4D0AF1E5B1EA8B934B077A4787C74CD38A4493E55AC5B0835685
BD8E5CD0989646900621AD5991867FF8C1073FBAF72930800EEBA064C3AFC8B8
B72651D833962EF945470CF795D1079AA6E75CFAA2D5E6FFC80948DAA42DE068
6E54F87EBE85750269DF57C37B9AF0842495C581E912048DFBF0873F0C02C124
292DF2A39C803778A8CC152EE1A085F829C7714A6A4E51D347F8CA6C264340D0
66E2EBA9A79EFAAD6F7D0B3C898E628C029A050620ED0AA674CF927A0E0C0CEC
D8B143AD25EAAB90B623DA9FBDBB8A0497448D26B5B3CF3E7BF3E6CDCB962D7B
EEB9E7C82369D7C2015396003860DACA59211A3337824219F95FF8DAB53F8713
D01017CC960A0FD7DB59B76EDD1D77DCC1634FF28D798283CE97ACC34F94CE82
8F32305742B7DFE8CD77F2F2EC6E75CCBEE52D6F79F4D147AFBFFEFAD34F3F1D
AB864266844A3CB17396C5657499721DCAD704A35E3EA1D45FD765ECFFB6BFFD
71025EEE489588B5D38D765EE1FEDE25D2AA9F89A9E3131313FB8C2235A266E0
A3AB00FF491A52F7C44DB664E158C989808876943D48FE652B80FCE004860B9A
9092565808FE1789DA49D7ADE3253B2A2FB147BF4F8CD15C43BCE4E179797C45
B9EB456332C865E38DBC57C8A541F11B43E2E492453F223351E999488DC7A001
482A9F7163A581B25F5CD19D9A9C982AC64BE04FAD429EAE24BD6457B26B7779
3750E59C73CEB9F2CA2B95D5B5B6C37503C925C4AA486DC669B43210EA2070A9
914CA965F76A9577882DF14B531097535D5D9572CDAF759B2B5E7476A5AA565A
B2C3F664BCB1B46771D7EEE1E7BA6235B7E9617F9C660C6CC283702F552B9094
BF72C61892441D343605A1D7F1F2F5CE162FA939FD46D66C8C0D0197BDE599A0
D88C4E79AE59EFF423D565E966A9DA9CB2BB064AE5E15CED1057B677CAB23DF1
DDB156AA6FC7983593310E283466A06AF5E493E3112824D259710AD881BEA80C
A79D781142472C15F32BA6CC06D3F72CE91A1CDB9D71538D6C67901F4E48730A
BA88918B55AA4612475DB20DC9078EF876AF5BC2412DD9A95CB33195AB9FFCFE
931EF8F60F8BB5B16450AB3A29D730BB5A44C999328A4157CBBE2F85744A92A6
3D5DF42BDDDDAB3EFC91BFFFDA57EF00072A16AAF158BC569BC1FEA65CA882E9
4E490651633098723A63C7BEEDDD3FFECECF77754F381312E42CB7DA4C572DDF
8895639027FC46ED15DB0C28EA6921CE3937E7189A31AB219E5A8945235516BE
774D2D063C454A2C9440600638FC20C494DC49AFA5EDE50B07D4EB8D4EB432A9
F157423735EAE57C7A5709D90CAD9CA0A7175E78E1962D5B8E38E288471E7904
0D582B1BEDFBFBFB49F7C1A818B0C8840370148DB161BA108926E7A3890E5ABF
89166A46E6CA6C793E5E104106AB1627757B2AD0F542665A60412B6FBAE9A633
CE38834E02095D02BC40ECCA2BE5042AC3722B3107F0AA9B6FBE1930E1DAF59E
06164BD09BF3E67002095DF48895AE5EBD7A646484323E130F5599C3BB071D74
105AD257A42923F895F2041D42C66CC6228D780B689CF4181186BA0BD039BEF9
CD6F4ADB12481CE34F32EB10D35BD57811C5ABC890FF333F3A9C1D4F64DDA0D0
28670F5B3EFAFC8BB159EB6ECD6991FA5E898D456A128F2D2A368B6216E31123
DE199487C02732996C613C1F8F3A5ECDC70640864F493D58BE667C70346D15A4
86F67149C4A431DD1524F3CD7AB3159E6AB5444BC8342D838655703BC49CB1DC
46CAE89E092A122D4843D0D837CBD37D8E8CD43B5B314DD2D1AA289AD91583A8
5E8D444D0F5C2B689DB572BE022D013A43D248E48382DD69BBD3F5B8677E71C3
951BAFBF72BA3AD5E5CA940C003362D6305493A6996D3AF8ABD0AAE21C894B90
B9E2F22F5E76D1A9B548CD8E8951C2727BD231B718292EF616156AE3C5FE4662
C40730BC54445C2FE3DB915656AD808C962DBF55B91F6A8A1BF35DCF8B36A219
DB9FB0E3925EBA68D9B3A3BB9A563E9B05BCDC62151A561C1AD08D1BAF387BED
29AD1B362239C36D6662B592990793EB4958E385CE94532F59A5CE724753CAC5
64BD4F64B20C68D98D66C39FBD5B24C05E194D538206CE4BABB27442A219A94F
A7833AB4E8295002AB335B9EAEC9F2BAD42C19ED48C84425292634B27A67C39A
AEDB582FF648FCB1A6DD4CA4C49B1637BAC4F1A66AB15AAA9C8C48339FACB682
825B72B3530777379D78220168572AF956286A4B54E888E58C5A61DA69CA8A03
96BFFBA347DF7CDDF569D389D833335579E7FB3FF08B9F3DE4554B60CE3D9D3D
E3D385BAD4B54C80161D7A15FE4556956E616C386844357728E6AC9EAF95D716
38484A29D47C7FCD35D7AC5DBB560BBD312C955C4123882494C915B40B38F315
0A7DE1E2F212E2043CD8E19874721769935ABD309DF229E9205FC74F14E4F19C
0E74DE4A8A2F0C72A5F91B8489F662BE4BF2C7495201A232A1F5FC980301A08D
8D8DA119968C66F8AEF7896BA6AB8462EA59884D66ED6F98EAA64D9B20296BF2
54387DE14FF9EC8F13BCF6B5AF7DFCF1C701348CC28B29687DD2AB8F7993B8F1
F21B7EF6E927A0FCAED7A2B17E6D3870C89CBDCD0DBD71EFB88AF0ED48AA1531
32158D8DD9ACC005104C539A1928CC20312CEA89279E90B62E28B3EA20B32019
7440F514FFBE64E278E5B1587FE647874BFAD28A3D8900B76D29B7881D786610
B10CA9663C6BB2155F28990A08437CBC518E35CD0C089B119F094AC96CC748FE
FF12F726609295D5DDF8B9FBADBAB5F7DE3DD3D3330C302C2218779468CC1792
2F065CE22731B8B04410019961DF666084611F706411028A1F286A48946C6A12
F9DC9098888A802CB34F774F2F555D7BDDBAFBFD9FB7CED4C9659841F1C9F34F
C1334F77F55DDEFBDEF73DE777B6DFA90A5A86AC05BA6A96E3B79DF0961FFFFC
27BEDD914D251584BE234B5070F5AA20B997152D0805918D047E2C5CEBA23E4B
16BC466A88E252110EF50E98AEEE1828F447C6636BAFB103C660AC333857AEAF
7B68C3E68F5EAD19C27AF35C5F3734CFF1A92031461498361CD7B5B229A7DE2D
E4ACA566475813CB2DA8B6741F0A6A6131F040B651D34C8523BBC385B4950D3A
1D13225CDCA2EF8C95D3027C7165342BDC14581D1C6FCA4E457A5795B3A3839D
4A25EA38522417B362EDD6DB662C972055D1BB86E8E7A478D9AEE37BB8F87455
3BF684D7D7BEBFF4627707644464E5E843DFFEE2CEDDBEBBA0C7417E6050D58D
EADC1CDE3752E456C1846E008E2299DD411DCA0A8CB4322D2FB44DE1CD0A2023
41D934CC9495F1DCA0DD69F718A08444B6E010D7DA1EB7616C7CC54C7737BEBC
11F590BAB3D51D94208AA181A05DEBE07CAA0E2AB709BFB417AA38FD03662674
5A68D1D9A514D8BEE86DA07651A6E3F3E63A0A3E6FCBF44CC7700403B5D883B1
7837C4C582E052B80B47C2C139B982D6160A861041816EA95A27EE347D156ED8
74D3E6DB3EBFB454312DDD736C1FF53EC8BAAE52AA216D25CEA9E18EC2BFBDDC
A07D2431DF4BB2108C135D9816F455A822C940E63EAEE42CA65C7B42CAF8EFE6
CD9B118AE2CE5CBB762D9A9F494D20F7F9FD79C31F7FFCF14F3CF104241C0B90
E806C749239CCC43329AE520D75541DF35CF6D5AB9431E8D8A612CC3762EC125
F849B832A9938875F984134E78EAA9A750FAD393E2B9DCA58B4421590C14FEE5
F006AB13D23AE40222638B4D222ED4FAEFB2096EB8E186ABAFBE1A8532A9F687
1E7AE894534EE1C4470AED9081956CD07A409B00FA1962C95EBB4C7121F5FB85
B162604F1D97EF51F627117413D3354FE0AB68025E061C1FC29B123B45921F94
D896C8D0A10A70D23DE419FB9FD204B88C82810CCAFE521B6574B4287541D5F3
B6D750828C0C6DCD106DC99CC05470D3496381F992872F2E3EFCD043B76D7D5E
82D09424D3D0DA8EEDA48B63A350DF5593E3711782505EC453622FE5E85D945F
464FE28B8F015D4D8DBCC042E13C28A3400A2A5E20C9760E2FAB671BA106C3D5
EC9EE26125784AAA099FF982D016CD8CAA878855972F5B3E3D2308048BA58280
8AA86A4AE946B50BB1AAA8B16185B61BA3C4D7A5AC11B49AA626BACA74DD6288
DF151D458EC32550AC58EDAC184A2DCE74D55CBAD19521D07388B4730E34DBE9
C9F1FA9EBD86A636144FB4E4D141EAAAC2E2495B1D5B2417A44CABED74D00ECA
9534BF1A99B2E966EC4ED71FCCE52BB546694DBAF36BDB2A95BC2E44DDB00B61
6CF820BB26FEAAE7BCA0B962D4E856DDB283E3B5CCEC8859B3EB309F161D1310
8A87BAAA3433BE2082CD8A50B422E3CA44A915F402815A2A850ACF8EBAB8CFF3
4AAEA6E8E0562606D3A92E6C0B1D4D89FC66DA0045828E538CD0D49B50F2D9C5
F917F2A5F16A7DAF1E8B66830DD1162D8FCF3BA1E5E6DC9DD948727329B4CE50
33A04A100E3E516E87F2080554EC385E6F6DE37E9151774B4EA865B35264B81D
474F655AC11268BE81BA533674C40DBE877A3E30648882A18965DD6AC36E77A2
5E3B6194964F3EF9245559C16F5D5CC99FC9C949DC2FC29D43BF93C424A94780
17E51139FDA53E99C1ABDC831CB50CDBC93C271F08EE4CDC96DCF396C2ADC924
1F0E6A330933AA8A6BAFBD9662CB44BBFFCA6623D03320284C4D691B54574C16
03425DFC950AD088D599FC18445641D2017A623D49E60709CBE3F0C30FDFBA75
2B299564F0908E640E356ADD8CF378F9E5976FD9B285AAD848A426498AA09F74
4F88980827B8E11C47AA99ED00FA4A91843B0548296F958AE9A85A82EF42C750
C51C0557E1E5E4D2D0EF5D8E33895A01C7496A553A48EF4FD6BB3463D4482ED9
A2875E0A75DF255D4B689DAB31E2837481869E3E3EE38C33EEBEFB6E861ACCD6
77404DB09FAA20E4C1BDF7E8934C34A094042A7063320CAEA0F9FF5913447AA4
C96ACA8E7450C46B40B124ABA576B7AA83EEA108C8C76800A75C35E5DB4B2E1A
10AED83ECB4E3FFDCCCF7DFEAEAEE776EC36983DB78F12A1E8B45C28C2641542
5B9D834C2435211D89C62E3EF8822B4181DE8E3240D224431A6D4508B866F5A0
303CA0CF08AA9ECE70C66C6BA1B3B73A00033618FECABD9EF34ED5FA65B0CD01
E1B20BA22093CEB4ED36CA34D590F594DE6DD972A8A5B46CDB6FC6726058A085
96E2A51B9ABDBC3BAE433C3B38E3044EB63EA24254CB9415BCBED92B455625BD
935D73E8B17B9E7B2A0B9D690D560D8EBFE58477FDF087DF9F5F2C47A15C34D3
CA88AE569DC5162A281928E48638C98F4A29E1D9977D548520DC553E4CEA5375
AFDA82666C09236AD42E4471B50CED60184F510ACD52CBAF8745FFA48FBDEFEF
1FFC96DC4A47913EAC4B8A576B0CC8A96EAAED879EEF0C0E8D54CA750D22CFC0
05ACBB1D0F22B4A2509B498A26FAD4F841387A74AEFA4C33924782C8589D894E
FECB3FBBEFB1BFB1172AA1919E749659A0CE8C4DB73AADB1D621134343BF8AFF
3D2C6B216A179C5C17242F25C529135A79F0E744A22D0A78358A03B400143014
08F0BEC43E8B58340AC496406BC0B25246CAACD84B606BA3D170045579309E57
1CD1DEAC9B534AA56E756E79318B67CE3B1DA350B4CB8BBA8CD8482197F8CA95
2B897AE037B2A41CF013F759F4A5240743B22D227B57504811D316B79AE2E27E
4E84677143A543740F4EA181BE3780E988095AE275C8B34FBD71C85B42E3E1CD
4F0325A1C6AC0F745FF272241137F450305909ECD3609B23D9C7F1957CC5E438
2256353235509311C7354E13DE940B74998F4FEEF7F266D8CB0616FFCC4DC929
95082F4BA6030B3892F86CDC9130A59672F4985FFCE2174F3FFD743A85E6131F
1CFFCA14224C864A0F78CF3DF79C7BEEB944328AD7472DB57AF56A149AA4EAF0
CAE4343F9826E04A3AD6F14C579EE478605386DD7D5C500D2FEF8BC9D749F6FE
3CEAA8A39E7BEE393692F6939EFB89548AD6B08A4D72D642DFCEC341E278B809
28B9BC92951CFF53364154908D6AA0823CB062D55CB5E2B7EB2275B204A9664E
758C612839D05990AA816543A80F0CAE5C6ABD28E8F9ABC25D21C94AECC5FBDC
084AB0C2186CD8953AE2D99134CC68D0755033981D4D158D631CD01019A52227
CA436E402EBC94FA35B8793C4B1F76DE72CC9AC6AEC6F6ED3B3ABDB7311CEBE7
5CF8E96B6EBD5DA41299F0E94F9CF1E0ED0FAC3EEE98E79F7BC190CDC00BF086
411CF891870718BE9A2EE66BADA5E2F0506DAEACC4A01BE9AEEBC180C83D15FF
939B5B835C9C725A688574DCD16CD06AA9E140CAF15DB0BD54001300D3A3BA57
2C58FAA2FB1C22EB35D1B2A657F3A05E498BD335B4239BBDD48CBCE6B93E7E53
B427F26AA91297DBCAD26071ACBB208C0B7FB093EE0C56A3BD222953105A0842
D3C8D6C6F313E097F72A5D14AB301FAD294DCEB5661A6A4B389196062C75C2F1
AAD6A4B46A62ACFAE46EDC9D36545A03865B7771E0B974CE757DD7EB8A68810C
59055A19D0BA66DA571BD9767E6040DB56F387B38DA8091D9106261E56426D2B
AD1E9A9ADEBA2443535E39DC5A5CC4D91E874C2558F0F2010C89E705372D6220
A98A2CC35827130AA3A0B954D4FC966010917AF2097A817BD3326FDB70E73957
9C8E7A5EF05A3BE2E926971F56DD55E9A0DD97F2B594D768C462AA233597CBB4
9A75E9E5D53FEC5478AD9A803236C545709F103446894F397C0F3CF0C025975C
42929D653D77B190A4FF2A46A3FC10CAA3205F1065E6724A8FD5FB901380B88C
70F3A3604240CDD290082148DC535A37799928A3833CBFF40DA1F524370EA537
8C8F8F132B353964D84912BFBC0F25F47B0990726255C72E6FFCF2CC33CFBCFF
FEFBC9D1FFA637BDE9473FFA110E008FA10C7AF68424773BAB1CBA38C530A04F
5341B292AAAE08AA53CC19FA0179E8E75C715D020A7A4A75253F1885FBA9DE9B
1512E7AA422F644DD51B1CD7491A4FC90000F9EEF1FAF846C8487AA5268084A3
898219449DC47001FA044D74777A8AA4D04FDEF7959A80E240644910A4E0B0FC
C184359986DC3169BF843152486468E2BF1B366CB8E28A2BC88947DD359886F6
7F44130C98BAEDF87629FFA63FF8FD6D8FFF50AE2C55504C7C70322357DA3FB4
61BA97697E1AC8934AB43D046D78B49A95BBB0F73F774239525B6A1A95088429
D06DC8E6A1DD5DDD5EFA5F42FEAA5F3686FCC18AE1FA1B2A22057DD1D3B541B3
1237FF6D4990A37970A80D0DC82ECA2D5806237F906B0D8DD9E9368C2CC27521
548DD5CEE0B6C1FAC499132DF785E670A1F4E576757B804033ABE7DA8D4EDA4C
B79DF68DB76C2A8D94AE3E7BC33CDA1FA370C8D16B661E9F4ED97A3DAEA164CF
FF314883D9747ED8DF512DFF5B0D7680146AB1AC5B51C755CC426AACE840A0D4
760ED6579C7AD4AC56D7AF9B0D15599F8ADA1F85B8D8EB78834F360987FCEC84
EDFFFC63753A1AEAC9455CF7C13269D91FBE79E6F09F0AC342C45861B435367F
C71CB455308355CEC48EE2AC768E35E8E4E6B6CC8DF98784602F4973660C9E9A
8A02E3F5C5C99DB55FD57290FAE050BC227DDCDFCAD6C0E4BFFDF207E6A5AA93
0B0015C1B00E03DEB1FFF7F52F3DB7D5AED89AA44A91E4C7BEACA9E96C5AAE4A
5D6828EB879C54377D797B756EC5D3DA6E84E7C3E74053D3ACC288558DF6FCDD
5E7C713AA4BD301E31BD05475220B342CAD5E23DB541587EDA11D3F6EEF45DB6
88870F895E05B01A602708B59485A3FEEEC8E91D33CDF9A614A19960B8A1DB8B
57C3AA6862C79A593849CFB752E72C3FEF3BB7FEBF6DD5E76CA99E95D3757CF9
2538E6DD4795FF63219A89EB763333945F2A57A89E9F5A0AE2BFE4747DAD88E7
820B2E78FCF1C79F7EFA69896531E17416FDA818700792BAD82F5A489A80C135
55FA40CFA3F2E28B2F92FE20BF33B1E443DF1F42A79C76DA69DFFCE637C9734D
EE94642748AE24DA2F8D921D38D4218BC6CC055C491E3D1640FC03572D71B61F
A913D26749473FDA2EA81528C5050F66D75B9CE8F7C63096B130894EA6596677
36394F985E02150CF5D2A1BA84B8DF1A971E901C4D943B4F3340357A34153818
04E6244FC92D8E2F08DF083520A3DC2D3C9EAC2EFC13F3CD91F580A71C79E491
08C351449258A4A2E2037A87384D9322ED38CFD4B085922C93BD25181624253E
CFFC01BD4334F9447C4BDCD7D4D1F360A111AE4F4E0684A81D1BC5187048BC0C
68916CD9B205A10CB710F89FB50910CB747B8B6C60D9D8D2EE5DB8A597FFC9A8
7FB8B578C39EA8A31623AD9B695A9F9CECF80DE7D10674ACE1C17871DA468340
570C2F883283C5B65387C01B82B1B232A79EA46ACB53DD9FB6941F401EF2221F
68635A5992DDC7165101189EA5074106F46C26FDD2C442F6C594AF83FBA942DA
08A57B16DBA1687592F233DDEB532BADE53BCF7A2E35E8766F01F9A4C3F4353B
D20FA7ABDB9B29D3ECD69D5276A0E3740C0BB14BCB884C77B5237F501E9146E7
B6EC55ED7490B34B67E6AA434DB80994364467CB7A667CF8DE186ADE74A98C52
4B72D206981E549D12E81FD0572C3F76EBDDFFA135C0772D503BD685595C1AF2
037EBB62A080D133E0E0B69625500CE1204243C4F325150AEEB21A94E13837FB
E6BCD932CB8F2DE88811C1D77438E293C76EF5E7BB0FCDAFC9BE6EE9455C8B0B
85155A63B1AD39793956E8BEA58F95B2D6E4EEFB7F291A47CB39909AC5CB073A
9D2EDED7A9A3CD55FFA3534F7CE63F9F9EDB3ADFABD612589F24720E6D9E4D13
4BCD5A747F5D1046B5F50A78DAED935D6911D63B8A0DC65A2B548AC53B3DB32D
EF2ACC1B2EC4DDD4B032520B77754A90FFCBFCD0C061DBEEFB4FBD86CF9103B5
A97FDA54553DB8A7137407A4A82C8F6A7E45C44824914620A46A28C5A2B37D36
CAFD69415E95AF7F6F069E90F330E043CBD63AF75CBFF153B7AED73F3E5C50F2
8B776ECDB6851DD7D26C43DEE7CC4876D0E340EF6FFFF9AFDC21BE0A093E62A5
27F24E025F4CF3C91E15829C247A28671F372462D20F7EF083DFFEF6B7290593
4689B7A1EE25885BE9789402681C301705A910DCC07805BC0BD5F792039A3038
5E9C3132B983D6AD5BB779F366AA42228F3995C893079C2848F939994883B0ED
F2E5CB5157D180E901F15C72587116CDA9A79EFAFDEF7F1FE50B993B78223E05
35D7247D401E12669EE0FC71FA2BFDCA340FF46E48EE939B1EFAB614DE9DBEA4
E02D4D268537C930A29A3EB9D730807E20104D7D3D515D5D7EF9E537DC7003F1
68E2BB43759B749DF32B63777CB28D33C041BB40EFB75656AD5AB567CF1EFA99
7C4A149EA5DCD3FDDABAFD9757A4DF32FE9571021C00BD5F8EEA3327F6013501
F111716107F709A07A695421EF7DEF7BFFE55FFE855215B81107D11C31F1D16B
CDA9F8EFD204514A023B1E887509BCCA7024FF9F55F901AFF6E519049ABE6CA4
62B99BEDC20579CDE906F778C34D6D418D539952D070AF5F7FED8D9B36B5FDAA
A44781700A807B7A0EC606E0BA5DCB978AD3521D8622BD0CE13550AA5AE5AF75
8C0518904B4B08C9D3685B888CFD947C482D6AA20611D183B20A56B4EA2F96CD
8FD7ECDB5BB056E498C26D30D25CE92895C6F5F6313F3DEC573F791EAA50CA17
1B9596611A364A680D327AC13C5DAA1C56831AC066C88543C3EFCFEF38669B7E
D1800C6E8C064CCA874657717B694BBA0A72A005C5C8F7CFBAEB630F54BFE46A
01DCE21FB534F2225402A90866052EEEE5E9DC8AA8C7B01437D055B71BA912EE
05B16D719B3A7E1BC5A4A1A6DDBC5DF88005CBA2FADF75E15768DB4CD4A2B9CE
6D91BCDB8ABEE24CB6265ADE4C4D8B202F21881741F3B6B56C687C26DC9ABAD0
725210DFD039AA3C3297F5AA2D6960D25F3AA5A5A421DC04929FB214D1D14C84
8E7D34A8742980208C230D0294C93787C5EDD9DA175B435E4E0B86F766B615CE
1F6AC765E586129ADFAE1A4049A5E7350DB513451F3AEB233FFFF633BBB66F0F
4B6DFD02D333F00ADEEB97269E85B9100AA055B50D8A0CB1BB31020FB19EE3A4
85DAD16405D0940D229144A4C9912CC537FAEAEE6CF0E576AE961D4AE97F75E3
B9975D730D7434D3F3073E35397B6807E63D78A475DF599FBB68C3354DA39506
9D5C23A3A3A3BB77EFA62491DF8DAF0CA85517FDCE748F8CEB7147C9BDA62E88
E5F17E547E493B90892550FA93DF9CF62A8AF8E9E96936DED97BCEF921F82F4A
B164439264761053C511BF0D770A237119F79BBC737D2FF4FBC8CBFDAE2CFB89
B324D11BC1F337BFF9CDCF3CF30CF79361B73EB7151391134922CD47D4F3F4E0
2494B91D04C7459336017DC9A5092CC7E9D1F016D450F3DDEF7EF71BDEF08607
1E7880EAAEA11FABA0BA071CD2638F3DF6A77FFAA754EB443D4F70C6500BE261
28E8F1076A7E89B7989898A07A3476075168975F13954DD0EBC015830793FEE3
84A8576A02AE13847E15052A9B4B2FBD94FC75D404825F04A709ED2701D93574
B038014F0E2B4B5AC7F83D294B2A73C50133F114CD0679A8186ABC52F2523C9C
743F4EE3238F3CC2C1AA641F693CE6E28B2FBEEDB6DBE8ADA155F1894F7C62D3
A64DD0AFF648C69F706DE3C1B7DC720B474AA869D295575E79DD75D7B18E61CE
77760F8AC1588DD2DEC1C55CE5DA0B2FFEEC865B32170F699E52BE6BDE0CC01C
9DA89717C1F2C73E7E1C04B5B97FDA75DCD1AFFBC58F9E1182DB0125560D5978
0F8C8C66E3F85390B9F8F76CB468EFDE3D150EFDEF8F7DF24BDFBEBFD55CD0AE
30326DEBE4F69F4F0C0E5F7FDD755FFADC43A75DF331AB3EEC1A7AA0CC2CF707
6AA9B0EDD6C05F690635E9D2F69811EDF8AC061B5D434EBB1BEC5290F1D581D6
6DBB07ABD9DAB55E414A2F656A690F4CB7E458BE2DB5603DA4168CAEE5420694
4B40970ADD8D7588D2F0909DDA96294AE9BDF945C493E9DA90067AA3B098A9AB
ED5CD768EB5EECE5AE9F6ACCB6E1DEBA159831E4EDD46C4E83E67A09A438D7CC
36AB2D182BC0CDF5A263D51C05F2C1B027D220FCD280D36814D351CD8B602348
8D427C573DEB2B057B62DA98D3AE344ACF0C2F3CB9039A60350B366871B652E8
4886595A502B6A132176285D36A00596BB79D60C51350DB68BD34A13C2DB0DF0
DC7C3B27ABCD5A47817B43BD9AF28A4EAA964148EEE6DA4AD308332E5C66C1EE
D2D0439D72AA0A75A1D8D0903AC2519EFF7A98DD5B40A3663E53118EA1EA900E
465D9F313D2D3C2A1B3D57CF15157FDD68B71A661EF6DD725B946A2C9BF3E720
FCAC60CBC854AD4EB7230F0F8637560E785F631D14CC29E78A5D2D79BC187596
CC2E84D982566C5F5E093C115B4AD70CFB6B2E5A7E3895A834DDE8652B9FFCE4
B4BBB9D108AE40926C4991C86293626F04A63FF399CF48EC6BC6331F7EF8E153
4E3985C8705EE957E53441DAE19CD2434603E12FC2B9F83D0A29DC6CE45C3AFE
F8E3FFE88FFE68C3860D64C5A3D6215E9A9999191C2B85F556AC58313B3BCBDC
3849A633CA4CE5C49BB1B13144E8246AF1F9F1D65BB66CB9E69A6B504A26F120
F4F362E30481DAD4D4142A3C2A11E0C827DD8886C12E20726731390429129292
C9C498FD22C6D4F59344F311471CF1ECB3CFB2BF883D6078305964246799FD8D
4134E9421A1E553EE387893929DCB266CD1A9C3D3223EEBDF7DE8F7DEC63C937
C559589FFAD4A7F0AFF86AF09AF8F3C68D1B934D950F163126D04D821EBF4135
80CA804B1369C1D1FC24BD498CFA93B199576A82640212B3B671A8990646DDD9
68BAA82D33FE9502DDAC74F7C33EFC2BE9127A6BFC4E29BACE3C5494C346FE40
22B9A2AC569C64D2195CF988776793940AE6B940816F4D9179B60269C5E231A4
4E021F86B5232BE6737241F23F98863708F631554D65CB47D6BEFED47033B3E8
B5A5EBB3B1D9826760C5C4A193CF0DFDC70FFE23EA40C91A6C541BC28F2C478A
298FAD2DCEA4450316E13A6F67E12BEDB1DDDA9CEEA1A406134AF2607747A5FB
0F90DBAD2983915CD554C319EFC28EA2DEAD7B22BB3D0BC199002B44EF4CFD3A
C3FBBCA9EC6D869F17C467F9BD6A63035A1D90BD7F289CF36DABAE77D4945168
E42B23A78F282D6DE9AE8E7B79006345E5FCA550ED8C5F39B6379E1BDB98A982
6A9472E77EF2A377DE787D4E2DD564BF03ADBC57F0535D67584EBDD7ECACA9A1
E42A99B96AD02C6D18A8E6AA6845AC3AEDE89DF73E1BC703F9B7FA8DDF6BAE0E
5695FF66B6515521E51B5D6FB0589A6D36F3192B68A43BD9B9910B0A43BB079E
FDFA761154D0D5D4F956D76A8849C0C5B21D86BF3A8032B761B8685E0CC5F9AE
D56A4377E28295B3F99D222CBF17770B942E19A8A6961413464E5E3DF7E56D78
5F282E0DAF1D58DA1E875FAD43188D4606AAA639C501532B9C39E68FEDE91441
DE05F80AE06145AD86C19D0A94A3A96B4B1590FFEAE273BFB0E526CDB525D046
561EF2D2EC0B45AF54876A9C07EBD462E7A89EE554051880D215E279D7AFBFE8
919DFF52FECA8BF5BAA5BEAE1EFC7EA8B44A07BC6F3DB70786C5CBCD40BA7DB9
5D8AF2D5950DF3F7F1D7E1EA3F2C46970F0ED4C2EE67635BB50C98758311C3A8
53AE7C32F39BCA30596EE0623EF4D043B76EDDCAAC3C49227D92DB9C8CF3B2ED
C4F4908443972F5F8EBF12AD02A52DD2FDB8228CCC023629701BE09D888487F3
2369B7C77DDA1976F7739510DE0BBF3CEEB8E37EF0831FB0EF82535C92092A9C
2D839294327CF03AF7DD771FCA38561EEC60895FDE9B9E85233D2949DB65CB96
A1487DE9A597D0BCA23A613C38D9F486FA6BD26CB0CEE0A809CB353253701210
D4531E148EF01DEF78C777BFFB5DD2B2CCF221F71BD7B028A47749A2871E93E9
4889068A5E0ADEFD739FFBDCDAB56BF16A846D93D4CD54614B856F045AD9F996
64EF20D38D9C697070EF1067A4D18BE6C040D2B984A0E19FFEE99F9E78E209B2
6398BE906474B287F07EDE21B60293A1A064E919139C104909190AF8D454BF8D
CBEC80F507FC2B1794E0BC71688A0FE32437BA083E1AB14571A401F5011E8FAB
6BDDBA75F7DC730F9306B2E8C71B31091DC21D5412FC144C97C27E4B9170FCBA
E35E7866CF842A5503B7BBB104F26EEB2AE864F2D286463C0F837783D385F695
C24D7BFFCA5B2E3EE3E2F3EFB8FAF69B6F6FCEB7A508F19B0C2291525410C379
B94C6EC0F9ECCEBC0C4BEB7BD9A89B109416DCDBEA63AD6CE31AC944510AFEC0
D8C8F23F9EFCF1433F334B4BDDA60C8A3E941DA9CD07C1CAD9E2C9A51A2C83AF
FC4AB44CBE16D18A0F9BA2E5F5D462DED42FAAB5F00D5C0FF9CEB85CF0EDBAEB
EACDA10B87CBB945B80786F640F966199CE8D0F5F2D66C24DF726461C70BF657
F34EB986964D4E3396A428547C4586A166B6AA85684BD4F2A05CB63255DDD9FE
3C9AC9329CA90D66BDCA3DB13C0BA695CAB423571B6BFA0BE3EBAC85C80EFEDA
2EC6A5164A41DB960CDD0F83B194E5F98A7D8ED655CAF0200C35A011281EDEE0
461F6CC85C3D2683D9BDAC66781DEFF3BEE16BAD91FCF5E75D7CEB5597E27D53
EB0FEF6E7B51FB066E7C90CF4B0F584EF9DE28B5A0CA9A5E6AA93539DF892A78
DFCE50A7BEC9053FA29232CA084A5FA974A530BE1E46DDD1C646B7BBA766DE0F
F96B972D983370B3091D278B4739D0D465D023F060CCCBDDFAF05F9F77EA87AB
AB0C38B5087BE787FE9F5C9E8F5297162DA55ED91C0F427EA9DE180A0D471D35
7251744A2D5C1E1EF0BE8AB2DCBDAAE96955695329D7C83B37EF1CBA429F19F4
A7EE8EE79F07E766803A14AFC7A7D724C377AC51A5516639CC0A007F40D1BF6D
DB36320E70319F74D2498F3EFA28398D930CFC64FBE2F2E610A3C4A219770EEE
73EA4F403D4FD81992E4ABD9EF93CD679ACD36EEBF6C26EBE33BF4FC308AADB4
8592018D800B2FBAF0D0D5876EDDB675D9B2F199995E7B325970F5E13B354D49
575143F4AAC36408244588B2482457E1A696D1021265F68A1BA0A0440DDA4301
FBD0A5DADBF678A2F8531CEF8B75C852CF8D1E1F3860F2CACC16B9DF4A93C827
F05F9411AF64FB6181C83285B2EC494C43A283234E3DD92808DBA9E70F5E9033
5E5EABFF8E3291288B9F53C4F0D608CF2FBAE822126A2831DFF39EF73CF3CC33
14C62075C2C58084852936CB6DDD92D9532CFE5095A2D4838485442F9D72A592
8C781C39C765840616DA25289A893D826C522668A2B3E84F5CA94E63C0DB3DF4
D043347BC93924F58F17A17A14323B78F9BEEB5DEF3AFCF0C3D1C4A1459C4C24
4D6A02B6D828F4C2D50FF48E4821714643B2DE10DF17FE4CC90294AC45AF9E19
96F007BC208E9F6AA7090651E22F17B193DA2055448B41641C8EA6AC3931E1AD
1B04E3D0AA2BD42575B07865BCAB5D956FCF4A5E10DE674B0B8179B51265B292
693B350F577BC6CC52002994FCAED7D53683370DD90733AD85106EEC16BC626A
03CCC58DE2B9137A0A16EE9A160DEB25B3E40CF88737CB5B5B4AA48E0EAEAA55
E66DDD1F8ABAEAC5D9A566CBFB1620485FE51FBBFB9C9D190B82FF1BD80B9E85
CAE6AC381A97DD3BA24CABD80EEA469CF286DDE5A78FCCC973BE350E9D69DC6E
CA4A283EFD86A53B5FC89E66378F80811B47CEFFD49937DD799BADC6D070870D
A3E5BADD5E846EC233664B2E7CDA5423BF748BBAE445E11D3254DCF4758531C8
6D87194845A75F7CCA176FFD1ADC04BA37E87DBE72CFD9B79F73D9C5A5523A30
4DD7F38C4A1D415CE56EB10F505D59331D0BC65AAAE45FBB370897E5D63715DD
AE5D164364C29D9D6C4B0D8DD245D7AFBD6FEDD5F3C500CE16A55AC3B79B653B
F06FF6D00A495F5D1884D41E585046A2D016957CA289CD62EFDF48E423412F09
36F06DF5CA20F4A6A23B768946099B24797130BAA3BCE2B2E26EBD06EBD5F1C1
C25CB312EB90B572FE4253D6245B2476C553416697DE868BCDA17CC6BEA86215
4717D7CEE315EF931E5C7FD985762E7432752F0045851055FEDC81EF8BAA6178
6369D1A8021E138C58F72F743E902A1A0335DB80E1563A5B75DB41AEB3A2F637
BB61374CC4B09848E9A6AEC3492F0EFB7588DD8B4413D12CA27442E08B6BF88D
6F7CE3534F3DC5FB482211C3A49B37DD74D3FAF5EB117CE1265FB972258A18BA
C1C14B40A53CC2B7DEE58403DA0F56AC58B17DC776B17414DC639A6D0B303532
5A5858A81F7EF894AA23A894CD949ED235498E02DF0D433C20AA3685D33C0E7D
E1D711725F9163DCD24AC7165011F50B8E2EE8D5CFEC13E9A83D22723EC8FDE1
FD86A0F97EEE6CFA70E89BF63069416EDEC4228C6413B312B12EE1803027DD73
B63B9D4EF8915CDEAF49137012147BA25875E1CB4235802F98989F292C416791
FC253382753CA90D3C0B251AB784238F3FFE70FEF9E7A37649F73E543F816F9F
421A491639E8773B6052D2D1D1515C1E548FCDD65BD20EDB2F98CCD6C031C71C
F3F4D34F27151E657C5E70C10577DC71071D4957A00170108B9E8E8B510EA809
924CB1F844E4674B727BC0CB990DF129289D8CE699064303C369C43DC38000FA
B590641BE12DF018EAB2475029D90C030F43858DFBF0AACB2EEEC4C1C85829D8
DD88CF0DABCB012E87655169E6C2AA7AE86474767318E4F90BAAAA0ECADD2537
0A206C16F38566AD895BA1878822DAA6139F81D922C016595A4AC5577452A111
DD04715A4F9F9F0E65A7755F431CD814E4A675BD9EF29400965BF9C5BA04521D
054DCA57BBC68275FB91EB6FFBCC5F97E3B9F6864EE441FEAB83EDDD6158A8A5
AE33C69E1DDB71DFAE62B1546B56337EA6ADB4212FEEBCA27AC85261FBD8A985
965A0FEEC03BACF2AE6B98C5A5ECA7333518014389C3970607D30B4B9A70E028
0D51F0DC82359323BBFFAC5BCFB5E04669304E55AEEB4CC1AA5D572DC2581B2F
A1A1A92390C9B2C6BA17FD50873BBAE9969A1F1B999B9F150D9F83E8B0546E7B
A71EDDA54ABF1CD2EE6D49A94E2C8DBBF16CEA3CE89A8ABE318C0C08AE12120F
36DB560DAD9BBC97AF0DB896E7B4E573B20D44E817574BB151BDC91FA81683FB
D38D60B79C12F3A3DA391F52E675F56ECA854BB47428683F4C19ED6FB3063E5C
D14937967977CF84085837802E8F7937CC59A7CA9D35F1E4DAC1BD90B34AB938
7CA1DDEE4AC66018FB92D98855C328BB268AA173F3B54945BFC6BDE6E3EBAE38
E4E6C2BC55BFD513CF1B0A7F9111E43D30E3CB1644A9C181EE0BE3B0FA82B139
98EB5C86A26A15DCB00BDE31003F293F7CCEF5D73F714BFBF702BCCCDEAFB7D5
06AC39EC8DCF6E7FCED462825F5CC64FB288A009855A698FE397B4F20987F14A
26761C2A9642F9B04F2092D785301DED6DA6FD82BE2FE520E255E91D20F6BFE7
762501E809C0A2A15D989BAF4F4D0D0D0E0EFCEC672F1C7BDC145E677834AD28
92AAA1548B82C041D18FFB5156A496DD0B9F86BD165AE43097441D1D043D5A21
DFEFD84EA7ED365A4EC7F63C17BA54D2224B8ABC8F173E08038843095E0D7A27
7D6AF4610181F382E206712E8A6CF20E91578A4506D752E184E237242293A5AD
636363A847CF3CF34C8A1610CF337B097EB7983EF4E139A7E570C7B7A4CE209F
0FAB7702B32886F04FD478127FBDF0C20B6FBBED361CEDF5D75F7FD9659771CF
4B92FB94C499CC85851EF4C62B50EB12BC05598ADCFD2DA941A53E9D355709E0
BFCB962DC32B73E49FF3C19271721E3677D0A43211A20C827EA2115521109CA1
2BBC8A26208D8E53446E256216A1BFE23AC75BE02B469483AA9DB315E89AF436
3FF1894FDC7DF7DD3403AB56ADA2AE3838BC5DBB76E123E3B3B0F3F08C33CE78
F0C10709FE533E2BC5F9F160A230117EDCB6D6C69569B6724EB639521FFCF421
959BF708B69F5BE6A00DFAB5908AC1BC6B34682BF6A5E51118D905D35C2E3E39
39897342B9B68604C3B7FCEFE96B7FBCAAEB343FED55A600AE85527B79F59669
C491EE2D20074A94023DC87A50B7BA9347178C9F065BF36DC89660E622D0A594
F1B958AB65AB5016956B63A07F1846E756EFF9D6B6CCB9137E63D6BD1B46E591
F9CE0218B0DC1C9FAEEE45BC3AE42F2BCB36E04997F510D77DA543F716B6FA3B
44706250D33EE707BB413D2F0F7251BAA9BC0C8A3BAC199055E804A311B48E05
FB0313F1ADB3CBBC62F96CCFCD44CBAFEB2EE0FEBC60CCCD4A831BF7A2765EB8
6428DF8E1BF7CE15A2523DAA4A3118999463BB855009AE5AD9565E1AB80F86E7
D22F801D6BE3A02D89065E9F057DAD293C4557D9B203F266C8799986960BE5BD
10CAA34134BF1A529F3CA47BF3F62CEAF7CB8A8D947FD4CDD15EA95DFFF8409C
8EC6EFA805A1BAB8AE68959BD6A3434D7BC98F516AC90AA410A5775EB7041F56
D3376A7657832B9A038A55BDB6A3AD84F07FE5C3231B02CB23D83B5D368A53EA
0DD51218D3438B8262A8E51D1A67B78EB7E0D402DC53CF3665FB5C2D5C3538BC
6E36CA43EBF431982C65D63E87EBAC79F5A4B567E120F74DA9574516B8AD4BB5
52FAADE186274FF9D447FFE14BDF9A59D584ED215C5FC027886F1170D710D904
BD46103D4705FB9339D99AA91CC87B4C8973E418C0C58FD2637E7E1ECFC22D40
9DB270AF5D7EF9E512B3DCE036A0BC1772DF1F77DC71BFF8C52F180D1D2C4DD5
D02DC71530BF98CF55962A564AED76512AA5342DACD5BCB7BDEDE8E38F7FDB13
3FF9F1D4D4248AD397B6BE90CBA7745DD57414FE28F53DD407A8157ABAA1B793
A37DA6BD2AED0B30668C8CF0FB07421354EB9DC5C56665A9D56EB99586D00491
7022A1752A6280618C9A00CF3F289930BCBCC2803ED4DA0CFAA18EE1E16162AD
E1B6E6C4D049EDD49321040E5D1048C4D9E3A02EC3614AB1E59AE4DF4D137036
0EFD8AF7A2623D8A61502625515050B440EA7718A6E41CFC06051385F4F1601A
3FAE06E2C1DEF712FBAD5A70CEF14F78351464781714A6F8203445548540E964
D48B86F3F4098F70662AC97D1C158AD1175F7C9139A992F41B780A5E874788C0
9C22D8E449A38329C60589182F8FF695B824393F64C5AE5EBD9A1A3F7083E564
D7FB3FFFF33F7FFCF1C751CE123920BE599C525A03DC3F952264ACB4103711A5
39F9CDA8AD0DFE40157F74775242A8025F78E105FADE84D2E64DF79E73DB8794
1A840580B3D49C64784ABC6CCF8A6DFFFABC3AAF0583019C9E012D8047BAB00B
8A5609AFDFEA34938174BC662CD9CE87201E07B56004B50C3CB8B472A1B853AA
99E70E38A5A591EC70796971C5D2E8F417E611CFAED197AF3CE5CDFFFC95BF15
043BEB2661760F1C2EC1928E4F6F488EBE1172D23195C15F1BEF939B8779A333
7AEBBEA26FD4AF3E6BFDD5B75C299B60DA9693EE4421AC768FDA653D97EA807B
93A646E3E1E588ACAD6E760CBADB8CB34134EFD5B2B93D9DD4AFA2CEAEC1F6AC
978770686C726779BB1AC46ECE4F7F46755A4129CA559637D112B282BC0ACB1A
DA73D606CD431923C1723B33FD95B6B947F5211DA2A0EEB43C07A46C21132BB5
75AEE5FA999BE208BC86E0D31871A179284CCD5DFC7C50E891B9EE06EB6BE9B8
ECD9662039D6B2D2483DA8E6A4D46C3CA79C8D5A4CB1BAE9A5E5AD4BEAE77EE3
CEEFEC6D467A6987F3690870E18CC28A4A6EF7ADCD01B7B894AA094089FF6BCA
447B745E9A0DAF5045AFE9BC88488F7E2DD79D8186D134645D5BEBB57388A5AD
D1AAF4C9D7FFC5C633FE5A95860CAFE983AAA4A5C876F179AD0B34395486A4C1
1DC6CC079EF9E31F3EFA4B272A140FD9397D922BB46F0E56B60A3B6FAE1FF0BE
A5F3B3E521D72C05515BF2AE0E47DC31A9A484CE4CB927FADD9B87F47279F416
CDD6143B74EC92B52A3742BD1111AEE13EE5FCCC64592BA5AD936B9449162051
8A4CDB9992FB256E2C8390F6C4134FFCD297BE4431CF534F3DF5EFFFFEEF69CF
BF4A9A2ADA04A6AEF5283B7C040D87AF59B67C6262EFDCCCF289611455131363
8A1A9BA65EAB57B76E7DB1D56AE02DAD4CCAB2F02444009E84A6608CF64BA0C8
81040AE15E14659A12A36E400D81B2162494F2B1ED7AB586532E77CA15BBD50A
5B3620D242596D7763C7055CB5147B39982648161EC3CBBD43D44A254914CA40
9BA4DEDAB56B376FDE4CC49994054B750FA48AD92C206F1D11F53CF2C823EF7F
FFFB39EAFB3B5481EF57A39B0C6C301060C2674EC3C57BB1BABAE79E7B2EBDF4
52148B78CAE9A79F8EE895C6F6852F7CE1ECB3CFA60544CD99393D14C77FDA69
A7E11AA08BA0B05BB76EDD030F3C408E720A1A51F881E57E9CE81FC9E3A43FA1
40DCB97327F43382983A90D2C0923C1F083BBEF7BDEF412FD515010BF39973A9
3007DB93096C07D404D4F01207B97EFDFA2D5BB6A051C2AF9E59B5A167D01011
05095C767FE13C105F21E92D2EE620354901733A85224074596A9AC4DDBFD99D
25ACB7B061B43391D11E11ACA187C4E676C3F1EA63C24FAD29E9942093E83653
22C53E8BE210265BDA92EBBB56C60A22DF0B5CA1D11B22E95985028A12D9A983
87FF9524D052508DD222053E90C3C1CEB29A5A09F3CE797FB5EEF37FBD39BD94
B7D5C65870C89C685B53CE2AC5613B2C9BCDA60CFFE7FDA77DFF7B3F6E2CEE76
0DAFE84F4641E7F72F7DC73FDFF458A0895E63F941CB6976654F6F0D0857A7B2
940A215D1A564B8BF2B432E70E01CC9754E8E620D34533030700BEAB1AB1E0DC
0914148A206FBCF6EA4BAFBD7678F8F5B5F9795017FC0C22E1928A76BE5E8D70
7BBA962675BC224C5407674B955427D38DDB452F27E74797BC97F0D8A80BB6AC
F5DCE85D6B2C033BC73AB91908BA251BAA45D06B439E561EF10F69C13CA43C1C
088A0148D74D5BF8C6D4AC6AB78AE3C591AAFDAC83F7D2962BAD8E9CAEE2C636
BDD2D0204C3BD595F5F19D85BD5ACBF455C77033AED54EF9A26F654781823B54
8716649CE1B6E541314CCDB8DD8CA79420B3C7681402DCE8D0D4406E892C2B1D
BA2D43D00B9AB1ECB545678E43E2B6E3C9B3614E3C6F564A75B5D92086743CE8
799560B93E346D96C79BCA9C1EEADE01EF3B02CEC2806E2CE5DD426475966C7C
9E508EA1308C4643DADD1B54844D16E62C69D4F66A9AEA5D7CE9B90F3DF4D09E
3D7B98D19DF3D793509252A22141D8C3E98EBC2370D10A772BF4CD0AC6AD94F8
41CC307451CEBB3F902A901459324C458A03CF8F4647D26F3FFE2D280A72E914
6E832074C6C7C7AAB5C5A5A572AD2EE2B129CB2CE4B2F942064F51E4100FF09C
4EB72BB8360433A0DC2BF78B3D49F61535C24DE7B71AB8CB43089D20EE74C246
3B42E4DD75200E5146A05C531B8DB85AB51B2DC7EF0DF060DE212623DACF4144
9A80BAB652560977D1A12656384794C28F8A8D8C29CE6D4FA691E05904A2A19F
E84961497673BF569B20490D4BD9389CA2436F14CD178AF7F287F9B1F15FE8F1
E2D1F794E648B28F9286F15FCA71249F46D2D621F72215E8E10C90CB9E5B0051
6E127D3867793F7B8B2BE0B84F32B145F138C9BBC56601DE6E6A6A6AEBD6AD34
EDA40CF66B9BCC3501EF7AD7BB9E7CF24992C5E4A027B7129AB777DC7147B2C9
01472628D98E729159C5D264128B09C11D7AB364E7D143B132E6683CB743805E
9BD2E9E9E964EDC57E3FEFF30E05919549B73B6D59EF1128B9812E9AC90B2A7C
D05570A3C181B1DAFC02DED8893D4829E0F4F2B506738D4A9356731C82A1998A
6F058037E88A7663A6042E9AC3AA6458B1D39054887BCE529153A04ABEDFE3A2
C1B951A408445605503B25DAC18AB880D1230B42450791A6C7888025A3982FD7
AA387643B63A911D82ABA6A520F2B2CEB00BDD50F642C98594C820D23345AFEB
83EBE2E2082237C29B88B941D594F1EBB6241DB8834A7232930B86B117A5FF72
5B40E8971CD27B67C24166B8E1C445A6B1E12466AA48253B92B2872917996113
2100B2773993F2D57BD51DEC4337E27A29FC97730720C192893F735F2C26FF67
3084C207BF7CDBDBDEF6E31FFF183729F72F6127304780C99B8AFFE2B0F10A08
B666676789CC86163FD7D572DF24DA8907635B6152997D09ECD00FB511E7A59C
686B0CFD9AAF035EA85428566B557CB363A35944FAC71FFFA65C2E2DC9B11A8B
60C0C04069B1BC17C7B6B0B8B75C5EC0976E65F44231572CE6ACB4AEE9B81ADD
6EB76D77DBB1DFDDD7B7200EA3B82B1483E2CB4AA0F9226F288C45B32707979F
23B98111FAAA14671529138456BD0E73F3CDF9856AADD97011A245AF4D139067
1C9FFD431FFA10353FE1928264AE2E4EE5B9E79E8B9601CE0321717E4F743CC9
23EAD3490C0D2483B8D0E3B56A82A44D40AF83797B700C131313279F7C32A27E
7A65C46D47D14BDA4254A680DA822C187A4C1C24B1D7E208A9933B75B720EA7F
928C9C3DC53424D4F58CE423BBB0C9F0E4A63A2C37D9EA4C5AA9245E79A3E21D
F1AC646A33F4E30494E5C9093F244CF141706FE031D56A950E20B18E3F53649B
F413A58DD206A02036AF7EFC13BD1ADC3FCC629D9C5B9A1FE6F3E250C42B3501
8A249C67D4EEC71E7B2CDA31D4E3418403DA6DBA0E7BA28E39E6985FFDEA5778
222A5A6278A68F99323CC72FA86A1BF59065763A4ECE4CA1088CF195B9EED0E0
40B922EC89E191A1C585B295DE17F657445F77912E818A41F41A8BF62548446A
6FE6C34451774FEE4BF1BE852DB0646F152BAA8C1A05016DE8DB61E4C99A1AAB
3AEE2CF010588BAC8D5C3EDDACA3AC19A8D71ABA61786EB7777971BA65C9DD4E
94B114B4451A1DE79AF5D75CB5F19A6236E7D85D3FF40786F145547434C834AD
72905E7BFB698264C50951ED72FF3B5C9CF81EF91550EF71FC86DBACE294AE5C
B912A103F452213EF2918F7CF5AB5FC597CB0B8CD600AD46CA42C64B7DF8C31F
7EF8E187D97AE3362FB81A3FFAD18F7EFBDBDF46FBF577F0E2D275684993B94C
1C651420C4A1FEE11FFEE13FFEE33FE20A44DC46B726F14D9A0C4F39F2C8237F
F9CB5F42C29FC999FEB81FF12238030452D9E02699333939F99EF7BCE791471E
A11071B2DBC761871DF6D24B2FB1A6B9EEBAEBAEBEFAEA836902128F12CB4402
7DF46E28BF90781D284504B418757F14A2EA2ED89DCEFBDFFFFE6FFEEDA3A9B4
11475DDCF2664A191B1D9A9A9A2CE6B33854C340D911F69C506233E3E0E6E7E7
70FF88E621393D9FB38AA56CCAC42977C2A00BB1831B537880047E09A4D88F21
90440E75281290D0EC8C7B8D61D1F45010CA88D6467E10EBCA68E89B1058CDA6
B777BEB2506D561B41A5D27103143A91485495445E130E58A6626359E2D82F43
1242F7C919E19F393794DB0C247D2F72BFBD7BDC6B468FC7AC5FBFFEB39FFD2C
E5E0B29780B3777E67B658FE30E527478C93449BBCD3D8C78DF745D08A460CA7
7512D0C05F718414A4A526424C284D0A0F5FFA8D37DE48E52314BC25A14CAE30
C6E6DCBB913394694ED888619CC5A11446284CA6047D3A742A8746D94A5B022F
8E13889B1F61FE55575DC5F510F4C12BAF5AB5EAD9679FFDF297BFFCF18F7F9C
8EC771E29CE0136DDAB4E9BBDFFDEEBFFEEBBF9239C28572F827BC232129F253
E1D48D8D8DE1FEA701705A30A9165E2DFB69020E0EE17E46D545B3412280AC28
228BC5AB9D78E2898F3DF698DDB50D5DDC0EA530D12B919C32C3206DA59A6E47
4EC99D4EA499BAEFC49A9E0E9CD6CB9601F49238422F36404E59E0C45127947B
2EC900A2180573DCF57C2F86E8BFEA4845D3FB58D1A5C013A335F55ECB907E76
750E522E442E88165D6A2FA71DAF1CA6454D9366288EDD2BB92FE53F75DAA7BE
F5F56FEDD9B1BB5B0AC4812D0F0235972EBA6820FA8E81562654A08B12411ECC
0FD41B35438E03B185C13F78D7CF036A025A2184D9C938A32C5E32CA93996304
59D8D4C6C3504CA148A5065904F393D7A74D447627FECB448A90606887845385
4C90DFADD34B920481B6245DF6E8A38F9E9B9BA356BEE469A4F83F85974E38E1
04541238542204E59C34B2D4E9B288501F7DF4515CF3F825D572921F82B61B27
8932291CB57DA46E5778299C3A5C8DDDDEE7D5E58CC4A97E0CF70852F199FB12
C34DC543581EEF6BB5B37C627C66760F0A7DB45A56AF9E5CB9623293B51488A3
58A8A6E1A10190FCDEDED8D7E5B85EAF5125A7ACF9E99499C9E2D3C6A2D944D8
8D4347788444832351392034414C9A005F6A1C38A807C40A9364D1E24152F428
56C478A37CE419106511AA541AF566276CB5E3A5BA5B6F8A24F16EB7874C45D8
408EFA8088240265A7E07A22466B16D0FB495EEED8434C79FC3D5B0C49BE3CE8
27FBD34264B1CBE55DAF6254D17D93F55F88779897892B186891918626904E6E
FDA40E2040CA9526B41FD808A5F78B8F73DC71C7FDF4A73FA5A49AB3CE3AEBCE
3BEFA4C7A13193FB9B7449322D92243B2ABC8D1B3772DF73AAAB90135D859356
17F348F31A23031C7A1950CCFDC0DE331A2D9511D0CEBFECB2CBAEB9E61A12E8
647D93BD4F99D1DC8388763B9747403F78E3F53E90E85094A4D4C6A778FDEB5F
4F74B390005CA4CF0EE61D62EE45BA1141FE33CE38E3BEFBEEA3EEADB4157163
AF59B3E6D7BFFEB5914111EFE38A96F7F5A8022B6521FAFBF9B3CFDEB6E5D68B
2F5F2B4A8C7069A8067485AFE6A8C304E9088E106D505475337333821D5A34F2
053D9655919487239143E129F2719F9872CA0D5D5AE162E67B03C77D18AA8168
61162B866AF8812FFA62F5DA0F18100429A14E65DFD33A8112425B814003C3D1
70C378AAA76754D1BCC5062592D392652B2D290043F4935406ACA1C5CE5C71A8
E4C4CE125A0C2253CF4CEB19BB563533BAE3347A9D677EB32660CC1EF78946D8
9D4DB629A71210AF14AD1FAACCA7142F32EC280392562CEFA6FD94010545C968
C38B536A001E73FBEDB7DF70C30D547BC88D6CC9B0784D9A8036295E99FD8A84
2F49BDA1F064B3958D1E32A6718590CB8B613EB1D313AAE08A5AD294719F346C
6A6AEABDEF7DEF030F3C4056141FC089794C7E43CCF68875F01BAA37FA0DEF85
03CA9CCF473B13C74A39E694478F400031A2C0178EE88E1747D4307674D5AA81
6513E3F87861E8A38D8ADB3397B5F09D497280AF1001043949BA5D9B72F32545
241AE93AA8B2E88E1D05DD30125E7F34FBC4B044A119AE2F5153805B070D02C7
9605478E7836507531A18AACC5323EBC1679A61467A250B1DDC08F14C7336A8D
70AEDC5D5AAA55CA555C1BBDD44B8504145E90FD397891F7BDEF7DB84B89221F
5E6110903820DA4E3C6BD7AE5D88AF714EA8EE1A2784A037F42B9592CEB464E9
2C49529AD883BD095A499C094AFCA3C432CDAE76E859C1F8036507B33B9BBD19
741D4A6B21FA046E5BC1149E2CBFB8C928BEDCB7BEF5AD8F3FFE3855514889F6
417C5F1A186119B2D3F1570AC972C7661294B42229E83A323282B7A06F487452
9361F61451CD79928B9B8A0068F9B2BB1FB1FF8E1D3B983F9C021E1475601D8C
4322BF19EE705C786429734A2B4D2F6179DA4B2CCA71D828AC5F7CF1454E2248
AAB48369027649E13C1372A2143D4A79A2D809299E7D6D30025126A64A9A28A1
5175DBB1BB819DCEA4E2CC60776151C717676A76E021A2D6636DD21AD966EF12
1E7F3CA3E74E0A21D41084793E6E077C3F6A0F57CA86BCD46908BFBF0A6A43C3
63C45F750883088D5F343E4CC5ACF955A91775947B88C8344C341F6CA7139944
73AF097B20F00D846FA6E929E94243192C968E7DCBEBBEFBA3EFB4ECB699D29C
AEAF6BBAA4FAE974A6B6D42A16B3B5460B65FDFADB2ED978E9CDAFCFAD7E7E76
37E8168E2DA39ADDA02D658C40F5A5C6AB61EAF8150CB5043A39FF823AB9E21A
38E79C7350DE91C4648E13FC1751369A838485E99AA8CE9F7EFA6922DE49A684
D05DC8DC44DBF1AB5FFD2AF42A5DC8FE230F27D187D076C685C45460BFFD879A
20D146E3F4682EEFC7072171CF6D4870CD9F76DA690F3DF410CA74047C44CAC0
C15B72879264A76D42710EDA86D4F28F8C7E0AB0E13CA0DD9F6CD04BCF4ECCF3
90488F0E0EE2B5E37C0A89D95D50C6EDDEBD9B70D9962D5BD6AD5B974C624323
170D0232825018BB9E3B353972F8E1871EBE66943829EDB6E870303458324DA1
1E7543EE956875E9C15C779FDDA7EA084F82183C45C25F510774E308A59B0751
A3F70E4361F24AA28DD0BEC0A3970E233F087B7C733A4206BD871A3490B4D0D7
54C8C9AA114452ACA4BD20DD6844D38BDEFCFCE2CCF4DE7ABDE5A3FD8C36462C
89E4D2681FA311C938D276BC22933A803E24657089E08627E394B934E88064C7
479238E45EB8F9E69B116BBCFDED6F47BB0FFAAC67AFD2B19D3603879538958B
C4312E62822ACCCB4FB602E9576E24871721033359DF40EB9BCD4646255CFCC5
999A78233C92562AEA0944D6846EA0E741C223F1A971C6F05762E0815E7D32DA
AD5FFAD297F02C3C059525775EC3717EE0031FF8FAD7BFCEE58A3824FC978381
5CF9453179A22721D6073A60BF8209E8DB5EF42FEA577C6A2A3E887BCC229C27
C7213B8A3432FBF77E8A8703D1DC139BA403DB6D1C093FA04D002F2FA180BE87
573483ED598438301C242206C1FA6757E550763B3E4976D3323A4E877CF7AF9F
3AB2B57DBE15B7464627B7CE6F4FF518FBED61D35E721450DE75FCBBBFFFC3EF
9B29B3E3B6F1543D1C15494308DF738850F466B30EF8BED256D46A6BA6EA8387
6AA0B770C5FF1923DB0E5A269A501EAA875095D510F56F2C5AD08006AA9335A3
5C2C7CBD2D198291D2F2D1D2D47F6E7FD25035D7B7538A91CEA65A5E4B4D29CD
764B72074483C5B46A648DFAE2AC887207C1C8F884B97B870DB29D56D138FC9B
2F7EF1CA7557CDD4CB2E68A1F46ABDE192659271BF6F20A56310113237EC230C
417D4D7085D026C285BD76EDDABBEEBA8B0C5F520F941140AB3A598CC9611BE2
7664E541989D83C308F2A87E3089AB7EFB0F479BA8F27C3F867642FA1C1E20DB
97D4CF79E79D77CF3DF7D089948E9C2CD6496E191CF9DCDC1CE76D272B87B8AF
1741104AC9835ED781071F7C10EF42F60A5942BFE1BDE075296088AB99189B71
D2497ED12D8F39E618C4CE6C9429928C40A154B08E3A7ACD6187AF42809849A5
29033D651A78A2D2637D30D2946CE793A5839A806C1649EA462218804F88CAC0
157DF7C08B71154755E68D4038A4A8BDCA67843A9041011B43202BA1A1ABA994
D14BDE37244DC74DA12959553145537025ED0656BD11ED5DF41716CABB77CDEE
9D5FAA376CA71B8591E8F72DC5FB686DA47E3705E8F3CA1D5013B06786D8C470
96715A6FBDF55694F2780A558D11D6267D4EEB92140387D99942E737DA04D0EF
5783174721428E45A23CA3341B627D4053E68B5FFC22673771209A340191DEB0
97295949CB3D734854D190F66BF9C2FE13DA66540CC166D0A73FFDE9471F7D94
12EAC93FC3B91014D6A385480604DAA488E5D9A5CEB10AE807A229559F3C45D0
6793C5515121DB15575C71E79D77D243E1EE25394E0FC20912C4560B0962383C
1D573C1168B3C500FD98300B71E8974CC7FDCA414E35613C48DBF2809A40EA11
085231361173B1D39638AF98368ACC2CC42128F4D386E53AAE8410DE52101F09
0EB51050FB2955D19DBC2647302888E4C406E86D580DA1783B50443FFB089428
96A120675A61BB57E20C392303D5D88811E7A766602E9D353B08D464C80EA535
C9A8CED6A4588EE5289D4E054E24DC4A96D6EEB651074825886B90EECA4528E0
7D174B155F1511827400B605CA80AE54157FD19F1A999C5E980E245FCE681947
7315D70D42390D9227BDF3A8774C3F351D4058D7A61BB97DEDD4FEEA931FFAF2
F57FA38A5458CB970EDA11888566D226A06CB137BFF9CD3FF9C94FB8A01DA70E
150042E92BAFBCF2FAEBAFA7F9C4978208E33BDFF90E2E27B2FFF07834D17071
222E618C92243F2718C44CC34440494B88FC51544F4A66E211471CF1C20B2F1C
AC84F6551E8AF206F12970319070E0F80705C36948445F06FD84CEA48B82303B
E5E931FEA62C068AFDE223E0F1F8A4B49289248DE00EE939CE19C5BB73B93B6D
37141A08CB7EA38693383C70E8A187A226C01F2EBAE82204B6E40BC6C77BEB5B
DFFA8D6F7C03ED6F4B58E56DC3903369FDB0C3574E4D8D4F4D2D5B5CD84D08CB
ED8A5887DE270D56B45E2210446435A388232D1DC7B68C3B43F214395464349C
9D38F2A2D8479BA037ADA245B670856A083EC48B44A3571247C608C252A64635
A2A666E01131BE3E358BF68187905F46319AAB37E3F29257ADD66767CB337B2B
73F34B95A58ED313FB2274DCEF248CFFE21EC6D5C6ABE795DE2184C0B862989E
09FAC96AEF7EF7BB9F79E61914A3C9DE29BCEC58E642BF9917C9885729D2E63E
33E465E691704E3DBEEF3BEEB8030531217792D7D0C7A749BE55F250533099A2
327C35B61C4942914143DB86D40C954AE14AC5BD77CB2DB7A0C5FDD39FFE147A
0DAF719DE1F1B81248EE134D13BB56712A38E6C66C1C4C7ECB850EE41D927A9D
21C889C424B8BCACA96481A0097E68AB90638A36098740180AD1FC53410065F1
124D3A9BFFF4579E5836235824D105B9E286ED98837987E8D7640A20C126F238
251F1C97108E07D17AECE1623650363B5157C0FE3CFCDE1F1C339F77661F7F09
76819E4B794AB7F09163DBA9C520AEFEDEAEC39EFADEAFA009868AFAD37403D7
0B5C2DADFAE70482754EEF51D578B9E0A5D0FECF8EE8C0D505338B40D2C52BBF
F3C4B717D3A59F3FF98B999DB3A2B58091E9B471BBC95A5A117D24B3F0963F7E
C34BF985DA776645AFB411809352B006E476909E8FCD5C2EDA0BD57FAEAA5D7D
D3DA1B6EB9E5B6B25D46AD635C1CB97E282AADD092F1E595F1AAED0F6D137CA8
2A0C9EF2BA8AD5C8A595D27CB4EB2BBB85C5125A92FF1A3401F41BBB921B90CB
F8938B965775327783E69FA100055A59139016A72D499CF99436BDDF5EE07EB4
94FF46A0FB605E94830AD07E120A851E497CE3AD3FFCE10FA3FC652846AB8222
16279F7CF2D7BEF635AE95610B3559AAC9255CC949632A01AEAA2181465E537C
4C4A79C76130B6233CC7A959071CFFBE1FE82E28E8C5560D7BA029066E388CC7
A152DABE7D7B141281170C0DA4C7278656AF5E6665B4E1910109A19E17361B0D
11543453BD89883559F121E86D7EAF9F9D0D84BC744D787E542592140F22378A
3A61D0C503A5B8236A13A45895635403862E0B94A9E1320E550521A76C1A8A6E
6829DD34345D55F458D1213674CDC20BBB4124A9D9281EE87475BBE3375BDD72
A5B9B088FA60697AB6B25445D340686ECAEE602C09BD38ED7E69B6BC0A695112
D00BFB1F9C65B4D42835906428F419DF2091268C3A83522199B6E8551432DF91
DDF76879A03266A2374A4B25ADC0194490A8E4626D44A790519CECA3905CFDEC
0FA1F581DF9376813E4F27A10976CD275D90D4EA19CFC5EF519552EC1AE7047F
20070B31A6E1AC22CEA2841C7AFB5CCF42061019131C7BA71A0852B43C1E2639
A75E4982B73E118621F84243256F03677D70AC0CFA6C51ECFFDC2FCB90C43A89
956407E6D7240892EF912D7A9E5EA1D14516664A81E5B5EC4BD9AE66077E781D
803D0A5F981FAF96F6228C2EA4337F59D3A6DCDA4D596838EA157AF0B90E08BC
1415027062C81F7A5865EBB62988B6A78F06FB4518F5E172096D02F82CE4A2A1
A656CEA58B61C3E95CDE850180EBA01067CD465ACE2E745A69DCCAE77FF1139B
CFD8E0C691F679DDD95B2CDDE05633F5743B656B5DB8128AC160FDBA2E8A0D39
1D3BB62B81944BE79A76D34C996ED8C5B737A9E5F76836C47ECE81E675596829
6FBF632A7C9BFFF3E3CABEB998DA04DD7815ACDF218D437C360A65D575424A7F
C4894DA26F4236EF7CE73B7FF6B39F91CAA482419A7C169774304B3AE2854C66
A691FDCDAC8EF43629579BDE02BB40B9CE9F16C37E3556072F958D19FCD1F2C3
8DF9918F7C04E1D1EFB630F6FB7065228D87C0070D9E47087D78419D0AE34483
2C0246AF92954E07B3C380500B550C90C1C14D0F4968701B6081D4A57DD49EFB
B8AE860645F206E70BC23E8F338A451416D6D4E4C4D1AF3B6C70301384DD6CCE
8C83489164427371D803C2A148AF6CBBC24B6BDBED7E48705FD2483665A27CD7
D4589170581DCF6FF97E47940B0B9881978A6425D235D930F17D2B9A2A4BBAA3
8908B386BA01AD044DD1155953408E75530E0D4D4D4792ECF9A1ACE56575D475
D0C056BBB65B6F762B351B35C1CE5D73D333E546ABDDEAEC139AF47699E58699
3EF793CB9C9D4DBD6B70F0E410A063A8E5B2DCEF4F002F2F04A349E74E61AFBE
F2A8F8801637A5C9930D419E74023E9B376F5EB76E1D2E82B56BD7DE78E38D49
4D20F7F9FD79E11E7FFCF14F3CF104BCBC0B1049435284F4C89CCC13F75B4212
FEA5E8021B3A9C9F03890C1C1A15C72418D4E052A66035A3366E8943334338E8
84134E78EAA9A770D173490EC9F43FF9933FF9D18F7EC417C477847B98DA0390
31814F77D55557DD70C30D888C88EFEFA4934EFADEF7BEC7AD0B489D400F7F1D
75D45168E67EF39BDFA4BBD0BB8813954DD02FAB8913157CD2CB4BBB7FFB0FBF
144E842770E7995E5ECF0615A96335C186A34E3BEAB9D73D071BA15803B738E1
74AA25AF2B5FA92DAABE7AADBC1CC6765E393B3E37B5F7A15DE958ED42A00602
44C90329A719497E346274DD7333686134B62C398A0188F4E36188164B971CD5
98FAB5FA4CCABD777499B730B34A824A5B76A1E48D7497799D99DA1BCF79E3CF
323F837B406B957CAB6AB68B8ED2800D91DE91E2BB25C58F1C1F6F2347418C78
CCD045024FC7691706F3F57A67504E3B7E27FA84658F36E15E3097E4912396ED
9EDB0B52305C9BD44199B966E758DD88BE30DC706AA5F11CBD2F5284ECA6A015
C829F3D0D7D3BC6EB9388BDD29C976DCD0033178594227A46B49AA32073B39B4
69E370B3BFF3CF3F7FD3A64DC71E7BEC2F7EF10B0AE41069FC7E5CB64909C06E
12CA4DC26F56AE5C4906F17FCB8753FB68992130A26C313623B86F15E5F1D31C
2639E149431C6C1DD2162673E49501702EE8212E098ED8E3064BF9BEDB2F08E2
36C228987A354A8A1A84E268DF0B0C551A192DAC3972E5A1AB57940672289245
665C1CF04662539DF63FDE861C2C048D05CF8465292A0A4A45D41BC8511CDA9E
D770DD7A10BA71D0C1BB2B6AAC09D7508C681BF501EA0C15D1BF2A1BBAF85517
192222315416659308330D49CE286A0AC44AD6E238AF4AC55A57350C136D9B7A
CD9E5FA8CECCD676ED9A9F9F2F7BBE52AFB763900BF952BD818B209255548C21
44FB22ABDC4091B63437C6213C7BEDB5D7A2004ABAB669B17225173922F0A909
F0E2C3324B07D3D8BD8A10A12E3704DB69871040C095DD53A83673EFD01ED84F
13108022CA1D5415385A8A2D277BFEECB7AF384C4D994854574C16036E00FC95
0AD0B8AC91C35F044F48AC53E530271AF1231C7EF8E15BB76EA589DDAFA98BA0
EC5FB3E685175EC0FB52EB66DCB4975F7EF9962D5B887A88AC6C2EDECEF53E68
2D9D7DF6D95FF8C217A05F654A3087F63F259E128CE2FA3B3C00D11C35F64BBE
0296F23493FBF5FAE0035EAB71C01CF19CFF4E5F7ABE95926B5A084D5930DEC0
A93A8C797069EFCF215821747047DC84AF20485FA206BED9BAB935EA1F3D7FE3
B3D916B40403849681A89E0A4183521374D0E6AFF615DC8B37A4DC516578BED9
36868C4DDDDA620D0F58E3BD7DE7CD4FAD3C696AFAC969BF5B82F60CCE2FDD57
3A6730D62AE9DBC06E8B165AE9A511C7B05337BA9D390F1EE8B593B44131E5B4
96B61BDD2814A49042DD5697D002CFBA7A550A60B33F06C38DB54B82E7274A6B
5EECA5A321DB282F6BE2E314AA796743C319D06149EC1A7C590F3FFC30B3F5B1
BD4B909670FD89279EF8F8E38F73650C2371CAC6211A349480636363F83D2D30
DE9EC95C4FDA62543180173FF9E4931F7BEC31629BC7D329B738C9D4C69963AF
F22AC94945EB933B30FE7768817D6920C469882A137FA5A6BF383C5CC338F87F
FFF77F9F9D9DA50003C50E69004947F4AB2438F162C6C15307432E9FA6E2470A
F2BDE10D6FF8F9CF7F4EC2E188238E78DFFBDE2731E10CCF69DF5853500DE886
8AB85E30C429CAC850696AE5D8F2C99181014B446D85170264E965343E241C49
1988D841EF4305231484149473AA6AF4720EE3D0F1BCBAE70B0791223B8A2A69
2A3EA7A46BB1A6C7C23BA448316E0505BF8F453E9BD22B9F8CE8695102EA2059
92AC879212046A0C3905F29132202C8E4876DCB0DD0ECA157BF79E85D99985E9
998AE7F97F71CA47BFFCD0C3027AA035107AA8374DC324794D9E07E8FB827991
D182A04546E901F80D3970B85915F7876117047B57508AE12266A8C87E0948C0
256E9F422E4BBA3517F4E2CF2B56AC4089C62E3BA66526CF3EE976728FB0033D
093A987284F22FE9BE6415257B34422FE2CDC5D890A817E3F17363E4FDF291C8
718413451D8428439CAC280256EC93653E3EF9151DDFD87147BB9DA8BCF1FB7B
EFBDF7ACB3CEA26921A14F494A6C4D33071F6D5794C5DC7D2CA99FD858664DC0
5CBE49B695DFED43B61D4E08355C63A7C7F278785A5A48C9D04DC3C047565656
EC29E8F9895F1EB97D45DBB9F3977A03BC153AFC590029091E0B0569FE15002F
6AF00D7F282E96ED861A2926C4ED5270E6891F7AE0B16FC58A9FBB2ADBDCD182
FB33604AE94E2B3A1FB4DCF2E8F3D39D9B852BFF8875EA79DFFAD2DA0F7F34E7
E682A21F3B4E3D8C074F5B595939034DFFC8DDC7E73B73CFEEDA61FC3257474B
FCDA0E8CA8B99F1D921B4E1DB777FC1FBEF6CF464A970209771B2D5DB1F85BAD
B23400AB6BF0B128BB5B931EC86A7977A9E91951685893AABAB7FA090F8A9073
869BB72F8201E940B0DB52360EB9DD49B293E6A67548E6020923E8E303260AE4
96A8747A32CE4F4524D4B6889DEF5C4F8EEB875602410A027371BF4F2F15D5D3
C6E41EDA07FC9031CD40908CFBD71A3F781549CD0B92F61417D0E006C79153AA
C87E056E880E899596E4C9AB143DEC3769F4A19DC221749A3462ABA6D7811B53
22E0964C7EEA7F0406C49917A9112862B3D6116B561E71E4EAD280254B017EA3
2B3DA8E5859C16C67B9B6C13BC2571FD533E1F85FB887954D754C1451A3A5188
6AA013C59EA1D9C26BA4E19F640D918F1EEBAA84BA4131225546E5816A40B42C
E8E1819E1AC01B055A188942332F42298C9039A72879D518C5E1C49222C9065A
871D3B9ADEB3B8677A7E37FEBB67E62F3FF2B13BEFBA177A95063184B97C96E8
BDB8108CEB38784D50E3143CE099679E21D38126911607FE4AD0980A46F0311F
78E0814B2EB984243BCB7A12F1241AD855C20C2A54224B1DD3385B947608D18E
52EC81C855D0BE46402DF589B28910822411395EC9CB448C6F84A1E81B5A7CB4
0AD93908BD7C5062A5A6885C92AA6F3F6F49B2CB0DAB3A7C467C0ADA57679E79
E6FDF7DF8F7385C378D39BDE44455B780CD5DF5375182FAFFD0262CC204DEA24
ECB735251F118D8DAD10DA42A841F1FA34C3D4BE98ABFC78CB9195C065D8AFD4
04E48ED80F0C413FA7F0B7FF10DAC5C11F7DF4D1CF3FFF3C4D94DCABF10D7443
AA37E234C07968D2467067EF84B5BA5A8E33FF38E0CCD84EB13974FE9B42352A
ED7C69DBEB5A47CD1CF1DCDDCF83AF1662FDA24B2F7FE0B14776BEF0EBA970C5
AE5C05CEEF643590EE82F4E2E83CB4E09ACEE8F8F0FCF98B3979A579A9BDB8B4
000F186FEC4E6D8FAADD5CD709C2926EBA66ADF3FFF1F626F09A55D59DE83AF3
F4CD77AE5B23F31C7D4693483486BCA7A6CDAF8DB322DA82D20E08C101111144
5110D0872809C6101134240E4934C4D6A76D6BDAB48808028550D4444D771EBE
E97C671EDEDA67DD6FD5A94B552524E9FE7EFC8A7BCF3DDF3E7BEFB3D7BCD67F
BDA70A1D141E45C0F9DA0A1C74E14BB6ADB6BCB71F3213086F0334393C139CA6
79FEEB2FF8D65F7FABBDB8E639C11797BBAE563DA3F7F6396BB23DF80CD8AEA5
065A4FEF4D38D35A3B3AB479497F254C36B61CB865BF624FDD75C90D6FBDFE42
181627318F8361091EBE2CD66FE825963162F19571C351427225AB0EBF825FA7
EA5CD64228EB816816AF201BBDE8A28BD02066305A2AA939E18413D03C2D3B21
8F8F12CFCA1323379475A37FFF07C524C1A5E0DE2245B3D9C1A624A9955CEC89
879F400128FD9450815FFDEA57A3C975ACF97396396957279F7CF2739FFBDC5F
FEF2974F3DF5141E7EE198519437BFF9CD5FFEF29789CAA84FA524FC2DD21AEE
74BE06E49915F3A0F8242469822F62F3A689B3CF3CED9453B7E96616851E7233
9DF4A95862490085264B4445294361F1C175B20AA9A0A62F2B421E884E34619E
FB908539C49ADA5735C530145324886668161016A961657842C4AF0AF2EFC2FD
9A89424A9C69142B718CC2400A93388865C86B8A54B72AD3A80D002A049A6DEA
F53851E6E63BB333CBFBF72F3CF2C863610C9DB69B664365B9E278AE78D9549C
C2BBB92E8A08858B9C8E0ED5BB13F7C1F7443A0EBE1ED2D3F94F78E87143C817
290FBB5D72C130173795B35A4F3DF5547C55243F48945291140C1561FACA8517
5EF8F77FFFF754F94C4A68B913E4D0B9A7AE6364ECC0C179D2FDF82B17E5B261
CEED71E019453AC479297C47E284586A99C6D076C1834BA7166FA693CD25D014
1F2E4756CAAE2D92B2B4ED575F7D35927439A2C574427A1F1527D3BE31E60759
39CC59884770FC705D32060CBD432C09CA59A7F08C9AF37FF143F206C79C9E9E
C65D95B843A79A40509B04BF2BC7FEE71B10A5E6FBFB8101CE27958197563F26
6F85E9EDEA41D4A6A101E60510983A7C398259192CD376BDF1A9ADFB560ED515
6DE04315FCF69D06EC91949B82711DE603A87F664367B65757DDEE491B616656
20C4290EDCDA850EF297C05437367A0B79235EB8BE0EAB5DEB63C22E119D06BA
00B742DD9EE85EBEA03B5674A30FB9A1A9A26B9421EBA11B99BA15A7D1E9A79F
BE77DF1ECF8A2796F2E006ADDB49E1D6B812830C9B7AF6416A262CBFBDDADCA0
AF7C7245F4EF759A63FDC8B5040A3AC13F5069056D4EB9771E717072EB13A809
BF353AEAA40CE1CFC8B0EEBBEF3E3485E9F4E231C6B38A37E4C31EAB3074E6E0
AFE40C219417AA8F61B141879011768F93D54DEF914D0AF88FF30B31A766872D
AE854096366FDE8C6B24D2C08B37DE78E37BDFFB5EDA2EE23CD4FF0E371667FE
BEF7BDEF9E7BEE610FE4BA0FA977749E39831CC99341302910422B65D42FD173
A538FA421808941E410C680A10A923FB2E1C64326CDC387EFAE9DBB66D991E9F
6826A91F85032422A56061B6D560AA6649403E5996017485A23A690E9A227659
913309521902499414A4AAD215B5C786649A4212189A881628A2578DC8A2C09F
350514811E24C9851229923462E4AD6A9266411A87910279156D8266734B81AB
A7E7124A1C5BB404EA04AB2BBD5F3FB1E7D0C1B9877EF9B466401C8169393431
F230A2A14A290DEC892B03E2F399A314054A11C1638A879BA361C4F8E8451278
27E7BD901ACB87920E3D315FCAF1C201D12221772105A219A110393E2A0E482D
743FBE17340E188B82CBA370047C0AD5F752D88D7470AA36A4202A314A8A4195
7BED52974D6AEA4B10A47CAA58C5A65802DA4654714247199F85DF2587159E5A
12FC175C70C14F7EF2133C6164EEE017711514422CA740E443E409CEE7610981
A7162786E6C5ADB7DE8A73266305F799AA4F3FFEF18F7FF8C31FA603C67C9C1D
41EC2F12CA6C9146220F7B671EAEA53C3262CCD2681D45FDDB2A8CE0C8320EFC
B7A6CA469C1BB6BDEA49E1DB8364430C9F5150D5893EE89B4DD03E0835989A6F
B963ABE9CA195E7C3E4CED9998BB776152DFB412AEC49907895C719ABED7BFE6
63975F77DBCD809C373DB97DCFC3C885ABABD057506018A2935F24D9578F04FD
20BF0D6A9A338803435AFA8BEB3F7FD5A73F3AEFC6C6A57AEF84015C95A9A996
5C1F3663A37D4DAC831D7DCC5590083F2D3A6A8559B75AADA0895CB1ABE4607C
C39B5FF7A52FFD0554C6C059925E0D4DF5B4EC2B07836E94369A7967511985F0
E2A206A26FC1E77D98AE588B512C4749C15B280B1E8EECD74D8793FC90E4A3E0
5416EE9B4D805794DA80DC9F22CCD42384B8DB39E79C83E79FDE38657F328829
BD022A0BA0AC628A6FE1CFC86A29528DFA164A293C6314B778E687B39CE957C6
4779B618A5C7FA507103C72D8899C0B08D2B79B13EF6B18FDD75D75DB881E598
139E6D9401D75E7B2DA7CC1DFF1C9200C01DA3D40CCE19A1681F0DC2994B8211
15879E4EBE52C00A2197540BBE8334288A1BEB75F3B4D34F3AF9A42DA3AD8665
AB61E46669A8EBAA900401EA591AE98C0CBC43060195D8901B9DCBAF840F2B97
8B3422819222C085F248C6532C678ADC115E2343D235D08C54D7B23549007D59
C1BFE6BA8A9220A7B2353997052C3BDA04A92AFA1BA4492800B5AAAA5C772AE3
42D196B530CE935495723B8A70C7E3A7F7CDEFDD7368FF81B983FB97D132105E
A038D34D83FC21E488E74AA8323BE06C48283C06A432B054A70FBF30D6EB0524
40216350E0E3CD8419CB99E994178C6F88FCE694C2842CFEE0C183EC1A62EF79
19F396BA23F073CBD9410C1547B28A3B8591A5990FE1B1B8BE17865E14BACE41
05FE81BD58449678CF0B5EF082EDDBB7A340E2CA1DE2DD5CB943795624F97069
A4A951089A20FECB7944EC286376CC6C144A5D1FB8C930816D30A235DE76C71D
77BCFBDDEFE65C2612031C23214710FDC0CED3676691F28B66F7E65105C3BF46
1270863845AD891084A713627712A0732AE44F9DF11178E22679DA6BCEBFDF4B
37FBF029D4D015334A41AE24EF71C05E4DEE884132EB3D3303B75F4FC095EAA9
E957ED4A3F5EBDD155B38A724DAF626E5A09D25A36EBC2A4A1CFE3BBDC146973
1F89131D2A9F025786F1B0D28568BC211D3443397C4EE63DB2ED7DF0F4E7E0B4
60EB8EEBF6B5D4D6E07AA499C8B8C9F7BAA2ADAE80C4D7A2244E1DC389C33881
2483CCAE9AB22667AB2DFFD603F559E533E7DEFAF6575D06F908345736F55003
33963F65C5F9A07953D0EEDB28D4908B045A2F570DCA4B218C04DC10F23F94C5
24D994A79D76DAAE5DBBA84E0ACFCCBAE0131D09D2DF39C6861F3464A97890EF
E73E4B44324C50D4199BE0E7E8C0139D5246C671382959994C867C5CFF432441
99768899D0ACCA763CC7E4E85FDA4FF256E15E115F3DCEFC29F19D0D1A3229CA
E03494D1CB78DD94962D5916BEB9B00809981BA7378B3E3852426E65D4EF4D4B
1B9F689D75D6E91BA6C6AA8E859C3A8ABD2C45335F5625B198204A58129012CA
213812D4445744EDA2125A12C21019BAA8FACD918D07280C728865D46F54D055
1400295A0E142A101E21CD15024A41A32117456745BE12ED02B2E534D5441669
9626A262A1262B759161A48BAEA2BE9F4609CA1E34149C3CD3BC207FE457BF5E
5EEA6DDFBECB1BA4DDBE78CD1BA7371E9C3904A5244B1866F2509319C6C12779
408A36EDE6873EF421DCB29B6EBA090ADD04FFFAB5AF7DED8D6F7C232389AF7B
439C224DBBC1B284C880D3E7A9EE697A7A1A5F123997CE3DF7DC97BEF4A5A826
903307CF0D2190A052C3CE74946433333314EF2DE70B4191E143BC894EC6D4D4
146AE879D1538C4CCECF7FFEF3D75D77DDFCFC3C516F5900B08388A88E4A3449
B433941B3D88DDBBE402221B9F760C86B5DC14C36065F999116318A22711A7C0
25DF7DF7DD94BD47328F223A380736FFD1BEB9E69A6B489251E483042AAD7D5D
EF0E7611501205F7AD2410112EE22FA37150A893EB18D8B2A10C08A2AE32561A
912EC93F7A1775B01CCD598E3B91998005A7BCF58C056D71A0BB0D7F6AF98B4F
BFA871F2C373BB06DBC0F84F279C94B4767CE997202B2C5F095E899E183AE109
6FFACD85D5FEE0BF3D65C7907A481A6A8C2676A62566001538FB7567E3FDFBFF
FB7E5805253646C1F6C0ABB7460EF567A10EDB5E7FF2A2BE1457222DAA0D3E3F
BF39A877D5B072C9C67967F59499E9E8AB8B4FC31AF8CABA5AEB742C1D7FD969
8A599DFBF683D222E839D8D5CAD5D77CECCAF615B2230914541DAA59B5B1DA7C
CD6FBCEE73977FD6491CC21161E0C5E373D272861BC9807BEEB9E76D6F7B1B29
5214FB61A7E23A7649FA2CFB36E95552B4996884CABF495B221D82CD593A30AC
7F1C4B03E02C922F7CE10B78D250D55857A4C9D52AC4B2293F951655F6071004
24DD8FD6FF4F7FFA53EA01CEA7F4589283A8034D61B4067815C7974C444DA4D7
520E1205C0499D82A17DC3095D6B0F4285350CC9D14C1218A78E0BD3500C2063
6F34AB1393CDB3CE3A737C6CA4223A0AC841D8F30783348B55A19E2BB2AAC1D0
27CB098EA48B91FB851E43578A84214D255792C8E08C0416691127903257E8FE
6AA6A989A22299096180E42F2B3D55B88462340884249004E8EEDA191599A346
2E2989849200FF5251D486A1A202AE2385F881005CB1AC11D36A28B2EE07F2DC
ECD2E3DB77EDD933B7BCD4EDF4FC5EAFE8C15BD02DB178CE5820E645294FA411
E38750E909F9726565851043CB2F800C2E0212219006FC956015C8E6A5F7C7F1
316EB5414A01B3A432F035699704B7801360773F4583E964E0C5E73EF7B9FFF4
4FFFC4E712B912C5C418D1908F051F563AF45FFAD29750AD665224BC0472A794
7BD3738A2AAD942C0F3C49A8D6A10D8BE614157FE1CDE5A637D45F9376836506
474DE421881E51116E02EA7AB46A69D86B9E9A93706E156788F2F8B86F8CEBC2
08A9D4C7832C159664CC3EE845D04E52C769C6A3A6715845A510773E6C6BC36D
1EB89307DD433E2E2ED0FBABBFFAAB37BFF9CD44B1429FA839116E489C8B544D
1508F9074582340EF96E307DD4AEF49ED215681378164230A4C34E64CA10A325
380D18E0FFB7349D1E5CFEAAFFF2F92FDC2139158119955B03A927C20C661110
EE8941FEE4EDEFBFEDAFFF4CC09566B251B5C2415F3C7A0CA05FA490423D6C9B
69BCA24C25690F5A53CDD55DB102BE54EA19C06EB44CCE44C19A29C342861247
96542F87CD279E38BF67975ED573531EB81E3ED1CCB47346CE995B999F55E651
1833163FA10AE201388E99C56A32A56010C20A2B31541D06435F10A7F3115971
E637E9192430884733323CA5AB411184C093CFA5A024F5C96745F62B1EC2B9B9
396EAD5156DDC86F43010FA4741C13C5D5F7BEF73D0A6833D835174690A82019
8053454A4175EDE73FFF399DF617BDE845DFFCE63719520C953CF2B21E6B7390
D6E886B4E84F8E6475FC3807F122766B1309BCE52D6FF9EE77BF8BBC8B85BD5C
EAFD2715D5C56BCC9A604470B9C89AB334171182E9C699679EBAED842DD5227C
8FE2C1F37B59863480DA3DD24FA0C826D7B0912420C71C17F2B0B77D4D48009A
02850D5E541D6468910A6CEA4415E8409EAC79921C0AB8511DB5E654D590F662
4D2E0A0B945C80D641224B22862C694A962A399E50D9C91543C0E2E9C209A3E5
6819C505685DAEC896A6376D73C4D06BFDC46CAFBABB77CD3CF4F08E9D4F3DBD
BAD289D752848E69643103856139060E4FFA3B656D52AE0B31DCF7BDEF7DB7DE
7A2B776EA1283F9F6FFA17591BC51238CA7AD96597E1B748972456CB02609D7F
9F380B71E772290337D7E542078EF7AE539DD88BBA67CF1EAE6263CB1D0F0A3E
0829965472C665E302BAE39031999F65DF20512F29D4DC4C953BDBE0B7F834D3
69A1DE7050AAD326764CB030E4ECE2BDFDEDDFFEEDFBEFBF1F86F81F43149335
4BEB9DEF7C271A675EF1816190836C113AFDB49FF8201481F7DE7B2F2E19E910
978CFA1105D289CB94B3AB294CC235C9381AF214A44CEE8946EF82B0D258BF5B
931066D159660072AAD7352B89FDF1D191F9E5995C64F0CB2393A7DFFC89EB2E
FDAFAFABDAEA4280A2C218A956A80487412C28C1A61A04838AE365A11E291A9A
C09AE5E629CECCF051FC6B83C4B3EA8EDFEFCB9236511F5B5D5D411B42ADD7EC
D474177AF8DC3C16FDCEA6C7275EF6A217DFFE777F0BA6F2F257BEEAFEBFF986
0959475242431401E6431C2D0EA5E0CF53B93C2B896A063952AAA065BADE476B
1E59765A436E91A23E96FAA06450007B69B693FB2E67B551F66099FC8F7A7E38
4FE1991E42C6AAA28A302895C5B01F158FF4934F3E490E40D233F0F0105221A1
427DB2F850752763D551362A0CD32EA100BE3DF3CC33FFE11FFE815324CAF32C
A72C53570F8669E164103235B8EB2DD102B391B2CF8AE04B29C44D2890C7DA1F
94649B376F7EE289274892517AF4F1FB9D502A2D3EE8CE3BEF4472A039107F26
2A63EA63BD4D629F29978615B55BA23D0C4A02CB866D5BA74F39E5A4A90D138E
78B582498511DA6B28BA5594044263CA648E01902545B4CD27A99C8B82FFA25D
2B9E95486BA9A649885C1B4FA09626B21A2A9AA70ACB403234D0CD58D5D1F248
F1579DB248259423286C7359121DD1842490502973403641AC14ED016448A8D5
8AD39CA139215B8656370C94049558A977DA83DD3B671E7A70C7638F3F353FB7
E4A3D590AE05498E25096068CDF0EAA89A1A5F0FBE572AF3A32EA0286FBFFEF5
AFC330A185BB6E91C793616699B3946D704A59FBE0073F8852819459D249C9C0
24FF38CE87CA0EB9AB17216EE2E3C805BFAED1423980C9E444EC8F3A37E17564
B2381AFE4C2A18F52BA5D42096049C577A1C494039D75CAE4C1E7906C0A0EE69
8400C179A8149829D7FBC0D048A72F12BD51B2047990089A09EFF9C33FFCC31F
FCE0071424C771F022AB3FF82F05C0E99531340D6F7519FD18F7938422D73FB3
3D44DB4E8C83D2586915640A2021BDE4252FF9E77FFE67D47CC93185D6090A12
1A87D172E8A1B621276186A6ACADD4BC34FEC4B5D75FF5898FE6906DD2A0A7DB
1D3F5173B59E7B12041D90934ACD4A4342D7610C3BDAC6A9D0F41BD6427FD548
3313D4D436DC60806A9589FA5192E98A99A4990A6A73B43EBF3C3B3931BEBC32
9F0A6846F15C90B41C1F007110FBA74C9CB87761E7ED7FFEB977BFF3BD1568EA
92DECF3BAA8D2BCDF97CB2EF4EF447046759CA022971325435124FB40B76D228
AE55C075BD2412F92676DDD46A4A7B69001590970497C03376C10517E02B4B05
22BD4FA521C73A3F9CC84E6715F55F7C8324FF887596853DD123A12E53351907
24983BD39D5CCAC32E23725D90EAC6C88F0C8A85DFA5C3C3A2AB0C529B1715EC
78E44837A263801444EE29024247550FF9C03DF7DC838BC55FC974204B1D8A28
23CF9C5026717A975C72C99FFFF99FAF6BEFBA6E7FC86258330D8B1CD0E3480E
6E5740791994A44E0200451D121DCBAD32ECB1C47920504A3F224980876C64D4
3AE5E413B66EDB58AFD74C55A47F16F91821CA00DC4F24F9C2FFB366169116C0
DB478B2FDB9BA4C9861020BDA0311047199E27A1834001EC9CA218880C3DD674
516D80AA36EA648A8622974C04056D001975932C06D1CA06751053B448C273AE
582806D06A504588D1409D48A22E65E2A55774AD66680D457324ADEEF6E2A7F7
CE3FFCD0CE5F3DBC63EFBE83855D96C3B1DD9779093D82D134E9183D1336991A
844129A78D933BCBC5BDF845FC97380B9E1B9C031E1A525EF04F975E7AE94D37
DD445E4EAE9CC4B7883C8B90A299A1131F6454F432A4D73A49409E1CAECB2705
0A8E44EBC4A38CB7511B556A9BF7AC248134EC180C47F6AB61740AD2F109681E
AF20A9FFC11FFC01EAF578BE298F8D76809541728CB0C2C23F90D70BB533D2F1
F122A957E43262271B8AE437BDE94DB40A7238307A010CFD5DECEDA5C20892EE
F44EB9A68F6245940540B9F09C3E4BBE41FA2E85226EB9E5961B6FBC91564184
BD8668529CA6C9B1A9D9A5851832D5D2E33800152A923AF0931CB4BA5D1978ED
71B4ED42BFEFFA90AFE9C56CAE118B5490DD8F8FB8BE2BF7FD9A61F6F31029BD
62A80112BE27BA162BC2EB04959ADD71DB535B46DB4F234793EB95461BCF3D64
B92AE1433FF0E10F7EF6BA3F9D18D1FB2BAB96ADF5F36A94CA10754CC0D10FA3
8CC8A5EE8F06C8A1A1421A2909D88ADACF12B4A2D10648713C1123D02A52D5CF
43DC59170668B33BB668D9883B89E7B9DCF8E5F81157D227881D518E5CB99B05
0548391E43185CF4456A1384470BF92FE9A02447CBAF983B26952501CF871DDA
FC2BD7AC917B87AA7CC92E24968A93C4D551A90423BEE1B19C9F9FA75F9190EF
BBEFBE7DFBF6B17BA0EC27283304E4F278D2086AE9A83B832B7AFDEB5FFFA31F
FD080727CF3E7B508F7A3F729557BCE215680D107A2B9926D2B0D319990B3855
9CE4F5D75F8FDC862510CEAF2272848A8FAE8B76459222E782C5C086E9D6E9A7
9DBC617A1C15624B5387E67F2CAA63044585C56372D2BFA83C8A5E060383B065
C0A1D75841E24CE3488A454D6881A6291A92656A1EA2816A986098AAA9199A8E
93413338D454813BA4E9321A21B2E89013004A803C4D62240D01DBAEA826727F
341344A4CEC0C359442C44E99AA9A88EA65464D5112EACDC09FC7C7EB6BF7DFB
FE871FDEB173F77EE1204A8F593D54AEA8224940E1F8AF7CE52B687091B382C1
3D58CCC2B0C28B3341F96071AA036D11D72B90F4A611F81E3AC465487D628E77
DD75172AF5A4D552A90E8E836440DAF45125013B34F834A02E83F3C71FF060E1
77A9D887DA02533BA767EB1D2AD339FF4A64CC89B3E47261C9C4DE153602F8C3
AE00BC8712DD883B739C03862617511D6D17D755E20F9FFAD4A7AEBEFA6A829D
A109703F1C4673A4F4734E462C7B54B90716C90F4A88A4FD67B589B1EDC8ED8B
D7CB8D418E281EF44301AB9567E419ADD70CB7179A260C5261209FBE79F3CEFD
075245F8652DC7AAA4F2525F9404E2E3A8250ECE84BC0156BDDAEBAD82A94F57
1A6FBDE0CD37FEBFB73AB696F7624F05CD90622F6F35474572A19235C76AABCB
3D71E22A4ED4EB6ED83435E8B67B5D6FD3746366A693E55AAE169D4AABC6A01D
579C7A26055EE8A369B2AE7E6AED57D4ABEA0E049EE4E7554777F3084970DC50
16A55432EDBC1FD5AC56BF375015BDDAAC777ADD2C6AD31B643F21C14F1DEB08
D15FCB316AD47B3802C7110228E92E7C9291A3E139C1BF1222340793A9F925F5
38C3F755F60EB14240B1FDBC04968ED484FFE2B1E4D03169B7E5B616641FE017
D182BFFDF6DB714C0A17B17788CE3C2EEAE52F7FF90F7FF8439C241E63A5E831
4EB0BB94582F975A4372E1FDB1E88B312569FEA836A1883D56E5E3E5975F7EC7
1D777002210CC3752453C9C785BB47B13112126B1C0F2DFBC287A517B10E2D8C
62A1260B0E059BB74C9D7ACA09A3634D9C80A9AE79A851B324EA0D428FAC5752
51713DB811E4F3A53239E9C8D6D2742C22D91592208030889078A5A22F8D24E7
9A842F06842410499702024BD702450B343DD415B9C02042BE8FCA4D9CA5C29B
84367D2EAA0B709374D194499C2159D3945CC593875FB774CD91554B911D5936
5167F57D343CB54E27DDB56BF9915FEDFAF5937BE717568A785472AC17C0E129
D27939D1853082081D93D4557262E0CF042E583ED68C9149A62579BA91415038
1D7FC03920DBA52665DC850E860900F888E73DEF79BFFAD5AF70EB28824A5FC7
919109A24271F6D967E36B7EFCF1C78F1527A077512EB0620F3E110325C95064
BB8CF4C9250BFF1A9B605DD1D65A76C0B05A9B7387C84EA2C9E44756ED91539E
2B0C18758BF0EF700E78C0A89B39396AA054484159D2A44BD220948DCEE2991B
7052CF32CA4FA72E40575D7515AAF3C8C7CB49BA94588C3A5D5E42A62C0FC5BF
52109BC0B4C9BCA31417FCCA5AFA962A5BF586DF59C5538A6A0B2A40D313A3BD
76A7074AB36AF5563A9AA546B22A585C10A0E63288D6EAE948712303B16082E0
4C8C0C563B754975233F55E1B433CE987DEC891E391B0195A3048A6D5724F9ED
6FBFF08EBFF80BA7D91AF43A10A39E218B721BCB46969D4B60B75A3D549C7D6F
6A7C74717E19B57B5471A36E4F2EB50D389C4823A1B121898E200321BC525D44
BEA79DEA7CBFAF6BA80EAEF5E4343459D14C17D597A1B98C261ACE8562FE706C
9B80539979575105FEC637BE210F7B13512A07A9E794C18C8446B909F81E5166
704B6DCA534A879D54F83A912A3C23624C8C0B0A33B1CC58CB5973EB0E36A54E
E038783668BBC8A9485A3F2529D081C1F38033219397C2E6A4B5B07F92BC26E4
C0A4491E757FC89BC4889954814FB037C7A24782A5A19A21285542E034DEF5AE
777DE94B5FC209708712DE7689A017C6C644BF4DDB411A2BF456159A0D7BD3A6
0D9B374DD51B15D18E589259C89360241798E82659383170A9E4B9A62C3A8650
6649B096A4012E3273B43CA230CDA88C4BA6064392AAE586A9189AA96B569145
2A2481A186A2F65845FD3415E5C55924E589084E8980AF244B2A9DA42C8F04A2
B526E572A4EAA665D64DA3AA6AB622C400FEA70C7C39490D6FA01D3CD07BF4D1
030F3FBA63DFFE59D7F58A264FC76470CAB01F3A2F040F011D6E2E0D23E64EE9
3DA44A97B32FC8E14BFA3E6528B16CA099D3FDA45D52491A859B58A7268C2362
A66548162E7623C7E8B12401C5BE18798A4E0972191CF61DEF78070CB3A4C8DF
45DE79F650932FF55F6913484743F1A49340B6455975A22550751BB3544EC0C0
1BA8020E7FA5F27A02CFA04188DA89F352092B49114A19A26DE47204CEB68242
C1246947E44792956E103596924459866491FCD11FFD1101A332C201497D46B0
218D92F83ED901A42D96AD3AFCA1296B3E5AC2B2E265A9A41B1972CE04B44A4D
EE7B464DEDB96D59552A6ADD1B0C2A8ED319ACF20B65B428DA90A81B44825C33
1BD458967C477DFD6B5EF39DAF7C15F7B8D51C996BCFD75AF51E8AB15C6E9875
3FF09A96D2F15DD1A712C50F8A114991CC4A1E446A25487B72531B35ABFA6C77
3F98A044AA195706D0E12AAAB2925E932BFD2C7434338B8B098CD4E34EC7107F
ACA0C298AA519CFB60009AE6E90017664170D8DD07253DFAF89550AC76505605
6E234965F27FD280E41BC4BF721A1B5A0F149EE10468B2B0E948509C80B8108E
4CEA309D6DC64A816167116EAE476F96DE663AEC5AC1F9E594DAC021E5729D33
B5A1E7B746670C353CFC3AB2D6129E5B4EABE3ACEBE37B7B3876CD78DDC8828E
D397982C21C63EA103CFF8B8E47E603B8698CF5AA880AC334E211746449A588E
B6616A6C7A7A7264A462DB968810C4515194BFE605C69D2D2401DA4112711992
042406D6D90450D232D24C04B5D348F8ACF1179044A35545865C1058AEE9AAA9
E2E34C0D557B23444960EA42A3110EA2224E5074BE4C50C1C9323C0AF210442C
4523218718470039D40CCBB6EAB6D542F3581551045D12350728BA91C39A0BF3
D1A38F1DF8F9834FECD8B177A5DDC9D3634A823256252F8480C5F15FF2A7A33C
20C58D3690B050F860D187524839819D1458D2D3F15BE493610D421D766F87C2
074A5E11CA69A18217669DEB387E39ED1A86862A295394824249EE6452B0B642
CD9E18FE059783178981BEFAD5AFFEBBBFFB3B1C901AE9E0F89C744FE204BF42
D6EEC5175FFC677FF667B40304A4415863B7DD76DB95575E490E771CFCD4534F
25DB853DB36CEC3F131EE33FFCC31BC54A1941C531BD715B1B18BAB0D67D913F
1424A02341F038B42D1FFFF8C76FBEF966DA31600C0F49D32D33F206AD5A75D0
EBD60CDD0B2359349829B24A7503F929441E723B45B3E34493F3EE51AF6B723F
064D606E895EAC31DA4A014A16BD91C5CB71AE82654314564C3918F89262DEF8
E9DBAEFEF0BB73D58A62E19892211E6FB696DAAEAAD5F26425958D34CBD1E8CE
02176923574CF15CE8298683F7D79A8DFECAC258A3B1DAF3934C53C115F3416B
3D0A475B95CE4A1BC7CF7253CA3ACF6AFE6BD7355DBCFCC8D390059BD524D5A7
27AD83F32B89704E28A9DF57846AA6E50237A39716F78BB625B15F180E4692E9
A6EA0589A4D5EA5914E6A12BE762FC3046A3C7CD1514B492AA6B388E81DC3F43
FDBD15058BB42E94A2069EF128C9251D24DBD27D374891852073C107ABB9A418
157C6EE8CD3FAB75E98A8BF3C1EB15C70E7ACB35CB69BB013D57D6ED58C8EED4
D1F11B22330CCF8BA10E7CA460DD9025986C5516E716EC4AB3E7C6387FCDAA36
26A7E60F1EB8EEEA2B3EFBE99BDD10254D3D4A573EF4918F7CE63337A3389204
DA1A7CE883577EFAC61B32E998DE24A22FB9D4B483E413711E32FA49E13B0207
8CE369308C14C5495C6F3ADBB66E9CDA30EA08DEAEE8861A7B841BB1D6C61D95
39B20990F996250189010E17F3E7B0B6286A08F2A2A9A52813C6396B2A0A0329
5244D5328A1C0D0D02C944FB4037D026F04D0D65B2C02815FD2C8524880BF4D3
0CB22EAAEC85EC453992C589874C524659A2C5A651B19D46C519D18DAAA63A45
1D9B9AEB8D3C35A3A4BAB4903CF6F8CCCF7EBE7DFBE34F2D2EAD0CFA476FB154
4E9F801282318A01646D44EA9C8C451089C867294782F505D20BD8E10385E398
4A04F12B9B366D421B13F57D64A39497463C14390BA150D05338CD060ACDA88C
37520E069061C10D9B4859C65776D555577DF2939F3CFBECB3B76FDF8EEFE895
AF7C25C1054BC32E8CA4298BB6A385379397FFFCE73FFF17BFF8055E4433FF79
CF7BDE77BFFB5D566148CC505A08144DC691A5924AC5ADC7B83219177BE18517
DE75D75D9C60BEAE33CC3A03FC7FD387840D474D60E8D3E7C412A5D4816E9DC2
C53A8D54EA5D4C1F5A2F0969D4675142D0CE93152FDC50922E0E7B86EC5ACE92
0839833636120FDC5A12F70682010ACE0E9926019ED230556A4E7AD4EB0A8476
B51A2479EC8BFC3A1019A4BA1F4B961EFA1198957AE47B48578E21F9613E3EB9
75717E9F60AE869D840112DDBB2FBEF0AB5FFB6677801C27540D2395D49A6377
5697905053D13DDC38EDE4891DBB0EE07371E955473DEFC52FFAE93F3F18C438
E755DDAA777B039CCF79BFFFC2DD3B9E9C5FE844997AAC791EEBBAAE84C2EF25
8C7824C8089F1BC552023ACEA7D871556C701E23F1CB8ADDF392565DEAF423D1
B7B318C7D290018BF53AA220DB08C284AEDB3A72066710E4A6EEE3BFFCDCB1A6
E35446F61D5C6C35A4958E8FD72DCB0C3C17C799DAB0F5C0CCB28C9243D665DD
4AA330890245A028897D78B6EB1A69C85665E4D0EC02727C94AD790CE313931F
FDD80DEF7DCF45C8CB122882AE49A40870B3E7BCEAB56FFEF40D576692F9C53B
EF7AE73BDE8EF339EDA4CD3B771F00D93650770A81C6DFBC697CEEE0BC6E987E
2429B26845D9ED778290B07FE46AA5DE13502EC79404643D50F06FEBD6ADC8A3
2871038F3A5ABA5FFFFAD7D9022BF76893D887C30C05C536F2C0E73EE79CADDB
36E1BB719C22B13A0908588668982C3E8A43120B232EC6B1E202B35A660590C9
2949A282110CDB754AF990C628B22F1560A5A01425A522E06E256834085C5225
5224B40F52594970507C0BA2E18DC86812AD0E24399101CD8248D2047257B5DA
74EC86A15775CD12A163458DD4BA6E34DDBED25E81EDBF3EF4B3FBB7EFD8B16F
FFBE43ED76371F369FA3A01FD7C7521497AC2DD4EF48C5E68825AEE2FDEF7F3F
773262606AC65C84C255CA75F6E5E08132EC69950E5B1741E11024E732AA99E4
0CBDEEBAEB2EBDF452E4D1340815D61E4B57658B351FF65526E403CAA861C73D
A57BA2343AFFFCF3BFFDED6F5378A05C6B86CFA534708EC7E2D2262626D00C27
C02CFC133961CAC522F421E712E9C214B523BB07C7C7C9CFCECE723ADD3A10BA
E358C7FF519FB24D4039DDB8ED3831AA2AE264ADB256540E7B309E0AA1C3528B
4D5A5D3E44CBA0700BBBFE90F0D04AB8E28A2B84BB4FE8815AC31E71BDB008C2
CA893A27789B69485216477146A783F6E068D7058B88C59F3453C9B3F4431FBA
F4864F7D4133D4A9E9FA81BD2B78BD395A6FAF147D800D6106A44986967D9AC8
911FE2D7C727ACC5455F2A52C4B3A8607BC5B0684BF8816081625292F801C78F
C3B4D952DBAB22811014A8D56DDF4BE2201A9F74161706C79FE7F1AEE3DC8407
42B4B4121F196D2F3DCD2311D6336B8341CF1F0C55D4BC988FD0F7910C713982
5FE5850688D747C71BCB4B5DC350433F3E7CBF56AC22035913BFAE3DB718C7B0
70C750D2889A8AC3392252F15F3126EE49B58A2CC58842C91BF8CF7A5D39D49B
0DE488FDEE006D13BBA2BA682F15F3A77D6EB450378F035F4C46E09EF96BD7ED
0A7803D8B0A9353BB38A57705DBDAE8FF34C93288ED6B6A8155B21C4C24DE258
A992F7E2200D5C706CA97BF4B842597FE50FA75A509750246D3AA5654CD6353B
82FD83C2BA3750E9D350126CD9BA11D570C7B19075C75140FA1D3B0128D597A3
3AE4A861D549530E4355C350F52B58554C9A17459E41625B86C28CA81100F9E5
04B6345AAE5220347D2517A88E72AAE0BF6885A0B56A08FFACA999421D57041C
0548B10C89666B86613B76D5B6EABA56295A210849906A754D6FB87DA9DB919F
7C72EE7FDDFFEB279F7C7AEFDEFDBDAE478C0917821B843C8EBCCC52099D98E2
99E48B1C1D1D25943D627648EDC82EC9838C8C00390B4A602894774A3166915B
86085DD794068ADC2F0A3F506200316B7A3537DC70C3CD37DFFC4C34DD759240
2E75F05883781A228D90F2CB0FE5A4CC72630318E2EB31880219169425C933BC
F2CA2B6FBAE9264A70A68431BC0DA508E7E150D626810D10C24C5E0085B2BFBE
8C82CE6877FF07240173794E20614750398F9EA7C1228A7FA54FD926E04812F9
4549A213422DDBDD53239BBABD552F19B426ADD5555F14C857501F06AB6FC8A9
F0911430EB89E85D9F20473213C53BEAF548722B6A5D8A351F50350DB76C4583
72BF01151FBA3A588E541741613D59F5961B76B3EF05D59A11F462C14B41312B
DAB2BBA8815EB34756BCB9AAD2683A63EEA0D74D5753884DD93A61CBA94F3CFD
C8447543A7EF5A92D1CF3B6827D49D469EA85EDA41D35D1545C6386B3F8168AC
3E8E0C2B538267357FBCAEA47A2ED62F74EA5C4B73116D3642E80B847B51248D
DC35527559052D89A44C0D00553EC1E0F115A4928E363F720B3D557C23B763E1
26CB701F74434DC2D454AB7ED605D1CBA1A280E442F7E4534E7CE9792FFBD6D7
BFB3DC9F1DAB4E2EB74573AA5AD5F11217C7A9DAAD85DE414BDC6CC480F605DA
25C83D70AFEC67BB2EA326E999D5750712E4E79DF77BBB0FECDCBD7B8F25D706
59BBA18FA491144180EB45898CA70FC7C7F53EE794E71DDA3B1F2761A284AA2D
FB7DE1A54AC1C7F712096775A6C8E0670353B1E21482264A2A1D7AAE029A9E08
479F8356661E748EDB69078FDFC9279FBC6BD7AE729F572EC547DE5506493C2C
093824B256DFA1A184AC9C73F6E99BB74C230B364DE1DA4BE2B00CDE4BC5685C
40548EB3D3BF45637A850D0E6988F0557C3D1BBAD08BEF02370E24FB202F6400
90F99365AE080FC899AAC4AA92A0FDA50B9852E46262C1C8AA6C136D1159152E
26FC626ADA86B86C548435A09A8A6C8A6E978A961B0D5DABF67A52DF5576EF5E
7DE0E7BFDEFEF89E9DBB9E5E5A1459F9E4E7E11C4146E5A41C67CEB02CA79170
890755BA72EEFCC68D1BF7EDDB471841E552407A3D2C71E521EC2D8A1F8A2951
6A17BE362E5620EDF5F4D34FDFBE7DFBBFC8E9385D95D916D907DBB66DC399E4
457F5D327D70707C10D90A343D7CC4EEDDBB39E0C9616D0AEDD21BA46801B7CC
2ECBB3F211BCEBAEBBDEF39EF770B1054A085A2C7E11F59103070E70DBA9B22B
A63CF9FF7D1F56F669D5A79D76DA534F3D558E00F10D2C568F2A09A8C2401EF6
B66398300622A45004921CFED0763B390A9A2056413E6DFAA483334FE30F1618
FBCD1EE0598EB404925C47A628724C45EF30C1FA8E7E5DCA0D2336C22CCCB508
2A48515A45B1FBBD76C56EC5ED38CAA3179CF75B0FFCEC7F8AFB05CE3CF255D9
92AA9AA9F5C2E5E60913EDFD0B426BD60102D9C81DBC1F07C98D440402322858
B43E628CF4BD7E240FA4A69E774359D5B334C27190C39A0ECEB89FA1426B28E0
A6C799E771AEEB115E8AC543A594AEEB93158192ED8A094446240C96C24D0322
6BDCC4FBD7D6ABE4858A2D810DD0935AF6B8177A8116ACDD8FE3E3F550178E03
81402625E140ADD9C98A27444CAC5999AD5B7A375A11F33155E827E0A04A8C62
5CCF90F3D6D5241BA0A0D30C2B8EFC67B7AE960E2B899219388E5C53D2C8C3F1
2DD9F2C1834E7EC4758089C9E985E519F0E4BA31D2F37B5A53375B46EFD0F257
EEF9DA4597BD235B8AF07A2EE7F8BE70F98D0DE39DFD8BB84F78CE2CDDF64517
49A9DA6AF4822E20AF1B1C3DAEC63957ACE8203953062D9534132DA33AC8A090
6B0C84981D67F8145222AFD59D534F3961D3A66953477DBA200F29E3C421F6FE
C33014CC9FC3BA1248642810A53121099F24AC717912066B693605E91563523B
65AA79CE442DBB080F44B2142BA22A3E2B124C25BB9259A66EDBA6EDA0A842CE
256902A4088A2456013D244B3A2A1492A42AA2658D2C5B0D45A9F4DDDCF7F47D
077A0FFE62C7A38FED7D72C72E29B7C9314261C0B3CF3E7BC78E1D04DC81C47C
CD35D7502748F2B75C7BEDB537DE7823152E52974A46A1222E80DF1229584547
6F0A0FAC2BFD852303A41C42A0502D79D8B97B01C918F248505A279962EB04C0
3A4E57BE5E666DFC4546D3FBF0873FFCB9CF7D6E6A6A8AD2B7B9271A95865087
4882C1A06C4EB67EF0065C2337032054BBF223D080C07D181F1FC77BC83B8FE2
ED79CF7BDE430F3D449EA5756B397EF5FC7FA018A0B5E3B37045E79E7BEE830F
3E48BD9C6008E9CEBB57164E65EF102E1CBFF8FDEF7F9F643F0799192495F696
B0AA84EDA5C0A68D1B7C3FFECF7FFCDA2F7FE92BAA5D4FBC48B32B717AC0CC9B
7224AA25F3AA122153F37C43B1C3C43DFAF5DC973CC3025302E4D37D682830F0
5047CE4D30025B89E58A59BDE8CAFF7AFB3D7FEACECC56ECA69B0E2A693DF750
714E43C9873AEA99812A99A89C6AA133618C2F79CB890DA91EE2F8A3ADA9E5F6
1C3F3732B35CF1204E84A2DC30A7F4C9EE4207AF8BFBD38E7092A84E940E9EDD
FCD5C40E1D0850FBCB422D064770D211B37EE26F9ED5DBB5B2B46BD1CF83D046
1683AA7DCEE3AB9112A39D89CFC571E2A466D67BE900BA52131A1EF84AD3F090
69A6999CEB9914CAA153879A0F41207930A29FB875DB9E871E0747A9E6CD7490
08BE5D8118E78F7A37AE4BCF707C2B32238807AA078A37BE75DB1FBCE0457FFD
8D7B9EDDBA9478D2DC804CBF1D75C4BE194586572FC4F1F5B46E2526AED377E2
24698B760E60BCE065BFF7F3FB7E6A8365EBCE72B2045AD09CDED8DE3707351D
3A28CE2CE4617DA90BF85E14154D839A93051ED896D917F9C5B25277529404C8
5EFDA3DB04D2B0853DC514C96BCDBA3FB31D28BCBE65E43B89D2BC8EA4C3AC56
AF6CD93CBD71E364D5115D1EF18A683236A48D7C88C92397C00BCB31C08293AF
A9BDF2919F2C4F868E97AC2C0C866EA28C1F4199FE220493A32D88AA7AA04891
AE27A6816B909D8A30562A558B62DAA6AE0A37918028D28BE7A890AB592A7264
654914072A664D556CD7CDC2D89E9D19FCF297BB1F7B74EFAF9FDC9DA6062BB6
5C764138975C2544A512DC7D09993ED23C7B09386ECC3D2ECE39E79C471F7D94
B9F0DA9E96E02A491220EF78EB5BDFFAC52F7E91BCF030F4F15123DF321A1ACE
046FE690C33A195066FAE5E03C3BFD7056C8AC0983010724B00A0A41538F1DBC
CE0A42B91E823C2784D3C26871A42E9008E4BA740A9BE3CF77DE79E7DBDEF636
AEAC26914666040A068AC4949308FE0F9802656E4E8FA35C2914575471C39220
3FB28DC1BAEF72C498EAC9E5129236891606AEC07D23518A5B3702A34BF1526A
2630019BDFB0F5A03A9B8FA0960D63F968FFA995E067C5F25F04B5CDB5D0ED1B
7E6E4C1FF37A6FC772F83F0484DCF41B37CCF467CF3EE3D4A71E780A46B59A6B
2EFFA20F0B507D5525304343965AB2DD5692F069377A4028B3CE79F620F0369F
32D93BB018D7CD7C26AC07F6DC42BFFE1B35A929F7563A1B2B8DC5CC6F78F6FC
DFB5719E95173A03CDDBB261CA9F6B77D4B4DA37967FD817C816FF8FA18CA8B1
3718552B38CEB39ABF3456F376F7E25F0ADDDF78B1EE4C57DCF6AAEA82B36574
E9E165F88550EAD5172BB5CDF5A0DF93BA8931DD1CEC6A87F7172EF573C1D98C
1C1039AAD237A01554E6FFB62DD8EA2B74B9A558A8ECF52218ADE2FDFE7FCF70
1CFD3CCDDEE0B8EDCEB85EE9E9A8EBA98BFF288CD4C6ABEAEAA836E8B471FE61
555F7D7C29F9B9309294DF958D0913C71F519C67BBAEA0A2694BF9E0A7098C41
E5371D4FF7E534DB5C1B5DCA83E480E73F845207A47361FACC8DB86FE142179F
5B1F58F3FFA30D3E4CBC6EBC9D771C5D4B5706781DDFE3D2B77BD004FBF7ACE6
B6D6E2CCCC8862E7DD93F36EBAF8E06E58CA8C7E8696CFB8827676B0470A8E7A
CEF3021503CFDEBBDEF5AE3BEEB803EDD7C71E7B8C744AEEA68554CFDD6D0FB3
113CB50C32CC9C7D64B43E353936353556AF56FC40B8AD85C65D7016A6136634
2448F83A7DB238629B401EC24F1EC6B890F323B9412AC9875772E427CDF248E0
95E60305D5192D364CD9D0240BA5A7A93915DDB2354347855DB50AF25334438C
9E091C15219B849D543444D06C59357D5F8A636B6EDEFFD5AF9E7E7CFB812776
3CDDED865BB66C41268BAC10B9D8473EF211E4F8C42871BF5EF8C217FEEC673F
6397CEE6CD9B91A391202509F1D18F7EF4EAABAFE62802F27AE40B975C72C927
3FF949549C19580D8615496589CB0E22EA7CC99E65F65C735F3328B28070402E
81293BE258003087E57E3B9CED53CE8FA462B12BAEB8E2B6DB6EA39807D77C91
FD414612672231C616D93DA46550ED28BD5C4AF9E73A499C034A4702DD655712
23C573BF0A8EC4A4FFEE1EC2FF9A0FC70688831355301A391D35CAA95897FFBE
4E5695FD7BF42DAA69E2AE15DC528DB2923239D36C2B1EF8B665F86E282C7D15
8DA72C30A09AD7CC480A210F2C88A41E24E0A8DA208D8F75DD492BF5C4F420E9
C000AAB1400095E440CE74DF6880858A490775E18A1033E2CB0E989E55118E15
E8498132A9A72BAE9A42A282119AA754B6EC77E77C3347D68AAC6AB2D99AEFAC
369596E5C92E44E2B9790F5535034752F24A52356309C711F71B0388337C4EFE
ECE7DF909B9A9FE1F5818EA2780029D40CB3170575A9610668B6A43D25021375
FFE2B9528ED78D008403C89103A58BF644CBA9AC86EEBBDFF89E6F7DF9AF701C
6DBCBAD29B1169A7C86F1518D14625572868383E8C48B85E71BFE7E27C0CB12B
D09343A16BE7A0A510ABD0909AAA2FF4DCB8A2F838BE9FE93944F2B35ED786CA
74B4D2CF405D955C68E610C6D200D056D302BD0E687380983FDA2299C0F48E50
E70FB44D30BE02FDBE1AAB135ABCD4AB68BA9B4463C6B82A4C9EB88752C2440D
18D4049246E1C2EF159EA81C4D19034C05421737E8A8E79CF451EAF749E79011
EFA99082B4D58B2FBEF8EEBBEF2E974C8AA8E0CB5FFEF2EF7DEF7B4400E4F79C
9E9E1A1D69345BD58A6DB86ECF303545022A9780611A0C49029601CC928679A3
191BD46507116504913028BE31B4C7E5C32C32CFCAD075B20026CAFC0C06B21C
1868D319224E601AA896AA8EA3A160D035A190E2E24DCD147FCB91D47391EE54
98FB8A524802D554753B0884A9B9B810FEEAD1034F3E31F3D493FB73652DD047
AA3D14BE118A88C0B05F36875C7886EC5F63C048CA32A2A1C851C00942CCB5B9
0406867D77A9E40A5F01FE4A1163C6827EB69C91ABF6C9F4FBD0873EF4D9CF7E
561E36EFA6D8EFADB7DEFAC0030FFCE0073F3878F020251795E5370CAD3DAA42
E0660C9CBACAB795E7464F6465622D5FA0C851631C2A6A41FC277FF22738A557
BCE215F7DF7F3FCA894F7CE21337DE786319488062D484FD4075616446904CE5
9248129FBCDB3455EA1203436089637D1850884AE7A84E07779E98384583E81E
F2C8B1D64F09C18C935CC6D3A7B7CF6392DC6D341A4875737373466EB7265BB3
9D83A8EB6D7CF519CBC66A60B860669078CDEE48FBBE954BAEBBF4DE07BE1A6F
085C2F30352BB643E740ADF7B782718CBCBE956E8C3A28B1724D6E82B4430D7F
28325B6A7F584DA643AF1F39D54A6078E6D3CEE07B82A18FBE66A4D76C231F8D
7A3938B9B2574B7F1A431F1AAFA987939E1FC49AA2A795D8DA5719A08E1F80F3
87B6BC2DEF0F7CC7AC0C54D7DE5FF17EE8A2AEEDBCC4CE37275E1C69B91ECBD1
54303DF7373378FFE60B371D520E66293297EA40EDDBFBABE2B93E4C5D30D96F
75DC7ED068347B52677C656AFEEE59D4FDC75E37EA8E74FD2846028DEDA8B530
BAFAED651460A89B071383544DE3D51C46C1D86B8975C550798583F3E9753D01
2C6F46E3EDC9C5AF0AA2187FD3983FEEF6FBBE695841E46F92B61CBC733FCE73
E35BA667B5195CAF9E59B8AEF471C87E2C621EC6FFADEB272B7D3C5AB104F55C
DDA527FF5F849CB4FAC715ED2479B5D3D364311F6DB711FFAF10DAE0FC671BEF
6FBB7D1D0CDA67FF3B0370C07A8989FBAF55B4C162288D00EE9BF78F627FEC97
5AC629AA1BBB99A7A495A4393FD2FEE60A98609F673967984BAB6D11F446EB62
B6D9451B2B83B1D78F761BABB99EC7DD1C8FC1B1E6533D54EF7F17051EB45EDB
CC36C59D8EABA97A53AAF576BAC1C3013C0D7A62C9281D14545E4229C9196497
BDCD54B049491FA4F0C1301DE30D6F78C37DF7DD4794C202A05CDB2C48FA8C33
CED8B973277E99B3534E38616BA35E4175DBD4955EAFE3542CE4EC94274ADC2D
1FC23995DB3B940B0854F9B06BB5240644C5C01A2B91B22167C98E900439E7B3
163F488A94C7B930853C544C0DE11D92345D56E5D43015CB960D5D42E66F6828
0904F640D1A3584A132109508146E3A0D0683545D50DC3F651126442126C7FEC
D0934FCEEDDC79A8DD179B42393C1420654F3D6E1997DDC2D077C45A36810211
9608C18F502A0EED0F972FADFB500881581EF54B211E7DFEF9E7134428377E59
8770F7AFD1795932415132463D8ACB177186655E59CE982C737679D88D80AA76
393DAC8C9F4AE78FCACB29B9964E21A593B1AB84BA5A12D010727F3A79646D40
6127919E42D2911C62C48E71045C82E89B547CB80716B788910A74527C348D80
9BC9AE2A5E4EB96481B839A57E92E544051FF844B49DF10A4E8F441777A69387
F8EACF8C6130B6200C01CE08751CC727890545CB6BE10F74C3348F7447336B6A
6F50509D530448F144792D3BB5CFDA78E63F1DFA51A089D227A1B89A30214DAA
BE2A701A0D7F190A5D52D223396A2523D5A41A41E8C9BDBE33181D6DFECE392F
FECE8FBE33956F9007483FA9DE92F70733C21D9148B9998F24A3566CA119106A
835528B2C57467900E9AB1782EDE8FD7DB462F0F41CD45BFE546D4AC66D504E2
48F7DA46370B40F40F9C529483E6583E3600F78B5FBB7DB7BBF3E31FFF446FCE
57C76132D854ED553BD096AAE96C207CA7A6822A7D309A8D199181E3FB4ABF83
36860635B5D68B7BA66FBDF3F7DFF98D1F7FBD0B2B9EB055E0B7FEAFDF7A60FB
031BE469DD455D3D48CC604969E326548C8A9BB83CCEDAFC91052B76607BFAB2
3502233964ABB078C2F3B73EF1C86E399533339BC8276DDF0EC0C7F9AF685D1C
87D63B0E137A8066029265B0ACB671BD74FDCCB1B32EFFE3CBBF7AEF3DFBB2DD
07DC59C582DC450B2BDBA86FBAE62DD7DCF8A737B846673913153662FF95A8E6
D7AB502DCF474DC5BEE1F8E301EAF8CB2E74BC9A5FA0742BA9964E291B1A8306
EE4F6A858B89D0232DD5F273FFA8F3F1CC81B122D685E35B63DAF9EF7FE3273F
7173CB6AADD656C569E98114A9261A15528E0B14E1FD0408381D8F1F12D78103
07CA90A5302C8182A1CF869B7CD0A7DC1B718DA2E9B81307246687043E32DADC
BA6563ABD548056BC22F64867E0443679D5D1E925CD935C47E55BAFFC8242291
30BA864F37F411519DC13A59B2E6654A555954172720FB92F00E09943A4D57EA
6681568D224113D2A508D451745B8488F354A06AC54158C4FB0BCC22A39EC479
94EA41A82D2E054F3E35F3F8AF9F3E3433DF6D2753535384FACD209470A4E385
C3E965BD927FA68871B9CDE9BA282EB1C5B55A8D52F5352B9530CCD1647CF37F
834D40EC9542D0A492B36E4BC9AFF8575C2603103168280CBD822C09D040C199
2067BCF2CA2BFFF11FFFF1A9A79E6200C8B22420AFD1D8D818F23E926AB41B8C
5C74DA69A7A192F1DDEF7E17C77FED6B5F8BA28E241C81F350F10B2D561EB657
E5C661DBB66D5B5C5CC499DF75D75D5FF8C2171E7EF861EAA080D609F979500C
A09546E85A3831CEC73D6C940E5747BF52649B42E2640FF19D380D7A28D31219
88E42CA222415CCEC68D1BF11D71B0442EF5B683A1FB8E0E06CE137F5D3316E3
68CBA68D6F79E3F99FB9F9E60AE8459679E280BDCF7421A83B5043B5A693CDA0
12095A1D7A0A98AB5A3EAE86DAC4F8E8BEFE4E518C1C6B72D2C8AA1DC9ABEAA9
914294683D5063C8CC117BF34AB4474F47A54016D76DE4111EF8DAC6F1330EB5
1F83B051C9AA010C8C0975102CC14081A48AE32BE9682516D743A30B7288E3DB
EAA4070721A86DAA6D9BEB1D4ACC0168C8D27588F1FE15BCFE377FFEAD0BDEF9
26711D75B258ABE81BDC6C3F5EAF412B95A281BA24E62339B267674D57F3AA72
287003926618ABBE78AE67E073C71BA7F6E7DD46BD3AE7ED11F70FD7AB0A8E6F
86E0ADAD2BD6689EB43F8A8A6C704EEC8F5C81810EA3112CCB63FA949FB8F958
F29AFFF2EA7BBE70F788B971C5DF79781CB4BA8A7549493D37D10A6958B913A3
A451BB621C1ADF6A835FAD42D30737AD46E6A8E11FECD6AD4DDD782F8EA345BA
0499677568FFC5FDF50174CD2A344049E366100C9671FE724FCFCCA5E9B1B37E
EF9C97FCCFFB7F7CC8DF4BF76F183D6DB6B31DC71953C757BCC5A8E243EAFE0B
F331571BF6B670355ABBDE50A083F2A499E5FDA2D2232B4E4E96A02D208BD0B3
1096856A4F471DCF361E4EFC811A961083E5BC6D6AEAC9CD54A82538A5471ED6
E3C99541EAD8B0072CB446EADBB66E1A1D6DC9F8EC04B9522EFA111CE91918D6
0C67254F0EC033B8398B84E1D7C9AD545C911991A208151CF915FA288A519431
A7280664050560AA1B394A828A168B58B02E21F317558B6BD50C683869F86F16
4B4110A571A229E21EFC432219519CA19DEA87DAF272F8D4AEB91D3BF6CDCEAF
743A11278F3EE739CF79E49147702B71430E275795D24838FF84190DC199ADAB
F63A6A2CF49956823404AA2D63E330DAC4B39504543806C3808434C4C3A22B17
5D74D157BEF21572F8E01B4786C530EEBCE7340E1B34289CF04810E89B545454
4847C287D0870250B4345C08D51BF262B9B3DBD6AD5BF1A492714ADD0DF166C6
ACA7FBE945201BC541F0B9D75C73CD2DB7DCC2E5F2788E693904DB476D760849
06AFA0DC22C0EDF25ACAB940F8334AA61D3B76902940E10A8EDE2397C7295D72
C9251FFDE84709AF94402E694BA912E7ECB3CF7EECB1C7284ECEB3257F51396F
EAACB3CE42F9F7FDEF7F1F09F2AAABAEBAE9861BF07826198C8D4E2EADAC2AB2
262B7A188560097FCED8687369A52DAC841C1A9613CDA74133C8FAC24E9E3E69
6C6666A96811039AA78516B2C8C27ED68B8C4F21B4A19E56BB465FC9510915CA
ACC88FC19733804DF5E983EE8C70C457ED5EE44191538A5AA41D9A9E11500596
B85874725325A8C6F5B626FC12279EB065CFD3FBC57549E46D1A03713FF262D4
73CDA61CE06354A82496DA33A211CF5D88446D5671338E66CAC8BC94C02C6821
02C92E6AC154319FADADCDFB7A0784A79B9EEB806481D207D5D5A5C9D4EFA4C2
185244301C0C3090D0BB7A3C1AC49DE27E4AE257D120D092D53C32129C0F127D
18A778FFD489CDB9EDED717374515E1629FE1EAC556CC8C2F0AA268E5B1DE483
62F9CA5A5B37B44674D78A46FC8A56692FB893DB5AF3F3AB500558864F7CF0BA
6BFFF43A080BA73CED0F4EB58FFB53E9A174098FD8375D91509245F5043C186D
3596573BE2BA2D7ACFE9892AAE0F4AF3D7C43E18B11635E2A3CE67600AFFD886
A9F1D9D5C522A3174ED8BCE90F9EFBD2EFFCD5F753B4D224DF13F0B5E43E014D
59435424164F0E09FC10AE303900A8851FC5F908D4801121CB9AEB619597E209
1CF1938678C2A363F5A9A989F189515C6F1805521E17D05B4A9E1E05746C9DB6
C81FF1AB52480228987E91CA834ABEA0557908172ED3681C3FC838A11B4A5E08
94048A2CDADC23E58A5C523D35855F48F4DC162D95B5224F4941A1A7A4B9824F
4B42B4AEA32C8D152957155DD674900466757FA044A1B4BCE2EFDEB3F8C41307
0F1C58EA0F62BC2EC96BBD3260584DC60D0B29344AB8E72472CA0DF0D67DF267
F467A7651D35624CB0B7F8E64E3AE9A4DDBB7773DE0E41843E2B49C0F3A117CA
6180134F3C71E7CE9D84964AF05E2427CA4932659B8044118E40CDFC66676719
9F473A1A9054192889368A538948414643932A18280F8A83B41412C011C80E20
871BE556319A235EA799B3238BE1186FBBED36E4DAE4DEA1D2878F7CE4239FFF
FCE7B9F906CB2AFA156FC0853CF4D0431C349687FDAD289582E2E184AA7BDE79
E7FDE8473FA25E9878270575F0EB2809D87C59270968CED9B0E128412DE19B6D
D64771DE9D3ECAB0DC1AA9FB9DB660B19037E24A9006966975823E5AD64A0602
87172C4917D639EA3FA79C73F22F1F79584D653B75645007A2F324A050C9F4D4
8F12BCBF0EB50AD49661314391271A7708688656A53A614DBEFC77FFD3F71FF8
6F870E1D0A21C4EBB596A3A68A1EE084E3548EC32C9490799B799C277A2E4213
B849890809C3EFBCE8771E7EE2A176BF23BCF9720335DE2EB4EBD57ABBDF1EDD
387270769E9E0B423C0542C241122B518424379CBF07EE5863ACE376709E8320
3A79CBD6D9A7E750A33647F4DFFFFDDFBFF75BF79E74C689BFDEB193EE6FC168
1B5612C1772155933813FB6081A983E9151EB41CF20804FE909A829E1B365422
3910B9F07EDF4DDC44344890ECCC71A0BA024B1A68B992875290881AEEC3F311
A75AD49626B46F741DE78FCFC57D438308E789D747B51154355741B850B202FD
08D7A58AB0B9B81F4D1B4BB3A22C522B4A079948060DA98EFBE68BA6A239DE6F
568DBE8FD2C5C47D967205AF9BBAD98FFA1BB74DEF3D70504951A6D80D682DC2
FC51E783F3747407EFA7E7D2F85A6EB4A12DF27735B109228D2A469B4414DF35
279B6834533DECCACA0A1EFE1B6EB801C9E1B2CB2EFBC94F7E822A111117F99F
A9135FB9E91B9E6102342D6391AED13FC7C488801B4D67CB962D9B364D1BBA8C
9220C7372ED28744D23F93655918301C3FAC738F143FCA80B7A532717612000A
398E2476139171206444C907250F1B1EC86A8437EB7872D554D7C4BFA2878140
2B49501729444551AF2015FA03EE6424E759224BA9AE162875929CA01D9BC4ED
768E6B5F598DF6ED5BDEB173E6D0A1E5819F0A08235D62B458CAFAE03DE224F1
32F2E8F17576B9D4FD8EDCF49CD4CF3161060864E181CFA59DFC37E4D2D008D4
19957404E2F8A43B205323140D8E73C825E8DDB22420141DE46BAF7CE52BFFF2
2FFF12CFD9CB5EF632D470A927F03ABC20B9D4359B56C460D464A852E7160AF0
22A3A4C149BB279F2445BDB8009B535A09719E42C714AB47FB17BF4529BFE56A
6D6A204CE84C1C9782232D33BA828AFFC18307CBE8A15078C3F0AFF8757C228A
4CCAA625604162FAB42E7CEFB48130AC7E78A6778886958A762B4444C2E9B7B8
72FD0D37DEF4E94F554CA3BBB298C699634A499CABB5A99EDF4F45782C15683F
99940BA8692D01D1090A8FF0D8968D4BFB0E1605B9A8B5CBD59AD3F38A0C9202
C15600F8C4729616F5AE78BF2E83A901B252F19F54B56A6ED0CBA5D46CD58241
4F5C1C8EB376BF92AF190A43101DBA3E79E296F9D98310A57C1DA93E4943700C
083DA73516FBD12DD7DF7CDB676FDB7B60976AE949EC83268B5651B99C79C908
8A3D255D6D2FE1F846AB1EF63D0813C76ADCFEB9DB2FBCF8ADBA638A3869E45B
8D117FA583F3196D8CAD7497C4A30D454CAD78AE0C468E0C06121C1FA790859E
623A7226C5FDB066D7717CA751999F3B08B681F7D7EBADEE425B381A50FD43D2
370A48A63029965C5A2FCE1F7FF4421ABFE0F4B1A42BB908AF4446AD1976FA13
A3D38B0B8BBAA186B85E4DD21C13178BEBC27D4E62017C6956EDC0EF8BD1648D
C6D78A725FA3624552DA1C6DAE1E9CC5F155D96A541ACB9D85B57DB674F00B93
07B9D1B1E7A3EA7214FBE6483D70BBA022D3D5A25E20CE83D22B00A3D7E037E4
54910B8687329E5AC211020D65EB212572AB0C2AE6273AA554200A7FE2AF7838
919A262626D044E6A8A1C44C84DCD9EC64A8D5EDCD9B37A124B04C3D4ED0A24C
0AE53D139521C3B45176E34029DD85AFAC7196A4A8172B8A06A4C20554D80492
AC2AC31042A16C2A30F423655CF3CC897D020A18F744011DDF9091696AAE6BA9
80A553D0B62DC0EE098F49C6B38B6AA92630781345340F5765532FE27E693EF0
033F889697A334913B9D64DF81D5DDBB6766E6DB7E988B4C536DADB08B9C3604
DD47EE7B4EE8A4E2D275A2EEA832A0DC8B75DBB66DBB76EDC2B59020618422F6
4A512B228EF1B284F8B7D904AC9B97EBA509128A1375D854CC9F01034789C294
3E443C9AEC154E1EE5227316066407D039A3A3C9CD3BE94FA42353491A458C39
6B938E69D9395906975F3BA3C3002FDDC930F4F42DA40794B5D75F7FFD3BDEF1
0EAA655B67B5F0089CCD45DD84E81E8A36E39F088FAFBCA514D8E79424BDD4D5
EB9911E3B59CD161B91C8147893696152B4FD22C8C500026518CCCCA41132A4D
91D38AFC457212C86A92D2710127474ACFBC1819882CC5A253085A0911E448FA
89405D100C4421C81CE4D30654407745184A5C773464CDB16C809FE61590BD24
C39FD1386E3A95102D5A3545EBB782C24416CF4586896C4A9315D5C2D703592F
73E33493490C890E50A0656E54D4C84AA03BB2EF6623D55AB7DF135D0A6418C1
9795C76E98A120C0A12C4D1FC4515E8832A4BF53CF3AF5B15F3D25FC34A6D50F
7CD506C913EB6D8D5756165D5485465B23F3AB2B2393B6B7E8F9D9E175E932AA
BC29AEBB020ACE87AF9BAAE62568D000CE677AF3E4C1F979D44B8BB6A0A09B32
CEB3A9693DB4784AE3E07A7D9C582A9C3A7C5D9390BF64A9808F9046A6C66616
17F17A1613E4124C6D6E2C1DE8E0A0977DE03DB7DFF6673999E5B298B951F885
C24C8CF39BE7FCC6AF1F7F3CC852D5C2791A5D3F4C86E3D33EE03C5BBADE0DA2
337FE3E4C71FDD55354CDBB23A837698E3738F3E1F2504AB6AB4DD10AF8FD51B
ED6EA7DE74DA83013E1D8FB0E8759416D240D4CA0A549E722203B20ED451186B
9A089C7AD1C010028B40AA49CBA42C6AE40C5408B576DA294A49B0C994364EA9
93B6A36FD830B561C3244A822C8FA50C3597B546358C25290DAB04A461BAE43A
D79020A1623652213EA49C1A12AC498261C1C1614950B086B45CB840AB12AC4D
4FA9D3BD8E46A0869ABE085DA0AD8C2A4B41EE057085A415DD2B4581310A0B45
40D7895EC668510471D2EDB9AEE72D2FC728097ABDE4C0A1CEDEBD0BF30BDD30
CA445764016AADB08B0CFF45FEF2C217BEF0C1071F24D87A5CE079E79D879617
25AB1CABB3843CEC07C0FDD3CF3CF3CC871E7A08BF4508C67C2785078651FAB5
AC987CD80FE7D9D6DCD284294AC92F885FEE2DB7DC72C51557D09DFCC432A3E4
4148E125459EFEC485D0870BC54BFE406EFF427C937C6878CEA8A723A9EAC4E2
39851FAFBFE10D6FB8F7DE7BB9FF0645DDB9891BB16956F3C9D15436C84806BC
F7BDEFBDFDF6DB39E115D5A203070E5006116D603E6C7B0B8577885A8290E38B
B4246E7B4BEF82B2BFE81E8A7EB3978F7026D6B2188E96450A431C2732146858
214DC34033E454F455D27201AAA5E602F24D164E4C4B8B421F72CBD1AA5ED8CF
55D4AF33C95751770E030F52C3D2AA413CC8E581F05024762CA5591AE3754371
F025F8D92A68B914A8A8DB0A8CE24835643B4A7DC54E932C50425D181CBA0ABE
74781C1DF07E1172140DE851F1B4912945201CDC6A64C8A61A6589067612086E
2FCA8CB5BCAA343CFC3D892A95F14157A03157278C7677498C23B4635435A67A
AB7D038DE6BCCDF379EBDB2FFCEBBBBF2945729878665DF6C3BE169B92A1E07A
719CA01B0AE345191C9E3F3281024A26C9C24C7671BD768E7B32502B761EA27D
9FDB863110EB4DADB4E2471E3E57D71B783FCEF31D97BDF5B63FFDAC169A7116
E17A95DCC2FBC5FC713FD58CC7875813E3E7A1D80713259398BF6C9B0D7BB4BD
D4714CD3C5F1E5C4CC1C94C4491C9A662B1E24384FA7A5B95E47120ABA6C561D
29D62E3CFFA2BBEFFEB21B2D024A38578C33B56DCBDCDE79DC4F5D57C4F52A48
5DD5AA39D77CE2BAAB3E708D2959B80FF85C73CA0867D2A3CE676DFE261A1092
ADD7AEBDF6EAAB3F75459A874680B7A258B633E1918B855C936391D49569E465
45B2FAC0073E70EDB5D7524C8E1B6CD099277396A800F903B575229B95B5ED23
6C021886D7F0AC22E1A422655843D2DAB8698365A04D10E5494CCC3A0A448E4D
92A524064091D798427E185FA8EC5066F5561AA6DF149C5F883545E534532A5A
2E585296ACB9830A57144902154D02816E8A3429899EC6AA283356E502B74EF6
38B147969461EF4C0DEDA454A83E8537465191E256DB6EAF1B049E1AF849BF1F
2F2CF5F6EE9D9D39B4889A8470A5F91EBBD2C84B430E62920DA45093E7BACC5F
9EF9A128024399968333AC9893D9C18DC3CAE036CCC2A412DA4199EF94ED30EA
CC455042380EA5F17017846CD8E5982C00726870230A9407283628BA4BAA2E75
50F837D822E5CA2C529329EC4C9C977BC9D249207F0BDB16F46B39DDE099560E
0927DA198277E58A168ED9E0E3C8BD290D7BE14291D945E9FF482D244BE866C2
02214D7FDD7AF9D7AD5BB7EEDDBB974D131CE1E28B2F7EFEF39F7FFEF9E79701
9748CFE2D80694708DC87C31469DC15C478793427BB78D2AAD3BD9D7E61359AB
8571CFC445E20FCD9EB3D81C98557D7C213A20D444E43ED5A61118ED78453263
2D00172AA925D7FDD06B86711B556ADD3606ADD09A43E969474DF7C434DB139B
6A1E18813680F10DEA4CA89A0312904411784EB81309A91DDCDDE5CE3BEFBCE8
A28B18775D1E62AAD3CDA300CB4D0B067E3386246F44B2192AF32331AC98764B
20ACE6FD8A85DC693A465DAAB72C898AADF1B8B1A826955A74F9A5EFFACC2D7F
51F564CFB29ABEBF5255FCA4278570823EB124D266F1A02E788606515CCFC793
EAE22042D578ABA6CFC5C86151D1CEAD8DF973E6ACFBB39EDC80AC0313777DEE
AA0F5E7EF9B2231C5BD501D4D4CDB3899B9BABCD4028DA4AA5D90F8389385AA8
A4E03AA039102FC386AC39DBAA54D40E4A77883B6A1C8D010CC6EBBDD5D0301B
69342F0BA8F089B0B9803FA8FE485D979746546530270D6AA8BB2759172A23B2
8B32A105DA0CC82DC0F1AB4ED84BAAA3D96A3F53D73A88D0EEF1BFC7A21764C7
A8C1E021BCE79E7B50252F1B9A5CB40847F64D8361732752D38F95D9CC54C3F8
57C443A83B267B2CB9F0856C7D9E808898D1D9F5FD011E69AAF5C509D8B63235
35B5617AD2B14CE112223857298BC3A02C0990FFAF51757E04E66839998F2501
2D4C9148541494AC1D4512306E73B123B08677AD8961510608E79C468204D042
CCF33EEF82A81B1842A266A2A70D4E529C6954F9E3085C3719B8B12F22C659A7
131C3CB4FAF4BE99B905642BB952D0066BA3AC9F52CFBCDFFDDDDF45EDF5C73F
FE3161421C3F9C4BFCBAACD4E3CFA79C72CA9E3D7B38BD442E7593978F6C95C7
7117BE876645DC102513D58CE0AF48C9A850531D7939FB1EAFE09B46D9C00D7B
496F259811FCD6E4E4244E064A8DA55804AE6B5EF1EF9104304C67629E4BA93B
502A0EA03E946558A4674A02D2B8F9D5F0A7DCD39864405E6AE54696048970EA
A3C0FE3A5AB57C8C46517CE5DC73CF7DF4D147C94C244E4A33A1AF233D53C807
07A73F915F88702638E948BC3E05524593D3A9A876A0959941D7F647569D9566
220F023582543DC739E13165A7D9465EE6D81BA5A867A90DD55FEC4222C1A801
ED55C15CF5692B98552B71E682695713D5EAF6904185E0394DC9EAA59D742431
572602A50366F41B8393779A3BD1F0C03532D63A0C5309B8B31ECE9CAA3DC85C
930AA44572D651411F6912B1EA8084DC6F4611716625B1533420CCD5D30369AF
9EA7A62AF5B258B18D3CCA8CAAEE7B22056E433E3A1B0F8F0E5EDB0000FFFF49
44415420F75B0D73B59BD452A9D700E8A495D12D6E77055281C524BCDE3A38C8
F4BC46BED18343B89855758B16EE6FA9FA2ACA0673AAE12B567AA80FA70DB443
6359BE280D2692FA020435C8512E2C18B27037086F575DAB2F9FD9D51F074F02
DB69F53BAB0A545323B68C5ADE5BD4A1DEABB8E0A58D0674CCE6697A7BD7BEBF
BDE26B97DDFDE119FF505D57078BDA88322643776134541782A80227C10907DC
BD912D8D8CD73A4BDD54D9ACF66613817C19422D87B8D158913B1B56ED593D92
018D180ABD92514EFB4959D7C7A2176426946E47D5452448F067D4CCC826A6D3
4E07BEACA61FF5A0AEFB8C8E8EBEF8C52F7EE4914790C651249453E07058A41A
5401D17460FC82C31163FC03D1214A029C9540422F52FEF1BFD1D1D6C4E458D5
11DD2B45C3884CE89512242409D6B898BC56BC20FA370CA778D40F172F115EF5
5A4302551EFA97D6DCB8521E73B818869D770A6D5AB49C41D1231ADA6845EF1A
1216993BCC37FDFF597B0F38BBCEEA5E74ED72F6D9A7CF999933555D96BB3125
8043800B978417E2102081406E28C6180CD8B8C84D962DDB928BE426DC2BB621
260408B9402EF5BD4730EFC20F880BCD5D92D56634FDF4BEDB5DDFFECF59DA1A
95843CF6EF67F9CC39BB7CFBFBD6B7FAFA2F093CA8CBBB6E93E59612550AE23C
C65CC2750C366C9A35B3DD71E7666B3B774DEEDE33552CD75C2F886AD0D46B36
00CD08914F3E01D8A278161C05475B69C16980BACD84F2CE77BEF35BDFFA1676
1AAAB178D557AC58313B3B0BF94C87453883B0A70A85A1C8459E12D2C775D75D
77C71D77207ECBBC1EF9A0FCD3DAB56B9F7FFE790936886F5DC203FC19481214
AAAB7822FFC497944A257875F46336AAFCBD24019411941708DFE1B7863CE0CF
3C3FE84929F5C94794047A0FFA1F2101C4EDF94FC4C7A0F2A377209EC59A0D2A
27E8B052F0134E3881AFE219606317E19FC37794FCB966CD1AD698F0596A329A
E121416FE1ADFCE868640B16180F69D9B265F3BB76551430E2801B5BB06A03B1
84D3C857571E18DC4B0D8AA9DCF351D2A7FA3A194DAF95D39935FDB5F93D6FAC
D02F4D1A4D8C06B5A9E902AD2AD37ED6C454EA48CCC858F1221384E72E272AFA
A64D630BCBF6E517A8D9226F90AC20D3AC6CBA66FBE5F75CB02AAB1012B1D63C
42588DD1B218780978BA784E50768470226A5F6403F27AAEF1866654068BB33C
DEF762B24C191AD9A74FC7F98CB8DE6D9ACAEE26CF4F0DAD3AA9512A37323B73
B3898AE38F0EE41766A6FD449A5A75EB2DFDCECF8AB158B6D97162C9AE954B34
1ACC523BA4B9E3CDBEC9B1B231651941A69B5C8805838E57CA75BD3A990532CA
CBDC87AFBDF723175C926B356A7AD2B79B699D86EB8373544925CC58CBDB37D0
A51C8DBCA24FDBFEA035D6B2756B76421FCA35662BED74D8512074B22B3C695E
C7C6B206B5C85A789D9FFDF38F5E75E3F736D15C37EB2DEB532958CF370B9499
A3DAA8919D5D5535772BC8EAAA13C2ED0D5BDE4CDB4FB87CA351273355C81AD6
646672A493EEB41C27ADB0D9790705917681B2A98FB85FE4339325851588BC16
679D75D6534F3DF5ECB3CF46351E20484B5A39E25B48AC8882C72DB93F0B7294
DD60EF60178086056C981FCD242195F98AB1A3C635849AE830A9684A073742B5
B7CBCFEBEBCB6633A9783C66EA1AA0E2744DD98C2C0916C9455F7C61B46E5852
5540BD5237490BED458C17254198FA2981C73060A002638B6250B9AD553B1A75
90E9ABDC25555BA099866A59CCFF8636444BEB553985AEADC5E77A7E534523AC
30F32716378D84AE27352DD6AAC79B8DCEEE3DD3CF3DBF6BEF9EA9B073880ACB
45A5EEA2B973100B6FF127D19D8F6116401240B7922FD1324CDCCDB0F55EFDEA
57F3DA073D38BF68272FF1E58900D8BC79F3962D5B9832D80EE0458512CAA731
5F43F92EB82D3465448945E04BEE133EE32D56AD5A259C0E07BCF67F28EF100F
121E7908544CDAA5975E7AEDB5D76260FC2EFC0AE80CACF57A811D2E09A0CB4B
EE29F5AAE731CF7822E401BFD1DFFFFDDFF3978F3EFAE8FEFDFB59C541AC02F2
EF101768CFDEC29E39A2248836758271C3B30A071AC40CF3D0F7BFFFFDBFF8C5
2F90622B1D49A9278699BD9E7AEAA9CF3CF144D5B6533A35BAEEEAC4A9BB8D5F
D3B994BA87628D1575DA670D649BAD2A5D48CB06D213FB1C2BE17733B472CF8A
BD5FDBA502B55A70F259A7EF19986A8E16E952F7C4FA692F267E67B712ED319F
3ED229BCB076EE75BBE8067E9FCC717E6327EB3DDD949E6C389B56F43B54BC66
1FB2E078B901FD443D030B4C01C60D9FB37CF9725612A5A865DBB66D1B366C40
AE842227B7F5FA13CF78F2AF9FA5C17A625FAE1573692E47DF3C40A5583248B7
33A5559FC81FE82BB5EB94C8245B5AF3C4A74F7AF95F5FF0F598ED9BCC83DB6C
47E49CB59F3DEDE5C1DFD13C65627DD9662CB1D7DAF92D55EE101B20778E826B
2CBAB79B9C1F6D262B5AB3C996F8B0DF8E5919D3EB2BB5F6D729A5671AEB3E1B
9FFA9A59DED30A627E86FA6A1BBA34D61A2BAD3C30B72F1B3BA9FAF073F90C0D
ED1BDD4DC538DB9F03E96EA37EDC55AF9D5F9828D7CCECF105AB569CFFC2FE53
66623B02D3FBFCA8D7DC6F959DEEB896AD047E2953FF5F35DA479A9DC8D78CA2
5EDF78E9795F8C7F6521E68D55D315B7E18D0E57F497DFF0F8E8B3BF2DEAF18E
DD39D5A567CB9BE2747B27E6E4D269FD8FFEE88F9E7CF249A6B1952B57F24E44
B3A9A3716A0A9338809E226EE4E825A3A3A3CCA6CBE141A122C81B138560D823
AF7BDDEBFEEAAFFE8A35C223DE5CDCD10297221502D087789BB0D46793974917
A60C5308FF7410186E91D11B8ADF859A9A1B765EB65912B02C8A2B374EA8B2FB
ED107774D1CF8BE800A1BB6A2FB76449A2A148027C804DD053E17B31E75EF2A8
A12D6A2EB03A94E43095CFC7A310C4D4F04D3D907E96EAFC40353553136AEABD
2235259E5DEA30A35010D676CC8EA7E276366E654D23DEAC59A562ED85975EF9
F56F9E679BA0D5F69049AB32B523C8191401C3E195E3C98D06938FC12EA535D8
929A03F15708CA29B3095601240CBB44124011860B28EAE2871E8A8E317273E6
7AEBD7AFBFF1C61BD9CE409E1206C03B190D234143A890121A65D5986FCBEA0C
BCDEF018FEBEFD848F2609D0F93D085B5E47736A79E40F3FFCB0A4EA335DF238
D141E18892400C267CC9160CF36ED03AF362A4F0471B944B77876841DC1BDFF8
46DEAB6C4B7DEE739F13EC58ACD4D16C02C48DE15C92843A1C52CF2C72178DEF
9738F4F85A5E8E99E9030D471B4E1033FC36F9C75D39F4FCD8FEC2F379E77EBF
45954E2C6EE7FDEE79F9ECBC5BFE5A517537B6695D7670477981EAC1D8C6130F
ECDD9FF952A37E9939E00C68B7D7E7FA1B0AB8E6758323A7E9130FCFD227CCD1
7662EACE5ABC499D982ACB3AEEEA753B1B3B1438FB0D2A170EB3C1A609CFB060
728018A22E4A50356ABF9169861956CA81BEF08E53FFE867FFD753DD3D947E80
82E3A97E462638AD465F20FB256AEB34B469CD6CF3003DD61E988F954DC71B26
3A40FA70419FAD0E59F979A3D3354ADA47E285AC33FBA84F732A0367CDABD6EE
7B66CA0A725D32C6D6FBFBC60F1C3F3D3A7F77B7DDAEDA89A068E78DCA9C9722
AAA5683C5836694F5DD54F899D5E69EC9E919BCEBFE5AC6C8BAA9712EDA7B5FF
92DCA53773FF63BC32324977D3D04C6A8E3A6F7CD389A7FFB7F73CF8E59BE87F
C428A11D777D67673FF5FDEDB2C6E08473371B5266DF8D41ABE1D14DF1C0EEEB
6A33F92BFB5AA56EFBCE26F9FD997E375159D348BCD2D850A57A9CEEEC582DBD
1BF7AD0B285D4D680F060BE3EDE327D7BE7C67C7684E903FEE5D57D4DCB6A862
147AF9513773341621604120126126F2A79434C9D208F64934B677342F2EDF41
8032B12FC0B8842FF19790319215CD527FEDDAB59A600741690F427B100E19E6
AB7C592E9BCE645261064E9898EFB761132CE297E9BDE070B088382F1DA9849F
F604C062741A36012441A8D62D4A081807265A45A95C55350FBA6AACCABF9A0E
75350ABB98996C2493EA786C8690D3E11D161B1A1BE87C103E5A735544C18EB1
30B313193B9EB1622CF7E295A2373D3DFFFCF33B9F7BF6E5BDFBA79A2D179280
DF236A16A00B157C2FD18C4614191DCE41964802904510F614E53F7977F10778
60C0A6794501EB1F657651EF102846381ACC08FE57EA9F61D14B18A050280041
8F1F0D9FA3F8D60572045943FC0AF7DE7BEF05175C20987AD2750011D73F8824
004D0BC62D8F8165D57DF7DDB76FDF3E0430A4D58F6AF61BD6B2D1D123C648CC
E5973DF1C4135957858E0F1217B83ABE76DDBA757C26DACD4364E2573E1FC16A
BDD775072AD8E156F6C1A4BA30F42703402A1ECC6A8801097BA0A19058D9206C
AC915A02D7213B93EA54326E723ADDA473880A29D21AD666E5EA74FDDCC0686E
FAFDDE582379E0F1E995B59836D0DF58A83769BA71D3007517BEF8970F3EF3C3
8967EEFCCA4F6FDA95DB6156EE76E97C9B4C3D714BD3F1C9E5C93E9F06560DD6
2EEC763341F2535ABB594DACD3E3B37E719B723E3001BCE52D6FF9D18F7E043A
E13DCF24270E4CA4F94AC35424B6C156D07A6880E374C2582EF3E496A7546F83
F56D8B6DF65432736EDE6CBBF53B66BC38B9570D50AA41D7B5C76B54EEA34687
F241A29431698E1979A2CDEA45B23270E9C842BC4877BBABF61DBF9FF67B2B1A
54A25C4D75C62C6EAB52276EB53BDDBBE8F8EEC81E673A3634D65898CE0C69B5
4ED22EFA414A0BCE6F74530169697D53771D9DD6A2D97DB7EC8FA7529D4B9B5A
3B30FAD3B18F25F441ABBDB1E8F5299008AD3B1238D3F65546470BB49B077D6B
811C2F7121151AA7ECFB7A85CE9AB047CCF67A772477C25CFC25EFFC708DAFA1
64B0A699DD9DAD9A836BDD572E0CD88219F96A6EE6652348F9D9EB0DB7DD696E
A9939FA06E8C6EAD66E7356672CDBBC96F2B47E29E3D7B783E51F202BCA96896
60F4C0AC629302920BCC169133D8D0D24B15B6B2EC234900E17504111E713FCA
F94BE43DFC01EF7AD7BB7EF8C31F62EF083E314B054D4E0DC3035AC8DDD14B52
75914CA7538303F96C369DB4177B156BD4852458743B6A8BBDC9F8FF7807A452
48028C580622097A36412C6213F4125299A7F724013AAB86EDEBD46787424546
F3C3B6C62A6E8C6C229BD57E43F14D4BC9AA830D90156BD7152E453CC1A3B64D
23E593E57BC6D46479EAC0ECCE5D7B77EF3D303B576EA075AAA99173B0A94B10
B61106DB956A52A85422278E96450A0E2EB31A8D3D48560F7234F543119CE8B0
88316A5985830F0F0FB30C97F41BE8AA7C5B66ACD8DE7C1AFF1945D566262BAD
8F25A75EDA55027EE4861B6E604D19D202B1AF3F8824003603B3187E0A6056E1
7D12E866C4D6B443BB951D314E00DAC05B48A2543471480F1BC8F0DDA03AE12D
303F14AA69A2082333954FD67AA82C47B30990632308AF2215B66EDD7AE59557
223D8305C935D75C73CF3DF7A045B3A04B512FBE1546D45CCD57900CF96EA2B4
AEA57D3C1FDC5EA2F57C235209817ECCEF739487878F05EAAF50513F39FDD07E
2BA8153F426F48F7FFFB2D45B247ED86D3BE627E2847FACD83F357145DC74F5E
3BD2CC4C276A63F15BA6CACD207B5DA2DA678F9C5598FEC6CBD6E599FC2BB5F9
BB15E141EF8B4A7A213FD16FC0FA912F47BDB8142F1C9FC02451D092ED2059BB
663ED539A571734337F6581EB537929530BA37784923A97F32D54DFBDD7B1A23
9581399AF588B579BD917073A98C37DFAD93C972C23A3FA54F5ACE374BF946DF
BCA65017546F4AE61985802E20DA4E746186BE59CBFF2A51325A9944B2E17613
6D636834E7B5F57DCD69BA918CEBC8BB52A3CF0785856433B01B571473E6E995
1B2BA9F414D53BFE8DA956D0C8DF3AE86683DAC282D61C1DCECE972E703A1E59
5BB38598E13BDDB90D8D81D8D8CC8DA5911BADE681A6FE60BADE4DFAFA54EAFC
5CCA4CBAF737CB2D7273A5FFFE86F7FFFBFFF38DFAB69436E9065FEAB01D6775
1343E7A6BBBADBFC4AAB5E31E3B97AE746B2CFA7E415547C90CCBA29D93EF2E1
18B985A82B4272E792485534DB42A8319A7BB2C40379C4FBAF5EBD1A396FBCAC
088661C741F5416488FF647A806121D8390725013356E57D0E167BBAB2EDAEAB
64E1F4F0D0605F5F36196796ABDC8EBEA7840924415823D06BD11E4A02146749
63588A401418BDBA33D804CA36385412C02C8024087D4D4ABAA0BA2E50FD1E9C
C5CEC67AA0C047D94009338892F1649885622A479075D0327055CC83794460C4
F841A6EB2990896E27D8B3FB004B82FD13B3730BD54AB511B68453516CC3D7C5
A3BD04E01BDC1C2E63307A7C3E864C86BCE5D9478487ED35D68511921157CCE1
46FA922C52EAE1CAF1ADD0600BA9F4808E92320EEA4118E15948848F26D2C878
90580581CD4B09CE4587363AFE43D904CC31376DDAC44C1986CBE38F3FFEA10F
7D4810A425A10D8339761629F57C62521B0CD9008B478BD4A2433008C88714FD
32F5F3CB22D95F12637A285B479504328130D16097F07DE072C1E24AFA009E2E
7B55246E2613F36A4E733065CF6BD6355695ACDC16C3BC6A8A8AC72F7CF5C5E1
4A21E1B7D2179DF0EC579ED69DC174C9AB7EBE44A5A4B5B5A95F6CB50752B12B
4A29BB601A73B50D0399D2C0FC5D93C98BBA7EC669DFAC4AA15674E2FB367556
EACB2736EFF70C1A08FA17E265BA9AC9A92F7143073B11C20FB3243D6CA91780
417E2D8C48BC2FEB13FC5EA05225BC630B349D8ADFDA28EC1999787481924E6A
811A5BB3B17AC3B9C3239772E753658CCC66D6AB9AC14871CDD675A5F98952AA
C5F22FD98A35C84AAD6CFB1F4CB647B2C1CC24E5C9E898DEBDB47C76643233E1
5F442C07F56D2B8AD7B9B146C9B8D56827EAC916658673CD9942CDDE697729B7
B17F66A83874C1E8EC0D5303A5FCC24325AAA5B2773592CF0D4E3F56D4F27E6A
86EA9BD94E6A17AE527D3049E5BDAED0685F70BBCEFB5D7BD02A24127E393E7F
D90CFF9CB953AF5DE4B39546BEEABD33D04AD60DEA7CA9993B60D41D2D63B865
8306BB7AFDFAE10ECDDB35A73546A9994463458BAE23AA51AA99B02F59B5B0E2
05EDC2D3ECAD3B5B453F76870F62833908CDE3D8397842D86886818D297B19CA
A89C0657B9786E04743ADA4FFB8837C78191C051810C25A87AD1A0E0A21A0AF9
8F2E5DFC33DAF0C201C23FE6F399B19191FE813EE6BCAA3764E8CD51AF4D4CEE
1D1E8DE33BE02FD83CD09EA24DD0E4832A3D50D71AC82225CD5D0C0C18075D43
E1E18585012C065858193EEAAC9508080D70CD57E81131439590A9A695B164DC
0AD56733A1DC39CA53E47ABC01BAA85C539E62259602C763B2F03A6D6F6ABA34
3931B567F7E442A9EE74017DBDC84D60E6A3BC560F8186FC43DBD8CA7B45FD1E
C2BBE9480AA6D6937F1B366CB8F9E69B01D60FA515E26489462CE7F316450E28
ECF7CB2FBFFC81071E882AECC71F7FFCCB2FBF4C3D6FB5DC0D0CFD7013847A9E
416888781D7C063405CE07B30673078C04C00B81E78C30943C25E8154EC31B83
E145C1A5216650C0258E35A9355952032C132BF6103AAF02F359EA96912B25D1
36F4D590CAE7E05024A5205269CC577DE2139FB8EFBEFB248A23687D520F2845
D17468FA83AC8EA4170B9E20DE5758BFCCFC625AB71637876DB7515B51B3E636
B55B691ABC22E55E3FEAD6E29DDB9F1B207DDA64AA3655F5AA9658E1E727AE9E
50F5B45BC6E86A961AA5F4D5541F232A927E7976A8BD6C7AFBDEF47AD72A68C5
ABD5D3C73B66F106B3ABB7531BFB562C1BDA31F10A51B67347994A8171832E89
EDC84D04ED19B98C530A9627FB5ACD7D9E4E5593F77E405E7390F4F95C92AA6D
55BB9CB5A9D9ED73F5B2D952686EE514DDD0585B5CB9EB9EFD94F0D7C4E2AF5C
64C6AB8DCE761AD2ADD94D26594D6B23F57BFDB574C3A544A751B603EADAE477
328520369F2C0697F23459F479C39E1B88FB1315D589662841B3CDBBD2C9B9FE
E4F50BF377B4B4497FEDADD99D892A3348AA1B0AD839D718AC9C347FD36ED2DB
742DD17964F7A5DA3736FA3BA3C5ABA74C67CCDD7E603046CDA6D9BC2547AD85
C2B54A12743364D59424E85CAF343CBA857541B2BB59E5FA77C9D842DEE544B9
3EDADC26DF3C2E3FBCF3BC5D14A3A1AB32B3FC73D0229B0A75AADE4AB1F9D1FA
CDF3038958BB95686F5B509D696E4A9D44C9176E99B3A747DAF74DD3161A5C48
356F377CD63A59F9A18E672B6F8ADFA424A57DDB0558217CE6CC5AA1C081F0A2
BA97E41A6199B055D1F61C5FF216433101B60C2C605CC277C316A65EA4817ACD
2971BED030487DCD9A355353539FFCE4271F7AE821B9E7229147C7812C69388B
1517D5D5861F1A1C1C1A1ECCA553CC79D54E40B23CB18E196ED15E374AA93B15
614011B46AC58F7A1E7F1D8E79CD9594A1450DB78786892EC89A121846A07A73
87918640DD9CFF0749C0E365B61FF62C56EC80ED15CB8A29F4694DF53E0E4D7B
9574C4B7613ED0757D9601ADA6DB68B5272766A7A7E62727A6AB7547C5BB8D83
189C9871E93BBF44448BAB4E2ACBC49514FD468CA1259C7D7474747272F2D5AF
7E35CFF6CE9D3BB106E82B7DC4F3519C053E8E9546F11494B575EBD6BDF8E28B
122945B017FA081461C866A49022E905CEDFA057C48B751768073053E496C15D
F0E8A38F9E7DF6D9428B7C1F50B3804E0B8234C8FAFEFBEF3FFFFCF30132CAF7
07AC1EDBA770C2F09DD1FAE2689260495416F13124BD083E07A81CA6CC1123ED
51F79ADC07294660DCA79C72CA73CF3D274652F47130022459483652F46E9852
5E359E1F24560085427C2F9076FCB2A55209B4B12A08F626C9EFA6736EA06DD6
CB89E69F57DEF383F6FF540EC947022AEAB1CC68A2DB705B6555BFCB2CF2120A
FA569A97EF75B7B2EE648F5FD26DF62586CBEB5EBCFEE9418D3AD7256A57B654
49F0A67EB7501C6B9F72E0FCE72845C377AF9E99DD6D04CCC7ECF696762CD0DB
D7FA522C161569C9545FBB51F2B2E1DFAD98D5355583E39C2A3AD6EAFA809FB0
C83BA0BCEFD4AFDBBE9BF7FC99843E3E7BC5FE74706A7D5B83B4DDCCE5CD6DD9
B643EEB66AAA418DCB75CAFAB16B49F7B29D7C834A7A2A13F76BF596DA43C911
2F359D988B6DC966666B955B83040D0FAFF4761D98CF69E329636AEAD37EC046
F8E344975AF67C10DF6A55E226F99557B9F664400B46DBF04CEF0A379E333A37
782B3714F676E6866FA47A821AB751DFECABCBB7FD3AA922E889C9DB5BE419FA
E5BA6F396492DE1C4B9B075878541DCDDA9261B196A278EB8686D1185AB8B9D6
7F2D39734EFE1E3F3970DC9FBEEEF58FBFED9F2BF56EF6A6B467E7C76C6B47C0
A64387EE70A8364E9B27FB7CBDE9F775AF2952DAA29B595296E946D25FE9F7FF
A1A86DD0128DA0B99D62A63D98E8AFD6CB0D95B9CE0B6B26F54CB55B02B9A25F
EC12555D3CFE2057105BD497ABDA2F861E24F11960FB3375457B3AE921DEFBD7
BFFE757000893D44571C3E1B2178FE77EDDAB5BB77EF068EB228349A34D89220
5B4FB752FCD430B56C3A3D363E32363CA492D03525E014E3EB9517B024105688
3D190D1A4BA840316B03F13A0310417E003E8BDDDBCBC6E9C1534312F02E0E25
0185BE25F50826DB58CC3015BEA9CA208AAB0C9510A24E6191AA73146C4A78FB
B89589C54D309176D76B36BAA572BD566BEEDB3B3137579C9FAB761C952FC4A6
0306CF9C1AE81CBC6C92002A0064516B0073AA47DAA11CD1B9713867A73078CB
27338393EE31D14BA2E7837F81EF8BCECE57499D8854124AD59818A7587829C5
802041BA0285F9CB781C9AED48311D337A44B001AD01BB840709900C297043AE
AA6223AD16BF0EB33C245C8AA623EF1265C74C667C7F9E5B047B0F9704147134
41BF8631046B402C658825798B256C5A9E7BB824401A352C09F047FC49873AE8
A2B2E188F7A79E658D97C554F39078FE016B8A1DCE3373E0C001556866266A6E
39DEE94B0F77CC8FB666EAC6EAFE57ED4EBE9820BD754F6374EA842C0D4CD02E
9766FA12D64CD7A72D2E3556C4EFDE677E901AC7AF886DDDE794C90A0ADD3BE7
0AF3C9B9CF37E91C5DCBA432B7353DF258031FBAF9B85265C2D9E25A19DE7581
D7216313F1BFCCB0C4F98017E4518D8F8FEFDEBBDF4AB971D7D2BACBAB5E9B8C
03961198DD54772870E79B0AFCB99FDC698A27A8D636ECC01CA0551AD527364F
328F8BDD1EB7DC4ECB4AC63F9E327DBBF6E559BBDCF13666FCA4E35DDBA64E8A
D28D2CE5B5B8D15C9877143A92997513D54C8D3EADA5BC60F4EBF93D131E7FC1
54E8B4137EA6459F207D34DBB76F501B76F4F2FEB93B28ED15EAC9390505D1EF
8E6587E69C367DCC74465BDAF3819DCAB6065D6B43D2D283FA35930AD3F3DB79
7DAA6B525CDFC492BE99BEC7AE6B21485FB34FB7CA2C533D9F0A5F3E69AEF802
D9B1BE0BB460F750E5FB3E6D98A38A93DB46159DF2A356E9535D65F7B0CDC16F
DFA6651477C999D8EAC7DD42E7FAB964979A964EF76668BEA25D9908622D6B93
9D8E2F6FED9D769627DD4A9DBEDC50E8A56DDD24C353584EBEF264B84CCFCAF3
F699CF7CE6DE7BEF4571226F015E08DEB3705722DF4C9A83495E22DA49C99751
8000C962D022982B279C70C2DEBD7BA1C24665C9E1EEDF25E8F7F0171DDCB0FC
0056EE78D0FBF6ED8BDA11E1E654F7B162DAF0F0D0EA95AA5D81DA549AA2ADAE
EBB04D004920EE20D84138A25065F00F88246021A018962F887587B4B10CF021
B411D4C9101E07F1D1345BF55D60511016169866DC58042B5556C36295836228
76228B0A6105F5D5F1CB95FAFC5CB954AAEEDFBFBF5454B9B97E9839CA3601C6
BF6CD932C0B7F22617A349EA06846145ABDE0E57188FC1D931EF92D72F251E4B
EA18A2E7DF78E38D9B376F964A10293BE45F590CB0BA2D1D7445A5A530C82168
68F89E956B3E93B930C2D41870B44882425B9269006152B892412BCCD180CA09
060A87128F070DC850EDC5E7A3090CFF247873B01EF892934F3E99D570A651E4
35A3A8F888DE21411E04481CAF056F1E8822FE57D243652196A4A8D1A136E812
EF106C6A1EAAEA2316625F4BD8461614D178F46B5BD27A480E012A87570AC56E
3CC3C0C0401ABEDE8374545697795CD2DFE95AF9C6C5311A98A5BB48B1307EDA
06EAAF2D2B3E38A140EA3F1B42D5FF0369AFE8B15B92DDD94EE23E27538BCFDE
A8998E6F7FBE5BBF8B56EE5AD3DC3233976ED0CA78EE0D235498ADFC438BCEB3
4E7A7EF48527F616A63334A0CFBB15A55F5D1E23C3A2AB1A128B42F91EBF38AF
C533673EDD2DF9DEC3DDF1727A7EBCDEB988B49215DCDCB5BDE1F6C08C7676D2
480FB837EFB79A85AE598DA53A8E4E469906EFB3E67FDB4DDD4FD534A53E3CDC
583543B7109575D541F8928C8255BBB555888D5A863F37B7D0D5299734469617
CEBEF8F2AB3F7D8563B5565F7BDCEE5889B62EE8D5ACAF55733E554CADEFDC53
CB27EFA0F3DBCA47C0DC6F335175B576F5013600CADEB255D49CA3A27F2159B6
59B9CF4DD763AD9CE35DA31C65E6CD54B88D9A0D0A36A6ABF9BAF109D206C97D
848676A48ABAF2D29011A7FE8EF9B9014AEA83EBE7A6C768E8836B66F55762DF
23E70593D6BB0383E46C5C5B35F8D141EA72B351DC677F3FD72E5614F65E6998
45637763975C9BEE9BD6543441CF9D6399C9D50BFF738E3E3EAFD6EE6ECA5492
B564932EA313F69DF0D2775E4AB433A96EB2EDB4EBAE022B35E30923F0D1AE83
F72C5601CA1F227F02C0CEEA39A00198A2F804DE6BA266B1C2819CD12516B314
63CA8E408C50808DF10D5F025D33DA890F5B00AE0B38600F26CBB11878EB5BDF
CA7F3FF1C413303D10C743585969E814E47299552B98552ECB645286AE0262ED
2EBF5E1BDE21A95D845F088EDD285E69541228A7BF1F1C0C8A6A08B2634BFBC2
7315CE62684B04C27C15B044C082286EB3AE6FAAA085AE85718BC5CAA9501D76
E4CE763C1BB3E328D3ED74DD72A93135335F2C5667A70E341A61C9854209B782
45B00C1FD6197FC08B53CF1D246E5F245748EF49796BE13E62221C8DB3A3CC07
169824141D9E2A800F0F3DF4D0D9679FCD2780316DDBB6EDB2CB2E43FE9624CE
F34262B4604CE242111716F83EDCF4D4CBB54742AAE06C036D0D3A05E2E102A3
0D162CCA08326B59A9BFF2CA2BB76EDDCA5731EB671D07AD80A3E2506AD90514
081873D1E00A1D294E103DD6AC5923DA09F82FB610724FA39D5365DEA8577776
C438012AAD1037A61E123B042D9615E4CAB304DF0E2E9715C1372221C4310855
0BEFB872E5CA0F7FF8C3DBB76F478A8152C1F4FE8174D173FACA9FB334ABBEF6
2EEBAD6FF9B39F7CF77FEF7A68BA6F221B6CA9AEA4E5BF2DEC1FF8DCF19D855D
2DDE43A3D6F8C695B5FE1D55E61ECDACF5D9B693EFAADE26F7D21F75FEF8A9EC
CFED6AA23DD0D2CFB3D6EC3E75E7EA67682B8DAEC9745FA20F9DF577F73EFE10
6568FC9CE34AED46FBBE19294E14C43D9ED2BD1FDDE35535F7D1CEF87C7A6EAC
DEBD80F45ADCBFCDB33B03DDB119EBEC7C3BB068FB8CD52A7463353BC393C59C
3870AF31A9D0C84D176A5A3BDE186D7DE165AB46F174FFF8AA74FDCC44DB6B2E
3CB8DF68C4937E27D062F6CAE5737B5E29E4ADB946574165C4DD551F5FB5475B
A0AFD4CC5AC2355A395FAF187EE293A7B4D22FAED93658A622ABF9D317B95438
217EE51ECDE8B483FE4C2C5FF377DB7758D6EEA133EBEFFED157BFBD502E791B
1BC36661768B137CAE4C6F26FB67C7B9835DB7BB8F6E57CC63B493AAB22C0FEA
258B99B766BE77C0301D2D36D4CCB839B755F9D2F4BA699A8B0D54B66502679A
BA6DADDF369EB5285B757F48FDCF8D3B6E2B46D9627E8FCA53F910D10A32D836
EA1F6E561D1A2BD27A2AF8B1DCE644B76A4F6E6FA68254D598316E4EAE7D7ED9
CBDF7899DA66A26BDB09BB1534DB9D26297D57D1181CAD68700BB506A0BC2021
FEFEB4D34E7BF6D967F91B3E13688C9FFAD4A7F827DEFE08DC3221C1078B28A6
A05B623731F949332869BE0BE2974C6EC42A60460B18306A3F11F35B643E1466
46F31067676797D4CD86C244ED24CB3247860A2B562C63553461AB7174147ABF
0A2176BDAE788744124443058B4102E5BF89859B4D0BBC431BA9F78441EFB13E
BC4F8B0CA257AF109019C6D099C5ABCA8698D16B5A498BCD52428D95202DD5A3
752B2C6EE20BF56ED72957DBB3330BC562B9522C75BBBE42CC53F690C211840D
313838C44FE4254166BA4C74341F349AAB23DC768953E26836013076F03DAF3A
FAAB1CDB8680FF075C15B811F08C5F7FFDF59B366D42674A490317F84FE1E3E0
C84C6DA81F79FBDBDFFEDAD7BEF691471EE15FA389ADC86BE29B7FFBDBDF3EF3
CC33A17100E3881922D3229FC68C1E1A0A38FBF8F838EAD144A421B48BD78755
2131555693F9644426401E479404523F41BDEE922C6CAEB8E20A385E00F48680
DB119B05C9BC2D31D496C409647264F96088A0FC0D5204854210FC5141824355
59C6E380A70DD1BA5ACCFDB14CD8B1E2F743B67E4B6B518E7253F146B2434D66
D403ADE30BED9D3B33BEDBB453463B96A04E4557814A669A89C4F2567D8282F8
B2A03E4D036EDF829DA054ECB50BB3CFA8FD11C48895DDA65DF51BEE904F0D4A
F751BD6890E3196E62209DAED64B0EB99EAD9A7F69654DCA4DA3B14485B79871
9341CA6F8D959D26E9937136213AA966A6A97AAED8E1FCF3D726B55DDDA69863
7496797D0D725C6AF05DA772BC6FE8C47AFF4B6E2D3029E93ACD94CA064955A9
9909C9B1DE64538E2A359BFC91D38EDBF3DCDE5C7FE28C0F9FF1C457FFEF8C97
69CDB51A298588AA359C4E2E6C52366BD2E0E0AA85E484F78A6BD06A6B74776C
4AB1258B72737D9578D9E8C48746935395D2699DD17D54744EEA18CF66339469
B3C56098654BB57E1B75CDA9AC9B6EF7D7A9DBDF555392F4A8B5825882EA35C5
933FBDE9A30FDCFA0F566338994E97BBBB5ED54DFCD66AC575B2DA094795F3F1
D30A9ED56E0409CD0906C96FC52BAD981BAB93911A6836EACBA8B37F1D657664
6ABAAB273CDFE9B242BBBC4D7E61743235C546DE506EB43833AFFADE245879F7
0357CF6413306A99BFF3BF9FFDEC676FBBED36701558EDD8D4480D87058FFD08
080A49E5FAEBBFFEEB1FFFF8C72803E2ED2328875044A23E1FA90712030298EA
824D2DD503516A3F84F940F76182466483CF08B7CD2214A86AC8C3F49D8A8F8F
8FF2AE1EE8CF841A3AAB695D9104A13EEE1DD13B247CD3A04566BD4412847EA0
40840136B3AF4614024D1F2A09541FCD304EA0BAD6841163CB8C61B7C34BCE62
08E69817A209A90454D5B84261CF2DCC978BA54AABD60EA535BF42C80BC80B4B
91CD934F7A15BFCED4D414F826E201C2FA71F0E3A4817B548D3D2419EBE89C1D
8B114D3B59825AB1E47C187DB02424DE8B2587FD08C41B542FF3E480359F74D2
49285D16DA92AC4A383170B2A0BF89120DEA144B08969604B40175C74AC3C4C4
04CC88071F7CF0A31FFD685475805F886FFB99CF7C867F65E1C4F7E4CF5BB66C
8936553E5AC4186616183D7FC362808501FA150B8C1DD29FA2DE2461D6D170F1
E192209A80B48851180157970C0DDE87AC64EDDDBB17A0B351B3EF70AB8507C3
2F2B85BB700D510818C00F8241F3C642E29745D6765A093DD9F4CC4C2E5B6B94
B3E9FA2983AFFBF9DEA7694495110C05DAAC1BD07066A063C4E6DCE9612A2CD4
CB41DE49375755DCE34F78EF8E3D2FD5B5C9DC384DED2A698655F7421A2BE8B4
C0268CE1975BA4399AAFDB46CC521D6514804A27B228123054CEE5545FA759F6
D2E16F1D153136B456AB5FF5DF654155A094498EB532B37772C176C9D647CB29
87FC1C75260CBFA3366F56F5571B745EDF747634CDD6B8956877DBFDA97CB3D4
9ED42BE4F8CAF363C5A84B851895129ADB8C1712297EA7C116CD9BFAB06B2557
8FEE9ED83DAE6516B4A6DEF1DA266FFB34F92A8EB86224B773FF4E3212635EEB
00654F3C75F58BCDDFD07ED3706C8DEA06C53BC9CE7F7BE75FFCE4D95FE49D8C
5BDE5BF350459A27A746CA2F1667ED2EDF6D95629476AC76CC8C3BCDC680965B
48754DB7C5824A1B6D349F2D0CE45293F624CDC4546E51CACE36DB4150ABB394
75286B67679216C51AA4B5B485786076B43E4A35629D56CC31F3317FD2253313
D8CCFE6A09DB6CCCDB0E7934DC3FF6E76F79E713FFDFBFED9BDD17A848A5B6BC
B06ADFEC6EB6C0E0F9E9EBEB63D2950A2495F1183A3FA385C4D21851A80B7C9C
25C18F7EF423563504AE2E6AA3C3B729ED46A225EE62DDC2BCE69180F8A3C525
517EA5A121098FF58C33CEF8FEF7BF2FB63CEF20705E5D856A5531D7D0506174
74B830A840334C5E6CF2A39200DC5F22C6D186E98B416342CB012D0C45ABA644
9AD6F3BCF75ADB532F7C1746A47D651F2C4A02D54D4E69F2E487B8437A585FA6
24412A915CB439147C8D32F37976C21A2387EFAECA23DC80C542ABE9144BF54A
B9D6AEA1CC4AE5A77ABE1728694776C28A9909405A22F42A65A251D1CA93C89B
9C27873779D4B92CA1DA2388D91E6787638E5708656202591AE52C4B2481487B
AD970C8E50019E82AE907C5B04302115F8CB37BFF9CD3FFCE10F212AB41E0E9D
DE6B5C23AC100B043F18540C8123C5CB4AC1D19D77DE79F1C517F3DDA0ED4A0D
334512A225BD073E74E946201388E6C0C82B3D9A77086313E545DCA051E7D297
BFFCE5EF7EF7BB3FFBD9CF60C780C781F6B40880C4E1DE21019F88566062E1C4
D440701578D49899C36500F630426BEF7BDFFBF8E44B2EB944EAB00044810143
E26EB97EEBC6EBFF2163FDAE5326276ED81DEFF4357FFC8BE99F53B3A0E9A5C0
723364E6DAF6AC99ED1AB39BFEEA3D0FFCAF7F99B3C3B6C00B669B92F95475D5
90FDAB729B3AB981A6BB60372C2DEBB6824CBA96ABA70EC45CD3E95814BFF2E6
2B6EBAFE965AA3AD42BE66BEE93474DF158026EA614F2907603ED72DFAFDAAD3
D882F23FC5D33C79E435975172221D50DB1F1E1C5AF38EB7FCFC5FBF97AAD51B
A63BE8D2BC4DC99C65CEF0E9F92699A9E1B9D80C6BF3FDFBED723C96E834BB26
A54DCF6D5BAD91C0683A9D6A5F96CAAD55697B4F9315F27486EC36955D4A04CB
CCD169B7EAD61A69ABBFAE15797DEC34651672B37D1D2AF7AF5AF657FFFD8C07
BEF40D7BE08FDBB34FF653AA491537468193C859A9AEBFD0E2658CE75FAFA79E
6A94BD0413B35368B1DC2A4C697B528192085A32D770BA434E67D6F6A99D2296
8C5AF5DCBB2EFDD7F3BE5CA2A94C2AEF37CAB5B8D3B2F8B9CBAD525D8F55DBED
416535301B88F5679C498FE26DABA3E2989A4986BBA2A5972851CB34D848EA7A
693353775B2B29D8CFB2D0EE260C6A3512B9B4A775BB9DB5CB57BDBCFF85783F
EF02AF55F2D9904B0D263EF6B18F7DFDEB5F4731301AE1310B061300CBE62D06
EB59FC45E22E167B0EEC8222D0F44C69D20596FFE5A77CF18B5F849B17D9A580
FCA23025843FB0D1FF918F7CE4C61B6F946A01EAC5D5A2B98E8B9C28E426253E
5523A3DEA887DDEC1CF18C436BE6C7302B4CA6AD6C2ECDE3B378285EB7DB6E05
E4090A9894DDCBFE719D83AE5BEAE11084AADC21A2428FC088069143766014CA
1F27C35D6359763C1E434F06D5C12E1CB08A9F049EABEC03D60A583674DA2D16
A78A2934EA9D688213456A02E848874C96F06E5403F82156FE073FF8C1871F7E
18A2FB6B5FFB9AD427C31D8F8C78247B61BDC5C524778BC2E3403345A0654987
7AEAF51A13734F381A02E37C7356DB592480E1F27D42C3E8F7EE7D864C628C41
120FF8D1AC9E5F7AE9A514A63FB18478C73BDEF1BBDFFD8EAD04BC02850E74E4
334043416C96050674104950A6103B0880A96C2EDC7FFFFD14715FF44A4C0CB4
B68F16BF601E98F098F9B25D02870C928260E2C0498AABF013329AA807A7C18F
7BFCF1C7317BD13914945649FEA148AC05EB88F28868CE867E6843639C26095D
48B1553FC55266BD38908DCFD43A5A4C37BABEAB8758D52D2D4D85364DC5FAA8
558E27529A156F0745AAF21CA4B23E6B9D4E5BD7FCAC67F81E6F46BBA67AB377
6AA97EF28A31957B339CA5996A5AE9F26343F1E27407DD9A023DF9C94F7EB2B4
30FFAFDFFA474757FE24D58CDE48078EBFE9868D57DF70753C8883F8A35D1698
49F1BFC23ED0BA1562DEF652F1845B6D355D668E85245528D5D18788E62857B7
F7B3C2B62E3E385BAD555456AC7FF248EAB9D9F95436D9E0F909D51ADFF113F1
648BD5EED0C12032520B41B061EF222A838DC0748B85E07986579DCF17AD4234
8F834D767BEA3654E66853528A246B4A873EFE15A9D247DB17927707E500B782
B98C617FEA539FE22DCF1A21AB0BAA8229EC29CF54C723E491F078801B11D5EE
A307DF1C2A0E583C9FCFAADBCF7FFE7394DF239F2DEA27B8EAAAAB986859EF11
64147C80BEC513C55ADACD37DFCCF4C99B4226966FCE037EF7BBDFFDAD6F7D0B
247AB44A3444171413E679E169E59131D30C2583B138627244A188C50CB07B1E
8469A9D91F2CF427F9162A461B322983248BD4EFF58A5AD4912926DC3FEA4C3F
5C12881E47472AEA8962DB454F0E733D2CB486C7F79EAFB898AE38A9DF6A75D8
0E28162BD54AB3DDEEB88EAF6203A1A57C7865EFD1568EDF1A4806D42B7685E1
221C4D405DA6A7A7A3A95A0F3EF8E0F9E79F8FAA60D61CB76FDF7EEAA9A7BEFC
F2CBB0DDA05C030E10942D2101B036FE063A26EB0EE8BA2E7325016149BA97EC
7E5415421DE00BA150FCE70F692D2949381280E20133C14D4E4E02F91961095C
05FE0B33223A037C3E5FC5CC517270E1F1E70F175C70014B97647880C9321B85
6B2E8A2247BDD0BD284100CF4141AFD6435196BC29EA75B611D21259FBAA57BD
EA37BFF94D54E0214100E216A178ACACE08A63C062DC483A87886789A25F7FFD
F537DC70038C2D6613BB77EF5EE45F5ABC3FAB552BED65C79DA0EACC83164F6B
CBB14DBD1578594FAFC6B3D429F72957A555A1567AE578B334E9EBB14C590FC8
74124EA7E5D2F81B8E2FFF62678B066C6DAEA927F89D6CBFD64AF55150CEB586
2B5E95AC8E4AE3B153546BF4F38EF6BCF97253755B0CC8B04C4B8BB75B9DD7BF
E1B5FFFED4BF2BE33A74FDA1109D1546265ABC91640062539C7EFAE9BFFAD5AF
28A3788161E5FACCA185D909323AC680E675BC810ABDE3036FFFFABFFE98E54F
DC48A403B3AA353E78E5D9DFD8F6E5AEDB61633BD797E5A79416CA4CDB2A5E12
822B00AD0FB532C22BF55E1F85F7BEF7BDCCB95098C2C3E02FF95F10306AA1A1
1E615DA004083B030FED6999076BA6B00A4C874CB41FFEF087B76CD94287BA70
0FA77FD01BAC70D460C2A90B956EF5EAD5BB76ED829040AEC1F8F8F85FFEE55F
FEE33FFE235FCB940005E81892068E59A908938E31D1D78166C32381C8A1D038
E04D21B5F110E4FCC4E38F3F1E68B81469CD84B738E9A4935E7AE9255C723449
206C56E3D7E0197FF1C517E371655F187A6C314BC96B8BE1C003EBA8FDC61B46
6792CDE532BC6973D9740843A47C388BCEFD9EE335E89517841B52837B0BFE5F
E1FE2A01F550E0CFA8457FB84DB084716BBDCA5E960489F088F58EC5458AA9A2
AAE242797676616E76A15A6DA8F50D8E320B47CA5D114980A44C8C01DC9FFF65
6687A2412811D85AC8B9648EBF61C306291184F017B50B6F0AEB0F7E15147F82
6B838347B38C252F984987BF018B14D8350ABDD2AC149C73CE394C1C7E0FE759
10C97F5F9B20EA61D723FDD1046561C99E1109443D158C298A7F42E349FE9345
E0EDB7DFCEA365FB94A7457A5E82EFC3D189CD26C1799E31BE03B3067E657E04
8ABDA589665443D47A70D6D1A651CB962DE33B63DF620205FF957A625B860D19
26941044AAA6E17D82EE2930AED8B13C064805967CBC703CFF175D7411D01F11
15E70103E6818766DB6E9BC54D90CCE5F28DCAA44E7AC22878C64CDD8991E1D8
8978BB96562D8D13DDF48A93EB3B9FC9FBBA1BA84827E9BEE9939FD07C3DE8F7
E24556AB8276C619EA92DB318AA9F4985B99EBF415A8D9E8EFEB6FCC1E88ABFE
B84685A58245763D964AA48BAD9299B41CD5D18062BA459EAFC70D0142E02578
DBDBDEF6E4934FEED9B3476276C84BE199FF8BBFF88B6F7FFBDB7ECDEDCB0CCC
D7262C5242818FB26935BD011A997A6B7AD52B3B2627F8B6A3392ACDE6E2764A
CF4E2D4CF7E5FADA2AAD4D2D564C29CD66B3D5E4AD373434F4AE77BDEBAB5FFD
AAF812B530B39EC99EA78BE793570DD11AD4E10BB1494B258AA0FF6B11546069
C82341A62826209826AF385452583C47DB1742004266C27325B51A67627F45AB
2CC18590A27334FC2EB1F591170E6051D849A2F1043D70213960E30AB03CE85C
500FC4BC330FEDB8251185FF9424402E20AF8161C045A5F79EAD47142EC30F2B
D454FC58E3A989F1D40F0EE45924C4C38081C48AC1DDA8E7520875310F0A353C
95E2D5E5FD1265C47AA4E7A5E8EC51E00A39010E169C03D38F9704C1C9D05314
5F24054F6913070E4CCF4CCF55ABAC86F8BA7223F33A75974C81C89A23CE91E4
AD47EB8FB078200566C4E8F4C2A4CCF40A468378A672A62593D2361AFC0E2A03
7CF79B376FBEEDB6DB98887143B600000A8FA62B7C7FBE037470212C3068F10B
F17DA255CA5087F90E5A88B8191C1340FBD89240AC3179651E0F5CE13C24BC08
202860C488E704C939D8DB3C6C5E1A3E19E347718D9829E2FA44DD0DDF0D5210
89B628EF40E6B51EB6F7C1B4441D6B92382BD9143CAA356BD6B02A245C3B0ABF
C197A04D1046C8E6058C2D545A40AF94BC61EC40E9754C618898B7BDF4A8A1D0
14E3F3512E84D239F82DB12378E1D25AEC639FFBE83D0F7CA153567DB85BCEDC
603E5F2FF2966EB463CA7D637B5A9BB97DE0B07235FE2767FCFC89E74941A8EA
05DD6DB6CAB1FEBED2BC9BA5FEA2B9CF5C47EE8B6405B14C225777FD8E561CED
1E3F957839C3C68242214A1DC891D76D582D6B15C576502B6925F9C55C4D25BA
E40672D5D9CA486E6CBE3917EDBDCC621B762D4015A39631C05659ABEAD757CD
E96DADDF88D5BC6E779A52BA5D2DB45333566398A73EB12ADDD8339DA4462A99
657EDB26753796768B7D96BC2E4B0AC332B2891CD3B68482E07E11671AAB563C
9F4C244C06804EC1F2F1B47FE10B5FF8D8C73E864C0104C3825E3B2050059409
3F82B849872673078716D0F09245159A2507AC169E8DCF7EF6B30F3CF08074FD
C316901A20B4848468C1E605FA0B94D1CF7CE633AC0E1E8DE762B380B450318A
9A1E307AA90CE713E00882F523505AA267A3331A760ACC11AD578C866453987A
D190EDE1874CD74134F66653C925CF0D3C1FAC3C80AD815988590AB68194D74C
25CBA6D389E1C2E0F048A12F9B512D0542CF3B80AB4061404A828C42D5037608
4AE0906E4A915A2D513F253B4A5CF912F1839A860F6001522E914A65D4E38C10
61224C0A2A576AACEB4D4FCF96CB151EB3A994052BE48FED288F8B78A88E3C53
D2A55D9C866CCDB1ED0F3EC5C635D82258031404F49167E24693484C02335026
653E0D1A28B6223276204159B8C2B46432C5B6BCF8E28B999E009CC9FF32038D
9AD56216F0255227F24FFFF44FEF7BDFFB24EABBA472ED3F736887D6E8CAD200
DC1C8A89003E8336F02E22AED8BABFE28A2BB04FCE3EFBEC2F7EF18B181BEFAB
4F7FFAD330723145921ECAE3FFF8C73FFED8638FE126BC57D7AF5FFFC8238FA0
1501F247A13409DF073BA09E47580251FC2FDB04C8B016FC45C9AD86F30DC3E6
097FCD6B5EF3A31FFD88576A6A6A0A7C1CEF026582427713BE91DC50EAA5EBF1
C8996BA02A5BE0BE21E7D83404DE06CF7FC2A366D2F359E3F7FA13D954B1B39F
D96426990C8ADD7ACAB0AB669C1A158BF23EF5BBD4B73AB16377AB3E9CF58B9D
11CF2EFB9576960C9F8EABD36ED2BB397F6565E581F8946374294C15A596457E
977518AD130F9C0E30BA121AEBE8C957BC265555DB74E62B9EDE4D0FA4EAB38D
34A51B5A031C0DEE4711C9528F12CD3753F2D2F28F0BD64E7476B52D3A75ECE4
67E79EA7389945B263C383B1D57BDABF881B34EE105B3573069DD4FFC72FECFD
398FC736129669B9BEDB725A9A1964FA32DD8603340EBEFF19679CF1DDEF7E17
79C39270F5E10F7FF83BDFF90E6F01F1D4215D4D8F405A458B7BA2753F92E907
1E1AA579AC3EE8E475AF7BDDD34F3F2DF473344DE8BCF3CEFBE637BF09C90409
C4120B355F880108E00A9CECE0545AA44E78D5AA55A13978E4FD05868EF12324
C6FFBEF39DEFDCB163071B67926488F3A3502BD8E950FFC578C26694BEE87084
42D6429996D4C1238EE760DD8C40CA2C2C280F064B8256BB95B013AD760D9318
9AED64C67455CC1EA06D0099160DE4FB474787D9324824E261984F83F90C5B1E
8001EA955C1FAC5F64DD6243F3C09379914316236A1044537420602463241477
CAF661AEA8870845FC46AAAEAFED2C944A3C41B56A43016CF5403D559981662E
59F860B176C13BE24C895A0D3F03AFFD9FFEE99FFEE0073F10BF81D6EB9F05C6
01010E29082340C043B0C09217CC775BB972251ACB80D108E7E2D7E413E07F60
110289224DC6F989921EC04F81124DBD444FE9370285EBF7B509240821732E29
3AB091796F408B9483BF04D28EA442E37B0010014A0F99AFE8F3071926C164D9
B128BB03D387F70CBB450027C4F12806324564B9D8C2D22759901771C0E12066
013F8E772CCFBFA442898D225D9F10F0E0717EE0031F6005F9C9279F04F64634
1B18A749DF8F6821055FF5F8DD0F95336EB66FA0BBBFAE25F5567F7DDDFB4FD9
F195E74666E3D36627EE273AD9165D3040CB72F4EB260DC4C99948254F69DCFF
DBC129BD93D36B67AFA2E3780C75DAD83AB572D2B3B497B42AAD24FB03E9B5B3
851DCB26CD1BBB1A9919A36FDE9B7797D1CA0FADDEEBCFD2503EF55CA9F1EF0D
DA41292DDBA6866778E4502CB03CDD45C5197CEB62B1414652CFF7CD94C9D294
5FA1DAAA356B0DFD0AC33FD9A3E75753373E1EAF4FDE3231EED2A491A40D295A
3947D5B52A8FB3386B3E4A6E4DF9606DC376DAA1AF23667A9AA3C7F56ECD61FA
446EAE8458246B19A63C103B102BC692F100F8335601E42D09C4D89858EE37BD
E94D4F3CF104985A1462011A4CB473B5B8FE8E260940273C4E9E1960F844593C
6E22EE170C03A20B8A1DD8F431361DCE475C977A513DBE90DF8E0709CA416405
23841A4DBD9A24096BC16C824685D80046150D644AF4F1187DD70F66910A7E8E
02FA0C2BBF286CDB42DAA2A32D95526D639BAD3A9BD146081581060609DBCAE5
3203FD7D219881CD2390D26AB14770201145120717D94DC41B239B39BADBA392
20E8952C2D36490849B657C8D6092FD4BC109C4349B2966AE2DC6876231DB8A4
89F2A22438021D68C742998E56159C74D2492FBCF00245BC72606102F3CB1312
ED23017E874602BC48901F50858040872594FE6270FCF169F0F59F7FFEF96C19
00D8802F17FF29880F6E6EBE33DF07098ED81ED0FBFCA3E3A41F8332A2BC1592
00E28DC7303E3EFE9EF7BC87B5FE684347DE36121046348CD9222C18C842B4DF
434E348222B08891D500D6132DA60753802601791FF5DD4BEF2051204474E93D
586C0116852B12F483A01F9ACE0BAF814F2F08BBBF36C243DC77A0C025160F36
2AB25AF94BBE613403079B50EA15F859E9963DA5CF59F95CBEA8CFF8A565171D
571A28FA33A5E0DE7CDB2A8E34AD92D6F5AE49A53C5B7B60416B51A093E1D002
4FC62ACABD6D55BE10DFF3E5974E78AD7DE0B4D4B6E6B5E73DB691D2F513FE7E
746F33D0BE36DDFAA84ED63AFACA4BE66ED28653F4AE11634C6F7F69C7C82495
3F1F4B3E9B2B7E793EDDC9B7A9EE9A0E196479F1AEDB01A341426154FD842701
7E9B8380B53905075CB858AB3403E726DD1AB43B7FDF1C1A4EC6EF6C4EB21172
31B915CA6FA7A64EB92D89D9796DF889C4CC8B0B2C75D28974CA4A571B559604
279E72E2AE175F913C0210BFE446335540B71067112F014F269F2339637C1AAC
4CB8BCA54A1C309FAC9C7DED6B5FC3B40B3239C248B029F933EF4A74F79562DD
23D27FB4C211A6125FC853213C9A575C767494C3224688978AA6501FCE4FC452
17ED1688BFC8ADA2D04D24660DA2B64B6004C1DC51FE097920452D204EF8A044
B3090EC55B8C1E129D55FFF5C21D291464E18C6472B126767C7C94DF7C7AE640
A9C4DB4373C2B83A42AFBCE9FA72A94261201F1ED15831C232A1E1A64B4AA230
7435383A986C1A092F2F1E60E251D40AE91B059519AF1A527393C7DC554E2CDE
B7AA9EB0D96C2917906EF524DC2108482A7B3ACAF8A8579B4A47169B52F12479
8A48AEC5F2401F9484FD2829A3EB3A345CBD87712D908102A48314608C10420E
6E131093EC842894345F1284CDE879D5AFB9E69AEBAFBF1E6DD6F9DFA86D41BD
B0C1EF250996C848BD7748C418D412C5EE17D7243C666BD7AE652346A60B9E93
68DB3C34E11340690AD5EAF5EBD76FDBB60D15F000F8C4544777A07C901019C6
165D62C18896508A904A34E267F60E9E6464225E7BEDB51B366C8886D9C150B0
85821EAE35D260E43E583EF89D9084CA4FFCF8C73FFEE0830F82E6F3942BC52B
5A2A9929B6DD413FFEC9A1923D6B25A97B798292ADB106CDE8E46DB3A862D1B6
7A9F47656DD5DD977EEEA2DB2F31CECB7BCB62DE5DB3B9BA516F0D79B74FF5B5
D67957EC696CF27CCDEFDF9C2826793A5AA98B2831D937FFD53235C8F295A2A6
F90993465B37BCB28256ECBB699FDDCCFAD4D173CA65EF3782BEDCC1083FF5FC
5A227D29D2FF16CBB4C23D6E371D08AEAA9A2B29F9A9788AB25327CEC5DF3E64
25E3679DFE7777FFF61663743079497F8A16A6572DE4FEC7D8EA97F22F3CFD62
67D653ADE329EEB1500E5C3B136FD73A327BD40BC342E3E159428E1C084CD237
F410120D452DD085B1FA921B069ECE07D2C924972C9AB6CECB2700E9FC6AC816
3B868604CA81A904135FB29524044DBD6C25EC7D7863A06740E1F80F333590ED
060AC11DC043C460922C7909EFF7522543F89CF04B69F7248E77AD872F247A95
7C3EB677489D10CD5E8A9E2D799F92DF1D154A3D74071F9A112F613A150FC7A3
A36BD822C8A8AE5A0DA04988C40F4076C2EE835E89326C313316D643863EA54E
C7E9B5013215D6603A0D9B803F68BD0E218EA7C469A7ED28B9E3F03CBAFCA863
F8C58248B1DBA1F54D3E18314602670E34506891920EAF85A09E121B179A9309
1C1D1D9D98989035964C27796BB17025808CCF20593E0D9DEBA34C59FCD7E228
170C0C1010D41F6C6C29EF3A8661889B4795170098E05AA9608092858C2928E9
D117870C809C13EB55DE5720AFE1207ECD6B5EF3CB5FFE12F1C073CF3DF79E7B
EEC1EB60CC2880C02E82391F8DF7B2C0DBB2650B1443497994ADBE24D34CF698
B00C6C150A5D07E2F117EF99D2DCD3699EF965CB96F1C2892B0FEF2B0E2290B1
B42D425738BEDB1BDFF8C65FFDEA57C0A986EB96225D9429931AAF3566D894D4
DEFCBBE19FD27929DADEA04F133D4AA9996C9CF462A64D9BDA343798CCE8CDC4
6C7AFF3AE7AEBA930FFCCF4D5BA94477738B55FA969FE89C6FF49F545FB8304D
17376834D0AE1C185C5B9E7BDE223E815696EEDC3B584CA729B6472F59B94CB2
E4D66E690DEF8D1D78C459935CFE4AB142B64FB6436E47AF274D5208FADD20D4
037DF54BA74B419CCC8E02C3609554014BE4694E81AF65295D1D2AAF2ADD3AE1
945CBA9362F194538CD1CD65F253E69585E0BAB98CE936AFEDC43432EDD595CF
EDA6B4419BBD65DDD109AAC55275BD411D8D2EBE6CE3DDDB6FA1D0A7AFF56ADD
05CC55FA6AC9DA89CE4BBD1A822519E4A8E6C1F2F11DCE3AEBAC471E7944D4DE
83937FA49A7F7C03A72528EDD65B6FDDB87123F8FE31BC46BFD701972F921DF8
CEA2A0401D94021474D516A68C2D03DA8E3299C30F6C37241D01BAEE701E1E3D
E04F166E2F9586076F080D57E617E6210414DA8583DD441B94473D397836BFD5
407F9F659961266C8C85016F52B4A001CB16A83C248A489998ACF141A8224D89
819E41008D1E9183455703F43E8813C511286031C0FC850580D3651D93F9B87B
8C8AAA25CE653A9845EA058765B5D2A11066F846E644DC0E5149C02C8F6994F9
267A5048504E027460494889410C8AEFB366CD1A26082C8CB05DFE9EF56B2677
6694509AA40F41D0AB279090495411007D43793FDA3C80DD4B2628B2BC81321D
0533E16FF883E0A2086C83CC24440E4ADBF92602E22D0807427CE0B314EA8367
9C71C6BFFDDBBF49C30DEA057EE5B9029285B41FA493229C281D9B615F428943
2C7D7878981F2159E7D227443C4541081817C5E28696C3B75AB162C59BDFFCE6
9FFDEC67A8590B294AF174BE270B09090CC0E20158214C253E01CE0D714C512F
9D51193DBA95EF508D5A6ECCA78D34185BA15F5DD66FF0A7A7BDC2FDFD15734A
057CB7F6D9EBCB4C61B63958B96B3E55341AD778039B620BB6635E99CDDBC61C
D5E98A1020E73ECA5F3A5CF267AC2D669A729E1934AEA8B8C620DD35932B53A5
CFB692ED6E83D21766EAF1DA987EF281EDCFEB73D6803D506BCF27C8612B6232
96D59C669E8C3E2ACCD1424D6FA9728160A0DFF0E7BC924A148D595433C83512
09D6DFAB5FFAC6839BFEE6CE7DD73E9FF253DAF698D6707C8A3536962945F655
7A77BDAEE5C6BC5B4AE4F12594DD58AE2753FAD6C6AACEEA9DDD69D25B09970A
AB56EEDBC3F3E3A0EA4AA07329029583205CD46933303000CF1B941580564919
C4126246DB898373DED37E96F875A3FB9D42BD1E9C1A012D0CE9689CF7BF7048
308F7A9A9C745B82D2038620496BD4D332C11E0FC7255B7204918E49C71D77DC
39E79C73F3CD37470DBE2527B3C060CEB077EF5E7E04DF962F8CF647394460D2
61509A4CE53C2C26746185E26D5802C1964CC4795D3399946DC7C36E0166E8C5
31048948E40D9E22EDDD97C895C8F958305DDCFD60BBB02AE04551BA67289C9A
CD76A7D375433502F2E368D37758CA90D6EB4FD28DC69AB018480A92DC004955
16A8EAA89E220C1A95011222C673317592038A3D804EC24C2E679E79E68F7FFC
635E159EF06AB50A251AF100F8C4C4191DEDF82828A43CF25B6EB965EBD6AD6F
7AD39BBEF39DEF500F07EDF08EED51CA906E18D40B66607240C1883D0807847E
802084985C415830096791D4374493D82892EF21C55F2C00D07E47CADFF92796
134C66C20B586DE433F9AD99EFF39F48D1A1504C7EE0031F78ECB1C7F82AF4D7
F37B9DD7789CA8F4962223299217351F2C1EC61FAA7B80AD84F994D236094A31
697DEC631FFBDEF7BE0787095FF2EE77BFFB273FF909FF249E6ED8C7181E341B
B95C499A785F77B66425FC62AC4E5BC89ACAF4DF5CAB6DB61A99AEB63E11182E
A59C7E32DAD54473A8BE76A17FD73545CAE883EB7D7D33CDC692831B93F37DF3
ACC42736EBF1E270F3D6A9D8C6814672E1F4BB964DCE69F3F6FE65D7A51726BB
AD2F76C7AB83935418A44695F675AF5B7B7C519FFCE9DEB78DBDF547DFF9499B
997D4261F9268C78C330A95B4976C9F38D802C3BE6B5131EEB4E5633EB51DD4F
F8414C2737AD3099BB8D1C352A39A2BA4E77F9B487F27766B5AE53D45BD60334
7E80F66D27EF4AA206ADBC81F234FA6BA346DBEA5AC536EE6FDB0B296DBCAF5D
9C0C98B8EC84EED2BDF7DFF52FFFF22F3FFDE94F796579EAE0F18FC202520F2C
16B81DA0435E91919191DFFCE637D874E0EC2CB37939586033FBE30FAC16202A
26E11969DCBDC4954F11B3208AD10675016AC71F4A0C043DBC00F0496C347E2E
6F2B1E1E7264014620E811E2E414BEC173750CCECE176EDFBEFDA28B2E3A44B5
3F8AE48011C063E029BDE4924B366CD8007CAD830A318AF760F002E74B1A11F3
A04F3DF5541EF1AF7FFD6BD6317B91C3450804E9918641FBAE8A01A6D28945FA
B763A1AFDCF62388A4701A207E00E7B8F8A02003422ED3ED051434E4832A5BC1
5B1C15509A85ED2A66D16E853109C775C0D9A19EEB00B03BE20C4A98112B84E6
538847611B6B91869492C00AD55B448564D0E3869219154D2D00EF8300909A58
F909161885DE24303B987B6242C2EEE199BFEDB6DB98CBF31D10A70A7A686260
6DD4C3F010740AA0B6FD676C02EAF5AB411A2B7F03968ABA68D88FAC9DBDF7BD
EF7DF4D147A3353B514910CDAFA79E2216CDF1E855962CD673892223B8727209
0F1EC51062069D77DE79DFF8C63798532050CC4F59B56A150B00D9EAF0D16327
A32053EA2DA21DC031997E881E0AE59D7A88437C21729982B01E82E9965F0A75
9BE83983D60E7847C119067608F44A8A80064B8EF262AB8362D94CFAAD267DF6
23E73E92FB567BB9EBDFBD4017C54F7BB9F3BB1FE8A97D23BCE112E4159331BF
334359CA7FFCB4D2D8EF566E5E5B39BB5B3E71FFF885B9B9AEDBAF77A6AF70B3
43D9E062CDBBC96B76EBA3D70DD4F35EAD55A6CBA86F3A5EFEE70E5563AA57CA
906FFD2D75D7115D4D5465153F9149655FFD27AFF9E1FFFE7FBDA64BBE4141C6
A272173DCBEA0379DFB1CCF68CDDA5985E7032E9BA56A37289E8B6876EDBF8E9
4D093F7E5CDF492F7476D76E9856E6C2A594AE9A75CDCD9C67D512197A744135
78E9927115253BE95AAC699FE3EBF10C7DBD16CC675A54B374EA4B65E79A5ED6
D5EBFEA2051CF4E03AB408A2A298CEC829807B16DF4023812F8EA717332F590C
922116EDC02A697BD18E524B2481A46020E10DA92EFF85B8DA310EE97F87DBE2
FEB06CC055C40326E70B33912E2647F3EEC240870709F43F3434B4B0B070B4F1
0BF0300BCE0B2EB8E0DE7BEFE51903AEE5E2CC44C5E6C16F7B798A3C4D3C1AA9
DF0B75BD98F8FA81CAB9B8ED99DF69BAEA64A3FAC8F38A2658A065B2A9507D8F
C1D50E3E82D491681EAE645B4A6D459894197AABDC45BD9B0581246620CA04F6
51ABB796188BFF61AC867A863C381A6C0249FF124387B7316AEE60BE09E39647
48C2A5D6C3DE11D3817A90FA12CFC0F7C27C014924025F2AC811A762E6CBB785
EF0FC9736F7FFBDB7FF7BBDFF1F9D2274BD22744E9C0AB09C2D4B1ABCCA5CF0C
2AE34535403725F882EEB8E30E66C4D0DC257D1BD24EEFA1F36332F93E0826A3
1393DC4D42BBE0FE306830F310337C2D5FC57CFFAAABAEBAF5D65B4F3FFDF45F
FEF2977C02B0B2F97C5609C1F7A3705D902802C42D681CD8F6626B8B77084637
6C4D417245E60F2243407E851B5378132A3CD0A4017A6BD49B816072349D7789
2302B2BCD6688C27FDC98EAAD03DEDDCD35FF0A632BE51F25B3462D1F5B3995A
2C4E7AD5EE0CB7ED8A7D6AB53D4F57EF51B502F7D3D0DFC6676D876EA754D76F
53BF776F91F6123DA4A5CF4DB7066ADEE589E5FDF9FDC601E6F879ED55A52B7F
9B6D24ABF966F62CD3CAB98D16B56EA395CB56B62B9D85F2BC9D31DB1E4F7EB6
5E6A1A4937D029A8997DC648C92B53A2CEC49DA95B15AB15A2B8919DA43E4B2B
CE06C974A2E15AA36DBB9A0CCA1F9DED4F0CFB771B3C9BD5ECECD0952B835A61
EEEEA7AC4FA4FB83427067C721AD78CA01EB03C1F2F9B5BB1EDA65C7FBDA9DF2
783E3D39532723667B4E475B04BBBCF4D24B79A1110A963A5B487491074CFF3C
C9122A135315AA34D6081422DB279A810667E092C282287FC00AC29CC597C8DB
9101FCFF3FA25E7ED1F191D813F4F01079B428DF8382EFF5DA8D2D01C03FE2FD
E1028D56C883928F16E7C0BC095B081601E5223DCB509F86BB80AD874E9E0CAB
42AC91099B40396BC8237443379006A0D246BBBDD076988713A26001195555D8
A6D3A9B86DF00D51030C3E224AA56407058B1E9E26B23242CEAC4E761D81B453
6E223E81A9815F8969083A45A7E3C87B2FF16E1D4D1C0003955974C8C4A94707
244576720758A63B77EE3CDC3BE41EDA10867A317DC48725584A117F9A642546
79280400D41CD4BBF284BFFEF5AF7FEAA9A72421075998E3E3E3BFFDED6FA1D5
4611DF2812BD80475B7A49D27FE464C40771DFB3E5C1BB5480DE90960AA92019
4414A9E4126924FDD7F45E3BF8833EC39E24C036161287CCC39686D20D5D5B3A
3383B1E272FE098A3C7FCF860282283C27FC014A03EAFB99C6E6E6E6600563C9
24440F0308C684C4DE510301414B3D990AAEC4AF8F2FB1D3F8A14801E06F56AE
5CC9E344F3292902122B500E90B11A33750A757DAED04767D7A9D4A06F299C51
6A91F1398B82EEF01752072A0DBA6C356953E6F5EDBE34B53E439D117237D1EB
97AD7AF293AD6429DB79748777B931FCD2F1ADAFEE56FD26FB28FBD70937659F
B1FB847F5BF30B4A527E2395A8A08DF68D4DED702E1B9D5D3B94B8E837ED2405
555E2DB32F93AB55175477039D743B6D9F57277F75F3EE89D77493BF4A5654A7
B0DDF1E107D86E49EFCECFD04707FA9385E2DD2F2E0B964F34F6F3B3C855E0FD
6BAE3B6E6E4FB1F64051F54CBE707CA6364977AA9F56DCB26AB2B6DFDBEAE936
F97F47B49A5874D9CD78BB1990D14D745557C72095E86F34CB1480CE99362425
543CA8121F6255E037BFF98D88559E79605249953802C56CFC9D79E699FFFCCF
FF8CD22A7043F10E1D9E3913651190047003F042F3BE4352F87FADFEE6680744
11A811881AF014A1DB2086C184FDCE77BEF3073FF88154DD3319034D32CA728F
787FA65E7808A0D442B3040F3FE2F95059500EC9F20F9507128D20891344A1BE
3020AC8D0452A2448EFFB13C507C30EC5EA0A0A3490FBB1007618362851DCDD6
8032CFC90D6B8053903F602B5833F02FE4D2429EC365A7FA9B41AABB41980D8C
EA3613D13995D23A3D8DE46E16BAB4D8E878B1F1D97F2809F87B9CB244760AD1
88E78767960925EA4A5B729891C6E8E2F991AC5E30233843056356AC5AB83E70
1A824848E343E210533FA2E23C18EC04F06E742C90326C3AB4100C5B453A8589
0D7EC4C1A3F840462BC529F0A403A07BFBF6EDEBD7AFE7B5BBF8E28BB76DDB16
9504925F403D7DFF4FFEE44F7EF6B39FD1A1991B52AA2A85BE92CC13F4DA4163
D544EC51CFA729793B52508A51494C42F82F2F1382D530022074974426F9C35B
DFFAD6A79F7E1A211C5C2B8036D11C4149796202608B306A0DC06F0B2B04A920
E8B41CAD4C167A008F3BFFBA6BEFDF705D438F8FDE90335B8DFD371673BEC218
6ADE1450333E7843AD46FE28D19EBB88A658BBA7646A55E2AA995DD40AD6E4B5
574AFDEB8716C666699652B78C25C86952D3A0746DE50CFD0DADABAED877FC7C
7C53D3ED50814626687AE4B2E533AB4AEE144B9FFE95DD3503D6C8330F7E875A
F1D599FE5A71CA20DD61FBE35A37A12FAB7D7E62A84CB359323627BD058BEE2E
E72B03A5DCC2E0679727ADFCBECFFFD6A8F61335FC81CEEAF6F257683F5D68D0
80D7D734CD8A6EB8E9992F36A8D261B955FE30D1F1441D23995ED39E2FF9B7CF
B378B05A89D06BD359A627A71D6ABBCDD3060B2FCDCD41E16506C41308DA831B
44504378BDFEECCFFEEC99679E618E8C0E5F506BB04D24590B0A2B5ADA89E22C
196251492086F2E192807AD6ED473EF291AF7CE52BFC38A4AB1DA308EBF73A82
5E17491E3C53CBE4E46434082150C1002C40D49A498BB522E07FF00C88DFE218
F7E717B9E4924B5887E369E1CF12EA3B12DF53EECA73CF3DF7F1C71F476B0451
E9164F88D6CB09005E14E148EB35F0025F0B7CA3EB2C3A1CF4B0A3248A0B54BE
28AC02C5913DFE326C3FA0129C6331856147615041B53AB04C546349E9070215
08B249A6A6A12B273B3F364C305F3461D20A61283D3DA384AA6984A2A5E7FA43
1D426FA58F9A0CC6D68034A10A139C8C5E94C297F2286164388E98452A14ECF5
3A0151E86D148C62D886D10476B82920E42EBFFCF2871E7A88B9BCD42E51CF8A
E45F5971609D94FFDCBC79F3D6AD5BA3AE6DBF07F52A1C135C0F0A2F531E440B
96EF18D9B4D4535B446D877012B05C747A9040964C545412200620FD3579B488
2D47D5E468D85C582418BADEEB780CB583A999FF44011A20C3786FE83DF06710
277611F4005124E5154E38E1841D3B7640A844571067C21247A889C25AE82BAF
BCF2AEBBEE02B48B38D32017BD5EE307C13C001008B30C7ED6BBDEF5AEEF7FFF
FB22EDA4B44760C2165177BADD01D2172C7FC81E9FED4E525C29CAA6D3EABA85
9439E7BBD4A4611A99B1A7D7B413AF906E51E3641AFCB5E5BD2655FA558C52B3
892CE9532B1A997D9AA719CD608C96EDB37C5A71C0DE994E12EB8AB1629F93F6
F375B34A1D2FDFA02E696DCAA663462556CC2BD0379639292DDF61BDD2D45CC3
A5649CEA6D2319780D8A79234690262A25D34EB155253DA6C79CA04381415A82
823AE5A9DFF4BA256265229B1F199B9D7925EB5B35BD1A142839936D6A7E7F90
2959B5205E3FA5662F507B3A4BD9EAA81B2B074EFC9607EFBDECD273E2B55685
620327AD715E78A9DAF3E748D2B05075346D0C6127AC35B810C80C2E5C419F86
F2843421E90FECF5FA0E2D01A15BC2106547C88222E4030BEF0F152790F2025D
F5431C442682A459A38C94227D5BAFBAEAAAC71E7B8C6500BCA0482E5A124858
F222A822460A06A25CC7C810A15078202F513CC3D063166FA8F7BA6F4B948687
F2377FF3370F3FFC30222A4B52D471996455C3C32EC556180A96192BA71D84B6
8E499486FF5CB76E1D6F5AA041457BEEF0ACA1EFB9549DF0377C0E343E3C1A45
55FF6121F5D1A603E569E026200B985AD1BE6E18AD8C8122B1264979122EC9C3
F8C0073EF0E4934FBEFCF2CBD1EC5210BA981A60BBF08A88298A97F27BEDD1FF
0F6BDF016E5755A6BD7639BDDC967B736F3A692410AA140584D15F0699E12723
088A44414A88940086DE49883409485740616823CCC83FA28C604544541008A8
A1842484F4DBEFE9E7ECF27FFBBC77BFAE9C5BC6CC781E8CE79EB3CFDE6BAFBD
D657DFEFFDD03B130B852DD7B158E59C08E000F4460E06AE60F80188AE906A9F
DA85E62A0D6156DC003580F9D1C9DFC1A6896EF52A2C3E00FE01B4A980FDB08D
0C26904F9C248EC8E9E1BA10AF8C9ED11985F9D68019E7F8D918B9018F84C091
4C144C753958962BBC28FD99822F8C905F4A19FAA93027D916C2AFD7BECA39B1
00A02144679C7BEEB96C2061689C1F54452CFAA33B0213018694281579E8F268
109EC6A8701898D71AEE4E85982E766AE31AD697B42E4F55182D047209F450C8
FF6391AC5CB9F2965B6E41EF04C8538C561CF872A52CD695E33A99742697AF83
792C3B30F0EA2F2C3639183B972E9A1EDE09469288AAA21FF7E23555A9C64BAA
4BA53E918A4D8F0CAA81784BAC6454BCAD2ADD946E1D68DBF8AF1FAA8A8AD562
B49F0827C5D3418E0D33897A0E38BB148E04A14055D0C8A5E1C2BA45794F5A30
59187230E8D3C5E5BDFDF6DB11548101013611152699E4898BC58687AB979DC3
9B619E0C4B94396A23ACF397635849809BFAD6B7BE75E9A597C2C7D563AAC6D8
F54FDC714AC33D370424B198711EB4445621F4886053D2B83234ED877CA0C119
28CEE408D6B5C224944B226BAF5BAC0DB05F999D934E3AE9D9679FC540E581ED
BFFFFE7FF8C31F10ED8188D7A151322F627B02FC87A276440C914BD49F3D0676
C10517DC73CF3D679E79A65C42A4123A30205D3E7EF463AC17AB4FE58D6C3FB9
1DD9637269403F756C65835C6BD004244144CE59F6AA88CB860A031D260B7340
9780469DBD52AE8E9B9501806D117707412CF7FBF6DB6FB3940993061D00D358
261039B7871E7A48FC0C4876CA7A02C3E8E1A9907E07FA064E18DC179D4807B4
A3C83D88452CC31337560C6AEE5596A4226085403CC02130D61004A3ED838785
2985F213F304ACD448A3314CD400EE52612F01D6A642D5C93DA2659B7C78C619
673CF8E0833257328C030F3CF0A5975E9201C83172FBC0628D84D951E520DA00
13B2014B2EC6D0D9679F4D620CD040A199877C020E252A48F80ACC5202042597
9663B033111000FC494E2553812A04B194019FD58B1EB095E43DD22440EEE923
F7B517EF8B385DF86AD8B9B366CD5ABC78F1C5175F8C4709C34E4E8E624F72CF
89F34E235494412A19F0E06EDDB6D50F6157D0FAF2F3B973E7BEF1C61BD031D8
ADF07DE11A7AA6279EB6E904E1E29A72FDA8A35A6545AAE49AA0F197B2D49CBD
66BDBFFA83F668AB2AAB844A6E549BC8BB0E510B64271E1CA0BD3260021FF434
5BC33AA170E4DDB19F04EC1E91FB37DC70834EE08C29924B602D8961BE62C50A
CC1E7007FBEEBB2F36A0D8439FFAD4A77EF9CB5FCA36673D3F942841417A630C
15468C919BA5670C3F1821711992BC418DC558724C5697AC19D929722F18A45E
5E0A898A4028F0177E48CC85F1A3565C26D0D0CAEFF9D0915D184655D0EE503B
973FF0CF06A2283A2CF8562E70DA69A78918A259F4C94F7E52B62289C3B0B209
10924F0E39E490DFFDEE77320BA2AF0E3FFCF0E79F7F5E6E12592059A91022D0
810014EA64B9F273D91872186BA0765513C06BD32BABA1128E3BEEB8279E7802
063BC42E79CC47D50488B3E30CBA49082BC9D2BA2A32D7EA84AD895142CC3B62
441BE16C76B8C484E306D1C000F25DBE85AD4D520A7E258F524E059313B60971
FDB8048D6BE25977DF7DF777DF7D17FA03F97CAA2298A2F8C957BFFAD5679E79
46264A34048BEC1B6A9E47E26718C0012D15C6CC0E3F7410F5C615FA3EC79A81
EF22EF31CFB4B519E81795299B0490593918841F4658028D08BE9E59D1435B0D
D21F5E1A14839C6ADBB66DB22CD1040D5548101F2AA4365221028DC5E4465896
0F64019C33A87C166D88712352099623C4840A5B96C2AB867DC79E27728370CB
1A7480AE0CF4541F6E102E1DB24DB05AA898C9124667CEAD3920218EC7E2E21C
44ECC870D54BA54CE3C90FA9B901A8D33581625940441E4DD42D7BCD89E621B1
23ED78C991B564B6354FDD31B023D39CC90DF528C3893767CB22735C4F793502
6000AD66298FDEE7551EBD5C572C4873441713A511F8C04EB2B5767E346EB8CB
B0FE11C703A73DAFA2079AE8D0EB192C9937391231123445C06010F8C20FA114
11AEA1AB043A55FA9A62576DDEBC99BEE3F8DCA84A6364C26EA52781F3B3EC14
4CF8C0A3CBB74B962C11C90C390C0B0CD9889B6FBE59749E1C802639C32B1FB7
47F6693C51241FE0A661859109998741CAC35E80FD05C8871D766ED3DBF01A5A
8F5934FDC149C26E1E4A5733B23290D6C3D9E4C9C17E9437575F7DB5DC062B47
46AD211CFF853D46383F5C24885799049926F0EFCBB77ABB18355A74083C8274
BE987534B4B662B47095D6B6176101B6A284EEE4AC2233A6A72B10BBC350653F
C83C33CF09C187B81CF63606D3A0DD55E893913D1BD90E99E7E38F3FFEBFFEEB
BF101663EB54F02DB35F87EC43B128C94501150218BE5C052E1D3C5698727077
74F88D08BE55AB5671A5C96F9118973FE1A3E8B86FBDB25D3E972722AB1F03C6
0DCA6F211949BDB268D1A25FFDEA57B2FDE0EE10FF437DE087E520CC2BFA5A2F
7B926430D476D34D375D74D1450CE241DEE191017A0BA6103864D00D308A61EE
60C1134B8674E897BFFCE5471E7984257B903B205051F52E46B810824E5E9D80
1E8A138D09291AF45C1157B519F6F0928725DA4BF60B584CE0F6A1890A5A9C02
454E6C95AE291B9A8C2E5DBA546C6479A67A300015588471332CE385E49786A5
7C4F45A2A653F132665614A568877E73473A13AF55829A92DEA15EC7AD434F9A
54AC37869BD26D50150279B17A91E0916D221624C22F0C1ED2B7237498C2048D
30E58DEC05BD81848C5F8E073218B15FE869DA855806549C88828ADC9793C07D
817205C7143252D004ACDD55A1EB3973E64C343883E1084B02060D4AE245FA31
0532AABCE20A4719DA75F5976E78C96A843DC40E57B40918A5471890110EB652
90CFF7DC734F5106C1572C76807D8DB821A41534219E10CB3D08E4C02260DD1A
6AF4654E658B62047A81156BED20D98DB0833994B33C15D9B7B05861BCA011B3
4C2ECF2CBF5AB972A5A832552FC592F3C3F2DD559F80B11A0C03134D6028E965
F8B47444668326406C17863F5B02E8B5827A1C938B9B790815A2179406C484BB
07A9EA87C5623073F838792F0D9602A4B3596FDF212B1B95D840DC536BC2D982
2A82972ACB914DD8A95FF51239F917DD1174B9432D45AA38EC1052FEE259FB5A
4BD806BE0D864739BDDCD59C3D1807071D749078E8885BAAB067131E16CAB069
BB60DD62C5EAACA23A8E8881323F2419D69BA0118084F40602A488B162C0B2B7
452322942A577742427F15B640F143BE232C09A82EB499459608DB9E8E0E84B2
1FD260C0AA45F25CECA43FFFF9CF7230DAA072F57ADE4E3039CC1556086C05C0
5E450163FD40D72E5CB8F0E5975F460F06CC8F0A5D2BE84E18F80C5FC857C82E
40E1212C8E0223B0B7325408B349F663D0C9A7BB54F40BAEE9056059334859C7
8D98E1AA8A55C9C6D22BAFBCE1EA2BAFF1828FCBB174BCAF3014E424723958CA
0DE45A2441C13D82528280E6064DE085AC7346D8E91626300A7AD91990E5324A
AB48A00C046C5A77351031C318E8BB6085C8AC229E2CE2E888238E78E5955744
F44136CA835BB76E9D5C6BC18205B274C9622B9FC8BF286E07F3920871F9641C
F42A03A4D0EB90C3DCAD20FD95AB8B29E987EC7544D3827D9DEB1F7E09A617EC
06ECD813F8C17A424369863C878E38323FD14D4BC2E181FF613A1408303A7A7A
3735849245EE234B83C7A33735158DB77CF9F2BDF7DE7BCD9A35F22BBD430818
076131192133DFF85DD9469D591DE341C58BC02E90F530A8C7F7099898D2A920
94467F36521340F9CBD431E462860D5820586953E82077F8580C205C72C925F2
13718C54BD3C4ABE7DECB1C7BEF8C52FCAE4639135DCAF11F2AA63D87A2C150D
C58032F6EB251D93274F965B868A3DF4D043FFF11FFFF1DA6BAF453047B40E62
1D3245A83F97C364C58BFF342AAC1E86368BE910FAA328914BDF79E79DF2ACD9
F95957007A72057500B255C21274476911E1060982C005BD522812C838236499
1F993196D9868741F4841912CD637E7EF0831F1C77DC71B82F36FE6572986254
664FE42C82605C96640DA1DC9419209B02E27B9840EC3B5DAF90AE5985F5EA6A
4474482785C57A03380AA5124830C820E55AD89E2C2BC56226F2ADEAD4FC3A31
7DC08956DF059F3FE184679F7D3662D9082E119BE06A8CD01C304DF8A497CC3B
052B61556A653B6B3945591566AD0288AEB2636927573394ED2BC38E46ED68A4
56EA21808D082EC406F41213AF4EC14BDDA946448768BF631AAFB9E61A518767
9E79266D173122BFF18D6F900C4E9EC257BFFAD5EF7FFFFB4842807E91061981
C8787CB4634470C91BEC4DE84BB862E0D9D6AB64E03DCB8264CF6D3D4DA84216
5819F0C9279FFCF0C30F8F857C41B90FB53E1B0592B7A65EB615A403E56CA8D3
1475856AD0AF7DED6B6243204B4CA18DEB72F5C2EF0C3C213BECCF494B164DB2
C46611CF058D23C092A6633375BF03D6CD70F7E39DABFC8DB02A8D85AFF09A51
DC0F298FCD8CF701935D5B9B0C179B479602E8C5313CB22EE366C6EF1C3DD64B
4F3191E58A71797972402EEAD5DEA36A827DF6D9E7CD37DFD4BD728A753D2EA4
42AF65AFBDF6423B75CE898C5FA6579C4759A0575C71051EB9EC5E996D98A832
C93251321E91C24064C933C692D5EF888D3860A4C806903F41AB0086615C94C8
0AE210E0525099E9C4D724D880ADC70D46E89E5C4B3EDC6FBFFD5E7CF1456287
B0AA8CB0E96903C912910C729EEF7CE73BB24CA93CD08009EE97DE9B9E1055DC
293C0F99A879F3E6897B8BF5094B45EF1F80F81E66A3A1A72BB3B2106AE0B313
2D250E321A012201836727C7E8D14B8428DDB0B939B429F00EF208649BA14689
56987C227375C209273CFEF8E3A8828618C54C42C41C79E4916FBCF186A8DBF3
CE3B0F5E20B058EECEFCFBF2DCE1F23728030A622E51155A912C18545A56402E
819C1C641359A70286926C5067270BF763071C209672F78E1D071C78E0EBAFBF
9E88C5A10690C186A403648B4DB2B0EB0F3CF0C0575F7DB57E41131D412CDBF4
55CD3045EFAAAEB6A66AA53438580DBE33544B73B6BB3F785E4EBDE1C73BEFBC
C391433D23CD2E2B4AB6A47833AB56AD62B9C6581963FA76B232FD7A6325AC5B
3488C7F280BB8675E587CD97704EEAEC61DAFC7A4295E10D55C78843E6C890E4
3C22FA4F39E594471E7984521187A9BA13AFA78EED7A3B29B91609B810CE829C
11D52B6B6C2C3986B0A45C51CE8600805E748915C5561F64DF83DB87841F295E
4E3DF554598A30AC451C89B322A75DBC78F18F7EF423116586528D7D90B1F264
75DE71C71D981ADC21F649038B35741D53A6447C2ACDBD6880963361C81E2F78
06645C805442CA450F72899494ADE8876D0BBDB077D52E6902FAB33CAD2CA045
8B163DF5D45308BED31E1F1F3B74D6596789BE45C81841244C051E3086C714A5
8C538EBFEFBEFBE8C61A1ADE19469CDEC30BA515AA6EE3CBE310D3469C00B928
34965C428497083B6A592803A43AB83E743A176249E5F8B973E78A2E9147B362
C58ACB2FBF1C76B41C7CF5D557035941D30637020B1714BBF23988AB00EC83DF
4D681A2423FC1B72C7637F12950FA790D38BC9612B12C4CDE018E9C607664637
D9B0F431E140FE91FE9EABB1214A698448732E60CC1E1B2892291E8F8F9CA64A
6B164813D8A817BEAAB0F796CCCCCC9933376CD80099025F5EAECB4E9648F6A8
B075B01FF6B983B30F61C43A29BDF3EBB265CBEEBFFF7E6A74B5337C884A4E67
1F81D8822AA2954ABE261DD8CA569156C4C60C603306A160D9AA32D44D9B7557
8F738B7940FB074CB218DDD75F7FBD1B712D23E2965426DA52A9969356B4EC0E
5981C44F2613F1FE52CFEDF7DE7AE1F91706B50EBE9D9DD059E8D92ACB5BB612
8C7A1D11DB809B209A685414290B42196E0526827176B44D85CF07B34385D9EF
E5CB9723F84EBE2C151AF5D8D75EC8684BB98727855024AC5E53238AC7018030
81044C85D14E33EC11C4A8C031C71CF3F2CB2FE39851E5158C3FB1176FBFFD76
DC025ED83BB0AA75D812E78DF2446FC607E987A8264F85E91A4E9A21A649C171
F1C517A3AC1473C73DA03BEF7C11CDAA347A3F63E7FA2CDC39D4039366B6D67C
910B8E68076A29A868887EEC55276C1F6184EC6F720BF07C891EE17251611212
37ABE3E86109227A0B2416451E6E0AF4380C5C288D129515C53803828050B93A
FA05721F4E7A83F8232F901E7482294D162AFDB9A24440BE15252D020237880D
19A9B7B6674E15F303F35F4F5953A521CC8DA6D890744C62A34900D48C39A221
9FEEEB5000A930948901E8313D1A59242B84DB27C688685FA807B9288985C1F3
C3943BC98E18DAA2BCC6EA62210288DAE10FE938576A4452F2B1A8751C4B0227
64032CE4BA1B0A627153E4F293338B258ED2717ACC7AECBBA19595CE57D13063
E6CE4CC5486881D389620ED60CD40662C40DD00FD428E1276ED8154369291908
743CC4E6D696DEEE1E64051070838809503795EAF9E79D77F79D7779F5EEAF55
D7E9ECEADABA6D6B045814314DEA2E7B801728058D6F915110C5230A4F477FA2
5E92EE230026E813202B4D4C2559D5A84096BBB8F3E6C7965DFEB572B55FD472
3CA0B95365BBFEAEA0521151D1BEE3F9CA8E541D2FA68C36235B6936FBFAFB22
513B914AF50EF44592899AEF2AA72ABF84690B418C7808A65A36D4BFFCCBBFC8
2224BE0EE2054F8A2645432EBAE175E28927FEF4A73F9555A7734A52BE515A72
CB8F65FBE3E74EBD0F20001414BC38805B1BC20A0A9E9179063FC9398A957FD5
5557898636C2DA171CC6421FE66044241A348E509EC3CA055846E066F1B51E72
90DABA26D043F6B80D3F2CB8C0EEE5ECEB6DDFC54FB9E28A2BC4BA641E95FD89
98FA00C61F420AE83A64E1611EE2B6115EC45E82850EA23A582BBE06E544D6A8
527FC949F6DB6F3F7191C4DA525A0299803906BB98DEC4551AA04A50B094DADC
5A8844D37831762E7A46E68740F5B1006488ADDF73CF3DE79C730E82E0E207E8
6D2E503404AF93296EC66A78E9918BCFD02A5FA8BCE5D9E91A547C76B9BA3C11
314900FC1F5513407620933667CE1C315E706959796C5B4FD74407712F58B0E0
4F7FFA930AD1113A91A71FB6F1A1A2153F52242CF6159E239B08B21E95306A31
BAD7AD5B879D00FB403E419602FA0FC012344733C6ADE881214F9A6B82885498
CF00993683B02A0CE86349109B88A019ABFFB06869C0E2A6C435917B64EF2ACA
6EEA2AB89E884D312CC082505AEB2A0C54C22301732A8DEB063797EDFF6A6E98
802997A74D9FBE71C3873299224383C68D22DFA3B1A64CB6BBB75B86228EBCE3
B94EAD3665EA5434650A826640AFCA6248A521AA66CD9A25730E1B16BC9318B3
1EB6D25F3A824E164FC24CF4E47A94ADEC9865BB11A3AC5CE577B44EE8F7870A
03410F9D20239D8CCAD655554F95ABE2E3B47774746FDFC1923779225081B0C0
E45EC4F810DB5F85207D59ED24FB827572C61967C87623421A930FC3D1189709
4E64971C090523EFE5DEFFF8C73FF20018130D1CAB0D2F5AD24494C924ECBEFB
EEBFFFFDEFCDB069AB0ABD583DB822FB54563B6C23206E182B237C03AE764329
1CE4E709279CF0E28B2F8A6031EEBEFB6E999D0B2EB840B40757338B5A555889
6AEFDC056DA426B0C2C6B68CB521804EF14AA0CBF3CF3FBF70E142F605436D14
5D4E142DCBCF3FFEF18FCB443CF6D863AAEEEAD2B263A1044C36E09D4467C8F2
BAE5965BAEBDF65A621F59F1CF4782370084A9907713163460C5985CF6A44471
265405A0234458C9B432CC8517A00EB88A1FF6DED16709C0245A7378BABA9268
C84813DC42D0025ABBC01DD1CBC7B0C3C11D0BE14E114301C4E8163E9F397326
A0C47AD2DB0871D923316DE3FB042C5F045A4E8FDA5336C175F3C326D523410A
E81600B31D8781A051DE7FE10B5F78FAE9A765CC6BD6ACE10F59798B34924E83
21CB46EC0C2043D85E18021DE06B15AAE7716C349A239867311DDE78E30DF079
20062807A061192AA1E0E14D9C38110D78E500D42260D93CFAE8A35FFEF2971B
101946C85C2BA71551F8EAABAF8AF4A4A1A7429E57B9D3F7DF7F9F8B1F421FA4
AAA89FBAF7DE7BB76EDD7ADE79E7C96F41D78AFDA527BA466E6133EC3911C0DE
5C4724A823EBAAADADAFB73762FF95C34A0E9D38A1BDA7A7BBAB6BD2574E3DF5
DB0F3DD0135A0CA9BA7D06804D20E9643DABE1F52C4256E60D8E2F11B7327271
FE56AF5E4D07143B4B8F8D4C9F3EFD631FFBD8CF7FFACC60C16FEA6C1DDC3194
6C9AE0E72A76D5355465285951D1A42A155557FB5E9F392CD539A15CADB4B5B4
FEEAAE87DDDE814853B6D637944E37950673E948A25C2D55D470FB0A993A3939
BC6A481ED9B04B962CB9E9A69B101B0731BB8C04C13DCC1556A00A1357235FAC
2B82DDADEA6860E463910987B3FE57A2B77149219990C0948A69850C0A57BB0A
F331B0B490E644A90D1BD9CB0A975574F9E597DF7EFBEDA86D3442F6DC8605A0
7F6280631DE509B06E20FAE54FB9B08C89F529AED6A2A4412250F4E0E972E5D1
E66221229C412C655DC0A1A11D6A4DA90021FD91EFC293606D14E3512C7CA31A
23530D30D4F09759DBA5C2649D1EADC21D61C5E0A28C20E187944DB82F54E7FE
D33FFDD30F7EF003F2FC8872FECB5FFEC2506683A5DF20EECD90B25F850E0727
135246AFC052A1D9CE02EC8660820ACDBD913B5F0F20B2C60DCBB42191235BF4
BDF7DE03D85FCE03F62179461F7CF081BE7C1B34018A6621A42EBDF4D2E5CB97
C35A477CC90FCB35B197F0F86002C383214150C362D5390C6478225245BCD2DD
41051FEBA4989AC685108D45B39D6F7CE31BE2516149C84F90AE40621F6B637C
F49E0C006073F6A48466E215E7CD9B27F3C37811560810E86083515A753D1E2B
3C579E8A570414986104A595884340809912312E18FB726660E4116F210E183F
87EA8210912BD235D71D2FB8208126AB96DB2776766FDB164F24AAE54AC4B2E5
818A6AB9E6EAABDA27C8257A975D78E17DDFBE3F572CF986B262B6E10CBB14CC
4B317380CC3F537D08A6333BADF76BC48BF90C848FD0843557ED37ABC6E7177E
F987CFFD57BEDC7FEE154BFFF3D9FFF8E89D0FF75FF42F833D7D895832D6D632
643B564BBAA92DE3D59CDDED66B75CDD63F6DCAB4F597CCD8D372FBFE0D21659
840343B5D0EF5161FB5F465995D6234CBC0151D532A5A2C04E3BEDB43BEFBC53
A674EEDCB96FBDF596D280CBA3BEE83B62E9CE9E3DFBB8E38E7BE0810774E0B5
D290BE639D04F15818F2A024C1E6451E113589D037EC828E5404B0FB7223279E
78E20B2FBC207308AA342C3FF42D80ED6586AD34D93B5DEE572E144830DDA9C4
8B4210D12E0C056B0BBE42C30D34DC06592F1AD63A36338E214F11B468C339D9
39C4083BD8302189CA6CC0849165C5A335EA7072F69C22EC0C1905E2791CAD53
23350D14061687085F99474837F9B91C2CA745E8B0010C209F88E5421F5085B6
A72E8B59C42467869E20FD062ECD1244F69F516171197D1179CC326FF042C8A0
22D6B1B884E0CB94334035227A48D93AB2029E1A48DEAF58B1E28E3BEE90478F
821455B765742808240E1E9CAC69E69046F509D8915C66462F9F46F48CDC4DA8
4ED2C783FB92BB100101F38760369C1CF7C50A0F92A7A24E0A4B02974358569E
02AAAC093005FA88C5F70830928463ACD09CEC10F99795BD871C72C8B1C71E7B
CD35D710906A694D78BC90C714EF81E1031D855C0BDFB2A486250B542A0DE5D9
BA4FA0EAFDA53FF7B9CF3DF4D04372BFB040010F65933823A49AD1DD2CA425F5
58AB5E513152139C73FED2DB6E095A0DDF74E34D975F76595B738B5B730A859C
A50211912F06935CB7268CAAEFB7777594868A30B09811D14962C08682A6D324
1A411D22884549CB886130A54F1DACE2B65D8E4C34DA86FCEE42A6E2C5D5EC45
F387DC4AA9BF734A4BA73354154DD432A5B3E4560CD3DD73F7DD95E365641957
9C8FEDB967617BEFEE9D53177EFC3386A5D276062806B9220033E83B02D5C872
62520F7057E2A6E43D56DA58EB84F1E4A04F571DB980FE2262268A1A164F8E1D
E709A71CF53C7AD00FB307BA56E600648BA13D09C4BDD888E2316CD8B0816021
78E4682028D30EBB56C48E582AE4EC82D8C1D6D0B36E8A1DEDC1FD828D0AE1BB
60C102B110B18688171A35E28C174BBDB91C193180B745A50A57803507B0D720
1464F4F215F6364B01551803A545831828902A8C6C3099819A389A7BFECED598
2A841C307C063D0196189D504C27B9C37A65E8D0D788A05588D992C9959B02DA
97280296C0201E876A0E164FB2F5152BEC5518AE110BE54B5FFA129009089BA0
B30726845B1D77443F06F30399A847DE9596C4C6E554DD44D2BB4ECAFAC013C4
FD32DA08FCEE7F9B319653C91AFDFEF7BF0FF00CD24BFAB40310C566553AA99C
1C2FA2F6E5975F461601EDD26068A3F92D348AE82459D63A7A0D3681BEEA8CB0
231091547ABDC2AC59B3648181255F8DDB13CA0F2B7A9033C7228122871CC71C
C29250F5280DEC5FA05A6100A26A4F85D65510FEAEB766D46F01F10779C4F2B9
CC838C9F6421E4AA43B1217C771883FA4DE97945F1E0456DDC77DF7D3009119E
028642A7385423A24362E9D72A552308BF1B93DA276EEFDE662A639FF97BBDB5
E62D91C99661CE9DB7FB1FDF7E3B99490EC96C7875D2E1F095490FBB23C38D03
43C980A522F6196C529087EBC4153A2C07CF0210B2E0998AA0B73B26DAC9F5F9
F72BB3D594CFB76DCAF7AAAED6A69E7D6B7DC5F6684B4B7A42C5F5A289E8A4CE
095991C29DADC9643C998855C4DFAA56174C9D1177BC933EF3856875181C4568
0C941350EC881C3458A2071F7CF0EF7FFF7B8C9CA53F6349703C3E6844B90B92
8362C3D2DAC0542B2D583DAA26005305721B0C1540F29097C50C7B3000F7012E
2CBBDE8415A762885E69B832AA3796A9924C085A2AB83DBD18987EEE92254BEE
BDF75EC871A41AC85E32520D60887218EAC291BF4634831301510B6307924B54
820C0EE61E5BDEEB4026DA533A4399F8BC6FBEF9265C100443C9962A4A72D3A6
4D085C223F83DD0B7FD9D5BA7DC9BF0814D02D80092696D7E2C58BDD3A6FF8DA
B56BE1E63300CD6D8327874E117AA1ECC8B2174E9158F16220E8402620C018D6
6F90D418BCBCF9D6B7BE75EEB9E792FC84BE2D9D6EDC1188A947EDA6D050E006
897CE699673EFEF8E3227DF4E22CE66945826CDCB8718F3DF69007FAFCF3CF33
0DA546CB18031B03FF0911D27DF6D947AC15392D5C5A266CF05BC853920831A4
AE070D00A5D053A6D800A890405474DF7DF75DBD7A358C329C13FA0F7D96F4AA
0B31F065247239F1FAAFBAEA2A792F2E886CF2F1392087C55CA87D1B52B2D860
C43B0019A1073CD15C65D5AA55E79D779ED2E2BCA404D02BB354E80C51ACC360
E71A8679C17019AAF6980DC283A3278A2833B60CC2320D41E1911963D1FF9964
4AFC00A756111D9089249D5AD50DE0FE7E6BA6A93737680667B60BAED3D1D5E1
99C6E6CDDB2376400206D3A758AAC376E309D3B6E0FD2056894A699189A21165
F078DCD8B6D85C800E822B50C7B2A7DA33E5EEB2A75CBFD96B5E14CB4D16F920
5A2A63EF98DF6265CC0195B0322DED136BBE17B18DD933A667121165F9ED9D6D
B3E74CAF1587AABDBDED622514F24B3E7D218C489112C81BB1FE1632014D99B0
CC50F202AF05F6317696AE6B475D27A407B6766E5D2E274416841F8EB5DEF014
306340B5C0CFA63CE13A24038A6C99E38F3FFEBBDFFD2E860A9B1235F37044A0
1E105D572167FE94295340F643558D4BEFC440C7AC9ADE0B17E63CC9E91A7A00
F105FCECF9E79F2F9B8D1E00A652270A87DC2164532F1D620F0A861A99C091E1
9164F8ACB3CEFACE77BE03650EE1A533C422310BA2447824F2278C7D02C5085F
515AA33BF0AF894621DD3C769D3C4B394F43C71EBDD09A9A19E54EF0722CADDB
25EC1D8E90B3CD1628845702F6800D2C7322F20BF94620A0A189B18E59FA0849
249FECB6DB6E73E7CE7DEDB5D700A585D742980A064C0D04EB1272FCC8238F44
9F6A68DC86642F5A0C81CC67544D4069D8004A63EB4186D45508B586CDCEF924
3933A492FE98287C457083EA5597BC4B972EBDF5D65BD9BD00EB53CE86920B68
4DD637209F244342AD29CAA4914C1B7567C29A8187C4820F62C0117591EB8AB2
84E983C3162E5CF8F4D34F237A8B9F433A002080C360F130AAC0A528A742F364
9808E40164B33F482B784B2C2843D4588575300C01C96957AE5C79F1C517EBE4
C3B6D6629A1A170F3166D94EB516312DB14AE266C4F79C54349988C692A9A026
4B6EA7B9AD75476F4F3C93EACB0F553D956D6EE91F188E8337659BE0C73BAEE3
87A7A5B30515C8C43BF14B8868E148AC6718D4D07CE54A6099999DD18E6326F5
EEDE531DCADB59D3D86858DEDE896A24EB37A713137C3B2A3AA7B5AD696A57E7
3C1943A56044FDF97BCD19ECDB9AB60DDBADA6A391451F3B07CB8F0C22846203
AF8848389F2C28199096C360C6C70EC1DFD23BE042A6C10EA66FCD3ABE712C0F
F6B69463C4AA3BF4D0439F7BEE394C1A6B68B03D613A43E84313D3E0265615B2
9AD539888389343BECB0C35E78E105147241F441BCFCB5C618EB121E1C48D054
BDAE929D0D502687CDAC075E1A78D61A608B725AD474181AE995AB35FEE66411
A2C74431C1D70DBE3F16191BDD292D020EF93B8C6EAE6B02D1816094C30166C8
B3A6573991E05ACCB7279E78421E3C69184626FD75E31D7727024516C4A73FFD
E91FFFF8C7084FB11787AA1BA4DBB66D93B50E294FAE2BBDEEC3A857C1E8B50E
14106489C1606489006B481A2878A62AE4BD61A3151A11E40EC36C3351CCE484
CEC8C6C2B791854B32D5687D073F80CE16860A2F0D6070AC69DCAF1E14969140
0371FD1861FD04412630291063D1CB4D1AEA1FF529E23E247C002486D7D65F5C
3C7852A79F7EFA534F3D85522F8C1604D7ACC9C27EBEEEBAEBAEBFFE7ACC3331
BB080AC99F5FFAD2971E7BEC3178F10D8C6C6AE7CA18BCD199DD54D8430DB246
670C34B44A3A4699080152E3BE1A34B4D8F5C3DC3803FD46BD496DA95C072385
6D0A83D6E38692FF7CB3DE78D65169CB4CBA7EC2F333E2134463A6E7969DDAB4
96F6F5FDDDCD32FDF1C4D9172CBDE2A695D17472A85C94E31329B5B5207BA733
57758B7EBF327DB716F78CC2F0158C00E7697962A9076F443B45AD642416CF95
FA12095BE6D8569661566A514BD55CD30DF8E8BC7AC9B18A458C58C4192A3A1D
56E2E039C61CBF92DEECAA7A462490737624B74F53A57F8FD44983C6A6BE989D
4D64FF61FEFC427FF7EE07ECDBDDFD6E6242A6251D8B140BD5217F523AFD4E77
E29ACF7D5155BC44245A2A15324DE9DC505DAAF87F05537147E051364060A03B
B14118A0A69D3A9664872843F41235F07BEFBDF76F7EF31BA519F57E9DFC0E09
9EB1D0A5CC24C1C647A404068AFA7BBC28CD0CB214E831196C2AEC0AB2740169
C3241535012321FA05B82899A45ABC78F1B7BFFD6D16BBEA452EBAC481CFCB60
22E5293139B47A1A8ACE1A84358A42450A8B0F25561B922D74C0E191405461E7
0342C0DCE629A79CF2F39FFF7CD3A64D3A3E4A7F21A5C9948BFC295A938456B8
29F80ABA26934F3006642C0F3AE8A03FFCE10FE4A830422E235970C82F31CC0D
F356BE5DBE7CF9CD37DF8C1A2EF90A2643432317BCE4C6B15221C59025C3DC62
416345EA959C08418CAA09E425478A7D27E794F100C88F08EC55575DF5FDEF7F
5FEE1D31EB2F7CE10BCF3EFB2C7C02D826B87D56C9EA3B8DAB052A908A4AD6A4
AA9B11348D8139619A8BE533B29780A0951BBCE8A28BAEB9E61A0A7D20CA4994
8B2785B4A1DA391BC491C875B10B98EA44A64EAF005721F30459CF6094C10386
C14B9E286F67DE50D46FC3BD43E018912BE040B01499842081951A177D38AA26
68696AEEED0BE25453264FD9B479135AD044239A46317C11D63E34812CD19A4A
DB66C633929E9735EDE658DCB6C497AAA8AAD7D136C1F1BD8DBDDB6D2BDAE756
65B2DA5B9BDF1B70AC4869DAA4AE6D1B7B4A6E59869B8AAB42599555CC1F5604
813692CF23C11B65A5CAB982885FC3B2DD4013E444478803E1CAA34D58663A9E
8845A262D1966AD57CB55CA856BAE6CCC8A753850EDBE9AA58ADDBCD54BF6BAA
7A43F38911A36CAEFDC49E93EDA1DC4473722411AB1C32731FBB2DDBE6E4ADE4
D4F9ADC9FEC1814D35B9CE8E8F1C6B9A691B43A5D9D9AE13FFCFF1E9543C3F54
6E6E6919E813DBE2AF048BB0932061E9A8E13D7533CB14882B45E1FD587D8669
19C85294F7A89EC362C023009E65C9922577DC714703E2BC41CE20C1030C243D
AABF8B1AC00B3AE6AF8639252CE2EF1004C4B762220819A49868D0017C4FF101
A74CCE205EC9CB2FBF4CE1D2A009860D99308CC05D3712DA848839FA8E02A4DC
308FE4E142D0003D641A269AFB5FCF53C12025FB3CFC26621C1B6E50856C9A4A
33BAA196108E80A92BE344E0184CB074DF60095E79E595B7DE7A2B520E2AB46D
E1CBB3601B3912A64348D08438839EDA41A81A2A4AEE4244A71C29020B730539
2897BBF7DE7BD7AF5F0FE1B86CD93294D2E0F6297446F509CC3A61323C5C0A14
C6D0A04E90DA39F6D8637FF9CB5FCAF9F59A3215A64346D504B8960C55062612
5FE4FB21871C221A054B9F493092A840BD19616B238008E457F22D9690A81678
60E49CA09E63321CEE2F5C0DF96AF6ECD97FFEF39FF120444DCAD359B9722580
BC8C08011E8E9FD35A04F0110F1A8005DC38905D887FE2BAD0F1C8AC401F4031
1039AD63BD74C2AEB1B02B6369026F8464113510D8011E3FAF6F4073B8E3B7ED
A826DB6EB1A26931FB7C33C8E9F9725F155B0511959E425F7B6B575F7EA86552
D7DB1BD6DA86D99E8DF70C168FFAECC1BF7B6DDD87BDB901A35C4BA42BA578CC
EBF1EBD6BDAA730FD53541F0AFE89B488007327DA358AE887F10185E35B728C3
F1EB25C466FD5711C3AEF9AEA7FC39C71DDB53ADEDF08A4E7CC068EE8BB6F639
C9821B5176BF994CFACDBD474D8915FDF2CC6AAA32A14DED3F756669822A5A53
3FDD95ED733A376ED96696B7F44CDA3D63F524F21BA3552BE3C4969D76B12756
932B0FA53537241E4045EF97A9B4C035042E9078AB56ADBAF4D24B9148603B55
50AD80E3612C096E6AAD2F18E5468F23EC685C68E9D2A5B201C9F936EA6365AB
35D0EBA292F4EFA50C98B43710A7A650A388442B1C247F100DA061A546E3C5A5
21AC8B75FA3584638F4C3350BCE2785C11A454CCC0C0EBC77CE9E065A5B594D3
9F810AC9E27951C4CAE5BD987822917124108734F4483D0679C778D4481DA0EA
AA82E962686C62818871E469C95247D1A9E3E57918DA9661A8C0565D7CF1C577
DE79A76E8A4230E9F42F8CADEB04E35042A0D885738A3494DE600BF8D4534F3D
559CD6B56BD7323D339626D01F1CDC29682384BF8C909253FE947FB16728F475
D361D4E810CC0E3983EC1691AAA2A256AC5881EB82BE42F6214AACF5FA7B4224
E90F417310B4CEBE6C50C07810880B4179CB27E249DC72CB2D6CB001B271DA1F
206484B6031523226F78AFC2ECDA25975CF2D8638F81D807EEB5133641C3AAC0
BF586334B9E45EC452915B468008315F6835A5B5FF344268EF38AF064D306756
D00B45E6537CF1279E7822F0E4EA48D0202A14AE68F10A443F5B661032CA1876
CCF3A39E93083A8CC5A676B44FEDEA9421BDF4D26F02F7C1329BDA260C16F3BD
F95C2C99CC3465DFDEEA94D4B683E7EDF1E63B6B9CC0B5507ED42CB9A96A342F
0FDB0BC6535FD5862800B3DE49D2F59CA8A8826CC62916ABCA0B10328E574B5B
111941D57713E94CB95A139FA190CFCBCF63C71D5135ECB2EB3BAAA2AC0123D3
EFB7E5DDACA352393594B6924EF6A323A64D6CEAC9D566CD98346F527A5EC7EC
CE786553FBC73F7AEBB74DAD6D056BC2C4EDBF77529354B21033637EDED9F8E6
BABB2F5FD594C8B8AE512856945F450099A4672A3479B12AF0EC98F9E78ED361
AFE36868D8F2B2C141E5A9EABD0AD6AD5B47D30D9276E2C489E20ABB6377DCDA
638F3D609D005571D45147FDFBBFFF3B19DAFF2E9A4085642406731A68EE1150
CBD671A94A8B575E7DF5D5B233292E4746848C9DA1D986065D47FB273909706F
C4A88C940846C89EBA60C102B97F62A1F4969994EC73E6CC79F7DD777516558A
303E3098B1B8174861F070A107217489E8862F7DE94B3FFDE94F5F7FFD7564AD
172E5CF8EB5FFF5A8C5C6450D4080A5CA5F5E560D9046B593118B637A24500B2
7B8812F2BA806B014543F2AB279F7CF2A4934EE234EA55DFF2438674788019F6
3C82B5ABB4B2F506B42530272044432A42D5D38CF25BA0E659E735AA265061EA
12F601E43ED1E8885FC99F2C26A053A876465231FAD4A009E08411998E88A5D2
E290A214BFF5AD6F91D1847C3E5815BE560FCF552A5FCD9A350B4809B2867861
17396C7B9C0DF90F125B819C00EDC599E794B942F44F699D216411423733D08C
FA09B533240F0E3ED209B86B71CE4403C9F9E518F69EE3E644825AEFAFB7ABD1
21FA0441D16FDDFC4F2682C054C03E5DC70CCA0396951D0DFE332386E97B4EB3
B2DA6329318EA28EEBD52A5515AC9E163B55704AB367CD7DED83772CC876DBCE
39652365D73C4794B2EC8FE68EA6C1DAE0967E39918A17838B31866D863E4139
DB1671E2AA56A8D506E4C3B41DB34CBB502D64820895E578BE689AFE5CAE2C8B
DCA9886E2AFDDF794624661929C3B14CC7F162C55A7349652B1367AF1311A54A
D5CE9E7D67344D147F7E52C7A43D66344D9BD13AD43A7F92DDFBE2867C675BF3
E4FCDACDC5F8DEC9A1E73E34E29954D4B0DBCDF8B55F59A20A5E2C623BA672CB
C3911FD813F0CB413730AA266888CBCBDE07F5F73819606CA8A38F3EFA873FFC
A18E2221A1327A27B09BEC58E7C1E6C5BFE8E5A957F8FE2F5F7EBDBFC2DCB973
8354920A7B9FCA401F7DF4D1254B96C825C5B2938BA19DA4B848B26AE983AB9D
A34314FD4ACF3F842F484932EB928242B70D293BF02D508C726960A11ADC083C
3939E690430E79F5D5574973C45335D4F7EAF84823E46436C256398CD9B15E01
A8D9134F3CF117BFF885480182EB75122115968663842456439D04DC1A39C959
679D75F7DD77EB1C647A4F37B5B3FA44C9B85F270D47212E297D9871E5543450
42AA30B249BF0A50514499004B87E54E9F4FBCAE356BD6B0D5351BF2A8B1A343
58CA90957A3130FC124870409B49B8AF731A420A5363354487D0B203D4EA726B
F3E6CD93E131D16A84E46ECC132086CE6BB1A077DAB469F2861CE3E263115064
681CE9F8A1DE2F5E857D8A40C0C5BEE764045261D12F1C6A20DF3EF7B9CFFDEC
673FC3AFD8615B85813E8474597E8C1013E25AB2A5C566C7CC634DEA1C993AF7
2A013FBBA409A64C9ABCF1A3406F1DF999236525070BD8F72C3374DC8D204710
F38D84AC3ADF1265D0220E99EF455C2FEEA98465C513B6C8BA482CBA6D6B7734
95F8E2A2937FF4C20BEB3FDA986D6E59BF75536773DBD040EFDC29F3FFB0696B
DBE4C30F3BF60BFF70DC5191D6E6A121D34A0E79CA777D00D4032D64D5D3D79D
B1A1EFDDFFE8734FFD6BBEEFDDF9B3A6F46E19CA97F2B2A0B276C4AFBA35DFEB
6A9FF461F7F63EE58A46CD76B5973F39A5EA394AEEDB49C4FC949CA512CDF9D1
82EAF8B39AA2D450E7ECD6B8B7767E36352595340FDA739FB60533A23B3EC847
66A5FAD6D95EB5D74E76191F14B31DB9C29C753D5B07867A67A45AEE3DE31C71
3066CF9CB676C34651680DCCA3084D8F151D92F5205AFFEDB7DF46AD80AC52B1
F481911BEB716093225DA73798C20AE73EC29BB1A243A8216755300066FF030E
E6B15E8411FF7579D19C69287AA48B7AFEF9E78BFF0B9B4BB7F53CAD3F972E2B
F12F2AEE6070E1927AADA3FE135A6A7AB69986AD5EE88F93C8FE14738C51293D
15E9870D0B19E5478192AAE779484044BE1A44B7911EC78D4F9E3C190D229891
1EA909F409254D31C48A2C91AF7DED6BE245C1EA94E522DFA24681016B6A7B4A
673DB1494E7915A28F802FD67D02D26B8F8A77B6B5E6BD78E40807C9BF3209A0
9994ABC8D8803745C21C7A7AA426F0C36E59702701EAE5A51B06A0372E05C132
EBE0C6CA1843ACA3A10A7C142C7A92D7C2B1434282429305F4380F2647CEB368
D1A2471E7904BF65A4556FA7839BE2EA421049CC3771BDB92DE10321E52E5794
81A1F10B7999E4AB030E382024E51F7EC1B4C2CDA2C6C2AFF70B445339C0FE70
069DF7102C2CF27EEFBDF75EBD7A35597239EDFF339F20168D55AAF5F2DDD033
8828D343B1B06802C3CA2833AD6C79938D060B3D2EBA5C8C5715C46DCA6EB5E6
569389A62DF981F6D6D6EDFDFD55DF6FCA366D191ACCCAA248A8DEAAE7659BEF
7FF2679F3AEA6335E5160737753575D611430AA902AF1E35AA4393D4663792B1
D4EF7FBEF6E48507560A0349654FEA98B879C7E6492DE9B86F67ADF85E7BEEFD
978F3E7A77A8779D939FB460DE50675359E51CBFA4DC48C26BB654A462146AD6
4034E665E675ABCA14E3A3D53DBFB5D53627387BCCBCE199878DF4C4EA87AB0B
6632DB944EDBA5B77A2AFD9BDF29E6B3D1894D03C57CAB633C7BF9373A33ED47
1C76E80F7FFEBC1B24685C4F23B2FEC4273EF1CA2BAF20B63C3263BC6CD932B1
EA642FCBD2BAE79E7B906A1E9FADA4A11E9EA073F807F46ED57F57E188F380D5
0A12E9BF0D15FEED2F9C30105F0DE03CB8C328FAC041E45E268BBAEEDD1345AA
EF6A7D76580EF3CD6F7E531C0BA5E12F47D504D84BACA2D4859A8E1D22CA1348
E106EC90D2322D7A5E01215704D659F20A1E21E4EE264E9C08A98D181F68FFBC
F0D5708380C0C382008C470F029A21A3243381175E78E16DB7DD86CF093D5221
0C89A5CE9011A8E7A013AA7322915849699D41553DD8C76EEC2C350277050238
9C4C028D91FE0155A4D2480A47F5099052422A1ECB91405258BB28AED129921A
EA18C6419182565685200D6C1E3A52729E9B6EBA69F9F2E532157A7448C76B32
69CF625A1572104170336B85B9220B02D3272A340E90129401104A00AC043E24
570AFB71022D0EAC3A6AF58D904F1F850B471E79E4B3CF3E4B963AFC8B5B907D
71E5955722CC28A7BAE4924B6EBDF556E86CE2E5FE161BB04113588659736AA9
64D0C9BD5A13819E44F1574C99F51C6D9021888B0230ACB46F270CCBF4CAA224
5266241D8FDB11253A20572B956B22EC55A6A9F9C3C18144C4760D3558752635
35073507B9A19CB2CBED7BFDD35937CF3FFCC8B629CAA95406760CA4D24D810E
103D2312B69E8A909514FC6BD7CC92FFE6AF9FBB73E5D993B391BEEEDE9425F2
A4D8D29234F29568CD5F306BCFD5EBD7BFE7E58B4973EAFFF9E48E52DC4BE6FD
5449F9A65D8E1B41A3B3B21F29FBB56C25E6AAF6DFA96755C7642BB73DD9D63E
B967C7FBE55CE4BABBBF31D092D998DF6AA592D552ACEFDD0D313F63C6B69753
91CDBD3DBB253A26F5798FAEB833198B171CD15CAE2E49E4895C76D965E201B0
06BB0145AA4213136201BEDD381ADA080B2A172F5E2C9A833866E08800A83BE6
9863C4F218BFE31683223AAC40FD0D58B2BFF1C5C21403501C08239A75B276E5
92B23A656A2EBEF862985D400D4212B14B14636D723C3B7EE06C7ED87923A038
AFFF1C1B8FD25985D62EDB54FDCF3ACF9861D33B4E934E114C2E1492DA13A30D
E10B682CA23A689283DA2BB042B2CD1670FAECF3CCB00C7B1082260132DAA877
01945BD3A5122C56BA1DC4B118218F0D22303366CC20A782F81622FBE473F131
C981C3E2384A4FF2CA354478B85C80B682C98FF160FD89E2479F32114037DC70
03E1138853136607613AAA868075C3FE42C84BEB4D87705FBBEFBEFBFEFBEFFF
E4934F623C0D781E3B6C8CCCEA5924E5643CE08E66B89F75E96467535A835926
7211B3927F45C85E71C5156443C375E9C1B03FC448494ABD28AF7BEFBDF7ECB3
CFC6C61E07C74DEB92FE341D59A83742C2A8BF896CD67B91B35AD8087B6DE2A5
DB349C289F0DF2AC40EFFAC8EDCB303C7F988A43B695659BF5B22F71114C71CE
EAF55F533ABA4ABD7DF3274E36067356B198F74BA9482A21CEB1EFCA532B3B65
F995DC726F292F33B5DFFC05AFAEF9D394A6F66A4DD49B59AD96DD8A1F6D8EAF
1DC89F74DEB752938FE9EDCB98C57247CA1F8CD69BC6F8B2B3C40250E542251D
4BCB32D9D2113772EB92836FFFE8A16BDD818DC9881AAA297100271A5E4B3259
1B2826FCE4A0E3BDA7060626ABCCFE9D6533512F45109D9A50665C1981020BDC
1A27938E0EE6FFDFEBD3F6EC8C7EC6FFE8EDEEB6816C6FFBB6CAB656F5DAC0D2
9F3CD436B4FD65A3BBFFDD5AAB39757BADD21CAF5AC54A7FABD9ECF8FDA581B7
6E78D0965395AA89B061220AAC8CB0FBF1381296D481D87DAC8D059E87AC3E2A
ECB33BEA4960B22044AC63C3B072880C84F9AF7646D2CB45653DDF75D75D08CC
508A8A7040DB5478AE72069DD551697573A376B6C1E23494D67A173B93F55672
3F889FC246139570EDB5D7EA4D91C05C06F30D581D4816987E689F023B11538C
A018DA7B6ED8B041448FE861C02B8950DA555D6784B566C8D9C21A85CD4B909F
0AAB5B21A6A166A90CF5A4909E1AA2B7848A274089410BA5335DA3720F816998
C6F2E7962D5BE4E722C745B0E26103A704080A4A16014636C3D648884BB2FE19
3DD1CCB02326560F74AA7CF5E0830F222C2E42500E1095431E0B3D550399CB6E
CC50DEEC884BEE11A5F56340CE1CF205ABB6A1D5418326408581B83B77DC7187
DCA9DCB29C1FADE5F0D0C918AAB74340A41E159EEC3C81D9E61E90539D7AEAA9
6232C30940B30AD86218F6A44993C0A047B541CA3CF91CCB5D7E8B6D43023B88
57BD287D544D408A0B39C9F4E9D3D7AF5FDF80251B6991186197247A3C5FFFFA
D7BFF39DEFA0F4812566721EEA6F62E1105382FFD4804DA08EA7AD40E70F8A6A
58FD9BC17D817D42FE8BDA61FF9C3A2F50213F4C4AD3924A17CA95F6891D5F3C
FE847FBDFFDB53D24DB5FEDEB432A29198E3E3D2750345B9E26105FA241A29CB
AE54664579692B118BCB692BE55AE5C87907AC5EFFD647CAED6B9BB9FF179615
9B26275AA37DFDEB93B5298E57AB54CA56B41E7350A2AB0CD12C33AA8542CFFA
5FFCC7FD1D914269B0777236512C89428A24DD4ADCF49B23A9C30F3EE2A72FFD
B67F82BDBDAB929B145C3940367931DF8A99967832B66FD47B93B989D21F57B7
364F9EB7604ACBBCECF7563C9651992987B5D96D76F10D79E8EE99DFB8ECA52D
6FA7DCA45DF36AF1B253CBC66B7E77C6B407CB6D9D5DBFBBFC9EA0E4DFB3AE5C
7EE58D37DE082E199D4E7C1CF90361429BAC81F449360236BEACE7C30F3FFCA9
A79E1AEB3CBED6D017FB0E8F1E5DC1D9AC17362E491865251F7DF4D1725A9841
101DB367CF964D71F0C107BFFCF2CBF243F970CA9429B2F209736AC82C5A23BA
5DA2BF936C2E033D3F49778CDD887E4F84E2E12C0823C8B740C592F312C629C4
87DE32948A94B46E7249A84A2440D0EA12B136E64F76D527602DB18839628DA8
2D216749B74238E9484D408A28C8149916D9D294F80DD133B91636215913100E
227C1E825E0413940494CA75D75D27E212447530CF79177453BCB0B19C11F662
C3C4EADD7D6102CB5758BB2A04AA36E4339466A542D18283F39C73CEF9EE77BF
2B0F054D9B2165640E91A5F7425E657970ECE20916C9B1A246F27EC9922562EF
CBFCEBCD1AC12AC3A8944CDD19679CF1C4134F6CDAB4894690DA996FC7D01A8A
C92C9D78E2890F3CF0007CA954FD85966430386402EFBCF3CEA54B97AAD0B904
308C17856E90F3C016C1D3013CD7082B4EC6D204D8E4AACE318709FCE77FFEE7
175E78414FFD8D2A2954D8EB9C6C1946487DCC7C7203CA0B2F649874CC95AED7
3106FD7896AA0E3F1743F99A15202E00C870E2D158BE906FC90E73231A41DF7A
39C49CDA39A97BEBA60E33D16C5AADF158D50B1673D5A9065D25C5873087DBAF
4612B1A66C4B5FDFE084B68E801337B0EECC4C36F50F877EEAC7FFEFDFDCAA53
51463A36B35071F26AE36423B223C881977CD38F6752857269A014DC70269EB4
267479B572F7F6CD9D99A893AFBABE9A6007F224617B96E81ED7C99AE9B219D9
9428E4E658FDEDB574609B2A392CA84E336DF17882E955AE953772AF95DBF7EE
DAE7B0793FBEED87D16ABAEA55AC786CCAA78C9EED316B7366FE69C7960A7D9D
139AF3B90FED785FC1EF9C986C7EAF564897E54A91DCD37FF8C4C70F7BF395D7
2A7E41D6A1DEDF14900DBD7B84FE3243627398EDF0DEF4325590CAC02ED96DB7
DDE0C28EAA060E38E080D75E7B4D695037550788CBE72FBEF822009664E8A19B
2B76F38A152BE442B24EC87E0199869836541A821690E786D6BDDC08ABB54476
C19F26290B9AC418A0B030B4CE9C0895C0CDD70D3A021B20F82EB8E08255AB56
4D9B36EDFDF7DF47413262E2B24065FB815554D79CB27B65C4EBD6AD23C711B5
13A7F56FA9A01939B39056627F8992473705191E4A10C0CE41DA58DD1783D631
EAD500C8D332CAC13180531E9A4CCEFC99CF7CE6A1871ED2C3503815C362BA80
A3790BE5216A152252740302629014609220212833A2D43132C9575C7105288E
09F005B61D2B4FBE625BE391691BA83A128FC84BECF7DB6FBF5DEDCC14CF7614
10317BECB1872CCD575E7905460A25DD484D4026741835C8E18320963E964864
B91DBD619E19126DCE9A35EBB4D34EBBE5965BE47688B161AE1B382E2C2A5420
CB8DCB22C6738487CE2A71380A34BAB133A1E42046411ACC380C3B918DA50920
A9E1DAAAB02FE93836231B59EB650462A3C9462065A99EB1A02F8E9FB33F018C
155F6B760487CFD2FA59CAB73C1E1683A77C5801C3EC61A532B256A944722837
9488D67D3ED749066970B31E947326669A5BCC48B45AF3CA05CFA807A37C5100
812B601A2A6205EEBBFC21BE41DE29C7555CBC8E784226B95C73AA1D9D9D95EE
6D535B9BAA85DAD662BE33DB3130B4A339AED695552612ABBAD57ECF9727DD35
B9BD3757D83E5444E1D8C489E95CBEECD65CA7EA3707B965372AEB2DDB1CF1D4
96FC40574BD7FB5E4F6D41725B532E5B0BC6217353D75BF55AE840D5A9DD5B3A
DFF8F76D6A7EF4139F3BF8B757FD52E52CD5EE78057BE16587FDE8B71BA2AF97
92A71F952DD513B946A935E36C2DE4BA92CD7FCA0FCC6D9E5CB3ADA573FEE1EB
175FE495ABE2B810324752A07192B17ED8455C854585C84BF9758618790F7F94
BB7E1CDF11D124EC5352EFC91866CE9C290F94EB81993CB1FC88A1471A03B62C
B1E3F6CEDD58F510B1AF352983B521B770C41147BCF4D24BBE46573E5C638C20
0F94A1086B78D6146A9023D8FF0C19EBCB9A616E9911FC96C903EC28A4671949
00F5B1FC70DF7DF77DF3CD3755D8EE87B99A5D7AE9986B7C420C38A7030A8651
2F1D1C05CE29F9FCFAEBAFBFEAAAAB549D0E5E74099054E4E751757B1C8E2170
2608B340D6408DF3FC3A4DBC18CBB7DD769B5E5E08662744668068024C580603
1D00BE7E1516C7A1A38BDC2398F8CC7A3F58747AC0D90E3DF450B9D07FFEE77F
32B34D3095D292C048DD934A0F2407A8E4A25402A788DEEC1BF12E901A8EE513
C0F416C1B778F162717A54D81148E78480A004F7B2AC1358F408EFB0DA4387D8
EA99F04B2EB94474BC3C56087D64DA116167BE0AB3EDD799FB54E803C1E517CF
065E149A72600FEB68D451350111B1584B72A48CE1A28B2E1A6B89C2B2C16C93
B805914FA49DC01660ECDCFF12D121DCE682050B4410200F375213E855230035
EDB9E79E6BD6AC210E6A5813F8BE593F612A1647719FF80481AA1E1A8C458358
5F5B4B73776FAF6DDAFBEFB5CF9AB756B7C61276AD6ABA557718E763D4CB8195
6802DBB4EA1B471EB1B7FBDC3DFFF4EE5F9A92A2988B86E93A4E90A8F02BA5CE
647AB0982F29DB899B76D21C182CCF77E3384F45793B5425164D6EAF16139178
53536C53CF60C5527E345E28976774B6177ABBDDAACA04CD898D54349E8EA537
E4BA7B6C65ED9F1CECA84502251DF8048148AFF32329C4BDB62BFF8396F20CF7
A67F5DF9F53DCF8A38916A62C852D9854BFFF9C7BFF9E34D272DBD76CBB39D66
D4AB66CBE5885FAA669B12FD1BB6362F985DD8B0DD8F9ADD8FFDA4ADB3B5777B
CFEC59B3D1B30F203DC887F171FD483A8ABCFEE8A38F1AA2A6480521DE024134
162A54D6FC51471DF5F4D34F1B759A67A093D5688431A04405009A3F47E0C808
594C409E8A86A0042813D7D3300C3B6CA60D0909924D1ABEC35CA48CF3802156
0E92CD8379011501BA637FF39BDFBCECB2CB4013AF34C09CF8359FFCE4276169
E232043B02233F6AB75E66C3A8FDC661621AEBA587771020863C5561974AA407
600692044227DD832638FDF4D31F7CF041422D797E766282845ABE7C39986D0C
AD14000A52E72B655703B1E8C559A16F216A06CB48D6D3860D1BE4F8BBEFBEFB
A69B6E426757A41664FC3ABE58960E624122703130594024A626881E7D7A1B60
4E9C67481C00DA80443AE38C33646CBC84D8F2F8973964C06600AEE58A1F155D
0AC751DE10264B51CB6240CC12CAE5316691CBF2091B591B1AF2987C3E702F64
B4E8D583740EA216FFF66FFFF6C52F7E114C73C898C9E5E48EAEBBEE3A648330
78A5396A447629ADD46EAC8C31F1A6322DF2E0E0228FE3B3C23087F642F0170F
116B1B73D5401C465B448515A4E05B1D353AC48C028914E578795E7CD60136D4
AF0B4ED4F65787D90112B1B8F80451CB46DCD9F0BD9A682CC3CAC4934EA91855
5E532C1E313C6C40C7F5A2864A0C930E89E9EF28C36A6D9DF04F471FF3DC733F
91AB6F1DDCD696CCB6B4346D1FEC8D146BCAABED9999E614CB8E5B6E56B1B48A
ADCDF4E772055105D17464FB502DD2627DD0EF669A54AB3F61B054ECA9156DD9
1A6E4D647C2AAA8C9ADA63C2C4426E508CF4849598B8DBEC17D6AE1E9CA4E27B
D8AA8EBC33EAEC45C11D2B518DF56E7D7EC7F697B625E676DEF5F86D6DF9D441
73F64DB526AEFAE63503A581A77EF8A3EABA5CE7D7DBB7EDE8B6EDB6A837C5F7
62C9F284163FD613338DAD439D53276F7DF88703437D3255E2DF106602F93B3E
A31C1C3E39E6CC33CF1431083BC30CDB462A0D12C9CD32EA79E08C32BE22EB10
7E21FA8EC1100761017D5C94D4A0950850D1A4F1D7534724725761A444AF8262
E31DB4A71429044F08922AB051B84FF464023F945D2A83139945779E5DC22943
45E81F7FFCF1F7DD77DF934F3EB968D122A847445A00B462D11384118245722A
6CC219336680BC8CD6EB2E69023DBF477CAE0C69FFFDF79749FCCD6F7E83500C
75006C2B9D491C91385427884895C1C87BF493E10CB217047EC5D25018A472EF
175C7001A4869C448FE9AB30AC4F2317A63DE1225463A0B8C04A42E131A2F3BA
2CA3BB83CA75511B32C30002410FF9A335CE6CE057C178105BC013A46447EEBA
6186C7C70E6109C245057C080E25D6122B42405F289FA0C050460EAD26C70700
95FAFCB0264B9F3DCC9B8E1905B00D3C0DA2FF60B8E05F991F44A5F06481F681
DD240E289A83D3D305926D2C4DD0001B03E7287BFE8D7C6133A3332B541DB872
4F39E514F1C4E561E1B1CAD818A244B4C7D899F58BF5316AE78CB10AF30A5CC3
4C230F3F716358ED8348289318A66535EB4DC744313AF59EF5F120F7D8924DA5
D77FB86EBF797BEED8B4C9706B8552B139590F48BA9E6DA8782C16B54CCF0920
0415C7330D7BF2E4A91B376DB20DBBEA97EB419A20B2B3E7A41903DB7A93C9F8
F67CF79454B35BA888ED9EB0BBA2513B5F14713B988AB57EF6F327BCF8C66BBF
FBCB9B25550C6040D964BE5C10E19E8C25F243A588652E9838399D0CBAD2EFD8
D473CA994B6E7DFCDBEF1943A9BD225E3CA84990B9B1029FC0F45CF14464B1A9
EA966A536BF3E0EA813D0F9B77D95D57BDFEAB3F5B656330BBF53FBEFD93D2BA
6DDE81C9D4AC42DF641531ADA4D73AE4D422DBBA66374D7F3F976FEAB75DC3EE
7FFC571F3BF880356FBF2973230B432C455061633EC7C1E973139D78E2890F3F
FCB0AA3BBE7A0B2F3C05C264C6A90F602523AD22432B70630C9090212684E829
32BA2847E2DB919DC375F1A8428C25C0D3B85F4432FF6A6DC09B40FC413E1213
F5FAEBAF975393E34C85E938F0FE533AB0C39719767E8047ACC36FA05774C7C7
08EB3CD977052CC766D86073642FF5FFF605B3541E920C12DDE6107080B854F5
CC8C588EBA854524064160727579239EC15D77DD05852F1B1BC5537AF49F3A00
7F820F47142C818FD467A8BD82EC5EB162C5D5575F2D2B4FBE15EB95D607C643
DA57B5738A1F6B14484A997014BECA3110E8801EB13C4D2FB9D0278715AA44AF
4293C900383F725119E1B265CB8094051306C85874C530AA26603DA00A934CAC
24D70BA1BD9DBBD843FB422553A819218527CD76AC4910D9E34F426F09A19129
92ADB574E9D25B6EB945C68CDD0563878051199238738093CAC0B0267568D948
4D70F2C9278B0B8F8728C7CB7E9337E354123156AB42DE21D691B007061967F1
A71EA564B2CA0F3B29A9112852C20AD87F7BA7FE1F81F90CFB39B8A90BCE3DEF
8E3BEE08347D3EBFFCFAE5CBAFBB0E656EB66988948A1A762695AE958A9E5B4D
8BC7E63B1537609E88980AAE8568E34424706EFAF2C578343E582DB7C49A7295
5CDC8C797E559EF004D72F794E5225FB5571D6B4B6EECDBD1322769BD59C2FF5
C858E23133928C6EEE2F374D6E7A7DF3603CA22AA98448F65241E4839289B9F8
A20B6FBBF56E794A56AD30A373825F76B60D0C4C9F30E7D59EF7FBC581D8A7D9
89957CE59A2A582D9EEB8B1751AD28A7A6DAA64C2AF56D715E56664CA5174EE8
7EBDA733357F5B748DFA73AAAD181F3A76AA5579B37C74466DCA4532AA1651B1
FE8E6C3931146B99546E3354B6E7911787867B7BD5E0C601A4078C3BD8D4C712
3258CF2C97515A1C18D4F140228D9FEC440C8735E4CC5419F59E04EBD7AFD7E9
E8E50D42AF0CB10033065380B855F822483960006A04DC80F410DCCB04E90C2F
7E9D4E8F644CE8BAC79DDF0047D955493DEA8BE935A2B671576C62A36B39CA14
8833C64FB1C7987683C447F00416BA0805CC0ED9661CAD613A9F0D72E3DCB1CC
64181AF39AA575E524F2523624F2F8441DB00A4FC750A1D10A742437FFE38F3F
FE95AF7C05E20C7724CF52C4F1CA952B81DF2565A90ADB5F203C7243FD056B02
4216528FBC1A2A54CFA4C266551403718C7A613D21BC034D00B3E5D39FFEF44F
7EF213B92911B2AB56AD429A818D5674DB04772DD38E6A8991557EFA4BAE7BE7
9D779E7BEEB9841A03D086FA03F9131D7AE54FD9A2DFFBDEF7F4E029560B8230
BA4C9437F2DC59B622D38B2E6C88FC8ECFEBA26F755D13C849162E5CF8B39FFD
4CDE8B1E42A01F0EB59C563E617508E303549CF215CA0C496BC1C5833246804F
F4381EF23108CFCA02B8F2CA2B7136C04B20A1D89D0DE2033EDC58DD10793B78
C3BED0A958B08A82C4B21510CFF9AE17374D99B28CA78A4E351E54A49979B776
CED95F7BE8D1474496B435653FDCBC3D6629DF5311CBF01CBF2D9B1A1C2A4C0A
982B545C5931359C6496E94E66D2FE8EDEB9BBCDF968FD07D12060E52A33DD1F
B5D69607FC64BCE6B99144BC7728277BB56342C7E6ED3B5AE309B75CDA233DA1
5CA90CA4235B2B855CB122032DCAA8FFAF526595F4927EC92CE5CB86EDC59B63
2AE27AB5BF460EB16161910C54FA6AA5683AB1C08A257B8B7F51C9BEA6C9663C
95E8E9F4931B8BB90E99888CBA3E97A9A672ED99D61DDBFA775D8E2197C9763A
A8F332C226837E9DD180F87DFC89ED00694EBD3E6BD6ACB56BD7FA61B7039D34
6CE46BA7004E88651867316383631D92ADC40FB90674731CF63DC4852CEFE08C
B2ED518C404F1F452BFAAA6AD030FFFB172BAA54E8074110207242C411B6BD1F
36B7D16B4028EFE0E383BC85D301E239E23591F727D8D40C1BFBB187A20AF58A
1F36785261A1202C35C470C02F0FE989E42A42EAB2F3757633762C01B59CCE6A
8007097E4DB959F4449341227807E27B244E6923CB9132783005D1F920EC52D4
F6673FFBD91FFCE00772E439E79C239620B4025046440003DFA6F76C414A5F6F
1F068CBF1C230323FE0CEDFD2001E5577247F7DC738F886998EA22F56424487C
C9CF11BC3676E62E6D78EEC8D3CA854E39E514192D16FAB469D340D9088F441E
1CC1A6EC74462715B7C0E4D3D1471FFDCC33CF408DF15E505C0615FB3F606B50
75F404D8E5E0429167822D4EE50019030B9EA12D60D91D73CC31CF3DF71C9D7D
19001ABBC2B1D6E17DBC34717EECA04004361E01C3116C34364E3415AA82CE16
6BD6B2C9D4603E17B123D3674CFD70DD7ADFF3AD3A2184389BA948908896ABE4
7DB7ABA37D7B4FB7680CF9767247AB53AB0DF4E726B7359787F2F99A9312A151
47F444827CAFAC51A3A644191846C44ED79C21E5CD4C3577A69BCBF97277A9B0
CD777B4D77875B811F9D48C66AAE93AFB81FDF6FDF57DF7873A2526D2A263F1F
88DBDD81A9EDC9602AA64AFF6332972B59BE1D8FCA462B5755351A37ECB8E186
76AD9E580A1E77C4C9175424DA6227DA4B8EE9C5AA7E6CD0AFF6AAD9B14E5133
D3537EB1A5B26253C24D953A32A92DDB8ABB28C7FC7A776EBF4E0B6684ECBF6A
E7EE6C2866E42AD5917278B2865649CA0FF1669CFD8237A460D013C2631D0FC9
0944A2DEB2945A078638FEBCF5D65BC5F230782784030239ABE31175ACFADF4B
13A8BA58C4CCE2FDB1C71EFBCA2BAF80EE51670BD059CC0CAD1FAFD2DA41C8FB
DB6FBFFDF2CB2F6F6B6B033252368FDCC5F6EDDB75E38BBE05BD2D98F3B088A9
DB79A7DCB194A16CDF06DD801A4536F011910186259DF60E9CD570DF647AC9D7
E6878CE7728F22EB45B83CF9E493224410D786850EDD8C56D4B7DC72CBA5975E
4A5B43EE4BEE426E50E7A783C182781742EA40BCA83A364CCE0C2E23643E90C0
649361E211E5BDD8ECBFFDED6FDF7AEB2D12F032E3242FD1550D4443C87F3440
B6467DE8506FF057381E066A808E456449D52366BA3B88A50CAB1F66B511764A
60520A758B575C7185DC353B548FD35144DF420D19636E6FDC3BA297B012C4C9
43C71EF90A406ACC007BFE206B8255C79A12198C1C2C1A0E94B44ACBBAEBE120
4A7C9623C027200786CEB634CE7EC43ED735819CB9ABBD63EB8EED996C76BFFD
F6F9FDEF7E1711715E750C5F2565BD59817F2952408652766BD16422F84279C5
5C3108F8D4E1255D56744232E595ABED56C4AF39A6EB476CCBB0CC925BC93925
591087CEDBBB54C8ED0838BB6ABBB54EDDDC3F5048443F28F6E66C2B95C9166A
95814231DB948DC4631BB775A74CB333935283F9849DE88EFA038667384AE468
C552A9F94D3BFA7B5542354FCA1831B7582BAA2017AE6C34D6D9890433F833A6
A2855A55FECF8A347BC64C2B36A1620CB8850F62134D634B777946A4AB637EEF
7D6F55FB6C953253E55A71D780297FE528A39C957585E6BE54E77CE127220DF0
2DF8EA11F0089A3DF4F4A0A52ED833C7B7B071126C4CA2A575485EC30BC109C6
4EAFB9E69A1B6EB841DFAA40F4899C947528AB11202231400DC452E4F7805A23
72846A4C1A1D1807A39CBB3685636F3CA25F65A38A8C1349C7EE34D806285786
83827A2B153672227B0CD1EB84A0408DC9578B162D12BB4CE61D617A84564907
2D73014C088D6B7A9ABA03045F1EA671A9FE92F388163DFBECB329C7E524C486
12062ABF42CB65A85F6C78D6C1A2B803578140C7D6153313E7019727CE03E67A
9A21009950592E5FBEFC81071E90C3E4CC2CAA028FA97CA2331F30FE2E3745F6
6606A979C0942953444D6266CE3CF3CCBBEEBA0B640F73E6CC11918733C80215
3F809D57751744BC4E5964E3B33290B4032F0670601CC824C80D225BC3C1EB1C
AEAA9E6ABEECB2CBE4B1E236F1F8D09F190790F307DFFE2D0BB24113C86DCACF
6566880026AA62C99225322D58784A4BE9EB952528D859B66C99A825F9E4FAEB
AFBFF6DA6BD9E8AD211B0C56193C0204CA509D833435B62198B2A01274CCF858
93CCD02E9DCBC02E49A6F285BC7C3D73E68C751FACB7EB0E415496B765BB4ECD
366DD10483E5623A91EC291533F198A7DC7CD91135B0F76ED39DDE814CD58B94
9DB48A4CCE647D272080089ACF5866D1AB0D560BF96AF9A2F3CEBFE1CEDBBA62
A9B411115FD730131BBD9C6327F2CD89CE495D1F6CDCD03B3854F383D6340F3F
FCD0A2534F9F18B555D5E94AB7AE2F0F8A2688995171B4E511DAE95451FEBF49
256746626D966757C5B1AA9454D2C6DD8DB8D982A1629E1351154FD5BCCE587C
6A349E96B7C6A6B5F9F7B689DFD13677BAF7DBEEA1FEAA1B1187C1ABEEBA4F80
3924799C58035FF9CA57641142B6EAC0B091FC37A43060A41AB13E9C761C1F9A
5626C21B882DEB159123C7C98C20EC5A76DF42651556050347B4A5864F47500A
9938C5EEA35BCDB1FE1D7D02C84712A0CAD207E71A46894FBC906813110C72BA
29CD4D31C25650489F92B70777840D86F3880015D582C8C93DF7DC73FAE9A7AB
B080562EC1724DB57337023C45915008B293BD0057944DBE72E54A586AF215D8
8A60CAEDB3CF3E2237212900E4A77D8D07207A028BE3EEBBEFBEF0C20B45B234
4017E41272985C856C362ACCA642C0C10E850328C75C577F0141CF06AA2A2C59
C25396C388DF9793C854C88D33718D64B5AA2B2748343116E46C32E7401CA1F4
44261F590A40DC102ED3AB07C6410313F52C3F9427F5E1871F22FE23E609D265
2A7450888E50616130CF2943454E1BFB0D412DF4B1812305870C69F6BFA509B0
1AA1093092FDF6DB4F7C23FA5B7277F2AC65124451E143A86A59BA282B5121DD
371150A8BC01BC829441B847FDBAD8BD56BD8B998EB320951340844049C1AB23
727CD4DB194B1398CA306DABE604136299867283E8505CAEEE7971658802901F
0C544A71659694974CC45BB2992DDBBB0FDB67AF43F7D9EF773F7E3E5DACCDCC
B4E576F42495612BB3CE7564B9B65FB554D1A8557CD773C4DCC9F6F776C70C71
312C3399DE562DAD2BF789591B4BA486F239CF365BDADB7395D2F6BEC1582A66
972BCDAE3DA56BF21B5B3F2CDA46DC1271EEE5DC6A4DC5AAAAE6473CD5A1EC4E
95ED88AAA8234B2002B2EB11FFC65C6546125565E66B05C7AFB75DB6A6A7EC69
DB7EF16BBB58716281D7101B549954366FB87EBEB0AB9A00F22A5E7F2191C92C
178F81FB28AB825CE2D8B6700A19A5815F48A02609D046BDAE48865FFDEA57EF
BCF30E0C47D4A68C537A358E26800027D4155CBF2AB42C0D2C6559AF681D0EB9
29BAEEE1871FA66BC964F4FF00E539CEC6E364C9BDC9649161CDAA370D07DC1B
B38F641DE49D9E1937343A1DA08080AB114D76F2C927DF7BEFBDC02F2A2DBCC3
4CA9EC28967A3329A26B02FD120DDDD664EEE442B26921768DB06B02741B2D6E
7A004AAB8065E996BC649048263FFAE8A3801B21E0206FC496147383CF899C80
AC5087A3804C232254B8849C8100272439682633660524190B2CD96D0D350498
312C5F54CF61C0E484A08BA6971FE3D600B3E1C48E7CC9A545A92006883B8509
82A70C0CDB6EBBED8628194BED748A2E14BBC82588136335AFCCD8B9E79E8B0D
099BFA90430E1151FEB7D4AE376802D8FB840563E5D3C9906FC515138F042C81
340EC42C58BA7429D9F130B7C80061FEE110D05A848DD5908783832F6F301BD0
1C18007B0842BE8FDFC570D4E890512F682A964B9572B9A5B9A95A2CD42A4E5C
7490E33645634E4031A45A5B5A7BFBFBA64C9BB665DBD64AB53A736287932F8A
8BDA69C5DB5C3FAECA73ADAE8A5B8D28CB364CC7F74464970DBF62CB1BAF39D3
BCBA6FD3B468BAB3AD7DE3D68F3ADAA7BDD7B363C8F23F740A89486C409445D0
4152891D71E59597DE7CC76DF1AA3739926DCA645EDDFE512C9D5255CF36ACA2
EFE46B66C5AF544553894ACDAAEC6E91447BA4E816F9181BDEC402F6D3A49810
9E9517E5EB57949F6B4E7AB377FC61755419AEF25CE55888B6DB11B94AC9D835
6267C2C7D99000969FFC092025FC572364DE641819140062F1205A28EB4744F0
9FFEF427C460102E1EE73962A9ABB06B2FA4F138FC6CE3478780560720FBA8A3
8E7AF1C51751BD14944C2A8DDA82920B75B66A67DF533793FFF72F645F514381
711F7AE8A1AFBEFA2AEC41F490429E5D4682080690EF7ABF46F20222D58CD947
6D14823C1D1D1D279C70C2030F3C002D2237882A2D390F0416341FB6BAD2D250
BEC6E1435F044948521D60426114B37C175A572650A618E05478737ABF04CAB5
638F3D76F6ECD980D5DE78E38DD8AED8E17221B911513314B80CA6C1DA856642
A05F569B4C172939C97BA3278A19BF420C10E5F5FC89119685C3DE91CFC55760
B34CAC48B91DC43AE56099D2D34E3B0DAB0D21357803871F7EF841071D74FFFD
F78FC5DFC260086241F0E4101D824895F3CBCFCF3FFF7C3D6085E1B1341F6C28
A0AEA214463B11AC284C027B0EABBF01E9303263AC6786F4D611A80682FDCEBE
750408912F0FF5953239F210019B86434935A02320B8B940EB825410E0553A39
237A19EA68905DCD1807AB3D16AD890F17B5C58297556E780166B42B99549E9F
2F97445C6663C942A59888277BCBC5C9916844FC6ACF9111CC8935CDB053135D
C32E575D65C76425881A70AA6525FF7915E595552D93686E9BDCF197B56B8ACA
C9AA44349529C4A36B7A370F283F194BCA0D6F2DE52D65B4CF98FAEE868D9909
996A4F6E8A9D741DE743559D367DFAF60F65BDF9F2DB5242FEA7C4B8F78372E5
5A7C7224353DEAA5AA9EE5A99DBD76C8A4603F59A2EA5432AAD266A2B0B55CDC
6664CD8E81EE41B7E64695198D596555AAD582FB6DCA740CE6BBD5AEBC680F89
48912D43F0B43C1AD91A8821334FA6F38820DA012C32BE95450BFA2C069174D6
93519F2322DE147A0C4B8EB5BF46668C99A0460059DECF9B374F7C025863818E
D1F124679D75D64D37DDA4573CD300E795FE8E3E01A718A210E130E460314132
B0EBAEBB6ED5AA55207D431681E4EF2A6CC76C840DB3482A075023CA37C04484
E943BC1EF10476AF26AC88B7AC9B697A852A9E2E00C590FE32240A23B1EE456E
32FA01F1CDCA00B00890941B55C772B6030F3CF0139FF884FC50068C0091BC81
71AD420D0FD103C708591C3AFBAA0E711159431221F698E4C8EFBEFBEE8B2FBE
18A29934217206D1B2A79E7AEA15575CD1C0E9AFB46821F0AC9059720C829500
3CE87D3C5498FF6763D87150A4F08D40E641201D66067F42AD22518415CCE581
B17DFDEB5FBFEAAAABA8C6506D8F183D828A9819A65EF5718EB3201BF2046CA8
A0B79ED641E56ED838131EB7FCBB78F1E2EF7DEF7BC89DC89BAF7EF5AB2A547B
2A8CEC31F5AD34D0373C7AD28C53FAC355C208E5FDE9A79F2E4F53EF223556E6
702C1469F01C5D473EED9CD2B56DD3D680AEDA554D8978AC124460B3A2252CBB
AF5C98DC32E1A3FE9E5993A6440AC5FEC1BE8C1D4D3ACE24233EC177F68876A4
3D35E0546386658AB9ED072CD88E65140DA7ECD6648744E2B19AE9178A85782C
B1BD9257A9E68F0A4345CBCFBBB5A41DF32DB3E03A05DF29197EDE519D11ABCB
4A17CB79F17D3EF6C9C3DE7AEDCDD25021EF55B7C8392A414427AE322555A9A6
CA9119410B4AC71E1DEF5FF3A211F12FFC204C640C36F7FF29A70A7EC2F044B3
9989A678D5A854F3AE8C3B60CAB6951137DCD12D95719607B6A118408F3CF288
3C38D436CAEE40E93E4C101693B3FD8911D6E103BF803DA2F7F0D02103235F28
2080FB0EA43BDCCD71F6D7A8285215663868D3B00C68D829C19A83C94CF6082C
7D0817D2DDA8B07C06EB155DD13926EC1C18C5CC5BC2C0019606A0259DC59B5D
A48DF005C83CE0ED2C1162408D776BD4393098BA10E7EBE8A38F7EF0C10755DD
65839B26F7C6CA29D688EA907F96FFD013A264811C6492504FD0215A22778A1E
E5B4FE282620E960FD352439C1F28103A64D9BB675EB5619E4673FFB5931F4E0
70C8133AE288234E3EF964DC0516CDFCF9F3DF59B326B0D4529182B8F266A46E
0519E9A66C7E7050F95E6B6B737F5F9F690799F0622127BB33158B544AB5AED6
586F5F2567A96CC6CA0D88CC329B524DF9826853D73454D51FB34B25874A6B5D
EDBA05406464C3F9B14FBEFBDDEFCA8E924F40E38CF23150443047AA777054A1
A68158677A8DC28E7FFA61D92D4B78E45F48CC4B2EB964C58A15D8BD6C4F8484
3313CBA45C1CEB7E0166E5B4C05E73C3FECFDC72D0B8A00400792AFB21738FC8
DDEDBBEFBE6BD6ACF1432EB0864C15AE48A410DA7002156684545D6207C80402
BC88B99263C4A35AB972257D0E0E0C9E442C11177FCAB48C8869B955474C12D1
549326B4071C50B92111012DE9745F3EDF99CE16F343562CD254516911A786DD
15894D73AD94EB56828CAF97B0935634922BE6A256349D4896F305197A8FEA8F
AA9418F5F1483A93697ABF6F9BD5DCF2C1C08E52C22A96CA93A29962B532A0DC
7CC44FB4B66CD8DEDB2AEE483C552DCBC6340B86199FD8B1BD67B0E894AB56A0
B1AACA97275D279C9035AB0CCF6F3E3453A8166D91BDE96859AC23A71C94D319
2ADA636553CD6EC9DAB27687929359462A912C0C16B2A9E17A58AFDE980FC277
9CE80A75300C4A884BF8A368BCC102405A27840822A607413A1667AD0899BDF6
DAEBA5975E127F11B00879890978CE39E7E054A86D02F258E71CD46B0CC7D98C
90CFA05363698E0AD198E2CA9F79E699DC533482D9C2CB207B1A335410C4E241
BCF7DE7B48588B0989C423FC23C649B0D9642FD178947959B66C99D8F24C7C03
1523774EDFC40BBB47310AEF692D33F59008E4290D2B6C75DA3814B5EC10ADEA
B102B984EC5599773906D5B940E3901AF3CAFA8B0813B93AE24BFBEDB7DFA73E
F5A95B6FBD7564792DE79A928E1D6891EE8374103171C10517C85684CF88E22F
4E970AA1B1D8CC721EB9DCD4A953C19F2A33FCCB5FFE52B48855E76E4C06D355
3222D1C0F0AA2B63E5545ADB824D5B2E954429C5A2C38102DF0B2630914CD73D
A761A49D3C0CDFB3E4A86A15017DAF1EA4F59A9BB3107CA36A02406CE52EE43D
1EDF382B7B573501CC059937F6E034EA5D7D4456AE5FBF1EED7190E1077C5B3E
D1B98275C3BC4113181AB91B5D01E803FC56BE45D44B960A0A2688310509C470
0CBD5E3832D6FDCAB580A192652F87119D8561135FC792636E4511FAAB57AFF6
77EE87013A2F3D95C50D8FC52F330FC643B9907842A2C9F45C3AAE827A1A3205
A8D00F664681A94BE4B1E3C984980E2DADCD03BD03314B59AE8A21FB1D89C522
56369D712B4191446B5A64E8502C1E6DAE9A59DF4EC5A2A209A67A9648A9B25F
F1445229D9B9918A53B18256F6A6A76A6DC9D6C1F260CDB2326D6D1BB66DF194
D5AD8A2A92A9A5131B07B737D971AF5AAB2ACF6E6ADE5C18E877BC4C2A96AAAA
B469D52A45B14CDC44CA4DA7BA07F2A55AA56C29C775AB41415BA009B0FD4C5F
D55A83A989B7C49A2634F9965BF36A0185B6EFED7873C8B054407F2A73E918CA
370D6865DB84D4D65B07ABD09F1EF5F9C20775C36E83301A103FD7FD661CC388
B4F8E564411F9FC98E1200E93A4806D2EDE0302EE0860A447DB58F7A7E842EF4
8A4582DA91CB9437E243CBD5659037DE78A3086A71A603CA038C49EE448ED029
4F95E65C4C9A34499C039869D01372CF720C1C67B058430802D68DA954750E55
067F21D9C904CB0DAFD3DD40EECBE560CB93A0036B9DDBDE0C7B094079888E39
F1C4136FBEF96615521440FFA360951E19A686491191777251B648541A0D085B
6362A8BA1AE014B3AF248BD7D8EC457E2E239719837AC7E68487818A7F39C9A3
8F3EFAE52F7F194FEEF39FFFBCCC3F28CFE4B75BB66C79E6996754AD148B2776
F40E24521911FB5F3BFFC29EFEA15CB1F89BE79E0E74831841D100AB932FD41B
20679ACAB9C1608C96E978662491B2E3A9E2C090326D55CB9BB62F1E94673A01
EA0F2BCD0836CC589A008B4146F5F0C30FCB138738FE7BF904F01D3181279D74
923807A07F612986086B99313D0CCAF4804E9AAB6F063F64AA20B5145848E59C
FF9FB5F700B7AC2CCF86DFD5F6DAF5F473A61798A117156C115B623421620121
91A051312222D2150121A022022223204D0D56D448B000FA0958F83F63C1A0A8
B40C300CD3CF9C7E765FF5BFDF759FF5F8CE993927F9AF3FFBE21AF6D97BEDB5
DEF2BC4F7FEE071A37E81E3FA7D79EE1FDCB2EBB0CD442271E2E23FC1F941E62
02731F17E214589033CF3CF3DBDFFE36912C994DC87ECB4CD612F54D19E5CAB8
E6D9679FA5E7739E30309B0551EB1489228799BA210D0B5C4F08000A6C13FC80
916A42BF50A934BD4F4EFE0207C7FA8E2C191EDB350685A3D7F7C14B47FAFAB7
EFDC814BCB5910189F0FD77A2A95D2CE5DA3C3B846F935AFB8DC2FAD4EDD320E
7E82D364B7C34EB150D46A596A851D0D3AB4FFF2359DB8FBD4E8F396EDCF26DD
FE9E25AB0F3BE4FF3CF2AB5D4103D6EB013D0371B33D1DB7ED5265CA8A475B9D
52C15A5EEC4B1A4D1D75568E3F3CBC3BE84E343ADD386A5B318611679A0BE148
29096CAB1824810BE158F13B612BEE86D9154A85BA537386BBE4149C621807F8
C5EA952B9FDDF60CC3A4F4EF490BDB8520862426CC501CE98AFB22D5F8923042
89ABF262ACE38E3BEE81071E602EC3427E7C4263D14541DF91C800763DA1C7E5
820B2EB8F5D65BE9C19E478D565E9EB6CFFB9BCA101BC050F316980A71AD8BDD
4FA66D890B8571572AE052E343BF10FE7CD7BBDE75D75D7791B69843C203392F
64A772578C084F1C1B703D327D5030F823BDB7F41749333F7AD6D8974A62C882
CE362FFD5CE5899871DE23570AF0B8C1C2BF88844AFC192E84898C44FA10AF11
E6429C7DFA7CA941587BE26D48F9D50D37DC70FAE9A7439CE2E6586EDC73EDDA
B5501545864BEEB060E08815C928059E2BBD6E5EF5AA57BDF295AFE464F17470
25AC9E363826C7B180CC50BCF787F7EBC56FCF054B28875CBFE8F995F1A9E9C1
1E0D818051EDD8B12B6342AE6E54EE15AA49D8EA34E6407D2D8D3190F0082CEC
1DA2BC6734D80422FDDF9204383FBB76ED62B48D317C592B7916A3E2490E974D
058D16BAD90652E52A92703AAAF6E092D421C4AF487D8DD42E351F58DB4F7FFA
D3AC8B56464DF8221D93C4E78B6B0836874F206C700A4C6839EA2BAC5CC1329E
71C6191B366C80E4FBDEF7BEC72882641F0822A96334A2A1545386BBDF5C1F7A
39F02B522CEE206D8504FA9B7E24C93FA60B8B7ECBE999E9B3CE3EFB6B5FFB0A
6C82F56B576DDDBCB5E6FB65DB9D6E37FB7CBFBFB7AFDB6E160B7E0B5A46B753
759DE1A4D063178AAE33E278AB63A71447CDA8957A7E10E91C591D4FB6ECA0D1
0AE3CE8ABEA5E3D39333AA13832E6B3DD3EDF68B5E75CC9D0FDC37AD424B5723
AB25E57E70F9C9349C4A83B4E8CFD4DBABAABD6163B6AA3CDB85A859F2C4E8CE
A96E1829ABA5421AB0444CB6326E0FF9544EFBBAD957B6E774C27646D4BA71B2
6FE9E4CE200E71BDE77890049552E5A57FF1D29FFF3F3F332BF5B8718BE4EAC0
9AFFF9CF7F4E78706EA2F84B08B5CB7C161C7962564A5F52D19EB9E60B491A72
6A28BBFFF00FFF70DB6DB7A579D132555B91E80426A00C90247EF31C2D828448
B2C78B893F843F605E250F9AA958883CB0F860FC8D03490295081B8BB0B00A38
2A38BAC4D910247D21653C836780FA14B33F31D055AB5661A54C8400BC5EF7BA
D73DF5D4539007F34C219AEA1015509D88BB72E49147FEF18F7F14362D8A3963
EE5C38FC8A12487C4ADCB679D0A4B2076256E3E998149541EA6266772D81E8E1
952209286F0450DE14FB389318097434DE847D85300C4A4A2E08BBF770E24CE0
91347C9005D393B168F8508BBD52DFED37DFB8E599277A8A6EB9B7DADCBDFBCE
3BEF847A391D1606FA7BBF74DBCDAD6643F709F78B8E57C2BF519C547CEFE73F
7DB0003A286065F411E946CAD666BBEDD99EB6E6955B2D0E743AFA20056AD742
9C5A5A6CF3CC488BB4FF2D4920CA2FFE3DF7DC736179D00263D8893F17E03C27
6FCA41C78EDC7F9EB3CEDC175A72AC52B6F34672FC8A499F989D69AE9154A45B
D1E27E5EAADBE002D0CA25C75FE506B4CA9D54D4002872B0EF38725C46217B2B
EF2D4AF1AFF6CCCB10CD46FCC2F8D511471C8183CDBC09D0C96B5FFB5A28679C
024F35437A926D223822745D5287BBEAAAAB2EB9F4637A0C693A3234D89C998E
837804C6CAF474D9F18607FBB516D9ED0E56CA50B1A1F762D596699BA05054CE
72B778B05FEDB3EC76DA9DC96C0EDBD5ECA2E4165C65D58399B22E02481DBFDC
F19C461CED6A8F0F0EAD7C6A7C47CB5543D5DAD4F4F4AA721F94D286A79E9D9E
AAF655204BEC465C54F188D76BFB5EDCDFF3FB6DCF4FA471AA9CAE8AA1BEA419
A7CFFEA75804E7AB9EAEEADA9AA2ED6E982580145C2B493166CF75A224C46175
3CA8FC9A2A0E3AF4C0679FDA2419CF2C845C5C12882B924E6F2AE902332CE9FC
2AD323E99D66CA86B4A7C59DCF3EFB6C817CDFFB5CB0BF211D35645CDC3E5144
589328D839740F328B44D2FA1792041213C21BE1C0142D3422211EB66CD96266
1F8159E970AFB85C458F868273DE79E75D74D145983F519A551EA4A52312B766
F98C32B2CEE548F025DD3EA5F520531B59CA44BAA497935BC2BDA1DB5DE0CC54
0E7C4DE216B6C2440B95D718639C1C8F1C334C010AE09BDFFC6658F1F8441A86
B0064D72FC65D524D19EDC4152924C17334FA61C4E5E09B3802E14A260E27A33
C8A98C8C31FE29D99392DD289B7DCC31C7604B58F2ADF3730ABD49D879D31B5E
1B771ACB8607962E5FF1FB3FFCA9D5EE3C335A8F3ACDDB6EDA30D053C1902667
EAAE066689B2EE20899786567666FCA255EF40AEABD8D3A7A8B7A73C35AE73B1
7DD70B2318C85A48EC9353A719BAF2C73FFE71D8A7623CCE03D6FFFF2309084A
C19A32AEAA996425653BB28F4CC7C23292F1B1FE40B232CC67518F26BF631B4B
5C7CD24927FDF8C73FC66A635F7062299E09FE432EFC8B5FFC0277C66F59D182
FBD03FB04844D16C6E418EC02998FE59211B5605731DE841222296FC56BA4C2B
034F65EF733E2FF4C7B83A551F9601D95973666540DB525DA529A0F2D26EADF3
4D4D6229DAED667DBADE53F6BBAD6ED9757BFDD26CB35EC8C47F5F4F6DF7C464
D92F544AFEFA75FB0F876EA11976EAB33DAD6075689583B0913612B782214649
3C9B34FADC9EC1FE8176BDA1D3526D6722C4B3ED2DC1C4506578B2554F7B4ACF
CE4C0D5A6A4975A0E214B64DEF4AFCD26EA8F3C5420C15AB1D0D2B7F49AD2FB1
AD19473D36393AA16303766025993F4877E081D20FAA765295B5D0290669ECF9
6EEAD841A73597434AFA8244483229EBCD79415DDF899A310372D22B7BF19A5E
B651E23592F662672D9204D80AF4433BE0B8E38EFBC637BE41E808A27571D325
EF60EF17B58D792C0264296AEBBA75EBC0B86EBCF1466679AACCDD42A78899A1
B3D0CB3C71E298C1F431C88BB317398F34970587A41A3A07582AF54750767029
DE5306523D04B37BDFFBDEC79635201430AC77BFFBDDD75D771D9E87BBDC7FFF
FD781E212BD800192360C71B86015899292C92D469265DA85C21928C080A18F1
AA4B10469CA72209F009BD757C84246F9988F6CA50D95416BEC7DDF85B928809
D36F5A1292BA6A860AE4646222F856007C4C8962E5FD4599DFC92825B363CDFA
43BA17711F70B737BEF18D947084B5996D75ED34E9B49BC71F7FFC969D636B0F
79E103BFF86D64796E307BF8C107B42676149DB4E85ADD08D370EEFEFE0F8276
CB75ACBEAA06890B53BB6B9742BBE89521DDB7779A2A6A7B5BFE6BB34A835225
6AB7A65C5F45CD0551A605C907CB78F4D14783997EF4A31FFD5FB4097801FD18
14FC5C4912A81891E0C8AF79CD6BBEFFFDEF538182B07FECB1C744B9937E796A
CF88B144E6494BD84DB67F611C82D62D9D75A40D6927272511B41E16D2B9F02D
E316A4403108045EDBCC6BA2614DC9C12A01163C338E2D991B669A90F9739ADD
A4349090CC9DCB45F80A5CF9E10F7FF8F6DB6FC72CF015CBAAC57F4572322581
7EEEE0C0D4E4E4EA35AB766DDF9184F16AA884304FA7663B2AEEF1FD430F3DF4
A8A35E78F7DD774F4FCD8499436699B2FB940B3B73852A1C69F50CD96E27ED36
2D1B722F5249236DF597072009340349929DB3D32D9538BDB56D33E3D54ACF68
7312DB3C1DB4A34E77FDD092BE4235B6D59FB63DD72D7BB34117EA08A4D67EB5
E19AE5B5A3E0F9767DA78A46B184B8B94A2CC74AED8CEA34D4296D022B4A2D6D
DB160A966BD16A2CD899F7DF2B631271D4216C8246DAD62E51FC283123C69404
8BECAFB917729009FF8505BFFEFAEB994CC1A441F6EB96FC519C771C643A1816
920474C213F2994E481663E2B674E5D3823175509C44BA3DC594591C79D0CA91
FF1925121737D57AE625823C44CBC731D49280B392F45233DF80BCC044D493E5
93D6862474492D17173CA8F3DA6BAF65B45A6556B9645BD2052F1133E1EC7447
C8111567A8000A095BB18C4A194A4BA9DB16912678443CBA2CF292E45C334989
1E58C90061DA3E9F45AE6DD6F493D750E0915D7EF0831FBCE5965BE8D6A7B812
939CFDA3059B9A252424CA3DFAC6E521A0638F3D1692981D13C1E58B956A3788
A6DBF1317FF3D6FFFBA7CDDB6613BBD23FD27CFAC883F66B8E6F7FE277BF59BD
6CE8B1279FF28B65B07E2FD2CEA559E8656EC9EE199E08FD838E7ED57833EA6D
AEB055A5C71F99199FE9EF8195B3F1BE1FDF9AB4B7E0082FC4A905678DD09B8B
EB38FF5F258198C0B4E7187092827B3BEF01C9C36056115A3902040339C22ED5
9E59A434DDC06419BE12533ACD3150F12F74AE871F7E18C780C91BA43A025AC8
762F52E963EE29B51948AC9FFEF4A726E424EB4E79CEA94EB17B9DCA33C455D6
3F0386ACDCCDC97BD4CCAB689107D1BD2B2D10B83552100A223CFFFCF3B14DAC
AB2056AEE027CAA1D60CA89021E9EB2636AA5C709D488B2F9D3CDAD3DF68CE42
ED7CD1A107FFFE89A7467A6BB01BDA61B2D2F6FA13D74BA355CA3B4C5587B5EB
A6DB566EA8749667470525AF5228FA53F549306CD7E99D4983C9A413D9D66CD2
EC29F78DB5EB5E4FA5CF2F8EEFDE7DE8B235C79FF4F7377EFD5F9F9B9E984954
4FC971DBF6414B57D8ED70B6DDDC184C371C6F67AC1B68C556A213479D39BF19
2480AB5343210B7CF07B6C6A9CE4ACC376520D8B5DB255E458CA7355100659AF
330F868457B545C9A39E416EBB4896301B6D515B35718559414210727134C579
1755AAB012975A3CA26B12B6A40949A625DD06FC507AB80A4482CA3D280B8D9F
E3E448CC0C1D13EA26CD7B695035C1A4E6E2044CD3A434A37B917A1399B594CB
4B492D6991EB25EAB604E258FB40C7024B30985E4D3A3EF5D453BFF6B5AF9127
5201E451112D9E968479DAB9D6C2384CC40516A9924770AAB806179C73CE39D7
5C730DC3861203E03299BA1BB99519AB4C73683C95E3E798E162F1DE62D1581B
C57DA2A23707F49A2645B6BC48D3C1919189B1DDD5BE3EDF724E38E1842F7CE1
0B92ECF1E31FFF18CBCB434B89F59DEF7C87BBA225A5DB5B499A8E15FFE7D3BB
FA0FFFCB7AE88CF8C1A7CF7F4FAF3D679F523781CD818742EE4A310B419219D5
D715864B0E5D32F042152E1D1C5836353DAAD2829BAEF29D35DFFFB7C374FD66
D255294E85AD12DB776B8E55ECA6DA43427F17B1A3E7D2EDEB730E0DC7D7874D
E77FC35AF774FD44B735830F4199BA0579763C755C3A985B4C0A4801D4CDD8B4
76CABFFDED6F87E299579944BEEEAC1EE89E8269862A51AD31721BC450F7BC88
E8437D7DB8E12C2C367D0C40DC73E9F35A5D0AA25A4FB53EDB2815E7CA4484BA
044AC44CA4111142671103BFB2CB26BE56BA67C5D98855FCC475B79CF6910F26
AAAEBD106D2C421163FEC4BF5C74DD75574F4F778A255DBD147494EBF8110EAC
C2D4342D6B5656A8A864D68AD36A6AC565ED2CE6C9975CB54590C52443547A70
C2B485457EF3CD37136AC9CAEB89181558A86F41560B46887FDD01C6B3D592C1
C1154B963DFFD493E5D4E9F78BF556BD88F318693133D3EC82FBE26855526B24
75D6A8C2FE56697FA732E8149E0D2652179ABBAA075DC7AFCC765BBDD57EAD1B
BBE1F3ADF19523AB76ECDEBEA6B24CB5A376D28E9433E1059167B7DCB4AE5179
022FB27A55A1E6F94BFA964C479DED416347B73D1107ED34EB2C695927BFFB9D
5FFEF2977546BF4E906BF8061693B8D4E6B63E3B3202D8C7AFA48F85A92B5022
2E8EE6EDE47DC1F8A7407D60D94F3FFDF40D1B36B00246E57EEFCB2FBFFC939F
FC24358C3447225844D2C86068ED31AA6FF6D3DEE7C562384A48695E76A9A089
087A18C31BD75D771D4C197C4234B9EDDBB753CCFCE55FFEE54F7EF21391403A
2E6866C80AB60FF35BC4CFC3BC343C839DB62C03AD13237BE10B5FF8BBDFFD8E
F4C70EE3CC5527ED9A0973BC7EDDBA7584B424E94BDB1DC9EF16D2A7438D920D
74CF888DF03B4177C1827EE8431FFACC673E23CD69B9463CE4B0454E3BEDB48B
2FBED844584B0D642EEE1FC16A2467863434AF138865BCA4E2833607FE6423CF
D9E919E8477361004BBDE39DEFBCFFC10777EFDC09D68617A6C041C2A8BAE38E
3BF068E2BBE10EBC0FB303F57EFBB5411FD4DD5A79E84B46D580552C0D7B712D
1863A62F453D56861D02A6A6A6F0067B479C67C9C2C47DC6D2AD456F457DCA9B
9A9EE81FD4F2727ADC7EF8979BFA8B6BC140BEF4956BD2689BB29BA58A0E3287
11D4349D147BF2C927834D1F79E491FFF11FFF314721B513CFB8E0DCD7BFE115
F546338CBB434303382BB3339AC24696F4A8588D8D4DFA5EA9522E3D70FF2F6F
BE6E83DFFD01F118A48A3857B709E093BEE845BAB9232859B3A444150B3E737F
99B3418834CFF51CDFC364BC4281D5CE98B39351DADAB5AB376E7C5AB30D2733
3BB213E115DCB03B27BDD6AF5FCFFA156A0398459CBFE6950A722B412A84A29A
D7A56E9E2488ED5895F63FE3A3371DF5B2578C0CF6E2B93BC676F6ADF0EC8921
50965F54D3D3F566B3BD62F948ABA91EFAF9235FBCF684A0B5C577A18E0C4ECE
3495D5191CE8698C37BA3AE34509CA379F482FE5E2EC43EA6CF4CA67953DA6C3
8D65538B2045CE9304E02BBDE5E2606FFFF4CE9D3DCA1D2896EA9DBAE5179B61
4727E77475C74B68A155C86F65C12658A3CAABEDE28053DCAD1ADD286CA46D57
152328EAE5D2646BA6A57078ADFDF63FF0A5AF7EF5430FFDDFB12D3B5B71BDA8
2AD5DEFED170AA9344ED386C653AA29F3A25C7837A5428F54E87ED5D41732289
1B76DA853590A8388D0F7FC10B1EFDC3A32000AC3E5404C7D0BEC18BB1BF74C7
E11310181601E4C17824E9DFC95BFB8ABB424A344C9D60A17566DC454A31F862
232CA659B38D0AEE8C0FD99095FE030C00ACE6AAABAE327355E6DD1F3FC71B41
FC34BDA37BBF04509D288778CFE4258C84D3B78C16230261249E798C070FE2D2
916B8976AE7273644E7C92E7B20989CAB14F257B896C11974A205B7822CD6D3C
F28D6F7CE37DF7DDC7C6E2D80C8685A9A1D0C945F39F0E1FFC841AA2A00BE06E
1FF9C84720B8F8437EA5B21E8D780FBBFB99679EA145A232AB9F92095FDD74D3
4D679C71C6DAB56B59AC4B99C131D32B4512916CF4BD5B7D928F8BF347CA89E9
3813A3615E4538D35488444D2B47BA6EA9CCAFAAB2144D2D57C2B9D090E3B971
1889D3C3CEFB7DE2CFD7BFFEF5071D74109682309314ECBAB54E5F4F4975776F
DBEC0FAC78E0918DCD4EF493BBBF164F3EEF0FAFC57D98ED8AE948380B7BB479
F36656BBD060A2544ED4EC8E6D8D4A69288A5B41BCFB9BDFFAB26D553C7B70DB
D4F3939313933B211EFAA676CFF6D696CED63B3DA5C156B4190390AC6AAE1E6E
7BFF0F7F75F89187D67A3257AD02338AEBDD7AC5AF242AD1ED0EE3B4E094609A
A789DBEDA8877FFDFBD7BCEE283B6F374455970A44B95C6CB5F027B42D9044A0
1B257A5A7DB355D6D125E3E82B96AF60BB1BFC697B732C8066C1D0F030ABCFDE
F18E7FBCFDF6DB313CECC273CF61E2DAE9049BC02FFCB947B930472E91EC3BB5
162B4780905270A9ED5AC42678C5EB5EFDD18FDD74CCAB0ED591F899B402698F
77712BAD9583B055F032431E3A7B987A6E09B3F9E1AF77BDE5B5073871435B31
56C1AB5A51378803776050279231B1826945922EB51007313B3C9BA96E56066F
B965CB16DE61F1CA234BC75F997FA2D224C59F054B558B25A7DDEE758B038562
A3D50C5DAB95049EE74601E6A13C6891A9EA55D6B0F2965985656EA9C7F1DB81
8E430C8F0C8E4F4ED45BB3AE57C06DFB0607C666A676B76707A07EEE1A1DEC19
484076114C2315C41AD930628286E516BCA2E568D37C1C041A76A6D3B09EF593
8C1C5881090C415A87057DDBCCDB93B18524EF09AAB2EC29EC143803F3DDB183
D0CD3FF1894FB03A4A3002541EF8110C63138F611FEB633405E34A828DE01158
5E69A8C5E826135B98BC4BCC479515BB388BF663373D9966D9E342D7BFFBDDEF
7EF8E1879F78E209BAFEE735D7A4EE6FFA69D8765E9C42F4498ACF93B1008E90
182D9416DA26300F00260C8AA4EF051FC2F6FCB77FFB37723D3BEB68CF90AC14
C2B07A859939FC93F57864E2581DC1A4A49A46A72A149937BDE94D5FFFFAD7D3
BC4D0D2FC0FBBDB7479A75D0BF4C5D9B09EF14771254A0BE4F50339620116680
3F915C265941D3ECA2B39515C826E7A2E7CE317A99C9EAE3A1A79C72CA77BFFB
5DF610B6F36E913D455DA6A15DB1DD8E9B793C5CC70DE3089F80979572A86D5C
5AC97ACC4268FCF55FFF35F38E985B49E98DCB26773EBF76D5F256A85A6961F7
D878296DF717E29D6D9D728A9DA2D38C2D16F05B50E4A38F3EAA327D075366AD
AC46D4687961D72997FA9AADC95235FAC31FFFB3E095671ADDF290FBAE77BFF3
2B77DCE15ACECC4CDD4A0A8E5DD41140BB6EA65588C9F8C14F3EF8F297BFB46F
B0363B3B6381E127984D50EDA969469942119EA9D57A93005A45A9E879F7DCF3
C02D97BD81F92DA2853116CD345F7173D3C8C55358AC8BC507791C7DF4D1A07E
E8165A725BCACD103E689E6A04CD011DF05CB77EFDB3596D9726C52C2D2D8E74
3A94EFFDB91BC4CB5FFEF25FFFFAD7B8E0D24B2FBDFAEAABE779DE45B4B3D25B
507F5981BC50A7FB245E7BE9E5B71FF8F297DBBDA103D28BDC46D0290D152A33
3570BC249D4B0B0E833489AD42A174FF8FBEFFA5CF7DB81C6C77BA69236C278E
3AFA652FDEF2ECC4E8E8732A4FBD1356B5481F5DF106883A423D0C07168BF3E2
17BFF891471E214682CA8B8616910419195B76E6D1D399668E5B4B55CD29D46C
4DD85D2BE9DA59B573D697D2556929B12B1A12D4EEB7BC3ECFAF388537BEE495
CF3FB769E5F2A53FFFCD4F068A7DD39D299DBBA692D2C8D28DBBB7459E5B0FA3
A13ECD1FEBA10EA73A4197250565586E7E19E4D656294C844D9D7690C4186BE0
D8D09522CBE9264980AD4C9372290387C882ED9D602E7048154A626CCAE8FC0E
B2F9DDEF7E278C95B253FAB9923BB3AD589AC106EF737D7837935F83B72E5FBE
9C19ED2033D6EEF1C0D24061FE3DB79278628BA0468B9B4174381C7908F26772
62DEFBFA79396984B4A3F356C49B597D22D0938C1841CF60F68D48C77928C2E4
7296D47672096EB9E51628DAE47DB8E8739FFBDCB9E79E4B6F8CCA95E8BD6356
F3FA47E2D9EC34C0C22EFC4B7A6576A6382EC8D3194C666A3FF1EE191FC664F0
433038C9E827D3C7C67CE8431F82F017BA07EFC0B7EC0484334CC984615F7FFD
F5471D7514DE0B3CC87EFBED8715A723484C3FEE199EC539BEE005DA6B616E83
197023B3E06BFDFAF560BE12B4E08A6339FCACE846BBE9DBADA2AF9954A952C6
2718E796AC22514711DAEDF5071CF0FCF3CF875D0DC776CC31C730687FEFBDF7
CE39792DEFB5AF7DF5433FFBC9E0D0D0B2556B87FAFBA6C7769C7DC66971A1C6
8C05ED31CFD2DD4082EF7DEF7B390C0999B26E301B6DA4693EC5278562090659
13EF33FA59D6DF57ED0433ADD6388E706FBF46A6989E9973F4AF58B1824D0EC4
C87DD3593F01AF8FA344D985BEBEC1208CBBDD90FB95199BADA1C1FEC9C9B1B0
DB5CBE62D9E38FFFE93FBE7E120D4D89C69B089AA2DD9818A29207496D650E00
AED5F432F3B9050336CB50803028654C4119ED9DC9C1755F56CB667C8C59130C
F19D7EFAE9B0201792042A331D3812C9F05BC826F897AFDFF8C4C692EDBEA439
E3EFBF74FDAECDE3ABD70E3EBFEB51E5F9D55A250CBB4CCE2B148ACD46ABD309
FA4BCFDC7EC5FB5C6BDC8953DBF1022B046F1DE85BD96C8E89F68A7F3154AA2C
FFAD2E291A18DF33AF81454FA6EF7871EF507681EE4FE0A8D4CD3A0DF4A556C5
72FD587FD582A5E466715AFADCB03ECA2A29BBA4AC22FEB3B515774CDF7EA363
3B0E59BBFE0F9B1F5EEB2FEF749B591267F44CD228D57A4AC3839B77EC6877BA
D8ECC8B69B49D2A36580532D148B8552EA58F5389A0CDB8DA8BB5D170F684089
D072B0A32DC852706D4B41EDAA556BF546DD76B4FFA4D96E09ABA1DA4AF0AEDD
BB77330B8B704C02D128C54071DE769B9A13BDF9F38A9CE6495CE9E1C8B515EC
746C2B38CF97BFFC65B6FF6581D8BBDEF52E7C42042162496137F1434914DEFB
FEE285168CA345F68B412CEE290B1158CA2E7391DC486652305F918A35FE64A3
111E378C9679D28C4C58590126FDD55A120879D146E66901C7C4EF99C643C923
4A37BD6FDC0C7C051B0D8776EDDAB538F3EC9D42F7BD80DE611090D5994738E1
0E415DA5C79CE846B8153F67E19532BC342AC7689446C48216473307CC17D360
2E145F9238C10A207AA8E9FEC2CDA14D7FFBDBDFE6229A28312A537E593778EC
B1C7FEE8473FD276EBF838ED44F10E9912584AAEB8BBD46AB5C3C7B2C1BC7AFB
74E3D942D1A70601C5B6502A05D05C2C6BBF75EB9E7BE69952B50A1AFAD297BE
34D8DB4788706A2BECD7A855548DF1952C5DBD7ACDAA15055B9DF8B6E3699092
CD61E46C9072F9E597937F49171476AF6466A4563A82D6EA35BDCD461B1A4CB3
AE2B0CC0A460A6C7091407D5A82BCFB5962D5DB365CBA8C668B18A51BA476B01
2B6FA212BFE8EDAF3CE6352B96EFBF6B74AAD588FBFA87F0310BC221E1A228E8
769A38CB4383B5B1F16D0F7DF98B6AF25794DC9814DDD9B96A632B230582FC57
4777E340541B5033F694FB227E1E0DD43E369675CF4D97AF58B163DBCE430F3B
ECB9E79E6BB75AD55AAD91B151186BB695D22D468840D2B0B4A990D328DE2182
D74AC9A1345F5B4812E838811A78FB2537CC287BD774BDD4B77C26EAA495706D
7744F7950B3B94E8DA90551AAFF89ECB4E53D68E5A3168B7C26ACFE04C67A2EC
175BF5D871D30D1B369C79E699B8F30D37DC70D6596789F9BB4F8E601965952C
5B63BC91879C674D7AE02C8246E0DA4E94CCB9437596A5956567A66A895BA828
D789828253A8C7DDB4A0291C62C3819CB0EC92651753DBD5EC28EB0D655B6B62
AFD72DAD5FBEA23D391DB7DB9EAB66BA501AD2319D569482D03B2AF5955E0A28
FBAD30EC2FFA05D8C885220EF66CD89DE83627C3B0994104793A47C88913BB11
452D0D6D6DC58E0599A16552BB0521A10DFDD61C589964FD1D72C821071C70C0
FDF7DF8FE95375907A1113A2D85C407AE4E97D5D284E4046C9AC4895F915F839
C983CDA8ADBC8784327214797EF993FF365CCC177DB92AB3E1168A2B702EBC39
7505B0BE75EBD6C1FAA15D48FE6CA668337AC1B03618269D0DF8E4B8E38EBBE7
9E7BF020CA48723C2CDD9C2420C7944C29A643F1917C3C2D326E80245F8B50A5
BF92D289AE7F225508CE333EA7B4A03773EBD6ADFCA1A03FCAF648E5BDCA545A
13F7952A0FBB806200F3CAD6787AE90B63AAAC1853A66A207B26EE17715E4BE1
ABCAD1BBE4E7BCD53CBAE1A2B34E8A2E7B5021588FF6CD25C99AB56BFFE66FFE
069A828685C37A66BE2CB29E8E110F3CE0E08331A9348C285138000966B89E7F
F80B8F2A577BE2A0FD0F27BC09C2A054EBED264ED0AA3381EA939FFC245BFE62
0C64B2E245E57291946D1BC6414359114C8BA9C946AC95BE6468B8DFB5C3D1D1
B175FBAF7B7EEB36C6915821099D8DA395C4212ED12B5F72C4134F3CD56842D8
5454EA687F97AB196FE657813AEFF85EA1D999B555E2D820717BAA35A7776046
AC7A67E628084719B116CE5A5FE9A82037D86DD6FE44919D593CF4A1835DEA62
B76673F59A35A0A234B148755A42479197D180DEFDD65C762C1E01C3F1C61B6F
A4D663E52DE0E7458C459F2259EEBFFFFE20B9279F7C52424AF324C150B23E2D
F6ED6E6F5FBEDA6B8C6D8BDA6ECD5E1AA4F174BA0DF61FE51683757A5C71A40A
CBD27067A9A03A5DF05B4F6760266AEDD08ACD63DBF1201C1306395970EE2CDC
EB4D62833266AC0C2D66522FE999D68C69FECF7B653E9C749F92A0D7F6DD40BB
EFC6DAB356C1E986BA7858B305CBA9584E41D9569C841A152E89ACB496A4E5CC
4A5851EC5FD2DBB762C992DDE363BB77EFF27B8BBBEA539341BBE8579CC4EE84
6D1CBB725F5FAA411093669A40704E479D7A9CB433DDBFE63878BA955A516C35
55DC50294E4868A5652FC3258B42D8043A15258E489334E8A50C18DC802DF978
5459BD4F87AD74941346C4409DCA82430BD90426E4A7CABD20D4FCE8F3100C4D
42AB819FD0597DF1C5177FE31BDFD8B87123B81358D622F50A4CCB662E354672
C4114740FBBCF6DA6B17971C3CA10C79EA1CB69111CCDD8C6F71DF194C66BA30
B36C449762753DF3F259B3859FC0D6995341545EBE287167C6316EBBED369842
242CB662E7809C3D7BBB2BA33397183BA6B388929C91E173CE3907E799698E8C
5943C63EF2C823662761DE415AD0E030638D20EAC509235916F4F93032C14C70
72433A46D8F78A524D1C26B41F05599EA28EC906F3F22EE805A2F19E18FDA464
7B287868AEE2B724B8B9D4D25673190CB11D3BDCAC3566B33EEB168B51BBE365
2E9DA8DBED1F1AD24CBCDD864C4F8210561B3340B062C4B23EEAA8A37C5B27DF
BDF33DFFECA49115347AABA5A96618DB7ED1F73EF0810FB0938F32A2FDE234C0
2790433FFCE10F89EF8F33D537509A9E1987DDDC696BFA48A1358669D5EF6BB6
9B955225843A1F767A7AAA9D4E4BFB6793B99D355BC9EB74632BADD79B904FFA
B68D19CB49FCA2EA30CA9368A4BB24C07A163502606BAE3BB4D4344185D9BC79
3389B55CAE0A8C28CFDBDC194E3568FE40D60FA7D36E6728AA49A95C86CA5FC8
EC74BDDA71FC837BEE79F39BDE846F4786978EEEDAA5726F98B650751ABAEDD8
73397662474A7C6B9F59A4526AC02279361E21AAEE3E2581B60A8AAAD0B3A231
B5DD8E941DAAFE5A79B2D92AF6D69A382389A2D592D5C7668039815B2D47B006
7516A95BB20A41D549E27A1867874E7CDC6440F35AE3ED932308E54B561E2358
D2C4429415B5C08D38136C1B56219304969DA8DE2419702B85485BFFBB5A9338
03B095AA5E010B54B4DDAAA59378B0B2DD386AEA14B3A40AC96BB9852072D2EE
CAE288EF6818E4DD13E36934EB94CA4DADA5BAC5D4A914CAB6EF35BA41ACE2E9
B03DDA698E2B1D1C8E6CE5941CB7E0F775D334D412066BD9CD7A99CD5A4957C5
4E365DCFF574F81D62200BC5911D91F8697B812A4E3BED34B060ACC935D75C73
E185179A15489209A2F288B1C0182F82356BB689355792B401E94B1E62C2568A
D39FC8698B48E2391A3292D49904BFD0F5CC7CC11B7260B229F0B7934F3EF9E1
871F7EF6D967E9E8679A8F447C4D5595F157B2CD7FFCC77FBCEBAEBBCCC63874
6A699BC05488AC3D51B005C75F10E578A8A459077375589E43CF068F0DB74ABA
4E4A2E87D9B9899CDD8C60B06DBACA1579DA1FB7DC720B181FA99C45CE26CEA8
321AB59B6E6813064E9618B21AA362BDB89DB7FAE4C6300F979EC74D9B3651A7
56466A79D62B4A37A7D5ED30C048B31C475FA33D6B9F065814481643D26ECD82
9584E1D09225F52CBC8905B5D2AC9CC4CAFC1B59A641316B95BE6BFBF6652B57
469D2ECC1A89E0E3F3030F3C101379FBDBDF4E8C33AA211C2D41CC058D43C097
B85F9CB593372F65F891FB2B9DD029B6E9DFE7C445CDE4D1A2E12CFC05FB4E73
4DCAC454AED19B68592AF7ABB2938664619ABFCA7FEB9AEA9280B555AB650E8C
A9413CA81AF2B6D36D77DA585E2A285ACBCE5EB1D1DF42192D99EC1C915FDC29
C9BEFABFCB1B5396AB3C7C453590BA08790A9106AC1CC3D2D9ABEBA4A91BB189
057D4DA437EE1A993EE593AA7AAA1D62AC7694662243EDB766FF57BEE6D55FFD
EA9DAEB263158DF40D6341742F5FCD10FD56148023970A7E27EEC645BB1B7554
37F66C8DC7C359F329CC14A0B3F1FCF3CF873E77C619675C75D555649A73B59F
19F5BA9E5370A18874C1735DDB2984511F747F5DD49B3A7EB165C5139D766F01
8A3D147FA710A47E92B50F89E3C9A0D951B157761BADEE48B11474DA5517BF0E
4AC572FF60DF92E2C0F6ED5B4B457BC592A1CDCF6E1AA8F53BA9B7737AE756E5
05563A9942B5CF16394C868A15D819975F70E1A5D75EDDF0DCB146F3E28F5D72
F9959F887DB79D066977AE3B61070499614AECB336D8DC4711AB0249201C8CFC
EAA28B2E6255364350AF7BDDEB1E7CF0416E1938386162551E4032F16CD4C228
D6B454E81217173A332328A7A5FA55CE9495C3A74BD7EE452401AD3D518EF120
BA3A85EF498B2A0AA18F7DEC635FFEF29761348B38143DDE6CC2CA3F5FFFFAD7
FFEC673FC3659FF9CC672CA96C94F3C3C32399A02A0BC9424B850906CDCEF41B
90A6416A37DF7C331DF4025B4D664A6604A6CF94470EFD924B2EF9F4A73FCDAC
58628149DE8EB478141DED9BDFFC26A41FFD3F0CE0E06EDBB66DA3334A041ACB
8669C42579E7031E72A940863CBCF3CE3B9904C6932C1E556AF7926F4A9F86F4
06C2230E3BECB0471EF9BD5604C239283A70FF817E5D6E8E73B5748906F89E2B
8CD275F249B956EBE2E760C7C512232B507ABEF8C52FFED33BDF59ADD5984B0A
6D376B0B1813240076256527235456067B823FEFBDF75EDC9C2820AC3BC7EBD2
4B2FC5F683083018EC0B7581E1E16150B37076EE111D68E2585346AE0519BA09
7229DF4AA2FA65975D063E42A81C88281000AD3DFC2959D5582BDC5C2CE23599
F7C6CCC33363B3B0B6A964503533D2E7137174505D605544C52F76BA7F4EA781
F4D5DC3FE85A7B964A4AC58DE8FB6273ECF9F4F992404EA9CACC6733C18C1A1F
D7C7CAB0284836A6BA9DE48D27D31C1A8C5635368E4172C951C6F93CF7DC73F1
09A1A4C3EE5C025E94CCE102411AAC3FE08067766CD1A93D71A2D852C252BD4B
97CCEC1EAD94FB8E7DDDEB7F74DF3D83C3C35BB6EBA4EAFEBEFEFAD454946F34
8184711640E7DFFAD6B7F05090074E8A09C30EDD0B9F8F2CD59E4C185E2A0BD6
82E1153D0D4775E8F2957E90EC18D77D0522C782C900330B6319B0BD3E18A3CA
F11DB71D068D24049B1C8D1A4B7AFB76CC4CF766A83F054B1FE75DD3538376D1
B3AD206AF76AB32EF51C7F26EEF8CADBA96B17BD46D0B13DA86C961B267D8552
1A84B56A6D57D0D91434BADAD55C6B773BAD288C2C8D3204834A2F3819719AC8
46EC531290E5D10349FB989C8DD182A1CC0A9776AD048A205CA6C0388B4E831F
529735EBB616C1A6357B4508E8246BB3440D22650AD2B5C818B2BB45EECFAA2C
C29131942B703814066C6446BE8D6BD83C43E5A08AA6DF9BEA027D532A4B789D
534A947AE94B5F6AC96A52AB4AF3FEBD2682ABCAB12924DB9A163D4B6DC5A38A
F7601C1FF9C847642D68CD71ADD93D0677A3678D48763AE13DF36E73E9C91399
95A50CFF97E99EC22E9E7DF6D990EDC49000B9E387DC5191BA6906A306062A45
7799D6596525B3083C8A0D712B1333529AF75A79711C6E9BADEFB3995B094672
F679A7ED3A2E55D4EC1C657A96E3A6AE3ED960B1B8149F13C3A358F0C1BC72DE
91CE64CEF71ED8466363B81DD3619972801112BB5B4A4EBEF0852F6071D882ED
37BFF90D77870616C606FE8B93FFDC73CFB1028522F3A4934E620A8100CF1255
9114409B8C9E44493950B9FE2EE1475EC96FF1A1A45451E4ABCCE7031B8E92C3
54AB0935384F654EFFDC4C71AE84858EB81FFDE847279E78626673A4ECE224A9
D0A0226DC70421138835AA7BE68DF2B3C52CE425EE6276A47B76929083BACF03
66EA925831989EEF7AD7BB5819C4846B2EAF207AD288C40859D344FE6E9A1D72
A840452CE93CE8A083DEF39EF75C7EF9E5D28D44DA206B902EA50B740BE54AA3
53B7A14EFB85C6D46C5F4F6D7AB63ED0579B99AA57CB3A89A3E0FB279C74E25D
77FFFBF8AE891B6FB8FEECB3CE05731A1E1A6E353BCD7673A06F686C7AB7883D
CEE898638EF9E52F7F29270863C681E218F0EFE9A79F7EEB6DB7EA2D28F9B6B2
960D0F8D6EDF01B375D0736B96E7B403CF767B960CFD69E7D66AC12B174BE582
E784493ADBF2D2A4CFAB3A961D401BB2ADDD51735645AE65C330C193C0BDFDD4
1AE8EF57A9DD9A99EEB1DCBE923FD69C29E8307EA9099152CCBA8CB43BDAB281
508955AF5B8CDBDD31158F3BE9B624687A59F0C9B2D3083A01D8DC9C06E0B859
B4320A4D0CD7BDF7514CFCD86855249789E743E06468CD93D713AA40B213556E
B799B01F8B44F2A9D14A46250720006BA62222F75F8420F796343494190E2468
34074C9DC9F483498B01362497A2744145A35F88DC9B66BDE429FC59A29ACE53
BCA005FFE94F7FE2B76632167579B67CE21057AD5AC54C551C12B34A9B1C997E
89238E380277E3D28389DF78E38D04D18DB3AE58663319CA491A07341768649D
79E6991B366CE021945C31563E3379865355B9B7847BCCCA52E9392ED3E11C05
9146D69D903BBC9B094597F13B6D762471CED4ACB9743D694C48283ACB5199E9
1042532274873E057ED1CBD6900122C9ACC523FA8606C197F1E7BFFFFBBF633D
F11574C665CB9631B712D63DC533AD1C2244615258402C0EA4202B2A98E546B3
89F5048F3DF698CAB5450C8CB5812C8310BA115802E11A4EDEC75465B900941F
2AB740DFFFFEF7633C96019062BE606F412659399627A5B2243552CFB072546A
EC080E1B1E87B99B05BD925D4A3163D1E78E9DF532CF6C2677FDAC1AD92F15A9
EA9A99CD7B3BA316C9E2909346BEC0D375D659677DED6B5F63550D5360E53E58
64903A842E03BCE6E34CAF6B6A74B3E00BBA05E64BAC3DEA80DAB6EBA8BE9181
ADA33B54C15661F4E98F5FF19D3BBEBAF5D967D7557A669BB335AFDC0A5BA14E
C07740E33BDAF582EF062A6D45B157AC4C4127C3F6957B9BDD261470DE905E0E
EABC245D0C180470E8A187FEE4273F21F488D4396A375746A28E9A330B063DC7
0AE321CB7FD94B5EBADF61077FE5AE6F75A2102A6E2308870A8501AF5449ED72
EAA820B2E2040ADBA493EE6ECC345434A952F0B6354B8777EE1AD388E8E5B2EA
8447ACDD7FE5D0926D9B9FAB77DBCD24DC529FE975340C101666C4B2AB96075B
B847156D9536970C3F3CFAFC6CB13099841A9A65FB68090A7214AD58B91AB4D1
6AB774A7FA2CDF699FBB694A0232779210FF24115A7903E7D5AB57838C7101F6
1AD6124F2E0F17FB64085B64D6BF84A0F6DE537941E53AF5D4536FB8E1065020
8CE63FFEF18F2296246ECAC8A5E0DC48F617EFC9012FA4B2305A09FA01CB2533
E4BCC85DA92491F5812D1C7BECB15FF9CA57A870D32A12740D933D0A683F2B96
A966595292202B4BA90002828D8F5152415646B23F2FC3497EDFFBDE07EECC6A
5B2A44983363D6CF3CF3CC6016FDA359200E25137A5BD8347DF4D21DD3378269
5C0569EEC191E4F0357380D8920C2A2C9E82D4CE9A0B9E77DE79581D8E646464
045AA778E528C029A541259AF2323A58BB762D0EFC3CDE0492D0161FAC8894AC
4D490B0B56B4E171592554A2717282B93CAD6EBBC3C14C4D4E14334707989AE6
CBD35395B2F6FE4FCECE61AC3EF1C413AC692290355D37100FF8EA820B2EE019
262950E390D6407CB1A0096B45BD80AE3086B668D8514DE0DEDF7DF7DDC71F7F
3CCD23490323B3660731EC1D4682AF60363EFAE8A394BB7434615474AA4A8121
56553BBBB23269B6AA67761323F364A6A26A48408F344A4B881A99C08D98AAD3
41071CF8FCF3CFC308B0ADB9C43E3DE024ABCBCBE1CA2909E6A54E9A92C05499
E7BD4C3C1F0A54CB68414E97A3DC90AE5833E066B61690D4149A141812568999
0BF22CC9CBB20AA534EAAA3429169C7ED72B073144C4C1BDC3CD99B161BF36D1
AD8F146A9997BCEB651E2430CF4DCD99724F6DB2D5768B95896E67DC8E43B0F0
E65C469FD9A74C1A34D959A768E26D1076FE539FFAD487CE3E2B3B2C1644EBFE
AB75A71ACC6159B9089BA0D3ACDBFA2CECFFFB2D9BFA7B6BB3B3F573CF3DEBC9
3FFCE9D15FFE266EB7D6F78E2CABF675A667740B2BCB994DBBB34ADB1A76B9B4
6B667649AD1724B8796AA25628C641868FADAC7626C9FB07FAECE6B4D555B049
D7F50CF63AFEECD4A4A7CF90FD846ACDDACE68C1AA4312B5BB8E65F98E0BA1BF
FFFE0762D8382669E6230AE339BCC8791175D97126E993A550EB676107B51951
D788807BC8218780AAD9269DC994924249910FE2375B558B6B649F9A84E44FD2
E0237484440BE8DB21F828FDFB8CC649899960252D2409F8686A634C58E22132
1B2C923F402CD1A122AE14E1D8A26F092AA894EF5041B14C1C1ED16B70D1E187
1F8EC54A73A0667A75549EB8294D83A1EF808132010E97B129B9CAC38F8C59B3
6E88321623C3D9D8BC793367888951C1C49F279E78E25D77DD4511CA800FAF91
A9529F5279334B668592DCCD947F11068CB8E20DF93BABD22978481F127ED993
E32B91460433C905B8CACE7C467FCA2AF8366B9BC155FFF66FFF967C4D43F56D
DBAA9D4599EFCFB51DB0B05221C3AF6E367A6A3DB3F52C43D471E97AAA37A0EB
CDF955BEFFFDEF536DC46831544EF98E3BEEC08AFDF4A73F15738D0427815F66
E9B08BC54B5EF292DFFEF6B72435B072C83C56E7E14489B1FCA217BD08FBC52E
2B34ADC882B97482BF64368D619A00F31370433C0E37840670E185170ABE2E37
FA7BDFFBDE9BDFFC669543B4F3866623C6BD5F9EE730AF140C8B229F3283B995
788301433F60A88381A2346F2941F385BB4F0E681EA7FFB644CBFC5332D33878
E2FF10D051F28C05D05856461CAA5453D8078AEE78169A50C7AC662F7C2B9012
7A3BD2C4CFD2B9FC381D51EA8081A1F6E4789A95717996D55BABED9E9DC59FAB
8787FF3836B65FB562379A81ED6C4EE2507358BBAE92AD4AD53DDDB5715EC611
DD77F2A1F804C46DD5D3D7DBCD0AD3C52628D8969FA4872D59EE85C9F8E478A9
BF6FEBF4784537BB9E05B7AE958AC5D42E4669AF722A61524954CD2F05BED768
7722CF9E8DC299B01BBACE78D88EB32EC220FB62B144D7710B9A878A5CC7AAA5
49214C7B53F7A0A5AB2AB6373A3ADA0ABA41126D52EDB4521B8D43F0C87AA3D1
57AD75A3D02AD8A582660BFA48528148E2745F4512A6978F1B2730F226FB366B
4E55667142C1A5A407F562C560804AD88C6C4A8003C8791721A797BDEC65BFF9
CD6FACBC539EF4471320E7796D4AA5448E063A9E8ED558E88C502C41D9C26A40
23BCE9A69B28D294815B4E8D99EC4B0AA4A5124B19F8A3E99E45C8229CC0BA2D
CBA89C32D53731284CD816C29B48D34786C518834DF2A6C4900DE46258143167
2EBAE8223035BC977D12FF97CA9D186CACCC9234C96C39E59453A0DBF2CC6339
74364510DC72CB2D1FFAD087C421208A9B4C8162405C46AC6980A6FC777FF777
3FFCE10FA5525C744F8AEE7BEEB9E7A4934EC257928F2FE57FD98BE9B3366C55
BD62764C6EAB0C686BDBE81FED6551040DFC5B2AC3C8B5FD029565BC2632A6E3
6721BE508B482DD58E38E2884B2EB98454487E072DE0B4D34EC3CDF11432DC2B
AFBC12D440B6429F3E970E5F610A7C2395AB2CA0C36574AF898754B2ADAD3C05
93AF78CF7E612CE9A0CB1E2B4F3714AEC79661606076827C69E6AE606D25B161
2EF573CF1C5CA8A2D8CC8C52A9C7C17822EDCD3D9ABFBAF1C61BCF3FFF7C81C7
32951A897E8B12A37213DEC497DDDB53344F12A4796F716676F35428C3889674
9479E529666E923900931D0BEA80E9FB12E94573B6A2D472BFE474DB07567B26
1AB32B0A5E1C859D440DF756A04F2559D7AD94D9A8B6550B52A7B7E7A999D99A
6315622B52CE64D979AAD509B3430432605D0B551FDAD094A604E816C8FBC30E
3BECF1271ECFC80F82C82B17BCE6CCACC67A8EE295E55A214A678206A631A97D
3238983DA393B3158D27A58122FA21A252AB57B9037EB51D74972C59BA73D7A8
57286D0AC63EF7D95B3FFEB9CF6EDCBA39F49D5DED399190E8E264B5B40CE526
18046D58854AAA96FA7D45D79BEEC0A08BC6938653284D45E134CC13E5F4F7F6
4FCFCECCA6A153F6227D8FEC4493D1ABF931FFBD2581CAC303EC53240908140F
38776F7FFBDB7FFEF39F3FFDF4D3FC4AD2DF5FF18A57FCEA57BF4A33DC5C7EC2
1A0596A14816C942DA0CDDC24C522224119324A9F893F308D36346137323193A
C268A1EC0B7F9FF7BAE28A2B3EFBD9CF625476DEEF1D463F243DD1C07842A557
2BE959143BB90995457E452287A2FFD8638FD1C6A5053C873B24A0C192FC97EE
8999278E486AE2D2554A1A1570F22677304305CC791758698111A5AACE30BDF8
79CC7C5E4A0B6C092E906456EAEF82C9271C4D0E3F0B4CE87A6288822BC2D1E2
57C4EA115E0FAB0AC378EAA9A73006E6C92C5BB68CE00D52BE0B11AB375265F9
85DA569DABC56339A2A8C6E4178C0DE8FC30D7657E7AEA67D202E2874950EDF6
CA356BB63DFF3C289C0AE90B5FF8C28F7EF4A3E2EBC4C5E0FB58F63FFCE10FE2
BE90380F816508D4A3D1833333968B23A94152E26BE54D50E99D60E45C2A7184
C75979970C4620409DE79D771EC430E3C32AC7E1C0E38861A28CEC8579BD79D5
9E0E196E10150E58294CD703A1552A251869940410B41C00CD44A8CF843717AD
4A421AA90100257E21D28CB8EF4D2416D38FBFB72420BBFCE0073F78DB6DB7D1
BE8CB33E910C6B3151427A7D98A066F342E252C328DD89B9DA74D9310224BDC6
B4BFC276F61B5A32BD7BC7D1BD4B3A33A3455B75A0A117D5D2C8E984712FB874
B65CBBF1DB825B0F22DF76EB05D5503198F55052EC26DD1D2AC5C6FC313F9B3C
232445A92D905D2031CC6522F664F096692A3681AE068893953DFD154B671F75
3CABE3AAF146ABE865253ED07ABA613155C39E3B903AB5D8AA396EB9580A1B9D
BE5275BA5D770AD5B124184D3A9389B6E940F41371D84892652B97762726BC66
D86FAB925518F02B4EABE36BF15048CB7E5072B7CF4CB4A36EADA77FE7ECB46B
610D2CBB58D8DA9E76FBCA9DE9D65CC20571098D04F77D4A02BA6AB1F85028A1
A47FF7BBDF15679DB41E03E5BFE73DEFB9F5D65BA9804A5D2A0102085BA23217
08E8E1861B6E108701211F16D1D9C994697B096E1B85CDAB5EF5AA071E78800C
D02C939698047D248B782F2511D9F49A9A3DEC4E3CF14468B11C21072CF12AF1
CDA83CDC8B7F314222BF51079D3B3566470B93C425819AE9AE1C0A0B2BE60061
3286CEC8E1BCC4C1C400F4971A0739784CC630D53765A41B2E247B252A689675
70C2181515378665E8C7A0B794C28904419F38383E4685AD8261C1F47C95D70C
63D161B89C7CF2C9A2C7411E60BE26E2AB084EBE37CB7C54DED998FE773C88EC
F2F5AF7F3D341189BECA26513BA0D22132E9AEBBEEE2B7F8EDDD77DF0D2EFCF8
E38FD396A4778211027AE1A16EE0E9A03033DF696F96A78CE837018524CF817E
55DC641E9C3DBD46748E49031FD1684C170D0B3ED9C98E631072174639CFFB4F
6F092B7458564D158916213B32B2191CE53DDD6E18092E83CCC653244BD89CA3
655426327A814708EA09FD99A2C1984B849F808021ADD9CA58DC59A64662FAA0
A094610CD27543528C04898B0E226AE86EAD58DF3DE5A70EEE52ECED0B1CC872
AB3D35F18A48F9E07BB6E3C52144166E54B59C8A8F1B45B16365B5B8DA74AA28
ABD72DE2E76D2B69479D482515D72AB9C5304AC6A14AABE4198CBFDABBB13103
0D62DD81876E7AEA295F7777A8CC046DD69FC37A864AC1800AC5BC19DB703DE2
2BA44B633B4E93754B574E4F4D411F9C0CDBAEE736C26868D5F26D5B775C7EC9
45575F79D588E3C26C396868E58EF16D6B545FD9F3C19B1D3A125C68469017C1
A46A45AEBB338ADA96B2CA5614A67694A584A66AE5506F6BBA51747CA8531694
C272F96D27FDFDE76EFB6290442D1576951DBB76D7B61A3A7CA2A594A4DB936F
CCAB9B93DEBFD4AC69EC62978F3DF6D8EF7CE73BCC6761112B49149B020B1B4B
A172843E261F523192F43072734960A379214C9F2424559C144E0BF1AB798AB9
CA429B74AA0B4891328A9618EA23131356CC534F77024FC7FBDFFF7EB0298A1F
8C44324ACF3CF34C0839C17C140B95A4CBC5C47C851550F92355C0FEB67862CD
0C3CB905411D56AF5E4DD8679CC617BDE845BFFCE52F390122C7419662298F3A
EAA8DFFDEE771A77255769892520485ECC0E12E451A6E898C9E6223F16C9D612
03903C9DD6C6BCD6E4CA805665522053AFC4DD6FE568246C3A4F7E47BF2AB79F
EC065F11BC4919FA32EF60661F838B7DF18B5FFCFBBFFF7B2270903AA5FE882F
E2669B59342A33BF043684F03BE29AFFC637BE816140C8C362A5735919A5DDD2
C8410C3DB38C4BFE95B525B1324C444D44CA4CE679F0C54F22A8EE5275A1320F
9ED00646256752E237EC5277E49147327D82D449AF05614FE8A3102500C715EB
663A0921D1F1134A0833E141E243A24F584627B27992402C45F310D2BC30D1D9
E851A41816B39D8B402D473214B8EFE235C614DEFBDEF7DE74D34DF40EABDCB5
C88C7552B2A98279E5C2AD9FBBF9C3E77D582382694CA46ED9B3933079A5B274
3D97AD7D8E6E9A40552959B60F561084CA7512CBEEC4E035CA73DC02F621B582
54B513ED31A93856C9F192D89E8E8386360BAC46B1B011ECA3ECBFF8A5AF78F2
4F8F61AD66EBD3CB972DD7BDE99B4D661389DF43D66A4E0ABABA261A0F5AED15
61764CB71A2565B554BA6C7864DBD8EE33CF3DEBAAEB6F58B664B83E3D8D61A4
9D4EAFEB75A3F0875FFDE6C51F38B7E87AD75F7DF519A7BFB76AF903FDBDDB26
B7F47ABDCDA855ECEFE93AF678AB11D8A95D2AFDDD716FFCC1F7EF9D9D98C2F3
D62C5BBA65E7AE91DEC146BB5D0F3A071E78F0EF366E746C37716DF03FC8800E
3B10BB4E4F798E51520383C5FCE8A38F827A311DC1A82751F1D051C157B9DF83
D61BF13C78A2091F8DCDD2750F39841C7F4B6D989625CE3515383B435326D090
60D34A892FD69300FB8B4492F908F1C2CBC5E2E190B68CA4AEF7BDEF7DFFFAAF
FF2A37A420A14EA68C923A1AACA283E28D6863FCAD7482E1D921019309088829
34426833727C0E39E4104BA0B884298B0A4C712428928CFD527FE4F6C8684472
EE338BCE2CF4852904E58B1D0BCC879A518A7DAEAC19BAA079253259D2B0AC1C
B38C250BF4D2323CC295227F11B64B8E40E12CFE7DB1DFCDC69694D5CCED51B9
4B5DDCE50C9FC8E9622906253CEE49E81E91FCE25590900EED44366DC66E7DF6
B39FC50510EFCF3CF38C242C127C54F45C0199C053703630069EF3BD6D020A4B
95A7545F7AE9A53086F820DE5CF829DFD0E0E3F819121725C5F48D9046A9EF53
78883FD4AC1B97B098249E72EFE87DC2BE60112ECD5E941034A83141DC8D8964
C2C731123AEE247BCD94796602347F75FDF5D76FD8B0814C90C8A66A4F67919D
BF30482E883425557938CE8C3D50846B8F6AF615010F24539BE955CAA8272071
AE58B274E7E828D46DFCF0E6CF7EE69C0F7CF0D0C1BEFAC4F47A0802ED1183BE
9CD849CC26BD6ED633C077ED822E55D7141D5B2AB09230F3DA76940E1D941DAB
AC1C954036A481638FC541B3E86C09E219470DAD5CFDDC961D7EADA2F1F8E284
9A9CF87525866CAE9BD80407F68F4C8E8D1DB4DFFA99A9E91DD36396B29B0A46
E78ADD63E3CD4EB75A29755ABA120D4B30DC536BB75A034EB1D96DC2105E5F1D
71DAC175575E79D5159F48A2B05274661BF5A9549B046EB132D6691CFE92A31F
FAED2307AFDFFFB96737CDA4EAC0652B1FDFB96D69DFE0AEE909CB761BD0AE40
48B61524693B0AA20CE26E5EAE8E44BF30546C289147597E2F453FE6957CCFF8
307689E5EC250000FFFF49444154E18A2BAEB8EAAAABF01369788E3DC5464BA5
BD34C79DEB8491C778F19E6BC80E71D4C9F889D4242D124966B2D6BCDA75868E
E9D510FC3406C32EBAE8A2CF7CE63352A4468552F806450B4D5E713D61B29C3B
59313E9752F679AD0B2830984A2ED58EAC57A5566D516E982E63DE82E8119015
4F3EF9A469A691A420E5B02E66337795376B26B6A87812E8A561C7024CF8D5AF
7EF5D34F3FFDECB3CFEE33C96F6F3FA0BC843878EA98CB215695C83D411DE0AF
049B850E32DE8171125A85B2825C77821A0A3BE314A8D262FAF4F3B02D06AE39
F4D0439F78E20995433BD10F4BC927880BA6277D1EC32273A14542683C53E725
9D095A322E20B612C5153D362AC35A989732314F128869297D4DCDA6438CFA50
8F90E51589CBF26C1E15FC09298E8DA3D383B29C2441E6C8827E699F24BD2224
A391A04C34AE5566A872F1A5E8814506323C7A8DA4BF317D3E6CDB39AFFB8D32
80C39826C8B512B6CE2431B1C6CC762E928E25D03118305806E490148E89E420
B1B1B24FEC1B91799292CB5340576430D568A9B86FC9E0CCC4582552EB5CAB27
4A97FA3099B37BEA163DA9F6C4E3AF34D6A8B58E2A5A76057497DA71AA9A69D4
48431C270CBD9BC5608BB6AAA47641A307D9184D3768B77C67DCB59E6B46D005
74CF30B015951CB86215F820E996B441DC02A3A57B86D1E2D95CC325850A74FC
89E9A9C172ADD1D2CDE9CBD5F244A355F1DC7618154B05AC026C1ADD81A3AF67
627C661016646A799D6075FFA0DFECAAA0E3ABB4ACDCB5BD03DB67B6FFF50B5F
F38217BCE0CEBBBFB3A9BE3BA99476B71A13A95AD5DB57EEE97D72EBF3955ACF
CEFA6CB1E8CF76BA56991A4992E149D8CACED4B524EEC98ACCA5FECBB4690482
9BC85AA4405152258785F911D4974567259991E9E1CEA79E7AEA9D77DE490729
96E5A0830EC289C642317829F622F3D6E8FF249DE071D0C916EF3167E5F065F4
4813304E42B07C22E19CA147620CFBEFBF3FEE29AD8CC9B5CC3C0E66B8C26421
9403295992FDB0D72CF3320B1E859F33EF0EFC0DF767DA2116FD924B2E811236
07686FFA7365045470E6759464AD00E31E736D6EF226E3E4C8C28B05FAC6B4D0
CDB4161192FF73492036814C4C2481098363BE046158CAACE959120DC236A05C
793D5E8C48531D662F4C61F1471D7514EC32E6C2B34A8B8C92811681D061D893
8C8FDBC6FCE27D962C72C360FCE2DC0A040A87C4B0B6B06C5A3394313C213CD2
04663095596504094C34568CF9F4D34F07E98328B1FD98297F254524E4A7D44A
ECBC7B1F5703F635F823A438C50323E45C49F6AAA3348591CE88519A37D13633
B51855335B8331A949F08E703DEE8687626CA2DA706D993C86AF04B7759F9240
28EDCC33CFBCEFBEFB9E7BEE3909A2A83DB16BA410611E3E15D6FF98638EB9FF
FEFBE7D124D747C00D7512CEE38FAB3C9C48DB941D5E4593D09ED24475310527
54913AB2B7B6265256BD3E9075B54B991964D99E5E3A6A63495AB0FCC42AA52E
2501C4C0B4D28D5CBC2C375F9725DBAA8A0B54EAE3ECFAEE40984CA978AA608F
86F1746A8F820356AAA3ADA6AE54C83C96D75C730D73D258692F5EAF7992E0AA
8BFFE5B2CB2FFFDBD7FCE5430FFDBC542ACFB49B56A9D08DA33484366377C324
B35FEC6215B6DDECD235ABC7B6EE483A51D952B5D41E700A438552218A2B6EA1
DFD27D8FD356A7E4149A71D7EAA93C3D3BDA3F32DC4E9D4D63BB34A444A93CDE
C6F8B0CE7DBB26A7BD8AD627740646AA74DAB535270952C3C1C00D65BA07F708
347FEDB5D79E76DA6938B0243CC96789F366EE175C70C1E73EF739C982A1424D
26804DA7E262E7A0938CC3895F45407B44833EE79C733EFFF9CFE327A79C72CA
BDF7DE0BDB426215FBE4577CCABC3801484597164D4DE1E920CB638F3DF65BDF
FA16CEE03BDEF18E1FFCE00766ED98E09A905748CB452638D02B40E6809113A4
4084A5D9C85A14149A352CFE95FA3B06B420FFB44B4378A24077C9B8712F8116
50B93FDA74CA8BBD6926E3CFABE2210FB532446F412195EA06F53FF60E99F794
2662DC42FECB642F2AFE8CA560E1D2AC9A17B3C0D1C57BCC9C5D3D059F521896
1090E903A15E6C760AE48BF797D45DF62AA04A824FC87A58912B7603A9CACA61
9D446ED36CC21DBEFAD5AFBEE73DEF317DDF5C25620DE1CE92BDC00003AB1056
AF5E8D8DFCD5AF7E25AAC4BC153307BF76ED5A6C396E888B5FFBDAD76ECD5E42
76A478AE065755573C64CA35975A92D548E55C73098C4B05BF044E71CD4B5FFA
D2871F7E587A8EAA2CDE4093564AF94C5187B1C1903FFBECB3550E30276DCEA0
6362D7FEF33FFF530A32E7614CAABCF3387E22B05C98FECB5EF6B24D9B3649DC
4FA8942FFA06193C14331C328FA11DA167F1E69136C8FDA5904265851A189B9D
77CE11B1B7ACDCEF2DEDDBB2F379A79D1CEE15D68671AF8A0B19E45CF6DF9FB3
AAE6E81F9C3E8ADDD876754B19ABA1C24656C46B65EEFBAE76A15BD55855555A
CCAA3196ABC264D899B6AC595B359DC2B865EFB2AD6DEDF63FFDD33B1E7CF041
EC97B80294119C547B7987064A95925F1C1F9FC0773558D251500FA272AD08E9
D469613D97EDDCBED3765CBF526A3471FC753144B7DD29BA4E1AC5CB6B3DC524
2DA6362479187746EC728FEBD73227ED78521F195C323633F54FA79F71CD4D1B
EC5279A2D39A4D55A5A73C39DB2A574ACDA00D1903119046691464158E4A9F94
6A4F8D7445751E2401460C0A04E590DF094484E423504766BA173EC79164C516
79BAF45737D585A38F3EFA91471EA182C502A379D59A698E5C2426382FA60B5A
328FF7C9AF6870339305EFA147FED55FFDD5D5575F2D0C9326056D5F56A57184
82734CDA60CC75EFCA5CBCA1485339C40B380F0EB848502AACF4007319397D58
2138983FFEF18FC934C8E4FF9C732D78AD64556C000961F595AF7C85D6346D61
E2C5B3D40DFFD2C34E66413B8576193550F19388678651FB34C79350FFE388F1
3C5B41D204B94FE2A99897DECE79821DFFFEF7BFC7F2D1A1CF84192657C93911
3F204984EB2EF87F5C1C7A93B97C521E421070E165E4BCD05988966A465304E1
32FD3308CFDCCA83BCF038E8E9589CCB2EBB0CE4422425B3F1B4CA9385B9C8B4
DBF0158CCAA79E7A4A2A03E6D9045478992797E695EE2C3DC327E211125B52E5
490BDC566650D04CE48ACDF3358BE0A413765E5C01E2F0E69B6F16F72063B9E2
8711CF1EC52A4C57AC182D680A3F9219DE6335B0232C5291D68CD27F4AE5517D
1A1C0CF9F2948ABB96A3322358F3288A0966B6016228A5D76216E01AE60BD262
66348F56C5C73EF6B1EBAFBF9E75366440CC0F713AD164D8548E5ADD3B30343E
BD5AA5BD1A9339EDD17EA11C527B0EC39A940D861882406CD7892DBB13859D54
7B4E62E5CCAAB8A9C763D552AB02951F1BE7A8C1B45C4F82868A669402831C57
6A9B520DBF1077031E6D8C017B2D6540F3D43589185B902E65DF4954ABA3FDEC
7ED96FC5A1532C741ABA00ADE879769016DCCCAD1776D7AED97FF3F3CFC0046A
761AB5DE5ABB51C7F88A96F22CB57C6018B7DC39BEBB0F9AC7C88A99898934D1
FBBBBDD3BC7EC30DFF74CE592BD7AC7CE2F96D6EC9ED74234EDA722DCF713349
A0FB1CDB5951719C2195C84136B56F1C13DD143363D9ACED17B214BF9C328297
2AEF14468141264063978D5499A629CE1CDA0D64F7F857B22B19FF33938617E1
57B462C57D4D258915A3543AA979280311525CA3BA4075EB56A1400E4C4AD5A8
1891A3DA79A3785C005375FDFAF50F3DF410FDFEF2733C8BD0C56CE7C03A06EA
58742551A5DB238B945A8F95433C62A0445FE10F88B36A16374BCC8D87567CC4
5C4D49BAA0334B0C257C28FD58FEE759A4F69E8DC3E4B70C6C0A321207C96D20
CE9D58365028DEFAD6B7DE7DF7DDB8926A057828989724B9D2ABC80089E40E9A
AA84F44C2641B0FC44E5A95064DC2411618882DD2DB9BD12EB56595E0AD3E7C5
C117E7EDE198CB44F43791521C06B780A14EBAAA923D3138CDF5E44E51F2D1A7
471471A9D6E6058CB349CDA0B00C4171E1411263D94CEFA17B8AF3E2DD447449
F921A7607A3F99CE210C940F12C290343E395771DE1543653106668B27790B04
26754803327A8A2529801E2D19B0A44A53345A19E6AE3C826E5399A9990421E5
A366362AAD5E9A0B221779BCB57C0AC39E55CBC727775F76FA871EB8EEA6B5CA
8955078AFF1295237D257343B1B35215F0B1200AD99139B534F25A104796D2CD
1DA7128DEC8F1F55955549B424702D35E0D7EA51B791846D5BB52C7757923E1D
471D4FF5963560D9BCDD14BF9CDA2B8BD4B5DD38887A8A252B558D6EDB2F9766
3B6DBFA7A2BB2DD5DBA542410736D2C4514ED1293562DDD8245129B6B319B621
018A50151CBBDDEC622DD2440D56CAC33D3D3B77EE3A686878F7F8D852BFDAB0
AD994EB3EDDA936104522B55714EDB10DAB695856D223D2FC803CC0F8230C984
9F14C4902333D183AE126E9FB04E12032981F32275E1E0D31FC21C53E6345E78
E185575E79A5E4777135A41FA489CDC04D14709434EF4A22DC729188B132D21D
C5409C2786E5B432AB07548701E398C08AFDC52F7E314F7253B7A03A2E75E31C
0F9DDE1FF8C0076EBFFD7666BB304A4709B16EDD3A5800DFFCE63779F4A4F022
CD1119E64E0415796A4F9C214C8C134E3801AB7CD34D3761A1253D4BF8915092
44B479F04464496C532A3598C1CA33264EDE390016CBD2C0FDE3E392E9B54F09
A18CE47DE159E29EA24227A61C452553B52485860113E8EF4C9B31755B6ACD26
909C689A8BA0C51E7FFCF1902BE402ACF3A480614A005B89420179FAE9A71931
A6A5262077A6BC945C058A07137969C58A15784F3811D3D6D9FBC51C38E27FE0
6E340238F1ABAEBAEAD65B6F85D81B1919C16E8268BEF39DEF10A3586C41E9D2
B3902416EECF35613C033B2BE57E54DE8589EFB3B801363ECB38B8477606D644
355F4A464CA0FFBCFF572AD4C25C11D0275686AE4BCA18CA51264751D4E126E7
9F7F3E8C5AB61B224F5159058038C1CCFC5409E353E13243DFF82133B8C518E7
237814C961994945B98B37B0ED30186CEF8A552395ADBB5642E9EB2959B36DBC
894AAEDF89F92CCBB175FB972809B28A623F55A58207BDB813E8441A5BD9896D
7593B869A9D8D65682C62082C98E63A5EC1EC70DE2A056EA6BA6C9F6CE2CAEF7
3DF719DBFB7DD0D688ADDDAEB895654995BDEFFDAD785E076684BE83D7C19A38
965BF2BBAD8E2AF92A8C5510AD1E5E3A3136FA994F5D7BEDD5578FCF8CBB8552
2368F995EAD17FF1B2877EF90BBD3BAD96572C25961DB73B2A8E7B4B25309BA0
D359D63F38A3D1B3EDD8D66D2967C3404B0E9C8846AB50F2834EE828ABB752ED
B4B40FA71376532D135CB16994E1598D33B87239A7F413F2EC53DE8B862BAD02
4C15D374804BE63E9628CD00690E38E080E38E3B6EC3860DFB5C1FD1CA4D5077
53EAD0CEE6D8246CCB236FD6C9A70BD71F304BD3CA0BB0E4260B9D477AB971FF
BFF88BBFF8D9CF7E663668D9FBC50A3895638352B84A85AF9625922B2958FF74
2AF1880AE8B9CA1D2F8C91D29E9A57A74AB2A3764C0B1DCC824690D482E175EA
A9A7DE71C71D18349B599A4B83A564F04DEDE535E24BBAF49141D0CEC224C1DD
44AF274D98DE765C20A8322A77409338280231F7B7BCE52D8F3FFEF8A64D9BE6
958F99780CE60BC3904423C15295465D66C72E321D6A8BF44BB2D726374632B5
F0210749F074D6B5E2579FFAD4A7CE3DF75C69FCBB08715054D0716FE5ED5895
9189CC91902E4F3EF9E4471F7D74E3C68DB27DDC59137C69DECDE53DCE0C268E
457EEF7BDFFBD5AF7E950BAE72D49079BAD2DE125D946E920AFD8DCA086ED363
6E76AD91AA0853E3C67D087A4AF3942781F7610E09C1F84E3FFDF47BEEB987F5
684284266AD8DE6792BE29301D6C0AF3FC4E3AE9A4FBEEBB8FCC948E53A62152
01126EC5E3C091D35D562A55DA9DE66B6A03238DCE8EA475786FA567B61B541C
AB35571A09D6DC8D936614763349E041126408FE31FB2F797E90C65D580659CB
DFD05251A2AB826119F5284B4790FC42B715769415969D6ED41D0F92E794DA59
AB36EB0D656455FE590F5D401238495A2E15D338C93AC364C50EC5027EF6A173
CEBDF5F3373726A7A1A4AC1C5ED6ED74A6EA533DE59EE9D6ACE5B8856AB9D169
A7518833D66D4009287DFCE39FFCC879E7C3B4AE42116C367BB0655D6D2874F5
645DBF56A977DBB6E746B07DDADD6AB5A2B17A3B5D0D469D2625BFD4EAB65365
2556CA088AD86D5492A859B3E6435A6689DD09AE85B3B37DFB766E9FD4EB9820
3A5279CEDE96E47292116052C8DEF42F394B64D352E24EAEB86AD52AE87C5074
AEBEFA6AE83A575C710559B98825F653312B9FE6DD9F18CFA47C9AE94C885AE8
7AE9CD8917B44F06C616F1AE1F7CF0C1FFF55FFF254E0551A3E70EAC79B5E0E4
F14FC9FF33D9AB38E6C42AA14F40464C0F009450A863660621C41771294C2F8A
200EE14F3017C987517B4592C51F459441A5E6036F497302959B14F488C9D24B
0E3BCBC7D49EE55A1215A478E3824AEAE1DE2FAAF312DF274639B707DBC9347F
C661E888A40087320E8D95BD19F01586349BBD546E7249832026C9B1580FB405
93D6CA7B71EC733C621D9BC8EC7C0F8E49A9C6B02D338BF162F857CA004D2369
9F94C4059478C0273FF9C9F3CE3B4FE5A826AC97217C1E3BD898DE2AB98954CF
3379899D375875417AC0AD98F84BE625C0FA324D113CA6F92C879CEE41122763
2AB83F6D4DD32D66EEFEBC170533B545E6DB5D79E595679D7516252587444552
1A0AF2567BD7D964DF168B6567ED74EB00E5C795246D06CBC1D15CE52A46239D
1492208D5B3A1EA0911FDC58151CABA06C27D56565BEEB0571D40E3AB6C69AD3
603E18B1675B454B9594E5A729CCC04E1D5F5B4D379EEC4224A8E1C38FDCEF4D
7FF7CD6FDCB965CB160CE00D6F78C3830F3EA8728C3601F0D95B12B88E0D49A0
D3A6C3204CD5E0D2A177BCF39DB7DE7A7B1C4605982350D253C821A893BA3F04
863134323C3E3E86F5EAE9EF9B1D1B1F1A59323E3AEA174A3DD50A8C8062C12F
7AEE4C7D76B0AF77767AC6AB55A7EB8D8CE366FF25500806FFFAAF5EF77F7EF8
639D916C3B0CF66AC5D1B63ADDACD99F11AB97F67C071D741053B6C4713D07B5
6D38F15812C41C076688880FC4CEF1A9A4253DCF829517D52E14016636B919B0
9DAB1CCC7B6AA93D3B9A90CCA81C08CB5AE47C61CCAC1012BD5E52A517E23F2A
0B1A7330F464301CB8CFEB1924C048988F0E2D96A8CC02E16331874F65263307
8ADF9009A679CF00963549C986F927A39DD81548CB1B6EB80107861C8D3D3D18
2A64C9AE64C55095A662859F930FBEF9CD6F86447DF2C92717CA2E55465D8660
9CD1994EFFB5D99747A2347C43E7959915C05C263BC35353B9A39F6E7D3C8B24
C29B2F942F4C1F25934F7813699929E8F0EC3120FC4292A3E7D971E4B014B1E7
9C730EF88EA8A54C1F7ADBDBDE76EFBDF732177321CAA01D2AC103957BC399B5
26711413705BED8922B588E9CAF94A7E2443E5C4BC5346FB4C08861B6FBC91C3
1655749FE364E89B415DD3AC649D335D4C9C85A0B649E805CFE54F58844193CE
CA31E8050186A7C24C7513FF3E37458C12B567AA2825016D0E3A33257D401C92
D0F8AEB9E61A46F579CE6D037C90273307D2889BADFA2B8AB555613A1E35D656
FC65B1DB2EAAD9266BFA7437E12EB4A538D6180BD08470135BF9DA38B04AB6EB
7B052B6B6A0633B69B262C2980C60D7DC14D63274A6732ECA0D82EC4252708BB
1341B251A9CDC682CB21E2BA75C37D733A4802473F3CCE76A11824B15BF497AD
58BE69E346B7E0479DEEB2254B75B8BE56D54A3C96D4736A7D7DF5F109AF540A
5BED41D86763BA861C72B25AAE42A56F34B32C09DB2995FC46B3155B598823A3
4FE895B33333D0FA615C6E7EE6D93889FD821F0641C12B74C2392613EFE94F97
5E92F804FC84FE6ABABC79D9A1871E0AC2667E8A589926FDA85CD325F1BCE52D
6FF9F5AF7F8DFB1085EC7FE2BD114400EAF892D52ADD7C6191E086140C14068C
3B32886DE5E5A5FBBC3F68ECC52F7EF16F7FFB5B501A942DE82E62BEEFF37A6A
3CD2EDD10C25EEF37ABAD12EB9E4929B6FBE99C39628CB5C0C8F4D5124B3425C
D532681E2D3AAFF178B083BD0BCDB004BCBB60CFD16EA0EA77CA29A7B0C30993
82A129732FE97AE34996A0E5429280BC40AA2519DB91703FE521BE220204519A
659CB8F89FFFF99F31064A0556F66205A905AF5BB7EEA8A38EFAD9CF7E46E70C
83A884CA587C65C53AE320A9E0E31333EC693A5BA4908A106C54C6613C417C8A
B3424C543E9D2913871F7E38CCBA79DAF1BC9794C088C52A9C8EF60A43DF6407
B45448A0426A023EBAD07C69BD12099505F73C87E2FA63087D6F5D7B5E62B164
E24B353231F49940655609881F73F9F2E5201B961490D2C489A4F2745B7A3F05
C409D3211E00941226DBC5797736DE4452FE6582E288A0D9CAEA1BBC612E87CA
C18D313CB0B08D1B3712444B76440245565E259B9DB1A95A6F71CD4C6B59A6D4
0F2A7580EB4FA6DDC4C1EE2451922696EEE4DE4EE36E565E0BCD1662002A7F21
D1409E3E840174750BEA7FAC333453CDAA750EB19D662C2D69E992340D52DDD0
172BBF58DA64798FC601B809D40B5C79DA69A7DD79E79DA0A2B98D5E304EE06B
4D5C6948A00832066B18472A4D56AE5E33363A0AB34063EB820F263AB6EBFABA
9F597B6ABAD6D70F21816F6D656DD8B0E1E28B2FEE349A4114F4F6F65D7AE9A5
1FBEF042C77303DD4E225676D23F38D469B5DACDEC08C3C8C8A48E673B612609
9868C0D67EF6C292008C0C8635298D5E911D3B76C88913FC2BAA44D2C79B6A10
6D02323AB6A691E9835A18555EC43B64EF89260D6DE0539FFA14390CEFCC6A18
E8DA52C6AC8C2C235A360BD91C244B0800C98716625B683C78D6C9279FFCA52F
7D09D7103413375FA8BE817E7E8E5CCE387574EABB9614C733D822DE6D6AB8B4
82E9120557C2652CDC973254395D98E421871C42CC199E9CF5EBD763ADE991E0
AC24D31CEB8EC3BF79F366BCFFF4A73FFD918F7C44C2EB0BA15028A36BB98003
8B0CA76CC0383FFFF9CF4333C55429E8B0B81800670E1A3AE38C33F6C9A130BB
134F3C113AC2534F3D95E6C5818BFB0D855BA90CB503C4870711439B2C46CC4F
A68EF13E3211C91FC79AB0B505179CD5C2C4B7901E32C23417D11104039D442F
1561E99E9D34D49E5E35A9B4121CE985284F20F04439C283B0C86037E4DDF411
E173F2D979F791234D4D04F470C209277CFBDBDF9610B488731ADAAF78C52BF0
94B7BEF5AD2056CC02EC8CE84C8C1CD063406C41EA687C34662A761EBF62348F
46832417C9520821992314080A2C1A6818DB819D5DBD7A354323E284146B8006
659CE36F8B1542B3A050281EFFB6E39EFCC6BFAF51D692FD96EE7A6EDB51D5DE
DD613D5216B6374C34CBEB5A9004DAF3136611E382960456014ABAEE59A68A9A
B41D3B49BB59143BD5B8E896E782A3C7D8B9B14855949B16FDBAEA363B118863
BB525BF744E2921DD4472CDE373D57BD72BBDBF66C0DBE325D9FC1A8AA7DBD85
A23F39AA63F24B972C1D1BDD0DB1656B0C244D30B5FEBE0493EE061095BA04A1
528BD3A4D96A0E0F0C4C4CE954059C8DDEFE81199D659E1635FC57E042E6C17C
57F6E0C040033C37AB7D03F5355A4DDB7582CC3B045101A1D2EDECE11DA26455
395832DD8F3C1A5218240088B4C8E906480D1815A920E17CE761760966E742F4
0FCA140D92078A5128017817BA223D482608CE08B45E33E37121CE8E1B8225E2
57E0E92C489630EF3EAF97B443135869116F92944C5946131B69986199AC41AA
C0A46BB1E83B2C30A6DB5D72D1A86052EDE5A2B3C5185EF426F3B78CB408DB15
B58E6E22322F7AACC868F6193116A7906C3985BCB8C6B0E8444B965A5C1E577E
C8F389B5061BE276AA3D014425C1890AA660E72DF4628106F82066B165CB163C
E8FAEBAF674994A4B8619F3041B3CA57089754951860B36CF1465EC3F271F6B5
B732EC2A65C463F7391EDE90B792F649349B04C75F7C6B0221C51F52528A6766
9FF7673681F05069ED229A359E72E59557425122108588C9D47829C37D47D264
D11947883B1F7DF4D1C44287B2831558BA74291EFAEE77BF5BE51959C267E7BA
01E73143BA894452522CF1A1624A4AB203B75E0A6DCC4435F933CDD0EA89EC84
E1510CF33E18F975D75D772114DE2CBE62961F0A108BCA534A2037E3247C8953
5C1685BB55BC9FA5D617AB3BDA8D520976701CC4DA50C07F4D8249E04CA51AB9
535B031ABD39F574EC56F7170B536DA967A5B8CA5596EF38AE9D60D59AB61574
759D8196229E1D27D6C6D87A5C25BDFD73C8E13C6562AC2FEC1DB20A6E019A6D
27D0018BFEA1A156D06D35EA3D037DB353D32A4E067A7A69D18E4D4EE8EE1C3A
C05B0CBB9D8AAB9B418E4EEEC67E97ABB576A7898370D6D9E772FF1DB71047F1
D2152B46B76F01E1FA96FB92A35F8C25FA8F877F3D599FC1830A452FC08E6488
4B6028894637D22D4BF108531288A64CB2C161C1B2831EE61AC446D105175CF0
852F7C01F6DFD34F3F4DD838959752FEBFBCBD07BC656579F6FDACDD4E9F3953
18CA5066E85545638D9F418D468C48101414E9BD0EBD0E88C288304A57C01701
411051291A8905A32926B1BDB1105440CAD019A69FBECBFAAEB5FE675D3CB34F
110CBE3BF9E19E7DF65EEB594FB9EB755F7712315A3B6FCC36C66C72C3E198C2
68E2797788952024DB8FF2294A9450032EC6649C92129A7FF802A6912A71FDCA
CB41A9C696A80FE334EC17725FB42E34D2A1C8C62D66A900CD6E63B7C0A121EF
1BB074AE152845EDECE308004619342046B98428E78C1F00AE8BAA5153D0005B
8A397EC36428526EAD853FE8A083AEBBEE3A342D83777B295DE4E69B6F3EFAE8
A3514EDA701A1558728DCA7982B6B447927366348BA6542ED49E1EB2C9ECBB5C
408327B8ECD23C5DF0D4534F958F92169DB6DAAADE10976832C7BB204FC5C68C
E9AF25310F3FFCF06BAEB966AAE8903D3307911CAC4748995B29EEF11022C8A6
D4E48E3BEEF89DEF7C672A4D431E828BB70A363D4E2999B4AC0D431EC6854FB4
4D13609AA1711DB8D36525556FBDF5565D81B6CC279F7C3277D1D50E3CF0C050
E45142146DC34171B6D0EAC19BC1A680619471344906FE6B5EF39A5FFCE217CF
3DF71CFE994156D658B8832E83E0A082E3D67828FC212E6C1243D2711C015639
5FAC52574F65E1E0D88E49D77075A4732CDDA9BB6F7963A0AB5A1E196D8C3672
4D90042DC048485AE5A43BAD26CD4625B4BA43A9B39C01EC335A88B4352C4B3C
0D1CB96ADEDFB8564D2AE5E4C9917A7F5269D6AAABEBC3DA56F2141E4DAABF69
D54BF9F3A2CCE2ECD1D4D8A1A4B3D6399A779DAC94AB23CD7A48C2DC8D377AF1
B9672AB58EDECEAED0680E0D48CAB4BABA7A864686F372DCB5737AFB0707D636
42AB56EE9026196D36C61AA31A46BEF7EAD55AA7A6BE6FC6CC756BD776246166
6FDFDA75ABCB21E9EEEC1D1819EA98D1DBDDDBF3CCF3CF68489D337A65646645
6E595D9BC6BE1E8A3444C87564FA25975C72C61967C4FCF3AE662531C64ED0D6
3AE9A493CC7FD32A3816011DC4453FC442A631FEF465193ABA295282CDD046AC
809D470F3222CCDA099B6CB20936B1CD8EA9CE17BE05F230E45A0AB77E2A4D00
E6C2355E61DAAEDDE415342A1DC0BDF7DE5B5AD3369C76E989279EF812DB04B2
95A345423506EC872832DB16A3005615E3FFE237A4D743818034749D130E33AA
7B316A792EBEF8E22BAEB84227DF7731070895560680EB1C6ADEF1E9B802E16F
CD0B49883DF6D8E3FEFBEF77952044690C431FC29663C4821E9F68B25551EC90
86C873E23A845F085660699A16CAA1C0850B174AD6389F11C71362BC3C3E5328
0A2641DF92C562122CBBAD9831F0C1AD87A25C70AA1D066B95D4A77424121FD2
D05040718CFDA5DADE4D7E4281C8CA82723202B3DD5F6935EB4933EDEB92A7DF
D2E93CF3DCD33EB5E4B3ADAC2AB5B3ABBBD7F5225C9F7ACE5058F4DE9498E7B4
3FD3C9E17C7EFCE31FDF669B6D007AEBA90F38E08052D10015A3014CDEA49C9A
A1A08DD237B58564B0F338A0E54C08E84D453937C009923D6CF8B8E79783996C
005DF6ECB3CFE6B4EBBFA5BC4B76A920FDB75D266F588BAE4F30C637ED9B5B6A
8E740E0D6C51ADCAB0DA4CD66FA5DCAC95AB8D6625C90042D9AE6BD535D763A5
CC051869864A2B74B5B2B85035E39848EA210BA82769E6348C24D9D7F45EAEC3
CC90746541A4D668B53490A4ADB18CA56E2874FC21347F1F1A871E7BEC97BFFC
656A682971A0B60EB58708B8E5965B34E7A1307A3C39317B8F6D1433AE87692B
405FAD973D33C48859B0D8D2925C575F7D35610D20DA98E4A6B171A873AA0CB0
936A96E6280CDD4517BFF2CA2B51A240E63EF2918FFCC93A034688174BB692C0
0EDB52D7945188736F5801EC64DA36E0A1A7BA7E5CE51E3B37C64C039D6815CD
BEA69A527089471E79A4D480CEA38480E926B30B865CDD690A741E00FCB8A881
9875AB68B6E7EA62EFAA36F4A1210A3CA78B4271DF9CE60EB9B54E956C0CE923
4C41E511F7724B96B8077AC873BC385CCCBEE36BDECA4418F4891EC71DDA9C5E
674FEBCBBA0BF89F58F11AB2E60F7DD93694ADEB69499C4003A20BEAE9E08527
72671A5B33339B2195D22494CA473FFAD1AF7EF5ABAEDE800DD1FB8CFF9A852A
E478767D47AB363DFA939B6A26DFFDEE77FFF8C73FD635F52B8DD65D32CCE0C4
836BA34882B06579104C95EE2EEDB691EAF8267E294275D6E2F33EB364C9ACB9
7357696E5BCD9D76DAE1C1FFF99F39FD7D9DBD33A5CE75E5DB6EBB6DFFFDF70F
39444197D235A51BDEFCE637C319A993F3E10F7F580BA1ED8178D2D2C8ABF8D8
C73E264BCA5258A7516B87D18793E790AEFD3664962E2B0BE0DBDFFEB6E6D63A
8FC79468D63E317FCBB1C71E7BE79D77EAB2F665B5FFCD5517AF3B4AE5831FFC
E01D77DC81AF4CE6906C364CB4FAFCF6DB6FDF77DF7DA9A964D2B25CFD0BAB6A
49634E395958ADF50D8FCCCDC732165A52B01DE54A47DE086FB4511F4A9BA349
689432E287CCE44F42972C7E3DBE1CCAB43996C3BDC7D23094B7362BA559EC68
46D6DF26E99359D3591A08ADB1E16C1E0642E74349E391B4D19D17D87B12EC45
E1D06B02172D5A24CB1A08169389D9E8397751914F28E6DD3486EAABF84A0AF2
35C7CA77DA6927ADEC65975DA6ED219FCC7443F0AF85F5F1D38E7B4C13F707A5
0202029423A760B3CD3673641B8EB674DA0E5AC4AC889663A219E66E2CA2F908
DC2061DEBC796C69EA87A6C95487C8307505003F0C454F49761D19C749AF43E0
4B3F845118B7C371E3714DE0440786AA8DAF50084DFD09161D4DFA8CAC88FC59
EF9E5074557445B19BE892DA653DDEF296B7FCD77FFD97E989B4BA44A98812E8
0B471D75D435D75C8367A7FF7EEA539F3AF9E493794273CF125870468848DC3B
DFF94E89099AB7917B44498272D1A39E72CA299FF8C427883094F236CBD222FA
FC2B5FF98A842FD3C47EC274C24F3428C5819A18A81AA22C6BA92034058D1397
5648ABC99DC4B4A7E0D9FAD20E1D8F633AA038DCEFEA6E2B03EEABA591007DDD
EB5EA72DFBAD6F7D0BA2FC69D871895AE8BF9A732951ED0352AFB17D61879413
88B2C1F5D63064D17CF2BCF332BC7BB53C564F935A6752ED6C8DD6939EBE7474
38EB3035369C235FD2D06ACCECED1A191E966DEB94750C797AD7BBDE4589C382
050BF6DA6B2F8E8DFE099E4ADF94C662783CB5F4C79BDEF426B94D92DAD2AC3C
08567C296A5E1D8A8A30206400AE1E78E001CA8E8C344B22020036898502C964
6DC2E38F3FDEDB9BD9734778E89210376D7549BC8CCC7BC97109A572686DD855
DDB0D9DAB89EF6A6ADDEA4349266EE941CC0AE6A2DEB0DD9CC6AC786D3563DA7
A5D389EF2E956BE5CCECA8B79A23CDFA682B4DCAD9AF86D24C13247926B927CF
25CCAD5646ABE5B5A97CB8463DA31EAAFEB19C3E29DD33336BE447618AF698C4
194EBF14A1060CA44AFBC1513E8C6B9E17EB3BEEE38DE318B32FFCA57D02D452
DB87718358449BEB58F5DEA93E2D2856C534011F564DB3617C791231CAC8E1B8
E0820B343F4EFF4CE573336FD494E86AC41B394AC86E7B3371CF194DBE9E0E63
4E1B06029B49AFEFB4415C2F15C3F35C56ED7F4E7A1DD730B715573A8A3BCE7A
A1DF9F7BEEB9175E7821263C417C7BF4669DD494EDB9E79E3FFAD18FF45E02C5
F2CB756B212F40D59FBC5D9CC1C7762668EE6773C88837E602C49E728BF6F891
0CE9B3928CE96AE92504AA17856FB94CFD08F9528A00D8EB71E022DE7332A624
80BEFFFDEFBB39B3EB95E29C4ADB0FE1DBD0E75A6C02230EFEB05365D10CE62F
66D5417C13077EE6339FD15A805E2750C38CA11862067F4724A6E144D4F7F5E0
E067F43AE18413A49F6CB3F811FCDEECB32CAEC41FFE62330B8F26F9164F657B
D75B19614E484A1DB54CB69E77EE999FFEF4A711AF2F2C5F81938E00E501E192
7BC31BDE205524012DF359730E949B4E32D4EBFEFDDFFFBDBE46233CBAFEDAC9
23341147AE4C4565BBA954B4A6D0ED8E39E698CB2FBF3C6E38C1812410044A58
6FB458788A73F2D7430F3DE4849663293E75FAD3E2C58BCF39E71CF25E1A219C
4B4825732C0216D42464DD717BFB8607D7CEE828F70C37B7D4FE0C61C3BCED57
25E38F2B75963356E8D04A1BAD663D6BED9C26AD2CC85349F487B22638D304AD
0C605AAA94A596875B2987A1232F33D621DEB85419AB260369181C6BE8E4AC08
E5C792D6F2A4155A2F51B030271A8FB610B381AEB5BB1C0B17F6799C56455810
093008ED2FAD0910CA98A41A1B84E4DAFF4E1A310C0E8564821E44CBA113A115
FFC0073E70D1451719A137E9F5F5A71D77DC719F7DF691C49751A2732487E3DE
7BEF25D2406F095C678EFC54D7E1CC62D46A7EDC61D084E73EF8E6AF35CE3B06
9B4D933F88EF9E149C190E4E98CF11723D44CDA4F349BA17DF0EF25D1BEB014D
402E51FB9B16EA047368CC8D44466DF23C0862C71043516DEBF65BB2C5F03EF0
7DB4E774C0E4EC5F7AE9A5969BF03D00EDC730612A29E7D17F31FA500CBA02C5
AB04CA7511FC29887DB4FC125EFAB2240BCD8CAC399C97D6E1D4C529B062996D
5A869C67493F27B5C00140D018A7444C997C0B0CA00E5BA1055D33A2FF9E7EFA
E97260F12A0C7763BA34604AF042E113E83AA4167423E876DDACD127938D08FC
199DA701EB9B1A86948AFEA44D3C4D454C1CB22344A6274510C0DA8625181353
3B080EBDF6F8892A775464F08F8D5473E2B3ECAAA5ACCA493247926BAB051B3E
FCF8F3AD1C063363EE466B56AE09ADE1AF7DED6BFBEEBB2FC3902BA0D9603B49
1BC150C4A6C42692A0D7B174D90A1E9EC15D5B6CB185F61EE5C761FDB88D4F48
5230BD90BA77FD3D8A8450618880005E4D12FE18F894A03BDF6B1B4AC3D6271A
955650D7D172901141B5686F9F79E6994CA3B79F3E946B5BEBEE59B96A79296D
656D6A429817C2A69D9D8D9191CE8E6A29EF51506ABDA4C6B247A88F5B4ECD90
79EC9201A3795B028D7B44A7209FE18C1D48966029D15E99D72A354AC9582919
68861569EBF9109E0CAD1521B5D92123C0E5DC4E4B6AFC1A2AFD440102B48AC6
DAAE1845915004AE4B61D2A217A70753BC5A9AA02D18EB178D4251C058A8D846
E01539C2AECF4FA6656769C322F2C8FA95AEA937A421AFBFFEFA430F3D741ADF
02618D40B7511BEB2142261846A1F06C5CE616F3DB4F7AFD72D4F9DCC436C442
911E31CE651AAC118578EE9DC5041A2531AE091C2E0C05A645269EF6F14E3BED
44B35654B13690E6E8B1C71E932A060142578010D5D0EA9B92566EE6E7273431
BDBEA953AA355BB468D195575E89AAC48C8A398D2D2B8DF98911E23EA266EEB4
3F0B96033F3186DFF8F033EF2029F54FC9A078194CC9C7F54F3EF9E46BAFBDD6
8D6BDCCD262E6A0B11C8559BE68B5FFC22895CF40DF0124D0B1CB9DFFCE637F7
DE7B6F9D2E8D8AD9C0F0892B06C820C99978F8E1872DF83890C6CF382545746E
AA9309BB1F8B8B01ABB1B9A5355ADCC62FCB148320893F666C106BA41D9BE5B4
D1DB59AA8FE4F54D1DE5E18C7420CC9BDBBFE2C5D55D321C2BB59BBE7247BDD4
F9E37FFB8FFA9AE7EEB9E71EA6FAE31FFF388530071D741051290D00674563D3
27471C718456418A87E76556DD6126AE1BC20E70F98C2B10AD099074C4D9F42C
7A04CF184F645B8F7FC22BAE37862D1894DC56B3ED2D846145C3745784C018C8
0E9769A2111654C0FD6B07564B787736C39695F2A6A1B49144EAC8703F87B0D1
E410BA8F8A74C37885C5381975DACACF9064F068AE0928B9AA95926A465F9ACE
6895B3AF25C9DA507A31A4CF84F4B9345D17D26A67B6D5A55C6FBEF9E6B81A16
E56A5712BB2766B0218B00E31E93AFDD48DCDC5C7BD3F8A0AFD6CB4792C1E016
738EB0A5F466BFFDF6FBDCE73EE7F86AA9A0F2C70B373DF8A4D777AD3BFB1F92
41C769E36FD25F6C9A7EC571BBD6B8A6BD149544C4AEBCDE6B9C575D7595EC63
CAD3A6A963488BA695E33D2627CB8193B5455070B4A7BA545C1C17A2AE5FD995
09C4875C01CAB1226D42CC64D9B265E6F94339C7B6AACF212A2BF686E263435E
5B57C32DE5C5ACC9BDD051D7D51CF0B9E4924BCE3AEBACB4207BE2E2B802F442
D0486474DF74D34D9A56A433B10BB635D01AF64D4CF380216337D9A281E89E7E
4548C4A9574424801C3BCBF020E2A3C8003CEFBCF38C620C91736D5632FF8900
0581783A4A872228A90FE156B474933C72195AC86D79DE687BA19BC1BF92CD73
A70E9CCDA996BF2D90654E3787D743D4EFC5BDD8982266267B96BA8452B39A68
481D6B874643A9ABD43FAFB57628943A425AAFCEE8F8E657BED451CA007077DD
7D6F576F5FD21C23364DF84E8FB9E79E7BCA9880F644CFAB7900C4B5D75E7BE1
83EB01172F5EAC0F3FF1894F9C7FFEF9EED74A10CC15BCA6A009513ECD07C9E9
1C47A57447CFF938157B417FAB33A9017833E08DF135C3B19CA5E76A889B98B9
C4871FEA0E5D44EEF5C5175FACCBEA310757AD1B6ED565F977D7AA7387EB5B55
AB735ACD4AB3B541B9DA0AE381AD717D965F2D7B64B923ADA61FCD6F4633FF20
D7041A43A24B8E935564C1A51034A01792E49924AC09C968A8648B52AD62F09A
5E9E7EA26C006C3B6F06973A22FBF4F8B0D36097E89B8E98856959195EAD170E
4A8CF62E155D803C3C4FBE3D5AE7991DF19F3E4F1026D051D04E527FD599C572
B2089EEA3A3140D9578B23F2543569135261F0777FF7777297436E9AE8FAF44D
41004E7AFD36C8A56EA115C159C70A4162ECB2CB2EBBEFBEFBD2A54BA7795EA6
8B2D1DF31F6777F1EA1271B3DF8DDAF7C9616689F263FB70FC3CFBA130C0D139
31D597139E669125FA1437B374D328373533AD4D283C7A74A3C164380D9ACD77
BDEB5DFFF22FFF02D96428029A9C4362616941F263C669235FFD5021EAFA1657
02A3C96200120CE06E7AC74E75B80C4572DA69A7496A6B32B1735175C692C206
65942DA02643CA707211C1FCC958233F38C13AD9145FFDEA57354BE79E7B2E85
EF135FF6F7431E0763036108188F1B171863E45E7AE9A5706080C2CCB460776D
60302F40EB9D3138DC0A1B2C7CDBEE7BD72B3DF56A5FB531D45F1A3AE1807F28
0FAFBCF882739A8DB137BDE1F5AD52860BA0F24E0F25D78ADA0EC60312FCBBDF
FDEEFFF93FFF473363291C1FCEB428FFD6DD3FF2918FDC75D75D9AB40BF25798
E009C5A5611A3F59166F27FBD4B11FCD127FE10B5FD093E2E7C52B1ED64FFFEE
BFFFFE1A00D2C795192E4C8D530B56DE7809ADC1D11199EE49A3B74B3338B443
28CD0A19A7F4DC0C3C9FA4E58C8A27E4018446B3D1CC3B1B53A09B0F2FD770AD
541FD52AE5D1666B34CD847E3ECE90458E425855CD02469A3819F0CF4919C868
906E2857FB3A3B9C09F3F1E10D9840D77618F260763F97461E79E49132CE6616
2D856307FD2F9D2770793FE69A3B41621A320C1706C5354CA433B15CA7C9F422
BE586BA08CB621FCD26565F069BF61374C7A1D6C444E505CCC6F0C3A42C96C95
44D111087CD30ED934D70F51AB8F2DB7DC72D75D77BDFBEEBB93A2F3AE551131
A8A9E6D3A1AA50F04E9AB5697C425E95956B539BAEE52368EB2A50F0242EB275
223444A63ACE0EE75CCFA69590A9E88A36DBF5CC3E7E990547ECB2180D65ABCD
391327F742C1924DC0274C40A9578A9EC9001208FDC73BC6F5B43601A8767638
3E14E5D0F2D3816F8782CC436FAEBEFAEAE38E3B4EB69B2EDBD6B578AAA9A6CB
0213C8C5C95B007694F0D2D5A4188E38E208948D2C083DAF91768E084DBE8E49
A556ADB44687FBBB3257EFF0238EF9ECD59FEF9B356F756DCB1DFEE63DB33659
B86AB811AA5DAD467DDD9AD56963F4B9F2C2CD861EBCE98C0FCE4E561F7DE269
69C79C9181C1399DA5D5F52C0AA959DD679F7D645EE9FDD1471F9D15C2944666
D4667594D29D5FF7DA2CC3906E10BABBC2F053DDF5FE666565C65D5CED6A8E0C
67504AA99B0DDFB0F6F965A3E5E5A111CAADD09976F5D6B67B7EEC8FA163AC2B
07C5EB7925CA0F38E000060F218A43493424807309C590463CF5C6326807EAAF
071E78E0ADB7DEAA9F6B71A5329F7DF6598284549049DD522D18934AB9085F6A
FB85175E208C7EC821877CE94B5FB241D31AAB3742DAD3D73B5AAF3786476A21
2C9CB3C9AA15CFBF393467572BDD95B4A39C0C8C34563664EC979AB2E54B639D
7931413937FF3545D58C74A854CBB87BC2583564EDC51A1969DD40288D84D260
48F5FFC3DD3DCFD647BA37DCE0B9A79F9DD9DB3BBC6E6D5A042B6035E72C2055
5D1C608612CD809ED7D4236954E44FCC10BBCDBB7D1A74A6A97562D41FB743FA
707DB7218A73F244B14CF7AFC372CB2DB710CB06EA6DF79AE4598C199DC627F6
63F27D3603EE2F89568E43E94F759E79452F2388E262CC72D14E9CD1DAECD61B
0981DB6FBF9D93821C70BFC95774DFD8F20B2F83ECC820F2BFB82680AFD859D6
187E108AD0ADE466C81123FA260B63E7459F03076C8B4AA16334A7C71F7FFC3D
F7DCF3D0430F1144F277744D8A21CA454B740971143BE6B6C5B4D368F1E0FD06
2B8FF8A31D345D8A189A395DF93EDE521BA62DEEE4EEA0271C73FACE29A79C42
AFCA100567A6D9D9EEF975E18517820222B9CA8D70A4AC023D062E6EF2B869F8
947A67CD5DB76AC59C39521E4DE9A6B95BEDF0E2132FECF6B10397AD1EEBEE9F
3BD848560F37AB5DBD9552688C0C5592D6BA7AE7AE73465EF8CF3B069E7B64F5
68E89CB55163DDC0EBB75F58EEEBD5CA120D9397A399BFEEBAEB3236C0D1726F
35D9ED6D7FF5D9CB3F79F4C99FE8EC94406FCDE9098F6765511B66F4FCCD5595
6ABD3CB46912D6A6616DA316CE3AE67BDFBCEFE2C796FDB8395A0A1DADC6686F
A80E74555E0AC8C64C7F846808E0189765A6D5985B22444158F33EC6AB29F9A8
CFA9233386041C373DAB29156427D8CB647B60E5645584B58E4B962E3DE1A413
35B20D66CD5EB57C7967487A4A9D3BB78667D52A61AC21D3B157DE818C95505E
3B5A2FA5A36802CD470E180C1DA194914F944B8D52184BD27AB3551F93F40F5A
575992CDB43C5C2ABD9836EB7DDD2BD7ADDB6CC182A71E7BBC9AF357B3218130
C59B416FA495BFF9CD6F3EF2C82364CEF6DD775F3997B126488AC6857E289815
9068D34BDEB89F5DC8AB7FFEFAAFFFFAEB5FFF7A8CC58AD9E3C9F0853C55CBA9
0475AD6994C563225898A01C7EC1BAE2E7E99FEA7FCEA1A3E05C0FD2D685D0CC
D2D35766FD1922D1CF68E4BEFB505903C153347FFEFCC71E7B2CC9997E34032E
A27AA5F2D9262C819952419E3FFDF72587FFE29A80D28110E5FD086FE990C804
00BEC9335B34A30328D482ACC200D010F9E646F27171D97437DC7003A167AA69
38FC7A4853F4513740FD3DF9098D0D5492834221CA40FA1898DE922DE8581B9D
677AF29791AC2117223020C10472D145172D59B2846789F725A9FCB4E8FA400C
D745CE93CE33B1B86DB7DD56CA8F4FCE3FFF7C5D1FAA51F7B8D0052923242B88
10B4B120DBCAB89AF675CCFEAF14926AE8EC0B8D8EB71F78CC7079E673AB0666
F675AF191C5937D248AA9DD55A67DA1A4B5AF55A29D9205D75D6617B1DBBEF7B
FBFB3AE76DBEED4FFFE317B367F5A6832F8E24354D17DB8048A86EAAB17DEA9A
5B3EF6E15D3699DDFB9B5FACECEA9D17BA5E1C5AD52835FA7AC2BAD124A49559
F5645532D655A90D572AA5E166AB3FA9EA26AB24ED7A9EBAF233B71DBF68FFDE
EE30341C162ED8CA3866C88B106A9A43702F3CEF8E3BEEF8E0830FC6B48E5E65
36128E4B884A20C1B6861C36A3FFFED55FFD9596D8AE619C12B467AD49D6FACA
73E527CEC1645D096B9DABD6ADDD74C1E6CBF2A4EB067337C8944152DD3CAD6F
DADB3363AC2E83AD3B2423215D9E730A759782344157C1C719F2E6C0B590943B
2BF5B4D568355B8D30D6CC5B1697C39A7268D493E134F46DB6E9EF9E7C5237EE
9B396370D51AFD24CD433DDADBD446117677CAC4D9784C316C7647DBBDFDE2E0
9B43A6D30B97B4E882D78AFA35EA2E3A680841B29ACE37948B8E8CA1C0B7B8A3
9FA959A02E06FA6283AF2D9F377D66B854B0C13372433FA1090253FEEAD64960
6C19F613F7708C012021A2B00DB94DC3C663BDFE8CB43C17A7401A31A84FDC17
6BD271EA0BEF7AD7BBFE5FF8041A16214B30A024006DE3C7B5C7321B8F3DF658
87D13D4D4095DCA939291A72E99A927DDACAFA449B9B76456C0E89608AB0DCBC
4253AFDD6FFB310E7A3A56137BACC6ED422FAC2F0352D2F841DCC7782C7E053E
2ACEADE94312E3B6356420C372C1624B0C193195AECFD136CD5487DC95866675
9B6DB679F8E1875D1B4996CF40054742A8A2401B4D0301ECA855E66DB8F1B265
CF967A67BD71B7DD57D62B3337DE3AAD74EE34F4B3E1D17AB5B3ABB327ABC36A
8E0ED54A69B5527EBEDE591A5DB3EEC5677A66CC7AF4D995DBEFB8D37BDFFE96
EE30BC6A246569B49A7A73DE79E75D7FFDF5D9F38EFDE294432F5EF9F49864DF
489851AE6E34D67C26949F9F550F2361EE48F262B5B479335D566ACD2975AE0E
E559A5FA8AEE99E9DAE5B58C07276C10663CD535B07083BE99CBD6FC4A0AC04D
8730149876A49BA337F102C500737B601C39798A5A381873F55BFAB6A2CE3115
39DB5C2D260CD0036A5689706A8F01C0052B95855CF28E026912369A3FFFB9E7
9F0BADB492946412F74A3E9692CDCAB5394DB908C99AC6B0166CCEACBED155EB
BAC2B826C81F2C73933A727EBA0C6394357CCFDEAF4D4ACF55931535299B99AB
0607578C8C567ABA2BB58EC1D5AB92BC6301BB2DA647764D865B7A784F225E63
EC80831B845289406AFFB8F2E6E5E0DF6318E8D65B6F4D630CCE9D6148A1688C
6AAF4E73482459479822388707806CB8309E1BB1ACD3A03059AC182F8BE5A7EB
EFB3CF3EDFFBDEF7F4500C78A79D7692DDF0AAC843948D198D6034A04D0BC957
3401787AFC9218B248E6ECCF70500C10D2AD4974E95ED363BDD29C06F52FAE09
E80D70E595579ABD0E9A013C71327BACBACECFB5D75E7BCC31C720979DFDE319
C0C0384F8039809B89C517EB0C002A71F90F1F0293004FA23902934B89B60B56
C3FA9AC005207108023E58DD82C664404A5CE5CBED603591BC5EB66C19349F7A
10FDF3A9A79E92EC5EB468D1F1C71F0F5511FB80DA9918F538E98B49D326C36E
E52434A306A27133FA50B45D6BDB52D3D534A6E98CBEEE50AE7C68EF7D87461B
63A132DA48FA67CD6D0C3CDB0A259660786430AB83EDA825A1554933CD97942B
2BD68CE8CB19FDEA63BFDF7EE1A6AB07EBCCED49279DA4E1FDF77FFFF77859F8
E8E3B75CF644A5F242EFF63F5A3DF6FA07FFF30B8343BB946B43CDCEB961DDF2
AC3B6F3AD2159E1D091FAA868792D09CB1E99B973FF5C0A61BCE7A6EED93A1B5
7DA3FE58D21AED0A332A330280716B74B3CE21ACF1C6CA45F763C785DA3401A6
09BC20209A10FD9A6190BE80BBF861DC15CEDC762EDBD677886A02D6FCE4273F
79DC71C7CDEA9BB16ACD9A9E997DAB57ADDA6ADB6DFF987B72E55AAD9CB63AC7
1A1B86A42FA4F342A5A3A3B66274A8B3AB9A8CD6BB0B9F20631E2D854A1A6A69
A6155AB9D390649F5724EF9FAB242B92D68B633A53A50B2FBEF4B4D3CFE8CC34
7D536E8254D9CCFED9403FE7CF9FAF05A298864EAE18D1FAA7B900E4B151811F
221419BB8B5FC57154433FA6DAA271B91FE84CFDEA6FFFF66FFFF33FFF537E33
FE3D395E2D90BD13F20ABBEFBEFB77BEF31D683C9018245739BCF07AC6E84C1F
D869E4929B4A119E25B9C81DF527C364A6479DFE7922D1C571DA63D07F029933
000748249AC907D9AD95C32BCFCC9327D0826A71DFF18E77FCFBBFFF3BC6DF54
7941AA2CC713DAAFD6634FE5131C7DF4D15FFFFAD7350B1C5100F560F9F106C8
EA60D611A82DE5FD55B0AF6DD3C508137F5F6B499C51D74728C4C07CCDFED2A5
4B8F3AEA285B01485E5D7F871D76904570E9A5978242F3DE0D13A24392D1546F
6116692F7A4890EAC41C7C00F562F870C8CF157E68889C41BE63056957DA126D
D27936A0DB2E2D76B10BB28C0F39F5D453172F5E1C0AB885FB54ECB2CB2EBBED
B6DB5468B3DECEEAD070D6D97C664FE7C0E0C8B1471E4A2AA2A3A70341D01893
88CFA443AB99A7EB6B1DCB9E797EED6063C156DBBEF8E28A9191E12D36DFE4A9
A79675768E17AB5F71C5159A583D3220A2879EFAC5F37F1CE9EC1C5D5B7A7855
79FEFDFF313BAD6DBBEC855F27B3FFEFD0EA376FBCC506032F0CCEEF9EF5AB5B
DF189A5B271DA574E489306F41D7400843BB0E27CB4275A077C6685FABF4ECCA
4CA083AD8A3B4FC0798716945970E491472E59B224669A6C8B0E3169EC1C2046
44FF5826EDAB4B2EB9E4E4934F36ED25C718650F4616E6060914631F62EAECA1
C1C11298A29EEEE1A1A1193367AE5DB326C30D65E5C461A35A673A3622FF607E
5FFF9A75ABA5DBE796136902A9E252481AA5ACEA583AA3D64A4A496D34698D24
ADBAB4429AAC4BD3E74373559E434E5B19A545AD4A5BD0023A92BE14020A9107
6CF319EC06416A36869387617DDC0476435AB42F250B357D5C3E8E7284A209B0
7E4B169D8D61E04688DAB9384D2AC74EB20CD56B42F2F7BCE73DDFFDEE775DA2
85CFF127519E311F0CF11F349F1E9CE0A1F1A9D330C1FD7922D16E16843DC0BE
6D9A8409D1B63628EA9F91B7708E4777A4D193D77D9AF50AFF0FB04316EE312D
8F29F8F5271D27E97CBC07ED92D7BFFEF5B21F01B739AD64C6B178A7C6A6076C
AB346D70EB09000332F408E6D85ED686B63FC8ABCD7B8A33C6981213C1368845
2491EBFD8CE7B1E77BE38D371E7AE8A18E59992C9EBC10EEADA58C154988AA67
DB5EF8D16D894D04505C5E170A3A1DE7EEFC20615A9FA0BBAB03777278787483
D9B356AE5CA57174D72AAB9B9DBA418000ABAF4FFF6D0D0E69D5BB4AEB86C7D2
5A476F68B464F0572BC990B675AD6BC905E75D7CF1C57A8ADB6FBF5D2209F34D
9AEFB213CF5BF9E27FCDE90B1B6DF8E6E5CD8E77EEF7A63169C9DA9B9A61F558
75DE8BC30B9F1F7CB652DBE0677FF8D663CB9FAECC19E95EB9D9F0B717AF1B4B
FA3BC3586983758DE59271957A662F13EE2011423CC74F811C379B7A589FC431
CE1887A2C08A5ECA21829C511828E9A0256B03E74132C3D29F7DF6D9341C0511
48DD1C05310C437B230B8EAF5EDDD79B37411BCD1A0074CFE81B92D552AB96EB
AD72ABB969DFCC6478A85A2A971A235DAD524F8E316D6655DC59E55835A37CEA
589B34D684AC5371BD15465BE5B5A1352497A2BFA7D94C870624A9935AB536D6
18EAEDEF1B19196A0C3775530D40228F2671FAA7BBB16A0636DA6823C235F00C
BA7134C939FB04EEB7F5B6B7BD4DBEEC4D37DD142248E2C4571B5F902B8A9A45
6F5E87014281F9D121D26EA47041B682F96B755368DA0E3CF0C03BEEB843DB92
D6750E0ABD9C8C715C35ADAFD14D64D75D77FDD5AF7EE57A607307FDC9AE242F
FF954C417461EE0A7FE1AD6F7DABBC25537A58CE00B07CA5647F48062210F675
9CA19CF4FB642BFFE29A00220A3D1EF24E537FD965979D7EFAE9FA4492E2FCF3
CF8FE3B01ABD7945F00701967150CD9065CF40EF6559530A0BB420441889D80E
62DE2194C6A271719DA77B5214E997BFFCE5C30F3F9C38B24EB5B623B4C3B66E
E21AD4A4685DE44BD1051B296FF6A850C0CBE26A6A282D75419D96F3CE3B4F33
33E93C1BB6AC67070561C915226D1767419C6433A46C9A9393C7DCB2BE5837DF
7AFBC11F3F5053DCDBD53D2029561BEEE9AA69808D964E7B323C9AEA4DEF8CEE
356B4766CC9AB7765596BCEC29A563AD46ABD23116CA192C265FFAEF7DEF7BAE
5A3AE9A4933A9B8F35D70CF557C2AC991B3FBDB2F9D3C79FCD7BAF94C2A8E664
C5F55FBB312D6F385C1F2A5566DEFEB57F1D1CDD72C582FEE537EFD7D337A3BC
2EA4B519EBD2A172B53FD5DF6BABDB103BBCAC4D5D4FE728D0A42852BDB9FEFA
EB8F39E618DAE6489D6841290F76DF12BB71E03D7C8C5D0862386912559E8F2F
5367C7D8C868AD52EDC9F7DEDAB56B36D92423633FFDDCB3BF70DD756BD6AD91
15D11C1AE9CF3ADA3437A874351BC3DD19A7907649D208CD56161FCA20B5C3A1
B23A480D86A1244F1824A11EAA2DFD4F6B4C3E47D2CC93BDAD66476765646C44
1FD7CAE306816B1DF04ACF3DF75CE92DD7C1B8A79B85D744F9A59D298D0BE5B2
4177D30764CCA5188A601A6516849558B566D477DAF1710B77F3F3B8FF84F736
76242D62B8E334387AE7097864B9C2123EB10B6E0C4F28921CAF963CB44CA06B
B739B4EDB5831039EBACB3241239AD2ED983B67D1ADF6BFAFB120630A1CB9FC4
566DB5D556E3013B9D04B9D8A63C455B4EFA4BAC5DE49D7166C83EEB5ED71BC7
29FB10D1C6BAB02D4E1CC1C34C60D1C97442B7E04334596D75C2AEB2E3FB311B
D2341525F13AC5AF36EFB8337F51BF1737585FB870A1C404B16364877E85C662
4ED079DE7CA624B24B08D4DD8068831DC97C90ED01F8A143A87B1911CCF1806C
84CA0077108A03A6B1F11B1FEC97B3ABDCB03EE67F0D791C86BD4B1B2F97E3C5
D549E8D471EEBFCEAE8191D1CEAEDEBBEEBD3BD4877AAB8D538F3DACD21C0EAD
E16D763B352DFD7CF9FDCF3C913CF2FF9DFDD0F09695A1C75FECEAD97AF5F0EF
FBFA37942FD41C2CFDE09FAEE96E75F78419734637FFAF7BDEDFECF8FF42E957
A5E1B995DA8BCDB19E5606A39F125BD57614BDB8714EDE0E25CD6343A444F544
18A710DF6AD761EFBB125E3FD7B6049063C47D5B74D12E1D3EBE4F876194EE99
A1979698E1614103F3C5C50430131FE638BA55CAB975097458F7BB2B0355F138
2586484D2341B802C7E78D6F7CA32E4B439EB478F9E992A894D745B0A168E6E1
445712714A23BB41B8D945B61163CBC900715A103B5F0D06046018D7411A58CD
60728108D2178E3BEE38B911F8CA0B162C80E885D31A530091ECA1FB10198836
45486D3662016E34A2EA98D2CC0389132C429456DCA6D0B3BAE5965B3EF4D043
AF54B2CB28BCF9E69BE5C780B74C2272FB57F44AF33630EE5B1ED34E8C1763F3
3D9CD9E90B9A267DC5B6274BE82C6B88A2F9F104B9401CAB01AD4514DEFC7164
26390621D2D59477B9DD311055398FB7DC728B9EC71C93D34368A79AA964FDDE
552EC1A7CBB16E21A9A16D014F211A8212D310DA1B9CA15FD99A46D4C59A8027
02CC40FA01AA3BFC7476B91EFFE8A38FBEFCF2CB6964666ABC5010B24A7F7FF1
8B5F8C7B1BB5098B693015D3CC03CB4494F9D8638F958920875DC62061476027
28A152D406D60E16C73863C329559A21F9EE0FBE5F09CD5A523F64BFBD1AA343
FD7D61CBB71D3663C69A994FCFFFC91FBF9EBEEEDA5F0FFC7CB3AE9ED0F1F4F0
EA6D3BFB57D5474BB530E3D16F7E28A4F37358FC4898D37FE80187DD76E52F1A
E9AF6774ECB07AF4771DDD6174F895ADEF549A80A0BF9EF780030E907380992F
4B59EB0B5FACC39213AF89440B79756B69FD7622719E89E596ACF9E31FFF2871
F0C4134F7046B8884CD42BAFBC123481D651C28B9F18DD60FEAE4935816CFC4B
2FBD1498A00EC52EBBECF2DBDFFE964A08AA6758C7242A259D6ADD6D5D69A234
18D93A787569F4726CCDF1E8364D40FACA8CE29A4C496DCDB0D42DA6031D25E3
429F1095B3F9D526F2DCE936E42E1A886D861AF350B9EA5BE6DA638F3DA66F6A
05DFF7BEF77DEB5BDFC282A10F0125A56465A1F5FFE8473FFAC31FFE50038307
CC87DA2C843C8B790D4076D8E38FE1B671F8913A32BE6076DB57B46FB7D9661B
F0E2E6A1712FE257741DB755D7CFB5251E7DF451891DC996A38E3A8A8E7B8943
F6EEB0414E63AA38B5152F35DFC66960868C27150BDF221490647200C0EFDC77
2CF6D1BCAEFA82B68E36319079D4B89C179D1F079A1C2C2228847D6AA01896D4
546AD327AACD788CCF70BC35E511D390DAE178BFF18BC7D750019310B5307C38
DEDCA10041593DE09C029D8AABCF89EDD2094F737EE28927CA854403B15E8E41
836F990A2FFC4A5FBA059012C3B7CC5F6666A7107117B3136C6BBCA4EDF4FDAE
EEC1E1B1FBBEF7FDE191A1230EF9785F67256D0C9F73CC25FFF49B27FB367A60
E6AA99DFF9E7EF3FBEFAF3A1F1D639E9666BD37A1A9E2A852DC6C26067A88D84
F7D466FF7A6C706D18DBB16BDEE3C3CF6FDDDBF79BE1B150ABCF2DF7AE1A583B
334956BD9CC7890F8C25757C5693885E82953580CFB28926DEDA871201E4E471
8BE34AC6A9B067DAA548E7B8100151A2C585DF549F4BD01C74D0415A624CDA98
1AAB8D7ABE4D13E8875AFA18B8EC326083D989BE42E83D152C2D893863EC19C7
CF159B177E33A94F001700C1DE382A6065690331CE37B43D176E935B55B71991
9A403D883EE771A820C1978A6D5910229A67A38FFC276C35A2F6FAA1FB97C432
1D87C6641B2640244A118ABEBF08B18D37DE586B8A228C67155343EFF5AB3F23
23ED54961E2D6E74F86744F559A9534E3945677CE9D2A56D4D64B3CBF9A8C7F8
01666AE2CBB23B9E3593D07184581854C2C4DA60D3A832D100AA0027783B7A24
BE668CAD9CC810C94FB430D4D04E83C79F280B62147FDB764C8A72360DF5C823
8FBCF6DA6B294FB78D1FD68F42F0092C25EED54318070912A2D21B9E8B1D1CF2
569764F04211826BEB8AA76BF27D1CCFA4E0284728C776EB3411B089E779E217
66E4EDAEE822A97F2E5AB4E8B6DB6E83C1D850719FEAB8FE05498A35373C3090
E3E8CBB77DF5CE175E5CFEF4534FF67656D356A3525FF7BBE72AC3CD27BA06FA
3AFB9FBFF1E6DF56E68E365F7831E96995C6B66A867ADA7AAAD6D71A5B3DA7AF
6BDD68732CED098D553B84D2EF3479D56CAF6EB8EC9950EE78BE35F6B24EC29F
D404EE4F27E1B2E79E7BDE73CF3D3A0B31FB6358BFAECA8CD6647490D471A6D1
CE255B88E416AE9204930581AF6906887860041C48A171F1A97C02CE23FD67D8
932C071D99F473B99577DC710729AE69D69DA3E7AE5378F0CEBD4DDC4E316423
D604140F69245B6CB105FDD35D10F0BAD7BDEE57BFFA5588ECFDD853E155295E
C42435C3F2A24E3EF9649D3ED2721C8A7815D8FF711D03B544BA9A070F5291D6
6088BB72D1A11383D23A8CAC0F1C366E46E21D1EB39423F1F506A882E3A8FC8A
E78AE12D7114F7E5BF40A813C2625BC659E597FFC2B6234363240E7633819624
44BD0E607422063D55AE398DFA18E358699601E7009E2572DDC67FA9E594D0DF
638F3DEEBBEF3E6D4AD82E61C2C228035FE5E49E215FB412B3FAD13F39218869
C9AC254B961C7BECB1EEAF129720BE4C1931BD2640BBB09B91BCCE94C4A567F2
5AE47095F3B6ECAF7FFDEBFFF99FFF1911109B21B15BCDFC4012C991A00590DE
C836B1DC7FED6B5FFBEB5FFFDAE62445CE9A81CD36DBEC98638EF9D4A73E4555
2D4C1E6DD189B4A01309936985692482D93260ECA1CA0FD59544743DBC08A9CB
CA90FED351BFFFFEFBC9D994F30667B5AEEE030F3E3C6D654EEE33CF3EAD71F6
95BB5F1C6CFCF1999FCFE9EA5FB3EE8FDFFCC6FF3DF198C3BE7AED2DCF8D2C4F
CA8DA60655EF96BF3736D2ECE808CDD1EE59B3179C72FA3E4B3EFBA9CED0FDE2
8ABE5618E89FD5B96A6045D2F8DF221D2C76F58CF41C85851FD304EF272DFA7A
B6F226A95A627D4D0FFBDEF7BE573A830E1C219202B168338F059482FAD5BEFB
EE7BF7DD776B8BEA9FDAFC5A4D5D41CEDF6F7EF39B90A36EBEFDED6FEBCA49DE
4B07BE7734415C6CD8B6452181883DE018758DA36C885A9C656D7BD90C77DDDC
44B6F336A367524DE044B10789835E5EBF3732C2A154B4F7887D0EFB049B6FBE
F9E38F3F6E53929DA6A730EB1F8D220089C1EBEEB49C5690A3A1A7D0CED47BB8
9031406390180247E757E7CE25E25A1D2AF24CDA8890D405F5277D5F9AE96B5F
FB1A1926D6F7F4D34FBFE28A2BDEF5AE777DEF7BDFC30E76537B84388FF34A77
A94D464645AFF5F0F2727E6DEBBBF7DE7BFFF8C73F3615028F26E7E0A28B2ECA
AA1C980E242C95B4346777CEB6ED650A33026A8058F046319100EC5BA6000C60
795EF39AD7B0E9D1254EA8C6C862AB19779B627323DF59F2B4A8A3732713DD4B
B2E6C0030F5CBC78F1F435BA713CB72DCB1A268B0E8110258F6FD8A28128A130
01B4037EF6B39FE1ECDBF621B4473AAB0DCFEE24049B5EEFB7DB6EBBDFFFFEF7
4E426A2DB404EC2114B33D2A8251963E0B162C905638E79C7326C6C1DBCC9089
EECBC417D121DC76CA7060ED264466D44D2874A7A41BED91F58C04F434DAACD8
7DE50B69121AF5D03F7BD6E1871D3967CE06799D7947A3B57ACDCAC1F99B2EF8
C52F1F6A350667F7D6FEF9875F5FBE7CB051DF36A9BDD01CEBA9CE783A1D9D3F
38F674ADB549A99C36926737EC7BC373AB1E0E61ED669BEE78C6B9071D7BE299
A1DE9F2493F3B04FCC18B7A53A637DC94E76515828CC491F36AEC69E7CF7BBDF
FDD39FFE94AF8143D7F683E1CE385D6F1E5FDF8D33436E99227AB027B431205A
A7CB376D6611A3A4078D099E4613B8F8D68D1B097F9349D627BBEDB69B16E84F
AEBBA310C4BECDB83E1150175BF1934687426E90D1CAD11A51E3A44729791730
29A67F68530649C189CBD5F42C4F3EF9A49CB6FDF6DBEFB2CB2ED39FCE3CF3CC
4B2EB904111CA2C0720CD3080584D418741415ED2838564EF5D9D87753745D47
DB7EAFBDF6FAE637BFA9BB7FFEF39F3FEBACB3C8DE6FBFFDF6DAE77AA3332BE3
C0F4797ADEB81C9D9160A5E958EDB2CB2E0F3CF0C09F57AFD006C7FAF3EA0C2C
1624C73442D418223A13E65801C80B6354A657382C1895BD06C83BEFEF52CC50
8079D08AAC07D008537751114A6D0BE29EE48CAE7CD04107DD7AEBADD2D53A72
0E9339EB6298309E2677018D931434CB930EDE964E1BA866AA8CB129316860EB
BEA3B83E46501858C2E4E254C68990B844DEFF4499E13D948AB6ABA65ED1F196
F4F9C10F7E8025E2760B0E17B87522F8165BEB26E4B073E633EC37D34804581C
1C94A48EDAA1DE367460CC9A12E359F59ABB41C6BD31B07658E6EFC7F73F50F3
BDDD0EDBAF185AB5E9CC9E271E7961D6C632B1970DAF7E78AC3E70C77DDF4B1A
A1D29AD9086B2AE9868DCAF36963E3903C1B9290B4BABABB1BA56A3AB866839E
BEA175236B6AADDE9034EBCDC9E3DD71BC3E162E610A4D000D0E3122B42F3890
B84903EB18F79920C9C61EF6B463D3B0C4DE4E6498A45C59562E486D0DF125D9
10328FDC1E032FDEC14F0785A78A0EA133CCBCADDF6EBDF5D692652C048F1037
2499BE733ABB0841C34F386EB17E8D53C71335C1C2850B39081FFDE847E5E3CA
8AD74824047FF7BBDFC9F69430C55C68A3078FD156962431DFBBE3A5D8A91A9E
6197A81997BFC56ACC5C0E21074AC22FBBF3CE3BCBE46AE5CDF2B81D150CC81F
6C2F7EA89153401E8A789D5B12317843639CFD769C163B980724EE24F90B2FCE
2B92E0EC3153338502D6380D0DC1A42FDDDD1DA8E080C2F838FEF8E351AE09FB
12A9040A8AB6F2D3E81CF43C009E0B2FBCF0BAEBAE7BECB1C75CA91F0A242261
561658328BC5731EC60FD3E6CC720875D234F5049D6356556D0252B20C185751
F7F5F273C7693A5420A69BEB372645464F8A22D5549C74D249575F7DB5F1E6F6
5A78041779315418EE2020B288E7503115EC1E84350709C161E9E3F09ACD0AA3
05C890E367906070228B58E7444D405228D601B16537D5E23251871D76D80D37
DCE07E15984E64C293A88F36B6155B420FAE9B66A66EAD9C6A8E9B69B5A4F1C8
746D2D5E7C9E3CD366C78285B3864AE9D870AD353C98AC5BFEF8687DF6F3CDBE
FB6E5BDAD1154687B392AA66DA15CAC3D5AA0ED2E8461BCE7DEEF917CBE9BC52
E70B756DC97A7F6F773A3834286530E9F84DFAE857FC68F112A309F07EF4A477
DE7927101497E6B2D024A5A8D18B91E03135055B0E81CB125B8012477688C3DE
AD3D4E5786A7795D282045675F626362524D70CD35D71C7BECB1C40D70D0F5FE
94534E59B26409C155500C31F9D2A4F3E6322B93DD8609CD41278288A6F20974
3BDD5A6A405B172C1CD7218AEB7602B6D8622FD64332E2DE8371E09A69213286
6876F81415689506D28F26B2603164D14B13840288D846711A4F888F7C6CFB7A
B96537A04B9CD5E774F01E779C37C41518F69F61CB87224664ECF89F811D22A5
67226E60E27E96AC83AF5B16948BFE59218F7CC9FCB14569A88F835F61FDDEB0
210A4A22A11076FCC9510B9F52667CC1820552922C615C340BE0D7E52720EA50
D42007583C0018A79F7EFAE5975F2E3D2FD701A71BB8370EA0C3F136D35C9D28
134FA613D619EC1F3D3D5D85A5AF59CB224292B4BA02C6A0CF27135A6AB446C7
465B212757E9EE19181AECEAC91C8534AFDE7C468EB96EA4F56B34B6DE6EBB47
FEF0876C026BE3A765BC19D348AEDED20085DCC61B6F9C09CAFCAF18AA3E6C56
57F80D68759DFF2BAFBCF2ED6F7FFBBFFFFBBF1B3425F313A27CFDCA12CD303B
A439664E529053526148E095240437628164468D336697B446DDEBD60D757549
138C2122F216EC61CEDCB92B5E7CB19A83BEB41FE40D69E337EAF59D76DEF97F
1E78A08213D66CF6F6F50DAC5B77C8C1874010AF61900FD720A98F931BCE69A4
109D5C9656FCC8238F94BC7BEB5BDFFAB39FFD0C4F4BDFD1939219E23B3C5DDC
8E4257D6AE90B94D51159FA01D99071F7BAD3E8919C2CA9AC90CB63B34929944
6B57B3BE8D56736474247B163D75BDBEF1A69B3E9B872E3B24BB8786E66FBEF9
D3CB9695CA890B79AC72D25C61190946FA0764378EA375462CE8B1A5B007D113
9C05833DAC0C90C2C81DD62E2D3AEB4ECCF186A2D300FB0A64DA79E79DF7E94F
7FBA55B43161F698222A31B133600470A502C7D3DC098CC186201932CB2FEB33
C06F8E10B485A4903FEE0F8ADD3D77EE5C0D438E8E569FAD08F9849B48F35FA6
C2DA85B470ECCD5820FAA65209DA429A014C617BF91671DAA8E42F4951389384
28C0149E9808F4698D793BFC219AC075D49EAB508017683162A413A920C0E5A8
01BA6D638B68BAB457750BFD332EE3685324A130296C682605D7E94BB5F75E09
6B4227096D3AB5BD8975EF05175CF0D9CF7E960DCD623BDB161BDAE9FA486400
2A7BECB1C757BEF2157DB2DD76DBFD219795D84414DD982357CF80A26257A199
51C8F00198F8856655FAED073FF8C1BBEEBACBF50D3C0B83D73692F7AAA9FCF8
C73F0E50C4111E26306B12D562D9E84F909A27CEA9F54C9736B25F6DB8F146CB
9E7EAA5C2A4B52D07EB04473E0D1D18C7BF2E9A767CE9E7DF8E1877FF9CB5F5E
BB7A25A665A60092902BAC2C44363C38627C144475D68813E1281C392C028ACE
C2FADD7DF7DB6FBF6F7CE31B34367AF4D147A9E3270F44F7349D900F7DE8439A
7637A00E459A9DA033E1291C6D0A1DD1BEADF1DE9C3D3927526BC30D37A03F73
230D9267B57C21D288425C6274F7DD77BFFFFEFBA514E76FBAA9C6A671683D5A
8DA696400B04F8952DAE07A739C9ADB7DE8A25EE4256B68A3E71968854F65E7B
EDF52FFFF22F3A9FF432E43A945C4853B2810F3DF4D06F7DEB5BF0136022C4D8
50DD54571E7F8AA8D1205F9BD199516A8F35EA3367CD7AFE85E7F3D07898357B
F6AA952BBBA47B0606FAE7CCD137572E5F3E63D62C69E5CB3FB7D4DDA9D86999
2C6E85EEAE9722661C01AAD25C81112263DF36531BE411BBD8C21A59AC097FED
6B5FFBDFFFFDDFAE7C8C53A06D3AC0250E9A2B0D80E1915A78DBDBDEF61FFFF1
1FA1E88A85CFA7EF6FBBEDB6B29D4DE1890AA17815A730CE45992C81BBC39318
CFAD7EEEBC08C340CE72609D5A43821BCD4837313DBE8EF3FBDEF73EA2B2FAB9
B6B724C6FBDFFFFEFBEEBB2F268F21518C1B44DC1209609334B6FA8917E15540
6C6ED4BF83BDCED2D94B4B724E2463B1DA246F7CAFA9CC730D5ECFFBCB5FFE92
24071E033A350E01A545658F0F2977E468F3CFB3CE3AEB339FF98CAEA021699F
9722AEC989A91DA319517B5CDF60F1F1F260A8E475C0741BE9ABDFFEF6B7C09C
AD000C8430A4578396EB20CD461DE39E7BEEA9B59195ED09F26DDAE2B3FC93E9
6609636C00263F064552F408B43FF89AD7BCC6690372772ED08DF14EB6826D6D
59B17945B1C47187F323245345B64F1959E048C8C0C04BF15648B0658F6793D6
CC909D6F7BFBDBB37CE9DA358417FB66CE2857AB2F3CFB6C4DCA6C7878F6061B
10C75F95D7F874F764915C870E25266A1DD5B1916CA577DB6DB77FFDD77FD587
B2CECE39E71C4CF2363B9181612F1349E0D887A25A1B4D63B081775EDC510B2B
CF612BDC2CA7B9305463FFCCA5553BEDB0F3FF3CF83F9572A5D16C6CB5E5561A
B00EE1B3CF3D9B26AD79397DBCE6B7A7B77750673B375E86060737DA78639D2E
29805A9E95C21E191B190D11ABA584B57C02ED3ACDAAD6514FF48FFFF88F0802
221B202CCDD841660534611BA881CC3C8034668FFA61F65528C2296EADCA8430
27681D10842C31FEECC69BCC7FCF7BDE73DF77FF49A3CDC2AC49902A06B2B99A
D45FA9D49FB72D1A1A581B474B0865341B2D34816EFA8E77BCE3073FF881DEC8
C5B9F9E69BDD413E0E8C50C668961E3D23AD8788C51913198AC88611DB7A4F6B
2688E9DB3A11C59A009333EE90C112C79C893AD1FA82D674EFBDF796B5C4AED3
CE5CB468D13EFBEC23DB5CA7BE14B53EE60B080A8DFC84134EB8F6DA6B2D253C
FF46D19065693340412E4DE44D61A874F80009CA0F012EC25F1D8AC80C3FC78E
C64972793FA2D647893D1F631FCCF3C3309C21D861871D7EF7BBDF7153493C8D
6AD75D77FDB77FFB37A2A371AA63A2D06F53F6B6EA74246912C7548488A98C16
725A746A98354E4979FABD1B3D05B7A6B6AB8E09816860DF8E7C84099E81E3CF
719C302D60FA291DEDD934F6A9B3E046DE1C71A2656135C5DC619E3B64EF9563
4CF144BFE42CE7FBC67EBA3390268C738B63972B7B243A24C71F7FFC75D75DA7
3F6946FA721E34C814B3A0445E5B1F72AA5BAC92B8342114D15B3C3B3C182B0C
5B040C236E87A90126055414E2DC7138D0F050B3D5DC222F6487C26C9CAA3709
9D5D5D235A983C4292AD711EDC9764ECC84D6C962AF3D10020CE98495105A180
C30E3B4C7631227E529FC034ABF8C8943EB2B381AB4334462D8C46ABB9E28463
223115D80EF8E3B4DFB2F2962E40E0BA9B47618D663FDC70DE869AF9ECC137DF
E289654F7475760D8F8C87803512E2E61CA45A47D7D8E868297726880B650FDB
DFDFD951957466D54CF1FF810F7C40BB5FE3D4271ACFF7BFFF7D363DF68B5647
F68E13B6AEB48020485B45B341E2C4BDA6350FB1A0A18B00C64D9CD6CBFF586A
7393714CE7CD9DF3DCF3CFA5456087E847A6841A753D57E639A6E9BC3C4CA72D
D591AB90500442CD2622D334A4810C279E99FE7BEAA9A75E73CD35F6FD6DA9B4
250F80A92405AF2466294E1B61135D961A5176BBE68DD434E54E6CE0890001E6
07B1A809D14FD8333022404AC189BBE5965B162F5E0C1E84CC01BA1907AB55F4
F36873F789CD82DC3795106FD29C7C9E101CFE81BE2C83ECB1C71EE349F93014
8C35640DCD3CAF275DBA74A94E3D95D8EC014C34DE1318604B3B695C2A5EAD82
D0DE9930261C1EFB56C18D8A5D4B7ED57941AC5BD31CF08971C36D42D26FACE0
D388B080EBBB5408E917A71E35090B172E945481CF2644E5DFA65AA0B6EEE9A7
9FB6FE7658652AB5E4C214624D2441F199C617113BC8506283B1780C8B15B3E1
A333F406BBD270782289783A5894D6786D993A0E00CF4C3A5B8343CEA2D90880
3824DAC6D86C088D0B7F628DAA379AC7471E792499822180B88A46A25BC3931C
3B31C48ED61F6D29E605224F95C5D3478774FE3798331740822EA2CD9AE5C99B
E394671A275D3957AD5C397FD34D316031528C9BCA7A8897324C141E1F1DC710
F76D3E81ED47A4B3E90D4251B40C265ADB02DDE62E5D98BA2C8DF6779AF754D9
7AEBADE5997A56B510920EFA3C07777501C2239268BFB8B7670621236067DA82
3003F6F6751AD60D1A21E4688D6DB6DDFEE1871E9ABBC1061AEDB379BAA23FE7
950AE9787C8F7A4B881249D9998589423CF2402122D2094585CA2EBBEC227FCE
69BA647D123A20403A72644A352169D1409B1D4B0B5FC484245B28920D0E6E64
5AA43EA299951C47C319DF59EBECB05F257747EE8FECC4471E7E78669E2A8FE3
FE8D1C815B4A4ACCADB696369BC6A9E7C2F76DCB69C7E52CB877A45B5947478D
DC3FD26D64102BCC2A9845B70D9F6896A6055F7F88020EC43F61093520D5F38F
660D79E5A02EEBFC6A8832BD56636EC8C56CB3994B05F521418C105166B27071
01B6076FEC32A631C68189CB8CA7884FB7F3341A338F46CEDFEE4B58BF515A1C
84E4FA7CA2F1B3C41ADED9679F0D9F075E6C4C791B7BCF13131231609D2DE1DA
9436BC8CAEC323F3B5CD36DB4C529E7C95C6AF69D77B040877D47F75D6A4A435
45FAB9213331F1866D778BDC58F270474FD7789E200E8121563872606FE15AA2
6E9058AD2EA1D9B9FDF6DBE10FD1970F38E00039F5CC1106720C90681B53EC5E
E8D6F67921D406CC4E501ED1693B1DE3D485AC495EF6A52F6B9BEA9869843436
78E73BDFF9C31FFE502BDA061DC10B7197E0B4E889A6EBE423CF6C4F7982BFFD
ED6F91D75876434323B9E53BDCD39D91FF8C8E8D66FEFEF050474F6D546B993F
3E11806C720732EEC9CF7DEE73279E78A2460B7D2919A18ECEAC4F8BCCC9240F
476416F1B8699949A24FE62FF0FB2C410C0F887D02377D456CB9BB833E7FC73B
DEF1A31FFD48C3D05F3515648C5D2BC4CE3671266E10D3A8F70B162C90699621
23ABDD0383034948240567F4CD58BB4E9FE445B0A379C5BF642B8CD61A1252A0
595FB0C582C79F785C932093EDB8E38FD3DDE5313CBEECE99979373A49C3FE1C
962AB9A937B56A2215E22374EDB5D702D3A6638C06103781B186764C83E0D8DF
FEEDDFDE7FFFFD780C36B8FC654011AE1A053EC05FE7CD9B2743415A04E72353
931DBD2C2EEE826EBD7ACDEA6AA55A4F4765AAC82D1D1C18E8A8758C33ACD43A
D6AC5B4BA84447A09A778824F65DAD758682553829E0D48D8C37AD1B91A7F585
7917030B49D496D7B598E6430D55FB5326828B579913375286A910E2779287A8
017080F171B3550123A99EF4B5AF7DAD4ECA0D37DC40D7DC187305B736CD5075
7D663E2D0880F1DEAC099CE50A05066FF3CD37D7C6439001858AB3050EBDB2C9
8904C264150AE683366E027D47CFAB23A6371A955302D8B6AE07A6A7ACBE70F1
C5176B75502A982FB120E2657C011E4C4C4D8AF642CD10A831D12C9ACC91A836
EED25819B455D71284777990C6A35B483EC88C78F0C107B1423C4E9F0E7CC17D
F6D947024DEBEBF229BE307FFE7C4D1D851ABA3854956D819C787795D6273F0E
EB03ED325B9ED02432252D00B9FC181C8B4613C3577D452D83064769F8873FFC
E19FFFFCE70F3DF490C5565AD4B8C6CB1026E017750BD9E6DAEE92597BEEB9E7
9D77DE89A5630669C3390C678C7B1187A8041C83C834BC7122CE91225787CB82
960B16050AB3C11013F4D8F22BE73F0C097650B3D524561E4A0D192A1DD59A1E
4F322E6461A1D03FB37F646C94C8FBBDF7DEFBFEF7BF3FB2AD4A84144A792224
4325E663EEEF1FEF3FEC9A007B8E936A021F95B8D112CF0EA096AAEF91FCC5FE
A3FC9292CBA468F3C99549CEEBA6D204C45E1AF5807091269004E44DA60B47D7
7575770E0F8D7476758C0C8F66BCC7B5BCDD7477A62DA406F21E36999CFAFA9D
5FFFE8473F2A537B46EEA74BE025B0DBCADDD1AE688D85C229D4E0B57DBDDF58
598C1AF4BDE4208483660E671393D093D0D44FE867D2066728E71DEDB5AFC0E9
D33F8E373A3FB88C84238606B3077C696F27A52C8193BD6B68BDAAD20152C91A
76B3552D67D2AAA32BCB76701C6EBBEDB6830F3EB860EB7B2EB05E189E059037
6D8D875E8957304888CFD896E9FA8502FCD325510E98A0F84178335738DF3C2C
E92897319A7B7CA226B0210CA74828A225188C268F33F339D45818F86EB36AF0
7E88788A4A45134AAE8F89CDD56AB9E724051C8AF23AD21BBAC599679E79FDF5
D76BB9E5A482D0D571D06F354E3D29142C0CE6E4934FBEF2CA2BC903B555AEA0
236FBDF55699A4DED5244E0884BAF42F76F7F17E0E3CF0C06F7CE31B0CC04D78
783436218937CA6635249D146DB90F7EF0835FFDEA57CDA01726F804067AB905
02F631FA1B20462862B6CC98DD05B4821BDAE83B700471049893F1DD9BAFD469
A79DA699D175D03D161AB1D3691DDC768826C91338DEE28C048C98F6E062AE3A
CA32ED8968ACFA39E97EC78E4254499B4EC0B98788975F3B46DAFEE8A38F9632
C7C443F497F2969031B93C2E703C18975F4A2EE8CBF616090E72BBB68CBCE192
CC42186FB154721571FC083DDD7D834383E3D25F4F97FB073293D35A5A971559
CDD47BAB5EDF74FEA64F3F350E22825EDB016BB648577756BF3E1AD783E4009B
C181B540F7A8AA8B4BB7DA5EEC63C27C566C863037C7B13DE3D1339F40D36384
C2CD8F6F614512F9959559FD39FEBA954BE75A87DCA0ECF15B23DD3D1D4383A3
956AD2A8A75DDD3993E058ABBF6FE69AB56BFA7AFBD60DACEBEDC9D398F94425
E50CC521BF6706EC78F8C8B9263095298621A7C2DBCCDC8D3E870E376B62B555
62CC4228DAA0C3D46DB47E29223B434FB856CB3473C524573A3B3A338468394F
B88554FE41169B2E6765604939CBF1C89D968B94C5F186874A851B8EE56E3685
52B9FA92751CD93A7D7D3D2833E36142D4196922A68EBD4DA434448584A48239
5FFC15C8905BF184A81D3706699B2CE085D0E75CB010C475632B849BDA22498B
8A8156D12A15B5E11631C616229BBEF8C52F1E71C4110EC7B1C7162F5E7CD555
57A1A19DD820A08A7D4A03033DD778FFE77259D2EDF8E38FDF79E79D1F78E001
B601A594F8673092126A0384465493BDED8816FD9A986D6482FD3052896E8D60
0FC6C1F45064B963BA21FC33E33526050E8522AC6D4D40A484C368D9E89DF0BE
F7BD4F3E2E19113345A3CBE31B79578422AC44B362199AADA27B04EA27D60448
4E07A088F66B036B6E2FBAE8A297600E06239BE52DE62728458CA4AC373BD285
18B286B41E6DD0A5F83531586F04882300867BA24BAD2D8C74264D6FBB387E4E
1244FA500F76F9E597B303A4B709B485A213850D0110602C06F113CE0C19AA38
5E69BBC33862D6D255052C337B9D3DE40EC671D8DAECB59EA572D118846DD1F6
5C4E31B5D989A1A0096360445135E0458B165D71C515182C388C567E311938FD
9E9804E43E302D8C20BE5989FA52C471674EBE25755A10A1E452723CD6B472D5
B85920E59185C85BCD18C29B4625DCD3BCDA82B94941E50654EC939FFCE42597
5C8216071005B880D16A18AC9D8C260CCC5060CFE34D1E9B93F8E9AC235AC429
7DE3DF71885DC4D4D697D4E1D734A22F65C0AC82057D9BE13F69122B14990000
21443BFD8C4024E0AE6084694EC9E083E32E3AC86B9C510FD841512AAB4D241C
A2349B4FB1D74E3F39E69863AEBDF6DAB85E37E60E88ED09E0822ECB37576E65
420798389A47E49A334EE9282E17462B179707AFF7B690401C2C59B2E4F4D34F
77D701842FE252CFF8EE77BFFBEFFFFEEF4F3DF55492D8F4714C8B3A1BE3BB08
B5E9BD2E45EF399B5969C10810A21E32F152A605ED8D06499794CB2EBBEC9C73
CE891DB289AFF8E7048B482B86A283824F9F21B9EE636854CB19679CB174E952
54AF31F4965D063E21EE40573309D44E7116B09380F38EEF51D7F11AB1134727
62B16E0A27D9381A3DCFAF89A0D81D3C93E5053A10591057BB58973A9D827988
B8844C4D13A46B920C490B9AAA302149C5EC68DB690C92FEFA891E8CB8B03B54
608EB9138E036DB823543081D54B8B4ED32E991947C2D46AF2610F39E410BE03
87ADBFCF4F5854DD0813D542907FC6505FEFAA52413AD46618C6600FFFD54684
A6DD9B23F634B7DF7EFB471E79C465356C8865CB96C1746DEE2330D70814FCFD
1809E7E735CBA34CBCA38E3AAA1435C3713420F3CBCA15D2D7BCE4198C6BBB22
F21BAF544C3035716B85084B132B45F7B6656CDAD01A36611F36378A0189DF2C
DA28B91E98A315C7DF90D4168BA843CDE4E73FFFF9C30F3FDC09246F096B1AAC
25D2D7566FE06E9DEE9A6629E3874D26031D7200350C4DB8CD4FDAD0D3293329
A84675478A9208937A9E3D06A20A7A0489090D98183A211DA682EF1B69131F4F
04822964744764AEB90330656475699BA18DC8458582883766EA4D22AA8C899A
C0EE29A009EAA462FABF56C1FD17727FEEE0830F9604E4E46AD107F217C294C8
15F306C1A5F6BC159EAB73436EDB41DBA7FD43C6487FD55D7EFFFBDFC73EA821
8EC9045A24EF589F147E05B5DAF4B5C449444E85D2D5CF4F39E5942F7CE10BA4
859D9501C8605A8E52C44F73F2C927CBFE83AD47DF2164241187872A597FD34D
371D76D861C8615D2AA63A0E45B137BC3E9A8DACED920B4A590013CCC5E7337E
0047AF6C084CFAB2751017CBD935333CDC51B671B152AD822771BB2E2BDB5812
1904C66CBA61005DDDF585B7BCE52D3FFCE10F39F6E0976293E48E3BEED86FBF
FD600906C109798B130FFC13290F43990640CD7AABE843690DE707B447157322
926347235AF424059DD154E2A06DDFC49A004BD0A902E41A400B9D96BDF6DAEB
EEBBEFD6D2EA43976B5A9CDD75D75D1FFEF087895A62597B0C31E48E63CC99D4
5DDC89A9B43EFDDCF8866E36B3F6B9F5B16AA54AF8785C7C34EADEF1AD88BD7C
7A425DEF461F3C669845C7EF2163F99EF7BCE7A73FFD29B93E07D6CB053BFA97
BEF4A5830E3A0895309EF6587FB1CC7D96165D28F0A5DC4C31761DDC03A32DF1
EE6809C598DE996D154C13C5C7F44B4F865CCB77F6D9675F73CD359A52085ABC
D6941D68436A48407126BE30A8B5D53FF6B18F61A8E901650E6B7A217674996B
5B0831440E191B00F742871D15A883A99BDADD84FEC4609E1D77DC51E6972EA8
EF13916057B44D881F1FBCAC5CB7B7BDED6DDFFDEE77755FCA7A1120E60DE576
E830DDE5E69B6F3EE28823F485DD77DFFDE73FFFB91E04DDC019BCE8A28B162F
5ECC83A0243403B20EA5622FBCF042668C0B3A5DCC0FC1C519B5614D10D62FD1
8A1F81600BD69ED3246F7CE31B7FF4A31F4D73A2DB9C42EF43F742604F1E7DF4
D1F2831DC106986B7619278DF012CCC767EA1DCCFF10396D9A675DBFAD10671C
57ED1D601B2444DD253D62CB23843831FA90BB69A170AE5D436020813B2EC5AD
741D6A888FBDF71FD0111EE0CA2BAF3CEBACB33028DA08DC3D83CE256AF6B527
306D205DE8CD5F66CCD6E79A085D0DB35D6B06864116B4BC45C77C1C2332E2CA
520371D3A6028DD397494EB6D9D5F36951F08519D5883AB55A8E7091893B6C62
163114D12156CAD69CB53D6B8F73AD75D146A1925EFFD484E89F74FB81419E8B
F0442EADB4207044C2E932373D371F4E52109DEBF03FF0C003DE395867561553
812BDA5E4C722C28B19550CF887240D30CD5EA5F1F82532030A80797C7F6F0C3
0FE32D69F2B53A0E033A046A9560896F881AEFF9103FB55C340931FAD6F95EBC
1CB6C4C488FF9F5CD0892FFFD0540D2EA4025FCF604CEA3E5565937EFB8637BC
E197BFFCE59E7BEE79EFBDF73AC11672F748D7A13C1B0563DFDA8FDC2A085A28
6ED0D7627E30542CA49EDCCBD25347CC4DE727729A4EDC09D89D1C9F071F7C10
CDCD23CBEC95F9AFC7A4623C297A476BF9A4066411BB3444B3F1894F7C02C650
2E2BD5E502BD361104AECC0B41EE8D0D568EBAF43021B8B07154D37E9EA370AE
8522BBA0F7DA9C14D34DBABE939E7AE7143179B587352D7273F96BDCA9C67417
1AF379E79D27DD269B40B77EFAE9A7E324B9C538EFDD6F3114FD89172C58F0C8
238F68A85A44DD2E715A159B97C87569FDF67EB126306AD598BFB0BEADE7B0BB
AC926DB7DDF6273FF909AE3D6A40BB107D535ABFDB5F7C7E208AD18B7DE64DEC
3DEA54953E01D81EF74B41C6C9E4D1C695B090F920D54AE4CABB199881C58196
01D4B9DB21386B64A7D2E9656D3256884700BDAEFDBACB2EBBC8BB04CB456C94
6570C546ABA02D7416DDB6C0CBD704A5824899F0BDCD706C2BF894F4F81A924E
D139E79C034ED71C76F7DC738F4483850BCDCEECC1F08CDC820008593502A9EE
3F1122549C46224DF0EB5FFF9A1C662C52BD615CFA388D4FC0AFE20094AB671D
3335D0904FB4F4501A5C7DF5D58B162D42258340D5AF6EBCF146C90B1B0AB4A8
24F0552EBA04DBAFC7D8345C9563E39026DA48DF916CD57E36F1AD0D110736DB
C2CA7E9C57A409E2661BBAAC9E8BB027415E3060E5A265B9CF4E9B7C490BB210
2046F20C64715348C138E3224A6A2D8DDCB7730C2AA93F7FC9D2279668D787DE
4D2E4A076468AF313698CA516FB2364D106B4DF60CCE9FF6705BB98056D00DC2
9CEDD3B4481C697E8C3DA505AC1B095090A5DFD2945422C5A40BD661ACBEFFEA
07744F3A33C22613B812084DC3A60CCE4A72EF831FFCE0E5975F3E8DA66FDB12
69440F1772B6050DDBF51658CC3E5CD67FDABDB68D506058D877DF7DF73FFCC3
3FE0C8121AD2C21D77DC7137DC70837E8890B7EB6F9E9284888A39D65DE445E8
60A28462AEB553CF3DF75CD9EC1AAEBC122423E72A2E8B9754922D463532A149
E4A30C072D5E5C6866E168CF2EE4A1435D194A45969919318912C74FE3D197A5
8477DD7557ED57A78F6C01918DA1A4882B487C132524A669796A43C608164B0A
3DECA1871ECA352529324282DC8371DE4C8627F340DED59571CEA0B46DA0B07E
1A6AAA575B7428AEACD116D4C835C364086CA4A779E5A45610E9BCCD36DBC892
D50F499F26050D43887250B68243918E7368F2FAEBAFD7361A6F7117110C8C6F
E224CB3FBFB87C79678EFDD02DAB79826770DD409CD161BD2C62267D4C075ED9
E50E825160A5277AF4D14735C9DA5D18134C2C54E100459C70D31B5D445FD314
E94F92AD74E50D79E82629EA66B823107BDD57F6C1BEFBEECB7808513A91532E
DAC74BF138B58EAE226E46F4D65990F2FA3D20C3CB8E0EB1A5B540BA9AC60FE6
F2D4534F95B62364CCAE8B0919E39CBCC58DBB68988C361449635D99FA9B33CE
38E3820B2E2095355E211F99653406E7C81058437FD06027149979D31213BC72
8C51C70DC1CA5FDBF243B14F003384C6C3A85CDFA05503EEEC1A371421EB889B
6E563556168B27564206C58108A0F2C0B00E4E04DF8C13B3A6BA69AECF815F8A
3AF25A3FE15B0358D27DB15DE21E9613354188B80F90D7D89DDAAE1448850224
C6A974ED3AFB8D2B98AF9B53C3F078705A41A445B9BB3E34F05A1FD20F391471
F53DF6D8E3DBDFFE761222E65B6D740DC2BD1D26DDC13E03471D75D417BEF085
B07E4B190AD6296C611C071F7CB08C11F4415BB7E8894693FE79CC31C7C89A33
FE0CDE151223DEF1F18BA40A604AFBBF10B6E85962CE19824E95F53B0C3B77E4
DC038A4ABFB5942788AC0B12A78E0FAD83E6488AB468DEC9EE47211BD7C5C9B4
DA0B7F56C698424D7B4BE85748D9C030D8C03738386E17A1F38CB505E6DAE49D
5415C4358AB48AD5D5F4DF1830D3B670E56AC5649099AD4DEE2107E0978B86EF
F687A6890E794EC0A85813F8B4639A983AD7B85B7EEED010162E916B94504CE6
EED3CE1C3A18A89F6B0F13E1D4F59D3432DEC60208B9E3E8991386EE7418234F
C214E6FF343E018D28ECF3F1A11C5C092CD7372505B687BF9A443A599FE59F84
304161891863726C602613BA48968BFE2D084DE2AB9220A416ADD1D3A2EA886C
B68E986B865B1123695C843455742896AADCDD15003EF5BA8E49C91C6E0AEB63
96AEB9E69A134F3C114F9729620030326912E283E06DD0860B60CFD8770F51AB
12BB806DFB19CDDD56393C8D85E77D1E26707183856D144DC09024B6C0084282
044582EB2910FD76E6F465178B407022917EDA69A7C96A97906C83BDA1C37491
134E38E1B2CB2E1B17405A69F9F83BEDB4D33FFDD33FC9AC7687F4892852BC4E
503D7AA36F6A8FEA5C115D89E92D5DCBAADB3BB314724B5F6EBB0667051B4F4D
A96004F3B4828489A199E67589BBC1385181D79FE4456444F089A81A6B4C6C01
3BA82D7BA389938038FAE8A36FBBED361319528A45CD3015868CD9A428EE6CDC
165D4112F198385BCDA2ADA635013EDA2B4291B28F991F3D05A1701F8C187FE6
C01AB4F504073C8D86023B7BF6B18F7DEC2B5FF98A134A1240706F00DA691514
7EA1704D3217BB94D4C7C6BAB547070793822D352BA50EE378B050B0825B084E
7A421CC6F1AE480AB0907782F37B6C2AFEE97D6582332699DF1A5DEA0727F273
D249275D71C515AE5DDF7AEBAD1F7AE8A150245AAD00C879B68A4E189CC338F3
6CA7CA278587F5FA8629A24353CD43BA7E7758AC4283119816EC7D6B26BF8FD1
D80E7CE1AC58EEE04F68EAA0E8C19E35F709AC3EBA979114508122EE594D9C7E
CD8C5C8ACF7EF6B32649E687082956C111AD897CFA6DD1210D921E679C29068F
FDEB56485E1494EEA73EF529B9E9341075CE8C363821420420CA1094CCA13DC8
581F1014417F9039435CD8A20A51FBC2B854CDE15FD65DBFA2CE792A4D5F8ABA
E4C6E10157ED59AAB8E60BC560D8AEFE79C00107DC74D34D717D1C726C9C18A6
782E0B3AFE84C5CCD3817E2485694AA2977C764C421286C488E25804B93567B7
318ECE3AEB2CED065CC2498FBA8965B8A6CE216E0B32C8D91BC60025AABE4C8C
486B06D91CB4E6B6B89B45BB38B092C0220914B8D8D82D8D4204D82A15CD5AE9
531A93AF79B1A9D1D06E7695475A947D1A260C0F22556F249CBDC6362BD2025D
67A9818585294AEB2558F0B424D61694DBA0B7C214F903B62CB52A9602AD8230
CAA9BFB6A03CE243A3D5B0ED3CC59928FD5CCE10FE7E5CEA6CA18621EC9A1749
CF471E79C40906B0982869026EC48E911A7A4C902A80E249BC4B22138827CCC2
B3C4E9B8B42853079B180AC8470C3943BEDB5A34773C45D7B83846C2585B932C
CD565FC3192E551AD58E50190D834925B41AA1BFBB6FA8BEAED63167CD504728
3D33B327748E740E8F964B616C755F3D24D530DA2A77F6A64375DD7E5EF7CC81
A1D563A1D1DBD3FFE2E0F0F6BBECF8FB877F13EA4DB9A5A5566560681D68664D
820606A0CBD8D6892FF7FF0911119B03BBC8B5B4A02423E0C9EC51EC62DA1807
3430B4F19FFCCD381F4E749B9889793E6C2633E1FC37293AE549891E7AE8A148
10EB2DCE23FE25F4994077F0AA652F2E5AB4E8F2CB2FD7BA7096193C42805593
44D6E9D09725A9DDC0DDE968A390D9E7F8C1EC497EC2AE606E5B05FBD09E7BEE
79E38D3786C299331EDF87C5E971C054AFD67E8651C69906C3A34D82522A5837
5C6B6641D15653094619773FC94B6869023A952581F4E3FC1E78E0815FFBDAD7
5C8F825474031F0D9835CD524A210FEF800B0659CF20489912A97425B4EF67C4
05BBDCC58D1335013003C2D0A83B6C8A52699C998BAFC598277D5943321EC6C2
FA4B5FFA921C1972771CE3B803AD2EAB19D47BA8DFC0594F0CCE96D627A90F51
E13E3BD2AE37F785458E25D1F479011CFC39FDF4D3972E5DEA16CD1C30AC0C7D
D99C9AB68BBFFEF5AF7FE4231FF182B9600D167E0BC46432063D7F18EB6F2D99
0E1E85249A374D29E10B1209F89BCDA85B4888BC602772992BE7C65962EE8524
62B9811568A8FADADE7BEF7DD75D77C988FEC31FFEE0AA542CF4B8158915F677
BEF39DBDF6DACB6DE9B055694EA25922BA15F3F0D86137E06776FE7AF4D147ED
18B11094A71AF916972B1B298F46E1C15D0896A5E33A2BBDB5DEFAD058524942
877E9C0CAD190AF57252A9A78DAE39B3375CBDF2F14B967CE2B4C59FDCF4753B
3EF5C707DF76F07E9DD5CE952FAEDA7CC3CDBF75DD1743A319D2FC0CAFC903D3
A9ACE6D6576EFFF289271EBF72C59AAE4E99414D87D74A052B78DC807EE20BCE
3B769D010B9A6742AC4C2980E63DF6D8E3BEFBEE8B03C7683B8C18AC5A5220EC
D536CA1653152545650CB4DE243CF06291C85A71C8AE817582E9D095AFBAEAAA
534F3D1515651E345D7FFFFDF7BFF7DE7B43CE7FE560E676DB6DA743CDB162F3
EBEE1FFAD08724AA0C167094C951D3982A06D5620FCFD5649CE8D87372B1A71C
7A5D90100A789052C43FC17EE0A18E3CF2C85B6EB9658B2DB67855F633FCA613
B36213318A805C31DEF5432998A4E8360CC6EF6FFEE66FEEBEFB6EEF7947B426
DD3C84FB9CFFB0C58038D23E3CFFFCF3B564F64D4D4297848847C84C8771D6DE
A87C82B3CEA61AD481C8F0F7DBE417A82F2873312B4855DB2C85C092E8B6399F
BDD88E7F618AD26FDDE2CCB84C3DB09650B3F6FBDFFF1EEC071E653C18F35598
9E3E2D10EB684193F5B3AE386B218A783A996CC7595FD611A5EC252EBC34AD3F
0BE3D1E29411E03B2F7F2126C8E95BE9BAD06F2A4C11100292313288162E5CF8
E0830F6AF381290652652D8B0341FD08A6A57150060EB2F46DCCAF3153555C27
8C172CE547779110D5F4BBA74A8CCD0F514B482D8D8E9C7C5BFE9946C51C71FA
C1EFE3E3ADD9D3F19034915A92CED35E8717C48215F63DC265715DB4CD14762C
9B79DCF10DD53463016C04A9BF0E19FDAD9056435AEB6ACD1BEED2591AD145DF
F8F6F70D97075795566CFE9A6D9E5F99052E767DEDEBFFE7D7BFD961C1C2BE5A
ADA75CBAFA9473F4C55277576B6864ABF99B3FFEC813A114D252F98AABAE3AEB
B4D371736156D0C849694C8314201547C8D160364C4888989C32D1A54C0DE96C
41889A6272534E9CFE0A8B975E406FD10A1C402C36C25F7641E2A5216082BDE2
881CCD0D015C002A058B0167A7D15F2E5B6B0B5CD0FA8930B26C4A6D0C9D087B
09B10EC03F6063300F1057E01C1841E0048FFB373021FAD321871C72DD75D739
1443FC20A6348E8DB9FFFD7E46FBC6668D1FC708469F7436645A5049863C3C03
D37E2818A741A96CB3CD36127106A74C7C115D94C57CE5955762621A2106F218
3A2F5DDCB0DA7161C5A7FA879CA3871F7ED8602CBC3C4CC2246A5A8BAD814CE7
4333994CAA091C4EE1524EADB057ECC39A1E968524F4C676C4888B217A7A1EC8
E8A94D6F16EDD2901A7A90BFFBBBBFBBEDB6DBE2702D217B5FA15C34AD462B30
C266D12982E0264A4BFF949C95C54DC024E64F36475E4CFF62221A142494B3AD
9CC5C86DB263DDAE2587613FE4694C3D1405A5B1DC8F67D2841034BD623753ED
295D2B23F1FEFBEF7FF2C9278DF49786B03E609BF2D4A4B958BBD89F43F46091
E9706A7F9B98DA478ECC157AD1413052B8FEA70B23F54F6D62E927FD0AB24273
C248B2EB797529BDE120C53A8F179BB854F081832ED775E4577DFBDBDF2664A4
9994D5A34B71593BF8C6591AA6ED5A07836A92B15AA5ABB4C1E6B31E7FEC898C
89AE2ED7A0D2D33BA339501BEE7F6ADB83E7AF2C6DB566E59CFE4A6B76756874
F59ABE5D5EAFA9D648DEFE96372F7FFAE98DE6CC9C37A367664F7757BDB7ABD1
3866BF8F77D5437D9D9CA7D9CB57ADAC74D71A4363EEED1C26C42D27BE580B1D
75EC27E670871D7638E8A0832EBEF8E2185BD9466A822747BD24B5236DAC443A
2CE87277F2B1631AF270B396491240A3A5851C7E8CED2DEB24CD1B3D9C11675E
4D930240194BE339EEB5E5965BCA00C23642078CE30B8A1EDDEEE086D149B025
6BF05714BBC4EC1706AAF27292996505A7EE183A817E8EA137B6532C243038EC
6EF7F6AAEC67933CC6A72FFE84DEB1081942F1DB6FBFFD11471C71C619679074
24EE129BA4DEB713EB33E26D00C2C59E8714894C5570103EBC8047D94BE39986
72D1ED4B8B21674772448338F1C413972C59C2E82558755DAEC2BE692BBF4273
7A534ED4043AA5679E79E6D9679F2D512555D6C66F054C82F4E6073EF081DB6F
BF3D1491B298658CB41253E0C4200B83754C211BDB1AD329B6294291F197B4C5
5B0C45C6863435EEB30B0B51A19A267D1F1A45D40347913320178C41EA221AB0
E46FEC6543086AE3CE63768E119D0AF827E4CC10547EC5D5AD6D98A21085CBE2
3A2FDBECEEF685BC33802FC99B26923A8B539D8EE41A430C0D1144A11452C173
A0CF0DD7C1F3D017425E0949602A44580E50BF9CE1B88C2B29D8C871FE90D404
799D156845D4434EBD8422476D0E099B02A61BF2619308B33D885963FCB85701
BF36B330466AFD1BF5BCF6CDDBFFDB0F7F5419286FD4B7F133EB9E6BE877BDE1
AF4E99FF8B81A74375A372E3CDB3462BA515CFBE66C136CB72F35CA2AD3E3ABC
E376DBB446D6CD9BD537323C90B666BC66ABCDCA6B567DF8EDFB2563A19A7494
3ACA23F5A1BEEE7113877EBC44A2CBEBF7148B5F60E15C19448C38C644D82695
190138845E6FA1C82119BA73F2C927DF70C30D9AF937BCE10DFACECF7EF6336E
213975CC31C75C70C105761C11FA318F6428228106B3C554953EBF3292E41330
ED30E4105932F810CBC3C34B8B0240B2D3F8F78E37D852C6D3D522EA87139D63
54A0CC146D423AED70AC082559FD84C2A92543A689D209752A940A2AB23564BC
F8A7197BFE97FB39AC0F94B0E0061B4612186B18772DE69B33FBBABB3AC26FAF
5BBB5BC6547902C221A42109E492CE5CBA74A9565C4FA10F891DB5D524273CA7
D9BA613036BF8AEB57BFFCE52F1F77DC716E4A83F8C66B7359F9549A20444D0B
8E3DF6585D4A0FA3670671EC6C891E128AB4984A2944C1194B227385B6E1A228
1A42ED372774F446C4ECB6DB6E4FE6AFB855B2C57747D16791083EB2898AE550
806DF0841CA772EAC9940CFACE9BDEF4261D3CB742433941CA24CD2A4B3606EF
E3255C76D9657233F513CDAD556F980CC56B6003CE10B78ECB9E4D1E675033AD
1734DB3C780CA525D014F7CDF08DB440ECBF72C163CEA1323B1B11003237C82F
3A07C47FE2E4EB01657A1019A3DEC7268F1EFCE8A38F36657FDC80C89AC06140
347A396257D5F7DD1D97026C6D714DBB642E6A00BC84DD4D8EF74B4DA3C28CB1
64F5BC85735E7C6C456FB3B316AA2B9275C9C6A176C0FC66CFD395AED0D99839
F2C74DFB93058DB1E6686B6893991BEA61B525240436DD64A3CE72DADB5959B8
60F36679E6DA157F9CDBD19CDFB5E147DE7BE8EA6734B7CD5A4733A45536B0A6
FDF39FFFBCA433057D6D3663FCC2463366C68C8D669C75D2BEAD7ACB4C41800B
AD1A6FBAE9A6430E39C4EBCB22721E6FBCF146AA64D0EB5CED273FF9C95FFFF5
5F87095CC2A1A0A9D7D4C50C2B8462E0F542D7724269DE109F5C8FC188C950E4
D560990D39C59E1E96B0093E41DBFC7897C674F4487CA301DDB88D426BF34DF1
65BEE600144F170355FFF7FB1978BA49947D8499F934E27075B6DF594C3F5729
EA304819D079E79D77FCF1C7C728FFB6976306E42ACCB18890210665C112978C
24B6404F3FFDF43BEEB8439F9A08DA681F4D10941AC6CF3AD480369BC6274045
DBD8844DC8A91E385B00B61311A28C8BB3CDC4190A0988D3D803EB6D37EF459C
D96B6EABDDE0134A821D118A6323AEFE4576A4056B0D1AD810EC10F5930B79A8
1466F338AF40B1052977FD9CA60844459907821EB817DE769FF9CC67CE3AEB2C
4FDDA47506FE532C2ED9E264380CA3326F705A90AD6B0733C298F1D16839E78A
58D3182310D39371607474F521C1199428D37EDA69A75D7DF5D5906779DDDD89
9EE0926B3B30D0F47379C4975E7A69581F8219229B0B85E7C826378DCD8578B4
2EF0892D893819C6C38EEB92191BAC185A1E4AA123E9AA8E760D86E174FEF0BC
0F6CB466FBD1D18757858D251D43EDC5FE1D37DEE3A9A7D66EB2D5ECCA5A1DEE
74467FBFD6BDA35ADE68EEECB191B55B6EB1C5D870326B76A33EF4DCE88AD1E3
DE7F729030A955870656360BE14E67E04F7EF2939214C0FE263DC984E98D396E
B3FEDC1B8EA66C5C137463C8CD381B5E206AC8226056F321F6204DBC2DBC88B9
EB22102899CC20D6C1EEFF1C2257953D66449FBC0D1AF032E7871D76D86DB7DD
E6A004C370B716538B7FFAD39F968E9454750575DB9CC47512AC9A44F345175D
24DB54D2495796B5EA9C84014E2E48D63C68B321E56C1E395784D9B769DE5550
1777CCE47FB99F21D89F14471327365CA6079F20AB468539351CBAF5CE3BEFFC
D0430F317B86D44FE5535E72C925175E78214C1BC652936320B28A7967143E4B
AC2F8C2FA7DE697F906939FCF0C3BFF8C52F8622A12111E62EA9DA76C67259CF
EB9FB69AC3143E414C5EC6D2B2E7084D683AF44FD0EE718A92C788C5C192254B
CE3DF75C5237C473DCE1D38C954E677903C579275355B3D7C79B10ACDFF5C5E2
C3A0668B42D7E587822ECA959C0ECC8588EBDC7422A8BD66C115BC78F1E2CB2F
BF9CBD188A20C611471C71EDB5D772665C94DB56671017BC90FD835CC1615CD7
31781A0D7B48737E4A7DC7F538E5A28B7D0C6D262C03BF550C81F511F5566684
6C26360FEBE58576192450137D59C71E6D47151891E5134F3CF1AAABAE72349F
97FFC9F89382C4DB82CFC184F1CE3F450F169B0870178628B9152F13D72F37D3
99F3672E7F61555775667DA8D2E81A4BDEDB99BCA1515EB72AEDE96F74374273
A0323ABBBC6CBBD9AD8DE7CD4E43D78C15ABD66CB3CD765B6DB3757D74644E7F
6FB5926C326F83DA50524F9FE9E81CE82ECD58FD68F9843D8FBD60F1394B979C
3BDC2A39FFA9611C7CF0C1D75D771DDA68D293CCC9922891CE08110D7D52506F
E96A8B162DBAE5965B74E2B410781B6941CEE1089BBDFC50043742C1298D856B
38D3FEFBEF7FEBADB76201B818CD3134369B8BD1E2120123D9B1DF3186CA11DD
AC49DAF982990B62FC37B034FC0982D7935258C7C69C7B4E90C00BEBF7B26D3B
C548092684302938281B9A36D45C31F7AAEC67E98FA4E05477CA9D909419A4CF
3FFFFCA54B971248E0BC3B76A4319C70C2093A14309869E44812276FA6AAD5C7
2728150D394CB41CA2C032FA8CD219FD55DF97384A0C2303F3AB21D2E9D8956C
2C273FE301E2E6823EBA53D9383ECFB8637A1EBD4773021F2E15AD8E8C599ECA
56D2C2436EE54C0E46906164BAA6CC901B6EB881B026765F356F36B26EED9A4A
B972E08107DEF38F599AD14B4EA83DCE78B7BD185E8CCD90E6D71BCAF3080E12
22B3C09D98E6D54B568F4C1827A900C81BC3C048682110A7D14C7686DEE5B704
A6622B586BF4A10F7DE8CE3BEF74659929CB3B2BD5B5EBD62E3A71D18D37DFBC
E6FF67ED3DC02D2BCBB3E17795DD4F9BDE1866863A54412C28F99078998089D1
A0A18894DF51902245AA74104601214A110820214014810405D1608C9718EBA7
3475F2C1506660FACC99397DF7B5D67FBFEB3EEBE63DFB9C33F9727D6EBDE6DA
ECB3F75AEF7ACB53EFE77E868702A7284F9B4378277DEE4DECEEE43B24EC4CD8
72B709F3A02795B5280D8423017FD6CB4887A83E85AF35A99D4B5A1B93852CD9
9E9E7CB9189E5B1786673FFAE8A31F78E0016E00CB593BD37A0070DCAAB56A2E
CCAD38EDD4EF7DEF7B24EA61004484ECAEABA192E06E138CE4213EBAA281A17A
C1371FD8DFCCEA9AD90C460EF9DFAD8186E931C54AA5DE9F98B170D7C2AE0BDA
1FDCDA6786776CDF73D785EF3F68BF2D6B5E3960B75DE77597F326194A92C15A
A1BF156C8F76F4F435E7B6CDEE23734E3DF2335E3E196DD5E17318CFF7DAF17B
DFF9AEE77FFF52336A55CAB6CE86C29AF1168A33D53D51070B259264C41861DA
6D581C189465740775D4093955B19E6484CB6429B9CCA960909A0453AACD4CB2
66BC932D3CAD084F813255EA63FC918F7CE4DBDFFE3609CEE45B18C7F3E6F845
83AA8189A56A27928EC05612AD936F463CDB6E2C6BB220324ED9709CB657C144
913149357A7F92FD0C6949978E915B1773411F82C12B7145504BD926806962DF
659E77675BF1525C81F1062F23BF125E71CA79E3D37148A43156B0717C7E5863
C5D439D90BA82D99CFF19CCA722EA1EA2088FFC16808AA715DF50E09CE243B17
9810346D50D21E40F1B033916A9B27BFA00608D66421357CC3F3CF3F9F51303E
249D0C3C1E9C869B6FBE99C8687BD8520361468F6DADE519EF984F1EFFE28B2F
C2DB72F5BC9735919F72FC7A0F9F7AFDFAF57852E81B18656A21243A5257A374
D494EACC70B4B4C7E5C40897C5C00EB58BB87CC9404208C41D77DC018F154F07
C30AB29EE929FC2754CB99679E09C79077E7CEB3157983437112978AA5D3CF3C
13AEFAF0E80896005FC6A528867CA79F9771C22C7EF622C88159BEBFFBBBBF7B
E28927A8ABF062F5B84E971BBFD2FAD2E8E3A24389E2BD82AA6ADD2577844785
6380ED8C23D74E9B10D0ABA5DD80AFDD72CB2D175D74118557ABD1C4FFBA4AE5
715A9E42FE431FFAD05B6FBD4584ABC2683C33C247AADE076AB6EE9B7CB91C8F
56BD85B3E2839746A52037D66EF58DCC58BEB656EFAAB707F2B34CD034B9B7FE
7C71654E6EAC366FFE9CC48BF7DE6FF9E25D17EE18DC3677DE9C52A9F0D6D631
BF15148382976B4766A83532140E272B2FBCCE5BDF34F9B0D855A98D8DB51BCD
7C1036A3B61706713BEAA8D461BF7866E6F1A70B2EB8001E30F5AE4A85950DE6
79C60F21F4D7AC59C34EB6C41AB92C7824F872A9504C56EECE88073E87ED89F9
240684502B698229E5293F175C47711E4D3565C57BDEF39EE79E7B4E8D97A9BD
A45A1407977F26E8A7C9CA77A67CF94EC73D3ED7A5975EEAF6DEEA005E7B13D9
1D4C166825C006EAEAC9279F544A86F5377FC2FDCC6A3582B679CA0E38E0803F
FCE10F7C6AAC1AFC094C3E3636A34F726844CDC013210D21E8973484F2F9CCF6
4DE76BBA4813165D426F2D59B28491A8F17A02555431EA2299F88E77BCE3A597
5E32599B8E1B6FBC116E291503DD2E8A92830F3E1806293C9D294740E425678A
7017D21E901B92B7C35FBFF4A52F417C63583BF109A8C70402234F3D932D26F3
5B71710C0F73A7647277A56B746CB410E65AEDD6AC99B34C18D033A5B4ED4800
4C795F62C2940FA0123259D522539DF470B1489C493309002A714FA828BD6976
4F75250277986AE52FB9E4921B6EB8015FA031CE2DA57A056932712EB17C1A1A
42C732B00D382B63D5B1D9736C7577BDD910E84D9B49BC75FC4F9D587EC8680C
6E81C190DC543B847CB4DC8B3A3CFC1319DBE3ACC31A46CE0824B71907C9803E
E31E2C1457DD934943196E0526E14F1C3923218C296396E1EDC5519B8FE939BC
ED5421CA12EB79958AB030BE46139A202C16DAB5FAEC43F6A92E9D5935EDB0DA
6A079562A55E58F852A350A99706F24977B955361BDFB5DFAEA506FC8C7269F9
FE0774CF9AB1EBEECBEAED68F5ABAFCEAEEC1E0E6FEF6D8E553C6FA8564FBA8A
C519F9FF7AF5A5073F75079B60D79A8DF156A029D484F952BC81FE86BF484F4E
8102D67F3022CC4210173824C494F6C995575E8913C4683E1685F48ED869871F
7EF84F7EF213952FB84C732E2F102D308E6A279A40E9689346B1045B50B501D1
35C4346BAA494DCFE0890C231DBA246BF1A4003D6F319D44F332E264FC040254
187F166FBAE25B1ACB6577D079E40C30F6CBC14037D4D2D79F643F4BFE709E61
B890DBA79D75C16CA42F05C488BC8AD2BE78AAF2F1B2DE7914114CA731D4490B
58915EB7E674CA7983F8229B2CBD6D3D9738593DFA1D4CB0104F42A24AF2CAB9
201339264A1E92494210B1E9564E0A9F816C6A72577C9B2C0FC99D3AE575AEBD
F65ACC028997F1F37BEFBDF794534E61C2872C8018335346F2A498191F1C1828
168ACDC6F865692FF1CCD0C8F2774A082A8C10F79C9C1893DA3EDC2B500CF019
556D38E56C2459EB2B82A9794894B86E679DE45460C1E00683572E25C6B7BEF5
AD934E3A49D56DAC5A52F188CA6AF02F0C1CDBC6CB7854C09044F00CAAF59A5B
684A77D0FDB9AA22E8EF2BE62B9B942916525A42FD4300B90FE8399418126AC4
0E6230F48AD82FD064947CCAA970C7B300CAA4C5D8C71C730C660CD7217837CE
9AF40A7362E773D0E2D02AA5D2D66D5BF3B9BC9732E2A926880E78EC341BE14B
E45F453F8C02AFE52571D29CF781F78CF6E61B4914C6A66CE6EF187C2D3FBF5D
D9FBE581EA32D3FD46C9AB245B172D195BBCFB92A5A1F1F7D973CF5DE72F2C15
72D4CDAFC5854ADCDFE70D5782AE755B5B8D7CD760B4CD1487FEF9B86F045152
AFDA092FF7F48ED6AB5E62DAAD569846CFB1462CA450A717B695A7B676C1FE44
BB33482DBADFE5CB97BFFCF2CB6410C10BB6141C62653BF180BBEFBEFB6BAFBD
261CB371D87BB8A5F11398A53C984ACB898866CAB3EC391DAB5C6A6B93B145E9
16847EE0899805757D024587A451DA59EB4DC57FA63C8F91D3AE47B5A8262B89
571598EB0774E02CE423EA3BEAE887D9FBCA57BEF2A7DACFF83ED697725515B8
10778A23511AA8B522440D79B44C0AE20AB2F69104B9C21EC5AF9813F29C2E93
26C3DCB38E55C9A18E1745376786F3A00E1FE393E3F641A4C52D1C924BB0C708
0F9509930C2A6F217673272CAC8494DD77DF7D10611A37A92E4961846975ABCC
A67CB97D8FF9244AB21F71C411BFF8C52F34664C19B4026699D33D6B866D5057
1D1BF53D0B3EC9974B14C13212D9E07E273C1EB498F8D4A436A4E69748723BA8
749C1C57FAD031E4CE935013E48934AE0CB926595B445E9338332E0DBEC09D81
9F7CF8C31F7EE69967589D60528C390B8CDDD24AD38EC651A729843936097BF5
25594DA98B94704343843CBBAC292C0771AB9998D83053D542B36E8B6740AD75
445E82CFB54032095D2654E64578473EE9AF7FFD6B1A5978407E3E9EB13466C1
FC055B36DBAFCD9E357BCBF6FEC58B17E316D4D65EC630415D2B6B54FC1FF879
29CC57FDD8CC2ECD78CF816326EDC08C096F15C2D2E0586393C91F9C3FF8D966
B3686A03B37ACBF3AB27618E766CDD74C2311F9F35BBA75A1DE99DD9F5FADAD7
E705B30B8591D81B6E9AF25A4C89D7B7EECDD5BDA5C6BF7EE1B64ABE12E1609B
10173729255D18270A7F90DB8E96292787101A763BE12E65040FA3A52660781D
1BF2831FFC20763EC308F4B0D9C60EFFAA42556BC14417A50F3E6101A3385C19
9562A2CED504DEA4161AFC5C81668A5A061219EE6789BEE849B86A2E71AFC95A
C4B0B85D6C310C647780C83B5E8C72E0EE3004EFB9E71E6A26EE1641C25C5B5E
D003A901A1BA59D749440CC51759F4FF24FB39CC5A1373C002404ABE437F7335
393F6E42D864FDB7B9AC2B56AC8063076D217C916E87EFE387071D74D08F7FFC
636DF829E78DCE077E8547C6A5F0ABE38E3BEEE1871FD62A8F3760E3C293794D
E00A2D6787B326FFDA957DD38D80478ED0208C1B3B9B9B987829FC89C06A8AD7
9DDB02C6716F29A76840B1B48FC9998EBE2B769D8686ED2CF76FCB85A969DC1A
8F309A4C4F8AF56CCAFB7283F2F8A9CB072EC83EC6F40D99B62222A2E33ADA52
5C634CE9F1C71FFFED6F7FBBA3C04FE28F9F53FAF3AF24A2F8C217BEA0DE17B4
8519EEC7C6553B0121FF884FC094626CDB366FEEEEEAB64D5A1AF5C00F20E678
472D2E7D2C2EA83FB17D101F5094EE5466AB56AD72FD3055D57778D37AA9E81A
1BFA91471EC1D3611E98A3A3027305071B3FA913BAC938CF2116F1BC04FF3088
4403054F5A1D1D6BB69AEFD8FF006CB00D1B37044E05B8498318ACF79115AC24
C1B88CF34CB7971FCB1BFFE06585DD16B4ABF556A3698AB9B85DCD57AAADB165
89BF098B975FF47CD808E2EA48FDDEBC81182FE74CB3F18D271F2ECCEE7A65F3
9BA3517D8FAEB9B56864CDD6B7B635DA03F55C5FF7C26447757EA178DFB5D799
AD43855692F372A3A6852BE762AF1CF949D9CA14D843D833B49D4F3FFDF4BBEF
BE5BB2C3ADC3320E57A5100A9887FDF6DBEFA5975E524DAC1A28F2F1D59D4DE4
B2AE90750BF1581F204D2044409235539ABCAC54544956A5CC5FA9D451DCC89F
FEF4A75F78E10568F124239253FE8CB81A2969A1B74D96419DF23CF2E4329642
497AEDB5D7C2AD1173A79BE99529A334861E842126EA0FEE3DC6F4FF84FB9907
8D7DCEB1BED8C9309B3EF5A94F3DF1C413D40A3AB9C4E3184771D2CF203406F2
0D7BC0C57CE32790E33FFDE94F594446065652F809C339F9E5E2BE4C5AB8CE1E
8BE3FB81A29056EDB1C71EFBE8A38F92AB44B41B8431715E048F314EB6C72578
99FC5280929B153BE3CE3BEF64E899A60D5D01EE21EAF6E93401E3981A123F21
9E0C033BEBACB3E0D9317C4C54C09A356BF0F943FFF4E0B1C71D3B7BC64C5B5F
3732DC9512D81A8706990C74D3F56426719004933C3BA1D43192952B57623B12
21E02288DDAD3919E0412DE267CD25A4565DD23D33510D0BB5255A957DF7DDF7
AFFFFAAFBFFAD5AF72DBB148909635C40AE60413572E95ABB5EA9CB9B615EDC8
D8A89C44C6D6285F64DC09F2E84E02B9577965B75CE38E3BEE209BD5E493C3C2
4BF6B3350E2701EE423C89CE956BBABA0FCEAA3186CEA914CF3EFBECEBAFBF3E
CC5EEC4B35363AFAD8A38F1D77EC3126CD8850D3B38EDF458E6357B341AEE790
F7D96769B77AFDC25018F51DF59EE19EB0588BA21A8E72E8F983C9C0C272DF60
9CCCA88FEC28CE6C7415FE4FFFF3A5726292D883D9E9E70BF566F3BC1B56BEBE
7573EF82F95D8DA859339B37F78F997ACD4F211CA37EA15E88B66FFCC53F3F91
1F6AC012AEE73DEB1334A24A62C69C9A4446D25987C8F7B45865B0334BA9D88B
0B70A04F4F2B84F64A94354C75E9C7291319B2A039CF7010298B45B2E656E474
444D3BB034425E421BFDF18F7F547337C22B556C2CC75D14E8D2042AFA3BF0C0
0321C8789A20F52013B973A63C8F0C2C4B86FA591BC40EFFDBD5047C2388A388
2E1873A3F86264E9861B6EB8FCF2CBFF24FB995A41A0127F2243304F2B578DEE
02058B404126D3A6500918B30B27A314C2E34BC177B0124C396F02CB2928C43B
AA7B8AA7A831CC13DC58A619B12BBA8D0A68DD9A4FB9843BC9F0A8D9375D303F
6D668411D05190C714653DF03883935F44CAB3E6851127FC561E25D3B6A2CFE5
4FC66D1C9C964A17A343D6F4F0C74F91A66FB7DD76833C7DFAE9A7A7BCAFEC23
39E0DA64DC52780A32B9AAF9498726E09652148E36027E78D965975D74D145BA
14815842ACBA411EE5DB1540A052D4DA2BA0E70AD37146A920E3E384F115B53D
073E81A78613FABBDFFD8E3B4F65B772A85DBA8E242B85D731E0F3326CEACE18
F7A2A26D0266F869A308FCF5BCF3CE83EE140BA100634986FDF5B2EE78828824
59D70721C775E402CF8F93381F8478BA30085B49AC0EA9C2ADEFBEFBEE586518
A7D4E2B2AFED249BB82F0A07FD66CFD17F369C54F351CE6FB41BDDF9A4D65B29
6F4BC6BA43AC58657470DBEBAD575BA616FFD9A717BFFA5FAFD6075A85766968
47A331D8BCE7D1EFAE59B7F13771BF3F5C18DB8493D234DD3B46E2C1309811D5
FB76CDFB8F5FF1E54213ABD04E7ACA51BDEA457E4F648653D1A4DE236A9F2936
66933934507E50B7949B6EB89FDC3EC6A996126882348E784658782FBFFCB25B
04236CA897150F1F71C411BFFAD5AF845D9E4E13B8E2D5CBAA76A0BDF0F3679E
79063F219BACDB2FC1ADC2491C7269AD2F594CC8E6CBF15F72C925B0E7768286
1439BC688EF8435E5CE2BB03B5E1CA749A35E487370E7B18BB71A828F7FF713F
271950D52DF87733F6AEAEC2368006BAE69A6BD42DC0E5F231194482507B5D81
CA95B916715BED447E12D242039AA17E575C786EE311F5C072954C471F1FE1D0
194FD0C2BC1D6F9A98A06794864D0429B34E3DF5D46F7FFBDB83030310CD9882
9151BB89C3F424337CA1782E5D10118988D41B6A0DC6296109260BDEA9BD9110
086E6A051721484E285A3E234B88992B53999514A15BD1A3D9608AF5C20BCF27
1880F3363808210E93BF554CF121B3665A92C866AB3977CEDCADDBB6CE9C3173
FB80B5D3E1A9E06A548DB4AAE85A3151C13A78EE6937702FF4B7F60721804C73
0919E96E2F6D7DFCBB64C9124C17D5B0C9BA20703E19B5834C6793106E77A5B0
A4E085F5C627679C71C6EDB7DF6E176E6444F685483E60D3AD5FBF9E4FC77E67
0C50AAC3A8C91245720A19DD167989C96A0029F544CCC944BD68DF5DF22B9325
42498449B795139B648545E4C42593819B18EB3233467B070AEF307EAF658EEB
090B71908CB49B7EEEF07CC5AB265B93E6F06EEDF91B9F5DDDBB6BB2F7D1F317
EC5870E33F3C33AF111DF1E707FEA667BD5917F76DEB7AF765678C353636EBED
7AAD1DB5ECAD7381F14C2B4EA09C663D7FC303734ADD5BEB23C5382996BB06A3
9AD788CC54003385B0244CD5C2850BE19AA202DE507970A2DC9A09CC39330198
6D8598F139B6192BCC295FB8C35D222F063A602590829FC3E071D05950BB63D9
2B9209534A2279C61D2117B7DFA412DDB409D84E874E39943A6B1D18CC119247
A4E5EAA4C213A14A059386135CAC1DEBAB795F3CD739E79C035780EA53901E99
1AA4DBC190945710691281464AF28B558CB62FAFE06564361D785657045310E9
D00938A7ED21103F1D97F14B25F12CAC6F7F7F2ECD19D8B4104E284E41ABB5DF
FEFBAF82979606DCE0EC7775778FC24BAB8CB362B0D3F21B6FBC01778D49110C
C0D2FB738EF6D9679F2F7EF18BA79C720A0B2544DE4DFB4B7C06AA4272230C5E
D623694A4D807F19FC828CC0BAF2645AD84430CE0A1941F4A7117C6BB4C4D1A2
342E8CC1616AF6DF7FFFA79E7A8A52927B45BCD966A24FD4613270C7487B33B0
2E3676EE48710D528642C03DF2C823D4DB8A2A08D12F1B59F461975E6AF19DA9
0886C5EDA7A1F9EDC562BED568DBE2A01DDBEFFFE6FD30E50606074AC552AD5E
DB67DF7D5F7FFD75C510D5CB421B45BC5D8C990A9BA10A3E824618B593FD8E67
5496D53561B40484C0AAB49876045D0A2ED097BEF425218085B76118CA4F99F1
B9E29ABA2BAEB80256AA443F7117EC0C831FE23B0F3EF820361259B4882C20C7
9698BDA9E72874B8403C81CCA44D0E0FCA1F5552874BE0C2C0F186305FC908E5
8A05223CEDB4D3BEFBDDEFC212247129AB700BA6AB51189DFBC19E516F386A98
7C0C931D06A7A90D984A5F172CFFE6487D91B77CFBF3C35E6F7B9FA3F7F8ED8D
CF6CCF75CD894C756CD5A2D3FE7CF80F23C97F45BB7DF63868EA3068E70BCD5C
3E365EAE15959BED4A3B82BDB9FDE55B1FE9098BC351BD109B5CB134EAB5CB91
5F6B35BD491588F2C64C56556E3296A1238F3CF2A73FFD29E7B0836EAB63F595
44650BCF8F7EF4A3BFFDED6F313F2E470B2787F3A9303DD34BC26163183093A9
84BC8CF6913A983FE79ACA2F9FBCFD3A3401AECC6809A3BB5C445C9CED166834
E03B279E78224E22634AF4EAE44F73C06A961538CDA275AC5CD7470217C79F94
9FB82066F2FBDFFF3E3EBFEEBAEBCE3FFF7CEE67EE4C55AB314A83F7B82F06F3
A94F7DCAA48138D5D8D2B1A02989CB8A079081567A00536A022F6B22CF6A384E
3E4F1966F26FFEE66F60251B8753D2B541F165D203DBA736090E6A3ED5438424
5114E3D61FFEF0877FFCE31F6FDCB001B214C2A1064111D8FA155E47DC186EBF
1A3B63AE82E28CE3513FFFF9CFC34DD3E4724CD4190A6B1A2728E606E93AB602
D3002A2CA4E76E8DFAFEED506B9EF1129310679DCFE561447FF4631FFBE52F7F
49861C78F4D05D2E56952F25840516A6D4661512DB4249E5321E85FDB4EFBEFB
BEF2CA2B4CC672C10287769F3B952639450FE6081BE5CA2BAFA4899A64140EE6
ED9E0D7032180484EB035BC39289CEEC9BB565EB967466EDA3F1A1EC4948E36F
2C2CA439C62DE2428919FBD6E093ACB5ACB8252825D5902FCEDA494E1954159E
9A8DC2E988A8391F7B1AD3A337595F5F3E2904EBA5E94B7C35D2BEE4B2679C9A
A754EDDB5C27C6C5AA13C2CC1BD180C0BF4C0BF3AF34D93A2A0AD5F9920242D5
B07A52156118A79539360CCE89CB9FA1D0B0B622F51C63323857E79F79C915B7
5D1C2FAC4140CF5B5082453F3C5A0F0A6646CEAEE9986F4686CD8C60F6C08B75
936BFEAFB3FEE2675FFCFE4060666032F2EB3F70D171BFFFC1AA91971BBBFD7F
9F186E0C15FCB8E0B7FDA4D18CA3A6976BE7CA7158EC29F9AFDFF15877BE3CE2
4715D8158157F3DA9524578BDE56782E3847B84C7A818953938809C7DE161397
22EF248F634D59EC90EF3262899F28A08417AB820E3DF4509C3293315011BCA4
DD887F7FF2939F1C7EF8E1325155094CC3DFCFE8E2DFFDEE7743CDD0AE22B078
279A00C790E96B5A24D42B7229F0271E40425AC990E1675DF9C4214AAE0885B2
19DBE1F1649D265759659E82B7C8CC67670BFC8965F9DCFC449A48F50659F30F
6D459727436DB5385DC2BCA9644F699BC99A60F26975EBFE781C38CF849F3292
418541BD0E296FFD42CFCC9D37CFDAD6D80069B62C4C0386D5B1B1F90B1658CE
70FC3CE3D3B4C663FDED0630B829AE0375883FC125BAE79E7B6C11B1D8B789B4
C12C271907963895942E27CF09275A79122585CC449FC038C8198595D4980D3A
2A31198B5C5A13542C585C87F13DCE3B5791B24C6D6C5945E992D0054EC75457
277594530B71C1091553B9C9B21D181884889752C532C1882B5021B93A40728A
B627C39AF839D69EAE8CDA0F305A259641423CF973F6ED8354B55655D3C650BA
525CA94D82351A855458877E205E789E3179636257571492E5851DF14D49494D
8E106C1CA708B32888B963D8A7090FEEA2B3680332304DBFE1DA6BAFBDFCF2CB
2BE90B9B9E5B9FB87526FFDD3C878C7738286C2AC743454F02F346674B9BC735
E455B749A784D139E5B469EB89A64D382817F42203D62D633669F2C0520234BD
286CECF317BB6D6D6FDC3E5CEF9A018959181A6CCC2C87D5C176D0ED55FDA4A7
5D1EF87DB57741E5C607AFFDDC0117D40353689A28D7FF89CB4EFDD1233FAA6F
ACEE7EDA07B6E7927CAB94AB77F963611CB5DAB9E1A43C9C94AAA5F61E6FDDF3
DD52506C1683EE9637D6A8B7BC76A1EDB58309DC885A3B5939F4A8281166CD9A
75DE79E7C1289135A09E5F8CAA992C07CBA9E3CF313938A158D0952B5732062D
4272D12450D7D2DAC05DB09F6120737E1854A46942A79C611C26DEB9FF692026
4EA3AA9D68028C878FC3251335349D7E76D7B8FDF6DB4518C75D8A2F60B9D9BD
CBA49DE994FCE7D6C5E2629C6CC5A1FA2785A1DCE24437B6C6BA7DA6E8F15CB0
7B70903106FC099326FFB223F5681C6E707C190383C024E888F34978249D839D
44873412A24589FDC5E958B162058E95C95C67997A148678EAE5CB97BFFAEAAB
445DEB522C9F64883B5F2841865827208B0BD93DDFD73734B8439010B7530B56
FC1FFEE11F6C1334712A2559B106B590FBFCD454B404199114AC48B6AADC5233
D1456058030FF9FAEBAF9F7DF6D977DF7D378D8EC0F3E107D070A62618379FB3
29730397AC8B93EDC0757599095CC89DCB844595460D7FFAE9A73FF8E0836497
15085A892C575BE098E12E0C6ABBCFA24D2031C7FDA7D437CFE77DF7DD87F9E5
4A2B0778F5D557DF72CB2DB8A3FCFAF17ED39532B437B4792BB3144AAC6FA8D5
C582D7CEDA992A48AAEDA5789D5074AE4A66A2FE8C33CEB8F3CE3BD952839B46
ABA62C9108339856A2D097F3C4CDC05DCBF7244C1790CC4B89BDA01E2EB8E002
DAF8DCB898107C08D7EA80030E80D855B08E8314EEC08D6EBB7C47EE8B0BA12A
7CAD9A1BD7FED8C73EF68D6F7C23C9E0ED221CE55E82322633078D231C3F9CF9
3933176C1BDA64CA668F0FCCDF54DF5C4F4C313405BF38D0ACE71BF9DE193D55
6F241E88ABAB5A0BE7CEB8E9DE2FF744B9F77FE01325D377F98D970F26F547EE
BBBFEE0F76FD65F7681F9EA7AFDC9ADFD59A9B6B553C180FF1682BA9E7E3CAC6
077E60EB38F25E975FACD6EB719814DB5E2BF03BD480043A5D162F23D9C69211
128A0717DBB3F0029861124F9A2CAFE876FB62192DA5392F485B5E49662FA3B1
22472F7384E49D3CF9E4939F7CF249D63A312583DD48234C7DB5F09DDB6EBB4D
3B0AA375CBD727BF846E12C5A94492A0102CA767C010B7A65ABAEBAEBBB0B5F0
A45FFDEA5789198539A5F40984F221871C02EF84AE673BEB412B1B4E614F5C9C
ECF7BC69478B0217D787F75FFBDAD7B075F9D4EAB488537CC51557B0598DC9FC
547A154CA5B84DAB266B02CA43C1C479EEA40F088F66C193DBB25BA11796CD2B
34AA7F29AB71C13DF75AFEEAEAD5B3E7CCC1F537A56980BE94DD2F178E77EDC5
65B91918A6934E1A2F12C1CF202FE039C26D7CE18517785D9C1C8C1B261B0F15
6D7F2FA5C9A637401B900928EEDDC946815BE5B4FFFEFB3FF7DC73E3B875FCEB
F99C6228003F4580047E10E6738A45B20253320BE381EE952B40952074142951
376CD8C03A350E18862A5785839754D501A08B6DB2BA01CA56668128732910E9
1DF3D46524D8E3A1D80EE1552C17EAD4A069CACEB60FADD7172E5AB46DCB56EE
3CAC0ACF15110BE90A98729A2BB6DA0B7F4AAB79E3A6C503B05DADBB95B9D558
5EC0D039FB57F018BB72D3CB2A62185893A7427809E324F80EF4162C9120E3B5
C691F8E31FFF6826B5D57EEAA9A760B241DCE3DF279E78422DD1651E32EA42F7
C53DE42249E553B02286DC1BCC46F0E8BA91469E16C1636046601DF186CD1BB0
0730B18C8DD2033369BF5C5761F84EA77233A92086C55C3433878646FCD08BBD
68E961F336265BF27D264C72F5ED2D7F9129548BCDAA198BEB5E2DC86FAA3436
D40E7CFFC1977DED93FFF9F397FD70269EE7A1FBBF35F6C65B957796ABFB8C25
73D30860648276A5D05818561707F5451E4E7AE18D6D8F3DDB1C1B6B844921B1
A44349684A6DBFE11BD727700169B031D914841167BABFEE2370C26927AA0537
63B69C4966EC71C2598DE139EC610CCBA87F3D4439842C89D878E2082FC10F71
3B1637D1F2A35455F882679F52520CE73BF1091415A091CE0B2A0648CD2DE343
94F8ACFF60045258172508F18657C67FEEB5D75E3096C5FECF9026074C7BC5B5
3612A7E0DF647E277D4756817126B1F1B049E42EB3B887A833623DC9F68C0FA9
51FEECCFFEECE73FFFB9719216534687449B4A6782C152F23275D4964B270992
C3B20FBC819059BA64E9DA37D7964B6568C7B33E7F163E5CB2EB92B56F6DE865
F7F2560B3AC0F644A956F1268E1A4216610064F7214A1B4F67C591B4A21A4F8B
7812973BFEF8E31F79E4119312C0617762C7E0CBCC9813B00F097BE491473EF3
CC3384EBB9CA40D34DCC86F6046FE4A7DE405F6FDABFA55EDB6DD96E6FAC79A3
5828D61A6F7741E06F19B35ABA74E9FBDEF7BEFFF88FFF801C21DD0DEB631930
1172603C283691CA42FC886AFE876784C85BBD7A3535301D1DB69C24F5074527
7E0869C8A428218CDC8269D668837AB17290C4681B2F9E917607133B34E4F7BC
F9F3B76CDA2C1B9FA9B9F18DE8997C4A1644679FC1CA06D4AAF1784D6E7D2F65
9550208E9D952864B9C324463BA273F813C5018F96EBEAB9EE94BBF9C86AC7F0
02C6094F0E3E3BD506030BF832CE0006E0725C8BB49CAC672C8BE5E38800190B
F7DEF7BEF797BFFC252681E44B3CC9975D76199C45669E45FBAA8479877B4E94
05BD10B6E7A6BAE26E5195A9EF109253D0B0845B59877123B4A7BB3E5A8B93F6
AEEF9D539D353C1037A21133BBD4BDC38C94ABB9D1ED2D33C378257F4E7BE1D6
97B79A7A73E9FF5ABCF68D75068711AAE02D2BFA677D608FED73B7CE9C536DE5
DACD82819F6BDA5E585B5C692E2947F35BABDF8C7FBA0A0A7EC46F15CCB82680
4F00DBA7C38713E51F0D26ED1619B6EE5360079E7AEAA92CA0A138935C939171
D34D375D7CF1C544E2F11029A2AD1C8378D71992669E53FE168E0C3FF19D3609
6ED74CA1E05502FDDF6A02933985494657C77DC85526C0011B861B1B4FEA7246
090E8B2D8AFBEA821D794A951F9A898DDE145652B852C80B52C0BA1D6139CFB4
74E9169F76DA695FFFFAD74D563B26E3039340FCC585175E78C71D7788AC7727
D121F6AC3DE288235E7CF1452A1B4DA6CB43ECA6284CC6504945D2DBDD333C32
0C356043CA6926F2B1471FFBE4273FD98A4C4F5A328563E0A59622F61EDE78A6
FD36D7560A02A6B3454D6F833A7E460A6D26167CF30C73193871DA01EC5D237C
21FE930685990645EA4A4C3DE1E245BB40A199143F0A21F2977FF9974F3FFDB4
C58626E33725068E479A447D2C7FE34D79CE955D11EDC901071C000945B397A2
4D5E27ABFEE83FE23FA1579E7DF6594254B911F944EC46CD6CAAA4A43A197015
E18ABEF8E2EF89642506941BDA66D2A2B4D6B7D1806E810EE0BF8562D1C40921
DB49CA368A9D0727F7EAABAF6E9B848462C303035E7A42C669C5A2987E1C9F82
92EE9C73CE81C4C45A1041814B710FE9B44C4691426E1E78E081DFFBDEF76474
0BF725882A29B2F15C34DED5A85232889D2F19D613E98D7C35CA143A4C471D75
14A498BCEFC95F231C45A1FF952B579E77DE79E4A492CD284097CAF10878E0C9
84DAB8F5D65B99F2650F5BCE8F7C3BDA9B1210AED32635A0D2719C220FB66960
5A30D40F307DCBC2EA8E76B1511ADCD69A5B58DC68D782A5AD1DCDED959609EA
C6CB994AEE1D737AF26FD5FF4FAED208D6997263D9A672BEBEAB176EF9833FDB
330B4AEDBEA41DD64D3309DAA69498D1072A958D76BAC67CD31516C79AF5A410
941A49DD9B00A6941AC0E00F3EF860F8E56E672E1A2B2E5E5351C1B3CE3AEBF1
C71F67218B402F38E4D75F7F3DE6560CF56A81A9C32B69287C042D368620580F
CFD48238EEE585BB057124F157C9DE74285233910C8E6149E2834F38E184471F
7D9448273C239CD433CE388352C2649062F17DBA012549798147BC8CE28D9792
3F4A7E17F620C197796AFCB437C38F7EF42372DCBA06BBCABC459DC4B484BAAD
F1E0605434B3B8AFA48C95EC99AC095C8C3B7E75E28927DE7FFFFD0C153064C4
6DC9266E6EC9B192D298041BC509C2A1E1A1EEAEEE91518B10B55097288D7604
367102F9D3C3321D1E041B8369D22160D644F5BC1C1B6330E3F63B6C64C850E6
21E9B3332645A5413E51B79C9DF84546B8B4D8EA022A0804E433ECBC7476ECA8
B064100890E4EDC48E8F38E538E3FEB6DB3D6AFB69640076B1FD0D341B14B50D
2585BAB568FD6D4BC8B151A543B148CC6F734EE9698AD5874838ED279638D098
C5D59889EAE880EAA5643B747768E412E6983EE69B5E2678A5F9D2C3DD522324
6EA0F17A28BB5FD92563A85CC611AAF7F5F50C0E0EDFF7CD6F42BE33F4C1A3D8
6102CB5AE4BDA6ABBD147E992BEDD249D1DDF1B36641120126C3054980F2EC71
EF2A40E9B21C1BA7ED8F7148A5DCBA24DE5A03204B1ADD358A0C9E135A7F82A8
4EC79C35DD4B66573CB1B72239BD891065CC9DF57ACA859889566D21DFD56856
3DABA093B9FBCF492AC94832561FAE752DF2DACDC44F4C2117FA3695D28E3D63
A727CCC52DA8EF24F4FC2831CD284872F9B058AA877BE5FC56BCF5CDA8345278
4F5F35DA6442E3174C7C999D2BAAEA206B27E065F544F890054DAEF4997A7DAD
0B6D82102ACD8BDBC98D37DE78F595D7D8486629EF62FC495F8C6D3C77F662CC
7FB53EEA199C1D2F3049105A1F6BB8D6320956B00D6734F0EC3F499C2E7AD0C8
001C9E497CE7CEA9F5907E8095F732E5154F9F1976FFD3CB387F44D902D9F7AD
6F7D8B747BC24148D5294FD951C42AF0251611FF897574E9FB25C17952848B65
629C6CCF64F46209B46A895C496DB29E3CB40BD98A871D67F1A7152B563CFCF0
C36EF7376E7897BF44C41B53022985441212043F878CA561472F8107077781C1
873B323FC46A6A59A20C9C26514C0CE88E811DD94EB6D2C9B26665D41A0246FA
BE6FA679B941334F3116F73C9BAC04439D28689D3182C183B470E142A853CC02
AC752800F5C1C0375961E4B64351A677DC45E8AAD433590FBF941057E8771881
B18DB1589166C367A3A3B0CF9BB5DABC85BBB057BB4D67B169223413AE90C454
98BC2C341374298727CCB2C988BC310C7E998FC96A7BE1F1DDB8A190AF345185
8056188AF69967DECE90130A552804E2E6A3A74916D938B24975CC1CD4401A80
82359422051B2D5E90D515B43BDCEE74DEC4D7746C1CEEAEE57960D08C351FF8
15240E513AFC3E4E144D6CEE7E5AF47CAFF42335C184BDE2F418E15F695CB00F
3B6FCD181437A2DBC78DB34A1B0ACB74F8E187FFEC673F8332568EEE7FA40954
A9243C315D280CC9C5DAABD1AEEA924C9674C93C1E7839B946AB96EBF177D963
9735AFBCB5E0DD0BEB71BD59DA61719E51DA63C64B85A067FCC0CAC5B86D5302
794C806F29E5622F847A28CF7CC7D01B6F95F65B38D6FF66F7E868ABBB161DD8
57886BEDAF26020D13CB20514520B9164815FB533E6F772FDCE2513C76CA2215
B59BAD28B6508B2048E0595E70E1057BEEB1E7ABAFBDBACB2E0BD7AFB7794243
C3CBC70C7879AB3F52182506EC055642A632DD3E9125CFC03783461B1362F079
A60F30B761BA28F8A1FD534AD1947EEEA59A2CD95905D9949A80D83FFCEB0676
F412B08D50516E2709E50E349A5E6E8E97871D22028BCE923AE60B31BDD75C73
CD97BFFC65527589D85C77548C54FAD8B5DC1592A525A14A859B6FBEF9A28B2E
625ADB64B5602E1DC074F3134C6CF4E27A3990EC787C8E10E626D1AEDCA82E57
6B5ABA186ACFD8A4D7E8786837C8E225FC957266D3C98DB757CA64AD8D191551
F300DCF8B0C30E83EB44DBCD389073E20492ACBF3915FB789D5B6A8C43AC3092
6319482A7D038303811FA81D0ABB77F60F6DC33AE78BC52639A720EE31F51874
324ECC446EA90B2FBC304EDB71ACDBB459801F55B1E39A7367CE58BB76AD4A39
EEB8E30EB8961D951D8C3833E670F6D967C3FD64001A8FC9351E4F5DA45B96A9
303CF5C68D1B396085B95DD01424488726E08496CA39F2C630356F320563392F
4B9801A8D2529AEDACF317498669637E4284ACAAF577C36E727EA73B810C3532
648F7FF120ECF44D0DC7E6C3CC67303A4CC12D2E1A57F4BBCC74AE26102E9307
F5CE3BEF3CEDB4D3786B46F314DA16E48C263F5D071D5DCEB98846A6E37D9AEE
C5268B02D53CFAE8A3C71E7BACFEC4061594200C72721E30483CB574BF3DB1D6
618D31775DBD4598D026ADD55F7AC8B2ADA535F64445310F298C623E3C04556C
DD03CC8FFD3F16238A2154FDAEAD85FE77ED6106EA73FDD933DADE2B4FFFC2CC
32E6D825E57BB731128D6130516FD2A8081512D6087A71D9B265988A9DB3BB63
D6532CA0F5696C72ABD55EB264C9EB6FC0FF8622C4A5B0EBEC35E7CDEFDBB265
70EFBD9786F93A6442B1942FE5731E86DC6A4456B3C53B8647ECD9895A7655AD
DC0F7CB81B493056B54B0FFD02DBBADD329895F11D0DED113390E567C38BCD4E
5F93910B5EC64BAFE2762A45F5BC6252D7E53BE00683A8254D349D3F6E48F560
30A903CAADE5C2C9E410507970A711364AB1C0BDAA069671465ACE9F2B638A2D
F4B9CF7DEE861B6E2025140511230414CD6A354C05E09243748083B5B28C4189
30152FD8D384E1D17D113DFB29A79C42209C8BAE36EA04DC6E136C990B738CAC
8CC70CDA2DDD482777324D72C7A80CD926147374AB1EF863D10910602B9C861B
50C303903C408407784F9245AB574D9E24DD8DE644DA67AF95CACD142713A5C5
F7B81A76B417546BD562A158CF3A0AFCDB0FFFEDAFFEEAAFE08977A7397D4C41
39AD2383CD99EA8F1A45ED38CD4ED6F68B8911F50050241103C3D74833C2764E
78040682B024DC5E7A51E88BAF83EA84412A2ED084A94CDFDC7EFBADE79E7B6E
6AFE373809FC49ABD9ECEB4D1DDBA141BC214E77786478564669C7DD49BB463B
C96475A7EE4E9A7245E9F952DE61721E78E001E83C2581D9ED800D0674659C40
365D223A45CC651D9A800310E1920C13A1E2B801B467E451D18592252E1205B7
385CA1BC9DB4A99A4EDC68CBA903142670E5CA95975D76197BFBB8D5D72C1782
CCC5EA6B95E91C847E00AB79AC5ACB17C35AAB5DEC2AD4AB8DDC3B4DB92B1716
C25684498BED64182F6E475E984FAC6360E9AC93D457E07AF424E18E5CA56BF9
BB77FCEF4DF99FBF31DF2FBE951B28BD7B51FB375B39272CC765AA8CFAD5CBCA
A0E42EAB7862AAE70DD22F584D853DEFA507269D4033776EDFA6CD834B97CE99
3D7BD6EF7EF7F241072FB516D2FC320CA13007B111B7DBF5C4BAA4891F782355
AB094C4AE36F18DBF7421B3D6AA75889566BAC5A1F1B6D0C8DD4C7AA4D1CD95A
8BD68A17F8B971D475D43649E4196FE7ABD3A109E80051CE62B72C5DBA14FA5B
7C537ED6018DC69680E9F020718298BC24B8830149189A7FFCE31F69BCEAFB14
A06CEDF7FDEF7FFFA31FFD28D34B34E4C5CD45C36E3A9FC0255F22AD1059254C
8A1381DA265A1D278BB4DE8C8E72842E2E6832AF4647AAC0A49619BECFFA59D1
EBF211442E30199425836CDF7DF725CCCF38E56FA2757245FFFF8DC3ED29FF43
431B2F0676DD2FB94FA8D3CEA25C1C36CDBE99487B9BBDECDE9D337BCEB6FE6D
A5A2F5DF87868720E813BFD5C81E3248F3906C3359C917C9B3469E062C64FFF6
7EBC692638008D7C5A48C26F16E1365AC6ED2EC6FD698DE2734A19BA6C340D5C
0644CECB9E7BEEB97AF5EAE38E3BEE3BDFF90EB1287C2EF5AC800ABCE28A2BE0
91F0DC12A926861FE2FD3AD6D81B2709F1D8C3402169C688BC2C90072B939059
E803CB0119B585EC14F7116FEA1EAA8E3CFC4ECE1EE42C06496D8DDBE129EEBE
FB6E1C2722A6E5C912683877EE5CEC69C5D3944C36595A9EFFE9659D3A4CA68A
148BA4ED4F838847420119022AD44D819A80E846FC96D1AAFF96A560BA179381
54F9D237414636EEF21B2E58B0802A967951FCCBC0A06A4A71E34AB154AFD742
3F2C964B43A3238562BE3EBB599E1356FA8A118E64924AE718F6A35DDF346A12
47B1B1068C4D7DD918673D32CD6DA65099DD78BD59D9EA154CB0C30C4277C064
9B4E13507E313F6C1CA6F4299FB790AFC036B2BC26BD3D3811955258ABB5FBFA
4AB8D8C040F37DEFDBFFB0C3DEF78B5FFE7CE9D25DB12CAB5F7DB9A717672DCC
E521FC71AF26F401B442AA1BD2798E33DFCEF3B9D05D05DBEAB5D1B69A60C7E0
D8D6ADC3FDDB4746471AFD435613C43688142626ED0D9EB42D1D6B326D672A33
153A96DCE026C39861E3114EADB6282C8CA2B4214E9DB60BC3983220B8EB6898
9ACC1D67D94494F538123D092351B802E696211776C9553DA6F204EEDEA6F460
2F9A24E36B611B19FC7BEBADB79E70C2092C87A6634DFE09258D19D69FCEB2F1
9C6EB53CF2F8B9AAD8F805E6EA31B08B2FBEF8C61B6F7431207C4F100D34C14B
2FBDA49E6B4ACDCA099319B7139FE0ED81E9FC330D80473DF2C823FFFDDFFF9D
9E148904E8D188288ABF2406D96484DD2CCE26C84744D8A94F90A3D3877D9C4B
5B4866731DA81AC0641CD1F62798CDEE1E26A8B113A133F879B5DE304EF09AE8
B7347FDB304E1E86F16E6D3BCA6EA90493253F3806ED27319FF03AD085F84FEC
57F9494CE330EEA16E731D9A403722A3863C4A8A2A9C413BF2385AB674193328
CC2B942B2593F12530C02D9CAB99CABB9C4E13309F26C756905997138657667B
673E05A76B9C002A9DD5E93481B469872620190BF304D20A4419E05E3818871E
7AE8AF7EF52B9E0D97FA58CC45E259FC1F6902FA04CC0CB33ED6EDCDA216781C
391FD00587F049AD1029970AB97CD468D66A56887CE3F66F5C71D595FD033B92
A2C9CDF6BBE614BDEEA45D6825569E268CA804396B9063FDF03EF461E9045EEC
E70B413D2E0CFCFBD0410B971D7CFC27FEF1EF6FDDABD8FBE6587F90E1143BA2
433CF018D889279EF8E4934F92E6849F4FF3BC41319F83AAC509C2CED87BF92E
8B172DDAB869FDE24573214A162D5A10841088F981C11DAFBEFACAC848DAC7AD
0B86147E046DD5B420C204DE5E3BF0DB36559CDE060B980B12E806ABDEB09FA1
DE9204CEFBC0507DDBB6B16DFDD5919168A46AE0034056576B098E601CA532C3
56844E3D4ED9C21D9A80A07BB627314E40954749149B423373815CC267F5A871
F3C9CC9CB9E1D920EDADEB65CDFEEEBCF3CE33CF3CD364BC00575D75D545175D
E41E5BE18C4DD673CD753789A4222DDD641658D127AB672DAFE6FEDCDDB17C23
E3529DDDD4D386405E5C841B588D9D4DD6D5CA8803CD2456CF6DDB56CCCA0B72
A4A61819153BA18CE09DE49F264487184097DEA0DA64EC98FA80D05A7ADC9C11
A2BC19F955AC569B40065AE410EEB38C0247F7D1471FFDD8C73EC6DB77003459
B14D241CC1E942B286619E25B2621BCD76DEDB381F2915B799B0DC25ADBD381B
38E3F8179ECD2DB7DCF2E52F7F992C75C2243CF5D4537FFBB77FAB8B70C93900
4115DDBBB81253F59614CA33FB663115FC9EF7BC079A9C9499561374955C6A4C
E324A6B481DC54C17436A3FEC4C921FD8302622C801409A8D24752693228A6CC
137859B9964E38A928F1FEFEFBEF872C334E3D01694A15FC658AD8385A1C3604
2684E8647C81B8E6FFA94FD0C18B491D238A11FC7BC71D777CFEF39F7773C574
5E5D923BFBF8B0ED53B4734FD98211760C0D7ABEE99B3963B4BFDA2EB4CDCCA8
302FC8CFF29302D400CEADF19BB6377494E6633105A19F8F6B71B3D6CC75ED52
FB8FF5F9A2196D9905E5199B5AA3FE8C72EFA6A15A56C3DF9131664D25DEECB7
DF7EAB56ADD278A6B5DD122FF0BD4231F09276B315CF9F577EFF61EFC5E6EF29
976C562FAA2F5CB860C7C0D6EDDBB70D0CDA7C6CA952ECEBE9EEEDEBC24F023F
C2179AF5B15A0DF2AB6EF95CACE0C383373DBF158410A9716B64086B1099A8DE
4EC6C6A2A1D118D2A956374984630E2B301C1A4A76ECA80E8DD45324A0992E3A
144CEC18A37D4B4D807D887F190E1571080BC72852B125C83F2A51CB1DC8181A
4BA0E92274E45D29C7983E95716D321655069D7071FC90A821FA918A7FBA3E01
E51504C24D37DD243DC4BCF1B265CB60FE32338A1584B8A0D52BF630BCC1E195
08E22D4CE6A74A36BA3E90F83054FAC7EA364E08DD776F52BFA0309F5329B5FD
792A3A2C5A348A65FE76F050EDFCE5C92B51908763C571C592400E3EF6D8631D
ED594C8697FAE77FFE674881246514912BA0CE47C938791656AE9A66010C2C97
0D1B36A50F6F91A22E570935245D1BD15DA991596ACA8D431B93AC096AB65DDE
0611BAA503784F8DA5B836AB04B078F4C719AC50DC5CD0DD5D3232547C812B8D
4BB14D28CF3097D90DE57B0ED0F39E7BEE39F9E4939560103E271F169AAD6621
5F808C5EB7DEF627EAEDE91D1A1E82E7AD9E442CDF3393323C6EF4693A4D80C1
68BAF80991E39C5B8CEDCA2BAFBCFCF2CBE98449B273AE64554D4E4CB9184D69
0206B83903F48ED942DDD5D02603F61024C3F0111FAD830449D0D5FF91263059
3F038A12C61928E8D50D5B64E3BC91188798C11E7783CAE5A8D52EE482461542
3B5F6B3469F376457D7533D6CEB5CC4253DAC5F85D1E35461EC21236763A25F9
5C908F0BA383D5E60E6336E64DAB596AFB79130C05ADA0528C86EB4BF7D963ED
FF79CD9B0A454A37C877FA76999DF6EA9AD967F182589F05F3BB61E91F76D8BB
7B7ACA9E9F84894D06CC9A3573EBB68D38FE5BB66EDCB66D0B16B3D295EF9BD1
3363464FA59CCFE5F1408D5A6DB45A1B4D5AE39C3F90F17152B38A2168F9011E
D4E286F0688DC8D45BA651F71AED42D40ABDA43BF0BADA516570D06CDA3CBC79
CB8E81E1A106ACA0F87FA60964551C73CC31102912B86E5F748A11D2E45D7DF5
D5D84BDFFCE6374F3AE92459ABDCAE02FEC91470C1A6824EE038BB94917EC6DC
2E6FDBC54C4BD47272A460DC3E5FCAA2F17642FAE1A0413E90B01AD6E4CA952B
E5867668025659AA2FBA9E42C28417A428563851B225769AE7582E8666B38C9D
3C36E665AD6D2DE8C678AADC5620C44C1F4B781B0F2275C7E2028C00C63BF51E
C68AA9B7347569193A79A04C86EDC5D7DE78E30D4C0D04196902E9585061BA2D
09DD82144A10BA7ECC9AD22B74C367BBEDB61BC6C3208397159AE2E20CE8B380
50CC42CA72971D375C07CC4DBB7323BAD45D0A9AD36D97DEA696361932AC83BA
40D10C4542B8C324C7192B647A568F4F3A7EAA71ED691A863A090233706D3A74
2A75958B6F9335C18063075CC185BD6A9608ABE00170637D7A2F7CB42BD671AE
60E99C77DE795FFFFAD79979C31714675397154E919B10165C441CEBAE93CBA5
E4D27029D5A28FBE202F486DA16263FC4B0241E3D0F46B434B4F63C752EE0BBA
CE7B2559FB0D1E6993611C4C9661126FB638E2052EB429C4036BF9A0E841E227
A54D6BB7263BD233147B3913BAAEC615575C019B8064329C01E217CF38E38CBB
EEBA4B84E70CB19E7FBEED758163682DD05C029D134798D53E1CF2A38F3EFA89
7F79BC54864B0279618AA560C1FC394B97EE3AA3B71B12A6000D164429F6ACC0
8ABFCD9B37119F5EE9C9F7F65466CCEC2E157100EA51BB66923A84898D0019DB
B5C84B5A89697BB6B0C0A2A702E3B593B4BB245C8FA09098C02288DA493E981F
B58AA65D191E6E6EDCDCBF65C7F08EA1767FFF58A36D0B832C50D51A79B8AA85
16D985F33D6E72D7B0989CF7EAD0E5C669DDCAF09D97D5A9119F23FCF1F5D75F
8FB9D5D622445B2A81B28551970E6D2489AC0F691904595F019631AAD58F7B28
28AF346C3706407C8A2B5B495F860DA36A5C2FAD50A329C07D4E51E0F69390D9
C452A4030F3CF0F7BFFFBD0E3B452EBD19B62C75B30226A3E9B46D0652952065
430F8C3B135E3BDBC5B34D8D4B4369C44A4D28A11B5DD11185058D038FA9B9FB
EEBBB18F99CC51D7A7EF7EF7BBF01BA41EDCA6A9EE4BD824F7466AA4C9F23446
EDB1DEE41722ADABCC5559763225949C74214F22D6503185A24371C6EDCC9E30
AC0191A53F79CC54ADBA94CBE84021FBE94F7FFAF1C71F6781381E1C730A4D40
4828D59B1BAED1F0A409DCA66354363222BCB4CE9EE78499586218848EE52A46
93BAC549F399ACAA401D71E9D851F931329664F42C026C7859E51A9157444099
2C01F88E77BC035BB0634D5DD5629C7625240B529D170F2D053D3EE1D7B885D8
85065292ABB920E5D4C56964536808746C5FFC8BEFA88651DAD173AA66743269
0A481E918084FE812D1FCB1A9919A7916C876929B61F757712DB7932BFD9EAB7
3088197D3D1FF98B8FFECB234FD44631455E62C683C82C886589250B355863C8
67A7E89725D8412A69493E8A411366B9ADEDB2CFB578D1C2F51BDEC22396CB66
8F3D765DB664D7AEEE4A609238B11C2473E7CC325E2BB54F0D0DA6C1C1018CDC
6E8C5CAB5C2A7675C30F86DB697B722651DD4684E2BA5D4F13594D90501340EC
26ED3AF4009484F17C63F921E1ED2481DD23716FDC2C98B8BB3616F70F0D0E8F
4523A3C9F6C1C6E0703BED2C9D06D96DDAC08F53011B84E3F1168607D5DA45BB
B4C33855609D8D9B2497496288A973D16E3CE904BC89B0C04C6CDBA7459427E1
0A019D4A45E7DDFD60B25A4B9283D2CE6314C8F5CBDDF76401221F0CF90D791D
B7ED076C26E8302C34841BBC6716C6BB093C5E870281DC88A79C72CA430F3D44
C18D0525D325E3F61FFFF8C7FFEDDFFE0D6631C4328BB40953C4E99601272E23
5CF081071E58B16205FD72056F6903B16B0B35A2A70C09A51B9D35689275EBD6
C9A5E2E46ACAB865F157B214E0DEB82B3FE1CEC627B83ABEEC8253F573F88627
9C7002D75B4D3BF5C245E84029D3C0E430FE842B431F427928A362B21E7238AB
7A63264657DC689DF681A88A4CE6932AB826E9C97A7AE60312A760CF644179E8
6D4846E921C63D79116E083715AF9E441A55987500E7B4BB21027661539A911C
738CF5D30FE06F190157B346E3D8C812943A81C2D2B855FBC44860B625A36991
D10011E117638622F6509A8B2CE5AE32D6647EF6B39FBDFFFEFBA1DD091CE26E
53490A6D029752ED5BDFFAD6F1C71F2F7E6CBA5C8C3E290DCE11D20A93C337D9
F4E3CBF232A65E8BFC3F42B60F39E490175E782149893AA83354450FA3895CAD
DC7526F3CFF0FEF4D34F7FFAE9A7ADCFE741D8995D7759B676CD9B0BE62CD8BA
AD7FD1EC459BFAB744C1B8EE9742E55A2828619CB2236635187564790D5E3871
3639D9AAD76A8D62BED4A8B7ACF16ECBD8CCE2C5F377DB6DD62E8B16627AE13E
79091622ECE9AEE0A4787E3B8DEF35188BAFD5AA4CCF7881051AE5F326F471F7
5ADCAE45B18DFAC7B1DD039E2D348B3C8B808D21FAE110D4ABBE75CC6C78C484
F954A5F9B9C452A3E7E266D14BBAE228A836DAAD38A8370B0343D1A66DB5EDDB
07FAB7EDC0B2A7E67140883C2EA8281C2E023311226CD5AA552ED790AB12583B
8635A2C430191E441C4A7846E84E980214FD984FED76011CD4C9CE38D5097EC6
A3E3260B1387F0DC642C0E102624382249B5DBB79C3A9BCD1C6538BA41D48E68
1EC6892FE09AB495B1C4975C72C965975D86A7C395B98D95205118561A5134E3
1417CAC95139F1A0E138107242AB4EE4B20CAC31EC21E64A9714122A01DE2745
3F6942A86918AAF16466EA6831F5C1BA67C62EBC147108639F7979CA687C41E2
98F110F69D48B2F600C4FF10D1C8C886DA282AA2CD6393648DCC7880DD9638C4
9C747010CAD653B980E4A08B28703F97E5885F71CF91F94FE9294545E4A6D11B
505C4801776E0221D9F91E5B8A2606252C5D1945B1F19F279F7CF233CF3CC35A
279AC364B86375955BC3459A555804C71E7BAC6B33320ECE0108C84430BEDBBA
B223B3246E03CBF5B478316419857539E5BEC65FDFF9CE77FEF6B7BFC560088E
26E6C7259960C130BB35D0C9551A4A61131962541B7884DD76DB6DF5EAD54AE6
2B0048052045A52995EFF2F5AF7F1DF614F6096507C987F143DC1A9B4D3C01CA
76B8D1308A5D3A979C7FC661DC4D8533F6C61B6FB8A15E0AEE76D623DA3DD898
2BFC8BE9623E1C8ECEE8F6D1B1FA9867FC62DE6ECEC84479BFD88C2DCD906271
E458559985443F550B639B1497B7DD761B0EA7CC5EFB74B52A1C022E2E8471A3
D958BAEBBCBDF7DE73EFE5F34998531D1DC6A8E6CC9E095FCB0ABB829F9668D5
18466B34EA7486C27C2BC53735030FFF091D504B62CC7CD3C443E99445264E51
A47EB6439AE5286EB5A334859387699C4F2B3072C6CB45AD5C687AFCB0D08EBD
242837DBE5A1A178DDD6E6E6CD5BD7AFDB383838D26A9B183E46E25970693C4E
2BCB63251CC194281AE32469052FE6CA62BAB05DB185F835C9135A456EFD0AF7
18179464B75871C52463A7F1B871BA8BFB59D31BF1F2264E2B1B12309BAC108C
9BD3B5297529C62A98CD6652906176EE73371E406C2885679291E17B4EB93EC3
9E1277AC012257123BA650D6F3873C086EAC58412D655008D2610801FFC9BDAD
9633B8A30AE5EC617463023AB149C6D7CFD6546427C639813270C9408C9343E6
4BE093F9F3E7E3316011C030243AD34BEB44E01C89F24196BB6255781836FDE1
14333A14670D46D8BB072719D6931AB0F1F0D30965EE9A902F6F22FB87F6C15E
7BED05B5F49BDFFC06EF972F5FFECA2BAFB05912B14F5448EC12ACB60DAA3DE1
9092AC1908EF4BAF48C14A85A714CEE22E8178127AB5E3E51E12262108D9E2A4
41325E7EF9E5441371E175BA0496752FE22678E9840AD1AF0655AA8DC05FE178
C264D3126805F9656A355DCA0D4609F422F8364F8E58A178C2A96FD85F487CAB
628B9333C42FF000B07858E80322CA459ED131757C85D98BC63E1E079BED631F
FBD875D75DA7D274DFE9F64CD5ABBC056E8159C5543CFBECB3ECD3C0732588E1
DBE59AC65F306FC1862D9B1263A72857C86FDFDE9F8AB4B76B474CC6A347C382
505D468D48ED47F5433C1E0D23DC142E26E653AA3DF0FC5CDE9BD957D96FFFE5
7BEDBD5BBB3DD855B272D0528B17AD5E0C52D6874239C5F847AD8C9DA69E8C77
8DB704AB5E82E5863268A4859CCD24C24EDE21DE8830F56FD20A2BAC5D17F444
62DA7E1015F261A9544841FA052F97376D3808DD61506CE3E98372A35D191C8A
376E6D6DD9B2EDCDB51B366EDE3E3854ADD76C81050C272F19E7205168D138F4
569335814AA85C100EFF446549E6679C59F288DC77DF7D7037692D6156E5E9EA
D8B28E9524EDC2F074E8214E11C749A03CBE79C20927FCF0873FC42D38007AA2
4A3B2997E0DA5B78C1C2FBFEF7BFEF6A265C106386A013553006B660C10212F3
50BE8BDB2DC87AA5A8A88BD2CFED2E25E7892A41FE37633398197C81470626D4
CA952BF19E44D334F985D1703907D5AA8B61038BBBD546C77FF0B48B6E9E241E
1D34006E633686B4C6D297BA71CA2D30292015BEA1480D4D86F65572D2A44574
147938BDCC40B864642E384441587CD34BDBE6D04C209C8096BEE0225AAA0E73
C0A4B15ACC20FE7DD7BBDEF5B39FFD4C91076258B933E80F7959BB2BF5545124
DAE586E42EDC73CF3D61718B8A2770BA7E72E14DC6D14D058E0F498E163B44CA
323AF8BCCC856024DC551434D80178CFE1A9E04B6171D9DACA7BE371F0B098A8
33CF3C1316A899D89052905F950473A2587426AEC728EBCECA44083E39ECB0C3
E04C40112A14CECA32FA0DECCD80F7343AC447ABC69C1D211DA69AA942542884
69845D0315A58080F6C064CD279F40D109AA7385FBF09F44C761FFF00DE363F2
BA5422A32A2132EFB3B402C60D2C2C1B35093D58DE854A3E82646D585366F62E
B377BC351ECFD441501285DA917B9E054ADC24E79E7BEE4D37DD44C9858B1F7A
E8A18F3EFA286E55B11D5146615D7495F37BEDBD6CE9D2854B97EEB275CB9BB4
031A351B22C8A75AC7FAAC396E98982BD54EC906D2FD5FF50D447E33F0A3C06F
9AA49EC4CD3869C1274827CD56426077843993E73EF1F29EFD6602CBB054CC11
1A5ECC15F08D04666ED88D276BC2E4F72BED76CFE070B26D7B73C78EC10D1BB6
ADDFD8BF69F3F6FEED6369C18FCD75FB59A930DD50CC868ED8E4E81014309B7C
F1C4719F530A618341316B7528227072B12EA451E126A7AB27C797A686DB53AB
C3D89299CB2B9F76DA694F3FFD34D69DECC5AC1FE64F089127FFE87824DD512A
4946AACA3DC691ABBA3EC9BA2AA9A5AB80335ED632C838083DA6A68E3AEA2868
A3242B7556EDBDFC15D7C0C577301594C6F8136C4DA81F86F1D9319ECE0D4F2B
CB3CA5455803405264288F33CE38C353BC5883C327D8971896143265044BE98C
D3878B53EFC628B80BE9C4B929752F6593C75D38351C10E717DA123202033DF5
D453A1F0E18043B8F0B4C7196BB97200AEB6C4B139E59453049377D971DDC8B2
8BBF74235726F59ED809873C740AD2E16BB6D3B2433AED063478591E6FAA0DCC
3E9EE2031FF8C0534F3D454014A536452D13C8CC3D924DBE83834185D0AE7054
C60CFF62B5C487BAF7DE7B33CD3E25215747BA98D3E836409794A4014EC801B7
859A7BF079D59F84CE07CF03E38FD48E4AFC081922702A3712CD6A467829BBE1
90C13B11F387484FB9E5D6AE5DCB489438E370911B6FBCF18B5FFC226E8D3585
03C7F1339467264241F4721104DA9FAC0D74BB5B5360F1B48B91C664303337F1
C8591A87B1B59A7E004FBF343A9A4AA8D0F4CDE81BEC1F2CE5C7B72517D456C2
6778470D0C4780FEBE2AEC44E5CBC979FDF5D7E38827DFCC99555EB868CE1E7B
EC52E9CACD9D37CB4B5AAD66343C3464C3A4C552AA3B939C1FB452DE79F803CC
4062FD69A5E57336F21306B117344DDC88E3B1A85DC317BD64CCD6267849E827
500385BC6F5DD09C6FFC280CF0807EB110E40BB952BE58C8E5C3209F0479DB68
3C57C1851BEDD80BBBE364D6582D5F1D6B0D8FD4B6F50F6FD90A7DB07DDD86FE
ED3BE01A5843DC4558F2C17936DD35D2AAB13447275D7B49303FCD21930184D6
C85467B728B23A2BEC2E13673AE8A4714AF7930CE3CFFD8FEB63BF4138CAA191
7DE04D85CA171A95BB0506102E822D7AD75D7741BC12A8432B4DF45FAE34D77F
527E620FB0D6552CAD9C04FEEB72A09ACC8B62FB498C1F178732601F6F930155
880BC5444189928B0CD3CBD6B93C95468472CACE49F2E212106A3FF8C10F4860
093B48CC741C1CEF814BE3FB8C5AC815A077C33925271D03B5C6A9DF7303F1EE
5C3049C2F168395DA744615C294372EB7FFEF39FBFF5D65B099EA339E976FC91
95AD127F615D8443A7DDC7023FBE79E73BDF09758A6797B44D9C526FAA7146A8
4CD6DD53C059B785B2DC58A97411E4262973087C2677870944E4A5AD69449DC8
05C29B9B6FBEF98A2BAE206F1296960691C0D493F304AA2B56B95C072C9A690C
17EA4EAB5F0DBB09B051C88E0C3049CACF2AFE77AD1A9109268326AB98803373
CD35D75C7BEDB51A1EBD16AA4C65A768D3B19A040A8CF1315239E198E1915DEE
1317CBC1A99358E172B7B32E89321ED9A148F82E8E841139F503104640D34859
66E33CA3D65668B55BE17819D4F64CE70D6BD37A19C657C0988E25A06EA62A75
71F129A40AE38740A92CDD75D1FE07EC357B76573BAA75F71493761C78FE78EC
344AE968226B8B8C366A69C7C0D10CA410509F75978A90EFB930093C68F7B166
6BA4D51AB3E5C2C622886C557410E7737EA118E4F3412EF4BD7C3D6733CC39E8
0648AF5C900FFC5C60FC245FF4A3422E2CC79EDF6C457EAED70FE737EAF0E6C3
5AB531385CEB1FA84213AC59BB69DDFA6D4323A323636FA7F118D3272ACC0D15
B89A4045B00C3E0BC24BD2782E1FD43F9D60B7CCD8644929063318C65018D3DB
6961ADC92239B31DD62F72C28B6C8DF906EE2297C8DD7D29D8103ADD92B98548
61C94DA58DA1BC85C21562BC90E683347BF0C1076949CB5357D5857C6255A850
6F31692AE386E28227453D38190156FF575E9009605C8D5439E321637620C01B
4ED0EEBBEF0E6FE57BDFFB1E7E4F950E610D13464E131783E60F55B4EF348F35
99EF43B989D7BBDEF5AEDFFDEE77C6A9B72683B1F2FEAE1A3459774CD576738B
07691F024A049AE49C14B6D7E0FC12D4A4181CE55D9C3538E5FAA9531D2300F8
886D1F023F305980A5D16C84A91BEEA271F8506E20853288760145AA0229B48C
F07D587FA4AFE0CF69CB402C5E77DD759C1C21AF88B0A4C662DCDCA4B82969E5
8B2FBEF8CB5FFE32E3EFC6418B2A104FE9CCA09C1C35D1487006947683CE7BFE
F9E73B8C38B71247BB50CF4BC16AB2AA1CFCEB267E265680BF1DFAD42CC95F36
591C86F4007873D555576142883765F81E4FB462C58A7BEFBD977BC6CBD82998
E4A741C0201E14E4D5575FADB54BB2363B5C6E1CB0279F7C1206170182EA5AC1
7A37EA1EE578A6131F9E0393EF90684455D0DF4AB22A21A50A784D32D88C8B15
CF822F717F682E93F66B6A47E9D16DB60BA1376F7EDFF27D97EDB9C79299B37A
20923D98EC29D83FCE5833A3EC852B334C6A491E53CC0C63B64188D314D87A03
3F4EA26AB339D4680CB6A346D21EC3AE09C224674343106106FA003A2384F51F
FA85BCFDCF7C4A6CEC61C5120B0B4D9282E7770561C978412BC671E80DBD1903
B5B0502846B1191CA86EDEB263FD8681B56BA1FAB7355BC1E0E06862FCBEDE99
8343909EB16D0E1A472636DAD8D4D6DCBD6EC341ED79D77757489618395A27DC
6F227BD046E5BABB34701D186BBD7133C9EE01A70CE5F67623EC348C78C693AC
C4951B8CC3108192E2C6F8D581071EF89BDFFCC6659FF6A6651399A29100138D
B0F48F3FFEF85B6EB985CA4660071D67DA4CFA893045AAB921D3A27894158655
C592FDA17C7C9710869763FB1492E788E993C958E255D9785A315C495E97175B
302F2CE441071DF4F39FFF9C6678D645D6FE969C775C7832F3C91BA2F5CA414A
332BBD49FDA63E4422B7EA782291D2A8B19F9B4831A9DB0E5FB83F4DFD912CCF
6EC47265AC3A264DA079F733BE75DFA9B9551482F632EBE3E92DD19DE28DF057
FC27CD1056BA26594F343E2961275A33E8F32F7CE10B26C3C651C39D7AEAA9EC
F124D924D52B1F0253F4D9CF7E16D6B4369F02291CFF59679DC58621EA7DC836
559C16359671437C533EAF1424ED38F690E039C7247383D265640A47C79BF871
8CF0BCF3CE334E484761196920EA2A933A85E40754E73B560E332ECC38325D5B
510D2BCB479DD121D3C51A824BD1F064388ED4F62EE25BD69F620EF211F96251
12F7AD5A4212D1C05407BB2E4B6C4152C3404F8711400DE40B30A7462D435C10
CC9B3373E9B2058B779D376B56C5BAB8290FAAEF4DA0F1E11EA332605F0A32EB
D1E8B16949CFFA7C052B1BDB49040373B0D9B201A2C0AFDB963521A6D7CBE792
5C3EB1EE50E025612B17E0737CE2D9720293B251A464D430C68C57F1FC7CE441
C68589E9094C6F1CCCB21E47ECD71BD1E8687B5B7FF5CDB7B66C58BF65DDFA7E
ECE54F1E7FD23F3DF4B0856CC11B889A119CF5429146895B55EEEAD10E9D4A5C
2FE535D70E56C297BEF4A5238E3802B295C84E2E34259532BA1DDB72B20EE09B
C8699AEDE61115AEE086A455CEF060E0349777DFFB59030002826912912E82F6
A2DAB89A69424C666261BF3B54F2DB43D0B11FB558EB455B89CB625F7DF5AB5F
BDE8A28B18E72418810F82616072D4E0CBEDDBC8532F8AB371861CFC86103D22
79B1A14D5A72A90480C0DDD245C71D77DC6BAFBDF6DC73CF19A7B0D39FD43CD6
0551414613534FE38B96B5728954A7D4AE0C87B18060D5AA55EEDD2941700538
2E70503A18CD3053B7DF7E3B26858521F815FB63503488D3E384134E78E8A187
6840E1B25643B65A10FD36AA13479F59F199679F7DF6B5D75FC3278DD678C4BF
23FF4C6137A56414741D9F430309EA336FDE3C0685252F701176FD950D0EE317
829EF8651229B3ED86D230B8BE5C2B8274299EA8DB896A657DA3DAA2BA5E9AF6
1946C5C1C82E200C59425F907F7AD91DA127457558D6C86CC4E1871FFEC4134F
B0DBF37857862C1AD601A723A9243BCBE35F4D0B193E18A627B2DB35B2C8DEC1
F023771AAC6CC1A2F0A79B6EBAE99A6BAE119A39709A37F19AF83EDC02EE199A
110434BB981F6550A875242F841470CD02BA479405D42254DB0A70533773186C
024873A1D5AE47E371473F2D2049FBCA41C47657F659BE6C9F7DF79839ABE27B
6D7C924F2B0EDBCDC873AA25E416103244AE7FEE646E03328FE673A1E5228DEA
710435301627CD42AE6AA34639FCC9CFE50D34413EF4A01B82421CFA501E5003
B665417A8C5335801BB573516C0BCD9A3166099BB6076E7958988FE1245EE0F9
580BD84CF1BAB7B6BEB56EF39BF8F7ADF59F3AE1E43BBEF10F26AD34484CD4D3
DB3D3234AA242AA7CB8D17A9328019239C149C8BA79F7E9AD51EDC60AE2C63F5
9C9B2DA055E75AF7DAF0AEF075F37CDAC96E3083562F6B1BB181F12FAB656551
B93A46D84D658979050E0C9B0D560E09EF28DFE8F198695EDEC4173F24F7B5FB
35DFA1FFA2714CE7982958DE9A9F7FE73BDF81943669EC8BE949BC81CF7DC619
67C0CF807050E03D603F459D7FDDC9DDE8140A2C62E26F703FDC298D4E56B9A8
8C98EBC0B8811405E2757DB7AB839A7560BDC9244E3663C1992EBDF4D21B6EB8
41544D620EB07D2BD3AD4F11C930821A525E7CF1C5B7DD761B56052ED505175C
40198AEDC22FF3F0F04F26238EC691EAEEEA66A206AEC0899F3AF185175E58F5
5FAB822C6ADCB1C33A5ED20469ED4FC498D549279D74F7DD77BB706093D129BB
A5CB1D31318A605A46B4A95D80B622A1B8239B9D6A0C3866B48E152ABDE79E7B
CE39E71C6A41FE50D96F227DF12F93ED84CA60F6C8F9A5781D535E14DC1DF14D
656219823CF1C41331E7C20EE10B38CF8CD7D14EE72CA90DB27602A500F6284B
11E9BA51DCE38507A4FA178DE5D2A54B3FFEF18FFFFDDFFFBD78BCD98E9CF3E3
EA66CE834B666032E60C7C78FDF5D7DF71C71D6A4765D29E88C6A141E46F1546
70D5BF8EAE2AC34F3EF9E4C71F7F7C975D766119B69F5505329FC91344885D86
644D013CF62E5C1AD3B6FCE4E1AE8BE71DB0DFF2BDF65E962FC6CD06CE579C4F
B756DCF23A925E74FFE9F513392D98868D26E72CB997D507B6134D037694891B
B6B56A3812E602D818450B108DE116908BB450C26326F63F03C8EF54F14313A4
E4D3CD168E3C9481D768B7EA2DDF243D81D75BEA5AE4FBA1F1E1FE948BF9DE56
3BD8B47970E386FE37DFDCF2E28BBF6FB4CCE0C068148F5BFAE5AE4A75D42E7A
4799BA0B9C733F645E014E2D7694C2415E5AC44BFF121B03E2EC873FFC213E14
8042F14F57524F96B67AA3D8BD0A7A64EFF3AFBC11F5903F89D7442F1E6DB7E3
219D63B9FBE4D7EB18C06401D2A10FB893B90329DFB8EE6E1B3EFE44C61CC532
4F1F43CD38E31803318D4C09D0F6158E888F6FD52DB72C9B945160B18B3ABFA1
0CAD1840BD143C8A6F320823338DEE125FAE3210810C5113B2F55C72574EA212
41AA339099CF54B0E88E4D1A376723F873CF3DF71BDFF88664283E84ECB8E492
4B2029D4D375EFBDF75EBD7A3503D62EF31FDB5A7142F32963B62D9B37C9CC19
69397BA30EDD309692154FA909A6F409704702A256AC58B172E54A9386111986
66D139A6028317589636A31C2F412C48F484DF4252933C441D894D5678412B1B
97FDC4273E01F79053CA99E41BC607697C315231B914D3CB189F2EBFFC724846
C6EBF014981FE13184A7565E440E3E137DB808F61C5681010A3EC2D9679F0D55
A464E9785B98B4AE4A4F4AA01BF9A571656C00265474116DDC0E2489A0AB2643
DCD23D579B11059D696932104447D34FA9F7684C5D76D9650F3FFC30B6077FC2
8327D0B0C4AE1B77EEB0DA7868D5433B498B5A7071053F8B191D299BE8AAF211
834FE701E29B4492988DB9FBECB36CD9924573E7CD6847B56603471A56B78533
964B7D1D43A24DE3A57FA50EE027B4A3A3C458BC2B76BB1F7B963BB5EED99282
280C866CED71C183910A4D50C8D96C41607BD558D429DEE7021358F620CF4F9F
188F034DD06C5AD2D67AD46A34039374C327983163492A3EF289078D5386D936
3058DFB17D78D57FBDBE7EDDA6E77EB7265730ADA62996DEB67B08C4803B2BDA
A80EF1DDF17209A825F21866E10E2447052B9045F5681C3F60CA1CB57B78A5CE
4D4627E356AB31E897F523E9C462F04366987184DD9A568E5C0E10FF4494EA74
0F9BCBA2D0AED9E1D62D7177117EA2F9612290EA87868B209D7C40E5E42067CE
3FFFFCAF7CE52B6C208AEF74746EF7A8B5182D7DBBAD8AE741E5DE79E79DF82A
9E070E35E16EC41BE1AEECEF4C6E165CC176A3ECEF57FC744A6D2C7892B04349
DA0582A829CE38B40B414E4986F9A5B472F115F06EAEBCF24A8E879B9E8EBCD8
29B039702F4A93279E78E2E8A38F3659181A72078B812970512E1446B61FA11F
D01A6D341BBD3DB620DBEA06A7A4D04CAADB9A9C3166B504B99F88EA1521CFF1
C71FCFD0BCD02F6E96853340C5C0CFF9C9E2C58BF109971F37C2A6771B2F339A
C74D43443673D114CD982291A7ABD887B28C941EF810DB027631661EBFC2025D
73CD35FFF22FFF42C38DFE810BE816FACB251025D600DB807B63BCCF44A3B1FB
EEBB33746326525C3092C30BE23FD5D98D7A51A5DACC2592F74DE5578CDEF859
AF57DE8E551A324A9458167B1D5161D4139FFEF4A7FFF55FFF95278DEE3F07D3
9376C413D6888FC6688FE2184AFAB9B2862F5ABB42857260B82375393E39E490
438E3AEA2818284412E3D7A55239BDBBED1A673CF822C5E5FBECB1E71E4B66CF
EC2B95C34673348E1A70C9AC26A84318E53C879F4AD121BA5C047A08956B173D
F143F2C7C027306D93347DD3F4FC38F0076DD4A8E0E573265788F2B9785C1398
113FC05F937C888390B06CCD4FFC7612B7E11344A1ED6F10B51B6DE88BEED0EF
AD74CDB53BCACF355A493B0ABDA4DC6CFAF57A6BCDDACD6FBCBEFECDB736AD7B
B31F9E818D02B5E27C719C5393E5DFFE24A62FD95226F309F04454037C2F5B98
8BE86715C2175D74D10F7EF08355AB5605D3B7F99BAC09A40326678C1387A642
B2456C0BC609E5F314D8565A59498D4818CDC4525E3728329D4FA0F223E58D45
DFC4DF7A4E21310F263E8148B9FFFEFB353CE6CC18DB540190F01DB80E1C624A
54F9138C61D8ABC1968431881F4370B0468C8A1A4B4586779381D095C5E5013B
EEB8E3A0DEF1B48C604C1944334ED386C0A1F064201B0F80B38185E47F4A5EF3
38495FC933A02D4FB227CA0B28120C0C4F4541A31ED662A6C3ADA1B119DAFAE0
073FF8E4934FF2F9BBD2172420750C7E3E7BA66D51642DD646BDABD2353A36BA
78975404D76B1D8BE72A0393450CA409BC8C53C1CBA0840C7490CD09B790B090
706424548E02560BB34A248FC8FD4570CD0526624443724B3A653B7B59A3280E
86AA570473E2AB805287E5EE160770BD3099188CDB8A6EB2E6E3BA30A0872FEC
BBEFBE182D574D54FBAE1C574857102391029D74D249509334291428E31D3587
94C8B4AAF04D5CEAC8238F7CECB1C764CD09CEAB803E5D19BA025C3822774D46
FF42DB9C5A4725A06A4B226B3171D8313B4418DFC8C45162434A112F9680CA16
961C61161DF67DB1949B3B6FE6FEFBEFB370C19CEE4A0992BAD9AAC611D6C80F
3D3B93F5665B9AA023FFC1C3AF5416CD23E3D9320808745BF59B408CD7A10C12
D3F2CD4810C203860288E0393055602342B95158FB7E00A721B14567295E894F
07651A45398B228DA3B6AD58E8F1835E8B30CA17F11C58CC661B7B188E422589
73D57AF2E20BABFAB70DFFE10FAF56C7A2A111BB4B7759B4CBBA0DEB4D16E015
E68D5292764CE474CC96C540BF56A850FAF402B22B3E6126E2C5A75C2F574F48
E2771053F31604B0B830771E316E3FF7D4939F8E54A96278A4E3C2342FC4D1B2
65CB206768A2ED244FA06895428E8A9B896B87CC486CB4801DC59A4471BD7084
7A5EB5DA6518E094534E79E081074CE6D762D8D4076F6B20FAD7B807053ADEE0
535AA00C41305BCD07F0B3C64F8C49B17A4B68453D95626A9C32290FB1329107
E6C20B2FBCEAAAABB8EACCA7E13B0C23F0CC70AE3523C944983CBE4F918A1967
D242FD0978ECE528712789025AC11668383CC27801A131CB962E5BB3764DCEF6
7EB57BB41DB5E12544C9047FD338CC591D2ADD6454CFCCF1E22EB4FE68C27007
134227DF4BC48122EDD1537CEE739FFBC77FFCC724A365772933B3D63D2147C5
740B8983A0B921D6B939B8B754CD1F66DD49E50F09ACB566CD1A9E042E659255
87519E12A13C39632C9F80C3660181C9627DD824F0DEE08D62CB4AB2BB75D7DC
B5149A6A5C25F80D03381D9150D904C641F8F176B802F6039419F316AA99A7B1
4C75AB22C40EC01B2FCBC128C2E04FEC43AB0DE04DEAD92014AF848597D10B32
40ACB4B932A54E903A073500C1DE37A37BDEFC19FBEFBFDFDC39B3BA6C4701BF
DE18AE8D8D45712BB4E679E0873993C154A8094C06C667F8450A695C1525B990
92D122389B968B34CD1378F1A8B5FDC33817B68310E2C32A030CD60F86431B12
6AC121B09AC03396988E42D922470B8917B43D1C0AFCA52B08FB0A612197CBB7
A2A456C7875069B38AA5BEC0CFD7EAFEA68DDBFEF887575F7F7D53FFB6A1C1E1
DAF070DAC53EC57C8B4C9E11081E644614794684CEC03A7209185161B8C34BD1
CF6E1D3897CC0DFC9A8C6A77725E7A7280887B89DF275B09DE9C78E289FFF44F
FF44D67D02D9D5B5909678C72679F8E187614ED127132104762CA3C494517EC6
963F5DAED173BAA7B16880720FCF452B102339F4D0437FFBDBDFD205A47C6625
6C47C5835229C467D309E0F7E92E30740C1FE0B2CB2E335958CCFBE637BF79DE
79E7899C88A5F0ACCF628135CD16C585540DCBB32181484113676D6114A33719
CD05BD39A543891B51AC8A373AEBACB36EBBED369218538A29621B64F45ED22B
04D830C6C22B98ACF4979A80CF9C381C9FF8EDE9A79FCEBC4247C9154CCB638E
39464457141FDC5E9A4A89248966756F57298049C3D626ED7FBD6EDD3A57E8DC
72CB2D575E79A597968C990C02EBA6165D8B9ECE29A3EA325868F9CAA8E9885A
BA324B3E262E4572501619523E32033CE58E64B28E2BFB918F7CE4BBDFFDAE4C
5DC1A244A9E40269544F47BF58311F417EB9857035B624E44CB280D3CB30D1F8
CEB9E79E8B0DAA78A06BE9B8DA88CAC36D6A4FCDC455BBFDF6DBA11445F9609C
AE0F1DAF6422DCB0237549E7D8557BD3CD9B9FF1D8F819E17092559F4EB95ED6
50097D88E6384A6C866051DF7EFBEDBD6CB725DD29101012A05A1BC6CD213F8D
0749540FFC71E6478A09AEAF6A35DC4CE6F84130700552BC535A7510B75B91E5
A66E87961DA8EAE7AA9EDFB074A379AC6914E620885BB6055BCEB7D821CFB255
FB9ECD217BB9208E82C460DB5492A06069F1F2B6FA3D979470D994B42E09FC52
2E3FA35C9C55C8F78CB48B033B465F7B75C373CFBFBCFA95353BB60FB6C645F1
B4E84981204C466E4F13CAED152C7AB42F7CE10B5FFBDAD79423954F202EFD8F
7FFCE3BFFEF5AFB1D5D54057D34E56673311A9DCCE3A24AB290D5E38B3495603
CBE131BB193824C73CA4DCF68C60AF5CB9F2F2CB2F576E835E026B56689DA860
C5CBA88E896F94B58AE3B061C306D937941E1A2D3BA0D0E45AB26409740C1F99
980E93650EDC4E24D75E7BED15575CC14753570C0925D666F3147BAAD8C6BF1F
FCE007FFF33FFF533904A820CCA9C9A243AC6C32599C4754FB82CA8AE3412CA1
5E4615C203CC10845A90CB991062578D855535E616942AA5ACC606D82BAC24E0
FA419490FB5EF3EB65141FB2D4583DABDA577751DD96670ACF69190E3AE8A03D
F6D8E3F1C71F97349403EB2A0933B1161A172137B222A44404A93132A9F94D16
5894DCE40B530A0BE5BEFBEEC37BF625967BB4132093716C588E1387E79C73CE
513C249CBE4B62E254CF3345E1C2EAB9AD197C8C332A15A561F1C925975C72E3
8D3762069860500E963FDF6BAFBD56AF5E6D0B1A53C8B3A82388DBE3ECC18CC2
0CF0B2DC27C6C17AEBD15CDCB78A4BB555B0435E7BED3585117622C177FE128C
44A1E7E9327E495A0747BB8CBFC283C014A02D3279BD6084F930AFBD363441A9
0C7F74D15E7BEDB160E1BC8A65E5B333D9688E4113C0188026B0E22CF69503E0
02511374A42BA4785A260DB6B4BD71A869BB01A99D24512E6AFB6123C85543EB
1978859CC9175B611E9E4784FFCC13456AFBB361D212DFB31DD1AC26F0F24150
317ED1588315FE00345E0957B38B82E7F04B855C6FA1004DD0D50A7A0707C65E
5BBDE1B9DFBEFCFB3FBEB279132472DD6E1F6F679AC064DE8C9E8E92411EB6C9
9A469C74D249DFF9CE774C46FC2ED603A646C950B976ED5ACA5C1AEFB423F1C9
DE7BEFBD6AD52AF5B13159573B1D199A416C15E065AD31FD8CD4886A9E15033C
EC38D4F4834D5655CAC00B2BA2E3B4712CC6CCF70A5549B899AC9E0EA71E6F24
FA30CE4F7EF29370A9E5079BCC03489CE6CF6A6B632676DA90FC611E91650DF8
02E43EE433550EB414034D14E376F2D9618780165AA9946EDCD67C60D1B4E2C9
A90CBC89D41934CCF15B97BA8F917DBA546E981BDFC105D97D8CAC5EF40A6956
E3CA5018D4C9E26F089C0E9F2A41224F11A31F34FF49B464B2A22DF79018A7C8
88A85386D8848AF1B236C8987178A058152E1805190D4F1AB038E1D89AACE965
F10B34041EA7ED3404961AB8F4D24BBFF295AF70BAD44D42B3C7FC30AB375848
413F83C360F5ACF2AE8460BAAD63A6B467277F88F7D0E2C49BB2189B9D37A63C
99B4E555008C49BEFBEEBB19FD70432554DE22501268E7AAABAEBAFEFAEBB994
6CEB4ABD8B4923A93AFCEE534E39C5647414F8573C8E84D6607EF827B80E8490
FA19BD87EB200AA1D161F7295580317CE8431FFAC94F7EE2D2D54DA932356F2E
9A3BC9D8B4986DA6149E4E0D70FCAA2DEFE84D642661CFD2CDE6590250AF0DDB
7DD6ECD25E7BEEB674D92EBDBD3DC5D0C23FD3A860033A003A05823C8DFF8CA7
B249E0EA65A50C61D6764DB7A0DE6A1818A106CE40AB19474D9B454F4CCA0713
410D340BF9562E6FAB0D20078AC556908365431721800FE07B91895BC6B6B289
8D57B45DCEFC322C46A801780DA1C579157C2FE7B14B995D8DAE7CAEA790EB0B
72152FD73B3ADC5AF3C6E6E79F5BFDC2F32FBFB1765DBAA68999DE97928E27F8
8D11517A00AE4BCD175B00992CA7E8D618F22CCBB4670C44071FDF241FB0F4BA
7C5C93456F1866600296F128993834A8A3AC0B211956D4245158153566C07828
F42464446BE6D6277774D92229B299E4AC5026B353266ECD4112FCC614A3CC3E
4611F09E5DCF4C66C78B24FCA1871E3AEAA8A3F821FE157F97FD3DAE4EFC09B3
B538FC37DC7003C7A7069678AA9B6FBEF9339FF98CEB296B2D094D21B293687A
E1BD34CB6AE2284B8D66B244273EBCEDB6DBCE3EFB6C4566D40D58A5AADC1F24
9514D294D5E104AA8B44C88D06784E25213D06FDC98DB5E13BA4AC7075830ADF
A866DC564414A9E229A4711A651D0E68EF5F70C105B091B9B1680BD36C84DA7F
E59557F085BBEEBA6BC58A15AA7AE39CA88C9E3A1F8BC2E02071B41DD69FAB8F
3B649CC9E2B00CBCBEFFFDEFFFD18F7EC491AB3CBDE395646D6055A940FF8936
DAA2458B307E6C0F2C93B49D1BE63259B54B38A9B52CE750E50E49C6B1AEF343
36826062C74DDAD712CD0A94D174D05ABB9906E250292E496ADD214D266B0217
4CA2D80B51DBD800A409F96FD902A81D4935C35ED9264BA84CD604F6396CEF31
0811B370D1CC7D96EFB970D15C18C4A55C9841835AD004C65AC78D34EC96D064
C633D238A51AD0FC98AC0D0B83B4AD600C9BB1D5F45A750BA7B2DBDB36248BC3
0467302A144DA1181673855C1EF3DC8426C88596772897F7E184F8B6434EDD40
032451BB15B4A10E4C3E088B90FE7013AC855408A11C6CBEC296AE1583B0920B
BAFCB062435849A55E4B366F1CF9C31FDE7CFEF99757BFF6A60D1045EDFF9BF9
A7266085C4030F3CF0B9CF7D8E89567A355C1AC94D52E3F80ED3789235796DA7
4D80E9F4BB405555F999894D9C28AC4485C2800FE7569A009E3DDC591E795794
617BE0528A72C3C6C5596080E8DE7BEF85C084F0C543D118172AC9646D012975
E98BD00551A4B48383DA384117BC6E4F5FECDF4004B6CC32CC808A6F4CC61E4D
18EBFFCFDA9740595695E7EE33DEB96ECDDDD573B72D2A82A228E6E5F98C2E43
125D0BD09088710271888022623B3109A8382193222046511CA288C664496284
0551630C41A501ED869EE7A1BAE65B773EE7BC6FEFEF9EBF77DD1AD0F7BCCBD5
1655F79E7BCEDEFFFEC7EFFF7E96B285E15FD9507839F3C26FC3CFDB433E1D8B
2D4FA5745D829792855EBF7EFD29A79CC2CE40F61FC8F8173E21EBEC36A31EB7
997E3AB9FEF18D583BB88478337EC388C9269294228C98B5EBAEBBEEA28B2E12
A205A1588AAD7993F6C68BDC4822983FF02031D184FB14FF826DB42C4530FA21
9B2B13DC58C0CB2EBB0C1A5FAE6FCF53931CBA4C0EC2C6982983937227F8165C
D3864B312726C55EB91463BA052D4157CDC04D199F984A66EB86C00996A81350
0A859B96E1A00C7CC6BF92C1B30719095A86F424975C72C9E73EF739C622F0C2
10B023F293F5B17B701CD3B603030311A716C033929C072690A37DE3B944B0B6
7B21E513C9AB26663E01ADDD073EF0812BAEB8224AE710FC419680B9573C0E49
AEE44C2E6109BA08610401B2B0E5861DD04918B8A56ACDDA91679DB06170A80F
F792F525ADD1A6F1AB37AA32788BD0007696D0428B69B4D1445ABFB8156D09EA
AA516F22AC75CC5C1AC74D0207B1B5D29640B3DD66C20C9479DD0BEA41D8083D
D7701041EFB71013C491CE26359B71A2BB0BF030A1664AD2CF05FFDA4BFC38D0
1FCF8541C1F5739E5B705DF8A7B08290B7607232DAB6EDD8A3BFD9F6DB2D3B0F
1F19334EE1A2751AB1F48ED597433F4C6A7EDC5FD2C6B0E268A7EC0597483DE6
1846193A8E8E356A58CA6F02FA10D205B68631F8938647C90EE13DD79897938E
C02285145510CD0381AD3200808A940C199235E2F56D1499B8B962C9A8666D57
4C707D1B376E2492906A93D1B62488548A66E4D22134BFE9A69BC81C41C42631
96BC3EBD619C2F76427462027C2BC7BC30D096212DD4E6F841A644B1CF5B308B
B46354B26CCE6682981CBF49CAC345148A100E4BA9840F7FF9E5977FE2139FE0
EA9F7CF2C94F3CF1846D75C83641200199859877834F0D7DC4690C76DD9C0916
5974C90B89D3C4F09311809376B17BE98809A24EB93ADC6C1B3AC9AE57F92E32
A112C3CE4845B02E225E446B5D70C1059FFDEC67555A46F6D369A0E4A2E94AD9
D3A43158C18DC1BE42995217B38D4B2D941DEA42B9882510BAC0134E38E12D6F
790B34A394E8173B99B6C9E782308103858E0FB20B810E171D617698DB3D1FAC
07D8306AFCF5E69B6FBEF0C20B996C11F414A2C08F7CE4232C1BC83DD8C8638A
F57CC09293125ED2D590013BAE213027912FDD0E99C2B6842550F3B243FC5242
F77035FA8CF44C17BC8E9B8E586038CFA056EE767E4C602ABA89EBABBEDEFCEA
D52BD6AC1E29F716F53862A7D3ECCAF3C9436BF497C7E62CB6EFD07DA6BB2309
340A365F4D5581326F36DBCD4614B38DCB6573B8E3074926EB65826C18E40C8A
545B828CDFD0BDC7BE8783AEDB8BE3A693B4F5D4195DF0755CA703CB8993A666
B40E9CC46DFA6136972D6733253FC87BDA0CE07FDE6CCD6D4799EA6CB06FEFF4
E6CD7B7FBD79EBEE3D072B95AAAE612F6E090440280F82D3C1143C8F95948813
333E8F4743565584413C271B6F22F8348178099A4E59500291256EA22421A58C
C189F01C10220C1052BC24AF0113DA7428F17B388837DC708314BDEC6AAD7854
78529C4AD28BE161F95762E5D9EAFB777FF777F7DF7FFFCE9D3BC5222AE31073
DC21C36B9BC75366953B293D5A3C6FCA8DB2468674903EFCAD38DD36BF8D5080
D9A576DA06BC478EBD3DF50CD7C569C7C3F381C5E2C90F5DEA1262FDCE77BE13
FEA3DC2207ADF199A174848AC749D99760C7F04E29ABD20C30834F20B0B258F8
E5E0B9D650D92EF799995CAE1DD6EBED6F7FFB1D77DC21385A5A3E29C7732E12
7D6136E23231C2A04FFAA1EC3A1835E38E1D3BB8CD5434D8B9ABAFBE9A9C2464
3AA42925E51C3C713C4E971B2B439D9EB6626C6B34F6A6C195A0669436C5252C
81846BF83A7E96E38E11B5D00D17862229B7081938318E220C7803CEB3905E71
EA03110A6CFE90B60952F8B22A83B3813FBDE0052F78F8E187052B652740541A
D54A0F8E321ED3F6EDDB6D2CC0EFD3D1B3D8CBF621E2B9A323167B3FA585070F
1ED9EDB7DF8EA513F850377648998A6521583132B472E5F28181623E9FD31582
56D31CE90E2E8029C17A1D07B303EEA025A019E88A09647DB45B1D6B6866D4D4
212FFE433991A6207555A2A1474910FA591F5F970DE0DA671AB004D9B0AD9D7D
DF659DC04CBE6C9BF41556D2F53AA3B6230409896AE10ACA6D04995C3E57CEE7
FAC3B0E8EB2A021C44B719C3E1CBD5EBD923879B9B1FDBFBCBFFF9DDD6AD3BC7
2626F53D2CB26EB6BD97076171919E2F9E972069D97DEA2F01A4F2C5543ED315
36C440728974496D6D283F130E23ADFE4C0A097E9AEFB42B0AF8F7F39FFF3C87
0952312E5BB68CB01FEA5CAA2099EB47E83CC55BDC057C35DC4D565E29FC3814
CCE9E35F0E18C79DB36C6667BCED09833460C2CBA40C5F9CA86E19AE40D165D8
CD476385594258C73E30923311466C01A5B2D84D4B2BF197904CB01EC2B2B34A
1B2CC555C71A41BB7DF8C31F962B53EDCA3630141223449F4E52318497304091
F2001B11850D5B0A3264E313F3A8E6521EDAA68BD68B4A99593FE9ED92AC85A4
0B5AD6786B5B32249815BA53EE0731B82A2DC08AE36373E08837212E86B4B97A
E98C30460CA270F99B642154A26B71648AC2EA82BB08229315F5054F26352FCF
808CDC226689412B670608885BCA6E425B221E804CA0642C6C4F5EC51B200F08
9C996965655820C84C3421B2BEF2CA2BE3749E5A9276D54AAE4F10E5AC519D73
CE390F3DF450C5F4ECE2CD924514E6802534FE7C1429130E322FF369F1E05C0D
65C564F443E39447BAFB83E60BCB7D85F5EB568DAC182C68DDEE8519BF55256F
44279268343A310116C0B6043403522EB60BDD9D2FD23D0489196AA9DB84F17C
810F15E0343DDDB50C9383731C3859C407610631412D1BE0913547A99E67A92D
41CBB09FC62A86EFE2996414EC48DC6A636D5B2E6C49D0CA668AF9426FB13010
664A815F307D6C7E12F62651B6D92E8D1E693FF6C4815FFCF2F1C79F78F2E8E8
D8ECCCC2F2E658EC7ECA8A0221218C98559A8AA1222347290B5D8CC3B8147833
9595DD4D263062E24D6C1A3B994D4228E36B5EF39A6F7FFBDB36309452278108
6580B022461B3CCE8135EC56A5118674FC080D17BF9D5A9B0F0B1DADE7C318B7
1D76E8BDEF7DEFA73FFD696681A43D88CA96A12D1B9E2343A8CEAD275042D2FD
7222E67789CA49918C37D7078BCCA3A4975D59BDF54C3ED272723F6C14844DC3
4D75469E132EA54A7C0D607625E6EA1CA1726F210CB2A3A3632618A9C0ED40B0
0A01807131D7E940E9376DBAF4D65B6F850F53EE19603543C021E2C64AF33455
B35869C26C212E38F978277E4F3E89389DAE257AC42E1F091F3A3D08BC07D747
4003F5A4D2EABF5AFC45B1A394D0E6D1DECE6F3B126787897E7C0462F7BDEF7D
4F6AB6881810FA09F244B6838B2F94E28C587959BBA590612C1C877DFBF6490D
462A51BC49D694782A9646558A64F041988510F7819655BAF0EDDA127E83D04D
BAE1443A6DF963A95399C67719E4494B43C2740A7157B3E8121A5C8E3AF10567
9F7D3616967964D96E2C02876832BB4A40883D05133683251F5274D921119D06
3E32AB88D1E2C34FD442457B669FB9F5CC2677BC813CC74F262F38E579EBD6AF
761248BBC94EB4EB6494A3D83041449785368FD180D48A0D67B52BBD66A25B79
0035E49F9E9093A40943B6883B86AC54699E09C73415E6DA5872CD4BEA353D07
6A2E72BD362EEAFA0D3DF046239AF4A803C76DBB0A6141D309542E9B2F95FA0A
F9DE4C580A839C2E1D7B7ED32F8799BECA8C3731A61EFFEDFE5FFCD7E35BB7EE
DEB37BFFC4C414FD2196039555C9641049FA13E68125E5C0137AE9A59732B9AA
D4F161D1F820D306CA10EB4A92A0AB2423967EBE20516CB0E9D0331000B6A4D0
E5B50B4ECA9A5B275CD0CC0A10AF48A122D42736633565CA8D4A5D2BBE07EF7F
FFFBDF8F78916E8A8CFC628599C64C467E89C3DE0548C3FBDFF6B6B77DE196CF
D71BF54C9869B6CD4CB0A9C9AC71D05B8D2641502C2832E12F279783C884D0D3
76073BEE2DBD2D1600844C4650AB3CD5D2D806F3456EB5B925B20E3F8F1E8F6D
8C3C65B750CC8C8F4D711772391DBE958ABAE2DA68D65263A53315279CB011DA
1007812BCB80E86B5FFBDA45175D44148DD8F94F7DEA531FFBD8C748652C94A8
F60633A12F562A9DE5749C37DB160EDA09FA1478CFDAB56B77ECD8C1748DA0CA
9638F3C2A4C6AC1F152841D0F83A6222550AFD96AD7DF6B39FFDD4534FD95E6D
94B2AB4B1F13ED1CBE05760E2BC38895781851F1C490D15B4F0C0114EE9CF338
F15736DC917A334A07F6E297F85E865C4B58023900A2D6E99109A589938E0352
2647C4EDE6A251701D83CE260E84286C223A78E577BFFBDD5FF8C217549A36A4
86E551216D6792CEFC5A4CF38A93CE4723BC64C3860D308742EC2A9DC937DE78
E3A64D9B64309134FD6323109BC330FFF0873FA4B7C59846A671DC7DF7DDAF7B
DDEBA4C12759888AB2CB0674D5692EB8E0829B6FBE993D25320EC1E0898F420B
C31F822558BB6E15DCF0422187C76D35EB768F0E110DB6C9F7521E6C5E3FF08E
5355DBDF1EE97A2F4992DBB40447A3F5580000B35E494441544E872D872060C7
F51459E435B7B493784E5D7BFA1E96BDEDBB91877F1185F84AF79DE92C5256BB
E39EA6A3504ECB55ED201F6432F942BE94CF95C3A0684621684B1005E520ECAD
CC385393EE962D87FEF3BF7EBB65CBAE9D3BF74C4F5519D0C7860D0DA24213EE
A42D90CC6B8BFF07B9A5609366074BC709C64C16416C988A815A645ADB9E2D68
6F876453E58BC4174CD2BE7A3F1D354A1BACCCCCD40F7DE843322BCD766BC43B
91B32FB968126A0922D6B60471CA4E61270348F78943C4AD813DA32F0FE9252C
5BAAAD7CF0134F3CF1C9279FE46C98499C1A4F9F9A20A31505FE6D91415D1DCF
EB8870DA757846BACCF3B31594553D47A59067F19D451931005156368D669376
4606FED137E42EDAF53101AEE88EF75811CC97CDE6EDC1584667555368303CFD
A8EB1984DAACAB8C89B791FA952A98F9258805D68B0680918DE808C92C519972
5FE58224C476E7B2CA48B66A314D44DBC90B46E918ACF98A5552E776AAD14907
7093591AC2A44CEF98EDBC70B4D079E79DF7E52F7F599AE9643C0B29EA181ED9
200A68BD6BAEB9861992AEECA10D48785A0C8CB2189FD261EE1DD81C0414FF9E
7CF2C9B8259C4FA153655CA24C74CC0880E68AED2D74695D43494B59E20C1F0A
D575D75D77D55557F168498D7A09CC8FC47CACE949ECCF9734AF91608ACDD578
7CDC1EDE4CDE43019E33DC26684A3851E807409C885FFA7DEA040B5A02829B71
B5AE9E41BD9501CE7CF179273F67CDDA9550C1D92CFC30D56E3518104B1B1D35
979C2C3537F56706D37B52347652FA1DF3F1384DA19BCF2AE9CB637C90181BA0
1C87409A8A2E0FB8B1EFB57CAF1D0671A8694AB1929D4C6C3E8B58040E0D0C36
3E1865F319FDEB4C5147037ED673B37ADAA5172499DE30284D4F3B33156FFBF6
F1FFFEE56F1F7F62C753DB768D1E9D161486F8671463699113F61EBB9A2873A8
84E6805959F624310F6ECB4997EF6F4FDC93CE4A71C2E4AF76CE44A5306BB914
FE93B380A4818B66833564965729FCF6EC04C929D112501FD253E4C0481E045C
9C89EEAE315CBC252E083D1BB82C0F3EF820A96703630612950C9B65E9E92DE3
064E3FFDF42FDD7E874AB1F592B296216572A69852233EE8CC33CFBCEFBEFB1C
D1EFA20278B40417C873C2F60D6651789E6D4A6ED31694E597D901BD5DEBE716
8E8C68BCA076995BBA7453999D366B5A4F3339F05F1473FDB8388486F84E2765
0A23F72F9E995CF6541C1B376E7CE94B5FFAAD6F7D8B6D59CC24C295965643BB
38A12C6A5F61A1606582CB27035E88F391E458D74B92FE5C34447C9FFFFCE7D9
E44C8A6067EE905295BAD804748AADB213D0223A2A9DEA871BC3C3123620A052
6E818CE14D7D3D6D99F0D4B87922671087DE7AEBAD1CF3C93A0AEF8A7EFA1215
5451AFF0BC7029CA3D6DBF8423F82BD707B7C75A3DD78AF00C09E1655C0F91B8
175F7CF12DB7DC2234FA1409F68E4A4D4830154B337625698F82F04E331262EB
0D61C494100AE1A5975E7AC30D3790208C474ED65C1893187A12F5815FE2227C
6A1E5DF6AC2D3169442D941D621D855A0F426B7153EB6FEF29179E75C286D5AB
576643F8D366F79D58804392FD576929585E727D4F755C0DC144F0952822ACA4
A4D429413BC62D36D7341771E81DC3D4D4942E0F345DA7E5798D0C2C8106983A
F9629CCB8638DD7904BA2116D9093449913220564D3DE43AA1A3E0DAFB9E1E59
E3BAB95ECF2BCE54925A35DCBD77FA7F1EDEBAF9B19D5BB66E73923C49CE99CB
851BB175EB5662C7B16B575E7925DC17A9FAC027F8E4273FC94964F678734826
BD04724C51C15147CDF718BAF242AE353C55CD850BB2CB1717A42842814274B1
FB140C314BA24364083681F96F7DEB5BBFF18D6F08390A39DC24445396672C46
1A17B9F0C20BBFF4A52F099191328DABB8080B6C745F9C94A381977AEE739F8B
98804D6DB006B9AC1E91F6E2979CF6AB5FFDEAE8A80E26D66FD8B06BC74E2F1D
7B25F76977710B5F99D45C4F3BEDB4871F7ED8A15AE70D319C6791846FB2692F
6DF67C65A1BB924E4F20A28F5887A1FAE1DDC4781B9DC44BBD636C8B85623B6A
76581C3CC32DDA6C9850A0552CE6ED718C7CBF208E38550D36C02EFDE307686D
7C56FC47D21E70595FF5AA57FDF297BFA48A1195EDA553A7EDF21A0325EA2FE6
E2591762E560B1A624276DEA6315A86B38220D92508389D36A6351680CF003E1
F62297BC19BE4DF04276A6AB8B45846A971D004215D74E87510B0E58A59959E1
6F584C97E124B886128AEB7CEAA9A7C26B60F9842B26983FDD5D9AE2DE84EF8F
0C2DF307E9603139794619470F220EE3C113CE54809C3D5B0C968EC984204F99
24156EF8852F7CE1CF7FFEF32EB817C26A585365EA13FC93ED7041B91027EAA4
1C7C8217600E5712C44F0B409A6F0970BC219FF6BC2661B58203D4532EAE5DB3
72D5AAE5A5829EF288D3AA878C59C056D1EC940761A2969581E1A0B7EBCE7DC5
493BCD8748C93AB2D244B17C0591FE71A29B8A634D3251F71CC4AFED6C06ABE7
168A3A58299672AC6967435F87C19AA22834DFE3ABC48F237DE45D47578FBC6C
8FEFE12CC78D56FEE081D9471ED9FED8E69DBFDDB23D8A8E13EBCBD05946D292
1D65AB849C23EC8B08A1B2EAC6E2A93CEF79CFDBBC79B3ED3FCD7F49564DCEBB
A477842A8D3E87E0AD711B575F7DF5A64D9B4493524E24A9259CC114665A08B6
74910B594454A0BDB624BBE96061A62588C7112F2A4E59C8D83948D9A3833E07
45AD9D06EC729C219A26A76D8363AAF65248A70CCB638A4CD2A7977C5A873BD9
6EEFA68C0A0E84EF13C00F9D11192D49F5442757B899083DC63AC766773CC78B
922835037A02E56C55A7DD9FFFBCE76F7ECC30E0170A95591880383D279D2F95
79BF90067C29ADA29B9268124181F71369830D60863A49B944F027381DBFFBDD
EFA46B4C14873DE156596D4A2C110B5D225E9CF9BE589E5A62026EF6F9E79FFF
831FFC80F4CB542BF69BA53EE9A6DC0C4C9E7018D349279DF4F8E38FF36CD8A5
21665D1800C101A7A7AC2CD6111A6C69B3949D9680D4EE91C1419A302F65018D
167C2EE975641B2707E6D04E53B8B1F8648DA58346D03D7E60FC6ED3D2C91966
FE144FC756352F7DDD71C71DEF79CF7B684BB82CD0DAF00179DB74CF17BC4F5A
7D95F21B46E97411CEC196C383EDC03D33DC46D08638497803791A71F38C6BE5
60734359FD639B31D94778CEFFD0EC90006A850A454C918EDF07CB23CB874646
86CAA562ADAEA352ED711BCD653B925E4A8E1DCF9DA2AACD43EBF8AC5D7EA954
8FCD7D2496CFA38D81E31EBFE1B92FF8714DCD579ACC7A2EBCA25626EB660227
9757B96C502886B97C9009E1B0FB3903CAF0828CBE7AEC688412CEBD191EA3EF
23C8BB3EB606417CEED0E1DA6F7EB3EB89C7F7FE6EEBAEA929CD29808D800C7C
F9CB5FBEECB2CB18D63344FED33FFDD35FFCE217A2E9D6AC5903C9E772D1425C
71C515975F7EB954112081108F8B2EBA08B1386711DAD8745BED4AE7A3637188
DA6E964ADD052942B0D8C65E6E368E71EE109978E8195317B12F87B132841F6E
3E4C084FAE10A54863BC08899D89622E88FE34CDC077BFFBDD73CE390717176A
74D11E8C803B8046A733A32256A6221B98A21AE2956CA76D4BD2E9946421D3A4
02A1F623EA8748AAE34D7D2A05CC24E97C2BA19A8132C283895B4A211690C947
3FFAD14F7CE2131081B6CE76E8D9A75A3EF40711BA762A42CDA85E2E95A76626
870707F1A673CF3DF7861B3FA38C6F58999DD15CE84E9C7A408A97B5C370CEB4
227BAD9D438426C226D19767F842EB67B3C0D36DF4CC846465F1E64BFFA7B29A
81B1DF64CB8042812D79F0C107BB467BCA8B09254A157C6D52FAE1365EF9CA57
22F885E2A059665E2B499B5F6877A9E024F0820CB17382DBC37282003D4576B9
ECB46ACF7FFEF31F7DF45156A5781106AAE49CB23164025E26EF05DE80DFC3EF
5EA262AC16E25913574052AB76EAEFB6DB6EC34115662EBA05AC0CD9B84C566B
E8202BE38C304DCC6A076D0F2B1C02BA5D2226502990890E8E38DD320B411A38
080AE2AD3230120788FA5DD81511E6BFE94D6F829EBAF9E69BB91A62024505FF
4196808380CE3BEFBCBBEEBA8BADE6AA939684C8B557AE1C191CE8EDEB2F15F3
994A653A930D3CA7836A537307A6DBBDCACA468E261D9F572C41FA436A2D5C7E
247509DDE33B9BC476A383AB8989E25AAC665DB79E0963C4047EA0B21988AB5F
2804300C61E0906F391B64F5DF123C42A2E14EA6A8817366CAD9593FCC631FDA
EDFCD1238DDF6CDEBBE577079EDCB227F1427A2174EDA98604ED2D50E0AE6A8A
A8331951479491A40AC883C020D8464FC9156C7FDCCED5C8A9274801270E4AE9
DE7BEF650A0B911C84C446BA43B993F1857EBACC0C20393F897E39325DA56CC4
54B8D2F048F74898110498207745BC29D687C5369B4645CEA0C0D061B81B4D53
C46529346A43CDC19B3972E8B0C494D060703155EA2DD189171010816D1C55A9
0586494C2EB77C136152724EDEF18E773011C6E347148A4A9BD93AFD1A01E289
4E4CA02D96A1AD34EA43995BC91C9B38DA633000A36347FBCA7DD333BA628E07
C830E608DC148CD514A789D1092D108CEDB5D75E2B34794ECAF9DEB546724858
2E1667C1A69A12974ABA55290A42AC6F773938BF474FE9F1EE0C73F2A5B140C6
B4726FB81F52AB50694D9F193D193D48F1954E6038D1A4B4248E8D469EDCDACE
DC49DF52B6116E223E17997BF12F7C96DB6FBF9D27CA0E23E66B34080D9D14DA
519AD82EFAD5673EF3994CB990D2044E9C14A6BAB05278CF2DB7DCF2C10F7E50
66A00A3904735FF474F0713924B265CED375C089DC53D1F374D1A51226223E0E
2EC8DEBA24E52C62715840C9B80D6AA2AE521B150D0305BBAEB8843DE81245BB
B1282D156A65BD61C3BADE7211EE7636F4A6A7270BC51C343B71A2F2A5B625E8
360388F4DDE383CC2C33A03B063ABACF9139CCF11C4B90885A343FE0CC26ADC4
813855E186657476C80942D777A34CD6CBE5DD0CBCC64065025882820EA7F48C
62276A6B4B00C985F3672293C0F3A19AF2355882585B82C71FDBBF65CBA1A79E
DA3F31A38F216B4BDC0EE9F32295BF3068F2800B508DE6939C66CC0110EFCFF5
E99A91DE65099CB96C6002EE1002121B5F7FDD75D7C103900CAD6466F8036E86
3C42FC0D76D00ED3554A0A445F8748D9209D174B4BA0E651A30BA091274EF8E9
F0FB33CE38E39E7BEE11678B4A86812F19497B7B0C08B032E3998B144A5A63E3
79C220643B14DE7FFEF9E77FF5AB5FC5AAC2633E74E810018DB675E1B377540D
EF49F06DCC48F0105E73CD35F0F785569E428CC763C10D0B77D75D5F8727C522
F5C478053E82966FFD80595F4FD4CEC22ACC56EAFD03E5B1F123F97C3636BD41
3A300FB38D66757878706C7CB4D96E14F2F0F7E1FFC2CEB54AA51CBEE5F0E1A3
6675F22C13C5915ABB4EB70B985D775970EE4C92899935634AD4B6F952B6A68E
5E785AC5D3BE9C941185A51BEE87F4317AD6A0151955CF7D75CD180095D2342D
882C52696C211E37ED1F1F4174AE6371922CD6E5C0988907093FBCFBDDEFBEE9
A69BE8D4B0930BF706F1FAA77FFA27AA636578847832550A53639595FCA33CA8
5449CAB8392C45BCFDED6F4700CBE145D2EA45BD4CCD15A563F3B820713A678D
8F493B217E992404E496A8CAA90E106B420809F116F4A4CDD5E5CE655990A5E0
E197BE0A5A174693F2A4AC030B55A26D6BF1FE4B2FBD14C24F5B1EA7432F0413
625723ED0CACE473841519DFCE33254631C55F68D53030D8B76EEDAAFEFEDE48
034775763413CE51E8E2B3BBA9F4267359316C03301744A401A31D7EBA344744
4FABCB9674CC55E4BBBABBB8ADDC9AA3B3439AA52E08BD72D6B055C32404DABA
98DC35ABDBBA449C444EBDDA68D5E163C51DCEA24CB9DD4A9A51586F044747EB
5B9E3CF0C46F77ED3F70786AA23D32320219E0328AFEB5B576D77ADA591406C4
D2BED7A5F1C533A00FC70118769B5817DFB0B8DBBC139C539A67FA01927510C6
37519DB42BD29463F7D3481955A0E46C0491628F3C5A578E48E21EB200B1C158
2A1952E364E25A10A26F7CD35B7EFCE31F1F1B1DCD983AA5261431036B0F1F3E
D0DBD7872F9A9E9A5A6E167CD63C0B5425EF4172DAF4515EF8C2176EDEBC599F
6265F5B8D200B080297821B6B6325FC1A00C0B847B0DC32C3D68D25E7B6E36D1
DC150811359F49262CF99EC612C451902F64C6C78F96FBF2A63615CFCED6B432
CABA533353898A7A7B4AB5DA6CA355CB66E0A8362163C562A761249BC9F3D035
753254192E5C72C8A43656B7B0478EEA48BFF838661DD3FCFEFF9F25604919CF
8E55660E074FCDFDC0975E70C105F7DD77DFD6AD5BC90DF7FAD7BFFEC1071F24
5184BE5B93C197A55FECFAD2049BA4A38538A943B836878787C965B8C475AEBC
F2CA4F7FFAD392D063065F52F614A9E73CE7394F3EF924EF4D40B4AC5FB1AB85
B307F003769CD835C10B50ABD25790A2AE4A8146122CDBA31DF812788F045B76
A6C54B874CF1CD8CA8E274F6008FB132232711E74A1B39C3733537DE97562CF9
6AD6BD701D1249AA34472F2CA7D83522469274921FFB2D9822206A4559C805FC
E6C081035DDF22C030820E98F8E682DBB90E1234B1FE615C5AF3BC03E5F5EB56
0F0EF6BB2AC69D4204F43C82B933783B121B0B247481C8C03609E9C7995632BF
718591C2940AE67EA49377F632A68D39821970BD162C41984960098A414BD782
430707138626B5C77080E0F07A710B5169336AB5034FBF077F683B99662B6EB6
825A233876ACF1E4B6435BB7EE3E78786C72B22971F929A79CF2E8A38FF2C888
66174B208F4C175ECABC0CA9ED35E95A1079619D61EFE1388AA3433964A25C92
EFD2786C4FAAF9F8C73F7EC51557400CF07E1C3AFA558C4E24D3CB43CA16078A
197E49CA68FCCB0886D00349008891233ECDB120857CB1BEC59FD7AC59F3CE77
BE13B7C18BE34E28451236696474A94CD073D46E3B06E6A77BD16BB5DEFEF2E4
C4440E8E0BC208D824984033A56A6CF4185596DC95201B29990EB787C953195D
4BE702A1D0B7BFFD6DFC8CFB90CE69C61766355DB60D6742C389DA8A74433BB4
4A58CC667A340F498267869F1F22209DA98CF5F517A76726203CCA2494B23956
266B33D58981BEFE8989B14D1FB8F4FBDFFFDEF61DDB104FE0F9023F80AEC00F
AED2AAF0F0D183B96C8E698D66838AC338594EDB3E005255FB235A02EE251BB5
EC205DC829A90DF106ACDE6B5EF39A471E7964D7AE5DCAF2E597C0C50B140722
423E3BFCF0D297BEF4473FFA91E0F159FFE128B7C52C016B5932DF03624D6257
BB515CDC226965A4CB8FEB0B65933296FEAD6F7D2BB69E5A0F6F664158596DEB
947EB6E4484F032359CE0650A683815C6C04A40917AE6B4D8295321567D8119D
CC53210D2E7827429C2F7EF18BD4B344B8B19C28BA40F62549B902C59DC4B93A
EBACB3FEEDDFFE6DDBB66DB425CF7AD6B3B66FDF0ED3FE8637BC81AC612A6539
9684215B5E893A65228BF4B41225D882345FA8649C11CB892B56AC208BA44A47
52531FF5F5976009101C877A3A4DA4C9DDBC0E4DA6ADF1554A9A62EBBE2E83D1
F5B3E7A8B492CC21022AD5FB919801311E1466CF77433DDDBEEDFAADC04FC28C
0E02727EC37C36C1C94DFB930353CD2B40A0DAADA8DDD417CC84705A7D981C04
B4B55AAB5673666BEED87873D7CED16DDBF71D3E32516D754867B1FEA79F7EFA
030F3CC08C102B3A52F511ECAC50BC6CDCB8110A171A50BCE3052D013B48283F
CA627921FA8B7B218011270505301A60142EFE2E5BD858C122D2FFB6DB6E83CF
277BCA84FBC5175FFC95AF7C05F7230822F68E28430F878BC8E3085AAF4B6C98
06E4D9612A12774B3C854DF1A2E68EA9E147FA074C5B35A4DD94DFB47E6FB54A
BAD747276CB2B91C278268BFEDD0A142B158ADCC0AA0D12E633035D7B1C47C6C
295FE0C8BDFFFDEF97F930BC690E1097D0C1207606EAB56605EE8F0721C8D4EA
0DCF093361219B29877E29897DCD8DDE44CC58822508424DC2BE77DF8E998A8E
C7755D3EA30E1D3AD0532E85A17FE0F01E84A6307ED395C9DE72AF7EFE66647C
6ADFB01BB513950C1A6E263C6E2E9BD795F45A338A75522C4E5A569620EAF038
EAE1C36914F9FF6709981610D60495F2F5934287C6805BCEB4202B84A232DAE9
30EE252C01B699A034C82E6CDE39E79CF38D6F7C838D63CC81AC5AB50A8A9877
BE34BE5EA5ACDDA44D6507A3CDFBCF9FC5C97ACB5BDE0269A6B2239A0D6F637B
AD440CCA6A3827B296E22EDEDC35D75CF3D9CF7E96368CE86C5E5C52315DB72A
07C34D478A33B7C6243EF3BF2AF59248D2C0D413EEFF431FFA10E493A50E490A
759D2E5922A1FD59BB762D6CB36C1C5B25E052B10F08928FE725AD3C597DB002
5879E9E6A3FD8072C1B940EC351FCAC9C7910800FBC55975FFF55FFF25EC5BFC
46FC89988BFDFBF7E2B3BD7D3D6BD7AC5CB66C281BEA661A980058021B2D2A3E
BBA8123597365554A1AD16B58DD7EAD5215662AE31383EB5C9EE47F37C2C178B
01317CB040FF4F3352E4BC96C67398A633C613048F7A4E99164B257A13335978
81FA80B45B6A6AAA323959AFD6BCE9A968DFFEF16DDBF61D3C34566977B2372C
C610D7C0F97442DF6D57D19891C35ABDF9CD6FFE977FF917A233EDD6C86ECB67
B43CDBFB2103380277DF7D373E7BC20927406B75813B59489359F012C58A0F81
AB913142A255FC274134E21620E0D8BB772F69F2D80C8CAB216A849301C30F25
204EA4EDA412E9C42AAC247FA4A75D9C744A35DE431FDD2E8B4A6B2D635069AB
82B8C261E2E0100ABC3261849332EA4BC3801DA9409EFFF11FFFF177BFFB9D23
27075F396B5E92F0921125D75D771D3E805D213A8AFC2DB95C015B1E069AC269
A6329BCB147593A19BF5BDBCE7E6559C8131C0E2077E318E5BC552F8EC13D7EF
D9BB7DFFFEDDAC0D1E3D7600FABDB7DCA39CA85C2EEDDDB773DDBAB5DB776E0F
0C8A0096BBD16A687A22DDC7A805A2AFBF8C1D456897D1A63767120E6C05EA04
6E1AD2A6352F629F66946832C53F8A25A04FC7540FB3CF8C2B2101D0CE8CD738
0E09126007014264681BD4F92FE16CA07DA5CF4BDB23137B2EB9E492DB6FBF5D
E6532F781D9911CF6608112FEEA01C3666BAD9492B58029B6451644E7A20393E
01C2D4D55BFF8C673C63F7EEDDD08F4276C82FC5373280B071994CC753DD2F68
09A274E4D3FAF5EB39CC80D15262689D18953A293B3CCB30D27C6BBBC9DC2637
ED40E6E9555686076A8821851C72E996E7321203463E54CAAA0CDE113A96F996
C04D792F9861E3AC3A76C9210441B00F2BC225E5505893BD71CABDA535AB578C
8C2CCB65020E30F7DC9867B59D8E62EF60E19DE38EB09DD8491679F9CA495173
54F89D5664C79D131374FEA6B3BA58072F13BA70DA3C3F817F6F2C8197D3F922
486F5B23C313F9ACEFAA42C7AE782E2784E3BEB47BDB888F8D4F8F8FC10DF7AB
35E7F0C129588203FB8F4EB53AD46C946D049D3FFCE10F5FFDEA57DF73CF3DF4
D6D9B5675B02FEFB177FF1173FFBD9CF88FDEB6A69B22D813DCC43F69DD3A248
E3C8D5A0A4C939955E62493CB2DE20CCF3B6C0F326ED51DB7CA76C93C4DF5FFA
D297B0E32290768E6BFEC9C5055FFCE217C36920E39EB41174F934D406420D29
C9253A6775F3A2BAFFEA57BF8A6017DFCB48543032AED55F263503793A4750B4
CC4691218F69221C06386537DF7CF3FBDEF73EE19359BE7C98E5DC42BE3CAB77
C5CF657471BFA7D4E738814AE0D2E0DFC0F77286972A13477E657672B63AB976
DDC8F40C8CF3184B7989D2CE72B1943F7AF47033AE9DF49C139FD8F298BE896C
303E39EE39BAA0A787FBB5DB555D4C767DC7E73984BA33E6B763DF7C4F4FD163
078D26538F9AAD56B31DB71D95FACE7F8CEC109318CCB2498587F3A049364250
0D8B93ACA672C2061D90A5313052A7C29A639D65102BBD06FC067ECDD6AD5B05
63BED87548CB2CCCAC443E283317B3AB8F41D29D321C941E1085091A1C7FE2D8
2FFA2F22E8526EC5CF679D75D6CF7FFE73BC4D06531317888B40B8F19E57BCE2
15DFFBDEF7E87FD9F44D0B6687D8AB8C379F77DE79DFFFFEF7890EE46C716570
4ADBB66D53C6E5BFEFBEFBFEFCCFFF9C87B60B62AF52E4E571F936FD92BC6D46
369235A2B72550575C90990126C4A0C7117F307E272D1D3E7BE18517DE74D34D
4B6787B850F6200A359764DF56673DE5FCAA95CB57AC585ECC67F1347062E0C1
8825E0A1EDE4739339D1805D52560BCD3176DA9A5D2EED3873ECC8A0CB12F03F
4D2EC8D79620703D33CDD8704BF8A1D73627A86D865F461D33E0BAA197519EE1
2F7295AF172913694BD09E9E6C4C4E56A626EAD0C3F59A73E4D0F4F6EDFB0F1D
3C5A5309799B991C235980B266BDA9B9D921DE189D1546518981C92F961DB239
B258E995BE3031150C8BE3747894B4AA60471088FFE0073FB0296768D4C90125
CB4E5F1BBB498F907BC4B17DE4199B1FB5D8516362DA92210374E705EF0E7DFB
DAD7BEF61BDFF806EE1CAE0364927106542EFE046D202008A1C03189788D8D9C
98E0BC3F1F8B0FAFB9566B04BEE93F68D40BF902A91EB5B9728E0F6512D34B28
0721249A478C2B72D24927E14860AB20A65D212DBF9EAD16CD66DD18D8A05E6B
E77245575789A0ADF0459950779FE754E2476D8D20CA668A70DE8DE26EED3DBC
33A77B1FDA6126D080355D7B728E4D1D2BE74B85225CCEC2966DBF2B647378C3
A5EF7F0F5664CFBE3DD018B90C23A93A2156B96C81792E5CD39847BDF7819FA5
6FA47493335643AF723B6EFDB12C81C010A5178C0CB40C14A4D9BDE358A5C94D
957278D0855C02172F7745EA121C0F3C29A9A6A42986BA521AE896B058B8C89B
DEF426C8B4060F98B48CDDFC2153F7921482E9A6CDCFAF7FFDEBE19D112E4D9F
9A23E7E8470B2893E002A93F6FD9B2C531D43A3C60F81482533844AC2449ED81
7A50F2E38B558C49988AC3004786B935F6FBE0FD36250B7BD36452BC8DC790A5
389EF448BBCAA55B5BA2759A67A9D8DB8BC95667926D488421F1DF82156329C2
0B60897FC551C22F196A33919892013435B14A3E58BE6C10DE556F4F5163E7A2
9658023BCBAC039D780EEF905D1BB35FC7A1386D1398061D6D2FDE7F8A23EAAE
186B2A094F4F3636F560DDEA0CCDA9C142BA0E87C3A52D01692A5827C8F89EF2
133385B30DBBE17B59E57A515B4D4E366B55FC2F6AD4DD89C9E6BE3DA3BB771D
3C363A5137B6D326C0A7A2A751B49F2549078AC1549F7CF2C9FFF11FFF41F160
F692867CC18A318BB48C80D99DA02CC0828D5813775BE607887B642772056083
3B61DE5FA5E4894ECA23429FC0460788F294428E7D939221E0E3BB8682947D06
89613FB5B94F704BB7DC72CBA5975E4ACA0052D37798349DC4A8C1CECE722571
E5FEBEC16363C7386CBA325B11746562D5E4F9110A9810FE3B42798A18961390
3962D72670762DF26B65547EA3D1D22357836CD4761AADE6739F7DF26FB73E55
CA957B7A7A3D37D36C449073CD68EB8787270EAF59B672F4D8A176D4A1323515
670DEA9A6D55727E065E3C0C5AB531B36AC50A0DC2CDB439276B627C6A667606
01072DE7C0C0208F6526D47E2E5431F3182A2178160F8AF3D3D426BC59FB235A
025B87DA04D1E49E13A27319B3275373F97B660F65B4DEFC176D8C9446991D92
11609486EBAFBF1E2E2A645106C7CF7F51FA654885B07B2ED69C22AF2E380D4B
67329715BFE7FC00C932A974BC8F747B4856574EB52085A46FBE2BEA97B32128
529B8F9A6FB639BA11287CF39BDF94EE42F6FDCB86DABEB08C0C72D3D66B463C
3069422D875FFEE55FFEE58F7FFC637AEE02E9E120401C6958D33BEFBC93C315
C48B978C939D8CB2AD823CA670D633C8A36A9079D7E97D9A6D0ADC81FEF2B265
43B004D01BCC0E3131D865095A6AE1CE32D7E2B7B13DD04CE233E44ACB03E934
CDA4E9CC7BF17EB408E9C968FA34E99135B00401226E8232624364D409E334D3
9CD2DCA5DA88C7AD043107627444090A763784A26B359DD9D9F8F0C1A99D3B0E
ECD9751851422BD12D32A79E7AEA534F3D450E70CF1A3A66DF3CD50E579B0473
584FF69A2C66F6549A1D626A851195C4EEB23BA2D06C0A1665315D0BEF058FAD
4DEE6F0FA015BE2C52315E695E94BA249D802BD34DE6C7F136A281FD8F8C9859
6BE4C915C426EBC6381D5807FC529A7C1D030F1B1CD4FD6E95CA6CA9544C34FE
6D165F0533D06A43019A56A4FDFBF2B97CB5564DE6B6288AE8F256996E791A9E
7AA60264540B04B2DE68968AE546BDFD96379F7FCF3DDFCBE77A4647C736AC7F
26BEEBC8E1314D4AE2F83395A90F7C60D3C73E7D4D4F98D72E869ED3AD0CD2C6
779D6CADDA28F514021F0BDA3C36335E0A0BCD56CD0FE0493512AFC94A9167C8
F66ACD1A4255BDCDAD4EA73E44C875824AAD9E718BE59E815A35D642EC434EEB
AD76B58998A0558B0C850BC4DF409562DD6699682A248A829CC6B3CF3EFBDE7B
EF256E8C71287E4F7E41BAE14B7760893965065CFC3E9B990E0BB861C30678C7
3FF9C94FE8830BC3B678C70B5E9F3E2FAE40703489C5E96B407494C9F960A70F
1D3AC4FB24ED38E3475C1F9EF59BDFFCE69B6EBAC949BBCFEC393F6A4954AB94
D462337BEBEAABAF16C8E9FC972139EEF8472498D29CE9F0C28CE97504731545
19439B054F2297CB1AA843840051C7D75192CD659CC465D4257C41AC63BB7359
92ECF2A9B248B5A4682FE185984C6CD30D37DC70E1851732034694277EBEECB2
CB3EF2918FF09D32131CAB8DB0E6AAABAE9271254219648FD5BBF8E28B3FFDE9
4FBFEE75AF43F8C52E48EE35B78C01B832B14E6281C7A5D8C0EB382EEED32F15
0AE5DE52B958D00DC65A5B274907F9605AF6D3226D2B9983B84F16E92A909DF5
55A725CD0F3A0822A7C39415104B0ACD6E422AAD93F1BF8C7E1F14BA196FA98D
873606F8177AA8D85B9CAA4E3BA103F73F9F0BABB3333DC57CCB699B5B8C12D8
9830C0E66672DA672FB447DA813F36331D35DDED8F6EDFB7E3C896A7F64C559B
580E6828F880AB57AF81F585CB0A0F32D6C0F3E3BC6CE22C4BB24818CE99ABC1
0272827192D222D85D02AA438599A762B5A9986D383FBF8E2C58F0BE6520AE34
5ED10B116A7496943FF8C10FC21BE3B748EBBED00C937CCC264711B740B8F328
0FAED5854AC75C3C24280AA87B4A085D13DEFFA64D9B6EBDF556E192A31F263D
95F67120BC423213E29CD10A4A1B0425B0AB73D3595A2338294F9E1837BF136E
F89920BF62C5AA5D7BF6E2E79E7C8FA37CDC61BD86404C0F1DC377C0E55F35BC
A25A999EAE4EF6F594210410CBDE72FFCC4C0D5164FF40F9E081C38383CB88D6
D22728C2B325ADA44E150953618043B4BDD3ADB8F17FFEF7FFFED97FFE6CF9F0
0A189256137E47DC5249291C0C35380AE16BA3CB12E8C64927D2FFBA665A6072
1C3AA613A0C67994AA0BFBF784435F7E5E22AB036D8B8DBFE8A28BA070D904CF
0C207341E253F866DC31DD6AB1A9DC0C0ADC821787E4E1B2CA2431A4C3456C18
6C0042044298E14A4B214E9838550A226203B0981061885AECB984839642F3FC
E73F7FF3E6CD9D61448B088AFD5F0648A6390787962FE3A355CDD980A6E03811
5DCF37218B79B4A69EA5654C177E0D7F87196196A0B19E44302FF8B5B1A1B9C7
329231540E95FD204C4693D902DF2ED0723AE9580DDC06F172493AAB952CD658
37BB00684FF14B4C2BC9FAF5EB1137E3E061D95FF9CA5722BC20BE500E0E3F2E
74E80444897360D65F17693575652E572CE56109F205AD495DA713614466DE98
146963D79333DF55B276E64142B5764F3A9D65DA85F7A5300C690C1D0E23337E
91E901728D31700CE39182F3E4E90F622BB5DB9E0954B5510FB3F055DD7C2E53
9D9E2984997C2EE7680BDE6188F13321B16A3A63EB9567A276AEB777DFDEC3BB
B6EE7D6AEB9EC7B7EEAC2B3F69357B8AA599CA0CDEABB367ED8E6331DF1992D8
0EA703426E4FA26598C5AE3DA1F2951093119B665C30E457F427C81B68FBE6B6
0A168E6BBE817BC451DB360D0F44113F4B19992C0E0C228986A2A5A7DD92D8D1
49BBC4F9296925635CC5C88FFA8189D3356BD6ECD9B3C7A6E4C3152069DBB76F
E715ECB03BB1E6719E74D2494F3CF1840D6E144B4075248DD3E2170A5AC91EB4
B7144FBDAC856022CB3DC5D94A2D8A937CB654AD3787FA97F7F50D9CFAC217FF
CB3FDF97CDE671AE6B357D9847A7469FB17AFDA1C307960F2D1F1D3D62A8758E
B55A517F3FF669D4F702C4357B8FEC1BE95F0959D4363370EBF52A1C8B8999A9
52B1305E399671BDA1E1FECAEC64AD560D42B6F2BA956A2597C9B59A0916B894
EDD7021F430A758A13960071432B4264504718474BA00C820896208995AD49ED
D4306701B230C5F5C5C64071D325594C531393801FDEF296B77CF7BBDFC523C8
B844958E255056CFD4BBDFFD6EF88F070E1CA03AE09D2CD1670047E0FAEBAFE7
DD0A8D5A7F7F3FEE8D24D57013DEF7BEF7F124E04E985E148F830FC87FA58AC5
2CBFB4312F6609A810A5C68B9FFFE44FFEE481071E58F0FDF96C0EB1E78A9115
070F1DC421676E070E3F5CC5DEBEBEC98989B24994E3AE60323F77FDF54AB753
E982076282528F6E91C70FF9424E03BED28A9FD09ADA195B11CB8E476205FB5D
67800D0782D27BD9CB5EF6D39FFE947FC55290559025626CCA8D37DEC8EC10A9
0C697824E74B13289DE4A25CE6AF984451714A7E492757601EFC810EAC799C44
A33C0337A707BE646109F47C927C467BF07E273D0D37C8BC596BDBC871256D4D
D775416370BC4092743ACB0C17909B566563CD18AA93CBC72D01C4D051E9F826
58020DE548CC844BFDD96C6F307E6C62CDCA55A11B1CDCB5EF39EB37B6679B5F
BEFD0765A7E303E82202FB9975455A556335BCAEEFCCD79F736CBA72E8E0B15F
FDE6C9DF6CDF85A04F3553BAFC761B82313BA331C7E552CFB1F1311B06E3A43C
715D88BBD34F3FFDBFFFFBBF2FB8E082CF7CE6332CF6D8231CF8A2CCE02040BA
D8C98CA32D0CC76A6E9585EF7FC94B5E82CB4A7FBB7C9DD484F02D64C7E3F161
BB95327003048E081FE984919F8E0E9F14D5E4F808C133533D5DCCA0EC926153
177CA0246D30E21C2AE61BDEFFFEF7DF76DB6D7A0E414F0F7ECF9675AA20BCE7
CFFEECCF70877876A64C05462891AE63A8B738365C783645193EBD25901CAE93
8E7DC7457BCBA5A9A9999E52AF4A703C14C203CF0B07FA87F61EDC5FCC946A8D
566FA91F1168B55A79FFA6F7DD7CF38D49EC9185BCAA5F7543454BB291ECD1A3
A3081120B46C7B8309C966C37CAE746C7C142AB45CCE5766C71D0F3F140F1F3D
383C34FCF6B7BFFD1FFEE14EDCCF283C85627FA30EAF29CE67FA3319C49D2E6C
40A359C5BFED486F83C9B746AA53EFA225700824C76E516F920C8BA35778DAE1
399E78E28930CEF7DF7F3FD43A1B3A165B1FC78C5CA60BB976ED5AFC8B4BB1E5
42EAB792F5930F0A2007C1E0F9E79F7FE595572E767DF6F1C9F8AA2ED2024295
24F3C352B0A45FED728290EEB2FE4F4766314B604781CC90B01A26B336E7DF27
560007F5E1871F26B39832D09D580F43D7A9E143070F668C57CE86098DDEA956
43D3E4A2C3055337ABE37499DB79F9CB5FFED0430F7188F1E5975FAE94F44375
A454B4BFD41EF1665E59605D32D00D8F497A57CD869222CA9976E3A3497FA93C
0E44823729A320A88FA89B1C6BA81645083FE3234F3DF5149E948562D96BA955
3829EB94141EECB26426744BA5627F6F4FB95CD203617221512E71D2360E5DA7
2B3B72946D097864162C1BF087C0E9F0928A31E8608D62652C81A297ACFB0134
4015BF090D6D7594C05AA8B6A91EEB27A8FBF5E503C3F5A97A4185F7DDF3EF38
6CB3E38D82AB8AAEEF2469663032F1B7D9422FF40E372327ABA6EBAA50CE37BD
EC81CAEC34FED66C78618893E09243B7D92CE60AC38383FB0F1F8A2D224895B6
4D382905A1D40C94F1CDD31442779796D44265D0D8F1D2A6F506F919428BEBC3
4B403C47854BD406E1F95D251FBC939CE774F95966808DC10965CF0145A28BB8
0C1FA18CD9E22A57A65215EF47A570265692E9C7105FC0EC25353B2B4FB60B02
89E27005BE99BE3F2F2BCD744C204B4319F58FE0AA8F8B905AE425D54E0A1F2B
D4A562F6D0A1D130C0BD46BDE581A88DF5D5F5DBD5ABD662D7F61E3C30D03354
AB36E0C5E7F359C40181669EC899D207D98363130ACDCCD666579AA93590DE72
CF40A3D1822C8561360C4AF97C66DFFE5DADB8D2D75B9C993DD66C55580F99AA
4CAC5DBD7AEFBEBDF95C51F30EB59342BE1CB7836C2E8497D0842568D49A6DC4
2B78F296EF25ED084BAC655AC38ADA4A3236DC306E098E31FC14B2F109447D85
A95D4B1D78C1C521BB3A93BFF8CFB7BDED6D77DC7107B750EAF2CA9A6E41C521
081361705A6CFDD9024602517C6AF5EAD53B76EC607959DAB5ECC886B53501C3
90F49F254A92D3D1E561126389EC904A87B8B1A5569926CFBFFAABBF4208B2E0
9B996727CA13DFC2429C8EB8C300EA4ABB8B093C4253E8E60FB5DA00076A1ADF
50C3211A0DFCBEDD6C89078D47F8F0873FFCC94F7ED2B5E802BB2C012BE4A4E5
10BC93937650F349F9FBBBEEBAEBBCF3CE63C50B9FE5AD32358783CD7583FAC0
D5102E9C7DF6D93FFCE10F850A54F438EDAB4A099A08EB96E38DA3C8E5E509B4
F1639244E64764FE8190C8C295EEEBEB191EEC370C07615647051D56EA56BB21
092272AA4812436877BBF6514C42C60B9914A131E8C40B9E134706B5E9256209
E0D2692DECE5F49082189AB78D105AB71468EC90EF0471C60D7B83FC4871E8CE
1BBF0A938EF7F5BAA5463CE3EB6A844E0A1B63A20CED975355492ECC8E36EB99
7C76AC5A47600501457419E60BD57A2DF1DC679FF89C2D4FFC161B8990A35C2A
4D56665C8B8C214991EF321ACB31187919632ED3C2BB723E760D5FECF77C2090
4AC34AD69671AC76EFDE2D250ADF9A412F8D6CF0D5BEF8C52F926011B741400D
B43CB6157FA5405289F33CCA2C71CA06058F1CFB921E6470D0D51BC45C0D034A
F1D51C33E2023E963816B80D9E32AA7E9A0731847459DC940D9B7E0F6D00A494
23B5058DCAE8594CEFD35802BE9BD92B3CCFAB5F75FA238FFCFAE081C370161D
E5978A7DB861E8717D141DBF1D25BE1B96CB7DF57AB5529B5EB17C244E746A72
FF81C365DD70A0B5525F5FF9E0E8C18C17BCF8C52FDEBC7933747A7FDF50B3A1
630BD70987FA578F8F1F85771F84D1D8C4C13869F40F200A99A8B767D6AD5973
E0C0BE16B4BCEB2F5B3672E0D061EC75211CC4F93196000E72A5D96EC4899EDD
EA3A51AC4723684BE0B809D39278FE55AB56614B68C9110140DD20D4204B0F1B
D609A2C5D230E9BFC4E270F5F959CE029584328FBA2DA3CAE2DBC19967067C09
2C10FD0808010C00259B09075CFC965B6E41584A11E4B7E3B9A03ABFF0852FB0
0866A7F5D4DC196D4E3A426FB1AC148E81C07238F7CD06442DB00EC6131C59B1
E250DA5F962136AE5ADDF08C67ECDCB1431FB020409845944EB3D1667B36A1FD
4C64D7F46F3AFE115D33AA4BC99ECDCF0ED923A0C5BBB15BC91895D3F2CD2F77
13B4875861D7AE5D323FCE5E370183F274D94014221A782CF144975C7209A448
E015FCBDA45F597EE7F593747A949C6A7D651F716A79D9D0607F7F2FE4C17558
E1EC0CD98EE2CE07957F5C9149B7818896A072252C08DD20557F9D11F669B860
1A0B8E0F6E710C29A91E31630C6DA49296A693238A347097177B268F1EFBD583
BF989C4A46941ACA151BB5D9507352C3E5340F92186E8C2821D351808F16338F
CD4C2D476411BB08D3AAD9F049C4DC3DFDE333539952E1B43FFD5F3FFFF9CF1B
B55AE07838A38D24B2DB1EF9385E3A81CE3E0B4A2919BA27CA5DD4A54A395D64
B3EC8C909C02A9280803BF4AC7F77261ED62A134BE708226676C08FC5AEACF4E
DAF7C03094C0E56BAFBD16CE1334AFD80665DC351C4FC9B588D6EE02C5DAB10E
33018EE9CDB4C7357BE96459BA14780422DF64655C6BBC2E5B7C38F89D288C38
9D926DF3252F9A1D92E4A3C8998E92CA9AC1B1A96924F29EEB673205CF0D19B3
E472F839D36AEA0EA623E347D6AD5CB3FFC0BE7C310783315DA916733DA6F3A0
CD6EB2673D0BCED933B76EDD5AA9541158382ADB6C2471E49672C3996C786CEC
A0725AB9BC3B531987B4C0B11E182AECDABBA3BFB717323D33338B8380A390F1
B3AE2AE4721AF8D0D05469555802D30C09E96E9AC1AD6D2C052C414BA7A1B573
C15A2BA911789C984F4C0C8754971FB1444C203965E175225451F6A90BAEA0A9
930E1F86022251499236762D767D9106B12E8259D6FAC2C8A88DF127C33EBE85
F326291CD878D88917BDE8458F3CF2885C990CD88BB53D27E9842695D6B8969E
DA98CDA7A818B25318278559971B6FBCF19DEF78C73253079E9C98F04C7814B5
E2A2F1B9B0342593E06AE82A1102083D5215FE178E90B074B076B7E0F7B2B4C3
260C98E15FFFFAD75C7CA16992CA3C7EC009C45F49A8C77665A9A22B434CB47F
FF7E9A55FC95C2401639C935D9C021A9DAB128F28C673C83D65A7AE5545ACF94
F7F35988FE4AE1B3018788F99E5328E48606FA878707F56C3E5F58258C76509D
DE02580295664E2420E8F2883B7EBFC96279B19FE2A73BC680F021DCA0FE4F4F
C696B98EA918C78E56B5AE3E3291AB230927637A0BFAA793FF7CF03FA27AB2AA
90EBF58299E9E9023E11273D69BAA91D47FA59CDED6A7C60AC7AE14CD4663241
08576A5A5FCE1B8BA35D4E7636A9B794BB66E3861D7B7643E9FABAC817C50B81
EEF99F2CBC41851985D394CA9C9376DB51958B22E66763333B0C8E4B9CCED2B0
2D01DFC0232F34533CC27617886034042C2EA2E518CA4FFCB56BA0A14D02219A
1AFFE24892119AD3BC6512B23241000B51625A6CDBC624211661E7CE9DD2FF48
554E73C84E524937D9B1889332ED3374C6579086880BC2711D8228395E3E594C
232C583176B4E705EF52057E269F2B4DCDCC0EF40E55AB35F3DDD9C999CA70DF
B2E9E98AEE4909F47CBE20A35BCFC2A0D0A84793954948B6A793F651E005E572
C940A39C463D5E3EBCB6DDD2FD29AD1A020B2C69AD500C95D3ACD5A711C9CE54
265A6AA25FB7DEB54E3EF9B9BFFAD5AF601D35E19D1F38DA3BCCEAEF6A37AAD5
4A2BA2018074B71813E000BA9E6AD435651EC34CD9663E1714D645175D240B0A
3D489D22C8E2C5D6878B6E03FFE9484A8B8A087717A05EA67175419EED173F2E
997DE958A6872BF32C71FF975F7E397C520E5722868C5BC688155778D7BBDE75
D34D371103F3B48318F1157FFDD77FFDE31FFF1882CEFA36793516951326F88D
A6D356CDA4804852A80C13162215DC00CBEFD3383989CB94914A4B1A71674EAA
4EE8DB597B49A9AB8550A4F419F97E7B2AA7AD7F95D543C45E4A665189EA2169
364E05CD1E3BC63FFEF18F633DB974CC26C166E0ECD1BCD9706C21D0A7D1654A
41F84524E2E6C7F1061C3C881602C734A147908FF6C911480CF4F59A37F4F794
0A10F234B961724191F60423A7A3F7EDD4904A99E9241A10EEEEA4C9DD89C412
386CBB51A46689C51270EA64A472FA6DBA770CEFC0D95781E930D8F3C3FF745A
ADBC728772D9C96AB51F6BAB61012A5F7334C7A90EBDE3962E14E02BF4573713
8DD9C8E4DC562D1E2E951AED68C6550766AB3BB3FDB371EB5873A60503053B04
E73A9385F3E6A615758966246015A7DE4D8715E2E4C2E9211BA33274D0D47D70
C284980BF7CC740A13EB32274A2C81E4E5D4DC5EF48E614B8173A46C52C6DFB2
6546262925294134C308822C5874A44F80F7E00E3FF4A10FE108509C10644300
D8A22B819D4CA1A087AE4CE8435712FF22FAFFDEF7BEB767CF1E5E13DA1F57E0
209D0B2EB800575EB76E9DF05DB275864A4020AD12FD7CE73BDF39FFFCF3C995
2D4D12CC47E934065784F6C149D9E8D4927873AE9AEF6B9BE328CD7A313D33ED
A8CC60DF10BCFB899929180368E189C9B1C181C14AD5F8EFBAD558A789FC306B
CE89E3BB71B3A19D9D0D1B36EED9BD1FFBD5D73BA889E782FE4CD63443B7A0BE
F186D976722C4AA6A2B6AB939B6E2B8A89FE7666A6AB084120518343FD58C689
C963AD560362D68A5A1E7C9CA466108E081211CA3A23CB57EEDDDB2183C43362
116FB8E106394E42524F213BF3CC337FF2939F40B63EFAD18F42C9127B4B51A0
D2B117841C84940FDB0799BF6EB0E7575C7105DC5ECF0C32644293748C2AC5AB
B0C873EEB9E77EF9CB5F5EEC3A6E3A0786396B19C3C29096EA895C3D4F3B5965
FE8B1ED619679CF1C0030F404AC8FA20418F8EF68E1C11D0AAE43DE980F0B3D4
BC500E922AD56A31D127BFDEA8E7D2163C1B8F4077CFCE62F16696C056911C89
17E175349B664A5F6337BBC94DDA3842A1F297493E72B0ED5911D215CC428B70
6EE323F82C753AFE8A6082FD3E023A92B05DAA32A2A718CD98D8ABFFD8B1F1FE
011CDD693CC7C8C8B2B56BD70EF6F4403D418C67676788456AB6E02D452D03D9
8C53723AFA95E25E086A88E96FBD2C0D8915B8802916DC9D9350928F67836C2B
74271002660B5EA359D2EAA351EC2B4D7EFF3F11E36434485C05B1D26D01AE06
9866B4A7E7458DA88E5BC3F32A4D5511252A9BC4D3AD063C82AC9F2D41AF45D1
4C43CFA7DD826DCD8607E3B8E67BF51ACC815AB17ECDC1BDBB4914494926CCD1
F6CD6DEBEEA44C8E527E77D2B92E9247C269C2F2BEF6B5AFBDFBEEBB8575D18E
0644000414C0A891C787840BB83861360C3A6598A0AC9897BE78B7641F122206
1A0F961938EB850220353F6E9F943A94956AB67784422860078126C29C40F567
CD8B8182346CB2942B4871AE893DA7814BF7894F7C02EE0E8BA3F8209BF6F5AD
AC5CB9F294534ED9BC79B300AE97C0CC30B230D59B592CF7DBCE7F47B3D55CB5
7255650A7219CDD61BAB47D64E4D4E4FD7A6FA7B7AABB54AA4BD2A6890C24C65
76BA329BCD9672597D86232C858AFB4A032F3AF5B403FB0F1F3E7CD43799CAE9
A94636A775AB8AFC484720CD28198FD484EE0B4B1AAED7AE37B05519DD90D486
3805F5C8EDC917474686B6ED78AAB75C1C9F3A96CBE46A8D6AE027AD364C2BF4
6FCFD8F8849302DFF9D83CB136FF3E91C8ECE71690A500F0A158B1A9704960E1
376DDA4431C245B07ADC2742C104C835FFE5A5738FB180F01AFEFEEFFFFE2B5F
F90A7308D8632CA9F4B2B292B118D39C54AA29CDE79C730E5C06BB83DFB54635
3C2DCBC582F7A94C6044CA39E98C2542EEB39FFD2CB908C9DF29830AD8E129F3
7934FA766686BD8E72655A828C554953294D90E45E1909D9F9E2C52C012B0D5C
0A3B5422F64E46B632404E526200665A6C6B2DC11C4769DA137554CA9D27C53D
A232589DA6ED6161809BCECF12642203B964DC9BB29A480D34303735052777E8
C8D1513D07C6D7D6F4E4934FEEC966355567E0D66A70A1B4FB566F54F592389D
4E021A039622C4644A5E483494D79658EA788FBDCE2AA46CED5D7A27683B3537
AE396A59FFB05F6D64AAB5437B77CF4CCF6EACE9E0C57335B504D6D1D3403C6D
0F8C49803F17381A89AAE3BC968ADB51EC27C9ACD2ED3C81EB171D8DE06BA916
CEF16CB678A4551F0FC3DDB3D56C98ABC771A5DD28F4F756C627A5BF5DE44188
F8A5009E3E8B626A143FD36DE7BE509DB1C346A52C092A7587BB2E222FC21368
98BB40AB241A71D229025D1446B268C49249A30019C3247094A75056CE594896
9274A286B22212C927CB0D6B0289FE7E48266142325A80FF2963CE58B8E20D33
D9056522D364E161F0A82AE366F10E717BB485B8882E91F2CF2C3C6265D9A197
3CDDBC56F360FCD458B9A73C353D552E0CE9DEB046BBB7A79F45BCFDFBF7B655
13820F492995CAEDC88525C865CBBD656899CA8AA10DA640AF06FA870E1C3834
5BAFF6147A023F030F488FCB0E324E1CC49197C4385263ED78A2DE9881839F2F
C25FD130F9E9A90ACE7BBDD15CBE6C9D192003EBEDE5F2E1F4F464A44B5EBA8C
DD0BA335A503FF95AB961DD87F04C111F4A67801425E685B60FCE7FBDEF7BE6F
7DEB5B448311B246BDDF952FB655898DEE5A22EB623728702625F79ECA88B442
D2B2B89825A08840DD60F5647A011604DF8E7B58B366CD79E79D77E38D376213
972E472FF6EAE27464F59BADB9F852C443279E78224C29590BF1386481E78308
77CA0A5340CE849946B3E1B91D25C8C00BCA419A06E4E4DB25E2646E0FED62D9
B95B6EB9E5BDEF7D2F1D7F6A7C52CDD8ADD4F813A375AC1595789C7297CA75D8
6388A5A3D5EF9A3C45D9E00D9F74D249679D7516DC3AD618F02FE2B6D7BFFEF5
541C7833FEFAF5AF7F1DEE82AE8BA4450801758825202E10BF81193874E848A9
54686BB0830E5E87870736AE5B8B2BC04E98A450ABA65FB37ACAB793D690D398
402C8138AA92D0D0DF1879A9C4742C01D7B31D47B64E1435946DA99AE724D9A0
9C2B4C6FDB5D9CAA3913152CE2723D645C370D682A31DDA3192BCB18E811F761
0897AC8A38A0DD6C99A9810DD3C5E3B94E2E569A8D122728174CCD369C3073CC
75B6E2D995DB33B462E7D851AF5C607D4E66CC5191D15DE51D7AE9604ED93BE9
DA65244A63ACCC3C0C958E15E36A0B35489292EDA8B44EA0E631AFAC5EBDFAE0
C1831072FCFEB4D34EFBC94F7E92A41DE37606BFEB24E266B0FB070E1C80327D
E31BDF48CA2F6824A6D3F1B6134E3861FBF6ED4C31DD77DF7DA79F7E3ABD01A9
F7382981EEFC93CE3B24A925AB7174F999C9E48C612603059ACC785DFAE6E8E5
08570A4D88E4C40863C529EE608D6DB4E9FCA972F32D014F4B6F6FBFBE0FCF8C
8E6935E19E9BD4A7F7F76FBBE8A1871E7A72C7965C98A937EB1B376E786AFB36
6C504F61B0D574F3C5BE81FE917AAD393B8DA7CA7B2ECC72429E06DC8CEECBC8
2B4D5701318BC2388220C1FB9F68C5138983F0A29ECBFBCD56051A7F621CEE5B
2F2C0A1C4A9C1CDC43A5325D6D56201408296AB58AE7278D663D089C7C3E3B35
3DA3AB5C71877E920B21D46CC254E398D9F49AFBDA0CDA3DF7DC73E1B6E3F750
6D36C5E0F2E5CBB11904DA73C588380A0C4246060FCD5F37D7F4B8338D68AB21
E6196C8CDAD27D0CD8E00B2EB8E0CE3BEF644A4AA59925916C861D6CABF94363
02658C16A7CBE2E2887884B591450B2CCBD7BEF635EA4D3725CF2078D986EE11
9ACD8555C613914665A9A2DB3FC7D64C8FDFC71270901C6EEC924B2E41A48277
420CE0F84841CB33939818604912D93EC36EDAB88FB01D4F8447130FCEF601E9
5E71BB79F221F6F7DC73CFDFFEEDDFAAB915450E5480E4DC7AEBAD6F7EF39BB9
024C85C9570BB1B04ADD2FB37DBD3395295C19ABDA5BCCC38EE2379ECEDC2666
8A7A0DC634B252437C49D95F5AB1A8133B5090B6348B51DDA7D6481D5F58DBFD
CC39FEAC93C4193F6827877FB96575ACD67B419F1B4CB6AABC7BDFB8F9BE094D
F0C962D6EC66A205009660BA596516B26D2C41CBD0D365E304561A7162369FF1
2AB5D2F0C06F8E8EAD3CE1590F3EF5A41714FFFECA8FBCF7AA2BD3E49512461D
59A838652697A9A5D4CB5C6769F9E6FB79B2F02F84FFC89123EC4616BDCFF591
3A33359E1DB1E1295EF8C2174265B3BF9D53D5284BACF488BBA32C6F983EB8D0
BFC3497AECB1C7982556A6EC4C0BC1F1DAA27368B0696644FE6D4BE0A4341276
772A891BA49D4599F4805C4D2C01C7F35121D8092E88252E287C6238171CC881
EB700E8F4365443B2CD5CB25D805041A0157D87C0A01A546BC1E3D3CBE61FDC6
F1F1A9A9C99956120DF50D8C4E1CD9B87EC38B5FF2E2FF79F8D7539355F89495
E9C8F54AF95C7972B2E23B83857C096E259B0F8AC57C65766ADFE15D7D85B0D3
121C655C27E363C5DC9956044B30DD6CD5E2A41A2550DF71AD595B36B8029141
B5D5EEEF196CB70CA1901B359AD57C415B82466B16A1BB1F684FE1E39FB8FAC6
1B6E1E1B9B602398044A36CB4D924EF8E422D22AB0B04C33408C29F909440590
AF42BA607E1F0BCA2F8516A053CFC40BBB99B8EB52FD5FF03AB8554ED42315B6
4A710ECC5C5347D8D46FD1E2A31116BB4F322F3DFFF9CFC76148D2267E3E2CC1
F8525512101EE44128185FF08217FCE637BF91584A7007366EAFCB12D80A5A6E
E369EF53B4B654EC85919BACBFF83D5B1A059DDD85EB5556A30D3E75D555575D
71C51532FA433AF2445AB0C8F0FBEEBAEB2E9E6DCEF814041A35FB37BFF94DBC
47A0E58283E2F792D41EB70A95F5EA57FF15A20AB637EA650C9D562B593D3200
9D084B902F64C33030BE7F0356A199E6B5A8F785AF54A525502E38D5815EE7B6
C88FC947BB9D28DFEED4B3F3E68E17CCC4CDC4750A913BB3F9A9F56D6F65EC04
493B4A07827BCAA1A531457E05DDAEB3E19172033F52CE8C99658C178250AC1D
1CC3D05185D8C9AB24D48C435E7F14555C752C528794E686AC660BBB5BCDA9C0
1D2AF51013C144076E8928B8F996808F0C15F6EC673FFB89279E60CA8E497CFC
70D14517DD7BEFBD70E36CE61FC15E0BAC4B2C816D9B29E4ECF8B16B4542952A
F269C34024238765A1CB254E37E37BDA9B33CE38E391471EE1F83FFEB50B272A
219D442AD290C44662EA1C395F2F7FF9CB7FFAD39FDA6530C90E2933360A2F27
9DE441E9A2EF4BCD86B791A79A12CEE0F2FAEBAF77EC232175F3A59B0C9441B9
BEE005A7DE7FFFFD4383CBB05EFBF6EF734C2E3156CEDA95CFA0FB0CFD3E3933
3E3CB46CB6D208BC1E04EB49541859B171B07FF5E4C44CA316562A55CF0DA7A6
6672B98CE7C7515C534E94CDE86E00BD5C6DC497595882484D34DBE3B5C6B80F
EF33A9F5F517A7A6C7A09510948C8E8E150A7DAB56ADF9ED934F96B2A599FA54
291FCE5627F2F94CA53A89150A336E2613FCCDDFFEF59D5FFA2A753A9680BC02
767F1D13BECC6060B164D165596C3673D1D4B29D3CF058629CFFC578721C33F3
84B34FB9C8D217C6D38B7D62E31FBC12421416BC0EC949540A8FC1FB7163305A
708D376DDA848BE09A6433457881772E96655AECC5FB240B0A64487AD0F02F61
7358ABF7BCE73D37DF7C3313E81278E21E58A37ED9CB5EF6B39FFD6C6A4667BA
70767DD353DA6A36B346B1363B1A630E0180B22CE8EF690C10CB13FA29112E71
A2425FEAA46C4252569D7F4DBE411C029A2B098E252C90E41B3FC5C63DC1A1F2
ACE20DD808010B0A01AADC0C5F9CFD875B42388BEF5DB66C68D7AE5DB86DCDD3
60262986A10EE94AA502FED7532E99DC5403BE2C0B0F6209E495583444AE3514
A5CB1228A7539F740CA7B4BCEDB825F6DC38D4CD01C55A7BFAF1A7461AAA0F82
AD544FE0699239EE8B49F4699C10962569E971E24AE30295E3D5A3D66C5B0FA3
699B3E32C40781A38A896E4363AEE09983A5A3D333879B2ACC87E32DB5ADD59C
CC668FC54DD58C65DAB0642DE83D48078660B2136B8C97480BDD561235F222CC
C1629119B6CECF0EC5E96C48FA0D1C4220697DD181C44F737305D160C7526CEC
62BA46E61A315217B8043D7779165ECD1609B93DA901C857E067C497EF7AD7BB
E46AF822DCDBC73EF63104B24291CB22993C1D3D39C19773A144837DF0831FE4
C4567C9CA52C5CE40D6F788343C9E6ADCBC796E0E0A4E363EC9B86ABCF4CCF32
EF59CCF7C0375A31B27AEFDEFDED24EE2FF78E4F1D2B177BE05484410196009B
D26E65FB7AD7950A439599E64CA5E6B99965CB5698327DD86CCD28B7DED353A8
5526D93AA362DF7542D76935DAA3B5C6685B557B8A85667B6AE333D7EEDDB7DD
B492E68E1C1B5DB77AE38B5EF427FFF3F06FF61F380001CF6413C76BB6A35AB5
5611DE21E5A8676C583F3E3E49EDCF0DC3BA3007221D64FCD9E6EAA1A72992C7
6DB8FAEAAB3FF9C94FE252440DD123C00DC3897EF5AB5FFDA94F7D6A310B6A33
0E09973AF112745AB197975F7EF9E73FFF794AD582D721C881010A0D0905974D
F6F6B86A6176FC832C818C5B90CE49A15D64C40A63C39C86CC0C71E70EF0618C
E2FAFAF4C2DFC8A4F4299D6123D5A7C13239739BC89688B1C49CD3F18188E3D8
C46672884AE93A78A8EC148D54D4F9AF602D58A121690C03207AA3BC14FD44B6
2213E48E67E4EED31DC3CF2CF370F13B6CA396BBE0A6D4EE3436706799D1CE18
4256449808AF9546D184C62FF1A0D0962D1F364E465B8F0D4E4301497C53B9D8
29231B4EAAA23915635A02FDFF9A8BF43837A7EDE1EA34FD74353339DBDC7774
44A9126EA610649A262BE228D803CD5F6A285CF0FE76DCD2A392753940D3CF23
98A8B59AB5186F71A655326BFA140A89195EA879099D2CFEE2A96AA4A6CC5CD9
493FB343C547DC486990A74E787EFDEB5F67194FA5E94DDB4B70AD9794CDC57F
57E9681059840573FA1DC39836FF77F55772BBE9D3604FED81330844E09F5148
C41EDB3524785D9087D80C0521E48CF19340486C1C5A970DE0ADDA7D0F6206E8
924A33818C414CAC6E247E8BB8EFAC9DC875F02FF409B40ABD16BC93392BB10D
5414279F7CB223894B69C991AF5CE2049A5101A63A516DC4491C06E1A7AEFBCC
15575C556B344BF972A3DECAE561A8E152C5B97C396ABB512B544939F0FAB3D9
E5D9B0CF73B3D57A6D7868F9AA95EB1F7FFCF17AA30A67DF0F5BA59E6C6562CA
48ADF29C4037AF79AD7AF348B57158436B0AC1E8F4FE67AE5FB36DD7968C1F94
CB7D13E333575EF5D17FF887AF1D1B9DC4577FE5CB77BEEB82F30A257F6CFC30
5CAAE999A9BE3EED2A0E0DF78D1E9DA092C2B1A7D1B64777319FC0A2257501B9
92484F2DB932AEB2A48F9C94A247364F5891E7BF64D68DCD07CB2B485E48A5C3
B996B8CEB5D75E7BC30D37D00E3158866B4CBB25D1221BB296CE322DF6120A55
5E8D74862AC5ADF34B49EF2C855F493230B4A26BDC8A0C01272C848148232608
4CE37BD46A4B6A422DE2AADB25CDA52BF012F0C686E388788FD89ACE2620C2F9
D1801C42E2BE70DBF61C1E35372CA01913D79B4C2476C3118E2B510334F636C8
95490395C23698A0E8EF1B8EE2569AB79D4C478A66716ACC0AA8DEDEDCEA35AB
8C318B386ECC2E77CBFDF337C249C71D34C75B422E165D44AB7AEEDCC9BABC60
267692663CB1EF405F3D19566A3D1CBB4625F1E3420B5BAC07DCB463D5C21DEB
BCADAB89E1FDC4775C4D4B1D45263208DB715469C33CF8334E3CEB6A2F2C13A9
7C12E73D3F97F1B36DA8255DEDA836A3E9249EF073FB7D674FABDE88621A723A
E9BC491BF326864A00B224FF611D8853C648F72F4136A1CCB4B8F2716515C945
D4B93592DB14CA362A07E68BB041175F7CF1673EF319E9859611980236914E31
C6FAF44524DB4CE40F511EC24FECCC652AE58BD461420E313232C2413AF8AC34
4F48B14D88D35927100BC19C123B1828724247DA756F76AAA3E3161195C552E1
59679D75FFFDF74BFB9C8DBB521D7E73FD0CD94CBEDEA8FB9E8F55711D776860
B05AAD1BFBE19A6100FA9DBAE4A222B8059ED31BFACBE276B1B777CDE444DD75
825CB6E7D8C4E8BA35ABEA8D9938A9D71BB388FCE2A4E5AAA209799C7C36ACCC
4EE472AADC9BDF7D6047A90065D474DC5690C1A3C6AD76B35EAF720B5F72DACB
1E7B74DBDEC38796F50ECDD6C67A7A9D434776260ECE6A58AF3573393AB645D8
A728D6445E886CF59025DF31B84397075B543967620883EBFF43C575C1176D0F
AE063D7ED14517C92C3DC74C8B847013AB4EA00E3D083130E24A880FB2E0F555
9A1BA53667F406ED868BC35FFEF8C73F4EFAF2381DBF459F9A1FB165628947E0
B001CA16A585DA84A2A62C6086B4E0D2F38D53864E9CAE7DFBF6493F244F9118
2D21CF122EF5C5D65FD2B2D465D4E644D94B0311FD328623765F056BB9820D95
F608FE55DE2C07C94D292284F4893BF5AA57BDEA473FFA11911B0203C301867B
48CD62B304CA17318F2114175DD0B5F4F1A056DC65CB0756AE5C5E2CE5A1F07D
270B99E7C3E292E61B1303C7EAB0C7708E13630E1B62240E66A7E32C71EC556D
A72F3F80D56CF4EF1C5D9DB8EDC029B5A2756E76C66FABC8F48B787056DC5AA3
558BB50A713D3F64E539D6FDC6BA510DC17BD4AEE9D491996843F89021292A2A
27E76B9E233F09676103E21AC20308F14EE53DE11C1F6426590E0125F38C08C0
46A5B4981272B9161148575A5BA680503245BDF265A3938F574AF859C7639E76
B65209D211F09AE2EDC811C7DCA15CA4DD398931C598A55A7285DD7CF3CDB68F
AF2CCCA8883AAD1A3DA73865D9E3314FD26E1BDA249E2F1A0FFAE80C2E697588
7AE713491BB65A28CB2AFC7DAC644015D0EFE7BD396A2EBF823215BF279E7842
344ED75124678359567764F9086CE6E0E010AEBB77F73EF3F01A4B00879EC649
7B3AF8659209DCFE6C6644453DBD7DAB8E1DC593BBE59EFEB1B163A59E9C1F24
B5FA54B184E337D38E1AE5D2725C5F9363A87698C1FEC14E34AAD599D8417C14
797E8C5F6A5FA45D9786FE4C581C9BAA8EF4AF191D3F9CCF61B52A95D9B1628F
16975A55F4A6BB7C996ECC430403BB0575BFE903975E7DF5D5BDBD3D9C520B0D
B57BF76E65EC22D5F182EEEAFFF38B591768017C1D0D18010950CAAC2FF13658
A214B818EF810D960B6E87BCD8124824928C5EA1302983AC6000844BB19241D5
0FCD8E0BCA504C7867F6787AFB452163C822852665A5A158E8930C98741810EA
4A9405EF013783C7E72C2AFC95D685251CF2C791E617B7441F7F094BC09FED19
B6CEDCEE5FE98460369F1A4154B35408180DB0470C228D1B667B91B2DAC2DD94
D1880FC5A5C31DD2E470AE8E7D4DE13C60F186A3DF94B1D6C3C3C3B83805D82E
DEDA690D3F503DE5DCB26543838303F942D6778CD14D341CA05AADD0F668E474
AE40CF8CC68C5A4F96DA46AC77FA0CBCC0768D25B904AF1F2A6560D7B12E4BA0
4DBE21F14D945B8FA25A121BA8A8E3AB444F8C527A705960BA8B71CE1116D4DB
2DFD83693DF73470C8CBBB2A749D3AD49CCAD454321DD7633D13D9580215BBBE
F62AA432473F973E843797D7DD5653783FB6ECCC33CFBCFDF6DBF17E44C6906A
6E6B174482FD07F4721CD31D62BB0B5D66400B55E2B0E97DD9F2E54710104038
E1139B0F2616EB387DB2489BDED06637C1DBAEBCF2CACB2EBB4CA9EEFE1E8178
D16717C4879A8B7A903B5FBD7AF525975CF2E10F7F9848507209D37FC2BF6442
C577C1C9C352E0E30B561625A5A64C1580953C9E3E9546459D67B7331BBC0F42
18BB5077D6A53B63110B793D77427FD0D7030E27C7A7286781AF557592983E64
2FACD66B815FCC068361B0AC59CBF594574C4FB6C220DFDF3F303A7AB45A9BCE
E6BC99D9B1356B56CECE4E359AD5E5CBD672A848DCAE0F0FE30C1F98983C5A2A
E5C726F6C200F88113C01BD1C9860E6847CBD044D551E1C4ECF49AE52B27A70F
F9617D7CF290998711EB068566DBB811C10B5FF0A2471F7D148770D7EE5D6615
D818D2B0BD0C4E01E32C2A480C37EC8F620924D1816DC377BDE215AF803B49AF
9CC9168A8232B82C5BEFA894218B30E4C5787898C5A2938B1DC47EC3EC413B63
EF056B1F9B210184BEE0D1F0B0DBB76FC707D7AF5F0F252EF88DC5AE0F63F937
7FF337FFFCCFFF8C2BD3D86CDCB871CB962D1CD2FDD6B7BEF5B6DB6E7BDEF39E
F7D8638F1D9F66616A80B673C7ABE13F6FBCF1C66BAEB986993A9E617606E037
36667789FB91348E20A17187781081CDB1FBFFE4934FC64D4A0D8CBA528684D8
791E2F9DCD49479297E5A538C080737B700249252468311E78687C4EBB651581
893B761B897B412D86B0FB3BDFF98E68FF381D5AC2F67BFC9739999AD6A5A79C
5FB162F9D0D060E86733998078E5D96AC5E43D229512EDC9DA0A3C54329FF3F2
0F99C4A27496CA733BC2479A83BBC7D7A88E2558EB642A8126BE68C37B4A74DD
B9A9926AA241A289EE2DD08DC759E5C108E3B67281AF497F636D0CDA5152370F
06A5075D10A8084F855034546143D7939B0819E2D412C4EAF8EDD11E90174B88
5BC4E1103369F76CABD48A4B358BCD3D52B1978BDB65FFAE3AA863BD32D97C65
66E659CF7EF6936604375E7D8668960122FD71E6A9185306BE4B27809E904A2B
A9AE45A3BB605586A139EE96A24ECF0C37C6111AB6232EA541B680B139866E04
9E1D0A8AA75E4E193F28C82B56B398E3E151651F1FBB656927E82439B61EA147
23E47C765E285D7A9787568F274BE20DEB379C73CEEB3FF5A94FE5B305FE89A9
215C1C5A584F9B9B9ACC657B73E132D7E9AB4CE1EBD7341B4E4F6900CB373939
D168CE42B323261818ECADD72BE313A37DBD83783C5D9F71D4D070DFD123FBA7
2AA37DE5DE7A7302860D0104EC415B6F410DEB6CD8592BC34323074647078A83
A7BCE0B99B1FFFE5B1C9DD9B36BDE7FACF7D26970B60AE8E1D1B37AB995BB572
CDF61D7AFA0F3C1A4D12529932EBA8FD389951ECA563459DB4C1EF8F951DC2BA
532E85A9185B0E4DA1E65296532F48528F6247E21AF17917BC3E090FB0AAF814
D410B91BA96199EFE63123C2077BFFB6B7BDED4B5FFA1291032AF57397400F53
1C99D21595CD0346818116DEB163873401510AD9AB219E974AF3FBB03DB85B02
C0114DDF7AEBAD907E3234B06643C7963F2CB6A44C82B966E60479F7E82ED9E1
08FE4A680AC742C9AC66BBB759BA31A844A0C739074D29256001FC400A62465D
2A35D8DC266C1097D7350C392C189C71C6190F3DF4105349AC4348160E4A8A5E
AA10085BDD76F8CF162D816620F5710A7A714BC57CC1D056670DF9BECE274039
33D12CD40549DA09453D257EAE5D61769DE3D3836D346AA4F99FDAC37B27D72A
AF1D3AC5661B9660368C5B89AAEB0163DAEC341D8D106D685239851020EB3979
E504510C51C3FF34C1987242DF6F44714DA78C35012AA201B7AD99328EC62AE3
7A6DC79D552DC7A8FF9DCAFFAD668B4F2854649AC3DDDE71C71DF02A7ACD8023
19F9226EB55444F186534E39052B2CDB240E846DDA79EEE8C8ABB9A865DB12D8
E05A88C1E73EF73988250466EDDAB5B8379D76CB153AF615973282CD30348E3A
A1C0B5D75E0B358877B26F402802F9150207B29D3C38529004A1A2B27398D277
CD69C66CE1A48CC924321C79BC1F9FE502DAC393E50C324466F07DFEF9E7E3C8
CB100566532555D5617315678D922AE3DCEC572A589262734B661CDD673F73FD
55575D854DD76F3066C00007D8C7E155AA33AE930BBD7EC40449BBA7BF7FDDCC
74D3F7B24180B351C9EBEE0188470BD100CCE481B1BDC3E561B82D3AB39F0911
204F4D8E29A7E9EBC9AA0D3D17C98F1C37D61DF8461A7C5FE3F0B6EE7C2AEF95
7A7BCB07C7761773AE1F36F285607CE2B0CEDBFA994A853211786EC06DA8CC56
023FE8EDEB3118189D5CA32D4D52226F51CD4BB031FFA12F1E78FA2F7449CE3D
F7DC7FFDD77F25A7340FA4EDE9C89875E60459E517B294F9AF24ED57900DEDA2
48925AA54AC9FD05844E9AE8A7ED28249904A58A4E0391F8EE3CB2208A13255B
B2F04C4A12712B05737C8A07D81E326E33CA2D969D4B0CA734DE830DE29A9C7A
EAA9679E79260EA44A9D18816FDB12EEA503D1E0AD3FF399CF7CE08107C87349
684717E7A89BF282F13D77DE79275BC6485DC7EE90C870B6DBF689AB8123C7E2
1049D3A0262EBBEC32411CF0CD5DB38C8C4AF26909B05DC68784B9D2EE6D7F5F
19C64C5312A94E45017EBC619CE87C90AB2A4026C1A8881AE252C0C397F589D3
D13A7AEF34DB5DBC7CFF342D41A1D95E672C01CE5BB5AE5BC8C412D4342E5503
C673C61284119C7D5D0F08F5BC33077E292C810ED875CAC88525F0A236BEE970
8418C23596A0ED261D4BF03B150FAF188116E30A3BE940EC38A5B412B6515B12
046C4AEF4D9C0FCA9B54E92978F6306195D26AD90C8CCEDC971878FCE9DE7BEF
3DFBECB39D4ED3E251D72CA91624663C984D493A03FE847496D1330B72B61B2D
F004362A32CFC36CADD0F7520B31334C213438823C7437761F824480AC8C1444
60FDD18F7E946949891E6C6092D8390A2AD171506B3254EAB8399405B52D81DD
4061EB32E67F3AA9E76299F00CD87E9D356EC4BEC7714B9A7C1426019E8AAE78
E49C7A1516A2D4D7B3AEA7B86A7878E3BE3D70066BFD7D4353539341E8B4233D
CB7E7A6662646468720A515E96529BD76D1D9566A35228666AF50A96DDD1E355
13A5B547CBC88DD64A6F7CE31BEEBEFB1B26CE0A834CFCDBAD0FC71AD0DCC2A7
66671B9038C266EB755DD828E475777BB5465661F25E4D8A9B40B2C037BEF18D
5FF8C217F04BC248FED0CEACC55EDC1EE2CD2937CC32D3E8AA942648DE4F3B0F
6507F93EEDB4D3FEFDDFFF6F6BEF016E5959DDFFBF7B9F72CFEDF7CE0CD38161
1810B02120266804630A26121088A189A022A0A052A409D2BB5190AAA0A2A118
51C2DF8098444C548812414CF2A3481B8632334CBFF5F4B3FFDF777FEE5EF3CE
B94586789E79E639F79C7DF67ECB7A575FDFF5AFD8B6D3716A9255B495FA0920
712262491A9414E0A95DD68295D372F3CD378B37E973740D1D3010D8A79B0247
08DF0852047F2E3F9775AC5B49877AFAE9A7A32097DF3CD76DE1EED06A0E6B64
34F18DE9CB4DD5E4D65EF8F42CEF1BE5312CD188D2020892CAA9E3338E89CC2B
A5083F7A90FD09B358B870216801986230232290381CD0B3A832216B90F08676
53D2452BF0F8E38F3330EB63A32DA07A1CA18ECBC86581DC246BCC908E909638
A41BA5AABF8FD0BA81BEDEBE149C8EC6F79CF454A44D1494F9CEE1696A0AD21A
B44E5E61F141BDDE0C0D0290297D515EC137FB5EB8727489CBD78BCE2481F7DD
D5BCB4A9A741E0F1B476AC19B9824454CE95A25CB1D1EC70917404EF6D4D92AA
749AD46EF04231979392558C5A9AD29A5AB3E8723AB4A351C34DD804B927A2A4
996C764D8BE1C2D4DA32618C0CD83E0AA370BE59571997593FA6C6A1FC9AA140
66AA79C22797344E9CD08EC288EFAC9947094BF986F724D71BBECD0604DF0A78
822F894DCF1DA9D2B063D42353A0DB724645036050DA4DF42C30445DD6FD8290
86E807DB02B66C8037147E69B9444596A4A06B2603DB596CC334455DF6F9CF7F
FE820B2ED01BCB7A4A4824404545125A3BD6E92481140BD6516F64F989955C79
A5EF2C5AABA40939FE9F0F15A471CBDA7875BCAB2B5FADB8A8D5DB2F49D0BD78
9BB94B57BDBA697CAC3A38307F7878A8DE28F7F48AD10F8D97472409EA8DCAC8
A854666F024B7190EEDFA8576437C862E8EEEE9412E4D174BD2410ED4A32A755
ACF54A8AFC5E2875169E5DF1FFBA4BAEDE1CCE177CEA73A5E273DEF01868A63B
2CD99108C19CD973D6AD5FE77BBAFA72BB1E00F526AB0F6F7EF39B0F3DF45074
CCFFFB2B0CEB9B77C502655150A54C1AC0C1071F2CCB5723110580800F3CC80C
368A0182B27162372FBDF412E5F2D8B92B56AC60761C128F0EB46A152482678C
EE3153DEDCD2960DD8C7B0EA0CE23B0AA07AF90985CA96CDC281C43DA2BB61B2
C0052053AD12908DBA409FAF5EBD7A8688B19BCAD8B73C71432368CB2E2771DE
A5AE338BE069005A643D4E6F64583CF1C4134F3DF514C5C0A045514367094260
59536B6D29C8DCDF7EE58206D4AC8955FA6847ACFDA4653A6543B563DC0CD38A
8A85286D7DE5DB1D7BE32C67954D3998BEEF0D9BEA83F0A0B0AFB2B92652E1B1
19BC28AC4570BE08D92D5A3DBE432009C63B64E3B7EAB566230D4A6853C7522E
DF02812EF2A567051F3020B9C8CF623C2D4B46A30923C6A3B5463E2A965D3292
D429F3599E4A029F929A46E9C4D7A4873DFAE8A368C156BD8F8D857B87F26F31
3E9D1A7DB26CD9B2E5CB97EB73E9E0FA64BFFDF67BE8A18724AA65EABDF0C20B
CDB409C1273EF1893BEEB883740078749857DA260C52E925865EEFEFEF4DBD70
5EA2C912DBB871C8C5F9CD4D11B4983077BFAA2D4E130A012F6254467571000A
69493EAD0C00035FB46E2B5D4AC313B520B4A02892C10093C7D368082E7A9095
CA8686782B68FDE6B2F430D1AA7E2E3E404F4D112D0D70585E874D6014CC6F70
16B751922D961E910120FBC7A40EA251C980CE625F7ABD1F43B1A0D1FB9B8C95
C79B6E34769D8568B058989B34FA2409CA637A564FAD12FBC5891ABBEEB66CCD
DA57640D485F913C88E27A9AF838562B57248A2509F205E7B3D462CDDCA7997A
0357564ED56399A6C4E16DE772656CDDF0AAC1BED2D0B0CCD0114F693E0F2F27
228657F4F50D9C7DD61724097DA8CD791946476FEF714A5D4361B5377D41615B
D3618BBE8117D60959373ACF24EDC0072DDFD16D991B674202FDD74DEFBDB1DA
45A2D0160647AB354FCB873FFCE11FFFF8C7467C849EF074871C76F20B1AB062
2EBBEC3DEF79CF7FFDD77FE941B874920C3198F99E70C20937DC708369C7B07B
EBBE69496CC830CAFDF4FFA73EF529D92BB42A9C396B9604683CAAA832CD0C08
DA9E025F30D08B66D66F0305939CF46DB7DD56DCE4BFFFFBBF758D8C1214F6B0
951520F83AA5F867758A30650C1ADAFC4B990D5A31539B45B3760BC71F7FFC4D
37DD24D2D23561015A32012FBC4595696A51A54DC9D3598BA40707077C0FDE7C
446023EDC0E1D35A8843E017B29473AB38B323ACE369E875A11C6DB4644C4493
25412972F5462A33A258FAD458D3E70EB5FCE97113DD2B7D15717E020FDC355B
BE263969B47C4A78EC924E59ABB21872B11E56701D63496B936F66E32581B709
E2C420C14D790775D9123DE30C89DAA42C130CBD9D2CA0F5014E0220614B2433
CF6AD8DC78F22B17D304A99E659434E9A62149E089C110C3B2FEA6496B0297C1
F2B02DD9CC3283C384CED00FD6268ADAF4156BA565EECDD0C999A9E31319DB46
3F61D0D89091ECB66DADF7B6C0D20858FC6623003E823B1535D38A893EFDE993
6FBCF14631B462512BDB48F5F7A68C805623DFDDD9EBE35D8D147CC33B31ABD2
5C72D21C92DCA2854B5F7C71DD60DFB6954AA9BF7771D2CA17F2DD3A1E857CD1
173B54CBCD66355FF08D5B9B2D6D52ABD1AC1472328A1B1D45C9CC8D29965C8E
0809A31FAD7827405F579FCF8F6C942BD591726553AD31D47263512CC6E7E369
CDC6C4E465A6B49ADAB654394AAA745224466F1463A09E5A208B0D6ACFCC8B1D
9E6A17B4EE31CE1B7A3FA086B089B94621AA9209A2AF0E3AE8A0EF7DEF7B6870
B974C935B4B45833D2A12B163CCD49DE8E8F8D75F7F48CA5EE8E62667EA6AD60
7C0D4EBDD698357B70C3FA8DF9421A75ACB7380C40A010AA7559E69C357B425B
7469C03397F93DA7CB136BE3BC5A9CCB2FBFFCD4534FC5E103DD8BA39D79E699
320D4521B036548AE9BC6AD64701F4A4934E3AE99A6BAEA1EC803C39DDE18003
0EB8F7DE7B61A62E8DE71B2001FC9D8280E38E3B4E0263A207643A249766CDE2
689632A845D66F61D09C5BE0E3D1A1AC88448FBEE28A2B6432EB0E071E78E00F
7EF08370133FF0810F3CFCF0C37A288FB6DE4158D65DE90B160691201288F549
60F02BDD990C6ED69C9B93BC61189C5A07D9438CCA9CCE882BD3EF10787A10F8
452978B03FD2625B6926E8C4E6FA6E5C0D875FB86D7F119CE4C0587EA1775988
12C7C6BB47AB0B6BC93C17179D077DAFE4927CD2EA8A72DD51BE98C4627BA349
7D386A49CE970A12504929713D8562219797D9E0B148138F2DE1A187A27CC5DB
EF49874B7A5C53FF2F6A0D568AAD8DC978A5598F73F98D8DE82597AC2F1556A5
23D18C340BCF10327BCB4DFF6271C25C47F2AD5B19EC8F0BA24190967593363D
C0748238E843090F0CCB125FCFB968AB5699B913D4D6BE426CE0B0FC78CAF315
CFD8596BE60785E9A1B1B5EF8004091D1BAE19C3DA6597DD9E7DF6D94A85BC91
2E89ABB1B14A6F4F7FAB9ECFC505EF856C799FB574EEB1B11171F65C21A9D61B
85A8279FEF9B3DB8A4D5EA6BD64BC57C6FA5DC4C53353CDFEF1FE8ADD5C7CAE5
91DEBEAE346A97AFD6CAE3A343DB6EBBE0FF3DFBDB9DB75FAA6B3EF6B18FE9B8
6E28AF5F30B8C0434F7BF5A740BB065D3C36BEA15A1F6EB6C69368DC45B21BBC
4D907A2029B9F492A0E54B60A2CEAEBCCEF6DD77DF9D040DCA5981850B17BEF6
DA6B606DEEBDF7DEBFFCE52F5971519EAC04F27C5C867A1865FDE1426FCC8A15
2B5843B236F91FD6E095AA89565D13CEFAD4A6914A1559A8A052F5AA5F92EE4A
C3A3BC781BD05A3281E1A3A5F088A7CF7B37170DCA3B4A9E6407FA3677EC0313
5197AD5CB99293C018E0FEC63A2D5F45FB85C89F218B14962461ACFBD0BEC6F4
6EEB01676EFA194ECE79E79D77E595575AF1272977A605737477DD75D7DFFDEE
7730081236A04FAC7B3AB5690BF4060CB8B0CF043C9A78B2B54FB0931002D549
C653B8A0557AFBDBDF0EA859947619034184E81CE51D471E79E4430F3D245B01
67118FD39571DA9C406AAC9E85241373BFEDB6DB8E39E698934F3EF9F6DB6F17
7793ECBCF5D65B9143FA96708B1D3A383B09AFE4296A48B808C842694B1D8EB2
F62C8455E6CF1FE8EEEEC4F5AC83E31D5F519262C345E4DE58D32E5EB89E99A9
8162EA353C341ED52BC5F1CAE0586D6E2BE94B4DFEA66F41E3C144BBF24511AA
7E556ED6A58CD4A3B4F55CD37B87BAF31E8AB1DAA8971BFACA5F5FF54EA49C77
094F48020F38B120DF5B2BB80D8DB16ABD25DA5E9B442FB86443A9305A99509E
3492EDB7DF5ED61BBB632E0A978594D84482046F7EF39B9F78E289B02D8C569E
C407B33E0DB3FD2FFEE22FB47778E1EDB6A6BA85BD68A0A865CB96FDFAD7BFE6
2B4CC6050B16186CE564E64B41AF19E5A6F5FF41244192E1D399FF0AA7A2E126
858EA019827C6E12FA2FEF0953FB0187E0AE5915E244418AA6445B1CB7855911
A7506B5D9981DF512C748E8D97F34EFAF98078AE74556F504B4795DDD0911F1A
5BBFCDEC793DDD83EBD679C574DE363B27CDCE449662AB873A52916BB143BBD2
92351079A1E315DBD5AB57CE9F3B7BC59A17962DDC6160B0EFD1277C1BDEC30E
3CEC77BF7BEAF1A71FED2BF688FABB7B7CBFBD9191B14A65AC5C196A24E262B5
382FDDB89A5623CB28706EC2BECE9924D0533863D2C8B40AF87939F628CE38BE
51D3D0B235D30F7EF083F7DF7FBFFE04FA58D78006AAFDC095A4CB0E3DF4D007
1E7880BE42BCF07E44192E601A5C1A4F3FCF61754AE6B6D256E0626EB1EFF152
59B060DEAA557A7AB15CAB9B994935E37C91E3AA558B162F9424FBFEF7BF2FE2
C34D51ADD4BA7BBAC646B668D6687133833E8E32BC23EB236FC98B219799818C
F6DA6BAF471E79C4A5EEEFB4BE69DC650A1A397F2074A22C4F8756A2935CCF5E
5A349D22B1720EBF195E66D51293C08E818BEDB2CB2E4F6789DEDA8B638F3DF6
AEBBEE02E85117EB864CD6DCA9342506CDD150DD8978BB2DD1BEDA96C80C2946
45DF445CD8C454704D7CE10B5F209264831721A101E002D67B8C035B01DD5914
282A02DE1CC70E094596158373C03060DAE459F89A3777B0ABBBA451A589289D
A9A7A899A6CF4ED8ACAD2D5FA26D632E76DE532F46C12781D6AAA5A1913995FA
C228EA8B7C8C20F61D9463D6BF45869BF708C56369C71B29269DB9A2CBC5B209
C69A3EB09C8F5DB54560D96B352551488A6437AB5068E563C9D5F196371A64DF
3DE7DC7097F8450CB7D514DEF39EF7FCE217BFC00642CD62497151C09790B5EF
7BDFFBC4AC692EC4A650AE61586CE6E2D6DDA45848F14248204BE05D61CBEBB0
FB2C3B4BA716CC2FD25BA7A4675D402D274E02CCC13F60F6F9DCB973292261CC
EC1A7E5D975AF65465F374DE4F777EA79404665B446DFE2C73139D75D659F7DC
73CF33CF3CC3E9D50F00B2D86E3B1F8714FB2EA5AAA84CCC5247B794D9D875CD
EA9F53F02D2DEBA9F3D4F362D167331ADB3434EC9149F37D7D3DF35A4977B35E
1CE8DF26EF16AC5BBB41FB9ACB47AFAE7A699B39FD73E7CD7E71C573A94227B5
AB67B0BFF7A9679F78EB2EBBFDE6E9C7767FD3DBEAB5E613CB9F18E8E8E928E5
653D2C5ABCA05C1EDDB869BD3E6FB6648988BA2A1203515CF3058CD25AE2A4D9
48D216EB698EB60FF3783F9A248121F3A0DD13F72B05BDB442B311AE24F60104
8539EB43AB90BD31D51835C1DA8A4D64EFA5B6056A0B960476DF4E3BED244D93
72798D649F7DF6F9D9CF7E263691A479B85ACAAEEE6EADBF574944C469C52322
21ED029FE6328B7389672513B28748E0EEBBEF2EB3404F39E594536EB9E516CA
BB7038D27DC108CB3C8946F4535292BEC27E7799454C89721A589B58048DFFE5
975F9E5927325EC6B2D3D45B3F913CC066C76FC37B98949E75F4D1477FF39BDF
B4A019453400C598C5E05275C97A559255C26971A98CC45FA40F3560324F88D8
4B15D5FF5A22DD599F68A9316EAC3CD518344597A4A847198EA154484DC49AE1
982DAF2752D5499AB26E4831076306BBC20A47309270F8B0C8920DDAB8430E39
84198551C77025A542A4E9BCDEB09048C08A92C99E6276E54CEB679B886A84C9
8551568936B4A992EF2A267123373236AFEE964987486300DD2ED79452157B10
BA287185242A2691FE1F918868F95698FE0EBE6978B39AB4D256EE4E2750ECBE
969AB64802190A1DB16F7B596F782131E4E217E3E8B9A8592915DC58DDB23FA9
9387178536413877CC5924A596945C5E7405A696648814F627E42D1B11B161A7
181AB3FB1BBE4B08FCA99FF8A84C4A6C53D2B379F3C342F7DCF4BDF6B6F615CA
7E728E09F3805461C93FF6F4196CFA5CD01B2AB7659FA8141822BBCEDC97AC23
597D0011B3FA24BC6B8229471B4D57AA7F6CAC5AAB357371A1AB38CB27985665
8A46A9884ECA9571C98362A7AB546A0B162C5CBF7EB4A77B9B4D43D5AED2EC52
476F315AEAB1E1E6CCD35356AD7E79C1C2B9F3E7CF59F1D28BBE70AFE65396D7
0CBDB2EB925D56BEFAD2278FFFC4D5D75F3DAB73D6ECD9BE0F5A4FAFAC818EF5
EBD7943AA5798D8DD72A3997F8C288B8DA4ACAADA492B89AC7DB8A52D4C434DA
8A24F09022627C71036009BD27C8899703055F14B970E1C2952B5786AA347680
3417D828D95DF825F45E6F24003054E189BA0FEAA7815787E11D0B30844D8138
C0DA542A15BDC08FA3AA140DA936D52A4C5FC75A2A994B19907E353E36366FFE
7C4932DDC4C73C5E5B63740C30326AD169A79D36A524B0DC06CA0228984C66C4
FEBCFEFAEB3FF399CF1098D59F0CD5F89D9EAE67DD78E38D447DA7CB4142CD87
BFC3A9ADD107F46D506B19285B17D95F784E4C424719CA9B45EAD0B569BAE982
ACF31D77DC51DB4D5359DDFFA4934EBAEDB6DB3C9C491AA26F2BF16784DFFAD6
B774CF934F3E994E20C45A88F0B769E5E22FA79F7EFAB9E79EBB68D122564394
231BC5A08D2C1D80F65221768264219813868066EE35919C668153488F008723
3CA796A59ECB5260240AD39E193974C342A148EB0543DD21879D2A87B63410BD
19DB30DACA175AC5285FAD2C68BA9DA3DC822429BA567747A7F4FD8A4CFCC815
73F9529C2F365D2C465FD8DC43ADE51DB14903C4A19CCE61AB9CF898701CA599
A6A9E4F08E088FA8EAD33936E68ACB5DB2C2D52B857C575CA42C03CD1A9C0FCD
B7CDE99164B0D269A2A067E592910F3EF8A0340F2DF889279E78E5955746199E
A3E195A2E61BB8827E28AAD091E7B84163A4D87354D189AD87A02E40619AB95F
8B81CAB9ACAAE60F987DAED991A780A1837464A896C6ED0233FA0DD804131101
BBCE2E429590D2F4C20B2FC0C52CAD254583F1D75B6D571CE73D904F942BE567
75144B69AE6D92253CC8404CC6EB9BF6D87DCF3DDEB1D77DF7FFCBC60DA3CDA4
B8CDECC59B368D76C4DBF5F50DB49A11F0BC1D1D059FA81625DA27591BE3E5E1
39B3FA376E7AADBF4F96E3BAED976C373CECB536098338A7ADCA972B632FAD7E
B1949AC0A2F95CBED94AAAB5FA58ADA183544FB3923C79E287D5307DAFD5D84B
51C90918C792254B70085A4DA009D524EB28897DB0C30E3B8895840909C632DA
D01DAC22919FA3264B614CF97EB7F17D3C0FD05F4F9AC06ACFB29A75994A281A
95727987A54B97BFF042871862A5B2FDF64B57BCF8E2DC94538C02A79E7EAEDD
83FEB082ADFFF50CDE21036E32DF20AEB0E924013C37845841E44816F22B7143
715BB8E7742741F7D1B23FF7DC73D655860C397D65713F0BD95996BD610990B9
C0B91573D757745DA5C6CD65269D0596F5FEC0030F7CE8A1877419B7357B08D0
59C6A955D2F651F563560EAFB6C1A08B7164CCC2B3A23F4BF3A0A4D9A56A178B
CC8E707FADC0D34F3F2D99F4B5AF7D4DE3C177C49DE9ABCE27A03C199453DB32
4E70A2B890A6F34CBC3CE443FA65988F6F19B7C9E6CEE9136DBD4139F579F475
D72C76340ABE89E0FC56B2435C98EF5AC566AD2BA513CB6F2EC4FE0169DDD844
0157BD5147FBF5ECC9D75CE56A4953EA58C31BB54E9A57D16B654959B497D344
9C54EB35C5FC2BADFAFA465387B26FA09F083C34A3A384B906D11653205BE44D
880AE3825A7DAB9F47C7E727F806A9F908A39E4B972E5DB16205C96044FB30D1
900AB8C43977FBEDB7DF4F7EF213767F8608B04133584EB0350AFE8348823FFF
F33FD76191C00B3B9586FD4B5E4FBA870BFA27B74902EBEEB739143365703954
B838FF975E7A790A1723DBB923CDB7F51D2BBB7DEBB168B07756A12036E47DC4
8D662D17473DBDDD23639BD272A16D376E1A2E16F4A7348C9C8F9E265DB3676F
53AFB5AA95A4A7A7977A1FFF94AAB676749BB9B3366E5859EA8CA5E2143BA2E5
AF3EBFE376DB25AEC9115DB37675DD55FB3BFB87CBC37D5DBD51DCF43CBC312E
49D0F0790D133D095C629230967DA0D3EABD0A798F6B86C288528643C0CEBC95
59A1516AF0FBEEBBEF4F7FFA53738573A4B9C07419AC3397BA89894D0144835F
3BCD1EC919BC0C31430A086BF51A2752474B3A4C247214D18B85D52A6060CD9E
33E7539FFAD425975CA2EBA52ABEFCD2AB6CB95679A2F74BB5DA3F3090CF798D
95FEDABAED29A79C82628BC23539626CAC075B04540649C79FFFFCE75352126A
08393C329B34776BA14720043FBE19F5337B87F4DCA38E3A8AA6AF06E06E7A99
75DD4B02A04AB2A10E3BECB0BBEFBE9B28AE294ABA068F0ACCDD7A7458FCF9A9
A79E620A561E6C6848700D723AADB3B90683E1887987E1A8C5D794F11AB9A0FA
49CC453B2E9AB9207DE94392DC4466E80D3074973668B4C0A31E24DA0073188A
B27A66789305C09194C601CD1A98B88F47A603F0CD2B3FDE09908FB22C8F5678
A649A08741D9E64CE06FCAC072F9511F59D32173735C243130E8928EC82D8C5D
218A4BCE37B149F3445BF5C835647F345D3E17CB50F019A31248D81652C9A362
2D69549CC74E4AF2A9406A26AEE5D6E75C47DC51AE37D7BAE6DA626EBD6BD66B
4957941F4F1A74A37459EA8BD659EB8983D10A86CD26A01B0A88205085F93991
B2C80303543768072DB26C771186D61674237650E4F1E4934F9A2BB895F627D0
8E8749A8FAD5741DA850112CAAC4D1FE03DA04BE074C8A326BE8C518C4A2314D
1C2209738AA69340D379873454CD4E94B91981CE72095C069766B84B1C5DF45F
74DBEE6ECD7C4C74D6DDDD3B365689A37C311EE8EEEAD1EF6AB5467ACF86FE49
5B8FF3E4AD77FAA4E4A6D4F2AE91E16AE471229AFAB3BF6F4E67A9AF5A91242F
C10BD6AE8C172E9ABF6AF54B73E7F48C95D7572BC3DD3DC5BEFEAEA1E135E6E8
B49646BE93B89701D57ABD2C31D06C79D7908B1A3EE339E7F00E510D97D6D045
2986F6661C7373D4480DC1A247FB08AB93F4AD3533A28A2FCC1D0E51A0C93785
3B64E56C895593FA0AE7B4FC3DCA108D2602121EFC3DD2DF310052DA5A6D41B3
59EA9C0827C8C81A9C25B9B8E1DAAF7E55FC5DA75EB261FDBA7585540DF18A4F
868E8BB6CED88CE9CC9045EA322C7B64039D58A6A378147FAD183939B8C825EA
F4A1619D9F73CE39575F7D358E97E94E024017F81E593AEC5373F173595BB771
97E98086C792A498A6D697559F03F669C69CB17E00098C9B603699DCC2D1C7FE
6AFA5FFCE217AFB8E20AF0623506A05A74812E63C590520C2FC4AFE6DB507302
C6E3EFFFFEEF3FF7B9CFF1087E4558926F0D05FDAEBBEE3AF2C8232D66A36F45
DB0099B9ACAE6AB2AE9632DF5CE211E126747DFD6F4145AB0F0DF3D9B9D800DD
D272217FFCE7CEE9DF50AED4AB320DE2DE241970CD3EF1B5BC5BD270BDB11B28
76E65BAE5CAB0CBB4494D4CCB942D3878BF3399F2114F9D6F662424E47BA2B2A
55937AD979C48C56DE5B1E9A9036F2E59C2B4679D18A0CD5F51DA9A256770371
E76852BFFCF2CBAFBCF24A6DA2717F48A22D986F84D1E6CD43E5A23F87657F5A
E40044077DDB4651E67BDC7FFFFD7FF8C31FD2F3CEF2F1C31DA724730675DBCC
65978654018699AE0E666B5F6D2ABF79F376DE79E7952B578A722072B67B665B
7C4A9B005AD5024661DA2CC5F72EABC30476C232D333C6C7C8B034FDD18EBC42
90932428163AF2F9928C458D2A499AB4D22E4A6D6D16F2717F2EEAF29FBBBA2C
C54A75A4BBC7C76CFD81C915CBE38DCE8E595D9D83FBFCF1BEBF79EC899757BD
FAE69DDFBA62C5F242476B7076C7CAD5CF365BE363D58D051F252AF8B276DF10
ABC325393F115F25264E3654AD6D12AD8AC22D6E6363C6A169FEE529173A445A
E605DE4314749706CF40D4D6CCFAA342041EC1226B506CD46977CEB62F679179
E38929A0F1E64E2F6164AC23AD2FF0436A343B8A69E64CB5D659EA18AD54CD99
6E0CA295F54299FC9A4E47B07C3B1A1870085199354796822877D886D7CA91F0
8AE252430482B5A29FEB3090F5A1FBB8D4E703C22B963B286F2039EB5652EE3E
F2918F5C73CD35567D6635CC6D2C604ACAB6FA47D94CD2C72DE5F4F5BF001095
86A551E1D3C78D009BA0460C46CF34C1FE94C038FBECB3C31EA86165102B79C8
2187DC77DF7D880AB3B9C3FF43DC7C919F16072BD3C2986C1FB46779B751862F
6D7E274B3442DE600FA1D871FFB0312D7078704CEBAA48E21C8A912E86A92126
FF34CE75B59A03690B3397D6180FF9FF759E5B8DA6EB2FC68D5AAB90F726C968
C3CDEDEF9837D45989EBA3716DDCD52B13F1615776B9A4BFFF95A10D23698EA9
267CE2A73FF58D5BBE59AFD506670D5066C1D2852964686C6101541846B66462
73F7B5613B8788B6C60A3835286A53D283A10A1A86C4B1C71EFB96B7BCE5A493
4E223F8D94EEB62A8436661244555F6F27ABAD7DE1E90561DB380F386906D2E7
B2EC150C6553645D9635670D211C4154565FBF21AA661D53B9971519649D7AD8
B329244147B194CB75341B138088491A406ABA726769A0981F8C922E0F03978B
EA8DB1F1F2D07065636FC997E9575BD5F7FEF17EBFFAE56335976CBBCD0EABD7
AE9D3B6BE1D0A69146AB3138D0BB6AD38B7DA58214F952673E4D396D4A72944A
5DB9581AB1AF83F72EFE64BC52DB58AE6E485C0549A0F14BBF23B78C60519B93
310AD007AD22898324A640E4E0F0C30FBFF3CE3B7599819CD8E10CFBBAF02B0C
1A9A0CB755EA65F541131B439B6CC3B7B06676763DAB5D8CA3F172A5BBCB67E8
160BF95A7D82809A59C3234B257699CE381DC54CF73975E7744D70A9C33D4CD5
A7FCFDA5975E0A55333403A42079DC7CCEC9115B97591D6A6D5A375194668AC5
6D6874FA53D7C046F18DE857D61998BBCD9C8D876036AE015EF40C91BDE95E18
DD9FFCE427AFBDF65ADEE36EFAD33FFD53E9E9F0506B506E95E13FF8C10F0E3D
F4500B1D013E6A74C5D921E71D45C46D29032CC19F8DD3B9FBC0073EF0DDEF7E
F7C20B2F3CFFFCF343900C6325CDA01769B8A7C6EF0CD618E406AA2309AA1B27
D28E9F7EFAE952C0A1584941E93A94F8251936B8CB2C456CA9B7E92845F19CD8
F53BDFBEB20CE084B4B15663FBAEBEA45EABD42B4517F576F6AC2C8F2CEEEDAB
949BB5A85E7535EF13926A96B88D497E248E56B57CF3B37A211E6AD4AB4DB778
DB6D5F79E9D5B45479B38946CB0744725875612116F04858044417A695A6A037
10309516DA35309CE17DA62C5BA1D60C7E7F0E94A5125155804B59142B9170DD
75D7511808558429F861E5F65675B7DDDA9781D348F0535EAE532C5E67D01761
48CCC60330A25DE0D2081C80779B6D2E105CC5040D878B468FE61D0294663A49
50887AC5A0F3B90EAD83C778481A38885A51ADBF6F6EEC7AEBD5BC4F192A7A10
A16AB5DCD1D9DAB8717D3519CFBBB8E16A83BD83CB76DCF9D1DF3EBA78FEE24D
1B470606E68C0C8FA79E4E1F00A827E50573178C8D966BB546DE3BB73B7D65CB
442E50AB5A1B1D2BAF69241E784EB4E1BC662185D1599AB02586869038480253
C3AD79AF2D1CDC5F6F76D96597175E78019C7A8207F81C7573EA2D2C55145668
9C3DB46DF153111244A7FBCE77BE73C4114710E945B3B014348F2AD5D7FBDA9A
B50BE6CFC300943C906550ADD593AC7192C1345A19EA56519225DBDD72CB2D1F
FDE8475D00438B3A4C36116C0ED874119005BDAD0D1991528C623CB3FA95A853
B444C6C10D37DC70CA29A7B0E0BA156E2B5B6A987ED83BDA6588F3E832D34932
F6D44019B9D51FFDD11F3DF8E0835B7BA84C0DC4DA336076BC6A9AA9B9DAACB6
40BB2F367AD555571D7FFCF1A66184AE4217000BDB8287CA23516E93A64C592B
40031336B4CD886CCBF2725B16CA4172E2563041538D77DB6DB7279F7C926C5D
D0B3F546548AE6A8B90071A30180DECC528057AC6B066AB55971343F9FEF4F92
42DD0399D63D2A75AEE462A9035DC58ED76AE3DBE73B652078CD2F8ACA1DB2FA
1B7A9B823344E349E1B5C46D70CD55CEF7E01C6DF94832AF42BE23D7728B962C
A65E2F34AAD28AA509ACEFA54B97EEB5D75E92CA560562C0CE2C9AED8EF5FBB5
9D32E79BD19B599C339C17931656EF12FE5C03239E4F9A49D8150E0D2904C0E0
86A42A31A9E9BCAF5BFBD2200F38E000ED2C3130B7655F19CA53183F69D3C603
0DC035C97A63F0F328B7651FDA3695CABC2266164C2B09E2EE524757215FF292
C0FB15EAFE5FAB592CC5A58EFE46ADA3D5E8E8EA1CD4F67BD74A3E1A1E79AD5A
1BCBE55DB1233AF8900FDEF5DDEF946B6383FDFD62EBDB2EDEE1D557D6542B8D
3DF6D85B7429762CC93A3A52F145B951219F93859810A5F181BEEAC6B1F2A691
D17592046250920428E062B69AFFB265CB805D835F840D84DB760BE477CE9E91
8BDE2C5AB4481C4D2ADB030F3CC05A9B82660AE93DF7DCF3B77FFBB7F8D3709B
D83136B3C0BC31B459A75616B3374CEB7659222FDE7F7A6D16F23A83F55983DE
7747A7F82443A26F9BC5E4D7CC35C336772DE6673EF3998B2FBE581FBEFBDDEF
7EF8E18743C2D0C4016893DA15F2A610CFCE65C976F408B3C3137670B4F3095D
857AA8CBC0B3A8D4259FC45C22338C9F7452DDC73707CEDC9BAFFF6560674802
52FEA1047C08CC4EC3C0AC11C99D7AEAA9D2DC119C612A301C04E30C2279D39B
DE44450EAF36378251055CFB84134EB8F5D65B1127932501E61A72DAD012D17F
F1E32124CE38E30C895EC06E2D330A996AC0E3D6E7043AB7684A92354D8CB216
BBBE45CFF070B70455CECDD27D9ABE32C0AB602ECEF717D60E55177517936A4D
DB59A927833DA5A1D14A5741E680C7A8CBA7FF0DB9E825D77CCDB5EA395F7186
61DBD9DB551E199FD53F581ED54CBC29604624C11EA426D6B35138DBA1F32886
60A9711AB9F9C4449F70B09D76DAE9F9E79FE7266C01478C58543C7D0B58A361
13DBE4AA9106425D115D94257EACED57D85CC4CC7AA23586A3672AFC1FAAE22C
2CB5D39FA44E697D706958811B179BF5CF8165CC18E83AD75A4FAFE287F1434B
4AA58F8A141F2A9E107D6EC229C64CDA25413E1237E92E16BA5ACD449A7B2A06
3C332D945CAB998F5ADD9DA559A5A2ACBF421C79A3A9D11AABD7ABE5CA489CAB
AF1B7E75DE9C818D9BD648CDC8E56B6363D5D9B3E6AEDF3012BB8EB7BFED1DCF
FCEE590F9950E8893CEE53673ED7993AA044C705DFE2351A1B195D3F34BCA6DE
1C4E1187E2B4EB930F54885CF6DE7BEF7FFBB77F03C225646D930F6794622B69
112DF00B8E26FC4EA4405A9B28407C017B53FF4BE1123B20EF1380493BBA4986
DF676C2BCC35E41A9285DBFC487CD56A36777FFBEEBFFD6F3F00E4414F77CFE8
D8682E3320FE2092208C64BA2D6B6E6D415C869A4B63EEB62C6678E8E73FFFF9
0B2FBC10BFBF560F441D931061EA2DE51A8C99FEDA5A70EC1EC0E910AE96C633
B3EE46DA2B142FA9BFFFFEFB8B0F6ED58932660AC09C2943C48DF0A15B62928C
80B3CF3E9BB1019967796871D086D765A950EF7AD7BB1E79E4912977C772F66C
B589A6584F059628CCF4C8051DD5DBC23F5653CDE14DD2B6E42E350874046EBB
ED36E06C35AA1D76D8418A246571204F18B033AC419FB3591381F414D2A4CBB9
7EB1456D65EC8B0362DFB9AC352BE74A0537BBA7EFB575C39D69D3020DB3A319
49A45453D0949ACBAF73F10A575FEFE9D7A5C0D7CEA727353C6EB158482197EB
19E8D7C9D2F034CEFBEEBB2FC4D5102D01938EE3C877A79A54A462AD93901997
5F7EB936C86531182DC81E7BECF19BDFFC064909980AC1AAE97AFF910A21CAA4
F6DBCE9711B3B90AD00CF02B581103044040C2A009A1EDB42C773BB2A4FE502F
F35011BED223C8D780DB1010B2D387998B2E8BD72BECB01DB9CCC66432C491F4
BF0E955650869BB926D11D3C1CB47F4D96041DD22C5349E0730A53319036EC2E
B4AAB5566771A0BB7356AB2931502AE47DDE95B6F695575F59B468FE9AB52B9B
2D19E13A6CD5CE8E42AE507DEF9FECF7E0833F7549BEBBBB6FD3A6E139B3E70E
0F8F7696FA9A8D2869160BF9AEA20F48E41ACD8A6449BE581B2F6F2A5737F920
411E2749EC92B856F74BAF6D5BBEDC43F4803D69819430426007320CAC85FC0B
6544FAA66EA8BD17D7BBEEBAEB885C59E6D977BFFBDDC30F3FDC6500962E9004
E6CACF0EADE73569D1FCC674C937A37D584647CA80FADFF7BEF7E96CB03B26E4
014F7593BC43D3D1CA749CD43259AD4120048D6681E50B7C34A2C24247A65585
F131FAD403D1E1DC845FEEAB5FFDEAC9279FCC2250D6A00FCF3AEBACEBAFBF5E
8B2C0DCE82F9C61CAD54D88ED37453B3220697A25752F0F1063A0B6997537493
D5F45720EE4A6529656BFBEEBBEF638F3DA6F5973C80E3500FA167196F42C980
1784D86740514DF95CCBE520DE4B31B3F5724802B46A784DA878BA20DE60C04D
1C6CAB8BA4D52DABC787A62402CA4DA3660BEF6BD6C71D779C6486C4E15FFFF5
5F6BCA5A135F643B36DE6AD472E2DA1206B9B83797EF6825AED99A9D34E7964A
A3958A18EA22E71B5B826E2CB361CC35475DB3E6E2AACB6B875647CD6ACEFFC4
A55CD827E7D57D3EDEE8C848C1F72074B03022D5946AEA3EE85BA40059770D4D
81844E1297E1CE48623C456F79CB5BC46AB547B67D12159865862F446670880A
33796BF0DD61B352696C029297085E77438D4B7100BBB008098385B943F48A08
23495B459FD3BD3032F0C7EAFE94B89F79E6995FFFFAD7391774DF93361FF688
B6E8A6F50EC1DCC9A57528136B44E60037D57B493CE05C2C0293A92A537B8790
049A75AB1967177B1C8828D7ACD4EABD5DB3A3A4345AAE6E33B060606070F5EA
3549B3249D5DCF5DBB6E75AB559BBD4DCFF0C85A9908B5E6A6EEAEEED1F1D1CE
8ECE72D5635F0FF4CAB4A9150B9D91D3CD0BAEA50775797E5A1F1F19198E0BE5
6A6D54B2245F68E6F2E4CCE56476F4F4960C371FEB38E4296184C038B5F97CB4
645A13FD9CEE2261192A258EE090803A60186164E6E243DC9CA2974902F1CFEC
29226E7F6EAFBDF6DAE38F3F3E5BCF0912341125614AC0164D10F190F6551E9E
3262FC06E204566526C641A70BA00E2EBBECB273CE39477F36B36E5CC4F45AD6
FD3C5B4333815D263899B8E130C3CEC21C7F2625EA2261092EC051DF6BAFBD1E
7DF4511B21252C3364C5595C01170DB18DAD8D18C352C104742997B4266EBAA1
066CDDE70D1F14CB89D5B37475DBA33016156D89091CEE91D58BDA27D25AE8C7
D02609DC960828A1FA625B8F5963C57A96E26C8E72A21DD26390FD58F9B680B8
A4C45245D8A64B4E80A3E4F2F5B48AD8FBB27271A70C7AF18456B25D67CFF8D8
68DDD5170DCE1B1D1B19AE8D978AA572AD224565344AC6A2A42643B615355D54
16AF8F5A2E3B7C6953CE64A07F6078D41776895BD13FCBD402B3503500CD1748
7D922CB41D279E78E2CD37DFBCCF3EFB3CFCF0C3DCD0B0701078705EFCB4B0B5
10051A3DC6AAF926BF74013845669619F804F62E0D368E39E698AF7DED6B56EC
4264D81A1DC3A67D6A6614117DD1B738F7FE5028F76C96CE14223FC5A3F5533B
F2C823EFBCF34EAC5840C0E844A291A36069ADA8BA2733F00B5FF8C2EDB7DFFE
D4534F4586A567184C56616FC0C516344EE91EDA6D9704B9285FEA90B6DED96A
BAB42F920F1A7B2746325E6F24FD3DB3CAE38D5ACBEDBC64D7254B963EFFFCF2
7C346BCD9A75B09859B3FA9E79E17FB75D3CFFE5579647B9B2B7AB929A04C0D8
F8488A6FAA43D8531EAFF5F40CE4E3DE6AD957098821BBA851AE8CE68BD57AA3
D24ACA71AE9EB87AEA1B4D240964315862B28574984B1827B0956DA5B07C5A07
CB2E47E3E0E796B0D5F64334053B6F2EB3FADB22C6E9272E6DEFEC7089B854F3
D5566DD8B009B1147AAEA88B261B9AB1595BBB4A657CCA2CD2AD95045186CECF
D687D00BFA102BC4657E523CD76DC8DBCC919158176FDC5FC69BCCCCD23110CD
C978D72A11CE32EEC618243C4E38E1846BAEB9868A4DCAA966A8EDD4B30E3EF8
E07FF9977FD17E89955802FED6AE034F4FD28E8362C4E66091E5A7D1A276B1F5
FA8A0A2F5233A32D3B4E9BD2678C23EC52192E3B6FCCA14C362D7FA2A685DEA1
D001683A41283FAC5E8491187A3CD46B90FD5AD8CF7EF6B396DA6439F86E5274
D06C626CB282076D112BCF25291E413E896413F83A81FEBEE1A1A1DEEE9E6F7C
E3960F1FF677A5DECECA78D975E4BBCB8DF138CDE710CF9719D0F43D75524E91
9E85A415BB388A93BAAF2DF29DD764578B783424AD153D7B41CF354C37ABDB00
EE45A362553105105729F681AF189534954EF3A52F7D49933589487A0CCD6D7E
6F3F703DEB88238EB8F7DE7B6970C6B9B02050C888796288E069AF5077B4FED8
49D65F7AABE873BA17CE55B066ED8D0B5AB301342295EEBAEBAED39AB0CB80E6
CAF8BBE5965BE02AD661AD7D398CD361E0180E3BDFFA3054C56BFAC5622C2B80
A66092C191CB759706378D0C2D9CB7B8516FADD9B0BAA7B32B8A5B1E9E28CA61
DBFAF84FA55ACCF56CBB78C9EA55EB0AF16CD14A47B1A7AFD747F94A3E9D3ADE
75B75D7EF9CB5F8AB7AC1B7D35F63DF2EA122B1D62F68DEA9CC159F95CE7F868
B2EB2E6F7BE4B78F75E58A3B2CDDEEA0833EF8D51BCF9F357B60D5AA57655F4A
72E878767615ABD55AABE90F0F91250B4586FB84A14A58129E9504782C0858EA
878D3B5855BAA17A455BF61AC30B49D9141F8A3D891C4F3DF554590056016FA8
CB903EC827D89556EB084B0DE11243003B2ABC7492F91C3C00CCC024EB041B16
FAB6D9432E533361E561026BB425C22D3A3BF7C47F8AE2EFB21669B4496965AF
304326CC2C02398EFBC02809AEA6B270C30C3845D3BDA2B415E801071CF0E083
0F6AFA006523A8F4388D0A2B875585A9192A99A882A5B3DA5DCEA7B5B6875C69
ED8433DD0C0217C47BC3FA2CB4AD3016159671C2E5256C4839D3328AE6716761
B94FCEED236A42B09D0A76503450DB99E90CEBC652E3A683F2353BDDCDEC36A4
17DB61592121A9C4D383DDBB2D23F671D0A911DF9A059C58A209DC943462C978
664EE59CE1455EAC0BE0A7B0952DFBC0BA3F121F3EFCF0C3EFB9E71E5D2CFE48
967088ED3AE5BAE105E13210EE702BE97156824AD4C1051962040EA927479CBB
AC358D198EADA0E50E8E2F3AA35831CDEB7F596641A88A8517A0D15AB08DC40A
7D62021287873357F9E40DB6EF42E45E4487DF75DFC25AE415E50B929612ED5E
12A45D8BE39D96EE3C3434B26EFDBADE9EDE4A65ACDA28177CE1A108C26F49A9
D4353252965ADC59E8ABD46B5DF9795ABDFEBE6DBABBFA366E1C4AE9A6B1C79E
EF78E4918775E76287EF6F2CAD5F0FAF376A6958B26BC9F63BAD7871D59AD736
7677F57676C9DC8A97BFF2ACF87F8AC231AA1BD41BBEB24C3FAFD59A71949300
7CC73BDE418B2E5B3E92BD58F756D6DA224488C38EB35C3D4335B0450FD7CA6A
5675CC442E56C9C236583AB358FFF3CF3FDF069942EABAE80CA663F816E4A1C3
1A40A9B41F220688597113ABD47759160D30AB764360998D5387839FB2828935
31445F7341B8344446679568A26F6287C518DACAE838901ECE3E0364FDBBBFFB
BBEF7FFFFB760843EF1C4AEED632855CD63B13C83926AB9B2020AFBEFAEAF3CE
3B4F6B45D2A4955BCB2E16AF7FD7BBDEF59FFFF99F1A39329BA56E136396E664
C5D8E64E41C2594830CEDA856BD3F5D00B2EB8C01087083BE3FDD74EFDEFFFFE
2FAAD5873EF4A1471E7964C58A152CBE0875FBEDB77FE69967D6AC5943FA87D6
79D1A24534E7D143F513DD1332B0A6A43347D419B9A5545ACD9DB929AC3C1B72
A580C365186A21AB9DF2FE515036E532C7A615E8B2EF2C0BBDDAB15AA03A082F
14AEAFFF658A1A8C9EB837C0AE3A837AA2F69A0711167EDBDBDEF63FFFF33FA1
926E891B53DE1F03ABAD6E834ED4DB6DB7DDFBDFFFFEBBEEBA0B8B997225B8AA
4902432B71291E49887AE2B2F644803F1E78E081F7DD771FE53B6F00A728C9B0
D15CC6B40D10C8A5813A4AA3E112E42F98E6619E6D174407A795046649F1BFB9
DA25095A89883B2A147312EDCD86078E485AD165975C75F5557F3F3E5E2E164B
23A343E2B8B5E6784F57D7A878B4F39EF162A1E4AD895AD24CE29ECEBEF172B2
DDA225AFBEBA66A06F7621AF81D650D02A9571B1F279F37418D6556B633DBD9D
1B37ADD5CF67CFE99365393E5EEB2CF5AE58B9FC4B575C71FA599F5D387FEEAA
D52FEAFE9DA552B9322631A02BBDF3B5A9716E16956DFD765CE68204585FAC21
6CDB0235B36A52E240C3076F07519F4AB592B51E0CBD4FE63C81CA710485B63C
0131733A9922008215FEFA8F7DEC63DFFDEE77A5B74A78D8A99E376F1E190BA6
45927BA7A7DC7FFFFD071D7490DE876073E87A20F14E197735CFA965BFD949D6
8792A08F3FFE38DE4F0C0E8D7CEFBDF77EECB1C7ACF1611494B986B70D6FA8D1
EAA858FA9A1644D76BCC3A54C71C73CC57BEF2152BCADBAA63E0B6ECE5841217
A508F53E057E60402C75B7DD76D38A69A9B517D621009F27228DA818E16E2D3B
DC16DEDDCA5A8E4033E63F313DCB0053ED2C85E520FC044D9940285B239E4E72
B739E82D2B01A68CF580FA0F27456DB4CE97C82A2B4E9E81832401BA00425717
8B8C759F952B57D27CE990430EB9E1861BC8918B325C1AF2DF5E4F9D8A85B518
150CC5A82E5C730B9FD0AD01171016F61BAB8389B6EC5B69B177F0578873D889
2318865D85EB69060984B5A46F0938EB7F825EEC38A94AF40532F729112FA2AF
BA9EBAAB24002B2496A0976E88BE02B20B3D4E6696B833AC035484B0C1930679
6B7822EC77BEF39D4F3EF9A4E64BB127F808F8308F3CF2C83BEEB843176316FC
1E9BA0954142B637A24AF289133774C50E2F572509B4C8B20CF271B1A7A76F6C
54F49AABD62BBAA6B7BB73646CD845CD74513CF88F844447B16B6CB43A67CEDC
35EB36F6750F0C8F8D75C4BDF3E72DD26D9BCD543375858E8ECEAE4EDF72A452
2D77754BD28EC7B9D6F0D82BBAFF86A10D85B83067CEACD7D6BC2AD9B071A357
D06AF55A7F7F6F8A2FAFE347A77217FA529096508941EBE80D986B0F3DF41016
B719B31C693108AD947437DD1049400814975F2EEB2C0A5B812CC28C5B97E511
592CA10D2ECA8EBD59FA544BEA889A0C301E6469EF6D9F138045B13DF3CC3341
5C30FF0F2498642F17E8ECE6DC844693AC09AA213FC35BD17CF93981A656065F
6A2E9724788594AAD538F1C4136FB9E51656CC6DE97E71994F93F579038E0294
713C033AAB66F67274E93D67AD0D193066BE316ECE0F8013E6E4316DD73009E2
AC65104114FC452E9340047EF13C706A7822CC42D24E86022EFBB6C6F76C2BC0
4DC41BF55B0D5B5AA7FED41448FAD665CC6BF7DD7727AD39CA10B96766D32E13
4BE684E438E84F0A0009AE72BA411980575A3DF3EFE550A1F380424BFD848633
F068AC46EBBF76F1C5179F7BEEB92077F1DCADDD77F32E5AEED6C2850B2FBCF0
C2E38E3B8E35D7829F74D249F88848F3C57EC5E183277686DE7C040BADC4E7D0
430F952D6B6AF144AD4F1AFA32BF319A81791A5CD01DD3D40263D3BA9260062E
2C34D419FA75CFB0BF3081364C0E0BBCC3B22C50872B1B7168D591E1264E2B09
2C9F2FC4FDF00E815A229B40C75F92C0AB0F4D9D9362B391F474F58C8E8FCF1A
98333C34DA486A83FDFD1B87D6A548709E500A45AD82CF29EEEF1F1C1A1A957D
A07FBABEC78398D6251E5ACD7CA559DF71DB9D46865A7DBD83E5B49CD0AB33B9
664F6F616C7CA3CBAFA5A6A6B3AB63EDFAD55D9DC5F1F288543A6F828C0CA129
A795E2AD6A750233B93B7D91C61766C1BB80B122EDACDEDD657932540CA0BF8B
D7BFF7BDEFFDD5AF7E25E98A91AB55D66DC3DC535A7159E64033E8A86EF0B994
F60173AD9F13B0353FB5D561F12B33AECD3785BF1E17B61E217AD5C0C6D217BF
62A76C8F3578129CA794042ECB50B43824AA8A16E1AD6F7DEBD1471F7DEAA9A7
1ACFC2EC0DD1B6ED3D1E4F5C2BA183458307C680A25997A65E686058639C13A3
E3371049238152EC1295D6F68229E0AE254A1405F516D0094926566C699690E9
8F56A865A2D7FAEB86765E2809AC509CDA7D332EC16A254C42C84D7700413334
16ADA049BBA6CB60FDA87BF8F7C8B3B2840ECE663C63DF5A7A0E1A396935FEEA
AFFEEA9E7BEEE1D1181C5A90C30E3BECA69B6E32D0B7FFA32410E76579C3802D
C637BE14764A3FA1DC693AFC9F19F6DD64AA9E489A007612D11797A9472E8BDE
9305676DABF5619CB68B98F2FE26695C605BC759E70FD904D2D2AC0E5FF3322D
012D4A84F7C20B2F109017B57FE8431FFAA77FFA276BF14D5504F737BB70E60A
CAE95E0C0CD50A1FB2C5C3DA1C5FB011AEA7FA876C5D6681793453C43874A599
17CCE2049A7E2A091A690F8062DA07C6CDDB66DEA64DC3D57A5D7A7533A9C751
0AF9D06CA44C2D5FF5ED185D6F4F7FA5DCA8A6779E337BCEBAF5EBE8B1D172D1
D2EDDEB472E5EAA459EAEF9B3332D4E8EE9AE5DD7F95E1BE81DCA6A1B55161C3
C8D848970F3B8FCA309935BB7FFDFAB5713CC1D353787A9D6A1700AF6FF6E9C7
194283A57918C3B2362956D8096B336A0801060C83C105DDC138AE16D4856EAC
D3BD6D068B2952A0DAE5B1C71EA38C9607C18330D6C09B25658D7D225101C44D
5475941A4E3BCA08DE121EAAA3A84941166CFF0CDE21537FA20CE98C0B202F14
67124C25084579F409007A17743397412984D40C0493310222E7125D9FFBDCE7
4E3FFD74DD87589926A559EBCAADE508515A1BA59BE84132D8CDCF60414B0DFB
E4934FBEF6DA6BA98D00C5364C27437B32005AF3257272906A614D83754343AB
08CB2DAD7B8F2D2CE958707048E88C33CED06042703DB23C5DD039804C15988E
E6256166D627F0449A17C7D052B3A693A006C9E9B2980D62CF9A628A6E49DF74
9979FA07F10E69AFA962231B5B9F5B7340607DF589762DF4646ED5BE5B7829F4
0E8510B0BAF32BAFBCA29173B4A971A1E08B4A02EB6534DD0BD31F9726BA8E15
A9988A0DFD6885A9C06560BAF9BEFBEEFB1FFFF11F781DC064C47D04B9F239DD
056CE92CDD6EABD601F703C6849D598B075026C2F8B5E320E210E822B3488F93
7176C105175861CAB49280DDC5C4B0F3ECD722576A3435EE56A1187B6C518FEB
E025C1C5175D74D18517D79BCDAE52D7B8EF77EF6BC04A9DF9A1E171DFC82817
953A8B95724DA7A6B7B77F7464BC56AF6DBBEDA2975FF62DE0F549E4F27FF581
83EEF9C1FF17C5AD38EA8C5ABDA5E2A0D7CDEBC34934DA4ACA1DA5B87FA0F785
E5CF69D8F3E66D634722CE79E5D41B161D05AC016660AE0094B8D0CFCB1C0D1B
C042C1E48A99C3D7C04F5CE0EB64E14C5B1447DB73CF3D7562A50471E6930CB0
D332FFA2ACCDA11D5A32BBD11F69AA4E6B4C5415D3FBE0411CE9308CCCD87492
713DEB3E21108A41A66843BEF0852F589A699B3C98928368A8A266C81735D662
BC96D7E8B2A88625F9B94938771834A863B85C5D2653697819363F09B1D5B6EA
2498B20623B06E360C555B03AF310D9A011868041EDBB00260321436FA9A190D
E0DC5106654B0D7B2567E9BCF3CEBBF0C20B91D3A88D7887496F65FDE9BD8EA3
1F160FD958665A3806462B6129DE7AC925979C75D6593BEFBCF333CF3C63888A
33F8BB2959B090064D345D8A0E1B7601A250CEE204FFC788B125B420A7CD4AFB
C4273E71DB6DB79181469A0382706B43444900B884DD2FD5C79C212EE8CF9C4B
3B869A90F0585EB36611F983754C797F2BAAC0CBF7E52F7FF9CC33CFC472A51B
92C132BACC0FE9B244320D83A210BDD1361162C482970274D555570104FB9EF7
BC47D2423FD183305EDF9877C8740E9036CC2FD2A65499CC08731A0977E3EB66
13678A13E8EAFDF6DBEF81071E40EAE218495AB97AA3EAD1F08BA2F5B4883C95
0411485EFE31B1F798E6E34A7534F2B8E91D694FA5566F6FF7C848EAC61DD846
AC40AAD5F0C8A6C1C1DE4A755C7C5CBFEA2CF5942BF542B15CAFE53B8BDBB856
77CAE86BA395358383A556B370C8211FFAF6B76FF36D0D62525F52401EDF6F40
F678A5BFAF777878441B44D20BEE144B56831DA01A901E60E998A147CFCE80A5
C1415596CA69DFDACE71560D1197930057D2A2B532CC4E2B3D255F280A0A475D
86510A500C014C97A5F1B17912E0975E7A29EF930C92C504C3443FCBD4560544
884E8D679F7DF665975DE6A6CA22B5BCF5380082B7C2C5D01FC872692577DB6D
B7A79E7ACA56D20E809BCA26901CD229D23961CCE43B611173FF7CD64D1A79B3
B592C080DEB81BC5962E8B7F98CB8EE47A97F9B810BD5623C28253B6CADC116F
28E996686B2898D2A1B411A10A1F6505775106286264C3CAD8B1846B9817880B
4C17614F71FA9172861F89380A7FBAACD78D21C4CC6013C0822DCEECB246BE38
BEF0D493D400FE6ED80BC168F20D6491E22CB281F12DE190B06DB8CB9480ADDD
7776306CBAE232931ABB938582A8AC4D88097B764167B62DE732E4B096FDEC02
AF9D0BB2A269883401E199F2166B344D169C05693465F23BAC8BB20B305DC2F6
186F6C1DA007291F1233871F7EF83FFCC33F18BD19A4A0CB7CE3D68924AC3D34
1614D959B29204AC665EBE41EEDAB596098390775BC61B8D7ACC520B436A9C2E
2D9F4106327F6A3891A8265A3506DCCA2CBA3E174FD4B66101B82D7BB0598EA3
95F0585E8D3ED14DF42B1E6A13365F10BA8984DCFEFBEFCF42589101AE0F8393
0D750D721220BBBC4BE1A846475ADE4ECA77F7F69089689CD10589E72EA82442
D90F0B4F5813940ECB5C9E7CF0A200B502EA413787A44E3EF964207760E230C1
638F3DF6EB5FFF3A77E027D69C8B28023249CAA6AC07B355591C2B393CEDB4D3
BEF6B5AF1105B1F401CB0222F2195623BA19FBBE5A16A0C176C286689370C619
676830A23A6D682B8345823CF84958313FDD2B492139B51D96268FCE05E73543
07659CE311E28BB4559684D950E66CD1C43548AD701B80BE2569A0EF9B880506
A30D493B843339E8A083448DC71F7FFC35D75C8327D6BA0860E093B618660D18
F198B5D736CE9078EC3D4F27CAA245B673CAB78635695508B404B03401CB360E
232B2E886FB102610B23CE0ECFB5C474CBD06BA3F038C08AC793667445DE874D
B04DF9888292BD68522ABCE904960339832DE502DFA92504C2C4CCBEB45831B7
323C1FABD773997F55FA900C02C3200A0B0B004C4409C08565B464092C33F415
60B57570C42439230CD24C4C93D0A8B36DA1500B9C4CAC15294700AD58F2931E
BCFDF6DBBFF8E28B5482E834C243916C0683154A02180755309671840188A20A
7E2CDD628DC8708CEA59B2166FBDF5569990F02CA2704956858195876736242F
8B71593191C18161195816ACC4891E94E61795AC5D252FC3C7C7BF6C1C902C43
1A6783D0A23D66F3FC5AD73D351C71C411F7FDE847AFAD792D9F3E854CF01924
01A66B280938215A191C448813DB0B37C9F1E23203565A008E0838A935470B73
D7647BEAB4B3F2D43459B882C815A5F3200D5038264204B7D2C2210B172EC41C
06F18D7C644B54C7E1830E612279064900929D75FD846A5D5A68C6D6C320F420
73AA6A6020D7B3382EC51D030972F20B0B06A3BBADFB905606AF2E9DCDF5742B
FD0FABC92098B62C5B634028D122A7A38E3A4A0F92164691368BA34FE86F2A8A
D565E015EA435D4F3F4B97E51D9AE1C200503800D1E49CB7B989D0E98C718729
D1211F445F4196584C224C7BD557C830481D740DD6C1F891DE9F7FFEF9975F7E
B9655599956CF81FE6F631F54B9BA2036264136549EBB4FF8CB242BCD696BD4F
5C00C3D7F6B2BA7100F335664C7936A2B5259AA4BD6F93041442E14BB4E4FAC9
61557B997F386C4E875B18233E09403E780FCF318792CE23CE4FC43C2146838C
CE656DAE2D88A8EB111E22FE2BAFBCF2D4534F35ED244CD068AB3D84C142B1F4
9541C8111B3017B1F9668DC8D100347E99F83AD786CD1CB9008DC8E4BC66FEC7
7FFCC73FFEF18FEDC3F7BEF7BDBFFDED6F3FFDE94F8B019994B6EA35B30DCD44
02EC141B9C788B157C5E7FFDF5679F7DB648FFC9279FB48999DF404F3CE9A493
2EBDF452288C25A3D01CC1D8DCB2858EED99CB3C9B6F79CB5B9E7EFA696A6EC1
2B37F840CBC15FB66C19B2E7631FFB1873FCEA57BF7AE699671ABC01075E8FD0
9BA38F3E5A638615324DAF604A37ECF466FB41071FFCE8A38F3EFBFC73D05958
B2DB46D69B0DB174A1808CE7A8BCFBDDEFFEE94F7F8A3A6025215352BC59E5A1
EB8355B29435729F427F5798900E9BC66C1295E80E7AFF99CF7CE6BAEBAEB32A
18032E360421242E875F671E1F055E1DCB08449141DECCECBF36A5583B2E36B1
DD76DB893A4D11D64D4469B7DD761B490EDABEE79E7B4E3FDC61871D44BBA07F
CF707FF1DF430F3DF4873FFCA1EE8CB0D1763FF1C4135AD87DF7DDF79FFFF99F
398421266518C46BB3F1DB24014C9FDA08ACAB1017DE65262FF93376B24E39E5
941B6FBC916C6EDB8B36740ACB48210B45C3A36D16B9EA56D40A3F7559D981C9
09D3FE747F9C87080397155486F9CD2E30C451548DCCC867BDE9A69B2EBAE8A2
C30E3B4C5431A52470411E840E9A1690F8B3189F7E6E84644612F954930D62AB
C5758113230A7A8B1A84325D2167C85A9E521258E41F268887038B6D4AFAC16A
2703D55283D8325374E0189C11B194BDF6DAEB17BFF80501E1B00593E810896B
8C5B6716F10CFD2F5DBA54E3A1A4C6B0CD93ACC8D93CDB53F61570414359B879
92D59AC19F0D228100320A9FD5C06B6DB19B37274A512765597DE652A75010ED
9EEC668B20A1D059D08F61A13EB8AC0CEA7DEF7B9F581B8030BA0C6C58FD10EB
0922B6647F24AD91A935F0D3FFBA5ED74004E1961B1D50AB4D391FFC88C3898B
831478EBEB8BFA0F0523C9C3968438FAAD74D60C3D3297AD9260224DA8D851AD
55172E58B86EC3864AB5D29D8968F6AF8D4C8D285D96FC40741AAFB4E4E239E7
9C831F80B34186C374146F5E8528054CD7CA9029A415606B93ACA9007531FA13
7B4E1B74EEB9E75E72C925E692B69A356B53634864A818187068D0C8065DFFE1
0F7F589C025BCD0412BA8F652E4EC7A9D18074730D4FD79B73C965990F6800F4
09D05A7DFCE31FFFFAD7BF4EBCCB05AEC5E9743AB43F032B7699BB0CD730DE4E
2D05AD22496AD2E30CA21956D566D2859220C9C03C0C4200A5812DD39D350B92
A6A467D0F210D165B51A14A01A33324D5CBFC5DE820BA0CC5A2F1A710D517268
ACC0B2DBBC192E6868635C3BCA50F3D04989E502A181CFBD91F506B7323AFC72
F4B1B1D62EB8A1EC6E18AF885206F0CD6F7E53AA95CBF238CD21FCD6B7BE5592
D8866AE07A2161230388C6E32A60FA7BEEB9E7C1071F2CA2D57B04CC94E76206
EF90814C9873D8C0C3A7D424426C660B22A2882C5FBE9C59E3A5E0ACE9136ADD
3141F4C6F775181F7FD39BDEA459839FAA3F9185704E312291F7F1C71F2F7507
838C479800B0383CF43CB9AF002A978582409270594CD40C2F6DB134E377BEF3
9D77DC71C77EFBEDF7E0830F1A048576EAED6F7FFB19679C614EBFCD692161DC
328C0DC0E01009644C62BF4C96AB5608031158FB9710D24EABA0D15085087FD1
575A4ADD0D77709265CDC323B47FFA1550B471D0D4257472194D68D8DA06E88F
A3222EA60329531735ED231FF9C8FDF7DFAF67BDFFFDEFBFF7DE7B5D1A79D3AF
C4DA4E38E1040E037E402B17824FE98D317ABF61E5F240BFB758CBB56A2ECE35
5A4D50620C7DA1CD83C9688BE94BEFCDF9833587F9621A9C0483ACA2C9DE21B6
99EA4DF3985B6E125E6F2B3089B35E7AE862541851726CDBC1692145CAFAF050
7C672E4BF46582462018C3294E3FFDF46BAFBDD6A55D322CE0CCC123CB62BA93
163A43753D2177BB20AC20C5D76171239C03A63D4D777FBC8E68EE28D7A650BB
CCFCC7214E2E078623E787450B61C5DA2401DE271718796DF04A2ECB43B7C40C
CD823E0A4B962C11655A94C205E159EE6FB17473555903351D5A59B1B874C262
E6D0F7D816910AE910CA414F84C38AE48E3AEAA89B6FBE197037EB7CE9B24008
B6A9155DBB2DE304B6C5211281D9EE4C1C0FADCEBBC4D8C30F3F1C46985D16DE
982E2A431E8E7414236F54A5D0E67E9D92202CD1704122DC74F4631B4AD60D0B
AE9B68FB649B126CB0CCBA30834ED7CBF8FBF6B7BF8D2716572A7242DA4F5BC7
78046DDA86AB03629B5212209926F715B07E6A40214939FBD18F7EA4C5874260
352E45BC30FD49CA8AFEC460D51375E800799DD856689AB68B61BF1AD2EA397B
30C728AB88838FB4E923F4BB609FCC11069B138BD1F8F489466FEAA74B7D35FB
ECB3CF9FFCC99F88F1D9294539C2BCD0DD24879F7FFEF92F7EF18B5FFAD29710
7493B3E3A32CB51C23481CEA861B6E902AF1B39FFD8CD991BA60A2C2E27BCB96
2D9389100A76364CC2F3D1471FC5128CB3FE4436EC8928B4F369FE9B8636CD9B
BFC0DB13D58A45CC424A0D092EC932ED5CE667842B51AE42DA3E2A1890E86EAA
EC4CE6CE2C684CC8525B410301315C344853DC9D6C2EC71B6E4B4227A5401E1E
7CED5ACBB5D0575EC6A5F000B051BD39E49043EEB9E71EBC2228B99081862D6E
AE0FFFE66FFEE67BDFFB9E4577A73C69B892445444BAF4A76EFBC0030FE83E9A
B221D10313CD5A895B8942F4393A1D690533E0B490564197F666D65A87A80F60
CBA18FD1CE092639FA4DC86EDA24013905864C950B3AAF81A9A9A7845DB7F4D5
11471C71F7DD775B88CB5A58877DCF2D038A0C3D03E0E404E131D7C2DA1393AC
F5A00DCC6AC58DABDAC48DD84C2272C061131076D82C9E97E57AB67987C29537
E1A743A1AD31578334CDABAEBACA2E236CC30A873E7A44859B2A5460A3A27E4A
DFEAFEE8DA53C6CFA6F30E35B3B6B52EB5C3C2C4E82989074916E62671283454
824C24768721040BE9932B68969C4BDD09E4DDE9DCC948B2F211931C9889166B
99EC1D6A6DD935DDFC8D96C88E61277940620B01156E8B3A82FF96D458440877
63EF6C1D3C0FD52E4ADC3DF5D453CC9385D3EA8BDF599D3A8408878A32B80297
6970C69DDB909ED869B43917641A1050C2F380EB19EE6F88D056BCC371B28C28
6B9360D7186A20D7301E8B4692FFE332645A98BB9600E02743DF6DA64D7FC8FB
248D0F130FEDC6B6D380097D35D34B2F75143D3B7B65950F5D26590A13076632
A58688602C4E57FAD29A6BD6FAAD183474201D4A52D9F4A6362B98A0B4196DFA
4436E637BEF10D2B60094B07B88638BFB99571911D7DF4D1B7DF7E3B7BAD15B0
8C207B03CE2DCE1F6430D9F40CC362C550154FDC75D75D3DD0799A4A3103B668
E8D97401A41A4F4756857D3125A834605466582146F19437373FAFB520E55487
5834B05A3BF6BBECB2CBD34F3F6DE5931CB6E9E204D6C72D0CC3E88640DE4BA8
FFD99FFDD9F7BFFF7D5224EEBCF3CEE38E3B0E6763B265BA8EDDD6188A959284
04930B7A1487B46466CD94EA2D1CD0028116C3832FE8E794CDDF76DB6D21F622
93B2E89AA1A82659FD799216CA311273DC53A9608D2E346BED9776102FAB9E28
7A139342968415795180E36B2E533B3850B895C54A15B8EBAEBB4C3998AC694D
270976DE7967D1A4A1B39952F87B2581A802DF4E5B8A79486950FE8E3BEEB87C
F972CBCD25484BF4851C65ADC95FFEE55FFEEBBFFE6B92E5B382862B45FE1FFF
F11F0D7E71CA88B145AD9A5BF61520CD44FCFDF0C30FBFF5D65B0DBC56B3C37B
894263A25D5CE2BEFBEEC349852F57DB07596E8E18EBC1DA3CED163100CE4FD8
032F0C0587896BD0479421911198E200A3E09826AE496A5656B264FA0B0F323D
14D3860958F1083A97994BB68BFCAFCF3FF9C94F7EEB5BDFA2AA08E33D09E0DD
31110C77080322AC17334C50E2D58C415ACCFEFBEF7FE38D376A41885B1247D1
442EBAE8A2B3CF3E3B977815A395B4162C5CF4EACA57932C8560BA88B11DD15C
D680D4D8229CD1D2D2F512419C77DE7916316EF35CBB2CC06ED978C6DDD80517
5460DA61836B5B16636ECB36E8D6F5C932E1A0049721B6221D4DD136BF996985
612AB0A90B935FE6C4B428B7419F1A30B286A44302882C54075BB1423F37A377
C86D59F2C3E7323D7FFDEB5F8BCD49A858F61E8A8E4EE9CF7FFE73EC0C53E4A7
9304499634850719C2B063A2DF6A90325FF6D8630F494DC3873031E3B6C4B470
81F26408B5A89956F5C287D01E20D56184C065DA58E8CE6A533BC2F1BB402133
C52B6C3667DB84872ACAB2395DE06B62F0A6FA308BB3CE3AEB8A2BAEE02CBB54
65C1BCB3160E86D2413E61086B1107C0B4EC82399DD0678D8DA0A94CB6954302
0825C1B9E79EABD344F759AB018CB356E4935FA6DD1F78E081F7DE7B2F0CC1FC
AEE47184D11A97B94F5D60EFA2E8D80EB6B22E6696BC870F56C78D0825E771CA
2C52C25193FB0AE87FE21637DD7493D891A1526AB466315876A5FE3740401758
481603DF2C0C4C93B2E5A0CC9AB8539C755FB2A0B1E91766E9A00F92BAA063FC
ED6F7F1B1FBDC1CE40D304A8094D73961868188F9A7287C23A17B38E295A21EB
C37E0EC00BAA07A7EB3BDFF98E44221E0397C61EC82B95EA2DB92AFE08767933
EB10124D95943D99E384046D53D0E7CB962DDB7DF7DD7FF8C31F5A5CDA650973
9C2B3E34BF21EA550A9AE44CF365D1E002D234A5358B539348673942E49813CD
16499D76DA69A27B6E9ECFFA50B65E0756A50BC0F4BFF4A52F49D481A1661265
26CC4B97C4A9F15715BF4B5501EF82488FEBC0A0CF2E154D964A13690FDEE55A
6B94BABB2B6956866779D5CDED01421916266E3300F2B2AC343F3CCC61401E7E
71FDF5D77FF4A31FB5DA639CF89FFDEC673535A4BE79BD30CE344EC224A6CD84
3AAF9D1F58800136989F21348527AF731B4559AC4B1ACCCD37DF6CE5DC3CC8C4
A1019DB6FDD03EB78059087FE432C42DC97283BBC1F960092424D102516918AE
2EC8DF430E61107367626CD2A82EBEF862837DB69476F35458E6C557BEF21591
22868E853A43991AD627DBA9674F2542C4856501A053E3D3237FC1CC41835520
4F019662AD112CCE84E7A4CD7408D5A33061814498E9504F184078D2A3ACAE82
93AB6FB1CB2DA9019AC7E5687E3C5D23A5E497BFFCA5A9C5E61A32F07033CD0D
3AD36209966833B3266485AE98957CC59A7FE0031FF8D18F7EA4C98A06C2CE4E
9105BEF89958183611933104349304F6488BFC98DE6A1510886E780D1E67C667
AA93732E995E6B9E6186AC7EF8AAA42FB3245C801CC9DAE1D1D2D8B4435658B8
78F1E277BFFBDD0F3DF410A96F22741D0CAB1D7D3D9200A5187B9948A395046B
9A7A283A26EA33B536064FE432E96D6871BAD509279C20814FF194AEC15760D5
1F24C3B8ACBDA295CB5AFF3C3D82F418D3435DA0ADBC7E4960F91E06238CAB6D
BA7D71715A612773A1AFCFFBB8D29A863E6F7F8C80EA1E7610F427A7D6E8ECE9
91402BA44A43AB311191E359ACA7CB605CCD2B6DAA89F9FAC9AD9A4C21162FC1
A205F482BB99FA12A73D114911D6055A34DAFB916CFEF9CF7F5EE6B618DF76DB
6D474404394DB703B2AAD0B819F9CC35D2D34902DD5CB6C89D77DEA9F7867B11
1E8130F0DBC637DB2441DB7BAC4CAAD2CCBF6C6825F82E0E3DF4D09FFCE4277A
EEB6DB6E2BBD72C99225BA52EB60C0FAFA5F3A81F83E49105A2B8A7EC4C5B432
CF3EFB2CB995B063CE026409799B41603D50A349999D2E000733C30293C20A42
51EC50080CC03997356DC620E39461DACA923EFDF4D34D677253C587210010E0
2D03C73CCF33788DCC82B1ADC44DC71ADA95585A6D9D2D3850F8F476D965172D
A025D7A22293127AFEF9E75F7DF5D5F8792EBBECB2934E3AA9EDB9B656D36966
E4861E74D041FFFEEFFF7EC00107DC7EFBEDD2D19F7CF2499C1F483E4A5EF6DE
7BEFC71F7F9CE882BFBFA9F9C8C9FDF7DF5F9632064B9BA7350CBE859681C903
DE9371C4218C82BA06975985FA5C17D0B2B58DE74E595E1BBE4C77081D8B50AA
B5887341A20E0100B4722BCD40C124971C0C51ACF5B620E1CCC200876023EB5C
1A05B02DB82664B27DF9CB5FD6D32500C23C2833757959E5A41810C810C479B4
5640194B5AE80E9AC21D77DC71D4514711B124F615F69C226B9613A8A7608A4D
7EDC949220F4595174261ABAFBEEBB433A9E41128803EDF5CE778AB887366D9A
3D67CEB1C71E7BCD35D768FDC84615057574F82E72DA312F9E9389DE49B95495
6E785CC2188E6F7E644816598EFB02B39A434B2E3F7CC138A0D988B8B3659649
E7B2FA41F38798670C7A461E4B824A0C58F5BF9DBDD0203010371E2DD679F0C1
07EBFD75D75D4782F574A4329D24D0DD76DA69A7E79E7B0EEF28E29F686A2815
A6930461DE811D1974A328CB033CE6986324D276DC71479D766B88C49586D669
2E29944D485A5C4993020391DD31E35E5F69D6C0459893CA160AD2856B5B0C1C
B3156086D0C916EAE976071B24FC34CEF0B5B4831AF333CF3CC3D4306BD85F70
1BB9DE5896CB5245AC4B55123409D79FE295E283747932AE126DD977BA6D1F27
5FA3478878407805B443040F03D4E7AFBCF28AA189E0784715666510D8065B8B
7DAF37565E10A790763AFB38E1B1F2C9D89E814F86364158C3648D57AD409A5A
D4CD3681CB72F5B0C524AFB4DC966C60AE67D8442809428EECD222495B5612DB
91E758BEDCDC5CCFA8CCA17FC95CE4D3CD30F420B94042A217E01E41B762C0A8
0C2C3DC93F2ECBE7C364B606069624176D9986E1A6816933498084B7C13342DC
7F2E08EB9983488472C515577CFCE31FA784D820D25CE096653044C9F4A755AE
87ED32E20C23D7B20C4965B3601A5E38D4E19939949D43FC3F21160241177CBB
333493E9EEED19D5614BDB3497328C33AF48D66A7DA97AE2B2428189A86316A7
49703636A6586193041A1B455B61A14D92A672E27360D8A6A1DB657BEEB9E763
8F3D86AE475E998422A4680DCE5852CC32DDF0D39FFEB46C321C6B345ED6B760
FE80C681A981DD00403A1B1176F4DC2A49E0B2E44E3325CD533AD97FE2B6F4A5
98E40E9982F985C3FC3ADD590625FDD1E02C96B68B3BC8E2FC486E2C7B9C0100
ECA0BD61129116C5A9B183893D4AEA2455265A9370893889611981AD89CB127F
0D08811500B8DB8A284506C71D77DCCD37DF6CF33DF7DC7365B5582C138D5B3B
2845049002B386C3B0B965B820FEAD4785E508FC5E9F44B895BCC75E9F2CCC78
AF45D39A1BFBB6E41FF3E6137C25D8AEB9882D1027472921E72DEC7C80BBCFE0
5127BFD81D03F542EB3587B946ABC5B4B5DD4212184E4538BD5CD081CB60DAC2
B06DB8C449D047093A231601C76734C8220EAA2589C7197045DB3DA7DC09F399
429A2EF329B73288472B3CA1ECDB7A0FE0C2C30C3739A915D1F5D6F54267203C
69C6C7A75B6E08C848D9C66F19811C06B012A13CFD2FE2336C06BB15B6308CE9
A28B2EFAE217BFA8F75A798B3E19FC8E464B1534E104C3A581C1A1E859FF0A5D
637EB9192481CB74492BFE94427DCA29A78833BAA08E74DA7D7149B1A3E3D24B
2FA50389EEBBCDDCB96B5346D393B57082174FC8308DBCBB7B3CB514BDD65F6F
589BCC36491F0575186DC53EE889D61C8684167350B4D59C4BF7111F3498687D
250E72FAE9A71B0B08F3A4C56E241B2EBEF86297A551324D7D280A09FB595A5A
9DCB42085B2509809720C61812038A7928DE5C80EB6507818987DE8CB60DC279
7DE79D777EE8431F7219F0910B3AEBB6E1AE47299A77D851E3CD6F7EF3934F3E
892B06DB5A275AEB6029CB1C25D48E0B2EB8E0C61B6F94BED586AAD6D6259133
65069C9D2033B9C25C1D7DC81CF52CD95EA79D761AA769E79D77D6AD34363B1D
A273A494C10AB954FFB06413B342F0139AF267FA789C01B44D6BFB06C2C0E8D0
A2110C7EE1C2855A64F1D9C58B179F73CE39DFF9CE777EF5AB5F210F7478F544
094BD3F970FC5A313F1C4CCC417A3A6BAEF7D64C4616CCFDF7DF4FAE4A9B2E3F
E520F10A80D5614718C16F3583869BC90FFF7F1A8323CA70A77C930000000049
454E44AE426082}
Transparent = True
end
object v: TLabel
Left = 16
Top = 8
Width = 236
Height = 48
Caption = 'SpaceMission'
Font.Charset = ANSI_CHARSET
Font.Color = clLime
Font.Height = 48
Font.Name = 'Arial Unicode MS'
Font.Style = [fsBold]
ParentFont = False
end
object Label1: TLabel
Left = 88
Top = 54
Width = 130
Height = 26
Caption = 'Level-Editor'
Font.Charset = ANSI_CHARSET
Font.Color = clAqua
Font.Height = -22
Font.Name = 'Arial Rounded MT Bold'
Font.Style = []
ParentFont = False
end
end
/LevOptions.dfm
1,10 → 1,11
object LevelForm: TLevelForm
Left = 195
Top = 103
BorderStyle = bsDialog
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Leveleigenschaften'
ClientHeight = 251
ClientWidth = 384
ClientHeight = 252
ClientWidth = 388
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
11,9 → 12,11
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object ElPopupButton1: TButton
Left = 280
49,20 → 52,6
Height = 13
Caption = 'Gr'#246#223'e des Spielfeldes:'
end
object Label2: TLabel
Left = 16
Top = 136
Width = 124
Height = 13
Caption = 'Interner Name des Levels:'
end
object Label3: TLabel
Left = 16
Top = 168
Width = 57
Height = 13
Caption = 'Level-Autor:'
end
object Panel1: TPanel
Left = 16
Top = 56
69,7 → 58,6
Width = 329
Height = 57
Color = clInfoBk
ParentBackground = False
TabOrder = 0
object ElLabel1: TLabel
Left = 8
87,45 → 75,40
object ElLabel2: TLabel
Left = 80
Top = 10
Width = 228
Width = 225
Height = 39
Caption =
'Die Spielfeldgr'#246#223'e wird nur von dem Leveleditor '#13#10'ben'#246'tigt. Das ' +
#196'ndern dieser Gr'#246#223'e wirkt sich '#13#10'nicht auf die Gr'#246#223'e der Levels ' +
'aus.'
Color = clInfoBk
'Die Spielfeldgr'#246#223'e wird nur von dem Leveleditor'#13#10'ben'#246'tigt. Das '#228 +
'ndern dieser Gr'#246#223'e wirkt sich'#13#10'nicht auf die Gr'#246#223'e der Levels au' +
's.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentColor = False
ParentFont = False
end
end
object Groesse: TSpinEdit
object GroesseEdt: TEdit
Left = 144
Top = 28
Width = 121
Height = 22
MaxValue = 65000
MinValue = 100
Width = 185
Height = 21
MaxLength = 4
TabOrder = 1
Value = 1200
Text = '1200'
OnChange = GroesseEdtChange
OnKeyPress = GroesseEdtKeyPress
end
object LevName: TEdit
Left = 167
Top = 133
Width = 178
Height = 21
object Groesse: TUpDown
Left = 328
Top = 30
Width = 17
Height = 19
Max = 9999
Position = 1
TabOrder = 2
OnClick = GroesseClick
end
object LevAuthor: TEdit
Left = 167
Top = 160
Width = 178
Height = 21
TabOrder = 3
end
end
end
/LevInfo.dfm
0,0 → 1,126
object InfoForm: TInfoForm
Left = 289
Top = 184
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Informationen'
ClientHeight = 193
ClientWidth = 321
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnCreate = FormCreate
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object HomeLbl: TLabel
Left = 32
Top = 136
Width = 48
Height = 13
Caption = 'Webseite:'
end
object Image: TImage
Left = 8
Top = 8
Width = 65
Height = 57
Center = True
Stretch = True
end
object FirmaLbl: TLabel
Left = 88
Top = 8
Width = 31
Height = 13
Caption = 'Firma'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsBold]
ParentFont = False
end
object NameLbl: TLabel
Left = 104
Top = 24
Width = 28
Height = 13
Caption = 'Name'
end
object VersionLbl: TLabel
Left = 232
Top = 24
Width = 35
Height = 13
Caption = 'Version'
end
object EMailLbl: TLabel
Left = 32
Top = 120
Width = 32
Height = 13
Caption = 'E-Mail:'
end
object CopyrightLbl: TLabel
Left = 8
Top = 80
Width = 44
Height = 13
Caption = 'Copyright'
end
object Copyright2Lbl: TLabel
Left = 8
Top = 96
Width = 117
Height = 13
Caption = 'Alle Rechte vorbehalten!'
end
object URL2: TLabel
Left = 152
Top = 136
Width = 117
Height = 13
Cursor = crHandPoint
Caption = 'www.daniel-marschall.de'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
Transparent = True
OnClick = URL2Click
end
object URL1: TLabel
Left = 152
Top = 120
Width = 118
Height = 13
Cursor = crHandPoint
Caption = 'info@daniel-marschall.de'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
Transparent = True
OnClick = URL1Click
end
object ElPopupButton1: TButton
Left = 208
Top = 160
Width = 107
Height = 25
Caption = 'OK'
TabOrder = 0
OnClick = ElPopupButton1Click
end
end
/Compiler.cfg
0,0 → 1,38
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J+
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"D:\Eigene Dateien\Borland Studio-Projekte\Bpl"
-LN"D:\Eigene Dateien\Borland Studio-Projekte\Bpl"
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
/Unit1.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevMain.pas
5,8 → 5,7
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem,
Dialogs, StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws,
DXSounds, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes,
WinAPI.DirectDraw{$ENDIF}, DirectX, ComLevelReader, Global, IOUtils;
DXSounds, Spin, ComCtrls, PjVersionInfo;
 
type
TMainForm = class(TDXForm)
14,9 → 13,11
Spiel: TMenuItem;
Beenden: TMenuItem;
Hilfe: TMenuItem;
Mitarbeiter: TMenuItem;
Leer1: TMenuItem;
Level: TMenuItem;
Informationen: TMenuItem;
Leer2: TMenuItem;
Enemy1: TRadioButton;
Enemy2: TRadioButton;
Enemy3: TRadioButton;
42,20 → 43,12
SLabel4a: TLabel;
SLabel4b: TLabel;
LivesLabel: TLabel;
Quelltext1: TMenuItem;
StatusBar: TStatusBar;
N1: TMenuItem;
Spielfelderweitern1: TMenuItem;
SidePanel: TPanel;
LivesEdit: TSpinEdit;
AlleLeveldateienaktualisieren1: TMenuItem;
N2: TMenuItem;
Leveltesten1: TMenuItem;
Hilfe1: TMenuItem;
N3: TMenuItem;
AufUpdatesprfen1: TMenuItem;
N4: TMenuItem;
WasgibtesNeues1: TMenuItem;
Enemy8: TRadioButton;
LivesEdt: TEdit;
Lives: TUpDown;
procedure DXDrawFinalize(Sender: TObject);
procedure DXDrawInitialize(Sender: TObject);
procedure FormCreate(Sender: TObject);
62,6 → 55,7
procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
procedure BeendenClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MitarbeiterClick(Sender: TObject);
procedure LevelClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure InformationenClick(Sender: TObject);
69,40 → 63,40
procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure EnemyClick(Sender: TObject);
procedure EnemyAdd(x, y, art, lives: integer);
procedure NeuClick(Sender: TObject);
procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Quelltext1Click(Sender: TObject);
procedure Spielfelderweitern1Click(Sender: TObject);
procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
procedure AlleLeveldateienaktualisieren1Click(Sender: TObject);
procedure Leveltesten1Click(Sender: TObject);
procedure HilfeTopicClick(Sender: TObject);
procedure AufUpdatesprfen1Click(Sender: TObject);
private
function GetTestlevelFilename: string;
procedure LivesClick(Sender: TObject; Button: TUDBtnType);
procedure LivesEdtKeyPress(Sender: TObject; var Key: Char);
procedure LivesEdtChange(Sender: TObject);
public
{ VCL-Ersatz }
spriteengine: tdxspriteengine;
versioninfo: tpjversioninfo;
dxtimer: tdxtimer;
imagelist: tdximagelist;
dxdraw: tdxdraw;
{ Variablen }
FDirectory: string;
FEngineVersion: string;
FMenuItem: integer;
LevData: TLevelData;
Enemys: TStrings;
ArtChecked: integer;
LiveEdit: integer;
ScrollP: integer;
AltScrollPos: integer;
Boss: boolean;
LevChanged: boolean;
NumEnemys: integer;
function SelectedEnemyType: TEnemyType;
{ Grafik-Routinen }
function GetSpriteGraphic(Sprite: TSpaceMissionGraphicSprite): TPictureCollectionItem;
{ Level-Routinen }
procedure EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer);
procedure EnemyCreate(x, y: integer);
procedure DestroyLevel;
procedure RefreshFromLevData;
procedure AnzeigeAct;
{ Initialisiations-Routinen }
procedure DXInit;
110,99 → 104,107
{ Farb-Routinen }
function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
{ Sonstiges }
procedure LivesChange(newval: integer);
end;
 
var
MainForm: TMainForm;
 
const
FCompVersion = '1.0';
 
implementation
 
uses
LevSplash, LevSpeicherung, ComInfo, LevOptions, ShellAPI, ComHilfe;
LevSplash, LevSpeicherung, LevText, LevInfo, LevSource, LevOptions;
 
const
FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
status_info = ' Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
status_lives = ' Leben: ';
status_nolives = ' Einheit hat keine Lebensangabe';
RasterW = 48;
RasterH = 32;
 
{$R *.DFM}
 
resourcestring
status_info = 'Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
{$R WindowsXP.res}
 
type
TBackground = class(TBackgroundSprite)
strict protected
protected
procedure DoMove(MoveCount: Integer); override;
end;
 
TEnemyOrItem = class(TImageSprite)
strict private
FLives: integer;
FEnemyType: TEnemyType;
FXCor: integer;
FCorInit: boolean;
strict protected
TEnemy = class(TImageSprite)
private
Lives: integer;
Art: integer;
XCor: integer;
CorInit: boolean;
protected
procedure DoMove(MoveCount: Integer); override;
public
constructor Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer); reintroduce;
constructor Create(AParent: TSprite); override;
end;
 
{ TBackground }
 
procedure TBackground.DoMove(MoveCount: Integer);
procedure TMainForm.DXInit;
begin
X := -(MainForm.ScrollP * LevEditRasterW);
Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
DXDraw.Initialize;
end;
 
{ TEnemy }
 
procedure TEnemyOrItem.DoMove(MoveCount: Integer);
procedure TEnemy.DoMove(MoveCount: Integer);
begin
if not FCorInit then
if not CorInit then
begin
FXCor := trunc(x) + (MainForm.ScrollP * LevEditRasterW);
FCorInit := true;
XCor := trunc(x) + (MainForm.ScrollP * RasterW);
CorInit := true;
end;
if MainForm.LevData.IndexOfEnemy(FXCor, integer(round(Y)), FEnemyType, FLives) = -1 then dead;
X := FXCor - (MainForm.ScrollP * LevEditRasterW);
if MainForm.Enemys.IndexOf(floattostr(XCor)+'-'+floattostr(y)+':'+
inttostr(Art)+'('+inttostr(Lives)+')') = -1 then dead;
X := XCor - (MainForm.ScrollP * RasterW);
end;
 
constructor TEnemyOrItem.Create(AParent: TSprite; AEnemyType: TEnemyType; ALives: Integer);
procedure TBackground.DoMove(MoveCount: Integer);
begin
X := -(MainForm.ScrollP * RasterW);
end;
 
constructor TEnemy.Create(AParent: TSprite);
begin
inherited Create(AParent);
if AEnemyType = etEnemyAttacker then Image := MainForm.GetSpriteGraphic(smgEnemyAttacker);
if AEnemyType = etEnemyAttacker2 then Image := MainForm.GetSpriteGraphic(smgEnemyAttacker2);
if AEnemyType = etEnemyAttacker3 then Image := MainForm.GetSpriteGraphic(smgEnemyAttacker3);
if AEnemyType = etEnemyMeteor then Image := MainForm.GetSpriteGraphic(smgEnemyMeteor);
if AEnemyType = etEnemyUFO then Image := MainForm.GetSpriteGraphic(smgEnemyDisk);
if AEnemyType = etEnemyUFO2 then Image := MainForm.GetSpriteGraphic(smgEnemyDisk2);
if AEnemyType = etEnemyBoss then Image := MainForm.GetSpriteGraphic(smgEnemyBoss);
if AEnemyType = etItemMedikit then Image := MainForm.GetSpriteGraphic(smgItemMedikit);
 
if not EnemyTypeHasLives(AEnemyType) then
FLives := 0
else
FLives := ALives;
FEnemyType := AEnemyType;
if MainForm.ArtChecked = 1 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
if MainForm.ArtChecked = 2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
if MainForm.ArtChecked = 3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
if MainForm.ArtChecked = 4 then Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
if MainForm.ArtChecked = 5 then Image := MainForm.ImageList.Items.Find('Enemy-Disk');
if MainForm.ArtChecked = 6 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2');
if MainForm.ArtChecked = 7 then Image := MainForm.ImageList.Items.Find('Enemy-Boss');
if MainForm.ArtChecked = 4 then Lives := 0 else Lives := MainForm.LiveEdit;
Art := MainForm.ArtChecked;
Width := Image.Width;
Height := Image.Height;
PixelCheck := True;
end;
 
{ TMainForm }
 
procedure TMainForm.DXInit;
begin
Imagelist.Items.LoadFromFile(OwnDirectory+DxgFile);
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable;
DXDraw.DefColorTable := ImageList.Items.ColorTable;
DXDraw.UpdatePalette;
DXDraw.Initialize;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
resourcestring
SFileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
SCaption = 'SpaceMission %s - Level-Editor';
var
Ergebnis: string;
daten: textfile;
i: integer;
punkt: integer;
ok: boolean;
begin
{ VCL-Ersatz start }
 
versioninfo := tpjversioninfo.create(self);
 
dxtimer := tdxtimer.create(self);
dxtimer.Interval := 100;
dxtimer.ActiveOnly := false;
213,12 → 215,11
dxdraw.Parent := self;
dxdraw.Left := 0;
dxdraw.Top := 0;
dxdraw.Width := SidePanel.Left;
dxdraw.Height := ScrollBar.Top;
dxdraw.Width := 640;
dxdraw.Height := 480;
dxdraw.AutoInitialize := False;
dxdraw.AutoSize := False;
dxdraw.Color := clBlack;
(*
dxdraw.Display.BitCount := 24;
dxdraw.Display.FixedBitCount := False;
dxdraw.Display.FixedRatio := False;
225,8 → 226,7
dxdraw.Display.FixedSize := False;
dxdraw.Display.Height := 600;
dxdraw.Display.Width := 800;
*)
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, doRetainedMode, doHardware, doSelectDriver];
dxdraw.OnFinalize := DXDrawFinalize;
dxdraw.OnInitialize := DXDrawInitialize;
dxdraw.ParentShowHint := False;
243,54 → 243,57
 
{ VCL-Ersatz ende }
 
StatusBar.SimpleText := ' ' + status_info;
 
LivesEdit.MinValue := 1;
LivesEdit.MaxValue := MaxPossibleEnemyLives;
LivesEdit.Value := 1;
 
Enemy1.Checked := true;
EnemyClick(Enemy1);
ArtChecked := 1;
LiveEdit := 1;
// Leeres Level am Anfang braucht keine Beenden-Bestätigung.
// LevChanged := true;
 
//Application.Title := Format(SCaption, [ProgramVersion]);
Caption := Format(SCaption, [ProgramVersion]);
punkt := 0;
FDirectory := extractfilepath(paramstr(0));
versioninfo.filename := paramstr(0);
for i := 1 to length(versioninfo.ProductVersion) do
begin
if copy(versioninfo.ProductVersion, i, 1) = '.' then inc(punkt);
if punkt < 2 then fengineversion :=
fengineversion+copy(versioninfo.ProductVersion, i, 1);
end;
//Application.Title := 'SpaceMission '+FEngineVersion+' - Leveleditor';
Caption := 'SpaceMission '+FEngineVersion+' - Leveleditor';
DXInit;
LevData := TLevelData.create;
ProgramInit;
DestroyLevel;
if (paramcount > 0) and (fileexists(paramstr(1))) and (ExtractFileExt(paramstr(1)).ToLower = '.lev') then
if (paramcount > 0) and (fileexists(paramstr(1))) then
begin
try
LevData.RasterErzwingen := true;
LevData.LoadFromFile(paramstr(1));
except
on E: Exception do
begin
showmessage(SFileError + ' ' +E.Message);
DestroyLevel;
end;
AssignFile(daten, paramstr(1));
Reset(daten);
ok := true;
ReadLN(daten, Ergebnis);
if Ergebnis <> '; SpaceMission '+FCompVersion then ok := false;
ReadLN(daten, Ergebnis);
if ergebnis <> '; LEV-File' then ok := false;
if not ok then
begin
showmessage(FileError);
CloseFile(daten);
ProgramInit;
exit;
end;
RefreshFromLevData;
LevChanged := false;
AnzeigeAct;
{ Laden }
CloseFile(daten);
exit;
end;
if fileexists(fdirectory+'Bilder\Auswahl.bmp') then
Image1.Picture.LoadFromFile(fdirectory+'Bilder\Auswahl.bmp');
{else
SelPanel.visible := false;}
ProgramInit;
end;
 
procedure TMainForm.FormDestroy(Sender: TObject);
var
tmp: string;
begin
FreeAndNil(dxdraw);
FreeAndNil(LevData);
//FreeAndNil(spriteengine);
FreeAndNil(dxtimer);
FreeAndNil(imagelist);
tmp := GetTestlevelFilename;
 
// SpaceMission.exe only loads a file once, so we can delete any test level
if FileExists(tmp) then DeleteFile(GetTestlevelFilename);
Enemys.Free;
//spriteengine.Free;
versioninfo.free;
dxtimer.Free;
imagelist.Free;
dxdraw.free;
end;
 
procedure TMainForm.BeendenClick(Sender: TObject);
300,12 → 303,12
 
procedure TMainForm.DXDrawInitialize(Sender: TObject);
begin
if Assigned(DXTimer) then DXTimer.Enabled := True;
DXTimer.Enabled := True;
end;
 
procedure TMainForm.DXDrawFinalize(Sender: TObject);
begin
if Assigned(DXTimer) then DXTimer.Enabled := False;
DXTimer.Enabled := False;
end;
 
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
373,12 → 376,13
{var
i, j: Integer;}
begin
Enemys := TStringList.create;
sleep(500);
//PlayerSprite
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgStar3);
Image := mainform.ImageList.Items.Find('Star3');
Z := -13;
Y := 40;
Tile := True;
386,7 → 390,7
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgStar2);
Image := mainform.ImageList.Items.Find('Star2');
Z := -12;
Y := 30;
Tile := True;
394,7 → 398,7
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgStar1);
Image := mainform.ImageList.Items.Find('Star1');
Z := -11;
Y := 10;
Tile := True;
402,7 → 406,7
with TBackground.Create(SpriteEngine.Engine) do
begin
SetMapSize(1, 1);
Image := MainForm.GetSpriteGraphic(smgMatrix);
Image := mainform.ImageList.Items.Find('Matrix');
Z := -10;
Tile := True;
end;
458,23 → 462,18
mainform.Visible := true;
end;
 
procedure TMainForm.RefreshFromLevData;
var
i: integer;
procedure TMainForm.MitarbeiterClick(Sender: TObject);
begin
MainForm.ScrollBar.Max := MainForm.LevData.LevelEditorLength;
for i := 0 to MainForm.LevData.CountEnemies - 1 do
if not fileexists(mainform.fdirectory+'Texte\Mitwirkende.txt') then
begin
MainForm.EnemyCreateSprite(
MainForm.LevData.EnemyAdventTable[i].x,
MainForm.LevData.EnemyAdventTable[i].y,
MainForm.LevData.EnemyAdventTable[i].enemyType,
MainForm.LevData.EnemyAdventTable[i].lifes
);
MessageDLG('Die Datei "Texte\Mitwirkende.txt" ist nicht mehr vorhanden. Die Aktion wird abgebrochen!',
mtWarning, [mbOK], 0);
end
else
begin
TextForm.memo1.lines.loadfromfile(mainform.FDirectory+'Texte\Mitwirkende.txt');
TextForm.showmodal;
end;
MainForm.NumEnemys := MainForm.LevData.CountEnemies;
MainForm.Boss := MainForm.LevData.HasBoss;
AnzeigeAct;
end;
 
procedure TMainForm.LevelClick(Sender: TObject);
482,82 → 481,18
speicherungform.showmodal;
end;
 
procedure TMainForm.Leveltesten1Click(Sender: TObject);
var
sav: TSaveData;
tmp: string;
begin
KillTask(SpaceMissionExe);
 
sav := TSaveData.Create;
try
sav.Score := 0;
sav.Life := 6;
if Assigned(SpeicherungForm) then
sav.Level := SpeicherungForm.LevelNumber.Value
else
sav.Level := 1;
sav.GameMode := gmLevels;
sav.LevelData := TlevelData.Create;
sav.LevelData.Assign(LevData);
tmp := GetTestlevelFilename;
sav.SaveToFile(tmp);
ShellExecute(Handle, 'open', PChar(OwnDirectory+SpaceMissionExe), PChar('"'+tmp+'"'), PChar(OwnDirectory), SW_NORMAL); // do not localize
finally
FreeAndNil(sav);
end;
end;
 
procedure TMainForm.FormShow(Sender: TObject);
begin
if Assigned(SplashForm) then
begin
SplashForm.Hide;
FreeAndNil(SplashForm);
end;
SplashForm.Hide;
SplashForm.Free;
 
dxtimer.Enabled := true;
dxtimer.ActiveOnly := true;
end;
 
function TMainForm.GetSpriteGraphic(
Sprite: TSpaceMissionGraphicSprite): TPictureCollectionItem;
begin
if (Sprite<>smgNone) and (imagelist.Items.Count >= Ord(Sprite)) then
result := imagelist.Items.Items[Ord(Sprite)-1]
else
result := nil;
end;
 
function TMainForm.GetTestlevelFilename: string;
begin
result := IncludeTrailingPathDelimiter(TPath.GetTempPath) + 'SpaceMissionTest.sav'; // do not localize
end;
 
procedure TMainForm.HilfeTopicClick(Sender: TObject);
// Please keep this code in-sync with GamMain.pas
var
bakTimerEnabled: boolean;
begin
bakTimerEnabled := dxtimer.Enabled;
try
dxtimer.Enabled := false;
HilfeForm.Caption := TMenuItem(Sender).Caption;
HilfeForm.Caption := StringReplace(HilfeForm.Caption, '&&', #1, [rfReplaceAll]);
HilfeForm.Caption := StringReplace(HilfeForm.Caption, '&', '', [rfReplaceAll]);
HilfeForm.Caption := StringReplace(HilfeForm.Caption, #1, '&', [rfReplaceAll]);
HilfeForm.ShowMarkDownHelp(OwnDirectory+TMenuItem(Sender).Hint);
HilfeForm.ShowModal;
finally
dxtimer.Enabled := bakTimerEnabled;
end;
end;
 
procedure TMainForm.InformationenClick(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
InfoForm.showmodal;
mainform.dxtimer.enabled := true;
end;
 
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
569,33 → 504,31
procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i: TEnemyType;
j, k, l, ex, ey: integer;
i, j, k, l, ex, ey: integer;
ok, breaked: boolean;
begin
ex := trunc(x/LevEditRasterW) * LevEditRasterW;
ey := trunc(y/LevEditRasterH) * LevEditRasterH;
EnemyCreateSprite(ex, ey, SelectedEnemyType, LivesEdit.Value);
ex := trunc(x/RasterW) * RasterW;
ey := trunc(y/RasterH) * RasterH;
EnemyCreate(ex, ey);
breaked := false;
{ Setzen }
if Button = mbLeft then
begin
ok := true;
if (SelectedEnemyType = etEnemyBoss) and boss then
ok := false // boss already exists
if (ArtChecked = 7) and boss then ok := false
else
begin
for i := Low(TEnemyType) to High(TEnemyType) do
for i := 1 to 7 do
begin
for j := 0 to MaxPossibleEnemyLives do
for j := 0 to 999 do
begin
if boss then
begin
for k := 0 to BossWidth-1 do
for k := 0 to 3 do
begin
for l := 0 to BossHeight-2 do
for l := 0 to 1 do
begin
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * LevEditRasterW), ey - (LevEditRasterH * l), etEnemyBoss, j) <> -1 then
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':7('+inttostr(j)+')') <> -1 then
begin
ok := false;
break;
605,7 → 538,8
end;
if not ok then break;
end;
if LevData.IndexOfEnemy(ex + (ScrollP * LevEditRasterW), ey, i, j) <> -1 then
if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
ok := false;
break;
616,12 → 550,14
end;
if ok then
begin
if EnemyTypeHasLives(SelectedEnemyType) then
LevData.AddEnemy(ex + (ScrollP * LevEditRasterW), ey, SelectedEnemyType, LivesEdit.Value)
if ArtChecked <> 4 then
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(ArtChecked)+'('+inttostr(LiveEdit)+')')
else
LevData.AddEnemy(ex + (ScrollP * LevEditRasterW), ey, SelectedEnemyType, 0);
Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(ArtChecked)+'(0)');
inc(NumEnemys);
if SelectedEnemyType = etEnemyBoss then boss := true;
if ArtChecked = 7 then boss := true;
end
else beep;
end
628,19 → 564,19
{ Löschen }
else if Button = mbRight then
begin
for i := Low(TEnemyType) to High(TEnemyType) do
for i := 1 to 7 do
begin
for j := 0 to MaxPossibleEnemyLives do
for j := 0 to 999 do
begin
if boss and (i = etEnemyBoss) then
if boss and (i = 7) then
begin
for k := 0 to BossWidth - 1 do
for k := 0 to 3 do
begin
for l := 0 to BossHeight - 1 do
for l := 0 to 1 do
begin
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * LevEditRasterW), ey - (LevEditRasterH * l), i, j) <> -1 then
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
LevData.DeleteEnemy(ex + ((ScrollP - k) * LevEditRasterW), ey - (LevEditRasterH * l), i, j);
Enemys.Delete(Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')'));
Boss := false;
dec(NumEnemys);
breaked := true;
650,10 → 586,12
if breaked then break;
end;
end;
if LevData.IndexOfEnemy(ex + (ScrollP * LevEditRasterW), ey, i, j) <> -1 then
if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
LevData.DeleteEnemy(ex + (ScrollP * LevEditRasterW), ey, i, j);
if i = etEnemyBoss then Boss := false;
Enemys.Delete(Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+
':'+inttostr(i)+'('+inttostr(j)+')'));
if i = 7 then Boss := false;
dec(NumEnemys);
breaked := true;
break;
667,20 → 605,26
end;
 
procedure TMainForm.EnemyClick(Sender: TObject);
var
et: TEnemyType;
begin
et := SelectedEnemyType;
Image1.Left := -(87 * (Ord(et) - 1)) + 1;
LivesEdit.Enabled := EnemyTypeHasLives(et);
LivesLabel.Enabled := EnemyTypeHasLives(et);
if sender = Enemy1 then ArtChecked := 1;
if sender = Enemy2 then ArtChecked := 2;
if sender = Enemy3 then ArtChecked := 3;
if sender = Enemy4 then ArtChecked := 4;
if sender = Enemy5 then ArtChecked := 5;
if sender = Enemy6 then ArtChecked := 6;
if sender = Enemy7 then ArtChecked := 7;
Image1.Left := -(87 * (ArtChecked - 1)) + 1;
Lives.Enabled := sender <> Enemy4;
LivesLabel.Enabled := sender <> Enemy4;
if sender = Enemy4 then LivesEdt.Font.Color := clBtnShadow // andere farbe?
else LivesEdt.Font.Color := clWindowText;
end;
 
procedure TMainForm.EnemyCreateSprite(x, y: integer; AEnemyType: TEnemyType; ALives: integer);
procedure TMainForm.EnemyCreate(x, y: integer);
var
Enemy: TSprite;
begin
Enemy := TEnemyOrItem.Create(SpriteEngine.Engine, AEnemyType, ALives);
Enemy := TEnemy.Create(SpriteEngine.Engine);
Enemy.x := x;
Enemy.y := y;
end;
687,107 → 631,76
 
procedure TMainForm.DestroyLevel;
begin
ScrollBar.Position := 0; // this doesn't call ScrollBarScroll()
ScrollP := 0;
LevData.Clear;
ScrollBar.Max := LevData.LevelEditorLength;
ScrollBar.Position := 0;
Enemys.Clear;
NumEnemys := 0;
Boss := false;
LevChanged := true;
LivesEdit.Value := 1;
Lives.Position := 1;
LivesChange(Lives.Position);
Enemy1.Checked := true;
EnemyClick(Enemy1);
AnzeigeAct;
end;
 
procedure TMainForm.AlleLeveldateienaktualisieren1Click(Sender: TObject);
var
i: integer;
begin
// Just for internal/development purposes
for i := 1 to MaxPossibleLevels do
begin
if FileExists('Levels\Level '+IntToStr(i)+'.lev') then
begin
LevData.RasterErzwingen := true;
LevData.LoadFromFile('Levels\Level '+IntToStr(i)+'.lev');
LevData.SaveToFile('Levels\Level '+IntToStr(i)+'.lev');
end;
end;
end;
 
procedure TMainForm.AnzeigeAct;
resourcestring
SYes = 'Ja';
SNo = 'Nein';
begin
SLabel1b.Caption := inttostr(NumEnemys);
if Boss then SLabel2b.Caption := SYes else SLabel2b.Caption := SNo;
if Boss then SLabel2b.Caption := 'Ja' else SLabel2b.Caption := 'Nein';
SLabel3b.Caption := inttostr(ScrollBar.Max);
if LevChanged then
begin
SLabel4a.Font.Color := $00000096;
SLabel4b.Font.Color := $00000096;
SLabel4b.Caption := SNo;
SLabel4b.Caption := 'Nein';
end
else
begin
SLabel4a.Font.Color := $00009600;
SLabel4b.Font.Color := $00009600;
SLabel4b.Caption := SYes;
SLabel4b.Caption := 'Ja';
end;
end;
 
procedure TMainForm.AufUpdatesprfen1Click(Sender: TObject);
procedure TMainForm.EnemyAdd(x, y, art, lives: integer);
begin
CheckForUpdates('spacemission', ProgramVersion); // do not localize
Enemys.Add(inttostr(x)+'-'+inttostr(y)+':'+inttostr(art)+'('+inttostr(lives)+')');
end;
 
procedure TMainForm.NeuClick(Sender: TObject);
resourcestring
SReallyDeleteLevel = 'Level wirklich löschen?';
begin
if MessageDlg(SReallyDeleteLevel, mtConfirmation, mbYesNoCancel, 0) = mrYes then
if MessageDlg('Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
DestroyLevel;
end;
 
procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
resourcestring
status_lives = 'Leben: ';
status_nolives = 'Einheit hat keine Lebensangabe';
SUnknownEnemyType = '???';
var
i: TEnemyType;
ex, ey, j, k, l: integer;
lifes: integer;
enemyType: TEnemyType;
enemyName: string;
ex, ey, i, j, k, l, wert: integer;
breaked: boolean;
begin
if sender <> DxDraw then
begin
StatusBar.SimpleText := ' ' + status_info;
StatusBar.SimpleText := status_info;
exit;
end;
ex := trunc(x/LevEditRasterW) * LevEditRasterW;
ey := trunc(y/LevEditRasterH) * LevEditRasterH;
lifes := -1;
enemyType := etUnknown;
ex := trunc(x/RasterW) * RasterW;
ey := trunc(y/RasterH) * RasterH;
wert := -1;
breaked := false;
for i := Low(TEnemyType) to High(TEnemyType) do
for i := 1 to 7 do
begin
for j := 0 to MaxPossibleEnemyLives do
for j := 0 to 999 do
begin
if boss and (i = etEnemyBoss) then
if boss and (i = 7) then
begin
for k := 0 to BossWidth - 1 do
for k := 0 to 3 do
begin
for l := 0 to BossHeight - 1 do
for l := 0 to 1 do
begin
if LevData.IndexOfEnemy(ex + ((ScrollP - k) * LevEditRasterW), ey - (LevEditRasterH * l), i, j) <> -1 then
if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
begin
lifes := j;
wert := j;
breaked := true;
break;
end;
795,10 → 708,10
if breaked then break;
end;
end;
if (breaked = false) and (LevData.IndexOfEnemy(ex + (ScrollP * LevEditRasterW), ey, i, j) <> -1) then
if (breaked = false) and (Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
inttostr(i)+'('+inttostr(j)+')') <> -1) then
begin
lifes := j;
enemyType := i;
wert := j;
breaked := true;
break;
end;
805,34 → 718,29
end;
if breaked then break;
end;
if lifes <> -1 then
if wert <> -1 then
begin
if Ord(enemyType) = 1 then enemyName := Enemy1.Caption
else if Ord(enemyType) = 2 then enemyName := Enemy2.Caption
else if Ord(enemyType) = 3 then enemyName := Enemy3.Caption
else if Ord(enemyType) = 4 then enemyName := Enemy4.Caption
else if Ord(enemyType) = 5 then enemyName := Enemy5.Caption
else if Ord(enemyType) = 6 then enemyName := Enemy6.Caption
else if Ord(enemyType) = 7 then enemyName := Enemy7.Caption
else if Ord(enemyType) = 8 then enemyName := Enemy8.Caption
else enemyName := SUnknownEnemyType;
if lifes > 0 then
StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_lives + inttostr(lifes)
if wert > 0 then
StatusBar.SimpleText := status_lives + inttostr(wert)
else
StatusBar.SimpleText := ' ' + enemyName + ' - ' + status_nolives;
StatusBar.SimpleText := status_nolives;
end
else
StatusBar.SimpleText := ' ' + status_info;
StatusBar.SimpleText := status_info;
end;
 
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
resourcestring
SExitWithoutSave = 'Beenden ohne abspeichern?';
begin
if Assigned(LevData) and LevChanged and (LevData.CountEnemies>0) then
CanClose := MessageDlg(SExitWithoutSave, mtConfirmation, mbYesNoCancel, 0) = mrYes;
if LevChanged then
CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;
 
procedure TMainForm.Quelltext1Click(Sender: TObject);
begin
SourceForm.Aktualisieren;
SourceForm.showmodal;
end;
 
procedure TMainForm.Spielfelderweitern1Click(Sender: TObject);
begin
LevelForm.Aktualisieren;
845,18 → 753,28
ScrollP := ScrollPos;
end;
 
function TMainForm.SelectedEnemyType: TEnemyType;
procedure TMainForm.LivesChange(newval: integer);
begin
if Enemy1.Checked then result := etEnemyAttacker
else if Enemy2.Checked then result := etEnemyAttacker2
else if Enemy3.Checked then result := etEnemyAttacker3
else if Enemy4.Checked then result := etEnemyMeteor
else if Enemy5.Checked then result := etEnemyUFO
else if Enemy6.Checked then result := etEnemyUFO2
else if Enemy7.Checked then result := etEnemyBoss
else if Enemy8.Checked then result := etItemMedikit
else result := etUnknown;
LiveEdit := newval;
livesedt.Text := inttostr(LiveEdit);
lives.Position := newval;
end;
 
procedure TMainForm.LivesClick(Sender: TObject; Button: TUDBtnType);
begin
LivesChange(lives.Position);
end;
 
procedure TMainForm.LivesEdtKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in [#13, #08, '0'..'9']) then
Key := #0;
end;
 
procedure TMainForm.LivesEdtChange(Sender: TObject);
begin
LivesChange(strtoint(livesedt.text));
end;
 
end.
 
/SplText.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/SplCheat.pas
0,0 → 1,132
unit SplCheat;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, ShellAPI;
 
type
TCheatForm = class(TForm)
Label1: TLabel;
CheatEdit: TEdit;
OKBtn: TButton;
AbbBtn: TButton;
GroupBox1: TGroupBox;
CheatBox: TListBox;
Label2: TLabel;
Label3: TLabel;
procedure AbbBtnClick(Sender: TObject);
procedure OKBtnClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure CheatEditKeyPress(Sender: TObject; var Key: Char);
procedure Label2Click(Sender: TObject);
procedure Label3Click(Sender: TObject);
public
procedure SearchCheats;
end;
 
var
CheatForm: TCheatForm;
 
implementation
 
uses SplMain, SplInfo;
 
{$R *.DFM}
 
const
// Cheat1 = 'Kmkjk'+#39+'Khyc'; {Johnny Cash}
Cheat1 = #75+#109+#107+#106+#107+#127+#39+#75+#104+#121+#99;
Cheat1Text = 'Unendlich Leben!';
 
procedure TCheatForm.AbbBtnClick(Sender: TObject);
begin
close;
end;
 
procedure TCheatForm.SearchCheats;
begin
Cheatbox.Items.Clear;
if mainform.FCheat then Cheatbox.Items.Append(Cheat1Text);
end;
 
procedure TCheatForm.OKBtnClick(Sender: TObject);
var
temp: string;
i, j: integer;
begin
temp := '';
j := 0;
for i := 1 to length(CheatEdit.text) do
begin
inc(j);
temp := temp + chr(byte(copy(CheatEdit.text, i, 1)[1]) xor j);
end;
if lowercase(temp) = lowercase(Cheat1) then
begin
if mainform.FCheat then
showmessage('Dieser Cheat wurde bereits freigeschaltet!')
else
begin
showmessage('Dieser Cheat wurde freigeschaltet!');
mainform.FCheat := true;
SearchCheats;
end;
close;
end
else
begin
showmessage('Dies ist kein offizieller Cheat!');
CheatEdit.text := '';
CheatEdit.setfocus;
end;
end;
 
procedure TCheatForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
SearchCheats;
CheatEdit.text := '';
CheatEdit.setfocus;
end;
 
procedure TCheatForm.FormHide(Sender: TObject);
begin
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
end;
 
procedure TCheatForm.CheatEditKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
// key := #0;
OKBtn.click;
end;
end;
 
procedure TCheatForm.Label2Click(Sender: TObject);
begin
if not CheatBox.items.IndexOf(Cheat1Text) = -1 then
begin
if CheatBox.Selected[CheatBox.items.IndexOf(Cheat1Text)] then
begin
if MessageDlg('Diesen Cheat wirklich deaktivieren?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
mainform.FCheat := false;
showmessage('Dieser Cheat wurde deakiviert!');
SearchCheats;
end;
end;
end;
end;
 
procedure TCheatForm.Label3Click(Sender: TObject);
begin
shellexecute(handle, 'open', pchar('mailto:daniel.marschall@surfeu.de?subject=Cheats für SpaceMission '+MainForm.FEngineVersion), '', '', 1);
end;
 
end.
 
/SpaceMission.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/ComMain.dfm
0,0 → 1,114
object MainForm: TMainForm
Left = 268
Top = 153
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'SpaceMission Levelcompiler'
ClientHeight = 201
ClientWidth = 345
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnClose = FormClose
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Bevel1: TBevel
Left = 8
Top = 136
Width = 329
Height = 2
Shape = bsBottomLine
end
object Label1: TLabel
Left = 8
Top = 8
Width = 295
Height = 26
Caption =
'Der SpaceMission Levelcompiler wandelt die Levels Ihrer alten'#13#10'S' +
'paceMission-Version in die aktuelle Version 1.0 / 1.1 um.'
Transparent = True
end
object Label2: TLabel
Left = 8
Top = 184
Width = 322
Height = 13
Caption =
'Die korrekte Umschreibung der Levels kann nicht garantiert werde' +
'n!'
Font.Charset = DEFAULT_CHARSET
Font.Color = clMaroon
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
end
object Run: TButton
Left = 176
Top = 96
Width = 161
Height = 25
Caption = 'Compiler starten'
Default = True
TabOrder = 0
OnClick = RunClick
end
object Button1: TButton
Left = 8
Top = 152
Width = 105
Height = 25
Caption = 'Eingabeordner'
TabOrder = 1
OnClick = Button1Click
end
object Button2: TButton
Left = 120
Top = 152
Width = 105
Height = 25
Caption = 'Ausgabeordner'
TabOrder = 2
OnClick = Button2Click
end
object Button3: TButton
Left = 232
Top = 152
Width = 105
Height = 25
Caption = 'Levelordner'
TabOrder = 3
OnClick = Button3Click
end
object comb: TComboBox
Left = 8
Top = 96
Width = 161
Height = 21
Style = csDropDownList
ItemHeight = 13
TabOrder = 4
Items.Strings = (
'Version 0.2 --> Version 0.3'
'Version 0.2 --> Version 0.4'
'Version 0.3 --> Version 0.4'
'Version 0.4 --> Version 1.0'
'Version 0.2 --> Version 1.0'
'Version 0.3 --> Version 1.0')
end
object gauge: TProgressBar
Left = 8
Top = 48
Width = 329
Height = 33
Smooth = True
TabOrder = 5
end
end
/LevSpeicherung.dfm
1,10 → 1,11
object SpeicherungForm: TSpeicherungForm
Left = 281
Top = 153
BorderStyle = bsDialog
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Levels'
ClientHeight = 424
ClientWidth = 447
ClientHeight = 409
ClientWidth = 449
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
11,10 → 12,11
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnCreate = FormCreate
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Bevel1: TBevel
Left = 8
26,23 → 28,23
object Label2: TLabel
Left = 8
Top = 72
Width = 34
Width = 58
Height = 13
Caption = 'Levels:'
Caption = 'Spielst'#228'nde:'
end
object Label3: TLabel
Left = 8
Top = 336
Width = 67
Width = 92
Height = 13
Caption = 'Informationen:'
Caption = 'Levelinformationen:'
end
object Label1: TLabel
Left = 8
Top = 20
Width = 55
Width = 78
Height = 13
Caption = 'Levelname:'
Caption = 'Spielstandname:'
end
object LadenBtn: TButton
Left = 336
84,7 → 86,7
end
object AbbrechenBtn: TButton
Left = 336
Top = 391
Top = 376
Width = 105
Height = 25
Cancel = True
102,12 → 104,13
ItemHeight = 13
TabOrder = 5
OnClick = LevelListBoxClick
OnDblClick = LevelListBoxDblClick
end
object ElPanel1: TPanel
Left = 112
Top = 336
Width = 201
Height = 80
Height = 65
BevelOuter = bvLowered
Color = clWindow
TabOrder = 6
170,9 → 173,9
object liw: TLabel
Left = 8
Top = 8
Width = 125
Width = 104
Height = 13
Caption = 'Bitte w'#228'hlen Sie ein Level.'
Caption = 'W'#228'hlen Sie ein Level.'
Font.Charset = DEFAULT_CHARSET
Font.Color = clNavy
Font.Height = -11
181,22 → 184,27
ParentFont = False
Visible = False
end
object li4: TLabel
Left = 8
Top = 56
Width = 118
Height = 13
Caption = 'Name / Autor unbekannt'
end
end
object LevelNumber: TSpinEdit
object SpinEditEdt: TEdit
Left = 112
Top = 16
Width = 201
Height = 22
MaxValue = 0
MinValue = 0
Top = 20
Width = 185
Height = 21
MaxLength = 4
TabOrder = 7
Value = 0
Text = '1'
OnChange = SpinEditEdtChange
OnKeyPress = SpinEditEdtKeyPress
end
object SpinEdit: TUpDown
Left = 296
Top = 22
Width = 17
Height = 19
Min = 1
Max = 9999
Position = 1
TabOrder = 8
OnClick = SpinEditClick
end
end
/LevSource.pas
0,0 → 1,97
unit LevSource;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellAPI;
 
type
TSourceForm = class(TForm)
ElLabel1: TLabel;
ElLabel2: TLabel;
ElPopupButton1: TButton;
ListBox1: TListBox;
Memo1: TMemo;
Label1: TLabel;
Label2: TLabel;
procedure ElPopupButton1Click(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Label1Click(Sender: TObject);
public
procedure Aktualisieren;
end;
 
var
SourceForm: TSourceForm;
 
const
FCompVersion = '1.0';
 
implementation
 
uses
LevMain, LevSpeicherung;
 
{$R *.DFM}
 
procedure TSourceForm.ElPopupButton1Click(Sender: TObject);
begin
close;
end;
 
procedure TSourceForm.Aktualisieren;
var
i, j: integer;
puffer: string;
begin
ListBox1.Items := MainForm.Enemys;
Memo1.lines.clear;
for j := 0 to mainform.enemys.Count - 2 do
begin
for i := 0 to mainform.enemys.Count - 2 do
begin
if strtoint(speicherungform.filter(1, mainform.enemys.Strings[i])) > strtoint(speicherungform.filter(1, mainform.enemys.Strings[i + 1])) then
begin
puffer := mainform.enemys.Strings[i];
mainform.enemys.Strings[i] := mainform.enemys.Strings[i + 1];
mainform.enemys.Strings[i + 1] := puffer;
end;
end;
end;
Memo1.lines.add('; SpaceMission ' + FCompVersion);
Memo1.lines.add('; LEV-File');
Memo1.lines.add(inttostr(MainForm.ScrollBar.Max)); // --> Länge der Karte
for i := 0 to mainform.enemys.count-1 do
begin
Memo1.lines.add(speicherungform.filter(3, mainform.enemys.Strings[i]));
Memo1.lines.add(speicherungform.filter(1, mainform.enemys.Strings[i]));
Memo1.lines.add(speicherungform.filter(2, mainform.enemys.Strings[i]));
Memo1.lines.add(speicherungform.filter(4, mainform.enemys.Strings[i]));
end;
end;
 
procedure TSourceForm.FormHide(Sender: TObject);
begin
mainform.dxtimer.enabled := true;
end;
 
procedure TSourceForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
end;
 
procedure TSourceForm.Label1Click(Sender: TObject);
begin
if not fileexists(mainform.fdirectory+'Dokumentation.pdf') then
begin
MessageDLG('Die Datei "Dokumentation.pdf" ist nicht mehr vorhanden. Die Aktion wird abgebrochen!',
mtWarning, [mbOK], 0);
end
else
shellexecute(handle, 'open', pchar(mainform.fdirectory+'Dokumentation.pdf'), '', '', 1);
end;
 
end.
 
/Texte/Mitwirkende.txt
0,0 → 1,12
Mitwirkende
===========
 
SpaceMission wurde von Daniel Marschall aus einer Codevorlage von Hiroyuki Hori heraus erstellt. Das Original ist ein Codebeispiel für DelphiX 2000.
 
Musik von Savage Peachers Software, Grafikquellen unbekannt.
 
Levels von Daniel Marschall, Patrick Büssecker und Andreas Kübelsbeck.
 
Entwickelt mit Borland Turbo Delphi.
 
Verwendete Komponenten: DelphiX 2000, PJSoft VersionInfo.
/LevEdit.cfg
0,0 → 1,43
-$A8
-$B-
-$C+
-$D+
-$E-
-$F-
-$G+
-$H+
-$I+
-$J+
-$K-
-$L+
-$M-
-$N+
-$O+
-$P+
-$Q-
-$R-
-$S-
-$T-
-$U-
-$V+
-$W-
-$X+
-$YD
-$Z1
-cg
-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
-H+
-W+
-M
-$M16384,1048576
-K$00400000
-LE"D:\Eigene Dateien\Borland Studio-Projekte\Bpl"
-LN"D:\Eigene Dateien\Borland Studio-Projekte\Bpl"
-U"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-O"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-I"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-R"VCL_DELPHIX_D6;VCL_PJVERSIONINFO"
-w-HIDDEN_VIRTUAL
-w-UNSAFE_TYPE
-w-UNSAFE_CODE
-w-UNSAFE_CAST
/VCL_DELPHIX_D6/DelphiX140.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX250.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX160.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX270.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX180.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX290.dproj
File deleted
/VCL_DELPHIX_D6/Dcu190
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX200.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX120.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX240.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/turbopixels.pas
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX160.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX280.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DxPathEdit.dfm
File deleted
/VCL_DELPHIX_D6/Dcu120
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX110.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX230.dpk
File deleted
/VCL_DELPHIX_D6/DelphiX150.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX270.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX190.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX160_Icon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX40.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX60.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX210.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX250.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX170.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX290.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXGlueItEdit.pas
File deleted
/VCL_DELPHIX_D6/DXGlueItEdit.dfm
File deleted
/VCL_DELPHIX_D6/DelphiX30.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX50.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX70.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX90.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/Dcu200
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DXMapEdit.dfm
File deleted
/VCL_DELPHIX_D6/Colli3DX.pas
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/Dcu140
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/SXLib.pas
File deleted
/VCL_DELPHIX_D6/DXMisc.pas
File deleted
/VCL_DELPHIX_D6/Dcu60
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/Dcu40
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX200.dpk
File deleted
/VCL_DELPHIX_D6/DelphiX120.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX240.dpk
File deleted
/VCL_DELPHIX_D6/DirectPlay.pas
File deleted
/VCL_DELPHIX_D6/DelphiX160.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DxPathEdit.pas
File deleted
/VCL_DELPHIX_D6/DelphiX280.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DXMapEditProperties.dfm
File deleted
/VCL_DELPHIX_D6/DelphiX200.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX110.dproj
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX220.dproj
File deleted
/VCL_DELPHIX_D6/Dcu210
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX240.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX150.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX260.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX170.dproj
File deleted
/VCL_DELPHIX_D6/DXMidiEdit.dfm
File deleted
/VCL_DELPHIX_D6/Dcu150
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX280.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX190.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX140_Icon.ico
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX100.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX220.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXDIBEffectEdit.dfm
File deleted
/VCL_DELPHIX_D6/DelphiX140.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX260.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX180.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/Dcu220
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/Dcu160
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/SXMedia/SXEngine.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/MpSndSys.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SXEditor.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SXAbout.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SXModPlayer.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SXAbout.dfm
File deleted
/VCL_DELPHIX_D6/SXMedia/SXReg.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SXMovie.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SxSample/SXMedia.dpr
File deleted
/VCL_DELPHIX_D6/SXMedia/SxSample/SXMedia.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/SXMedia/SxSample/main.pas
File deleted
/VCL_DELPHIX_D6/SXMedia/SxSample/MPPSDK.DLL
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/SXMedia/SxSample/main.dfm
File deleted
/VCL_DELPHIX_D6/SXMedia/SxSample
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/SXMedia/SXReg.dcr
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/SXMedia
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DXMapEdit.pas
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX210.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX.bdsproj
File deleted
/VCL_DELPHIX_D6/DelphiX250.dpk
File deleted
/VCL_DELPHIX_D6/DelphiX170.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX290.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/Dcu170
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX30.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX50.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX70.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX90.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX110.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX230.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX150.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX270.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX190.res
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX40.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX60.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/Dcu100
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/Colli3DX.dcr
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXMidiEdit.pas
File deleted
/VCL_DELPHIX_D6/Dcu180
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DXMapEditProperties.pas
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX100.bdsproj
File deleted
/VCL_DELPHIX_D6/Dcu90
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/Dcu70
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/Dcu50
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/D3DUtils.pas
File deleted
/VCL_DELPHIX_D6/Dcu30
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DelphiX100.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DXSpriteEdit.pas
File deleted
/VCL_DELPHIX_D6/DXWave.pas
File deleted
/VCL_DELPHIX_D6/DelphiX220.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DXSpriteEdit.dfm
File deleted
/VCL_DELPHIX_D6/DelphiX140.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX.dproj
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX260.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX180.dpk
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DXDIBEffectEdit.pas
File deleted
\ No newline at end of file
/VCL_DELPHIX_D6/DelphiX210.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX120.dproj
File deleted
/VCL_DELPHIX_D6/DelphiX230.dproj
File deleted
/VCL_DELPHIX_D6/Dcu110
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/VCL_DELPHIX_D6/DXConsts.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DirectX.txt
0,0 → 1,121
-- English -------------------------------------------------------------------
 
DirectX header for Delphi 3, 4, 5.
 
Present unit:
DirectX unit DirectX 7 (DirectX 7 SDK)
DShow unit DirectShow (DirectX Media SDK 5.1)
DAnim unit DirectAnimation (DirectX Media SDK 5.1)
 
Hiroyuki Hori
@hori@ingjapan.ne.jp
@http://www.yks.ne.jp/~hori/
 
-- Japanese -------------------------------------------------------------------
 
Delphi 3, 4, 5 —p‚ÌŠ®‘S‚È DirectX ƒwƒbƒ_[‚Å‚·B
 
Œ»Ý‚̃†ƒjƒbƒgF
DirectX ƒ†ƒjƒbƒg DirectX 7 (DirectX 7 SDK)
DShow ƒ†ƒjƒbƒg DirectShow (DirectX Media SDK 5.1)
DAnim ƒ†ƒjƒbƒg DirectAnimation (DirectX Media SDK 5.1)
 
–x@_s(Hiroyuki Hori)
@hori@ingjapan.ne.jp
@http://www.yks.ne.jp/~hori/
 
 
XV‹L˜^F
 
2000/07/17 EIDirectDrawSurface4.Lock ƒƒ\ƒbƒh‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3DDevice7.DrawIndexedPrimitiveVB ƒƒ\ƒbƒh‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1999/11/20 EDirectX7 ‚ɑΉž‚µ‚½B
EIDirectDrawSurface ƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì EnumAttachedSurfaces, EnumOverlayZOrders ƒƒ\ƒbƒh‚Ì
ˆø”‚ÌŒ^‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3DRMFrame3 ƒCƒ“ƒ^[ƒtƒF[ƒX‚Ì GetTransForm ƒƒ\ƒbƒh‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EDDSPD_VOLATILE ’萔‚Ì’l‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EDShow.pas ‚Å Delphi 3 ‚̏ꍇAInt64 Œ^‚ðéŒ¾‚µ‚Ä‚¢‚½‚Ì‚ð‚â‚ß‚Ä LONGLONG Œ^‚ðŽg‚¤‚悤‚É‚µ‚½B
ETDPMsg_SendComplete Œ^‚Å dwPriority ‚ª”²‚¯‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1999/09/27 EDelphi 5 ‚ŃŒƒR[ƒh‚̉•ϕ”•ª‚ɃCƒ“ƒ^[ƒtƒF[ƒX‚ð‚¨‚¯‚È‚­‚È‚Á‚½‚½‚߁A
TDDBltFX, TDDOverlayFx \‘¢‘Ì‚Ì‚È‚©‚̃Cƒ“ƒ^[ƒtƒF[ƒX‚ðƒ|ƒCƒ“ƒ^‚ɕύX‚µ‚½B
 
1999/08/21 EDirectXFileCreate ŠÖ”‚Ì DLL ƒtƒ@ƒCƒ‹–¼‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIID_IDirectXFile ’萔‚È‚Ç‚ª•¶Žš—ñ’萔‚Æ‚µ‚Đ錾‚³‚ê‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
ED3DRM_XTEMPLATE_BYTES ’萔‚ðéŒ¾‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3DRMMeshBuilder3 ƒCƒ“ƒ^[ƒtƒF[ƒX‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1999/02/21 EIDirect3DRM3 ƒCƒ“ƒ^[ƒtƒF[ƒX‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3DDevice3 ƒCƒ“ƒ^[ƒtƒF[ƒX‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/10/05@EIDirect3D3.CreateDevice ƒƒ\ƒbƒh‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/08/28@EIDirect3D3.CreateVertexBuffer ƒƒ\ƒbƒh‚ðéŒ¾‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3D3.CreateMaterial ƒƒ\ƒbƒh‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/08/25 EIDirect3DRM ƒCƒ“ƒ^[ƒtƒF[ƒX‚ð’è‹`‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3DRM2, IDirect3DRM3 ‚Ì LoadTextureFromResource ƒƒ\ƒbƒh‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/08/24 EDirectX 5 ƒwƒbƒ_[‚ƌ݊·«‚ª‚È‚©‚Á‚½‚Ì‚ðC³‚µ‚½B
‹ï‘Ì“I‚É‚Í PDInputState ‚ð’è‹`‚µ‚Ä‚¢‚È‚©‚Á‚½B
 
1998/08/08 EIBasicVideo.get_BitRate ƒƒ\ƒbƒh‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/08/07 EDirectX 6 ‚É‚à‘Ήž‚µ‚½B
EŒ^‚Ì–½–¼‹K‘¥‚ð Delphi •W€‚É•Ï‚¦‚½B
EInteger Œ^‚Ő錾‚µ‚Ä‚ ‚Á‚½‚Ì‚ð DWORD ‚© Longint Œ^‚Ő錾‚·‚é‚悤‚É‚µ‚½B
EƒrƒfƒIƒ|[ƒgŠÖ˜A‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
ETD3DRMLoadTextureCallback Œ^‚̈ø”‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIDirect3DRMPicked2Array.GetPick ƒƒ\ƒbƒh‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
ETDSEnumCallbackX Œ^‚É stdcall ‚ª–³‚©‚Á‚½‚Ì‚ðC³‚µ‚½B
EDShow ƒ†ƒjƒbƒg‚Å 64ƒrƒbƒg®”Œ^‚Í Comp ‚Å‚Í‚È‚­ATInt64 Œ^‚É‚µ‚½B
Delphi3 ‚Å‚Í type TInt64=Comp ‚Æ‚µ‚Ä’è‹`‚³‚ê‚éB
 
1998/06/03 EVectorCrossProduct ŠÖ”‚ÌŒvŽZŽ®‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/05/29 ED3DRMQuaternionFromRotation ŠÖ”‚̈ø”‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1998/04/29 EDIK_? ‚Ő錾‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ð’ljÁ‚µ‚½B
 
1998/04/02 EIDirect3DRMFrame2 ‚̃ƒ\ƒbƒh‚ðC³‚µ‚½B
 
1998/04/02 EDirectPlay ŠÖ˜A‚ð‚¿‚å‚Á‚ƏC³‚µ‚½B
 
1998/03/02 EIFilterMapper2.EnumMatchingFilters ‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
EIEnumXX.Next ƒƒ\ƒbƒh‚Ì‘æ“ñˆø” ‚Å out XXX: Ixxx ‚Æ‚È‚Á‚Ä‚¢‚½‚Ì‚ð out XXX ‚Æ‚µ‚½B
 
1998/03/01 EˆÈ‰º‚̃†ƒjƒbƒg‚ð’ljÁ‚µ‚½B
DShow ƒ†ƒjƒbƒg DirectShow(ActiveMovie)
DAnim ƒ†ƒjƒbƒg DirectAnimation
 
1998/02/06 EDirectX ƒ†ƒjƒbƒg‚É‚·‚ׂẴ†ƒjƒbƒg‚ð‚Ü‚Æ‚ß‚½B
 
1998/01/31 E‚·‚ׂẴ†ƒjƒbƒg‚É $WEAKPACKAGEUNIT Žw—ß‚ð‰Á‚¦‚½B
ED3DTypes ƒ†ƒjƒbƒg‚Ì D3DRGBA ŠÖ”‚ðC³‚µ‚½B
 
1998/01/22 E‚Ù‚Æ‚ñ‚ǂ̃†ƒjƒbƒg‚É $WEAKPACKAGEUNIT Žw—ß‚ð‰Á‚¦‚½B
 
1998/01/04 EDInput.pas ‚Ì DIK_xxx ‚Ő錾‚µ–Y‚ê‚Ä‚¢‚½‚Ì‚ª‚ ‚Á‚½‚Ì‚ðC³‚µ‚½B
 
1997/12/27 EIDirect3DRMDevice2 ‚ð IDirect3DRMDevice ‚ðŒp³‚·‚é‚悤‚É‚µ‚½B
EIDirect3DViewport2 ‚ð Direct3DViewport ‚ðŒp³‚·‚é‚悤‚É‚µ‚½B
EIDirectPlay3 ‚Å IDirectPlay2 ‚Ì•”•ª‚ªéŒ¾‚³‚ê‚Ä‚¢‚½‚Ì‚ðíœ‚µ‚½B
EIDirectPlayLobby2 ‚Å IDirectPlayLobby ‚Ì•”•ª‚ªéŒ¾‚³‚ê‚Ä‚¢‚½‚Ì‚ðíœ‚µ‚½B
EIDirectInputDevice2 ‚Å IDirectInputDevice ‚Ì•”•ª‚ªéŒ¾‚³‚ê‚Ä‚¢‚½‚Ì‚ðíœ‚µ‚½B
EƒR[ƒ‹ƒoƒbƒNŠÖ”‚Ì–ß‚è’l‚ð BOOL ‚©‚ç HRESULT ‚É‚µ‚½B
Ec_dfDIMouse, c_dfDIKeyboard ‚Ì’è‹`‚ª³‚µ‚­‚È‚©‚Á‚½‚Ì‚ð‚È‚¨‚µ‚½B
 
1997/12/16 EIDirect3DRM2.CreateDeviceFromD3D ƒƒ\ƒbƒh‚̈ø”‚ð•ÏX‚µ‚½B
EIDirect3DRMMeshBuilder2 ‚ð IDirect3DRMMeshBuilder ‚ðŒp³‚·‚é‚悤‚É‚µ‚½B
ED3DRMObj ƒ†ƒjƒbƒg‚Å Boolean ‚Æ‚È‚Á‚Ä‚¢‚½‚Ì‚ð Bool ‚Æ‚µ‚½B
 
1997/12/09 EIDirect3DRMFrame2 ‚ð IDirect3DRMFrame ‚ðŒp³‚·‚é‚悤‚É‚µ‚½B
EIDirect3DRMTexture2 ‚ð IDirect3DRMTexture ‚ðŒp³‚·‚é‚悤‚É‚µ‚½B
 
EIDirect3DDevice2 ‚Ì DrawPrimitve, DrawIndexedPrimitve ƒƒ\ƒbƒh‚̈ø”‚ð•ÏX‚µ‚½B
EIDirect3DRMFace ‚Ì SetColor ƒƒ\ƒbƒh‚̐錾‚ª”²‚¯—Ž‚¿‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
 
1997/11/25 ED3DTypes ƒ†ƒjƒbƒg‚Ì D3DRGB, D3DRGBA ŠÖ”‚ðC³‚µ‚½B
 
1997/11/21 EIDirect3DRMObject.Clone ƒƒ\ƒbƒh‚̐錾‚ªŠÔˆá‚Á‚Ä‚¢‚½‚Ì‚ðC³‚µ‚½B
/VCL_DELPHIX_D6/DIB.pas
1,81 → 1,35
{*******************************************************}
{ }
{ DIB and PAINTBOX componets }
{ }
{ Copyright (C) 1997-2000 Hiroyuki Hori }
{ base components and effects }
{ Copyright (C) 2000 Keith Murray }
{ supernova effect }
{ Copyright (C) 2000 Michel Hibon }
{ new special effects added for DIB }
{ Copyright (C) 2001 Joakim Back }
{ conFusion effects (as DxFusion) }
{ Copyright (C) 2003 Babak Sateli }
{ 24-bit DIB effect as supplement ones }
{ Copyright (C) 2004-2012 Jaro Benes }
{ 32-bit DIB effect with alphachannel }
{ direct works with texture buffer }
{ modified and adapted all adopted functions }
{ }
{*******************************************************}
 
unit DIB;
 
interface
 
{$INCLUDE DelphiXcfg.inc}
{$DEFINE USE_SCANLINE}
 
uses
Windows, SysUtils, Classes, Graphics, Controls,
{$IFDEF VER7UP} Types, {$ENDIF}
{$IFDEF VER9UP} GraphUtil, {$ENDIF}
{$IFDEF VER17UP} UITypes,{$ENDIF}
Math;
Windows, SysUtils, Classes, Graphics, Controls;
 
type
TColorLineStyle = (csSolid, csGradient, csRainbow);
TColorLinePixelGeometry = (pgPoint, pgCircular, pgRectangular);
PRGBQuads = ^TRGBQuads;
TRGBQuads = array[0..255] of TRGBQuad;
 
TPaletteEntries = array[0..255] of TPaletteEntry;
 
PBGRA = ^TBGRA;
TBGRA = packed record
B, G, R, A: Byte;
end;
TLinesA = array[0..0] of TBGRA;
PLinesA = ^TLinesA;
 
PBGR = ^TBGR;
TBGR = packed record
B, G, R: Byte;
end;
 
{ Added this type for New SPecial Effect }
TFilter = array[0..2, 0..2] of SmallInt;
TLines = array[0..0] of TBGR;
PLines = ^TLines;
TBytes = array[0..0] of Byte;
PBytes = ^TBytes;
TPBytes = array[0..0] of PBytes;
PPBytes = ^TPBytes;
{ End of type's }
 
PArrayBGR = ^TArrayBGR;
TArrayBGR = array[0..0] of TBGR;
TArrayBGR = array[0..10000] of TBGR;
 
PArrayByte = ^TArrayByte;
TArrayByte = array[0..0] of Byte;
TArrayByte = array[0..10000] of Byte;
 
PArrayWord = ^TArrayWord;
TArrayWord = array[0..0] of Word;
TArrayWord = array[0..10000] of Word;
 
PArrayDWord = ^TArrayDWord;
TArrayDWord = array[0..0] of DWord;
TArrayDWord = array[0..10000] of DWord;
 
{ TDIBPixelFormat }
{ TDIB }
 
TDIBPixelFormat = record
RBitMask, GBitMask, BBitMask: DWORD;
84,10 → 38,8
RBitCount2, GBitCount2, BBitCount2: DWORD;
end;
 
{ TDIBSharedImage }
 
TDIBSharedImage = class(TSharedImage)
private
private
FBitCount: Integer;
FBitmapInfo: PBitmapInfo;
FBitmapInfoSize: Integer;
112,7 → 64,7
constructor Create;
procedure NewImage(AWidth, AHeight, ABitCount: Integer;
const PixelFormat: TDIBPixelFormat; const ColorTable: TRGBQuads; MemoryImage, Compressed: Boolean);
procedure Duplicate(Source: TDIBSharedImage; MemoryImage: Boolean); {$IFDEF VER9UP}inline;{$ENDIF}
procedure Duplicate(Source: TDIBSharedImage; MemoryImage: Boolean);
procedure Compress(Source: TDIBSharedImage);
procedure Decompress(Source: TDIBSharedImage; MemoryImage: Boolean);
procedure ReadData(Stream: TStream; MemoryImage: Boolean);
124,37 → 76,10
destructor Destroy; override;
end;
 
{ TFilterTypeResample }
 
TFilterTypeResample = (ftrBox, ftrTriangle, ftrHermite, ftrBell, ftrBSpline,
ftrLanczos3, ftrMitchell);
 
TDistortType = (dtFast, dtSlow);
{DXFusion effect type}
TFilterMode = (fmNormal, fmMix50, fmMix25, fmMix75);
 
{ TLightSource }
 
TLightSource = record
X, Y: Integer;
Size1, Size2: Integer;
Color: TColor;
end;
 
{ TLightArray }
 
TLightArray = array{$IFNDEF VER4UP}[0..0]{$ENDIF} of TLightsource;
 
{ TMatrixSetting }
 
TMatrixSetting = array[0..9] of Integer;
 
{ TDIB }
 
TDIB = class(TGraphic)
private
FCanvas: TCanvas;
FImage: TDIBSharedImage;
FImage: TDIBSharedImage;
 
FProgressName: string;
FProgressOldY: DWORD;
171,10 → 96,6
FTopPBits: Pointer;
FWidth: Integer;
FWidthBytes: Integer;
FLUTDist: array[0..255, 0..255] of Integer;
LG_COUNT: Integer;
LG_DETAIL: Integer;
FFreeList: TList;
procedure AllocHandle;
procedure CanvasChanging(Sender: TObject);
procedure Changing(MemoryImage: Boolean);
192,28 → 113,15
function GetTopPBits: Pointer;
function GetTopPBitsReadOnly: Pointer;
procedure SetBitCount(Value: Integer);
procedure SetImage(Value: TDIBSharedImage); {$IFDEF VER9UP}inline;{$ENDIF}
procedure SetImage(Value: TDIBSharedImage);
procedure SetNowPixelFormat(const Value: TDIBPixelFormat);
procedure SetPixel(X, Y: Integer; Value: DWORD);
procedure StartProgress(const Name: string);
procedure EndProgress;
procedure UpdateProgress(PercentY: Integer);
 
{ Added these 3 functions for New Specials Effects }
function Interval(iMin, iMax, iValue: Integer; iMark: Boolean): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function IntToByte(i: Integer): Byte; {$IFDEF VER9UP}inline;{$ENDIF}
function TrimInt(i, Min, Max: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
{ End of 3 functions for New Special Effect }
 
procedure Darkness(Amount: Integer);
function GetAlphaChannel: TDIB;
procedure SetAlphaChannel(const Value: TDIB);
function GetClientRect: TRect;
function GetRGBChannel: TDIB;
procedure SetRGBChannel(const Value: TDIB);
protected
procedure DefineProperties(Filer: TFiler); override;
procedure Draw(ACanvas: TCanvas; const ARect: TRect); override;
procedure Draw(ACanvas: TCanvas; const Rect: TRect); override;
function GetEmpty: Boolean; override;
function GetHeight: Integer; override;
function GetPalette: HPalette; override;
223,10 → 131,6
procedure SetPalette(Value: HPalette); override;
procedure SetWidth(Value: Integer); override;
procedure WriteData(Stream: TStream); override;
{$IFDEF VER16UP}
function GetSupportsPartialTransparency: Boolean; override;
{$ENDIF}
function GetTransparent: Boolean; override;
public
ColorTable: TRGBQuads;
PixelFormat: TDIBPixelFormat;
237,9 → 141,6
procedure Compress;
procedure Decompress;
procedure FreeHandle;
function HasAlphaChannel: Boolean;
function AssignAlphaChannel(ALPHA: TDIB; ForceResize: Boolean{$IFDEF VER4UP} = False{$ENDIF}): Boolean;
procedure RetAlphaChannel(out oDIB: TDIB);
procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle;
APalette: HPALETTE); override;
procedure LoadFromStream(Stream: TStream); override;
246,168 → 147,14
procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle;
var APalette: HPALETTE); override;
procedure SaveToStream(Stream: TStream); override;
procedure SetSize(AWidth, AHeight, ABitCount: Integer); {$IFDEF VER5UP}reintroduce;{$ENDIF} //{$IFDEF VER9UP} overload;{$ENDIF}
procedure SetSize(AWidth, AHeight, ABitCount: Integer);
procedure UpdatePalette;
{ Special effect }
procedure Blur(ABitCount: Integer; Radius: Integer);
procedure Greyscale(ABitCount: Integer);
procedure Mirror(MirrorX, MirrorY: Boolean);
procedure Negative; {$IFDEF VER9UP}inline;{$ENDIF}
procedure Negative;
 
{ Added New Special Effect }
procedure Spray(Amount: Integer);
procedure Emboss;
procedure AddMonoNoise(Amount: Integer);
procedure AddGradiantNoise(Amount: byte);
function Twist(bmp: TDIB; Amount: byte): Boolean;
function FishEye(bmp: TDIB): Boolean;
function SmoothRotateWrap(Bmp: TDIB; cx, cy: Integer; Degree: Extended): Boolean;
procedure Lightness(Amount: Integer);
procedure Saturation(Amount: Integer);
procedure Contrast(Amount: Integer);
procedure AddRGB(aR, aG, aB: Byte);
function Filter(Dest: TDIB; Filter: TFilter): Boolean;
procedure Sharpen(Amount: Integer);
function IntToColor(i: Integer): TBGR; {$IFDEF VER9UP}inline;{$ENDIF}
function Rotate(Dst: TDIB; cx, cy: Integer; Angle: Double): Boolean;
procedure SplitBlur(Amount: Integer);
procedure GaussianBlur(Bmp: TDIB; Amount: Integer);
{ End of New Special Effect }
{
New effect for TDIB
with Some Effects like AntiAlias, Contrast,
Lightness, Saturation, GaussianBlur, Mosaic,
Twist, Splitlight, Trace, Emboss, etc.
Works with 24bit color DIBs.
 
This component is based on TProEffectImage component version 1.0 by
Written By Babak Sateli (babak_sateli@yahoo.com, http://raveland.netfirms.com)
 
and modified by (c) 2004 Jaro Benes
for DelphiX use.
 
Demo was modified into DXForm with function like original
 
DISCLAIMER
This component is provided AS-IS without any warranty of any kind, either express or
implied. This component is freeware and can be used in any software product.
}
procedure DoInvert;
procedure DoAddColorNoise(Amount: Integer);
procedure DoAddMonoNoise(Amount: Integer);
procedure DoAntiAlias;
procedure DoContrast(Amount: Integer);
procedure DoFishEye(Amount: Integer);
procedure DoGrayScale;
procedure DoLightness(Amount: Integer);
procedure DoDarkness(Amount: Integer);
procedure DoSaturation(Amount: Integer);
procedure DoSplitBlur(Amount: Integer);
procedure DoGaussianBlur(Amount: Integer);
procedure DoMosaic(Size: Integer);
procedure DoTwist(Amount: Integer);
procedure DoSplitlight(Amount: Integer);
procedure DoTile(Amount: Integer);
procedure DoSpotLight(Amount: Integer; Spot: TRect);
procedure DoTrace(Amount: Integer);
procedure DoEmboss;
procedure DoSolorize(Amount: Integer);
procedure DoPosterize(Amount: Integer);
procedure DoBrightness(Amount: Integer);
procedure DoResample(AmountX, AmountY: Integer; TypeResample: TFilterTypeResample);
{rotate}
procedure DoSmoothRotate(Src: TDIB; cx, cy: Integer; Angle: Extended);
procedure DoColorize(ForeColor, BackColor: TColor);
{Simple explosion spoke effect}
procedure DoNovaEffect(const sr, sg, sb, cx, cy, radius,
nspokes, randomhue, randomspok, randgauss: Integer; onProgress: TProgressEvent);
 
{Simple Mandelbrot-set drawing}
procedure DrawMandelbrot(ao, au: Integer; bo, bu: Double);
 
{Sephia effect}
procedure SephiaEffect(Depth: Integer{$IFDEF VER4UP} = 20{$ENDIF});
 
{Simple blend pixel}
procedure BlendPixel(const X, Y: Integer; aColor: Cardinal; Alpha: Byte); {$IFDEF VER9UP}inline;{$ENDIF}
{Line in polar system}
procedure LinePolar(x, y: Integer; AngleInDegree, Length: extended;
Color: cardinal);
 
{special version Dark/Light procedure in percent}
procedure Darker(Percent: Integer);
procedure Lighter(Percent: Integer);
 
{Simple graphical crypt}
procedure EncryptDecrypt(const Key: Integer);
 
{ Standalone DXFusion }
{--- c o n F u s i o n ---}
{By Joakim Back, www.back.mine.nu}
{Huge thanks to Ilkka Tuomioja for helping out with the project.}
 
{
modified by (c) 2005 Jaro Benes for DelphiX use.
}
 
procedure CreateDIBFromBitmap(const Bitmap: TBitmap);
{Drawing Methods.}
procedure DrawOn(Dest: TRect; DestCanvas: TCanvas;
Xsrc, Ysrc: Integer);
procedure DrawTo(SrcDIB: TDIB; X, Y, Width, Height, SourceX,
SourceY: Integer);
procedure DrawTransparent(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor); {$IFDEF VER5UP} reintroduce;{$ENDIF} //{$IFDEF VER9UP} overload;{$ENDIF}
procedure DrawShadow(SrcDIB: TDIB; X, Y, Width, Height, Frame: Integer;
FilterMode: TFilterMode);
procedure DrawShadows(SrcDIB: TDIB; X, Y, Width, Height, Frame: Integer;
Alpha: Byte);
procedure DrawDarken(SrcDIB: TDIB; X, Y, Width, Height,
Frame: Integer);
procedure DrawAdditive(SrcDIB: TDIB; X, Y, Width, Height: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF};
Frame: Integer{$IFDEF VER4UP} = 0{$ENDIF});
procedure DrawQuickAlpha(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor;
FilterMode: TFilterMode);
procedure DrawTranslucent(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor);
procedure DrawMorphed(SrcDIB: TDIB; const X, Y, Width, Height, SourceX,
SourceY: Integer; const Color: TColor);
procedure DrawAlpha(SrcDIB: TDIB; const X, Y, Width, Height, SourceX,
SourceY, Alpha: Integer; const Color: TColor);
procedure DrawAlphaMask(SrcDIB, MaskDIB: TDIB; const X, Y, Width,
Height, SourceX, SourceY: Integer);
procedure DrawAntialias(SrcDIB: TDIB);
procedure Draw3x3Matrix(SrcDIB: TDIB; Setting: TMatrixSetting);
procedure DrawMono(SrcDIB: TDIB; const X, Y, Width, Height, SourceX,
SourceY: Integer; const TransColor, ForeColor, BackColor: TColor);
{One-color Filters.}
procedure FilterLine(X1, Y1, X2, Y2: Integer; Color: TColor;
FilterMode: TFilterMode); {$IFDEF VER9UP}inline;{$ENDIF}
procedure FilterRect(X, Y, Width, Height: Integer; Color: TColor;
FilterMode: TFilterMode); {$IFDEF VER9UP}inline;{$ENDIF}
{ Lightsource. }
procedure InitLight(Count, Detail: Integer);
procedure DrawLights(FLight: TLightArray; AmbientLight: TColor);
//
// effect for special purpose
//
procedure FadeOut(DIB2: TDIB; Step: Byte); {$IFDEF VER9UP} inline; {$ENDIF}
procedure DoZoom(DIB2: TDIB; ZoomRatio: Real);
procedure DoBlur(DIB2: TDIB);
procedure FadeIn(DIB2: TDIB; Step: Byte); {$IFDEF VER9UP} inline; {$ENDIF}
procedure FillDIB8(Color: Byte); {$IFDEF VER9UP} inline; {$ENDIF}
procedure DoRotate(DIB1: TDIB; cX, cY, Angle: Integer);
procedure Distort(DIB1: TDIB; dt: TDistortType; cX, cY, Angle: Integer; Factor: Real);
function Ink(DIB: TDIB; const SprayInit: Boolean; const AmountSpray: Integer): Boolean;
// lines
procedure AntialiasedLine(x1, y1, x2, y2: Integer; color: TColor); {$IFDEF VER9UP} inline; {$ENDIF}
function GetColorBetween(StartColor, EndColor: TColor; Pointvalue,
FromPoint, ToPoint: Extended): TColor;
procedure ColoredLine(const iStart, iEnd: TPoint; iColorStyle: TColorLineStyle;
iGradientFrom, iGradientTo: TColor; iPixelGeometry: TColorLinePixelGeometry;
iRadius: WORD);
// standard property
property BitCount: Integer read FBitCount write SetBitCount;
property BitmapInfo: PBitmapInfo read GetBitmapInfo;
property BitmapInfoSize: Integer read GetBitmapInfoSize;
427,15 → 174,8
property TopPBitsReadOnly: Pointer read GetTopPBitsReadOnly;
property Width: Integer read FWidth write SetWidth;
property WidthBytes: Integer read FWidthBytes;
property AlphaChannel: TDIB read GetAlphaChannel write SetAlphaChannel;
property RGBChannel: TDIB read GetRGBChannel write SetRGBChannel;
function CreateBitmapFromDIB: TBitmap;
procedure Fill(aColor: TColor);
property ClientRect: TRect read GetClientRect;
end;
 
{ TDIBitmap }
 
TDIBitmap = class(TDIB) end;
 
{ TCustomDXDIB }
495,10 → 235,10
 
TDXPaintBox = class(TCustomDXPaintBox)
published
{$IFDEF VER4UP}property Anchors; {$ENDIF}
{$IFDEF DelphiX_Spt4}property Anchors;{$ENDIF}
property AutoStretch;
property Center;
{$IFDEF VER4UP}property Constraints; {$ENDIF}
{$IFDEF DelphiX_Spt4}property Constraints;{$ENDIF}
property DIB;
property KeepAspect;
property Stretch;
521,172 → 261,67
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF VER9UP}property OnMouseWheel; {$ENDIF}
{$IFDEF VER9UP}property OnResize; {$ENDIF}
{$IFDEF VER9UP}property OnCanResize; {$ENDIF}
{$IFDEF VER9UP}property OnContextPopup; {$ENDIF}
property OnStartDrag;
end;
 
const
DefaultFilterRadius: array[TFilterTypeResample] of Single = (0.5, 1, 1, 1.5, 2, 3, 2);
function MakeDIBPixelFormat(RBitCount, GBitCount, BBitCount: Integer): TDIBPixelFormat;
function MakeDIBPixelFormatMask(RBitMask, GBitMask, BBitMask: Integer): TDIBPixelFormat;
function pfRGB(const PixelFormat: TDIBPixelFormat; R, G, B: Byte): DWORD;
procedure pfGetRGB(const PixelFormat: TDIBPixelFormat; Color: DWORD; var R, G, B: Byte);
function pfGetRValue(const PixelFormat: TDIBPixelFormat; Color: DWORD): Byte;
function pfGetGValue(const PixelFormat: TDIBPixelFormat; Color: DWORD): Byte;
function pfGetBValue(const PixelFormat: TDIBPixelFormat; Color: DWORD): Byte;
 
function MakeDIBPixelFormat(RBitCount, GBitCount, BBitCount: Integer): TDIBPixelFormat; {$IFDEF VER9UP}inline;{$ENDIF}
function MakeDIBPixelFormatMask(RBitMask, GBitMask, BBitMask: Integer): TDIBPixelFormat; {$IFDEF VER9UP}inline;{$ENDIF}
function pfRGB(const PixelFormat: TDIBPixelFormat; R, G, B: Byte): DWORD; {$IFDEF VER9UP}inline;{$ENDIF}
procedure pfGetRGB(const PixelFormat: TDIBPixelFormat; Color: DWORD; var R, G, B: Byte); {$IFDEF VER9UP}inline;{$ENDIF}
function pfGetRValue(const PixelFormat: TDIBPixelFormat; Color: DWORD): Byte; {$IFDEF VER9UP}inline;{$ENDIF}
function pfGetGValue(const PixelFormat: TDIBPixelFormat; Color: DWORD): Byte; {$IFDEF VER9UP}inline;{$ENDIF}
function pfGetBValue(const PixelFormat: TDIBPixelFormat; Color: DWORD): Byte; {$IFDEF VER9UP}inline;{$ENDIF}
 
function GreyscaleColorTable: TRGBQuads;
 
function RGBQuad(R, G, B: Byte): TRGBQuad; {$IFDEF VER9UP}inline;{$ENDIF}
function PaletteEntryToRGBQuad(const Entry: TPaletteEntry): TRGBQuad; {$IFDEF VER9UP}inline;{$ENDIF}
function PaletteEntriesToRGBQuads(const Entries: TPaletteEntries): TRGBQuads; {$IFDEF VER9UP}inline;{$ENDIF}
function RGBQuadToPaletteEntry(const RGBQuad: TRGBQuad): TPaletteEntry; {$IFDEF VER9UP}inline;{$ENDIF}
function RGBQuadsToPaletteEntries(const RGBQuads: TRGBQuads): TPaletteEntries; {$IFDEF VER9UP}inline;{$ENDIF}
function RGBQuad(R, G, B: Byte): TRGBQuad;
function PaletteEntryToRGBQuad(const Entry: TPaletteEntry): TRGBQuad;
function PaletteEntriesToRGBQuads(const Entries: TPaletteEntries): TRGBQuads;
function RGBQuadToPaletteEntry(const RGBQuad: TRGBQuad): TPaletteEntry;
function RGBQuadsToPaletteEntries(const RGBQuads: TRGBQuads): TPaletteEntries;
 
function PosValue(Value: Integer): Integer;
 
type
TOC = 0..511;
function DSin(const C: TOC): Single; {$IFDEF VER9UP}inline; {$ENDIF}
function DCos(const C: TOC): Single; {$IFDEF VER9UP}inline; {$ENDIF}
 
{ Added Constants for TFilter Type }
const
EdgeFilter: TFilter = ((-1, -1, -1), (-1, 8, -1), (-1, -1, -1));
StrongOutlineFilter: TFilter = ((-100, 0, 0), (0, 0, 0), (0, 0, 100));
Enhance3DFilter: TFilter = ((-100, 5, 5), (5, 5, 5), (5, 5, 100));
LinearFilter: TFilter = ((-40, -40, -40), (-40, 255, -40), (-40, -40, -40));
GranularFilter: TFilter = ((-20, 5, 20), (5, -10, 5), (100, 5, -100));
SharpFilter: TFilter = ((-2, -2, -2), (-2, 20, -2), (-2, -2, -2));
{ End of constants }
 
{ Added Constants for DXFusion Type }
const
{ 3x3 Matrix Presets. }
msEmboss: TMatrixSetting = (-1, -1, 0, -1, 6, 1, 0, 1, 1, 6);
msHardEmboss: TMatrixSetting = (-4, -2, -1, -2, 10, 2, -1, 2, 4, 8);
msBlur: TMatrixSetting = (1, 2, 1, 2, 4, 2, 1, 2, 1, 16);
msSharpen: TMatrixSetting = (-1, -1, -1, -1, 15, -1, -1, -1, -1, 7);
msEdgeDetect: TMatrixSetting = (-1, -1, -1, -1, 8, -1, -1, -1, -1, 1);
 
{Proportionaly scale of size, for recountin image sizes}
function GetScale(SourceWidth, SourceHeight, TargetWidth, TargetHeight: Integer): Single; {$IFDEF VER9UP}inline;{$ENDIF}
 
procedure MakeDib(out DIB: TDIB; const iWidth, iHeight, iBitCount: Integer; iFillColor: TColor{$IFDEF VER4UP} = clBlack{$ENDIF}); {$IFDEF VER4UP}overload; {$ENDIF}
procedure{$IFDEF VER4UP}MakeDib{$ELSE}MakeDIB2{$ENDIF}(out DIB: TDIB; iBitmap: TBitmap); {$IFDEF VER4UP}overload; {$ENDIF}
procedure MakeDIB32MaskByColor(var D: TDIB; const MaskColor: TColor{$IFDEF VER4UP} = clWhite{$ENDIF});
 
function BGR(B, G, R: Byte): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
 
implementation
 
uses DXConsts, {$IFDEF PNG_GRAPHICS}pngimage,{$ENDIF} jpeg;
uses DXConsts;
 
function BGR(B, G, R: Byte): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
begin
Result := (B shl 16) or (G shl 8) or R;
end;
 
procedure MakeDIB32MaskByColor(var D: TDIB; const MaskColor: TColor{$IFDEF VER4UP} = clWhite{$ENDIF});
type
PRGBA = ^TRGBA;
TRGBA = array[0..0] of Windows.TRGBQuad;
var
p: PRGBA;
y: Integer;
x: Integer;
B: TDIB;
begin
MakeDib(B, D.Width, D.Height, 32, $FFFFFF);
B.RGBChannel := D.RGBChannel;
if B.BitCount = 32 then
for Y := 0 to B.Height - 1 do
begin
p := B.ScanLine[Y];
for X := 0 to B.Width - 1 do
begin
if (p[X].rgbBlue = GetBValue(MaskColor)) and (p[X].rgbGreen = GetGValue(MaskColor)) and (p[X].rgbRed = GetRValue(MaskColor)) then
p[X].rgbReserved := 0
else
p[X].rgbReserved := $FF
end
end;
d.Assign(B);
end;
 
function GetScale(SourceWidth, SourceHeight, TargetWidth, TargetHeight: Integer): Single;
var
XScale, YScale: Single;
begin
XScale := 1;
YScale := 1;
if TargetWidth < SourceWidth then
XScale := TargetWidth / SourceWidth;
if TargetHeight < SourceHeight then
YScale := TargetHeight / SourceHeight;
Result := XScale;
if YScale < Result then
Result := YScale;
end;
 
{$IFNDEF VER4UP}
function Max(B1, B2: Integer): Integer;
begin
if B1 >= B2 then Result := B1 else Result := B2;
if B1>=B2 then Result := B1 else Result := B2;
end;
 
function Min(B1, B2: Integer): Integer;
begin
if B1 <= B2 then Result := B1 else Result := B2;
end;
{$ENDIF}
 
function DSin(const C: TOC): Single; {$IFDEF VER9UP}inline; {$ENDIF}
begin
Result := sin(((c * 360) / 511) * Pi / 180);
end;
 
function DCos(const C: TOC): Single; {$IFDEF VER9UP}inline; {$ENDIF}
begin
Result := cos(((c * 360) / 511) * Pi / 180);
end;
 
function MakeDIBPixelFormat(RBitCount, GBitCount, BBitCount: Integer): TDIBPixelFormat;
begin
Result.RBitMask := ((1 shl RBitCount) - 1) shl (GBitCount + BBitCount);
Result.GBitMask := ((1 shl GBitCount) - 1) shl (BBitCount);
Result.BBitMask := (1 shl BBitCount) - 1;
Result.RBitMask := ((1 shl RBitCount)-1) shl (GBitCount+BBitCount);
Result.GBitMask := ((1 shl GBitCount)-1) shl (BBitCount);
Result.BBitMask := (1 shl BBitCount)-1;
Result.RBitCount := RBitCount;
Result.GBitCount := GBitCount;
Result.BBitCount := BBitCount;
Result.RBitCount2 := 8 - RBitCount;
Result.GBitCount2 := 8 - GBitCount;
Result.BBitCount2 := 8 - BBitCount;
Result.RShift := (GBitCount + BBitCount) - (8 - RBitCount);
Result.GShift := BBitCount - (8 - GBitCount);
Result.BShift := 8 - BBitCount;
Result.RBitCount2 := 8-RBitCount;
Result.GBitCount2 := 8-GBitCount;
Result.BBitCount2 := 8-BBitCount;
Result.RShift := (GBitCount+BBitCount)-(8-RBitCount);
Result.GShift := BBitCount-(8-GBitCount);
Result.BShift := 8-BBitCount;
end;
 
function GetBitCount(b: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
var
i: Integer;
begin
i := 0;
while (i < 31) and (((1 shl i) and b) = 0) do Inc(i);
function MakeDIBPixelFormatMask(RBitMask, GBitMask, BBitMask: Integer): TDIBPixelFormat;
 
Result := 0;
while ((1 shl i) and b) <> 0 do
function GetBitCount(b: Integer): Integer;
var
i: Integer;
begin
Inc(i);
Inc(Result);
i := 0;
while (i<31) and (((1 shl i) and b)=0) do Inc(i);
 
Result := 0;
while ((1 shl i) and b)<>0 do
begin
Inc(i);
Inc(Result);
end;
end;
end;
 
function MakeDIBPixelFormatMask(RBitMask, GBitMask, BBitMask: Integer): TDIBPixelFormat;
begin
Result := MakeDIBPixelFormat(GetBitCount(RBitMask), GetBitCount(GBitMask),
GetBitCount(BBitMask));
717,7 → 352,7
with PixelFormat do
begin
Result := (Color and RBitMask) shr RShift;
Result := Result or (Result shr RBitCount2);
Result := Result or (Result shr RBitCount);
end;
end;
 
726,7 → 361,7
with PixelFormat do
begin
Result := (Color and GBitMask) shr GShift;
Result := Result or (Result shr GBitCount2);
Result := Result or (Result shr GBitCount);
end;
end;
 
735,7 → 370,7
with PixelFormat do
begin
Result := (Color and BBitMask) shl BShift;
Result := Result or (Result shr BBitCount2);
Result := Result or (Result shr BBitCount);
end;
end;
 
743,7 → 378,7
var
i: Integer;
begin
for i := 0 to 255 do
for i:=0 to 255 do
with Result[i] do
begin
rgbRed := i;
780,7 → 415,7
var
i: Integer;
begin
for i := 0 to 255 do
for i:=0 to 255 do
Result[i] := PaletteEntryToRGBQuad(Entries[i]);
end;
 
800,7 → 435,7
var
i: Integer;
begin
for i := 0 to 255 do
for i:=0 to 255 do
Result[i] := RGBQuadToPaletteEntry(RGBQuads[i]);
end;
 
812,8 → 447,6
RBitMask, GBitMask, BBitMask: DWORD;
end;
 
{ TPaletteItem }
 
TPaletteItem = class(TCollectionItem)
private
ID: Integer;
823,11 → 456,9
ColorTableCount: Integer;
destructor Destroy; override;
procedure AddRef;
procedure Release; {$IFDEF VER17UP}reintroduce;{$ENDIF}
procedure Release;
end;
 
{ TPaletteManager }
 
TPaletteManager = class
private
FList: TCollection;
837,8 → 468,6
procedure DeletePalette(var Palette: HPalette);
end;
 
{ TPaletteItem }
 
destructor TPaletteItem.Destroy;
begin
DeleteObject(Palette);
853,11 → 482,9
procedure TPaletteItem.Release;
begin
Dec(RefCount);
if RefCount <= 0 then Free;
if RefCount<=0 then Free;
end;
 
{ TPaletteManager }
 
constructor TPaletteManager.Create;
begin
inherited Create;
884,7 → 511,7
begin
{ Hash key making }
ID := ColorTableCount;
for i := 0 to ColorTableCount - 1 do
for i:=0 to ColorTableCount-1 do
with ColorTable[i] do
begin
Inc(ID, rgbRed);
893,11 → 520,11
end;
 
{ Does the same palette already exist? }
for i := 0 to FList.Count - 1 do
for i:=0 to FList.Count-1 do
begin
Item := TPaletteItem(FList.Items[i]);
if (Item.ID = ID) and (Item.ColorTableCount = ColorTableCount) and
CompareMem(@Item.ColorTable, @ColorTable, ColorTableCount * SizeOf(TRGBQuad)) then
if (Item.ID=ID) and (Item.ColorTableCount=ColorTableCount) and
CompareMem(@Item.ColorTable, @ColorTable, ColorTableCount*SizeOf(TRGBQuad)) then
begin
Item.AddRef; Result := Item.Palette;
Exit;
907,7 → 534,7
{ New palette making }
Item := TPaletteItem.Create(FList);
Item.ID := ID;
Move(ColorTable, Item.ColorTable, ColorTableCount * SizeOf(TRGBQuad));
Move(ColorTable, Item.ColorTable, ColorTableCount*SizeOf(TRGBQuad));
Item.ColorTableCount := ColorTableCount;
 
with LogPalette do
926,12 → 553,12
i: Integer;
Item: TPaletteItem;
begin
if Palette = 0 then Exit;
if Palette=0 then Exit;
 
for i := 0 to FList.Count - 1 do
for i:=0 to FList.Count-1 do
begin
Item := TPaletteItem(FList.Items[i]);
if (Item.Palette = Palette) then
if (Item.Palette=Palette) then
begin
Palette := 0;
Item.Release;
945,13 → 572,11
 
function PaletteManager: TPaletteManager;
begin
if FPaletteManager = nil then
if FPaletteManager=nil then
FPaletteManager := TPaletteManager.Create;
Result := FPaletteManager;
end;
 
{ TDIBSharedImage }
 
constructor TDIBSharedImage.Create;
begin
inherited Create;
967,34 → 592,29
InfoOfs: Integer;
UsePixelFormat: Boolean;
begin
{$IFNDEF D17UP}
{self recreation is not allowed here}
Create;
{$ENDIF}
 
{ Pixel format check }
case ABitCount of
1: if not ((PixelFormat.RBitMask = $FF0000) and (PixelFormat.GBitMask = $00FF00) and (PixelFormat.BBitMask = $0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
4: if not ((PixelFormat.RBitMask = $FF0000) and (PixelFormat.GBitMask = $00FF00) and (PixelFormat.BBitMask = $0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
8: if not ((PixelFormat.RBitMask = $FF0000) and (PixelFormat.GBitMask = $00FF00) and (PixelFormat.BBitMask = $0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
16:
begin
if not (((PixelFormat.RBitMask = $7C00) and (PixelFormat.GBitMask = $03E0) and (PixelFormat.BBitMask = $001F)) or
((PixelFormat.RBitMask = $F800) and (PixelFormat.GBitMask = $07E0) and (PixelFormat.BBitMask = $001F))) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
end;
24:
begin
if not ((PixelFormat.RBitMask = $FF0000) and (PixelFormat.GBitMask = $00FF00) and (PixelFormat.BBitMask = $0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
end;
32:
begin
if not ((PixelFormat.RBitMask = $FF0000) and (PixelFormat.GBitMask = $00FF00) and (PixelFormat.BBitMask = $0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
end;
1 : if not ((PixelFormat.RBitMask=$FF0000) and (PixelFormat.GBitMask=$00FF00) and (PixelFormat.BBitMask=$0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
4 : if not ((PixelFormat.RBitMask=$FF0000) and (PixelFormat.GBitMask=$00FF00) and (PixelFormat.BBitMask=$0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
8 : if not ((PixelFormat.RBitMask=$FF0000) and (PixelFormat.GBitMask=$00FF00) and (PixelFormat.BBitMask=$0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
16: begin
if not (((PixelFormat.RBitMask=$7C00) and (PixelFormat.GBitMask=$03E0) and (PixelFormat.BBitMask=$001F)) or
((PixelFormat.RBitMask=$F800) and (PixelFormat.GBitMask=$07E0) and (PixelFormat.BBitMask=$001F))) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
end;
24: begin
if not ((PixelFormat.RBitMask=$FF0000) and (PixelFormat.GBitMask=$00FF00) and (PixelFormat.BBitMask=$0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
end;
32: begin
if not ((PixelFormat.RBitMask=$FF0000) and (PixelFormat.GBitMask=$00FF00) and (PixelFormat.BBitMask=$0000FF)) then
raise EInvalidGraphicOperation.Create(SInvalidDIBPixelFormat);
end;
else
raise EInvalidGraphicOperation.CreateFmt(SInvalidDIBBitCount, [ABitCount]);
end;
1002,21 → 622,21
FBitCount := ABitCount;
FHeight := AHeight;
FWidth := AWidth;
FWidthBytes := (((AWidth * ABitCount) + 31) shr 5) * 4;
FWidthBytes := (((AWidth*ABitCount)+31) shr 5) * 4;
FNextLine := -FWidthBytes;
FSize := FWidthBytes * FHeight;
FSize := FWidthBytes*FHeight;
UsePixelFormat := ABitCount in [16, 32];
 
FPixelFormat := PixelFormat;
 
FPaletteCount := 0;
if FBitCount <= 8 then
if FBitCount<=8 then
FPaletteCount := 1 shl FBitCount;
 
FBitmapInfoSize := SizeOf(TBitmapInfoHeader);
if UsePixelFormat then
Inc(FBitmapInfoSize, SizeOf(TLocalDIBPixelFormat));
Inc(FBitmapInfoSize, SizeOf(TRGBQuad) * FPaletteCount);
Inc(FBitmapInfoSize, SizeOf(TRGBQuad)*FPaletteCount);
 
GetMem(FBitmapInfo, FBitmapInfoSize);
FillChar(FBitmapInfo^, FBitmapInfoSize, 0);
1033,14 → 653,12
biCompression := BI_BITFIELDS
else
begin
biCompression := 0; //none
if (FBitCount = 4) and (Compressed) then
if (FBitCount=4) and (Compressed) then
biCompression := BI_RLE4
else if (FBitCount = 8) and (Compressed) then
else if (FBitCount=8) and (Compressed) then
biCompression := BI_RLE8
else
if FBitCount = 24 then
biCompression := BI_RGB;
biCompression := BI_RGB;
end;
biSizeImage := FSize;
biXPelsPerMeter := 0;
1052,7 → 670,7
 
if UsePixelFormat then
begin
with PLocalDIBPixelFormat(Integer(FBitmapInfo) + InfoOfs)^ do
with PLocalDIBPixelFormat(Integer(FBitmapInfo)+InfoOfs)^ do
begin
RBitMask := PixelFormat.RBitMask;
GBitMask := PixelFormat.GBitMask;
1065,7 → 683,7
FColorTablePos := InfoOfs;
 
FColorTable := ColorTable;
Move(FColorTable, Pointer(Integer(FBitmapInfo) + FColorTablePos)^, SizeOf(TRGBQuad) * FPaletteCount);
Move(FColorTable, Pointer(Integer(FBitmapInfo)+FColorTablePos)^, SizeOf(TRGBQuad)*FPaletteCount);
 
FCompressed := FBitmapInfo^.bmiHeader.biCompression in [BI_RLE4, BI_RLE8];
FMemoryImage := MemoryImage or FCompressed;
1076,15 → 694,14
if MemoryImage then
begin
FPBits := Pointer(GlobalAlloc(GMEM_FIXED, FSize));
if FPBits = nil then
if FPBits=nil then
OutOfMemoryError;
end
else
end else
begin
FDC := CreateCompatibleDC(0);
 
FHandle := CreateDIBSection(FDC, FBitmapInfo^, DIB_RGB_COLORS, FPBits, 0, 0);
if FHandle = 0 then
if FHandle=0 then
raise EOutOfResources.CreateFmt(SCannotMade, ['DIB']);
 
FOldHandle := SelectObject(FDC, FHandle);
1091,22 → 708,16
end;
end;
 
FTopPBits := Pointer(Integer(FPBits) + (FHeight - 1) * FWidthBytes);
FTopPBits := Pointer(Integer(FPBits)+(FHeight-1)*FWidthBytes);
end;
 
procedure TDIBSharedImage.Duplicate(Source: TDIBSharedImage; MemoryImage: Boolean);
begin
if Source = nil then Exit; //no source
if Source.FSize = 0 then
if Source.FSize=0 then
begin
{$IFNDEF D17UP}
{self recreation is not allowed here}
Create;
{$ENDIF}
FMemoryImage := MemoryImage;
end
else
end else
begin
NewImage(Source.FWidth, Source.FHeight, Source.FBitCount,
Source.FPixelFormat, Source.FColorTable, MemoryImage, Source.FCompressed);
1115,8 → 726,7
FBitmapInfo.bmiHeader.biSizeImage := Source.FBitmapInfo.bmiHeader.biSizeImage;
GetMem(FPBits, FBitmapInfo.bmiHeader.biSizeImage);
Move(Source.FPBits^, FPBits^, FBitmapInfo.bmiHeader.biSizeImage);
end
else
end else
begin
Move(Source.FPBits^, FPBits^, FBitmapInfo.bmiHeader.biSizeImage);
end;
1131,9 → 741,9
 
function AllocByte: PByte;
begin
if Size mod 4096 = 0 then
ReAllocMem(FPBits, Size + 4095);
Result := Pointer(Integer(FPBits) + Size);
if Size mod 4096=0 then
ReAllocMem(FPBits, Size+4095);
Result := Pointer(Integer(FPBits)+Size);
Inc(Size);
end;
 
1145,7 → 755,7
 
function GetPixel(x: Integer): Integer;
begin
if X and 1 = 0 then
if X and 1=0 then
Result := PArrayByte(Src)[X shr 1] shr 4
else
Result := PArrayByte(Src)[X shr 1] and $0F;
1154,23 → 764,23
begin
Size := 0;
 
for y := 0 to Source.FHeight - 1 do
for y:=0 to Source.FHeight-1 do
begin
x := 0;
Src := Pointer(Integer(Source.FPBits) + y * FWidthBytes);
while x < Source.FWidth do
Src := Pointer(Integer(Source.FPBits)+y*FWidthBytes);
while x<Source.FWidth do
begin
if (Source.FWidth - x > 3) and (GetPixel(x) = GetPixel(x + 2)) then
if (Source.FWidth-x>3) and (GetPixel(x)=GetPixel(x+2)) then
begin
{ Encoding mode }
B1 := 2;
B2 := (GetPixel(x) shl 4) or GetPixel(x + 1);
B2 := (GetPixel(x) shl 4) or GetPixel(x+1);
 
Inc(x, 2);
 
C := B2;
 
while (x < Source.FWidth) and (C and $F = GetPixel(x)) and (B1 < 255) do
while (x<Source.FWidth) and (C and $F=GetPixel(x)) and (B1<255) do
begin
Inc(B1);
Inc(x);
1179,65 → 789,62
 
AllocByte^ := B1;
AllocByte^ := B2;
end
else
if (Source.FWidth - x > 5) and ((GetPixel(x) <> GetPixel(x + 2)) or (GetPixel(x + 1) <> GetPixel(x + 3))) and
((GetPixel(x + 2) = GetPixel(x + 4)) and (GetPixel(x + 3) = GetPixel(x + 5))) then
begin
end else
if (Source.FWidth-x>5) and ((GetPixel(x)<>GetPixel(x+2)) or (GetPixel(x+1)<>GetPixel(x+3))) and
((GetPixel(x+2)=GetPixel(x+4)) and (GetPixel(x+3)=GetPixel(x+5))) then
begin
{ Encoding mode }
AllocByte^ := 2;
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x + 1);
Inc(x, 2);
end
else
AllocByte^ := 2;
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x+1);
Inc(x, 2);
end else
begin
if (Source.FWidth-x<4) then
begin
if (Source.FWidth - x < 4) then
{ Encoding mode }
while Source.FWidth-x>=2 do
begin
{ Encoding mode }
while Source.FWidth - x >= 2 do
begin
AllocByte^ := 2;
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x + 1);
Inc(x, 2);
end;
AllocByte^ := 2;
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x+1);
Inc(x, 2);
end;
 
if Source.FWidth - x = 1 then
begin
AllocByte^ := 1;
AllocByte^ := GetPixel(x) shl 4;
Inc(x);
end;
end
else
if Source.FWidth-x=1 then
begin
AllocByte^ := 1;
AllocByte^ := GetPixel(x) shl 4;
Inc(x);
end;
end else
begin
{ Absolute mode }
PB1 := Size; AllocByte;
PB2 := Size; AllocByte;
PB1 := Size; AllocByte;
PB2 := Size; AllocByte;
 
B1 := 0;
B2 := 4;
B1 := 0;
B2 := 4;
 
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x + 1);
AllocByte^ := (GetPixel(x + 2) shl 4) or GetPixel(x + 3);
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x+1);
AllocByte^ := (GetPixel(x+2) shl 4) or GetPixel(x+3);
 
Inc(x, 4);
Inc(x, 4);
 
while (x + 1 < Source.FWidth) and (B2 < 254) do
begin
if (Source.FWidth - x > 3) and (GetPixel(x) = GetPixel(x + 2)) and (GetPixel(x + 1) = GetPixel(x + 3)) then
Break;
while (x+1<Source.FWidth) and (B2<254) do
begin
if (Source.FWidth-x>3) and (GetPixel(x)=GetPixel(x+2)) and (GetPixel(x+1)=GetPixel(x+3)) then
Break;
 
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x + 1);
Inc(B2, 2);
Inc(x, 2);
end;
AllocByte^ := (GetPixel(x) shl 4) or GetPixel(x+1);
Inc(B2, 2);
Inc(x, 2);
end;
 
PByte(Integer(FPBits) + PB1)^ := B1;
PByte(Integer(FPBits) + PB2)^ := B2;
end;
PByte(Integer(FPBits)+PB1)^ := B1;
PByte(Integer(FPBits)+PB2)^ := B2;
end;
end;
 
if Size and 1 = 1 then AllocByte;
if Size and 1=1 then AllocByte;
end;
 
{ End of line }
1259,9 → 866,9
 
function AllocByte: PByte;
begin
if Size mod 4096 = 0 then
ReAllocMem(FPBits, Size + 4095);
Result := Pointer(Integer(FPBits) + Size);
if Size mod 4096=0 then
ReAllocMem(FPBits, Size+4095);
Result := Pointer(Integer(FPBits)+Size);
Inc(Size);
end;
 
1273,13 → 880,13
begin
Size := 0;
 
for y := 0 to Source.FHeight - 1 do
for y:=0 to Source.FHeight-1 do
begin
x := 0;
Src := Pointer(Integer(Source.FPBits) + y * FWidthBytes);
while x < Source.FWidth do
Src := Pointer(Integer(Source.FPBits)+y*FWidthBytes);
while x<Source.FWidth do
begin
if (Source.FWidth - x > 2) and (Src^ = PByte(Integer(Src) + 1)^) then
if (Source.FWidth-x>2) and (Src^=PByte(Integer(Src)+1)^) then
begin
{ Encoding mode }
B1 := 2;
1288,7 → 895,7
Inc(x, 2);
Inc(Src, 2);
 
while (x < Source.FWidth) and (Src^ = B2) and (B1 < 255) do
while (x<Source.FWidth) and (Src^=B2) and (B1<255) do
begin
Inc(B1);
Inc(x);
1297,67 → 904,63
 
AllocByte^ := B1;
AllocByte^ := B2;
end
else
if (Source.FWidth - x > 2) and (Src^ <> PByte(Integer(Src) + 1)^) and (PByte(Integer(Src) + 1)^ = PByte(Integer(Src) + 2)^) then
begin
end else
if (Source.FWidth-x>2) and (Src^<>PByte(Integer(Src)+1)^) and (PByte(Integer(Src)+1)^=PByte(Integer(Src)+2)^) then
begin
{ Encoding mode }
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
Inc(x);
end
else
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
Inc(x);
end else
begin
if (Source.FWidth-x<4) then
begin
if (Source.FWidth - x < 4) then
{ Encoding mode }
if Source.FWidth-x=2 then
begin
{ Encoding mode }
if Source.FWidth - x = 2 then
begin
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
 
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
Inc(x, 2);
end
else
begin
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
Inc(x);
end;
end
else
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
Inc(x, 2);
end else
begin
AllocByte^ := 1;
AllocByte^ := Src^; Inc(Src);
Inc(x);
end;
end else
begin
{ Absolute mode }
PB1 := Size; AllocByte;
PB2 := Size; AllocByte;
PB1 := Size; AllocByte;
PB2 := Size; AllocByte;
 
B1 := 0;
B2 := 3;
B1 := 0;
B2 := 3;
 
Inc(x, 3);
Inc(x, 3);
 
AllocByte^ := Src^; Inc(Src);
AllocByte^ := Src^; Inc(Src);
AllocByte^ := Src^; Inc(Src);
AllocByte^ := Src^; Inc(Src);
AllocByte^ := Src^; Inc(Src);
AllocByte^ := Src^; Inc(Src);
 
while (x < Source.FWidth) and (B2 < 255) do
begin
if (Source.FWidth - x > 3) and (Src^ = PByte(Integer(Src) + 1)^) and (Src^ = PByte(Integer(Src) + 2)^) and (Src^ = PByte(Integer(Src) + 3)^) then
Break;
while (x<Source.FWidth) and (B2<255) do
begin
if (Source.FWidth-x>3) and (Src^=PByte(Integer(Src)+1)^) and (Src^=PByte(Integer(Src)+2)^) and (Src^=PByte(Integer(Src)+3)^) then
Break;
 
AllocByte^ := Src^; Inc(Src);
Inc(B2);
Inc(x);
end;
AllocByte^ := Src^; Inc(Src);
Inc(B2);
Inc(x);
end;
 
PByte(Integer(FPBits) + PB1)^ := B1;
PByte(Integer(FPBits) + PB2)^ := B2;
end;
PByte(Integer(FPBits)+PB1)^ := B1;
PByte(Integer(FPBits)+PB2)^ := B2;
end;
end;
 
if Size and 1 = 1 then AllocByte;
if Size and 1=1 then AllocByte;
end;
 
{ End of line }
1376,8 → 979,7
begin
if Source.FCompressed then
Duplicate(Source, Source.FMemoryImage)
else
begin
else begin
NewImage(Source.FWidth, Source.FHeight, Source.FBitCount,
Source.FPixelFormat, Source.FColorTable, True, True);
case FBitmapInfo.bmiHeader.biCompression of
1406,36 → 1008,35
B1 := Src^; Inc(Src);
B2 := Src^; Inc(Src);
 
if B1 = 0 then
if B1=0 then
begin
case B2 of
0: begin { End of line }
X := 0;
Inc(Y);
end;
0: begin { End of line }
X := 0;
Inc(Y);
end;
1: Break; { End of bitmap }
2: begin { Difference of coordinates }
Inc(X, B1);
Inc(Y, B2); Inc(Src, 2);
end;
2: begin { Difference of coordinates }
Inc(X, B1);
Inc(Y, B2); Inc(Src, 2);
end;
else
{ Absolute mode }
Dest := Pointer(Longint(FPBits) + Y * FWidthBytes);
Dest := Pointer(Longint(FPBits)+Y*FWidthBytes);
 
C := 0;
for i := 0 to B2 - 1 do
for i:=0 to B2-1 do
begin
if i and 1 = 0 then
if i and 1=0 then
begin
C := Src^; Inc(Src);
end
else
end else
begin
C := C shl 4;
end;
 
P := Pointer(Integer(Dest) + X shr 1);
if X and 1 = 0 then
P := Pointer(Integer(Dest)+X shr 1);
if X and 1=0 then
P^ := (P^ and $0F) or (C and $F0)
else
P^ := (P^ and $F0) or ((C and $F0) shr 4);
1443,16 → 1044,15
Inc(X);
end;
end;
end
else
end else
begin
{ Encoding mode }
Dest := Pointer(Longint(FPBits) + Y * FWidthBytes);
Dest := Pointer(Longint(FPBits)+Y*FWidthBytes);
 
for i := 0 to B1 - 1 do
for i:=0 to B1-1 do
begin
P := Pointer(Integer(Dest) + X shr 1);
if X and 1 = 0 then
P := Pointer(Integer(Dest)+X shr 1);
if X and 1=0 then
P^ := (P^ and $0F) or (B2 and $F0)
else
P^ := (P^ and $F0) or ((B2 and $F0) shr 4);
1485,24 → 1085,23
B1 := Src^; Inc(Src);
B2 := Src^; Inc(Src);
 
if B1 = 0 then
if B1=0 then
begin
case B2 of
0: begin { End of line }
X := 0; Inc(Y);
Dest := Pointer(Longint(FPBits) + Y * FWidthBytes + X);
end;
0: begin { End of line }
X := 0; Inc(Y);
Dest := Pointer(Longint(FPBits)+Y*FWidthBytes+X);
end;
1: Break; { End of bitmap }
2: begin { Difference of coordinates }
Inc(X, B1); Inc(Y, B2); Inc(Src, 2);
Dest := Pointer(Longint(FPBits) + Y * FWidthBytes + X);
end;
2: begin { Difference of coordinates }
Inc(X, B1); Inc(Y, B2); Inc(Src, 2);
Dest := Pointer(Longint(FPBits)+Y*FWidthBytes+X);
end;
else
{ Absolute mode }
Move(Src^, Dest^, B2); Inc(Dest, B2); Inc(Src, B2);
end;
end
else
end else
begin
{ Encoding mode }
FillChar(Dest^, B1, B2); Inc(Dest, B1);
1516,8 → 1115,7
begin
if not Source.FCompressed then
Duplicate(Source, MemoryImage)
else
begin
else begin
NewImage(Source.FWidth, Source.FHeight, Source.FBitCount,
Source.FPixelFormat, Source.FColorTable, MemoryImage, False);
case Source.FBitmapInfo.bmiHeader.biCompression of
1525,7 → 1123,7
BI_RLE8: DecodeRLE8;
else
Duplicate(Source, MemoryImage);
end;
end;
end;
end;
 
1538,7 → 1136,6
procedure LoadRLE4;
begin
FSize := BI.biSizeImage;
//GetMem(FPBits, FSize);
FPBits := GlobalAllocPtr(GMEM_FIXED, FSize);
FBitmapInfo.bmiHeader.biSizeImage := FSize;
Stream.ReadBuffer(FPBits^, FSize);
1547,7 → 1144,6
procedure LoadRLE8;
begin
FSize := BI.biSizeImage;
//GetMem(FPBits, FSize);
FPBits := GlobalAllocPtr(GMEM_FIXED, FSize);
FBitmapInfo.bmiHeader.biSizeImage := FSize;
Stream.ReadBuffer(FPBits^, FSize);
1557,12 → 1153,11
var
y: Integer;
begin
if BI.biHeight < 0 then
if BI.biHeight<0 then
begin
for y := 0 to Abs(BI.biHeight) - 1 do
Stream.ReadBuffer(Pointer(Integer(FTopPBits) + y * FNextLine)^, FWidthBytes);
end
else
for y:=0 to Abs(BI.biHeight)-1 do
Stream.ReadBuffer(Pointer(Integer(FTopPBits)+y*FNextLine)^, FWidthBytes);
end else
begin
Stream.ReadBuffer(FPBits^, FSize);
end;
1575,20 → 1170,15
AColorTable: TRGBQuads;
APixelFormat: TDIBPixelFormat;
begin
if not Assigned(Stream) then Exit;
{ Header size reading }
i := Stream.Read(BI.biSize, 4);
 
if i = 0 then
if i=0 then
begin
{$IFNDEF D17UP}
{self recreation is not allowed here}
Create;
{$ENDIF}
Exit;
end;
if i <> 4 then
if i<>4 then
raise EInvalidGraphic.Create(SInvalidDIB);
 
{ Kind check of DIB }
1598,7 → 1188,7
SizeOf(TBitmapCoreHeader):
begin
{ OS/2 type }
Stream.ReadBuffer(Pointer(Integer(@BC) + 4)^, SizeOf(TBitmapCoreHeader) - 4);
Stream.ReadBuffer(Pointer(Integer(@BC)+4)^, SizeOf(TBitmapCoreHeader)-4);
 
with BI do
begin
1614,7 → 1204,7
SizeOf(TBitmapInfoHeader):
begin
{ Windows type }
Stream.ReadBuffer(Pointer(Integer(@BI) + 4)^, SizeOf(TBitmapInfoHeader) - 4);
Stream.ReadBuffer(Pointer(Integer(@BI)+4)^, SizeOf(TBitmapInfoHeader)-4);
end;
else
raise EInvalidGraphic.Create(SInvalidDIB);
1626,12 → 1216,11
Stream.ReadBuffer(Localpf, SizeOf(Localpf));
with Localpf do
APixelFormat := MakeDIBPixelFormatMask(RBitMask, GBitMask, BBitMask);
end
else
end else
begin
if BI.biBitCount = 16 then
if BI.biBitCount=16 then
APixelFormat := MakeDIBPixelFormat(5, 5, 5)
else if BI.biBitCount = 32 then
else if BI.biBitCount=32 then
APixelFormat := MakeDIBPixelFormat(8, 8, 8)
else
APixelFormat := MakeDIBPixelFormat(8, 8, 8);
1639,9 → 1228,9
 
{ Palette reading }
PalCount := BI.biClrUsed;
if (PalCount = 0) and (BI.biBitCount <= 8) then
if (PalCount=0) and (BI.biBitCount<=8) then
PalCount := 1 shl BI.biBitCount;
if PalCount > 256 then PalCount := 256;
if PalCount>256 then PalCount := 256;
 
FillChar(AColorTable, SizeOf(AColorTable), 0);
 
1648,28 → 1237,27
if OS2 then
begin
{ OS/2 type }
Stream.ReadBuffer(BCRGB, SizeOf(TRGBTriple) * PalCount);
for i := 0 to PalCount - 1 do
Stream.ReadBuffer(BCRGB, SizeOf(TRGBTriple)*PalCount);
for i:=0 to PalCount-1 do
begin
with BCRGB[i] do
AColorTable[i] := RGBQuad(rgbtRed, rgbtGreen, rgbtBlue);
end;
end
else
end else
begin
{ Windows type }
Stream.ReadBuffer(AColorTable, SizeOf(TRGBQuad) * PalCount);
Stream.ReadBuffer(AColorTable, SizeOf(TRGBQuad)*PalCount);
end;
 
{ DIB compilation }
{ DIB ì¬ }
NewImage(BI.biWidth, Abs(BI.biHeight), BI.biBitCount, APixelFormat, AColorTable,
MemoryImage, BI.biCompression in [BI_RLE4, BI_RLE8]);
 
{ Pixel data reading }
case BI.biCompression of
BI_RGB: LoadRGB;
BI_RLE4: LoadRLE4;
BI_RLE8: LoadRLE8;
BI_RGB : LoadRGB;
BI_RLE4 : LoadRLE4;
BI_RLE8 : LoadRLE8;
BI_BITFIELDS: LoadRGB;
else
raise EInvalidGraphic.Create(SInvalidDIB);
1678,20 → 1266,18
 
destructor TDIBSharedImage.Destroy;
begin
if FHandle <> 0 then
if FHandle<>0 then
begin
if FOldHandle <> 0 then SelectObject(FDC, FOldHandle);
if FOldHandle<>0 then SelectObject(FDC, FOldHandle);
DeleteObject(FHandle);
end
else
// GlobalFree(THandle(FPBits));
end else
begin
if FPBits <> nil then
if FPBits<>nil then
GlobalFreePtr(FPBits);
end;
 
PaletteManager.DeletePalette(FPalette);
if FDC <> 0 then DeleteDC(FDC);
if FDC<>0 then DeleteDC(FDC);
 
FreeMem(FBitmapInfo);
inherited Destroy;
1703,7 → 1289,7
 
function TDIBSharedImage.GetPalette: THandle;
begin
if FPaletteCount > 0 then
if FPaletteCount>0 then
begin
if FChangePalette then
begin
1721,10 → 1307,10
FColorTable := Value;
FChangePalette := True;
 
if (FSize > 0) and (FPaletteCount > 0) then
if (FSize>0) and (FPaletteCount>0) then
begin
SetDIBColorTable(FDC, 0, 256, FColorTable);
Move(FColorTable, Pointer(Integer(FBitmapInfo) + FColorTablePos)^, SizeOf(TRGBQuad) * FPaletteCount);
Move(FColorTable, Pointer(Integer(FBitmapInfo)+FColorTablePos)^, SizeOf(TRGBQuad)*FPaletteCount);
end;
end;
 
1735,7 → 1321,7
 
function EmptyDIBImage: TDIBSharedImage;
begin
if FEmptyDIBImage = nil then
if FEmptyDIBImage=nil then
begin
FEmptyDIBImage := TDIBSharedImage.Create;
FEmptyDIBImage.Reference;
1747,28 → 1333,12
begin
inherited Create;
SetImage(EmptyDIBImage);
 
FFreeList := TList.Create;
end;
 
destructor TDIB.Destroy;
var
D: TDIB;
begin
SetImage(EmptyDIBImage);
FCanvas.Free;
 
while FFreeList.Count > 0 do
try
D := TDIB(FFreeList[0]);
FFreeList.Remove(D);
if (D <> nil) and (D.Height > 0) and (D.Width > 0) then //is really pointed to image?
D.Free;
except
// it is silent exception, but it can through outer (abstract) exception
end;
FFreeList.Free;
 
inherited Destroy;
end;
 
1787,35 → 1357,33
 
case GetObject(Source.Handle, SizeOf(Data), @Data) of
SizeOf(Windows.TBitmap):
begin
BitmapRec := @Data;
case BitmapRec^.bmBitsPixel of
16: PixelFormat := MakeDIBPixelFormat(5, 5, 5);
else
PixelFormat := MakeDIBPixelFormat(8, 8, 8);
begin
BitmapRec := @Data;
case BitmapRec^.bmBitsPixel of
16: PixelFormat := MakeDIBPixelFormat(5, 5, 5);
else
PixelFormat := MakeDIBPixelFormat(8, 8, 8);
end;
SetSize(BitmapRec^.bmWidth, BitmapRec^.bmHeight, BitmapRec^.bmBitsPixel);
end;
SetSize(BitmapRec^.bmWidth, BitmapRec^.bmHeight, BitmapRec^.bmBitsPixel);
end;
SizeOf(TDIBSection):
begin
DIBSectionRec := @Data;
if DIBSectionRec^.dsBm.bmBitsPixel >= 24 then
begin
PixelFormat := MakeDIBPixelFormat(8, 8, 8);
end
else
if DIBSectionRec^.dsBm.bmBitsPixel > 8 then
DIBSectionRec := @Data;
if DIBSectionRec^.dsBm.bmBitsPixel>=24 then
begin
PixelFormat := MakeDIBPixelFormatMask(DIBSectionRec^.dsBitfields[0], //correct I.Ceneff, thanks
PixelFormat := MakeDIBPixelFormat(8, 8, 8);
end else
if DIBSectionRec^.dsBm.bmBitsPixel>8 then
begin
PixelFormat := MakeDIBPixelFormat(DIBSectionRec^.dsBitfields[0],
DIBSectionRec^.dsBitfields[1], DIBSectionRec^.dsBitfields[2]);
end
else
end else
begin
PixelFormat := MakeDIBPixelFormat(8, 8, 8);
end;
SetSize(DIBSectionRec^.dsBm.bmWidth, DIBSectionRec^.dsBm.bmHeight,
DIBSectionRec^.dsBm.bmBitsPixel);
end;
SetSize(DIBSectionRec^.dsBm.bmWidth, DIBSectionRec^.dsBm.bmHeight,
DIBSectionRec^.dsBm.bmBitsPixel);
end;
else
Exit;
end;
1825,74 → 1393,24
end;
 
procedure AssignGraphic(Source: TGraphic);
{$IFDEF PNG_GRAPHICS}
var
alpha: TDIB;
png: {$IFDEF VER12UP}TPngImage{$ELSE}TPNGObject{$ENDIF};
i, j: Integer;
q: pByteArray;
{$ENDIF}
begin
{$IFDEF PNG_GRAPHICS}
if Source is {$IFDEF VER12UP}TPngImage{$ELSE}TPNGObject{$ENDIF} then
begin
alpha := TDIB.Create;
try
{png image}
png := {$IFDEF VER12UP}TPngImage{$ELSE}TPNGObject{$ENDIF}.Create;
try
png.Assign(Source);
if png.TransparencyMode = ptmPartial then
begin
Alpha.SetSize(png.Width, png.Height, 8);
{separate alpha}
for i := 0 to png.Height - 1 do
begin
q := png.AlphaScanline[i];
for j := 0 to png.Width - 1 do
alpha.Pixels[j,i] := q[j];
end;
end;
SetSize(png.Width, png.Height, 32);
FillChar(PBits^, Size, 0);
Canvas.Draw(0, 0, png);
Transparent := png.Transparent;
finally
png.Free;
end;
if not alpha.Empty then
AssignAlphaChannel(alpha);
finally
alpha.Free;
end;
end
else
{$ENDIF}
if Source is TBitmap then
AssignBitmap(TBitmap(Source))
else
begin
SetSize(Source.Width, Source.Height, 32);
SetSize(Source.Width, Source.Height, 24);
FillChar(PBits^, Size, 0);
Canvas.Draw(0, 0, Source);
Transparent := Source.Transparent;
if not HasAlphaChannel then
begin
SetSize(Source.Width, Source.Height, 24);
FillChar(PBits^, Size, 0);
Canvas.Draw(0, 0, Source);
Transparent := Source.Transparent;
end
end;
end;
 
begin
if Source = nil then
if Source=nil then
begin
Clear;
end else if Source is TDIB then
begin
if Source <> Self then
if Source<>Self then
SetImage(TDIB(Source).FImage);
end else if Source is TGraphic then
begin
1899,27 → 1417,26
AssignGraphic(TGraphic(Source));
end else if Source is TPicture then
begin
if TPicture(Source).Graphic <> nil then
if TPicture(Source).Graphic<>nil then
AssignGraphic(TPicture(Source).Graphic)
else
Clear;
end else
end else
inherited Assign(Source);
end;
 
procedure TDIB.Draw(ACanvas: TCanvas; const ARect: TRect);
procedure TDIB.Draw(ACanvas: TCanvas; const Rect: TRect);
var
OldPalette: HPalette;
OldMode: Integer;
begin
if Size > 0 then
if Size>0 then
begin
if PaletteCount > 0 then
if PaletteCount>0 then
begin
OldPalette := SelectPalette(ACanvas.Handle, Palette, False);
RealizePalette(ACanvas.Handle);
end
else
end else
OldPalette := 0;
try
OldMode := SetStretchBltMode(ACanvas.Handle, COLORONCOLOR);
1927,18 → 1444,14
GdiFlush;
if FImage.FMemoryImage then
begin
with ARect do
begin
if StretchDIBits(ACanvas.Handle, Left, Top, Right - Left, Bottom - Top,
0, 0, Self.Width, Self.Height, FImage.FPBits, FImage.FBitmapInfo^, DIB_RGB_COLORS, ACanvas.CopyMode) = 0 then
MessageBeep(1);
end;
end
else
with Rect do
StretchDIBits(ACanvas.Handle, Left, Top, Right - Left, Bottom - Top,
0, 0, Width, Height, FImage.FPBits, FImage.FBitmapInfo^, DIB_RGB_COLORS , ACanvas.CopyMode);
end else
begin
with ARect do
with Rect do
StretchBlt(ACanvas.Handle, Left, Top, Right - Left, Bottom - Top,
FImage.FDC, 0, 0, Self.Width, Self.Height, ACanvas.CopyMode);
FImage.FDC, 0, 0, Width, Height, ACanvas.CopyMode);
end;
finally
SetStretchBltMode(ACanvas.Handle, OldMode);
1963,7 → 1476,7
var
TempImage: TDIBSharedImage;
begin
if (FImage.RefCount > 1) or (FImage.FCompressed) or ((not MemoryImage) and (FImage.FMemoryImage)) then
if (FImage.RefCount>1) or (FImage.FCompressed) or ((not MemoryImage) and (FImage.FMemoryImage)) then
begin
TempImage := TDIBSharedImage.Create;
try
2044,161 → 1557,6
end;
end;
 
type
PRGBA = ^TRGBA;
TRGBA = array[0..0] of Windows.TRGBQuad;
 
function TDIB.HasAlphaChannel: Boolean;
{give that DIB contain the alphachannel}
var
p: PRGBA;
X, Y: Integer;
begin
Result := True;
if BitCount = 32 then
for Y := 0 to Height - 1 do
begin
p := ScanLine[Y];
for X := 0 to Width - 1 do
begin
if p[X].rgbReserved <> $0 then Exit;
end
end;
Result := False;
end;
 
function TDIB.AssignAlphaChannel(ALPHA: TDIB; ForceResize: Boolean{$IFDEF VER4UP} = False{$ENDIF}): Boolean;
{copy alphachannel from other DIB or add from DIB8}
var
p32_0, p32_1: PRGBA;
p24: Pointer;
pB: PArrayByte;
X, Y: Integer;
tmpDIB, qAlpha: TDIB;
begin
Result := False;
if GetEmpty then Exit;
{Alphachannel can be copy into 32bit DIB only!}
if BitCount <> 32 then
begin
tmpDIB := TDIB.Create;
try
tmpDIB.Assign(Self);
Clear;
SetSize(tmpDIB.Width, tmpDIB.Height, 32);
Canvas.Draw(0, 0, tmpDIB);
finally
tmpDIB.Free;
end;
end;
qAlpha := TDIB.Create;
try
if not Assigned(Alpha) then Exit;
if ForceResize then
begin
{create temp}
tmpDIB := TDIB.Create;
try
{picture}
tmpDIB.Assign(ALPHA);
{resample size}
tmpDIB.DoResample(Width, Height, ftrBSpline);
{convert to greyscale}
tmpDIB.Greyscale(8);
{return picture to qAlpha}
qAlpha.Assign(tmpDIB);
finally
tmpDIB.Free;
end;
end
else
{Must be the same size!}
if not ((Width = ALPHA.Width) and (Height = ALPHA.Height)) then Exit
else qAlpha.Assign(ALPHA);
{It works now with qAlpha only}
case qAlpha.BitCount of
24:
begin
for Y := 0 to Height - 1 do
begin
p32_0 := ScanLine[Y];
p24 := qAlpha.ScanLine[Y];
for X := 0 to Width - 1 do with PBGR(p24)^ do
begin
p32_0[X].rgbReserved := Round(0.30 * R + 0.59 * G + 0.11 * B);
end
end;
end;
32:
begin
for Y := 0 to Height - 1 do
begin
p32_0 := ScanLine[Y];
p32_1 := qAlpha.ScanLine[Y];
for X := 0 to Width - 1 do
begin
p32_0[X].rgbReserved := p32_1[X].rgbReserved;
end
end;
end;
8:
begin
for Y := 0 to Height - 1 do
begin
p32_0 := ScanLine[Y];
pB := qAlpha.ScanLine[Y];
for X := 0 to Width - 1 do
begin
p32_0[X].rgbReserved := pB[X];
end
end;
end;
1:
begin
for Y := 0 to Height - 1 do
begin
p32_0 := ScanLine[Y];
pB := qAlpha.ScanLine[Y];
for X := 0 to Width - 1 do
begin
if pB[X] = 0 then
p32_0[X].rgbReserved := $FF
else
p32_0[X].rgbReserved := 0
end
end;
end;
else
Exit;
end;
Result := True;
finally
qAlpha.Free;
end;
end;
 
procedure TDIB.RetAlphaChannel(out oDIB: TDIB);
{Store alphachannel information into DIB8}
var
p0: PRGBA;
pB: PArrayByte;
X, Y: Integer;
begin
oDIB := nil;
if not HasAlphaChannel then Exit;
oDIB := TDIB.Create;
oDIB.SetSize(Width, Height, 8);
for Y := 0 to Height - 1 do
begin
p0 := ScanLine[Y];
pB := oDIB.ScanLine[Y];
for X := 0 to Width - 1 do
begin
pB[X] := p0[X].rgbReserved;
end
end;
end;
 
function TDIB.GetBitmapInfo: PBitmapInfo;
begin
Result := FImage.FBitmapInfo;
2211,7 → 1569,7
 
function TDIB.GetCanvas: TCanvas;
begin
if (FCanvas = nil) or (FCanvas.Handle = 0) then
if (FCanvas=nil) or (FCanvas.Handle=0) then
begin
AllocHandle;
 
2224,7 → 1582,7
 
function TDIB.GetEmpty: Boolean;
begin
Result := Size = 0;
Result := Size=0;
end;
 
function TDIB.GetHandle: THandle;
2267,31 → 1625,24
function TDIB.GetScanLine(Y: Integer): Pointer;
begin
Changing(True);
if (Y < 0) or (Y >= FHeight) then
if (Y<0) or (Y>=FHeight) then
raise EInvalidGraphicOperation.CreateFmt(SScanline, [Y]);
 
if not FImage.FMemoryImage then
GDIFlush;
Result := Pointer(Integer(FTopPBits) + Y * FNextLine);
Result := Pointer(Integer(FTopPBits)+Y*FNextLine);
end;
 
function TDIB.GetScanLineReadOnly(Y: Integer): Pointer;
begin
if (Y < 0) or (Y >= FHeight) then
if (Y<0) or (Y>=FHeight) then
raise EInvalidGraphicOperation.CreateFmt(SScanline, [Y]);
 
if not FImage.FMemoryImage then
GDIFlush;
Result := Pointer(Integer(FTopPBits) + Y * FNextLine);
Result := Pointer(Integer(FTopPBits)+Y*FNextLine);
end;
 
{$IFDEF VER16UP}
function TDIB.GetSupportsPartialTransparency: Boolean;
begin
Result := (FBitCount = 32) and HasAlphaChannel;
end;
{$ENDIF}
 
function TDIB.GetTopPBits: Pointer;
begin
Changing(True);
2306,13 → 1657,8
if not FImage.FMemoryImage then
GDIFlush;
Result := FTopPBits;
end;
end;
 
function TDIB.GetTransparent: Boolean;
begin
Result := (FBitCount = 32) and HasAlphaChannel;
end;
 
function TDIB.GetWidth: Integer;
begin
Result := FWidth;
2333,31 → 1679,20
Decompress;
 
Result := 0;
if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then
if (X>=0) and (X<FWidth) and (Y>=0) and (Y<FHeight) then
begin
case FBitCount of
1: Result := (PArrayByte(Integer(FTopPBits) + Y * FNextLine)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7];
4: Result := ((PArrayByte(Integer(FTopPBits) + Y * FNextLine)[X shr 1] and Mask4[X and 1]) shr Shift4[X and 1]);
8: Result := PArrayByte(Integer(FTopPBits) + Y * FNextLine)[X];
16: Result := PArrayWord(Integer(FTopPBits) + Y * FNextLine)[X];
24: with PArrayBGR(Integer(FTopPBits) + Y * FNextLine)[X] do
Result := R or (G shl 8) or (B shl 16);
32: Result := PArrayDWord(Integer(FTopPBits) + Y * FNextLine)[X];
1 : Result := (PArrayByte(Integer(FTopPBits)+Y*FNextLine)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7];
4 : Result := (PArrayByte(Integer(FTopPBits)+Y*FNextLine)[X shr 1] and Mask4[X and 1]) shr Shift4[X and 1];
8 : Result := PArrayByte(Integer(FTopPBits)+Y*FNextLine)[X];
16: Result := PArrayWord(Integer(FTopPBits)+Y*FNextLine)[X];
24: with PArrayBGR(Integer(FTopPBits)+Y*FNextLine)[X] do
Result := R or (G shl 8) or (B shl 16);
32: Result := PArrayDWord(Integer(FTopPBits)+Y*FNextLine)[X];
end;
end;
end;
 
function TDIB.GetRGBChannel: TDIB;
{Store RGB channel information into DIB24}
begin
Result := nil;
if Self.Empty then Exit;
Result := TDIB.Create;
Result.SetSize(Width, Height, 24);
Self.DrawOn(Bounds(0,0, Self.Width, Self.Height), Result.Canvas, 0, 0);
FFreeList.Add(Result);
end;
 
procedure TDIB.SetPixel(X, Y: Integer; Value: DWORD);
var
P: PByte;
2364,47 → 1699,30
begin
Changing(True);
 
if (X >= 0) and (X < FWidth) and (Y >= 0) and (Y < FHeight) then
if (X>=0) and (X<FWidth) and (Y>=0) and (Y<FHeight) then
begin
case FBitCount of
1: begin
P := @PArrayByte(Integer(FTopPBits) + Y * FNextLine)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or ((Value and 1) shl Shift1[X and 7]);
end;
4: begin
P := (@PArrayByte(Integer(FTopPBits) + Y * FNextLine)[X shr 3]);
P^ := ((P^ and Mask4n[X and 1]) or ((Value and 15) shl Shift4[X and 1]));
end;
8: PArrayByte(Integer(FTopPBits) + Y * FNextLine)[X] := Value;
16: PArrayWord(Integer(FTopPBits) + Y * FNextLine)[X] := Value;
24: with PArrayBGR(Integer(FTopPBits) + Y * FNextLine)[X] do
begin
B := Byte(Value shr 16);
G := Byte(Value shr 8);
R := Byte(Value);
end;
32: PArrayDWord(Integer(FTopPBits) + Y * FNextLine)[X] := Value;
1 : begin
P := @PArrayByte(Integer(FTopPBits)+Y*FNextLine)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or ((Value and 1) shl Shift1[X and 7]);
end;
4 : begin
P := @PArrayByte(Integer(FTopPBits)+Y*FNextLine)[X shr 3];
P^ := (P^ and Mask4n[X and 1]) or ((Value and 15) shl Shift4[X and 1]);
end;
8 : PArrayByte(Integer(FTopPBits)+Y*FNextLine)[X] := Value;
16: PArrayWord(Integer(FTopPBits)+Y*FNextLine)[X] := Value;
24: with PArrayBGR(Integer(FTopPBits)+Y*FNextLine)[X] do
begin
B := Byte(Value shr 16);
G := Byte(Value shr 8);
R := Byte(Value);
end;
32: PArrayDWord(Integer(FTopPBits)+Y*FNextLine)[X] := Value;
end;
end;
end;
 
procedure TDIB.SetRGBChannel(const Value: TDIB);
var
alpha: TDIB;
begin
if Self.HasAlphaChannel then
try
RetAlphaChannel(alpha);
Self.SetSize(Value.Width, Value.Height, 32);
Value.DrawOn(Bounds(0,0,Value.Width, Value.Height), Self.Canvas, 0, 0);
Self.AssignAlphaChannel(alpha, True);
finally
alpha.Free;
end
else
Self.Assign(Value);
end;
 
procedure TDIB.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
2413,8 → 1731,6
end;
 
type
{ TGlobalMemoryStream }
 
TGlobalMemoryStream = class(TMemoryStream)
private
FHandle: THandle;
2451,47 → 1767,22
end;
 
const
BitmapFileType = Ord('B') + Ord('M') * $100;
BitmapFileType = Ord('B') + Ord('M')*$100;
 
procedure TDIB.LoadFromStream(Stream: TStream);
var
BF: TBitmapFileHeader;
i: Integer;
ImageJPEG: TJPEGImage;
begin
{ File header reading }
i := Stream.Read(BF, SizeOf(TBitmapFileHeader));
if i = 0 then Exit;
if i <> SizeOf(TBitmapFileHeader) then
if i=0 then Exit;
if i<>SizeOf(TBitmapFileHeader) then
raise EInvalidGraphic.Create(SInvalidDIB);
 
{ Is the head jpeg ?}
 
if BF.bfType = $D8FF then
begin
ImageJPEG := TJPEGImage.Create;
try
try
Stream.Position := 0;
ImageJPEG.LoadFromStream(Stream);
except
on EInvalidGraphic do ImageJPEG := nil;
end;
if ImageJPEG <> nil then
begin
{set size and bitcount in natural units of jpeg}
SetSize(ImageJPEG.Width, ImageJPEG.Height, 24);
Canvas.Draw(0, 0, ImageJPEG);
Exit
end;
finally
ImageJPEG.Free;
end;
end
else
{ Is the head 'BM'? }
if BF.bfType <> BitmapFileType then
raise EInvalidGraphic.Create(SInvalidDIB);
if BF.bfType<>BitmapFileType then
raise EInvalidGraphic.Create(SInvalidDIB);
 
ReadData(Stream);
end;
2524,7 → 1815,7
WriteData(Stream);
 
AData := GlobalAlloc(GHND, Stream.Size);
if AData = 0 then OutOfMemoryError;
if AData=0 then OutOfMemoryError;
 
P := GlobalLock(AData);
Move(Stream.Memory^, P^, Stream.Size);
2542,14 → 1833,12
 
with BF do
begin
bfType := BitmapFileType;
bfOffBits := SizeOf(TBitmapFileHeader) + BitmapInfoSize;
bfSize := bfOffBits + FImage.FBitmapInfo^.bmiHeader.biSizeImage;
bfType := BitmapFileType;
bfOffBits := SizeOf(TBitmapFileHeader)+BitmapInfoSize;
bfSize := bfOffBits+FImage.FBitmapInfo^.bmiHeader.biSizeImage;
bfReserved1 := 0;
bfReserved2 := 0;
if (FBitCount = 32) and (FImage.FBitmapInfo^.bmiHeader.biCompression <> 0) then FImage.FBitmapInfo^.bmiHeader.biCompression := 0; //corrext RGB error to RGBA
end;
 
Stream.WriteBuffer(BF, SizeOf(TBitmapFileHeader));
 
WriteData(Stream);
2568,7 → 1857,7
 
procedure TDIB.SetBitCount(Value: Integer);
begin
if Value <= 0 then
if Value<=0 then
Clear
else
begin
2575,8 → 1864,7
if Empty then
begin
SetSize(Max(Width, 1), Max(Height, 1), Value)
end
else
end else
begin
ConvertBitCount(Value);
end;
2585,7 → 1873,7
 
procedure TDIB.SetHeight(Value: Integer);
begin
if Value <= 0 then
if Value<=0 then
Clear
else
begin
2598,7 → 1886,7
 
procedure TDIB.SetWidth(Value: Integer);
begin
if Value <= 0 then
if Value<=0 then
Clear
else
begin
2611,16 → 1899,16
 
procedure TDIB.SetImage(Value: TDIBSharedImage);
begin
if FImage <> Value then
if FImage<>Value then
begin
if FCanvas <> nil then
if FCanvas<>nil then
FCanvas.Handle := 0;
 
FImage.Release;
FImage := Value;
FImage.Reference;
 
if FCanvas <> nil then
if FCanvas<>nil then
FCanvas.Handle := FImage.FDC;
 
ColorTable := FImage.FColorTable;
2671,12 → 1959,12
var
TempImage: TDIBSharedImage;
begin
if (AWidth = Width) and (AHeight = Height) and (ABitCount = BitCount) and
(NowPixelFormat.RBitMask = PixelFormat.RBitMask) and
(NowPixelFormat.GBitMask = PixelFormat.GBitMask) and
(NowPixelFormat.BBitMask = PixelFormat.BBitMask) then Exit;
if (AWidth=Width) and (AHeight=Height) and (ABitCount=BitCount) and
(NowPixelFormat.RBitMask=PixelFormat.RBitMask) and
(NowPixelFormat.GBitMask=PixelFormat.GBitMask) and
(NowPixelFormat.BBitMask=PixelFormat.BBitMask) then Exit;
 
if (AWidth <= 0) or (AHeight <= 0) then
if (AWidth<=0) or (AHeight<=0) then
begin
Clear;
Exit;
2717,12 → 2005,12
var
i: Integer;
begin
for i := 0 to 255 do
for i:=0 to 255 do
with ColorTable[i] do
begin
rgbRed := ((i shr (G + B - 1)) and (1 shl R - 1)) * 255 div (1 shl R - 1);
rgbGreen := ((i shr (B - 1)) and (1 shl G - 1)) * 255 div (1 shl G - 1);
rgbBlue := ((i shr 0) and (1 shl B - 1)) * 255 div (1 shl B - 1);
rgbRed := ((i shr (G+B-1)) and (1 shl R-1)) * 255 div (1 shl R-1);
rgbGreen := ((i shr (B-1)) and (1 shl G-1)) * 255 div (1 shl G-1);
rgbBlue := ((i shr 0) and (1 shl B-1)) * 255 div (1 shl B-1);
end;
end;
 
2735,45 → 2023,39
begin
i := 0;
 
for y := 0 to Height - 1 do
for y:=0 to Height-1 do
begin
SrcP := Temp.ScanLine[y];
DestP := ScanLine[y];
 
for x := 0 to Width - 1 do
for x:=0 to Width-1 do
begin
case Temp.BitCount of
1:
begin
i := (PArrayByte(SrcP)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7];
end;
4:
begin
i := (PArrayByte(SrcP)[X and 1] and Mask4[X and 1]) shr Shift4[X and 1];
end;
8:
begin
i := PByte(SrcP)^;
Inc(PByte(SrcP));
end;
1 : begin
i := (PArrayByte(SrcP)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7];
end;
4 : begin
i := (PArrayByte(SrcP)[X and 1] and Mask4[X and 1]) shr Shift4[X and 1];
end;
8 : begin
i := PByte(SrcP)^;
Inc(PByte(SrcP));
end;
end;
 
case BitCount of
1:
begin
P := @PArrayByte(DestP)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (i shl Shift1[X shr 3]);
end;
4:
begin
P := @PArrayByte(DestP)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (i shl Shift4[X and 1]);
end;
8:
begin
PByte(DestP)^ := i;
Inc(PByte(DestP));
end;
1 : begin
P := @PArrayByte(DestP)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (i shl Shift1[X shr 3]);
end;
4 : begin
P := @PArrayByte(DestP)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (i shl Shift4[X and 1]);
end;
8 : begin
PByte(DestP)^ := i;
Inc(PByte(DestP));
end;
end;
end;
end;
2789,86 → 2071,77
cG := 0;
cB := 0;
 
for y := 0 to Height - 1 do
for y:=0 to Height-1 do
begin
SrcP := Temp.ScanLine[y];
DestP := ScanLine[y];
 
for x := 0 to Width - 1 do
for x:=0 to Width-1 do
begin
case Temp.BitCount of
1:
begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7]] do
begin
cR := rgbRed;
cG := rgbGreen;
cB := rgbBlue;
1 : begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7]] do
begin
cR := rgbRed;
cG := rgbGreen;
cB := rgbBlue;
end;
end;
end;
4:
begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 1] and Mask4[X and 1]) shr Shift4[X and 1]] do
begin
cR := rgbRed;
cG := rgbGreen;
cB := rgbBlue;
4 : begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 1] and Mask4[X and 1]) shr Shift4[X and 1]] do
begin
cR := rgbRed;
cG := rgbGreen;
cB := rgbBlue;
end;
end;
end;
8:
begin
with Temp.ColorTable[PByte(SrcP)^] do
begin
cR := rgbRed;
cG := rgbGreen;
cB := rgbBlue;
8 : begin
with Temp.ColorTable[PByte(SrcP)^] do
begin
cR := rgbRed;
cG := rgbGreen;
cB := rgbBlue;
end;
Inc(PByte(SrcP));
end;
Inc(PByte(SrcP));
end;
16:
begin
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, cR, cG, cB);
Inc(PWord(SrcP));
end;
24:
begin
with PBGR(SrcP)^ do
begin
cR := R;
cG := G;
cB := B;
16: begin
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, cR, cG, cB);
Inc(PWord(SrcP));
end;
24: begin
with PBGR(SrcP)^ do
begin
cR := R;
cG := G;
cB := B;
end;
 
Inc(PBGR(SrcP));
end;
32:
begin
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, cR, cG, cB);
Inc(PDWORD(SrcP));
end;
Inc(PBGR(SrcP));
end;
32: begin
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, cR, cG, cB);
Inc(PDWORD(SrcP));
end;
end;
 
case BitCount of
16:
begin
PWord(DestP)^ := pfRGB(NowPixelFormat, cR, cG, cB);
Inc(PWord(DestP));
end;
24:
begin
with PBGR(DestP)^ do
begin
R := cR;
G := cG;
B := cB;
16: begin
PWord(DestP)^ := pfRGB(NowPixelFormat, cR, cG, cB);
Inc(PWord(DestP));
end;
Inc(PBGR(DestP));
end;
32:
begin
PDWORD(DestP)^ := pfRGB(NowPixelFormat, cR, cG, cB);
Inc(PDWORD(DestP));
end;
24: begin
with PBGR(DestP)^ do
begin
R := cR;
G := cG;
B := cB;
end;
Inc(PBGR(DestP));
end;
32: begin
PDWORD(DestP)^ := pfRGB(NowPixelFormat, cR, cG, cB);
Inc(PDWORD(DestP));
end;
end;
end;
end;
2875,7 → 2148,7
end;
 
begin
if Size = 0 then exit;
if Size=0 then exit;
 
Temp := TDIB.Create;
try
2882,22 → 2155,21
Temp.Assign(Self);
SetSize(Temp.Width, Temp.Height, ABitCount);
 
if FImage = Temp.FImage then Exit;
if FImage=Temp.FImage then Exit;
 
if (Temp.BitCount <= 8) and (BitCount <= 8) then
if (Temp.BitCount<=8) and (BitCount<=8) then
begin
{ The image is converted from the palette color image into the palette color image. }
if Temp.BitCount <= BitCount then
if Temp.BitCount<=BitCount then
begin
PaletteToPalette_Inc;
end
else
end else
begin
case BitCount of
1: begin
ColorTable[0] := RGBQuad(0, 0, 0);
ColorTable[1] := RGBQuad(255, 255, 255);
end;
ColorTable[0] := RGBQuad(0, 0, 0);
ColorTable[1] := RGBQuad(255, 255, 255);
end;
4: CreateHalftonePalette(1, 2, 1);
8: CreateHalftonePalette(3, 3, 2);
end;
2905,35 → 2177,32
 
Canvas.Draw(0, 0, Temp);
end;
end
else
if (Temp.BitCount <= 8) and (BitCount > 8) then
begin
{ The image is converted from the palette color image into the rgb color image. }
PaletteToRGB_or_RGBToRGB;
end
else
if (Temp.BitCount > 8) and (BitCount <= 8) then
begin
{ The image is converted from the rgb color image into the palette color image. }
case BitCount of
1: begin
ColorTable[0] := RGBQuad(0, 0, 0);
ColorTable[1] := RGBQuad(255, 255, 255);
end;
4: CreateHalftonePalette(1, 2, 1);
8: CreateHalftonePalette(3, 3, 2);
end;
UpdatePalette;
end else
if (Temp.BitCount<=8) and (BitCount>8) then
begin
{ The image is converted from the palette color image into the rgb color image. }
PaletteToRGB_or_RGBToRGB;
end else
if (Temp.BitCount>8) and (BitCount<=8) then
begin
{ The image is converted from the rgb color image into the palette color image. }
case BitCount of
1: begin
ColorTable[0] := RGBQuad(0, 0, 0);
ColorTable[1] := RGBQuad(255, 255, 255);
end;
4: CreateHalftonePalette(1, 2, 1);
8: CreateHalftonePalette(3, 3, 2);
end;
UpdatePalette;
 
Canvas.Draw(0, 0, Temp);
end
else
if (Temp.BitCount > 8) and (BitCount > 8) then
begin
{ The image is converted from the rgb color image into the rgb color image. }
PaletteToRGB_or_RGBToRGB;
end;
Canvas.Draw(0, 0, Temp);
end else
if (Temp.BitCount>8) and (BitCount>8) then
begin
{ The image is converted from the rgb color image into the rgb color image. }
PaletteToRGB_or_RGBToRGB;
end;
finally
Temp.Free;
end;
2961,12 → 2230,12
Redraw: Boolean;
Percent: DWORD;
begin
Redraw := (GetTickCount - FProgressOldTime > 200) and (FProgressY - FProgressOldY > 32) and
(((Height div 3 > Integer(FProgressY)) and (FProgressOldY = 0)) or (FProgressOldY <> 0));
Redraw := (GetTickCount-FProgressOldTime>200) and (FProgressY-FProgressOldY>32) and
(((Height div 3>Integer(FProgressY)) and (FProgressOldY=0)) or (FProgressOldY<>0));
 
Percent := PercentY * 100 div Height;
Percent := PercentY*100 div Height;
 
if (Percent <> FProgressOld) or (Redraw) then
if (Percent<>FProgressOld) or (Redraw) then
begin
Progress(Self, psRunning, Percent, Redraw,
Rect(0, FProgressOldY, Width, FProgressY), FProgressName);
2982,211 → 2251,6
Inc(FProgressY);
end;
 
procedure TDIB.Mirror(MirrorX, MirrorY: Boolean);
var
x, y, Width2, c: Integer;
P1, P2, TempBuf: Pointer;
begin
if Empty then Exit;
if (not MirrorX) and (not MirrorY) then Exit;
 
if (not MirrorX) and (MirrorY) then
begin
GetMem(TempBuf, WidthBytes);
try
StartProgress('Mirror');
try
for y := 0 to Height shr 1 - 1 do
begin
P1 := ScanLine[y];
P2 := ScanLine[Height - y - 1];
 
Move(P1^, TempBuf^, WidthBytes);
Move(P2^, P1^, WidthBytes);
Move(TempBuf^, P2^, WidthBytes);
 
UpdateProgress(y * 2);
end;
finally
EndProgress;
end;
finally
FreeMem(TempBuf, WidthBytes);
end;
end
else
if (MirrorX) and (not MirrorY) then
begin
Width2 := Width shr 1;
 
StartProgress('Mirror');
try
for y := 0 to Height - 1 do
begin
P1 := ScanLine[y];
 
case BitCount of
1:
begin
for x := 0 to Width2 - 1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width - x - 1, y];
Pixels[Width - x - 1, y] := c;
end;
end;
4:
begin
for x := 0 to Width2 - 1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width - x - 1, y];
Pixels[Width - x - 1, y] := c;
end;
end;
8:
begin
P2 := Pointer(Integer(P1) + Width - 1);
for x := 0 to Width2 - 1 do
begin
PByte(@c)^ := PByte(P1)^;
PByte(P1)^ := PByte(P2)^;
PByte(P2)^ := PByte(@c)^;
Inc(PByte(P1));
Dec(PByte(P2));
end;
end;
16:
begin
P2 := Pointer(Integer(P1) + (Width - 1) * 2);
for x := 0 to Width2 - 1 do
begin
PWord(@c)^ := PWord(P1)^;
PWord(P1)^ := PWord(P2)^;
PWord(P2)^ := PWord(@c)^;
Inc(PWord(P1));
Dec(PWord(P2));
end;
end;
24:
begin
P2 := Pointer(Integer(P1) + (Width - 1) * 3);
for x := 0 to Width2 - 1 do
begin
PBGR(@c)^ := PBGR(P1)^;
PBGR(P1)^ := PBGR(P2)^;
PBGR(P2)^ := PBGR(@c)^;
Inc(PBGR(P1));
Dec(PBGR(P2));
end;
end;
32:
begin
P2 := Pointer(Integer(P1) + (Width - 1) * 4);
for x := 0 to Width2 - 1 do
begin
PDWORD(@c)^ := PDWORD(P1)^;
PDWORD(P1)^ := PDWORD(P2)^;
PDWORD(P2)^ := PDWORD(@c)^;
Inc(PDWORD(P1));
Dec(PDWORD(P2));
end;
end;
end;
 
UpdateProgress(y);
end;
finally
EndProgress;
end;
end
else
if (MirrorX) and (MirrorY) then
begin
StartProgress('Mirror');
try
for y := 0 to Height shr 1 - 1 do
begin
P1 := ScanLine[y];
P2 := ScanLine[Height - y - 1];
 
case BitCount of
1:
begin
for x := 0 to Width - 1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width - x - 1, Height - y - 1];
Pixels[Width - x - 1, Height - y - 1] := c;
end;
end;
4:
begin
for x := 0 to Width - 1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width - x - 1, Height - y - 1];
Pixels[Width - x - 1, Height - y - 1] := c;
end;
end;
8:
begin
P2 := Pointer(Integer(P2) + Width - 1);
for x := 0 to Width - 1 do
begin
PByte(@c)^ := PByte(P1)^;
PByte(P1)^ := PByte(P2)^;
PByte(P2)^ := PByte(@c)^;
Inc(PByte(P1));
Dec(PByte(P2));
end;
end;
16:
begin
P2 := Pointer(Integer(P2) + (Width - 1) * 2);
for x := 0 to Width - 1 do
begin
PWord(@c)^ := PWord(P1)^;
PWord(P1)^ := PWord(P2)^;
PWord(P2)^ := PWord(@c)^;
Inc(PWord(P1));
Dec(PWord(P2));
end;
end;
24:
begin
P2 := Pointer(Integer(P2) + (Width - 1) * 3);
for x := 0 to Width - 1 do
begin
PBGR(@c)^ := PBGR(P1)^;
PBGR(P1)^ := PBGR(P2)^;
PBGR(P2)^ := PBGR(@c)^;
Inc(PBGR(P1));
Dec(PBGR(P2));
end;
end;
32:
begin
P2 := Pointer(Integer(P2) + (Width - 1) * 4);
for x := 0 to Width - 1 do
begin
PDWORD(@c)^ := PDWORD(P1)^;
PDWORD(P1)^ := PDWORD(P2)^;
PDWORD(P2)^ := PDWORD(@c)^;
Inc(PDWORD(P1));
Dec(PDWORD(P2));
end;
end;
end;
 
UpdateProgress(y * 2);
end;
finally
EndProgress;
end;
end;
end;
 
procedure TDIB.Blur(ABitCount: Integer; Radius: Integer);
type
TAve = record
3206,108 → 2270,102
R, G, B: Byte;
begin
case Temp.BitCount of
1:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with Temp.ColorTable[(PByte(Integer(SrcP) + X shr 3)^ and Mask1[x and 7]) shr Shift1[x and 7]], AveP^ do
1 : begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Inc(cR, rgbRed);
Inc(cG, rgbGreen);
Inc(cB, rgbBlue);
Inc(c);
with Temp.ColorTable[(PByte(Integer(SrcP)+X shr 3)^ and Mask1[x and 7]) shr Shift1[x and 7]], AveP^ do
begin
Inc(cR, rgbRed);
Inc(cG, rgbGreen);
Inc(cB, rgbBlue);
Inc(c);
end;
Inc(AveP);
end;
Inc(AveP);
end;
end;
4:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with Temp.ColorTable[(PByte(Integer(SrcP) + X shr 1)^ and Mask4[x and 1]) shr Shift4[x and 1]], AveP^ do
4 : begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Inc(cR, rgbRed);
Inc(cG, rgbGreen);
Inc(cB, rgbBlue);
Inc(c);
with Temp.ColorTable[(PByte(Integer(SrcP)+X shr 1)^ and Mask4[x and 1]) shr Shift4[x and 1]], AveP^ do
begin
Inc(cR, rgbRed);
Inc(cG, rgbGreen);
Inc(cB, rgbBlue);
Inc(c);
end;
Inc(AveP);
end;
Inc(AveP);
end;
end;
8:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with Temp.ColorTable[PByte(SrcP)^], AveP^ do
8 : begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Inc(cR, rgbRed);
Inc(cG, rgbGreen);
Inc(cB, rgbBlue);
Inc(c);
with Temp.ColorTable[PByte(SrcP)^], AveP^ do
begin
Inc(cR, rgbRed);
Inc(cG, rgbGreen);
Inc(cB, rgbBlue);
Inc(c);
end;
Inc(PByte(SrcP));
Inc(AveP);
end;
Inc(PByte(SrcP));
Inc(AveP);
end;
end;
16:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, R, G, B);
with AveP^ do
16: begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Inc(cR, R);
Inc(cG, G);
Inc(cB, B);
Inc(c);
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, R, G, B);
with AveP^ do
begin
Inc(cR, R);
Inc(cG, G);
Inc(cB, B);
Inc(c);
end;
Inc(PWord(SrcP));
Inc(AveP);
end;
Inc(PWord(SrcP));
Inc(AveP);
end;
end;
24:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with PBGR(SrcP)^, AveP^ do
24: begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Inc(cR, R);
Inc(cG, G);
Inc(cB, B);
Inc(c);
with PBGR(SrcP)^, AveP^ do
begin
Inc(cR, R);
Inc(cG, G);
Inc(cB, B);
Inc(c);
end;
Inc(PBGR(SrcP));
Inc(AveP);
end;
Inc(PBGR(SrcP));
Inc(AveP);
end;
end;
32:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, R, G, B);
with AveP^ do
32: begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Inc(cR, R);
Inc(cG, G);
Inc(cB, B);
Inc(c);
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, R, G, B);
with AveP^ do
begin
Inc(cR, R);
Inc(cG, G);
Inc(cB, B);
Inc(c);
end;
Inc(PDWORD(SrcP));
Inc(AveP);
end;
Inc(PDWORD(SrcP));
Inc(AveP);
end;
end;
end;
end;
 
3319,108 → 2377,102
R, G, B: Byte;
begin
case Temp.BitCount of
1:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with Temp.ColorTable[(PByte(Integer(SrcP) + X shr 3)^ and Mask1[x and 7]) shr Shift1[x and 7]], AveP^ do
1 : begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Dec(cR, rgbRed);
Dec(cG, rgbGreen);
Dec(cB, rgbBlue);
Dec(c);
with Temp.ColorTable[(PByte(Integer(SrcP)+X shr 3)^ and Mask1[x and 7]) shr Shift1[x and 7]], AveP^ do
begin
Dec(cR, rgbRed);
Dec(cG, rgbGreen);
Dec(cB, rgbBlue);
Dec(c);
end;
Inc(AveP);
end;
Inc(AveP);
end;
end;
4:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with Temp.ColorTable[(PByte(Integer(SrcP) + X shr 1)^ and Mask4[x and 1]) shr Shift4[x and 1]], AveP^ do
4 : begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Dec(cR, rgbRed);
Dec(cG, rgbGreen);
Dec(cB, rgbBlue);
Dec(c);
with Temp.ColorTable[(PByte(Integer(SrcP)+X shr 1)^ and Mask4[x and 1]) shr Shift4[x and 1]], AveP^ do
begin
Dec(cR, rgbRed);
Dec(cG, rgbGreen);
Dec(cB, rgbBlue);
Dec(c);
end;
Inc(AveP);
end;
Inc(AveP);
end;
end;
8:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with Temp.ColorTable[PByte(SrcP)^], AveP^ do
8 : begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Dec(cR, rgbRed);
Dec(cG, rgbGreen);
Dec(cB, rgbBlue);
Dec(c);
with Temp.ColorTable[PByte(SrcP)^], AveP^ do
begin
Dec(cR, rgbRed);
Dec(cG, rgbGreen);
Dec(cB, rgbBlue);
Dec(c);
end;
Inc(PByte(SrcP));
Inc(AveP);
end;
Inc(PByte(SrcP));
Inc(AveP);
end;
end;
16:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, R, G, B);
with AveP^ do
16: begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Dec(cR, R);
Dec(cG, G);
Dec(cB, B);
Dec(c);
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, R, G, B);
with AveP^ do
begin
Dec(cR, R);
Dec(cG, G);
Dec(cB, B);
Dec(c);
end;
Inc(PWord(SrcP));
Inc(AveP);
end;
Inc(PWord(SrcP));
Inc(AveP);
end;
end;
24:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
with PBGR(SrcP)^, AveP^ do
24: begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Dec(cR, R);
Dec(cG, G);
Dec(cB, B);
Dec(c);
with PBGR(SrcP)^, AveP^ do
begin
Dec(cR, R);
Dec(cG, G);
Dec(cB, B);
Dec(c);
end;
Inc(PBGR(SrcP));
Inc(AveP);
end;
Inc(PBGR(SrcP));
Inc(AveP);
end;
end;
32:
begin
SrcP := Pointer(Integer(Temp.TopPBits) + Y * Temp.NextLine);
AveP := @Ave;
for x := 0 to XCount - 1 do
begin
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, R, G, B);
with AveP^ do
32: begin
SrcP := Pointer(Integer(Temp.TopPBits)+Y*Temp.NextLine);
AveP := @Ave;
for x:=0 to XCount-1 do
begin
Dec(cR, R);
Dec(cG, G);
Dec(cB, B);
Dec(c);
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, R, G, B);
with AveP^ do
begin
Dec(cR, R);
Dec(cG, G);
Dec(cB, B);
Dec(c);
end;
Inc(PDWORD(SrcP));
Inc(AveP);
end;
Inc(PDWORD(SrcP));
Inc(AveP);
end;
end;
end;
end;
 
3433,9 → 2485,9
DestP: Pointer;
P: PByte;
begin
GetMem(AveX, Width * SizeOf(TAve));
GetMem(AveX, Width*SizeOf(TAve));
try
FillChar(AveX^, Width * SizeOf(TAve), 0);
FillChar(AveX^, Width*SizeOf(TAve), 0);
 
FirstX2 := -1;
LastX2 := -1;
3443,44 → 2495,44
LastY := -1;
 
x := 0;
for x2 := -Radius to Radius do
for x2:=-Radius to Radius do
begin
jx := x + x2;
if (jx >= 0) and (jx < Width) then
jx := x+x2;
if (jx>=0) and (jx<Width) then
begin
if FirstX2 = -1 then FirstX2 := jx;
if LastX2 < jx then LastX2 := jx;
if FirstX2=-1 then FirstX2 := jx;
if LastX2<jx then LastX2 := jx;
end;
end;
 
y := 0;
for y2 := -Radius to Radius do
for y2:=-Radius to Radius do
begin
jy := y + y2;
if (jy >= 0) and (jy < Height) then
jy := y+y2;
if (jy>=0) and (jy<Height) then
begin
if FirstY = -1 then FirstY := jy;
if LastY < jy then LastY := jy;
if FirstY=-1 then FirstY := jy;
if LastY<jy then LastY := jy;
end;
end;
 
for y := FirstY to LastY do
for y:=FirstY to LastY do
AddAverage(y, Temp.Width, AveX^);
 
for y := 0 to Height - 1 do
for y:=0 to Height-1 do
begin
DestP := ScanLine[y];
 
{ The average is updated. }
if y - FirstY = Radius + 1 then
if y-FirstY=Radius+1 then
begin
DeleteAverage(FirstY, Temp.Width, AveX^);
Inc(FirstY);
end;
 
if LastY - y = Radius - 1 then
if LastY-y=Radius-1 then
begin
Inc(LastY); if LastY >= Height then LastY := Height - 1;
Inc(LastY); if LastY>=Height then LastY := Height-1;
AddAverage(LastY, Temp.Width, AveX^);
end;
 
3489,7 → 2541,7
LastX := LastX2;
 
FillChar(Ave, SizeOf(Ave), 0);
for x := FirstX to LastX do
for x:=FirstX to LastX do
with AveX[x] do
begin
Inc(Ave.cR, cR);
3498,10 → 2550,10
Inc(Ave.c, c);
end;
 
for x := 0 to Width - 1 do
for x:=0 to Width-1 do
begin
{ The average is updated. }
if x - FirstX = Radius + 1 then
if x-FirstX=Radius+1 then
begin
with AveX[FirstX] do
begin
3513,9 → 2565,9
Inc(FirstX);
end;
 
if LastX - x = Radius - 1 then
if LastX-x=Radius-1 then
begin
Inc(LastX); if LastX >= Width then LastX := Width - 1;
Inc(LastX); if LastX>=Width then LastX := Width-1;
with AveX[LastX] do
begin
Inc(Ave.cR, cR);
3527,46 → 2579,40
 
{ The average is written. }
case BitCount of
1:
begin
P := @PArrayByte(DestP)[X shr 3];
with Ave do
P^ := (P^ and Mask1n[X and 7]) or (DWORD(Ord(((cR + cG + cB) div c) div 3 > 127)) shl Shift1[X and 7]);
end;
4:
begin
P := @PArrayByte(DestP)[X shr 1];
with Ave do
P^ := (P^ and Mask4n[X and 1]) or (((((cR + cG + cB) div c) div 3) shr 4) shl Shift4[X and 1]);
end;
8:
begin
with Ave do
PByte(DestP)^ := ((cR + cG + cB) div c) div 3;
Inc(PByte(DestP));
end;
16:
begin
with Ave do
PWORD(DestP)^ := pfRGB(NowPixelFormat, cR div c, cG div c, cB div c);
Inc(PWORD(DestP));
end;
24:
begin
with PBGR(DestP)^, Ave do
begin
R := cR div c;
G := cG div c;
B := cB div c;
1 : begin
P := @PArrayByte(DestP)[X shr 3];
with Ave do
P^ := (P^ and Mask1n[X and 7]) or (DWORD(Ord(((cR+cG+cB) div c) div 3>127)) shl Shift1[X and 7]);
end;
Inc(PBGR(DestP));
end;
32:
begin
with Ave do
PDWORD(DestP)^ := pfRGB(NowPixelFormat, cR div c, cG div c, cB div c);
Inc(PDWORD(DestP));
end;
4 : begin
P := @PArrayByte(DestP)[X shr 1];
with Ave do
P^ := (P^ and Mask4n[X and 1]) or (((((cR+cG+cB) div c) div 3) shr 4) shl Shift4[X and 1]);
end;
8 : begin
with Ave do
PByte(DestP)^ := ((cR+cG+cB) div c) div 3;
Inc(PByte(DestP));
end;
16: begin
with Ave do
PWORD(DestP)^ := pfRGB(NowPixelFormat, cR div c, cG div c, cB div c);
Inc(PWORD(DestP));
end;
24: begin
with PBGR(DestP)^, Ave do
begin
R := cR div c;
G := cG div c;
B := cB div c;
end;
Inc(PBGR(DestP));
end;
32: begin
with Ave do
PDWORD(DestP)^ := pfRGB(NowPixelFormat, cR div c, cG div c, cB div c);
Inc(PDWORD(DestP));
end;
end;
end;
 
3580,7 → 2626,7
var
i, j: Integer;
begin
if Empty or (Radius = 0) then Exit;
if Empty or (Radius=0) then Exit;
 
Radius := Abs(Radius);
 
3591,12 → 2637,12
Temp.Assign(Self);
SetSize(Width, Height, ABitCount);
 
if ABitCount <= 8 then
if ABitCount<=8 then
begin
FillChar(ColorTable, SizeOf(ColorTable), 0);
for i := 0 to (1 shl ABitCount) - 1 do
for i:=0 to (1 shl ABitCount)-1 do
begin
j := i * (1 shl (8 - ABitCount));
j := i * (1 shl (8-ABitCount));
j := j or (j shr ABitCount);
ColorTable[i] := RGBQuad(j, j, j);
end;
3611,95 → 2657,7
EndProgress;
end;
end;
(*
procedure TDIB.Negative;
var
i, i2: Integer;
P: Pointer;
begin
if Empty then exit;
 
if BitCount <= 8 then
begin
for i := 0 to 255 do
with ColorTable[i] do
begin
rgbRed := 255 - rgbRed;
rgbGreen := 255 - rgbGreen;
rgbBlue := 255 - rgbBlue;
end;
UpdatePalette;
end else
begin
P := PBits;
i2 := Size;
asm
mov ecx,i2
mov eax,P
mov edx,ecx
 
{ Unit of DWORD. }
@@qword_skip:
shr ecx,2
jz @@dword_skip
 
dec ecx
@@dword_loop:
not dword ptr [eax+ecx*4]
dec ecx
jnl @@dword_loop
 
mov ecx,edx
shr ecx,2
add eax,ecx*4
 
{ Unit of Byte. }
@@dword_skip:
mov ecx,edx
and ecx,3
jz @@byte_skip
 
dec ecx
@@loop_byte:
not byte ptr [eax+ecx]
dec ecx
jnl @@loop_byte
 
@@byte_skip:
end;
end;
end;
*)
procedure TDIB.Negative;
var
i: Integer;
P: Pointer;
i2: Integer;
begin
if Empty then Exit;
 
if BitCount <= 8 then
begin
for i := 0 to 255 do
with ColorTable[i] do
begin
rgbRed := 255 - rgbRed;
rgbGreen := 255 - rgbGreen;
rgbBlue := 255 - rgbBlue;
end;
UpdatePalette;
end
else
begin
P := PBits;
i2 := Size;
for i := 0 to i2-1 do
begin
PByteArray(P)^[i] := not PByteArray(P)^[i];
end;
end;
end;
 
procedure TDIB.Greyscale(ABitCount: Integer);
var
YTblR, YTblG, YTblB: array[0..255] of Byte;
3710,7 → 2668,7
DestP, SrcP: Pointer;
P: PByte;
begin
if Empty then Exit;
if Empty then exit;
 
Temp := TDIB.Create;
try
3717,12 → 2675,12
Temp.Assign(Self);
SetSize(Width, Height, ABitCount);
 
if ABitCount <= 8 then
if ABitCount<=8 then
begin
FillChar(ColorTable, SizeOf(ColorTable), 0);
for i := 0 to (1 shl ABitCount) - 1 do
for i:=0 to (1 shl ABitCount)-1 do
begin
j := i * (1 shl (8 - ABitCount));
j := i * (1 shl (8-ABitCount));
j := j or (j shr ABitCount);
ColorTable[i] := RGBQuad(j, j, j);
end;
3729,11 → 2687,11
UpdatePalette;
end;
 
for i := 0 to 255 do
for i:=0 to 255 do
begin
YTblR[i] := Trunc(0.3588 * i);
YTblG[i] := Trunc(0.4020 * i);
YTblB[i] := Trunc(0.2392 * i);
YTblR[i] := Trunc(0.3588*i);
YTblG[i] := Trunc(0.4020*i);
YTblB[i] := Trunc(0.2392*i);
end;
 
c := 0;
3740,86 → 2698,74
 
StartProgress('Greyscale');
try
for y := 0 to Height - 1 do
for y:=0 to Height-1 do
begin
DestP := ScanLine[y];
SrcP := Temp.ScanLine[y];
 
for x := 0 to Width - 1 do
for x:=0 to Width-1 do
begin
case Temp.BitCount of
1:
begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7]] do
c := YTblR[rgbRed] + YTblG[rgbGreen] + YTblB[rgbBlue];
end;
4:
begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 1] and Mask4[X and 1]) shr Shift4[X and 1]] do
c := YTblR[rgbRed] + YTblG[rgbGreen] + YTblB[rgbBlue];
end;
8:
begin
with Temp.ColorTable[PByte(SrcP)^] do
c := YTblR[rgbRed] + YTblG[rgbGreen] + YTblB[rgbBlue];
Inc(PByte(SrcP));
end;
16:
begin
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, R, G, B);
c := YTblR[R] + YTblR[G] + YTblR[B];
Inc(PWord(SrcP));
end;
24:
begin
with PBGR(SrcP)^ do
c := YTblR[R] + YTblG[G] + YTblB[B];
Inc(PBGR(SrcP));
end;
32:
begin
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, R, G, B);
c := YTblR[R] + YTblR[G] + YTblR[B];
Inc(PDWORD(SrcP));
end;
1 : begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 3] and Mask1[X and 7]) shr Shift1[X and 7]] do
c := YTblR[rgbRed]+YTblG[rgbGreen]+YTblB[rgbBlue];
end;
4 : begin
with Temp.ColorTable[(PArrayByte(SrcP)[X shr 1] and Mask4[X and 1]) shr Shift4[X and 1]] do
c := YTblR[rgbRed]+YTblG[rgbGreen]+YTblB[rgbBlue];
end;
8 : begin
with Temp.ColorTable[PByte(SrcP)^] do
c := YTblR[rgbRed]+YTblG[rgbGreen]+YTblB[rgbBlue];
Inc(PByte(SrcP));
end;
16: begin
pfGetRGB(Temp.NowPixelFormat, PWord(SrcP)^, R, G, B);
c := YTblR[R]+YTblR[G]+YTblR[B];
Inc(PWord(SrcP));
end;
24: begin
with PBGR(SrcP)^ do
c := YTblR[R]+YTblG[G]+YTblB[B];
Inc(PBGR(SrcP));
end;
32: begin
pfGetRGB(Temp.NowPixelFormat, PDWORD(SrcP)^, R, G, B);
c := YTblR[R]+YTblR[G]+YTblR[B];
Inc(PDWORD(SrcP));
end;
end;
 
case BitCount of
1:
begin
P := @PArrayByte(DestP)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (DWORD(Ord(c > 127)) shl Shift1[X and 7]);
end;
4:
begin
P := @PArrayByte(DestP)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or ((c shr 4) shl Shift4[X and 1]);
end;
8:
begin
PByte(DestP)^ := c;
Inc(PByte(DestP));
end;
16:
begin
PWord(DestP)^ := pfRGB(NowPixelFormat, c, c, c);
Inc(PWord(DestP));
end;
24:
begin
with PBGR(DestP)^ do
begin
R := c;
G := c;
B := c;
1 : begin
P := @PArrayByte(DestP)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (DWORD(Ord(c>127)) shl Shift1[X and 7]);
end;
Inc(PBGR(DestP));
end;
32:
begin
PDWORD(DestP)^ := pfRGB(NowPixelFormat, c, c, c);
Inc(PDWORD(DestP));
end;
4 : begin
P := @PArrayByte(DestP)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or ((c shr 4) shl Shift4[X and 1]);
end;
8 : begin
PByte(DestP)^ := c;
Inc(PByte(DestP));
end;
16: begin
PWord(DestP)^ := pfRGB(NowPixelFormat, c, c, c);
Inc(PWord(DestP));
end;
24: begin
with PBGR(DestP)^ do
begin
R := c;
G := c;
B := c;
end;
Inc(PBGR(DestP));
end;
32: begin
PDWORD(DestP)^ := pfRGB(NowPixelFormat, c, c, c);
Inc(PDWORD(DestP));
end;
end;
end;
 
3833,1597 → 2779,253
end;
end;
 
//--------------------------------------------------------------------------------------------------
// Version : 0.1 - 26/06/2000 //
// Version : 0.2 - 04/07/2000 //
// At someone's request, i have added 3 news effects : //
// 1 - Rotate //
// 2 - SplitBlur //
// 3 - GaussianBlur //
//--------------------------------------------------------------------------------------------------
// - NEW SPECIAL EFFECT - (English) //
//--------------------------------------------------------------------------------------------------
// At the start, my idea was to create a component derived from TCustomDXDraw. Unfortunately, //
// it's impossible to run a graphic component (derived from TCustomDXDraw) in a conception's //
// mode (i don't success, but perhaps, somebody know how doing ! In that case, please help me !!!)//
// Then, i'm used the DIB's unit for my work, but this unit is poor in special effect. Knowing a //
// library with more effect, i'm undertaked to import this library in DIB's unit. You can see the //
// FastLib library at : //
// //
// -> Gordon Alex Cowie <gfody@jps.net> www.jps.net/gfody //
// //
// It was very difficult, because implementation's graphic was very different that DIB's unit. //
// Sometimes, i'm deserted the possibility of original effect, particularly in conversion of DIB //
// whith 256, 16 and 2 colors. If someone can implement this fonctionnality, thanks to tell me //
// how this miracle is possible !!! //
// All these procedures are translated and adapted by : //
// //
// -> Mickey (Michel HIBON) <mhibon@ifrance.com> http://mickey.tsx.org //
// //
// IMPORTANT : These procedures don't modify the DIB's unit structure //
// Nota Bene : I don't implement these type of graphics (32 and 16 bit per pixels), //
// for one reason : I haven't bitmaps of this type !!! //
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// - NOUVEAUX EFFETS SPECIAUX - (Français) //
//--------------------------------------------------------------------------------------------------
// Au commencement, mon idée était de dériver un composant de TCustomDXDraw. Malheureusement, //
// c'est impossible de faire fonctionner un composant graphique (derivé de TCustomDXDraw) en mode //
// conception (je n'y suis pas parvenu, mais peut-être, que quelqu'un sait comment faire ! Dans //
// ce cas, vous seriez aimable de m'aider !!!) //
// Alors, j'ai utilisé l'unité DIB pour mon travail,mais celle-ci est pauvre en effet spéciaux. //
// Connaissant une librairie avec beaucoup plus d'effets spéciaux, j'ai entrepris d'importer //
// cette librairie dans l'unité DIB. Vous pouvez voir la librairie FastLib à : //
// //
// -> Gordon Alex Cowie <gfody@jps.net> www.jps.net/gfody //
// //
// C'était très difficile car l'implémentation graphique est très différente de l'unité DIB. //
// Parfois, j'ai abandonné les possibilités de l'effet original, particulièrement dans la //
// conversion des DIB avec 256, 16 et 2 couleurs. Si quelqu'un arrive à implémenter ces //
// fonctionnalités, merci de me dire comment ce miracle est possible !!! //
// Toutes ces procédures ont été traduites et adaptées par: //
// //
// -> Mickey (Michel HIBON) <mhibon@ifrance.com> http://mickey.tsx.org //
// //
// IMPORTANT : Ces procédures ne modifient pas la structure de l'unité DIB //
// Nota Bene : Je n'ai pas implémenté ces types de graphiques (32 et 16 bit par pixels), //
// pour une raison : je n'ai pas de bitmap de ce type !!! //
//--------------------------------------------------------------------------------------------------
 
function TDIB.IntToColor(i: Integer): TBGR;
procedure TDIB.Mirror(MirrorX, MirrorY: Boolean);
var
x, y, Width2, c: Integer;
P1, P2, TempBuf: Pointer;
begin
Result.b := i shr 16;
Result.g := i shr 8;
Result.r := i;
end;
if Empty then exit;
if (not MirrorX) and (not MirrorY) then Exit;
 
function TDIB.Interval(iMin, iMax, iValue: Integer; iMark: Boolean): Integer;
begin
if iMark then
if (not MirrorX) and (MirrorY) then
begin
if iValue < iMin then
Result := iMin
else
if iValue > iMax then
Result := iMax
else
Result := iValue;
end
else
begin
if iValue < iMin then
Result := iMin
else
if iValue > iMax then
Result := iMin
else
Result := iValue;
end;
end;
 
procedure TDIB.Contrast(Amount: Integer);
var
x, y: Integer;
Table1: array[0..255] of Byte;
i: Byte;
S, D: pointer;
Temp1: TDIB;
color: DWORD;
P: PByte;
R, G, B: Byte;
begin
D := nil;
S := nil;
Temp1 := nil;
for i := 0 to 126 do
begin
y := (Abs(128 - i) * Amount) div 256;
Table1[i] := IntToByte(i - y);
end;
for i := 127 to 255 do
begin
y := (Abs(128 - i) * Amount) div 256;
Table1[i] := IntToByte(i + y);
end;
case BitCount of
32: Exit; // I haven't bitmap of this type ! Sorry
24: ; // nothing to do
16: ; // I have an artificial bitmap for this type ! i don't sure that it works
8, 4:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, BitCount);
for i := 0 to 255 do
GetMem(TempBuf, WidthBytes);
try
StartProgress('Mirror');
try
for y:=0 to Height shr 1-1 do
begin
with ColorTable[i] do
begin
rgbRed := IntToByte(Table1[rgbRed]);
rgbGreen := IntToByte(Table1[rgbGreen]);
rgbBlue := IntToByte(Table1[rgbBlue]);
end;
end;
UpdatePalette;
end;
else
// if the number of pixel is equal to 1 then exit of procedure
Exit;
end;
for y := 0 to Pred(Height) do
begin
case BitCount of
24, 16: D := ScanLine[y];
8, 4:
begin
D := Temp1.ScanLine[y];
S := Temp1.ScanLine[y];
end;
else
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
32: ;
24:
begin
PBGR(D)^.B := Table1[PBGR(D)^.B];
PBGR(D)^.G := Table1[PBGR(D)^.G];
PBGR(D)^.R := Table1[PBGR(D)^.R];
Inc(PBGR(D));
end;
16:
begin
pfGetRGB(NowPixelFormat, PWord(D)^, R, G, B);
PWord(D)^ := Table1[R] + Table1[G] + Table1[B];
Inc(PWord(D));
end;
8:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
PByte(D)^ := color;
Inc(PByte(D));
end;
4:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
P := @PArrayByte(D)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (color shl Shift4[X and 1]);
end;
else
end;
end;
end;
case BitCount of
8, 4: Temp1.Free;
else
end;
end;
P1 := ScanLine[y];
P2 := ScanLine[Height-y-1];
 
procedure TDIB.Saturation(Amount: Integer);
var
Grays: array[0..767] of Integer;
Alpha: array[0..255] of Word;
Gray, x, y: Integer;
i: Byte;
S, D: pointer;
Temp1: TDIB;
color: DWORD;
P: PByte;
R, G, B: Byte;
begin
D := nil;
S := nil;
Temp1 := nil;
for i := 0 to 255 do
Alpha[i] := (i * Amount) shr 8;
x := 0;
for i := 0 to 255 do
begin
Gray := i - Alpha[i];
Grays[x] := Gray;
Inc(x);
Grays[x] := Gray;
Inc(x);
Grays[x] := Gray;
Inc(x);
end;
case BitCount of
32: Exit; // I haven't bitmap of this type ! Sorry
24: ; // nothing to do
16: ; // I have an artificial bitmap for this type ! i don't sure that it works
8, 4:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, BitCount);
for i := 0 to 255 do
begin
with ColorTable[i] do
begin
Gray := Grays[rgbRed + rgbGreen + rgbBlue];
rgbRed := IntToByte(Gray + Alpha[rgbRed]);
rgbGreen := IntToByte(Gray + Alpha[rgbGreen]);
rgbBlue := IntToByte(Gray + Alpha[rgbBlue]);
end;
Move(P1^, TempBuf^, WidthBytes);
Move(P2^, P1^, WidthBytes);
Move(TempBuf^, P2^, WidthBytes);
 
UpdateProgress(y*2);
end;
UpdatePalette;
finally
EndProgress;
end;
else
// if the number of pixel is equal to 1 then exit of procedure
Exit;
end;
for y := 0 to Pred(Height) do
begin
case BitCount of
24, 16: D := ScanLine[y];
8, 4:
begin
D := Temp1.ScanLine[y];
S := Temp1.ScanLine[y];
end;
else
finally
FreeMem(TempBuf, WidthBytes);
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
32: ;
24:
begin
Gray := Grays[PBGR(D)^.R + PBGR(D)^.G + PBGR(D)^.B];
PBGR(D)^.B := IntToByte(Gray + Alpha[PBGR(D)^.B]);
PBGR(D)^.G := IntToByte(Gray + Alpha[PBGR(D)^.G]);
PBGR(D)^.R := IntToByte(Gray + Alpha[PBGR(D)^.R]);
Inc(PBGR(D));
end;
16:
begin
pfGetRGB(NowPixelFormat, PWord(D)^, R, G, B);
PWord(D)^ := IntToByte(Gray + Alpha[B]) + IntToByte(Gray + Alpha[G]) +
IntToByte(Gray + Alpha[R]);
Inc(PWord(D));
end;
8:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
PByte(D)^ := color;
Inc(PByte(D));
end;
4:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
P := @PArrayByte(D)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (color shl Shift4[X and 1]);
end;
else
end;
end;
end;
case BitCount of
8, 4: Temp1.Free;
else
end;
end;
 
procedure TDIB.Lightness(Amount: Integer);
var
x, y: Integer;
Table1: array[0..255] of Byte;
i: Byte;
S, D: pointer;
Temp1: TDIB;
color: DWORD;
P: PByte;
R, G, B: Byte;
begin
D := nil;
S := nil;
Temp1 := nil;
if Amount < 0 then
end else if (MirrorX) and (not MirrorY) then
begin
Amount := -Amount;
for i := 0 to 255 do
Table1[i] := IntToByte(i - ((Amount * i) shr 8));
end
else
for i := 0 to 255 do
Table1[i] := IntToByte(i + ((Amount * (i xor 255)) shr 8));
case BitCount of
32: Exit; // I haven't bitmap of this type ! Sorry
24: ; // nothing to do
16: ; // I have an artificial bitmap for this type ! i don't sure that it works
8, 4:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, BitCount);
for i := 0 to 255 do
begin
with ColorTable[i] do
begin
rgbRed := IntToByte(Table1[rgbRed]);
rgbGreen := IntToByte(Table1[rgbGreen]);
rgbBlue := IntToByte(Table1[rgbBlue]);
end;
end;
UpdatePalette;
end;
else
// if the number of pixel is equal to 1 then exit of procedure
Exit;
end;
for y := 0 to Pred(Height) do
begin
case BitCount of
24, 16: D := ScanLine[y];
8, 4:
begin
D := Temp1.ScanLine[y];
S := Temp1.ScanLine[y];
end;
else
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
32: ;
24:
begin
PBGR(D)^.B := Table1[PBGR(D)^.B];
PBGR(D)^.G := Table1[PBGR(D)^.G];
PBGR(D)^.R := Table1[PBGR(D)^.R];
Inc(PBGR(D));
end;
16:
begin
pfGetRGB(NowPixelFormat, PWord(D)^, R, G, B);
PWord(D)^ := Table1[R] + Table1[G] + Table1[B];
Inc(PWord(D));
end;
8:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
PByte(D)^ := color;
Inc(PByte(D));
end;
4:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
P := @PArrayByte(D)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (color shl Shift4[X and 1]);
end;
else
end;
end;
end;
case BitCount of
8, 4: Temp1.Free;
else
end;
end;
Width2 := Width shr 1;
 
procedure TDIB.AddRGB(aR, aG, aB: Byte);
var
Table: array[0..255] of TBGR;
x, y: Integer;
i: Byte;
D: pointer;
P: PByte;
color: DWORD;
Temp1: TDIB;
R, G, B: Byte;
begin
color := 0;
D := nil;
Temp1 := nil;
case BitCount of
32: Exit; // I haven't bitmap of this type ! Sorry
24, 16:
StartProgress('Mirror');
try
for y:=0 to Height-1 do
begin
for i := 0 to 255 do
begin
Table[i].b := IntToByte(i + aB);
Table[i].g := IntToByte(i + aG);
Table[i].r := IntToByte(i + aR);
end;
end;
8, 4:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, BitCount);
for i := 0 to 255 do
begin
with ColorTable[i] do
begin
rgbRed := IntToByte(rgbRed + aR);
rgbGreen := IntToByte(rgbGreen + aG);
rgbBlue := IntToByte(rgbBlue + aB);
end;
end;
UpdatePalette;
end;
else
// if the number of pixel is equal to 1 then exit of procedure
Exit;
end;
for y := 0 to Pred(Height) do
begin
case BitCount of
24, 16: D := ScanLine[y];
8, 4:
begin
D := Temp1.ScanLine[y];
end;
else
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
32: ; // I haven't bitmap of this type ! Sorry
24:
begin
PBGR(D)^.B := Table[PBGR(D)^.B].b;
PBGR(D)^.G := Table[PBGR(D)^.G].g;
PBGR(D)^.R := Table[PBGR(D)^.R].r;
Inc(PBGR(D));
end;
16:
begin
pfGetRGB(NowPixelFormat, PWord(D)^, R, G, B);
PWord(D)^ := Table[R].r + Table[G].g + Table[B].b;
Inc(PWord(D));
end;
8:
begin
Inc(PByte(D));
end;
4:
begin
P := @PArrayByte(D)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (color shl Shift4[X and 1]);
end;
else
end;
end;
end;
case BitCount of
8, 4: Temp1.Free;
else
end;
end;
P1 := ScanLine[y];
 
function TDIB.Filter(Dest: TDIB; Filter: TFilter): Boolean;
var
Sum, r, g, b, x, y: Integer;
a, i, j: byte;
tmp: TBGR;
Col: PBGR;
D: Pointer;
begin
Result := True;
Sum := Filter[0, 0] + Filter[1, 0] + Filter[2, 0] +
Filter[0, 1] + Filter[1, 1] + Filter[2, 1] +
Filter[0, 2] + Filter[1, 2] + Filter[2, 2];
if Sum = 0 then
Sum := 1;
Col := PBits;
for y := 0 to Pred(Height) do
begin
D := Dest.ScanLine[y];
for x := 0 to Pred(Width) do
begin
r := 0; g := 0; b := 0;
case BitCount of
32, 16, 4, 1:
begin
Result := False;
Exit;
end;
24:
begin
for i := 0 to 2 do
begin
for j := 0 to 2 do
begin
Tmp := IntToColor(Pixels[Interval(0, Pred(Width), x + Pred(i), True),
Interval(0, Pred(Height), y + Pred(j), True)]);
Inc(b, Filter[i, j] * Tmp.b);
Inc(g, Filter[i, j] * Tmp.g);
Inc(r, Filter[i, j] * Tmp.r);
case BitCount of
1 : begin
for x:=0 to Width2-1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width-x-1, y];
Pixels[Width-x-1, y] := c;
end;
end;
end;
Col.b := IntToByte(b div Sum);
Col.g := IntToByte(g div Sum);
Col.r := IntToByte(r div Sum);
Dest.Pixels[x, y] := rgb(Col.r, Col.g, Col.b);
end;
8:
begin
for i := 0 to 2 do
begin
for j := 0 to 2 do
begin
a := (Pixels[Interval(0, Pred(Width), x + Pred(i), True),
Interval(0, Pred(Height), y + Pred(j), True)]);
tmp.r := ColorTable[a].rgbRed;
tmp.g := ColorTable[a].rgbGreen;
tmp.b := ColorTable[a].rgbBlue;
Inc(b, Filter[i, j] * Tmp.b);
Inc(g, Filter[i, j] * Tmp.g);
Inc(r, Filter[i, j] * Tmp.r);
4 : begin
for x:=0 to Width2-1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width-x-1, y];
Pixels[Width-x-1, y] := c;
end;
end;
end;
Col.b := IntToByte(b div Sum);
Col.g := IntToByte(g div Sum);
Col.r := IntToByte(r div Sum);
PByte(D)^ := rgb(Col.r, Col.g, Col.b);
Inc(PByte(D));
end;
end;
end;
end;
end;
 
procedure TDIB.Spray(Amount: Integer);
var
value, x, y: Integer;
D: Pointer;
color: DWORD;
P: PByte;
begin
for y := Pred(Height) downto 0 do
begin
D := ScanLine[y];
for x := 0 to Pred(Width) do
begin
value := Random(Amount);
color := Pixels[Interval(0, Pred(Width), x + (value - Random(value * 2)), True),
Interval(0, Pred(Height), y + (value - Random(value * 2)), True)];
case BitCount of
32:
begin
PDWord(D)^ := color;
Inc(PDWord(D));
end;
24:
begin
PBGR(D)^ := IntToColor(color);
Inc(PBGR(D));
end;
16:
begin
PWord(D)^ := color;
Inc(PWord(D));
end;
8:
begin
PByte(D)^ := color;
Inc(PByte(D));
end;
4:
begin
P := @PArrayByte(D)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (color shl Shift4[X and 1]);
end;
1:
begin
P := @PArrayByte(D)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (color shl Shift1[X and 7]);
end;
else
end;
end;
end;
end;
 
procedure TDIB.Sharpen(Amount: Integer);
var
Lin0, Lin1, Lin2: PLines;
pc: PBGR;
cx, x, y: Integer;
Buf: array[0..8] of TBGR;
D: pointer;
c: DWORD;
i: byte;
P1: PByte;
Temp1: TDIB;
 
begin
D := nil;
GetMem(pc, SizeOf(TBGR));
c := 0;
Temp1 := nil;
case Bitcount of
32, 16, 1: Exit;
24:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, bitCount);
end;
8:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, bitCount);
for i := 0 to 255 do
begin
with Temp1.ColorTable[i] do
begin
Buf[0].B := ColorTable[i - Amount].rgbBlue;
Buf[0].G := ColorTable[i - Amount].rgbGreen;
Buf[0].R := ColorTable[i - Amount].rgbRed;
Buf[1].B := ColorTable[i].rgbBlue;
Buf[1].G := ColorTable[i].rgbGreen;
Buf[1].R := ColorTable[i].rgbRed;
Buf[2].B := ColorTable[i + Amount].rgbBlue;
Buf[2].G := ColorTable[i + Amount].rgbGreen;
Buf[2].R := ColorTable[i + Amount].rgbRed;
Buf[3].B := ColorTable[i - Amount].rgbBlue;
Buf[3].G := ColorTable[i - Amount].rgbGreen;
Buf[3].R := ColorTable[i - Amount].rgbRed;
Buf[4].B := ColorTable[i].rgbBlue;
Buf[4].G := ColorTable[i].rgbGreen;
Buf[4].R := ColorTable[i].rgbRed;
Buf[5].B := ColorTable[i + Amount].rgbBlue;
Buf[5].G := ColorTable[i + Amount].rgbGreen;
Buf[5].R := ColorTable[i + Amount].rgbRed;
Buf[6].B := ColorTable[i - Amount].rgbBlue;
Buf[6].G := ColorTable[i - Amount].rgbGreen;
Buf[6].R := ColorTable[i - Amount].rgbRed;
Buf[7].B := ColorTable[i].rgbBlue;
Buf[7].G := ColorTable[i].rgbGreen;
Buf[7].R := ColorTable[i].rgbRed;
Buf[8].B := ColorTable[i + Amount].rgbBlue;
Buf[8].G := ColorTable[i + Amount].rgbGreen;
Buf[8].R := ColorTable[i + Amount].rgbRed;
Temp1.colorTable[i].rgbBlue := IntToByte((256 * Buf[4].b - (Buf[0].b + Buf[1].b + Buf[2].b + Buf[3].b +
Buf[5].b + Buf[6].b + Buf[7].b + Buf[8].b) * 16) div 128);
Temp1.colorTable[i].rgbGreen := IntToByte((256 * Buf[4].g - (Buf[0].g + Buf[1].g + Buf[2].g + Buf[3].g +
Buf[5].g + Buf[6].g + Buf[7].g + Buf[8].g) * 16) div 128);
Temp1.colorTable[i].rgbRed := IntToByte((256 * Buf[4].r - (Buf[0].r + Buf[1].r + Buf[2].r + Buf[3].r +
Buf[5].r + Buf[6].r + Buf[7].r + Buf[8].r) * 16) div 128);
 
end;
8 : begin
P2 := Pointer(Integer(P1)+Width-1);
for x:=0 to Width2-1 do
begin
PByte(@c)^ := PByte(P1)^;
PByte(P1)^ := PByte(P2)^;
PByte(P2)^ := PByte(@c)^;
Inc(PByte(P1));
Dec(PByte(P2));
end;
end;
16: begin
P2 := Pointer(Integer(P1)+(Width-1)*2);
for x:=0 to Width2-1 do
begin
PWord(@c)^ := PWord(P1)^;
PWord(P1)^ := PWord(P2)^;
PWord(P2)^ := PWord(@c)^;
Inc(PWord(P1));
Dec(PWord(P2));
end;
end;
24: begin
P2 := Pointer(Integer(P1)+(Width-1)*3);
for x:=0 to Width2-1 do
begin
PBGR(@c)^ := PBGR(P1)^;
PBGR(P1)^ := PBGR(P2)^;
PBGR(P2)^ := PBGR(@c)^;
Inc(PBGR(P1));
Dec(PBGR(P2));
end;
end;
32: begin
P2 := Pointer(Integer(P1)+(Width-1)*4);
for x:=0 to Width2-1 do
begin
PDWORD(@c)^ := PDWORD(P1)^;
PDWORD(P1)^ := PDWORD(P2)^;
PDWORD(P2)^ := PDWORD(@c)^;
Inc(PDWORD(P1));
Dec(PDWORD(P2));
end;
end;
end;
Temp1.UpdatePalette;
end;
4:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, bitCount);
for i := 0 to 255 do
begin
with Temp1.ColorTable[i] do
begin
Buf[0].B := ColorTable[i - Amount].rgbBlue;
Buf[0].G := ColorTable[i - Amount].rgbGreen;
Buf[0].R := ColorTable[i - Amount].rgbRed;
Buf[1].B := ColorTable[i].rgbBlue;
Buf[1].G := ColorTable[i].rgbGreen;
Buf[1].R := ColorTable[i].rgbRed;
Buf[2].B := ColorTable[i + Amount].rgbBlue;
Buf[2].G := ColorTable[i + Amount].rgbGreen;
Buf[2].R := ColorTable[i + Amount].rgbRed;
Buf[3].B := ColorTable[i - Amount].rgbBlue;
Buf[3].G := ColorTable[i - Amount].rgbGreen;
Buf[3].R := ColorTable[i - Amount].rgbRed;
Buf[4].B := ColorTable[i].rgbBlue;
Buf[4].G := ColorTable[i].rgbGreen;
Buf[4].R := ColorTable[i].rgbRed;
Buf[5].B := ColorTable[i + Amount].rgbBlue;
Buf[5].G := ColorTable[i + Amount].rgbGreen;
Buf[5].R := ColorTable[i + Amount].rgbRed;
Buf[6].B := ColorTable[i - Amount].rgbBlue;
Buf[6].G := ColorTable[i - Amount].rgbGreen;
Buf[6].R := ColorTable[i - Amount].rgbRed;
Buf[7].B := ColorTable[i].rgbBlue;
Buf[7].G := ColorTable[i].rgbGreen;
Buf[7].R := ColorTable[i].rgbRed;
Buf[8].B := ColorTable[i + Amount].rgbBlue;
Buf[8].G := ColorTable[i + Amount].rgbGreen;
Buf[8].R := ColorTable[i + Amount].rgbRed;
colorTable[i].rgbBlue := IntToByte((256 * Buf[4].b - (Buf[0].b + Buf[1].b + Buf[2].b + Buf[3].b +
Buf[5].b + Buf[6].b + Buf[7].b + Buf[8].b) * 16) div 128);
colorTable[i].rgbGreen := IntToByte((256 * Buf[4].g - (Buf[0].g + Buf[1].g + Buf[2].g + Buf[3].g +
Buf[5].g + Buf[6].g + Buf[7].g + Buf[8].g) * 16) div 128);
colorTable[i].rgbRed := IntToByte((256 * Buf[4].r - (Buf[0].r + Buf[1].r + Buf[2].r + Buf[3].r +
Buf[5].r + Buf[6].r + Buf[7].r + Buf[8].r) * 16) div 128);
end;
end;
UpdatePalette;
end;
end;
for y := 0 to Pred(Height) do
begin
Lin0 := ScanLine[Interval(0, Pred(Height), y - Amount, True)];
Lin1 := ScanLine[y];
Lin2 := ScanLine[Interval(0, Pred(Height), y + Amount, True)];
case Bitcount of
24, 8, 4: D := Temp1.ScanLine[y];
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
24:
begin
cx := Interval(0, Pred(Width), x - Amount, True);
Buf[0] := Lin0[cx];
Buf[1] := Lin1[cx];
Buf[2] := Lin2[cx];
Buf[3] := Lin0[x];
Buf[4] := Lin1[x];
Buf[5] := Lin2[x];
cx := Interval(0, Pred(Width), x + Amount, true);
Buf[6] := Lin0[cx];
Buf[7] := Lin1[cx];
Buf[8] := Lin0[cx];
pc.b := IntToByte((256 * Buf[4].b - (Buf[0].b + Buf[1].b + Buf[2].b + Buf[3].b +
Buf[5].b + Buf[6].b + Buf[7].b + Buf[8].b) * 16) div 128);
pc.g := IntToByte((256 * Buf[4].g - (Buf[0].g + Buf[1].g + Buf[2].g + Buf[3].g +
Buf[5].g + Buf[6].g + Buf[7].g + Buf[8].g) * 16) div 128);
pc.r := IntToByte((256 * Buf[4].r - (Buf[0].r + Buf[1].r + Buf[2].r + Buf[3].r +
Buf[5].r + Buf[6].r + Buf[7].r + Buf[8].r) * 16) div 128);
PBGR(D)^.B := pc.b;
PBGR(D)^.G := pc.g;
PBGR(D)^.R := pc.r;
Inc(PBGR(D));
end;
8:
begin
Inc(PByte(D));
end;
4:
begin
P1 := @PArrayByte(D)[X shr 1];
P1^ := ((P1^ and Mask4n[X and 1]) or ((c shl Shift4[X and 1])));
end;
end;
end;
end;
case BitCount of
24, 8:
begin
Assign(Temp1);
Temp1.Free;
end;
4: Temp1.Free;
end;
FreeMem(pc, SizeOf(TBGR));
end;
 
procedure TDIB.Emboss;
var
x, y: longint;
D, D1, P: pointer;
color: TBGR;
c: DWORD;
P1: PByte;
 
begin
D := nil;
D1 := nil;
P := nil;
case BitCount of
32, 16, 1: Exit;
24:
begin
D := PBits;
D1 := Ptr(Integer(D) + 3);
UpdateProgress(y);
end;
else
end;
for y := 0 to Pred(Height) do
begin
case Bitcount of
8, 4:
begin
P := ScanLine[y];
end;
finally
EndProgress;
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
24:
begin
PBGR(D)^.B := ((PBGR(D)^.B + (PBGR(D1)^.B xor $FF)) shr 1);
PBGR(D)^.G := ((PBGR(D)^.G + (PBGR(D1)^.G xor $FF)) shr 1);
PBGR(D)^.R := ((PBGR(D)^.R + (PBGR(D1)^.R xor $FF)) shr 1);
Inc(PBGR(D));
if (y < Height - 2) and (x < Width - 2) then
Inc(PBGR(D1));
end;
8:
begin
color.R := (((Pixels[x, y] + (Pixels[x + 3, y] xor $FF)) shr 1) + 30) div 3;
color.G := (((Pixels[x, y] + (Pixels[x + 3, y] xor $FF)) shr 1) + 30) div 3;
color.B := (((Pixels[x, y] + (Pixels[x + 3, y] xor $FF)) shr 1) + 30) div 3;
c := (color.R + color.G + color.B) shr 1;
PByte(P)^ := c;
Inc(PByte(P));
end;
4:
begin
color.R := (((Pixels[x, y] + (Pixels[x + 3, y] xor $FF) + 1) shr 1) + 30) div 3;
color.G := (((Pixels[x, y] + (Pixels[x + 3, y] xor $FF) - 1) shr 1) + 30) div 3;
color.B := (((Pixels[x, y] + (Pixels[x + 3, y] xor $FF) + 1) shr 1) + 30) div 3;
c := (color.R + color.G + color.B) shr 1;
if c > 64 then
c := c - 8;
P1 := @PArrayByte(P)[X shr 1];
P1^ := (P1^ and Mask4n[X and 1]) or ((c) shl Shift4[X and 1]);
end;
else
end;
end;
case BitCount of
24:
begin
D := Ptr(Integer(D1));
if y < Height - 2 then
D1 := Ptr(Integer(D1) + 6)
else
D1 := Ptr(Integer(ScanLine[Pred(Height)]) + 3);
end;
else
end;
end;
end;
 
procedure TDIB.AddMonoNoise(Amount: Integer);
var
value: cardinal;
x, y: longint;
a: byte;
D: pointer;
color: DWORD;
P: PByte;
begin
for y := 0 to Pred(Height) do
end else if (MirrorX) and (MirrorY) then
begin
D := ScanLine[y];
for x := 0 to Pred(Width) do
begin
case BitCount of
32: Exit; // I haven't bitmap of this type ! Sorry
24:
begin
value := Random(Amount) - (Amount shr 1);
PBGR(D)^.B := IntToByte(PBGR(D)^.B + value);
PBGR(D)^.G := IntToByte(PBGR(D)^.G + value);
PBGR(D)^.R := IntToByte(PBGR(D)^.R + value);
Inc(PBGR(D));
end;
16: Exit; // I haven't bitmap of this type ! Sorry
8:
begin
a := ((Random(Amount shr 1) - (Amount div 4))) div 8;
color := Interval(0, 255, (pixels[x, y] - a), True);
PByte(D)^ := color;
Inc(PByte(D));
end;
4:
begin
a := ((Random(Amount shr 1) - (Amount div 4))) div 16;
color := Interval(0, 15, (pixels[x, y] - a), True);
P := @PArrayByte(D)[X shr 1];
P^ := ((P^ and Mask4n[X and 1]) or ((color shl Shift4[X and 1])));
end;
1:
begin
a := ((Random(Amount shr 1) - (Amount div 4))) div 32;
color := Interval(0, 1, (pixels[x, y] - a), True);
P := @PArrayByte(D)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (color shl Shift1[X and 7]);
end;
else
end;
end;
end;
end;
 
procedure TDIB.AddGradiantNoise(Amount: byte);
var
a, i: byte;
x, y: Integer;
Table: array[0..255] of TBGR;
S, D: pointer;
color: DWORD;
Temp1: TDIB;
P: PByte;
 
begin
D := nil;
S := nil;
Temp1 := nil;
case BitCount of
32: Exit; // I haven't bitmap of this type ! Sorry
24:
StartProgress('Mirror');
try
for y:=0 to Height shr 1-1 do
begin
for i := 0 to 255 do
begin
a := Random(Amount);
Table[i].b := IntToByte(i + a);
Table[i].g := IntToByte(i + a);
Table[i].r := IntToByte(i + a);
end;
end;
16: Exit; // I haven't bitmap of this type ! Sorry
8, 4:
begin
Temp1 := TDIB.Create;
Temp1.Assign(self);
Temp1.SetSize(Width, Height, BitCount);
for i := 0 to 255 do
begin
with ColorTable[i] do
begin
a := Random(Amount);
rgbRed := IntToByte(rgbRed + a);
rgbGreen := IntToByte(rgbGreen + a);
rgbBlue := IntToByte(rgbBlue + a);
end;
end;
UpdatePalette;
end;
else
// if the number of pixel is equal to 1 then exit of procedure
Exit;
end;
for y := 0 to Pred(Height) do
begin
case BitCount of
24: D := ScanLine[y];
8, 4:
begin
D := Temp1.ScanLine[y];
S := Temp1.ScanLine[y];
end;
else
end;
for x := 0 to Pred(Width) do
begin
case BitCount of
32: ; // I haven't bitmap of this type ! Sorry
24:
begin
PBGR(D)^.B := Table[PBGR(D)^.B].b;
PBGR(D)^.G := Table[PBGR(D)^.G].g;
PBGR(D)^.R := Table[PBGR(D)^.R].r;
Inc(PBGR(D));
end;
16: ; // I haven't bitmap of this type ! Sorry
8:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
PByte(D)^ := color;
Inc(PByte(D));
end;
4:
begin
with Temp1.ColorTable[PByte(S)^] do
color := rgbRed + rgbGreen + rgbBlue;
Inc(PByte(S));
P := @PArrayByte(D)[X shr 1];
P^ := (P^ and Mask4n[X and 1]) or (color shl Shift4[X and 1]);
end;
else
end;
end;
end;
case BitCount of
8, 4: Temp1.Free;
else
end;
end;
P1 := ScanLine[y];
P2 := ScanLine[Height-y-1];
 
function TDIB.FishEye(bmp: TDIB): Boolean;
var
weight, xmid, ymid, fx, fy, r1, r2, dx, dy, rmax: Double;
Amount, ifx, ify, ty, tx, new_red, new_green, new_blue, ix, iy: Integer;
weight_x, weight_y: array[0..1] of Double;
total_red, total_green, total_blue: Double;
sli, slo: PLines;
//D: Pointer;
begin
Result := True;
case BitCount of
32, 16, 8, 4, 1:
begin
Result := False;
Exit;
end;
end;
Amount := 1;
xmid := Width / 2;
ymid := Height / 2;
rmax := Max(Bmp.Width, Bmp.Height) * Amount;
for ty := 0 to Pred(Height) do
begin
for tx := 0 to Pred(Width) do
begin
dx := tx - xmid;
dy := ty - ymid;
r1 := Sqrt(Sqr(dx) + Sqr(dy));
if r1 <> 0 then
begin
r2 := rmax / 2 * (1 / (1 - r1 / rmax) - 1);
fx := dx * r2 / r1 + xmid;
fy := dy * r2 / r1 + ymid;
end
else
begin
fx := xmid;
fy := ymid;
end;
ify := Trunc(fy);
ifx := Trunc(fx);
if fy >= 0 then
begin
weight_y[1] := fy - ify;
weight_y[0] := 1 - weight_y[1];
end
else
begin
weight_y[0] := -(fy - ify);
weight_y[1] := 1 - weight_y[0];
end;
if fx >= 0 then
begin
weight_x[1] := fx - ifx;
weight_x[0] := 1 - weight_x[1];
end
else
begin
weight_x[0] := -(fx - ifx);
Weight_x[1] := 1 - weight_x[0];
end;
if ifx < 0 then
ifx := Pred(Width) - (-ifx mod Width)
else
if ifx > Pred(Width) then
ifx := ifx mod Width;
if ify < 0 then
ify := Pred(Height) - (-ify mod Height)
else
if ify > Pred(Height) then
ify := ify mod Height;
total_red := 0.0;
total_green := 0.0;
total_blue := 0.0;
for ix := 0 to 1 do
begin
for iy := 0 to 1 do
begin
if ify + iy < Height then
sli := ScanLine[ify + iy]
else
sli := ScanLine[Height - ify - iy];
if ifx + ix < Width then
begin
new_red := sli^[ifx + ix].r;
new_green := sli^[ifx + ix].g;
new_blue := sli^[ifx + ix].b;
end
else
begin
new_red := sli^[Width - ifx - ix].r;
new_green := sli^[Width - ifx - ix].g;
new_blue := sli^[Width - ifx - ix].b;
end;
weight := weight_x[ix] * weight_y[iy];
total_red := total_red + new_red * weight;
total_green := total_green + new_green * weight;
total_blue := total_blue + new_blue * weight;
case BitCount of
1 : begin
for x:=0 to Width-1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width-x-1, Height-y-1];
Pixels[Width-x-1, Height-y-1] := c;
end;
end;
4 : begin
for x:=0 to Width-1 do
begin
c := Pixels[x, y];
Pixels[x, y] := Pixels[Width-x-1, Height-y-1];
Pixels[Width-x-1, Height-y-1] := c;
end;
end;
8 : begin
P2 := Pointer(Integer(P2)+Width-1);
for x:=0 to Width-1 do
begin
PByte(@c)^ := PByte(P1)^;
PByte(P1)^ := PByte(P2)^;
PByte(P2)^ := PByte(@c)^;
Inc(PByte(P1));
Dec(PByte(P2));
end;
end;
16: begin
P2 := Pointer(Integer(P2)+(Width-1)*2);
for x:=0 to Width-1 do
begin
PWord(@c)^ := PWord(P1)^;
PWord(P1)^ := PWord(P2)^;
PWord(P2)^ := PWord(@c)^;
Inc(PWord(P1));
Dec(PWord(P2));
end;
end;
24: begin
P2 := Pointer(Integer(P2)+(Width-1)*3);
for x:=0 to Width-1 do
begin
PBGR(@c)^ := PBGR(P1)^;
PBGR(P1)^ := PBGR(P2)^;
PBGR(P2)^ := PBGR(@c)^;
Inc(PBGR(P1));
Dec(PBGR(P2));
end;
end;
32: begin
P2 := Pointer(Integer(P2)+(Width-1)*4);
for x:=0 to Width-1 do
begin
PDWORD(@c)^ := PDWORD(P1)^;
PDWORD(P1)^ := PDWORD(P2)^;
PDWORD(P2)^ := PDWORD(@c)^;
Inc(PDWORD(P1));
Dec(PDWORD(P2));
end;
end;
end;
end;
case bitCount of
24:
begin
slo := Bmp.ScanLine[ty];
slo^[tx].r := Round(total_red);
slo^[tx].g := Round(total_green);
slo^[tx].b := Round(total_blue);
end;
else
// You can implement this procedure for 16,8,4,2 and 32 BitCount's DIB
Exit;
end;
end;
end;
end;
 
function TDIB.SmoothRotateWrap(Bmp: TDIB; cx, cy: Integer; Degree: Extended): Boolean;
var
weight, Theta, cosTheta, sinTheta, sfrom_y, sfrom_x: Double;
ifrom_y, ifrom_x, xDiff, yDiff, to_y, to_x: Integer;
weight_x, weight_y: array[0..1] of Double;
ix, iy, new_red, new_green, new_blue: Integer;
total_red, total_green, total_blue: Double;
sli, slo: PLines;
begin
Result := True;
case BitCount of
32, 16, 8, 4, 1:
begin
Result := False;
Exit;
UpdateProgress(y*2);
end;
end;
Theta := -Degree * Pi / 180;
sinTheta := Sin(Theta);
cosTheta := Cos(Theta);
xDiff := (Bmp.Width - Width) div 2;
yDiff := (Bmp.Height - Height) div 2;
for to_y := 0 to Pred(Bmp.Height) do
begin
for to_x := 0 to Pred(Bmp.Width) do
begin
sfrom_x := (cx + (to_x - cx) * cosTheta - (to_y - cy) * sinTheta) - xDiff;
ifrom_x := Trunc(sfrom_x);
sfrom_y := (cy + (to_x - cx) * sinTheta + (to_y - cy) * cosTheta) - yDiff;
ifrom_y := Trunc(sfrom_y);
if sfrom_y >= 0 then
begin
weight_y[1] := sfrom_y - ifrom_y;
weight_y[0] := 1 - weight_y[1];
end
else
begin
weight_y[0] := -(sfrom_y - ifrom_y);
weight_y[1] := 1 - weight_y[0];
end;
if sfrom_x >= 0 then
begin
weight_x[1] := sfrom_x - ifrom_x;
weight_x[0] := 1 - weight_x[1];
end
else
begin
weight_x[0] := -(sfrom_x - ifrom_x);
Weight_x[1] := 1 - weight_x[0];
end;
if ifrom_x < 0 then
ifrom_x := Pred(Width) - (-ifrom_x mod Width)
else
if ifrom_x > Pred(Width) then
ifrom_x := ifrom_x mod Width;
if ifrom_y < 0 then
ifrom_y := Pred(Height) - (-ifrom_y mod Height)
else
if ifrom_y > Pred(Height) then
ifrom_y := ifrom_y mod Height;
total_red := 0.0;
total_green := 0.0;
total_blue := 0.0;
for ix := 0 to 1 do
begin
for iy := 0 to 1 do
begin
if ifrom_y + iy < Height then
sli := ScanLine[ifrom_y + iy]
else
sli := ScanLine[Height - ifrom_y - iy];
if ifrom_x + ix < Width then
begin
new_red := sli^[ifrom_x + ix].r;
new_green := sli^[ifrom_x + ix].g;
new_blue := sli^[ifrom_x + ix].b;
end
else
begin
new_red := sli^[Width - ifrom_x - ix].r;
new_green := sli^[Width - ifrom_x - ix].g;
new_blue := sli^[Width - ifrom_x - ix].b;
end;
weight := weight_x[ix] * weight_y[iy];
total_red := total_red + new_red * weight;
total_green := total_green + new_green * weight;
total_blue := total_blue + new_blue * weight;
end;
end;
case bitCount of
24:
begin
slo := Bmp.ScanLine[to_y];
slo^[to_x].r := Round(total_red);
slo^[to_x].g := Round(total_green);
slo^[to_x].b := Round(total_blue);
end;
else
// You can implement this procedure for 16,8,4,2 and 32 BitCount's DIB
Exit;
end;
finally
EndProgress;
end;
end;
end;
 
function TDIB.Rotate(Dst: TDIB; cx, cy: Integer; Angle: Double): Boolean;
procedure TDIB.Negative;
var
x, y, dx, dy, sdx, sdy, xDiff, yDiff, isinTheta, icosTheta: Integer;
D, S: Pointer;
sinTheta, cosTheta, Theta: Double;
Col: TBGR;
i: byte;
color: DWORD;
P: PByte;
i, i2: Integer;
P: Pointer;
begin
D := nil;
S := nil;
Result := True;
dst.SetSize(Width, Height, Bitcount);
dst.Canvas.Brush.Color := clBlack;
Dst.Canvas.FillRect(Bounds(0, 0, Width, Height));
case BitCount of
32, 16:
begin
Result := False;
Exit;
end;
8, 4, 1:
begin
for i := 0 to 255 do
Dst.ColorTable[i] := ColorTable[i];
Dst.UpdatePalette;
end;
end;
Theta := -Angle * Pi / 180;
sinTheta := Sin(Theta);
cosTheta := Cos(Theta);
xDiff := (Dst.Width - Width) div 2;
yDiff := (Dst.Height - Height) div 2;
isinTheta := Round(sinTheta * $10000);
icosTheta := Round(cosTheta * $10000);
for y := 0 to Pred(Dst.Height) do
begin
case BitCount of
4, 1:
begin
D := Dst.ScanLine[y];
S := ScanLine[y];
end;
else
end;
sdx := Round(((cx + (-cx) * cosTheta - (y - cy) * sinTheta) - xDiff) * $10000);
sdy := Round(((cy + (-cy) * sinTheta + (y - cy) * cosTheta) - yDiff) * $10000);
for x := 0 to Pred(Dst.Width) do
begin
dx := (sdx shr 16);
dy := (sdy shr 16);
if (dx > -1) and (dx < Width) and (dy > -1) and (dy < Height) then
begin
case bitcount of
8, 24: Dst.pixels[x, y] := Pixels[dx, dy];
4:
begin
pfGetRGB(NowPixelFormat, Pixels[dx, dy], col.r, col.g, col.b);
color := col.r + col.g + col.b;
Inc(PByte(S));
P := @PArrayByte(D)[x shr 1];
P^ := (P^ and Mask4n[x and 1]) or (color shl Shift4[x and 1]);
end;
1:
begin
pfGetRGB(NowPixelFormat, Pixels[dx, dy], col.r, col.g, col.b);
color := col.r + col.g + col.b;
Inc(PByte(S));
P := @PArrayByte(D)[X shr 3];
P^ := (P^ and Mask1n[X and 7]) or (color shl Shift1[X and 7]);
end;
end;
end;
Inc(sdx, icosTheta);
Inc(sdy, isinTheta);
end;
end;
end;
if Empty then exit;
 
procedure TDIB.GaussianBlur(Bmp: TDIB; Amount: Integer);
var
i: Integer;
begin
for i := 1 to Amount do
Bmp.SplitBlur(i);
end;
 
procedure TDIB.SplitBlur(Amount: Integer);
var
Lin1, Lin2: PLines;
cx, x, y: Integer;
Buf: array[0..3] of TBGR;
D: Pointer;
 
begin
case Bitcount of
32, 16, 8, 4, 1: Exit;
end;
for y := 0 to Pred(Height) do
if BitCount<=8 then
begin
Lin1 := ScanLine[TrimInt(y + Amount, 0, Pred(Height))];
Lin2 := ScanLine[TrimInt(y - Amount, 0, Pred(Height))];
D := ScanLine[y];
for x := 0 to Pred(Width) do
begin
cx := TrimInt(x + Amount, 0, Pred(Width));
Buf[0] := Lin1[cx];
Buf[1] := Lin2[cx];
cx := TrimInt(x - Amount, 0, Pred(Width));
Buf[2] := Lin1[cx];
Buf[3] := Lin2[cx];
PBGR(D)^.b := (Buf[0].b + Buf[1].b + Buf[2].b + Buf[3].b) shr 2;
PBGR(D)^.g := (Buf[0].g + Buf[1].g + Buf[2].g + Buf[3].g) shr 2;
PBGR(D)^.r := (Buf[0].r + Buf[1].r + Buf[2].r + Buf[3].r) shr 2;
Inc(PBGR(D));
end;
end;
end;
 
function TDIB.Twist(bmp: TDIB; Amount: byte): Boolean;
var
fxmid, fymid: Single;
txmid, tymid: Single;
fx, fy: Single;
tx2, ty2: Single;
r: Single;
theta: Single;
ifx, ify: Integer;
dx, dy: Single;
OFFSET: Single;
ty, tx, ix, iy: Integer;
weight_x, weight_y: array[0..1] of Single;
weight: Single;
new_red, new_green, new_blue: Integer;
total_red, total_green, total_blue: Single;
sli, slo: PLines;
 
function ArcTan2(xt, yt: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if xt = 0 then
if yt > 0 then
Result := Pi / 2
else
Result := -(Pi / 2)
else
begin
Result := ArcTan(yt / xt);
if xt < 0 then
Result := Pi + ArcTan(yt / xt);
end;
end;
 
begin
Result := True;
case BitCount of
32, 16, 8, 4, 1:
for i:=0 to 255 do
with ColorTable[i] do
begin
Result := False;
Exit;
rgbRed := 255-rgbRed;
rgbGreen := 255-rgbGreen;
rgbBlue := 255-rgbBlue;
end;
end;
if Amount = 0 then
Amount := 1;
OFFSET := -(Pi / 2);
dx := Pred(Width);
dy := Pred(Height);
r := Sqrt(dx * dx + dy * dy);
tx2 := r;
ty2 := r;
txmid := (Pred(Width)) / 2;
tymid := (Pred(Height)) / 2;
fxmid := (Pred(Width)) / 2;
fymid := (Pred(Height)) / 2;
if tx2 >= Width then
tx2 := Pred(Width);
if ty2 >= Height then
ty2 := Pred(Height);
for ty := 0 to Round(ty2) do
UpdatePalette;
end else
begin
for tx := 0 to Round(tx2) do
begin
dx := tx - txmid;
dy := ty - tymid;
r := Sqrt(dx * dx + dy * dy);
if r = 0 then
begin
fx := 0;
fy := 0;
end
else
begin
theta := ArcTan2(dx, dy) - r / Amount - OFFSET;
fx := r * Cos(theta);
fy := r * Sin(theta);
end;
fx := fx + fxmid;
fy := fy + fymid;
ify := Trunc(fy);
ifx := Trunc(fx);
if fy >= 0 then
begin
weight_y[1] := fy - ify;
weight_y[0] := 1 - weight_y[1];
end
else
begin
weight_y[0] := -(fy - ify);
weight_y[1] := 1 - weight_y[0];
end;
if fx >= 0 then
begin
weight_x[1] := fx - ifx;
weight_x[0] := 1 - weight_x[1];
end
else
begin
weight_x[0] := -(fx - ifx);
Weight_x[1] := 1 - weight_x[0];
end;
if ifx < 0 then
ifx := Pred(Width) - (-ifx mod Width)
else
if ifx > Pred(Width) then
ifx := ifx mod Width;
if ify < 0 then
ify := Pred(Height) - (-ify mod Height)
else
if ify > Pred(Height) then
ify := ify mod Height;
total_red := 0.0;
total_green := 0.0;
total_blue := 0.0;
for ix := 0 to 1 do
begin
for iy := 0 to 1 do
begin
if ify + iy < Height then
sli := ScanLine[ify + iy]
else
sli := ScanLine[Height - ify - iy];
if ifx + ix < Width then
begin
new_red := sli^[ifx + ix].r;
new_green := sli^[ifx + ix].g;
new_blue := sli^[ifx + ix].b;
end
else
begin
new_red := sli^[Width - ifx - ix].r;
new_green := sli^[Width - ifx - ix].g;
new_blue := sli^[Width - ifx - ix].b;
end;
weight := weight_x[ix] * weight_y[iy];
total_red := total_red + new_red * weight;
total_green := total_green + new_green * weight;
total_blue := total_blue + new_blue * weight;
end;
end;
case bitCount of
24:
begin
slo := bmp.ScanLine[ty];
slo^[tx].r := Round(total_red);
slo^[tx].g := Round(total_green);
slo^[tx].b := Round(total_blue);
end;
else
// You can implement this procedure for 16,8,4,2 and 32 BitCount's DIB
Exit;
end;
end;
end;
end;
P := PBits;
i2 := Size;
asm
mov ecx,i2
mov eax,P
mov edx,ecx
 
function TDIB.TrimInt(i, Min, Max: Integer): Integer;
begin
if i > Max then
Result := Max
else
if i < Min then
Result := Min
else
Result := i;
end;
{ Unit of DWORD. }
@@qword_skip:
shr ecx,2
jz @@dword_skip
 
function TDIB.IntToByte(i: Integer): Byte;
begin
if i > 255 then
Result := 255
else
if i < 0 then
Result := 0
else
Result := i;
end;
dec ecx
@@dword_loop:
not dword ptr [eax+ecx*4]
dec ecx
jnl @@dword_loop
 
//--------------------------------------------------------------------------------------------------
// End of these New Special Effect //
// Please contributes to add effects and filters to this collection //
// Please, work to implement 32,16,8,4,2 BitCount's DIB //
// Have fun - Mickey - Good job //
//--------------------------------------------------------------------------------------------------
mov ecx,edx
shr ecx,2
add eax,ecx*4
 
function TDIB.GetAlphaChannel: TDIB;
var
I: Integer;
begin
RetAlphaChannel(Result);
if Result = nil then Exit;
{ Unit of Byte. }
@@dword_skip:
mov ecx,edx
and ecx,3
jz @@byte_skip
 
if FFreeList.Count > 0 then
for I := 0 to FFreeList.Count - 1 do
if FFreeList[I] = Result then Exit;
dec ecx
@@loop_byte:
not byte ptr [eax+ecx]
dec ecx
jnl @@loop_byte
 
FFreeList.Add(Result);
end;
 
procedure TDIB.SetAlphaChannel(const Value: TDIB);
begin
if not AssignAlphaChannel(Value{$IFNDEF VER4UP}, False{$ENDIF}) then
Exception.Create('Cannot set alphachannel from DIB.');
end;
 
procedure TDIB.Fill(aColor: TColor);
var
p: PRGBA;
y: Integer;
x: Integer;
begin
Canvas.Brush.Color := aColor;
Canvas.FillRect(ClientRect);
if Self.BitCount = 32 then
begin
//fill alpha chanell too with $FF
for Y := 0 to Self.Height - 1 do
begin
p := Self.ScanLine[Y];
for X := 0 to Self.Width - 1 do
begin
p[X].rgbReserved := $FF
end;
@@byte_skip:
end;
end;
end;
 
function TDIB.GetClientRect: TRect;
begin
Result := Bounds(0, 0, Width, Height);
end;
 
{ TCustomDXDIB }
 
constructor TCustomDXDIB.Create(AOnwer: TComponent);
5470,26 → 3072,23
 
procedure Draw2(Width, Height: Integer);
begin
if (Width <> FDIB.Width) or (Height <> FDIB.Height) then
if (Width<>FDIB.Width) or (Height<>FDIB.Height) then
begin
if FCenter then
begin
inherited Canvas.StretchDraw(Bounds(-(Width - ClientWidth) div 2,
-(Height - ClientHeight) div 2, Width, Height), FDIB);
end
else
inherited Canvas.StretchDraw(Bounds(-(Width-ClientWidth) div 2,
-(Height-ClientHeight) div 2, Width, Height), FDIB);
end else
begin
inherited Canvas.StretchDraw(Bounds(0, 0, Width, Height), FDIB);
end;
end
else
end else
begin
if FCenter then
begin
inherited Canvas.Draw(-(Width - ClientWidth) div 2, -(Height - ClientHeight) div 2,
inherited Canvas.Draw(-(Width-ClientWidth) div 2, -(Height-ClientHeight) div 2,
FDIB);
end
else
end else
begin
inherited Canvas.Draw(0, 0, FDIB);
end;
5513,60 → 3112,53
 
if FDIB.Empty then Exit;
 
if (FViewWidth > 0) or (FViewHeight > 0) then
if (FViewWidth>0) or (FViewHeight>0) then
begin
ViewWidth2 := FViewWidth;
if ViewWidth2 = 0 then ViewWidth2 := FDIB.Width;
if ViewWidth2=0 then ViewWidth2 := FDIB.Width;
ViewHeight2 := FViewHeight;
if ViewHeight2 = 0 then ViewHeight2 := FDIB.Height;
if ViewHeight2=0 then ViewHeight2 := FDIB.Height;
 
if FAutoStretch then
begin
if (ClientWidth < ViewWidth2) or (ClientHeight < ViewHeight2) then
if (ClientWidth<ViewWidth2) or (ClientHeight<ViewHeight2) then
begin
r := ViewWidth2 / ClientWidth;
r2 := ViewHeight2 / ClientHeight;
if r > r2 then
r := ViewWidth2/ClientWidth;
r2 := ViewHeight2/ClientHeight;
if r>r2 then
r := r2;
Draw2(Round(r * ClientWidth), Round(r * ClientHeight));
end
else
Draw2(Round(r*ClientWidth), Round(r*ClientHeight));
end else
Draw2(ViewWidth2, ViewHeight2);
end
else
end else
Draw2(ViewWidth2, ViewHeight2);
end
else
end else
begin
if FAutoStretch then
begin
if (FDIB.Width > ClientWidth) or (FDIB.Height > ClientHeight) then
if (FDIB.Width>ClientWidth) or (FDIB.Height>ClientHeight) then
begin
r := ClientWidth / FDIB.Width;
r2 := ClientHeight / FDIB.Height;
if r > r2 then
r := ClientWidth/FDIB.Width;
r2 := ClientHeight/FDIB.Height;
if r>r2 then
r := r2;
Draw2(Round(r * FDIB.Width), Round(r * FDIB.Height));
end
else
Draw2(Round(r*FDIB.Width), Round(r*FDIB.Height));
end else
Draw2(FDIB.Width, FDIB.Height);
end
else
if FStretch then
end else
if FStretch then
begin
if FKeepAspect then
begin
if FKeepAspect then
begin
r := ClientWidth / FDIB.Width;
r2 := ClientHeight / FDIB.Height;
if r > r2 then
r := r2;
Draw2(Round(r * FDIB.Width), Round(r * FDIB.Height));
end
else
Draw2(ClientWidth, ClientHeight);
end
else
Draw2(FDIB.Width, FDIB.Height);
r := ClientWidth/FDIB.Width;
r2 := ClientHeight/FDIB.Height;
if r>r2 then
r := r2;
Draw2(Round(r*FDIB.Width), Round(r*FDIB.Height));
end else
Draw2(ClientWidth, ClientHeight);
end else
Draw2(FDIB.Width, FDIB.Height);
end;
end;
end;
5573,7 → 3165,7
 
procedure TCustomDXPaintBox.SetAutoStretch(Value: Boolean);
begin
if FAutoStretch <> Value then
if FAutoStretch<>Value then
begin
FAutoStretch := Value;
Invalidate;
5582,7 → 3174,7
 
procedure TCustomDXPaintBox.SetCenter(Value: Boolean);
begin
if FCenter <> Value then
if FCenter<>Value then
begin
FCenter := Value;
Invalidate;
5591,7 → 3183,7
 
procedure TCustomDXPaintBox.SetDIB(Value: TDIB);
begin
if FDIB <> Value then
if FDIB<>Value then
begin
FDIB.Assign(Value);
Invalidate;
5600,7 → 3192,7
 
procedure TCustomDXPaintBox.SetKeepAspect(Value: Boolean);
begin
if Value <> FKeepAspect then
if Value<>FKeepAspect then
begin
FKeepAspect := Value;
Invalidate;
5609,7 → 3201,7
 
procedure TCustomDXPaintBox.SetStretch(Value: Boolean);
begin
if Value <> FStretch then
if Value<>FStretch then
begin
FStretch := Value;
Invalidate;
5618,8 → 3210,8
 
procedure TCustomDXPaintBox.SetViewWidth(Value: Integer);
begin
if Value < 0 then Value := 0;
if Value <> FViewWidth then
if Value<0 then Value := 0;
if Value<>FViewWidth then
begin
FViewWidth := Value;
Invalidate;
5628,8 → 3220,8
 
procedure TCustomDXPaintBox.SetViewHeight(Value: Integer);
begin
if Value < 0 then Value := 0;
if Value <> FViewHeight then
if Value<0 then Value := 0;
if Value<>FViewHeight then
begin
FViewHeight := Value;
Invalidate;
5636,4548 → 3228,6
end;
end;
 
{ DXFusion -> }
 
function PosValue(Value: Integer): Integer;
begin
if Value < 0 then result := 0 else result := Value;
end;
 
procedure TDIB.CreateDIBFromBitmap(const Bitmap: TBitmap);
var
pf: Integer;
X, Y: Integer;
P: PLinesA;
q: PRGBA;
begin
if Bitmap.PixelFormat = pf32bit then pf := 32 else pf := 24;
SetSize(Bitmap.Width, Bitmap.Height, pf); {always >=24}
Canvas.Brush.Color := clWhite;
Canvas.FillRect(Bounds(0, 0, Width, Height));
Canvas.Draw(0, 0, Bitmap);
//Note. Transparent background from bitmap is not drawed when is alphalayer active
if (pf = 32) {and (Bitmap.AlphaFormat <> afIgnored)} then
begin
for y := 0 to Bitmap.Height-1 do
begin
p := Bitmap.ScanLine[y]; //BGRA
q := Self.ScanLine[y]; //ARGB
for x := 0 to Width-1 do //copy only alphachannel
q[x].rgbReserved := P[x].A;
end;
end;
end;
 
function TDIB.CreateBitmapFromDIB: TBitmap;
var
ach: Boolean;
X, Y: Integer;
P: PLinesA;
q: PRGBA;
begin
ach := False;
Result := TBitmap.Create;
case BitCount of
32:
begin
Result.PixelFormat := pf32bit;
ach := HasAlphaChannel;
end;
24: Result.PixelFormat := pf24bit;
15: Result.PixelFormat := pf16bit;
8: Result.PixelFormat := pf8bit;
else
Result.PixelFormat := pf24bit;
end;
 
Result.Width := Width;
Result.Height := Height;
Result.Canvas.Draw(0, 0, Self);
if (BitCount = 32) then
begin
if ach then
begin
{$IFDEF VER16UP}
Result.AlphaFormat := afDefined;
{$ENDIF}
for y := 0 to Height-1 do
begin
p := Result.ScanLine[y]; //BGRA
q := Self.ScanLine[y]; //ARGB
for x := 0 to Width-1 do //copy only alphachannel
P[x].A := q[x].rgbReserved;
end;
end;
end;
end;
 
procedure TDIB.DrawTo(SrcDIB: TDIB; X, Y, Width, Height,
SourceX, SourceY: Integer);
begin
SrcDIB.DrawOn(Rect(X, Y, Width, Height), Self.Canvas, SourceX, SourceY);
end;
 
procedure TDIB.DrawTransparent(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor);
var
i, j: Integer;
k1, k2: Integer;
n: Integer;
p1, p2: PByteArray;
 
Startk1, Startk2: Integer;
 
StartY: Integer;
EndY: Integer;
 
DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
Startk1 := 3 * SourceX;
Startk2 := 3 * X;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (StartY + DestStartY < 0) then
StartY := -DestStartY;
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (StartY < 0) then
StartY := 0;
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
for j := StartY to EndY - 1 do
begin
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
 
for i := SourceX to SourceX + Width - 1 do
begin
n := (p2[k1] shl 16) + (p2[k1 + 1] shl 8) + p2[k1 + 2];
 
if not (n = Color) then
begin
p1[k2] := p2[k1];
p1[k2 + 1] := p2[k1 + 1];
p1[k2 + 2] := p2[k1 + 2];
end;
 
k1 := k1 + 3;
k2 := k2 + 3;
end;
end;
end;
 
procedure TDIB.DrawShadow(SrcDIB: TDIB; X, Y, Width, Height,
Frame: Integer; FilterMode: TFilterMode);
var
i, j: Integer;
p1, p2: PByte;
FW: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
FW := Frame * Width;
for i := 1 to Height - 1 do
begin
p1 := Self.Scanline[i + Y];
p2 := SrcDIB.Scanline[i];
Inc(p1, 3 * (X + 1));
Inc(p2, 3 * (FW + 1));
for j := 1 to Width - 1 do
begin
if (p2^ = 0) then
begin
case FilterMode of
fmNormal, fmMix50:
begin
p1^ := p1^ shr 1; // Blue
Inc(p1);
p1^ := p1^ shr 1; // Green
Inc(p1);
p1^ := p1^ shr 1; // Red
Inc(p1);
end;
fmMix25:
begin
p1^ := p1^ - p1^ shr 2; // Blue
Inc(p1);
p1^ := p1^ - p1^ shr 2; // Green
Inc(p1);
p1^ := p1^ - p1^ shr 2; // Red
Inc(p1);
end;
fmMix75:
begin
p1^ := p1^ shr 2; // Blue
Inc(p1);
p1^ := p1^ shr 2; // Green
Inc(p1);
p1^ := p1^ shr 2; // Red
Inc(p1);
end;
end;
end
else
Inc(p1, 3); // Not in the loop...
Inc(p2, 3);
end;
end;
end;
 
procedure TDIB.DrawShadows(SrcDIB: TDIB; X, Y, Width, Height,
Frame: Integer; Alpha: Byte);
{plynule nastavovani stiny dle alpha}
type
P3ByteArray = ^T3ByteArray;
T3ByteArray = array[0..32767] of TBGR;
var
i, j, l1, l2: Integer;
p1, p2: P3ByteArray;
FW: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
FW := Frame * Width;
for i := 0 to Height - 1 do
begin
p1 := Self.Scanline[i + Y];
p2 := SrcDIB.Scanline[i];
l1 := X;
l2 := FW;
for j := 0 to Width - 1 do
begin
if (p2[j + l2].B = 0) and (p2[j + l2].G = 0) and (p2[j + l2].R = 0) then
begin
p1[J + l1].B := Round(p1[J + l1].B / $FF * Alpha);
p1[J + l1].G := Round(p1[J + l1].G / $FF * Alpha);
p1[J + l1].R := Round(p1[J + l1].R / $FF * Alpha);
end
end;
end;
end;
 
procedure TDIB.DrawDarken(SrcDIB: TDIB; X, Y, Width, Height,
Frame: Integer);
var
frameoffset, i, j: Integer;
p1, p2: pByte;
XOffset: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
frameoffset := 3 * (Frame * Width) + 3;
XOffset := 3 * X + 3;
for i := 1 to Height - 1 do
begin
p1 := Self.Scanline[i + Y];
p2 := SrcDIB.Scanline[i];
inc(p1, XOffset);
inc(p2, frameoffset);
for j := 1 to Width - 1 do
begin
p1^ := (p2^ * p1^) shr 8; // R
inc(p1);
inc(p2);
p1^ := (p2^ * p1^) shr 8; // G
inc(p1);
inc(p2);
p1^ := (p2^ * p1^) shr 8; // B
inc(p1);
inc(p2);
end;
end;
end;
 
procedure TDIB.DrawQuickAlpha(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor; FilterMode: TFilterMode);
var
i, j: Integer;
k1, k2: Integer;
n: Integer;
p1, p2: PByteArray;
BitSwitch1, BitSwitch2: Boolean;
 
Startk1, Startk2: Integer;
StartY: Integer;
EndY: Integer;
 
DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
Startk1 := 3 * SourceX;
Startk2 := 3 * X;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (StartY + DestStartY < 0) then
StartY := -DestStartY;
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (StartY < 0) then
StartY := 0;
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
if Odd(Y) then BitSwitch1 := true else BitSwitch1 := false;
if Odd(X) then BitSwitch2 := true else BitSwitch2 := false;
 
for j := StartY to EndY - 1 do
begin
BitSwitch1 := not BitSwitch1;
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
 
for i := SourceX to SourceX + Width - 1 do
begin
BitSwitch2 := not BitSwitch2;
 
n := (p2[k1] shl 16) + (p2[k1 + 1] shl 8) + p2[k1 + 2];
 
case FilterMode of
fmNormal, fmMix50: if not (n = Color) and (BitSwitch1 xor BitSwitch2) then
begin
p1[k2] := p2[k1];
p1[k2 + 1] := p2[k1 + 1];
p1[k2 + 2] := p2[k1 + 2];
end;
fmMix25: if not (n = Color) and (BitSwitch1 and BitSwitch2) then
begin
p1[k2] := p2[k1];
p1[k2 + 1] := p2[k1 + 1];
p1[k2 + 2] := p2[k1 + 2];
end;
fmMix75: if not (n = Color) and (BitSwitch1 or BitSwitch2) then
begin
p1[k2] := p2[k1];
p1[k2 + 1] := p2[k1 + 1];
p1[k2 + 2] := p2[k1 + 2];
end;
end;
 
k1 := k1 + 3;
k2 := k2 + 3;
end;
end;
end;
 
procedure TDIB.DrawAdditive(SrcDIB: TDIB; X, Y, Width, Height, Alpha, Frame:
Integer);
var
frameoffset, i, j, Wid: Integer;
p1, p2: pByte;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
if (Alpha < 1) or (Alpha > 256) then Exit;
Wid := Width shl 1 + Width;
frameoffset := Wid * Frame;
for i := 1 to Height - 1 do
begin
if (i + Y) > (Self.Height - 1) then Break; //add 25.5.2004 JB.
p1 := Self.Scanline[i + Y];
p2 := SrcDIB.Scanline[i];
inc(p1, X shl 1 + X + 3);
inc(p2, frameoffset + 3);
for j := 3 to Wid - 4 do
begin
inc(p1^, (Alpha - p1^) * p2^ shr 8);
inc(p1);
inc(p2);
end;
end;
end;
 
procedure TDIB.DrawTranslucent(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor);
var
i, j: Integer;
k1, k2: Integer;
n: Integer;
p1, p2: PByteArray;
 
Startk1, Startk2: Integer;
StartY: Integer;
EndY: Integer;
 
DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
Startk1 := 3 * SourceX;
Startk2 := 3 * X;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (StartY + DestStartY < 0) then
StartY := -DestStartY;
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (StartY < 0) then
StartY := 0;
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
for j := StartY to EndY - 1 do
begin
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
 
for i := SourceX to SourceX + Width - 1 do
begin
n := (p2[k1] shl 16) + (p2[k1 + 1] shl 8) + p2[k1 + 2];
 
if not (n = Color) then
begin
p1[k2] := (p1[k2] + p2[k1]) shr 1;
p1[k2 + 1] := (p1[k2 + 1] + p2[k1 + 1]) shr 1;
p1[k2 + 2] := (p1[k2 + 2] + p2[k1 + 2]) shr 1;
end;
 
k1 := k1 + 3;
k2 := k2 + 3;
end;
end;
end;
 
procedure TDIB.DrawAlpha(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY, Alpha: Integer; const Color: TColor);
var
i, j: Integer;
k1, k2: Integer;
n: Integer;
p1, p2: PByteArray;
 
Startk1, Startk2: Integer;
StartY: Integer;
EndY: Integer;
 
DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
Startk1 := 3 * SourceX;
Startk2 := 3 * x;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
if (StartY < 0) then
StartY := 0;
 
if (StartY + DestStartY < 0) then
StartY := DestStartY;
 
for j := StartY to EndY - 1 do
begin
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
 
for i := SourceX to SourceX + Width - 1 do
begin
n := (p2[k1] shl 16) + (p2[k1 + 1] shl 8) + p2[k1 + 2];
 
if not (n = Color) then
begin
p1[k2] := (p1[k2] * (256 - Alpha) + p2[k1] * Alpha) shr 8;
p1[k2 + 1] := (p1[k2 + 1] * (256 - Alpha) + p2[k1 + 1] * Alpha) shr 8;
p1[k2 + 2] := (p1[k2 + 2] * (256 - Alpha) + p2[k1 + 2] * Alpha) shr 8;
end;
 
k1 := k1 + 3;
k2 := k2 + 3;
end;
end;
end;
 
procedure TDIB.DrawAlphaMask(SrcDIB, MaskDIB: TDIB; const X, Y,
Width, Height, SourceX, SourceY: Integer);
var
i, j: Integer;
k1, k2, k3: Integer;
p1, p2, p3: PByteArray;
 
Startk1, Startk2: Integer;
StartY: Integer;
EndY: Integer;
 
DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
Startk1 := 3 * SourceX;
Startk2 := 3 * x;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
if (StartY < 0) then
StartY := 0;
 
if (StartY + DestStartY < 0) then
StartY := DestStartY;
 
for j := StartY to EndY - 1 do
begin
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
p3 := MaskDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
k3 := 0;
 
for i := SourceX to SourceX + Width - 1 do
begin
p1[k2] := (p1[k2] * (256 - p3[k3]) + p2[k1] * p3[k3]) shr 8;
p1[k2 + 1] := (p1[k2 + 1] * (256 - p3[k3]) + p2[k1 + 1] * p3[k3]) shr 8;
p1[k2 + 2] := (p1[k2 + 2] * (256 - p3[k3]) + p2[k1 + 2] * p3[k3]) shr 8;
 
k1 := k1 + 3;
k2 := k2 + 3;
k3 := k3 + 3;
end;
end;
end;
 
procedure TDIB.DrawMorphed(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const Color: TColor);
var
i, j, r, g, b: Integer;
k1, k2: Integer;
n: Integer;
p1, p2: PByteArray;
 
Startk1, Startk2: Integer;
StartY: Integer;
EndY: Integer;
 
DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
Startk1 := 3 * SourceX;
Startk2 := 3 * x;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
if (StartY < 0) then
StartY := 0;
 
if (StartY + DestStartY < 0) then
StartY := DestStartY;
 
r := 0;
g := 0;
b := 0;
 
for j := StartY to EndY - 1 do
begin
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
 
for i := SourceX to SourceX + Width - 1 do
begin
n := (p2[k1] shl 16) + (p2[k1 + 1] shl 8) + p2[k1 + 2];
 
if Random(100) < 50 then
begin
b := p1[k2];
g := p1[k2 + 1];
r := p1[k2 + 2];
end;
 
if not (n = Color) then
begin
p1[k2] := b;
p1[k2 + 1] := g;
p1[k2 + 2] := r;
end;
 
k1 := k1 + 3;
k2 := k2 + 3;
end;
end;
end;
 
procedure TDIB.DrawMono(SrcDIB: TDIB; const X, Y, Width, Height,
SourceX, SourceY: Integer; const TransColor, ForeColor, BackColor: TColor);
var
i, j, r1, g1, b1, r2, g2, b2: Integer;
k1, k2: Integer;
n: Integer;
p1, p2: PByteArray;
Startk1, Startk2, StartY, EndY, DestStartY: Integer;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
Startk1 := 3 * SourceX;
Startk2 := 3 * x;
 
DestStartY := Y - SourceY;
 
StartY := SourceY;
EndY := SourceY + Height;
 
if (EndY + DestStartY > Self.Height) then
EndY := Self.Height - DestStartY;
 
if (EndY > SrcDIB.Height) then
EndY := SrcDIB.Height;
 
if (StartY < 0) then
StartY := 0;
 
if (StartY + DestStartY < 0) then
StartY := DestStartY;
 
r1 := GetRValue(BackColor);
g1 := GetGValue(BackColor);
b1 := GetBValue(BackColor);
 
r2 := GetRValue(ForeColor);
g2 := GetGValue(ForeColor);
b2 := GetBValue(ForeColor);
 
 
for j := StartY to EndY - 1 do
begin
p1 := Self.Scanline[j + DestStartY];
p2 := SrcDIB.Scanline[j];
 
k1 := Startk1;
k2 := Startk2;
 
for i := SourceX to SourceX + Width - 1 do
begin
n := (p2[k1] shl 16) + (p2[k1 + 1] shl 8) + p2[k1 + 2];
 
if (n = TransColor) then
begin
p1[k2] := b1;
p1[k2 + 1] := g1;
p1[k2 + 2] := r1;
end
else
begin
p1[k2] := b2;
p1[k2 + 1] := g2;
p1[k2 + 2] := r2;
end;
 
k1 := k1 + 3;
k2 := k2 + 3;
end;
end;
end;
 
procedure TDIB.Draw3x3Matrix(SrcDIB: TDIB; Setting: TMatrixSetting);
var i, j, k: Integer;
p1, p2, p3, p4: PByteArray;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
for i := 1 to SrcDIB.Height - 2 do
begin
p1 := SrcDIB.ScanLine[i - 1];
p2 := SrcDIB.ScanLine[i];
p3 := SrcDIB.ScanLine[i + 1];
p4 := Self.ScanLine[i];
for j := 3 to 3 * SrcDIB.Width - 4 do
begin
k := (p1[j - 3] * Setting[0] + p1[j] * Setting[1] + p1[j + 3] * Setting[2] +
p2[j - 3] * Setting[3] + p2[j] * Setting[4] + p2[j + 3] * Setting[5] +
p3[j - 3] * Setting[6] + p3[j] * Setting[7] + p3[j + 3] * Setting[8])
div Setting[9];
if k < 0 then k := 0;
if k > 255 then k := 255;
p4[j] := k;
end;
end;
end;
 
procedure TDIB.DrawAntialias(SrcDIB: TDIB);
var i, j, k, l, m: Integer;
p1, p2, p3: PByteArray;
begin
if Self.BitCount <> 24 then Exit;
if SrcDIB.BitCount <> 24 then Exit;
 
for i := 1 to Self.Height - 1 do
begin
k := i shl 1;
p1 := SrcDIB.Scanline[k];
p2 := SrcDIB.Scanline[k + 1];
p3 := Self.Scanline[i];
for j := 1 to Self.Width - 1 do
begin
m := 3 * j;
l := m shl 1;
p3[m] := (p1[l] + p1[l + 3] + p2[l] + p2[l + 3]) shr 2;
p3[m + 1] := (p1[l + 1] + p1[l + 4] + p2[l + 1] + p2[l + 4]) shr 2;
p3[m + 2] := (p1[l + 2] + p1[l + 5] + p2[l + 2] + p2[l + 5]) shr 2;
end;
end;
end;
 
procedure TDIB.FilterLine(X1, Y1, X2, Y2: Integer; Color: TColor;
FilterMode: TFilterMode);
var
i, j: Integer;
t: TColor;
r1, g1, b1, r2, g2, b2: Integer;
begin
j := ROUND(Sqrt(Sqr(ABS(X2 - X1)) + Sqr(ABS(Y2 - Y1))));
if j < 1 then Exit;
 
r1 := GetRValue(Color);
g1 := GetGValue(Color);
b1 := GetBValue(Color);
 
for i := 0 to j do
begin
t := Self.Pixels[X1 + ((X2 - X1) * i div j), Y1 + ((Y2 - Y1) * i div j)];
r2 := GetRValue(t);
g2 := GetGValue(t);
b2 := GetBValue(t);
case FilterMode of
fmNormal: t := RGB(r1 + (((256 - r1) * r2) shr 8),
g1 + (((256 - g1) * g2) shr 8),
b1 + (((256 - b1) * b2) shr 8));
fmMix25: t := RGB((r1 + r2 * 3) shr 2, (g1 + g2 * 3) shr 2, (b1 + b2 * 3) shr 2);
fmMix50: t := RGB((r1 + r2) shr 1, (g1 + g2) shr 1, (b1 + b2) shr 1);
fmMix75: t := RGB((r1 * 3 + r2) shr 2, (g1 * 3 + g2) shr 2, (b1 * 3 + b2) shr 2);
end;
Self.Pixels[X1 + ((X2 - X1) * i div j), Y1 + ((Y2 - Y1) * i div j)] := t;
end;
end;
 
procedure TDIB.FilterRect(X, Y, Width, Height: Integer;
Color: TColor; FilterMode: TFilterMode);
var
i, j, r, g, b, C1: Integer;
p1, p2, p3: pByte;
begin
if Self.BitCount <> 24 then Exit;
 
r := GetRValue(Color);
g := GetGValue(Color);
b := GetBValue(Color);
 
for i := 0 to Height - 1 do
begin
p1 := Self.Scanline[i + Y];
Inc(p1, (3 * X));
for j := 0 to Width - 1 do
begin
case FilterMode of
fmNormal:
begin
p2 := p1;
Inc(p2);
p3 := p2;
Inc(p3);
C1 := (p1^ + p2^ + p3^) div 3;
 
p1^ := (C1 * b) shr 8;
Inc(p1);
p1^ := (C1 * g) shr 8;
Inc(p1);
p1^ := (C1 * r) shr 8;
Inc(p1);
end;
fmMix25:
begin
p1^ := (3 * p1^ + b) shr 2;
Inc(p1);
p1^ := (3 * p1^ + g) shr 2;
Inc(p1);
p1^ := (3 * p1^ + r) shr 2;
Inc(p1);
end;
fmMix50:
begin
p1^ := (p1^ + b) shr 1;
Inc(p1);
p1^ := (p1^ + g) shr 1;
Inc(p1);
p1^ := (p1^ + r) shr 1;
Inc(p1);
end;
fmMix75:
begin
p1^ := (p1^ + 3 * b) shr 2;
Inc(p1);
p1^ := (p1^ + 3 * g) shr 2;
Inc(p1);
p1^ := (p1^ + 3 * r) shr 2;
Inc(p1);
end;
end;
end;
end;
end;
 
procedure TDIB.InitLight(Count, Detail: Integer);
var
i, j: Integer;
begin
LG_COUNT := Count;
LG_DETAIL := Detail;
 
for i := 0 to 255 do // Build Lightning LUT
for j := 0 to 255 do
FLUTDist[i, j] := ROUND(Sqrt(Sqr(i * 10) + Sqr(j * 10)));
end;
 
procedure TDIB.DrawLights(FLight: TLightArray;
AmbientLight: TColor);
var
i, j, l, m, n, o, q, D1, D2, R, G, B, AR, AG, AB: Integer;
P: array{$IFNDEF VER4UP} [0..4096]{$ENDIF} of PByteArray;
begin
if Self.BitCount <> 24 then Exit;
 
{$IFDEF VER4UP}
SetLength(P, LG_DETAIL);
{$ENDIF}
AR := GetRValue(AmbientLight);
AG := GetGValue(AmbientLight);
AB := GetBValue(AmbientLight);
 
for i := (Self.Height div (LG_DETAIL + 1)) downto 1 do
begin
for o := 0 to LG_DETAIL do
P[o] := Self.Scanline[(LG_DETAIL + 1) * i - o];
 
for j := (Self.Width div (LG_DETAIL + 1)) downto 1 do
begin
R := AR;
G := AG;
B := AB;
 
for l := LG_COUNT - 1 downto 0 do // Check the lightsources
begin
D1 := ABS(j * (LG_DETAIL + 1) - FLight[l].X) div FLight[l].Size1;
D2 := ABS(i * (LG_DETAIL + 1) - FLight[l].Y) div FLight[l].Size2;
if D1 > 255 then D1 := 255;
if D2 > 255 then D2 := 255;
 
m := 255 - FLUTDist[D1, D2];
if m < 0 then m := 0;
 
Inc(R, (PosValue(GetRValue(FLight[l].Color) - R) * m shr 8));
Inc(G, (PosValue(GetGValue(FLight[l].Color) - G) * m shr 8));
Inc(B, (PosValue(GetBValue(FLight[l].Color) - B) * m shr 8));
end;
 
for q := LG_DETAIL downto 0 do
begin
n := 3 * (j * (LG_DETAIL + 1) - q);
 
for o := LG_DETAIL downto 0 do
begin
P[o][n] := (P[o][n] * B) shr 8;
P[o][n + 1] := (P[o][n + 1] * G) shr 8;
P[o][n + 2] := (P[o][n + 2] * R) shr 8;
end;
end;
end;
end;
{$IFDEF VER4UP}
SetLength(P, 0);
{$ENDIF}
end;
 
procedure TDIB.DrawOn(Dest: TRect; DestCanvas: TCanvas; Xsrc, Ysrc: Integer);
{procedure is supplement of original TDIBUltra function}
begin
//if not AsSigned(SrcCanvas) then Exit;
if (Xsrc < 0) then
begin
Dec(Dest.Left, Xsrc);
Inc(Dest.Right {Width }, Xsrc);
Xsrc := 0
end;
if (Ysrc < 0) then
begin
Dec(Dest.Top, Ysrc);
Inc(Dest.Bottom {Height}, Ysrc);
Ysrc := 0
end;
BitBlt(DestCanvas.Handle, Dest.Left, Dest.Top, Dest.Right, Dest.Bottom, Self.Canvas.Handle, Xsrc, Ysrc, SRCCOPY);
end;
 
{ DXFusion <- }
 
{ added effect for DIB }
 
function IntToByte(i: Integer): Byte;
begin
if i > 255 then Result := 255
else if i < 0 then Result := 0
else Result := i;
end;
 
{standalone routine}
 
procedure TDIB.Darker(Percent: Integer);
{color to dark in percent}
var
p0: pbytearray;
r, g, b, x, y: Integer;
begin
if Self.BitCount <> 24 then Exit;
for y := 0 to Self.Height - 1 do
begin
p0 := Self.ScanLine[y];
for x := 0 to Self.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
p0[x * 3] := Round(R * Percent / 100);
p0[x * 3 + 1] := Round(G * Percent / 100);
p0[x * 3 + 2] := Round(B * Percent / 100);
end;
end;
end;
 
procedure TDIB.Lighter(Percent: Integer);
var
p0: pbytearray;
r, g, b, x, y: Integer;
begin
if Self.BitCount <> 24 then Exit;
for y := 0 to Self.Height - 1 do
begin
p0 := Self.ScanLine[y];
for x := 0 to Self.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
p0[x * 3] := Round(R * Percent / 100) + Round(255 - Percent / 100 * 255);
p0[x * 3 + 1] := Round(G * Percent / 100) + Round(255 - Percent / 100 * 255);
p0[x * 3 + 2] := Round(B * Percent / 100) + Round(255 - Percent / 100 * 255);
end;
end;
end;
 
procedure TDIB.Darkness(Amount: Integer);
var
p0: pbytearray;
r, g, b, x, y: Integer;
begin
if Self.BitCount <> 24 then Exit;
for y := 0 to Self.Height - 1 do
begin
p0 := Self.ScanLine[y];
for x := 0 to Self.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
p0[x * 3] := IntToByte(r - ((r) * Amount) div 255);
p0[x * 3 + 1] := IntToByte(g - ((g) * Amount) div 255);
p0[x * 3 + 2] := IntToByte(b - ((b) * Amount) div 255);
end;
end;
end;
 
function TrimInt(i, Min, Max: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if i > Max then Result := Max
else if i < Min then Result := Min
else Result := i;
end;
 
procedure TDIB.DoSmoothRotate(Src: TDIB; cx, cy: Integer; Angle: Extended);
var
Top, Bottom, eww, nsw, fx, fy: Extended;
cAngle, sAngle: Double;
xDiff, yDiff, ifx, ify, px, py, ix, iy, x, y: Integer;
nw, ne, sw, se: TBGR;
P1, P2, P3: Pbytearray;
begin
Angle := angle;
Angle := -Angle * Pi / 180;
sAngle := Sin(Angle);
cAngle := Cos(Angle);
xDiff := (Self.Width - Src.Width) div 2;
yDiff := (Self.Height - Src.Height) div 2;
for y := 0 to Self.Height - 1 do
begin
P3 := Self.scanline[y];
py := 2 * (y - cy) + 1;
for x := 0 to Self.Width - 1 do
begin
px := 2 * (x - cx) + 1;
fx := (((px * cAngle - py * sAngle) - 1) / 2 + cx) - xDiff;
fy := (((px * sAngle + py * cAngle) - 1) / 2 + cy) - yDiff;
ifx := Round(fx);
ify := Round(fy);
 
if (ifx > -1) and (ifx < Src.Width) and (ify > -1) and (ify < Src.Height) then
begin
eww := fx - ifx;
nsw := fy - ify;
iy := TrimInt(ify + 1, 0, Src.Height - 1);
ix := TrimInt(ifx + 1, 0, Src.Width - 1);
P1 := Src.scanline[ify];
P2 := Src.scanline[iy];
nw.r := P1[ifx * 3];
nw.g := P1[ifx * 3 + 1];
nw.b := P1[ifx * 3 + 2];
ne.r := P1[ix * 3];
ne.g := P1[ix * 3 + 1];
ne.b := P1[ix * 3 + 2];
sw.r := P2[ifx * 3];
sw.g := P2[ifx * 3 + 1];
sw.b := P2[ifx * 3 + 2];
se.r := P2[ix * 3];
se.g := P2[ix * 3 + 1];
se.b := P2[ix * 3 + 2];
 
Top := nw.b + eww * (ne.b - nw.b);
Bottom := sw.b + eww * (se.b - sw.b);
P3[x * 3 + 2] := IntToByte(Round(Top + nsw * (Bottom - Top)));
 
Top := nw.g + eww * (ne.g - nw.g);
Bottom := sw.g + eww * (se.g - sw.g);
P3[x * 3 + 1] := IntToByte(Round(Top + nsw * (Bottom - Top)));
 
Top := nw.r + eww * (ne.r - nw.r);
Bottom := sw.r + eww * (se.r - sw.r);
P3[x * 3] := IntToByte(Round(Top + nsw * (Bottom - Top)));
end;
end;
end;
end;
 
//----------------------
//--- 24 bit count routines ----------------------
//----------------------
 
procedure TDIB.DoInvert;
procedure PicInvert(src: TDIB);
var w, h, x, y: Integer;
p: pbytearray;
begin
w := src.width;
h := src.height;
src.BitCount := 24;
for y := 0 to h - 1 do
begin
p := src.scanline[y];
for x := 0 to w - 1 do
begin
p[x * 3] := not p[x * 3];
p[x * 3 + 1] := not p[x * 3 + 1];
p[x * 3 + 2] := not p[x * 3 + 2];
end;
end;
end;
begin
PicInvert(Self);
end;
 
procedure TDIB.DoAddColorNoise(Amount: Integer);
procedure AddColorNoise(var clip: TDIB; Amount: Integer);
var
p0: pbytearray;
x, y, r, g, b: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.ScanLine[y];
for x := 0 to clip.Width - 1 do
begin
r := p0[x * 3] + (Random(Amount) - (Amount shr 1));
g := p0[x * 3 + 1] + (Random(Amount) - (Amount shr 1));
b := p0[x * 3 + 2] + (Random(Amount) - (Amount shr 1));
p0[x * 3] := IntToByte(r);
p0[x * 3 + 1] := IntToByte(g);
p0[x * 3 + 2] := IntToByte(b);
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
AddColorNoise(bb, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoAddMonoNoise(Amount: Integer);
procedure _AddMonoNoise(var clip: TDIB; Amount: Integer);
var
p0: pbytearray;
x, y, a, r, g, b: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
for x := 0 to clip.Width - 1 do
begin
a := Random(Amount) - (Amount shr 1);
r := p0[x * 3] + a;
g := p0[x * 3 + 1] + a;
b := p0[x * 3 + 2] + a;
p0[x * 3] := IntToByte(r);
p0[x * 3 + 1] := IntToByte(g);
p0[x * 3 + 2] := IntToByte(b);
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
_AddMonoNoise(bb, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoAntiAlias;
procedure AntiAlias(clip: TDIB);
procedure AntiAliasRect(clip: TDIB; XOrigin, YOrigin, XFinal, YFinal: Integer);
var Memo, x, y: Integer; (* Composantes primaires des points environnants *)
p0, p1, p2: pbytearray;
begin
if XFinal < XOrigin then begin Memo := XOrigin; XOrigin := XFinal; XFinal := Memo; end; (* Inversion des valeurs *)
if YFinal < YOrigin then begin Memo := YOrigin; YOrigin := YFinal; YFinal := Memo; end; (* si diff‚rence n‚gative*)
XOrigin := max(1, XOrigin);
YOrigin := max(1, YOrigin);
XFinal := min(clip.width - 2, XFinal);
YFinal := min(clip.height - 2, YFinal);
clip.BitCount := 24;
for y := YOrigin to YFinal do
begin
p0 := clip.ScanLine[y - 1];
p1 := clip.scanline[y];
p2 := clip.ScanLine[y + 1];
for x := XOrigin to XFinal do
begin
p1[x * 3] := (p0[x * 3] + p2[x * 3] + p1[(x - 1) * 3] + p1[(x + 1) * 3]) div 4;
p1[x * 3 + 1] := (p0[x * 3 + 1] + p2[x * 3 + 1] + p1[(x - 1) * 3 + 1] + p1[(x + 1) * 3 + 1]) div 4;
p1[x * 3 + 2] := (p0[x * 3 + 2] + p2[x * 3 + 2] + p1[(x - 1) * 3 + 2] + p1[(x + 1) * 3 + 2]) div 4;
end;
end;
end;
begin
AntiAliasRect(clip, 0, 0, clip.width, clip.height);
end;
begin
AntiAlias(Self);
end;
 
procedure TDIB.DoContrast(Amount: Integer);
procedure _Contrast(var clip: TDIB; Amount: Integer);
var
p0: pbytearray;
rg, gg, bg, r, g, b, x, y: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
for x := 0 to clip.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
rg := (Abs(127 - r) * Amount) div 255;
gg := (Abs(127 - g) * Amount) div 255;
bg := (Abs(127 - b) * Amount) div 255;
if r > 127 then r := r + rg else r := r - rg;
if g > 127 then g := g + gg else g := g - gg;
if b > 127 then b := b + bg else b := b - bg;
p0[x * 3] := IntToByte(r);
p0[x * 3 + 1] := IntToByte(g);
p0[x * 3 + 2] := IntToByte(b);
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
_Contrast(bb, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoFishEye(Amount: Integer);
procedure _FishEye(var Bmp, Dst: TDIB; Amount: Extended);
var
xmid, ymid: Single;
fx, fy: Single;
r1, r2: Single;
ifx, ify: Integer;
dx, dy: Single;
rmax: Single;
ty, tx: Integer;
weight_x, weight_y: array[0..1] of Single;
weight: Single;
new_red, new_green: Integer;
new_blue: Integer;
total_red, total_green: Single;
total_blue: Single;
ix, iy: Integer;
sli, slo: PByteArray;
begin
xmid := Bmp.Width / 2;
ymid := Bmp.Height / 2;
rmax := Dst.Width * Amount;
 
for ty := 0 to Dst.Height - 1 do
begin
for tx := 0 to Dst.Width - 1 do
begin
dx := tx - xmid;
dy := ty - ymid;
r1 := Sqrt(dx * dx + dy * dy);
if r1 = 0 then
begin
fx := xmid;
fy := ymid;
end
else
begin
r2 := rmax / 2 * (1 / (1 - r1 / rmax) - 1);
fx := dx * r2 / r1 + xmid;
fy := dy * r2 / r1 + ymid;
end;
ify := Trunc(fy);
ifx := Trunc(fx);
// Calculate the weights.
if fy >= 0 then
begin
weight_y[1] := fy - ify;
weight_y[0] := 1 - weight_y[1];
end
else
begin
weight_y[0] := -(fy - ify);
weight_y[1] := 1 - weight_y[0];
end;
if fx >= 0 then
begin
weight_x[1] := fx - ifx;
weight_x[0] := 1 - weight_x[1];
end
else
begin
weight_x[0] := -(fx - ifx);
Weight_x[1] := 1 - weight_x[0];
end;
 
if ifx < 0 then
ifx := Bmp.Width - 1 - (-ifx mod Bmp.Width)
else if ifx > Bmp.Width - 1 then
ifx := ifx mod Bmp.Width;
if ify < 0 then
ify := Bmp.Height - 1 - (-ify mod Bmp.Height)
else if ify > Bmp.Height - 1 then
ify := ify mod Bmp.Height;
 
total_red := 0.0;
total_green := 0.0;
total_blue := 0.0;
for ix := 0 to 1 do
begin
for iy := 0 to 1 do
begin
if ify + iy < Bmp.Height then
sli := Bmp.scanline[ify + iy]
else
sli := Bmp.scanline[Bmp.Height - ify - iy];
if ifx + ix < Bmp.Width then
begin
new_red := sli[(ifx + ix) * 3];
new_green := sli[(ifx + ix) * 3 + 1];
new_blue := sli[(ifx + ix) * 3 + 2];
end
else
begin
new_red := sli[(Bmp.Width - ifx - ix) * 3];
new_green := sli[(Bmp.Width - ifx - ix) * 3 + 1];
new_blue := sli[(Bmp.Width - ifx - ix) * 3 + 2];
end;
weight := weight_x[ix] * weight_y[iy];
total_red := total_red + new_red * weight;
total_green := total_green + new_green * weight;
total_blue := total_blue + new_blue * weight;
end;
end;
slo := Dst.scanline[ty];
slo[tx * 3] := Round(total_red);
slo[tx * 3 + 1] := Round(total_green);
slo[tx * 3 + 2] := Round(total_blue);
 
end;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
_FishEye(BB1, BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoGrayScale;
procedure GrayScale(var clip: TDIB);
var
p0: pbytearray;
Gray, x, y: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
for x := 0 to clip.Width - 1 do
begin
Gray := Round(p0[x * 3] * 0.3 + p0[x * 3 + 1] * 0.59 + p0[x * 3 + 2] * 0.11);
p0[x * 3] := Gray;
p0[x * 3 + 1] := Gray;
p0[x * 3 + 2] := Gray;
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
GrayScale(BB);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoLightness(Amount: Integer);
procedure _Lightness(var clip: TDIB; Amount: Integer);
var
p0: pbytearray;
r, g, b, x, y: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
for x := 0 to clip.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
p0[x * 3] := IntToByte(r + ((255 - r) * Amount) div 255);
p0[x * 3 + 1] := IntToByte(g + ((255 - g) * Amount) div 255);
p0[x * 3 + 2] := IntToByte(b + ((255 - b) * Amount) div 255);
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
_Lightness(BB, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoDarkness(Amount: Integer);
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
BB.Darkness(Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoSaturation(Amount: Integer);
procedure _Saturation(var clip: TDIB; Amount: Integer);
var
p0: pbytearray;
Gray, r, g, b, x, y: Integer;
begin
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
for x := 0 to clip.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
Gray := (r + g + b) div 3;
p0[x * 3] := IntToByte(Gray + (((r - Gray) * Amount) div 255));
p0[x * 3 + 1] := IntToByte(Gray + (((g - Gray) * Amount) div 255));
p0[x * 3 + 2] := IntToByte(Gray + (((b - Gray) * Amount) div 255));
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
_Saturation(BB, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoSplitBlur(Amount: Integer);
{NOTE: For a gaussian blur is amount 3}
procedure _SplitBlur(var clip: TDIB; Amount: Integer);
var
p0, p1, p2: pbytearray;
cx, x, y: Integer;
Buf: array[0..3, 0..2] of byte;
begin
if Amount = 0 then Exit;
for y := 0 to clip.Height - 1 do
begin
p0 := clip.scanline[y];
if y - Amount < 0 then p1 := clip.scanline[y]
else {y-Amount>0} p1 := clip.ScanLine[y - Amount];
if y + Amount < clip.Height then p2 := clip.ScanLine[y + Amount]
else {y+Amount>=Height} p2 := clip.ScanLine[clip.Height - y];
 
for x := 0 to clip.Width - 1 do
begin
if x - Amount < 0 then cx := x
else {x-Amount>0} cx := x - Amount;
Buf[0, 0] := p1[cx * 3];
Buf[0, 1] := p1[cx * 3 + 1];
Buf[0, 2] := p1[cx * 3 + 2];
Buf[1, 0] := p2[cx * 3];
Buf[1, 1] := p2[cx * 3 + 1];
Buf[1, 2] := p2[cx * 3 + 2];
if x + Amount < clip.Width then cx := x + Amount
else {x+Amount>=Width} cx := clip.Width - x;
Buf[2, 0] := p1[cx * 3];
Buf[2, 1] := p1[cx * 3 + 1];
Buf[2, 2] := p1[cx * 3 + 2];
Buf[3, 0] := p2[cx * 3];
Buf[3, 1] := p2[cx * 3 + 1];
Buf[3, 2] := p2[cx * 3 + 2];
p0[x * 3] := (Buf[0, 0] + Buf[1, 0] + Buf[2, 0] + Buf[3, 0]) shr 2;
p0[x * 3 + 1] := (Buf[0, 1] + Buf[1, 1] + Buf[2, 1] + Buf[3, 1]) shr 2;
p0[x * 3 + 2] := (Buf[0, 2] + Buf[1, 2] + Buf[2, 2] + Buf[3, 2]) shr 2;
end;
end;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
_SplitBlur(BB, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoGaussianBlur(Amount: Integer);
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.BitCount := 24;
BB.Assign(Self);
GaussianBlur(BB, Amount);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoMosaic(Size: Integer);
procedure Mosaic(var Bm: TDIB; size: Integer);
var
x, y, i, j: Integer;
p1, p2: pbytearray;
r, g, b: byte;
begin
y := 0;
repeat
p1 := bm.scanline[y];
repeat
j := 1;
repeat
p2 := bm.scanline[y];
x := 0;
repeat
r := p1[x * 3];
g := p1[x * 3 + 1];
b := p1[x * 3 + 2];
i := 1;
repeat
p2[x * 3] := r;
p2[x * 3 + 1] := g;
p2[x * 3 + 2] := b;
inc(x);
inc(i);
until (x >= bm.width) or (i > size);
until x >= bm.width;
inc(j);
inc(y);
until (y >= bm.height) or (j > size);
until (y >= bm.height) or (x >= bm.width);
until y >= bm.height;
end;
var BB: TDIB;
begin
BB := TDIB.Create;
BB.BitCount := 24;
BB.Assign(Self);
Mosaic(BB, Size);
Self.Assign(BB);
BB.Free;
end;
 
procedure TDIB.DoTwist(Amount: Integer);
procedure _Twist(var Bmp, Dst: TDIB; Amount: Integer);
var
fxmid, fymid: Single;
txmid, tymid: Single;
fx, fy: Single;
tx2, ty2: Single;
r: Single;
theta: Single;
ifx, ify: Integer;
dx, dy: Single;
OFFSET: Single;
ty, tx: Integer;
weight_x, weight_y: array[0..1] of Single;
weight: Single;
new_red, new_green: Integer;
new_blue: Integer;
total_red, total_green: Single;
total_blue: Single;
ix, iy: Integer;
sli, slo: PBytearray;
 
function ArcTan2(xt, yt: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if xt = 0 then
if yt > 0 then
Result := Pi / 2
else
Result := -(Pi / 2)
else
begin
Result := ArcTan(yt / xt);
if xt < 0 then
Result := Pi + ArcTan(yt / xt);
end;
end;
 
begin
OFFSET := -(Pi / 2);
dx := Bmp.Width - 1;
dy := Bmp.Height - 1;
r := Sqrt(dx * dx + dy * dy);
tx2 := r;
ty2 := r;
txmid := (Bmp.Width - 1) / 2; //Adjust these to move center of rotation
tymid := (Bmp.Height - 1) / 2; //Adjust these to move ......
fxmid := (Bmp.Width - 1) / 2;
fymid := (Bmp.Height - 1) / 2;
if tx2 >= Bmp.Width then tx2 := Bmp.Width - 1;
if ty2 >= Bmp.Height then ty2 := Bmp.Height - 1;
 
for ty := 0 to Round(ty2) do
begin
for tx := 0 to Round(tx2) do
begin
dx := tx - txmid;
dy := ty - tymid;
r := Sqrt(dx * dx + dy * dy);
if r = 0 then
begin
fx := 0;
fy := 0;
end
else
begin
theta := ArcTan2(dx, dy) - r / Amount - OFFSET;
fx := r * Cos(theta);
fy := r * Sin(theta);
end;
fx := fx + fxmid;
fy := fy + fymid;
 
ify := Trunc(fy);
ifx := Trunc(fx);
// Calculate the weights.
if fy >= 0 then
begin
weight_y[1] := fy - ify;
weight_y[0] := 1 - weight_y[1];
end
else
begin
weight_y[0] := -(fy - ify);
weight_y[1] := 1 - weight_y[0];
end;
if fx >= 0 then
begin
weight_x[1] := fx - ifx;
weight_x[0] := 1 - weight_x[1];
end
else
begin
weight_x[0] := -(fx - ifx);
Weight_x[1] := 1 - weight_x[0];
end;
 
if ifx < 0 then
ifx := Bmp.Width - 1 - (-ifx mod Bmp.Width)
else if ifx > Bmp.Width - 1 then
ifx := ifx mod Bmp.Width;
if ify < 0 then
ify := Bmp.Height - 1 - (-ify mod Bmp.Height)
else if ify > Bmp.Height - 1 then
ify := ify mod Bmp.Height;
 
total_red := 0.0;
total_green := 0.0;
total_blue := 0.0;
for ix := 0 to 1 do
begin
for iy := 0 to 1 do
begin
if ify + iy < Bmp.Height then
sli := Bmp.scanline[ify + iy]
else
sli := Bmp.scanline[Bmp.Height - ify - iy];
if ifx + ix < Bmp.Width then
begin
new_red := sli[(ifx + ix) * 3];
new_green := sli[(ifx + ix) * 3 + 1];
new_blue := sli[(ifx + ix) * 3 + 2];
end
else
begin
new_red := sli[(Bmp.Width - ifx - ix) * 3];
new_green := sli[(Bmp.Width - ifx - ix) * 3 + 1];
new_blue := sli[(Bmp.Width - ifx - ix) * 3 + 2];
end;
weight := weight_x[ix] * weight_y[iy];
total_red := total_red + new_red * weight;
total_green := total_green + new_green * weight;
total_blue := total_blue + new_blue * weight;
end;
end;
slo := Dst.scanline[ty];
slo[tx * 3] := Round(total_red);
slo[tx * 3 + 1] := Round(total_green);
slo[tx * 3 + 2] := Round(total_blue);
end;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
_Twist(BB1, BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoTrace(Amount: Integer);
procedure Trace(src: TDIB; intensity: Integer);
var
x, y, i: Integer;
P1, P2, P3, P4: PByteArray;
tb, TraceB: byte;
hasb: Boolean;
bitmap: TDIB;
begin
bitmap := TDIB.create;
bitmap.width := src.width;
bitmap.height := src.height;
bitmap.canvas.draw(0, 0, src);
bitmap.BitCount := 8;
src.BitCount := 24;
hasb := false;
TraceB := $00; tb := 0;
for i := 1 to Intensity do
begin
for y := 0 to BitMap.height - 2 do
begin
P1 := BitMap.ScanLine[y];
P2 := BitMap.scanline[y + 1];
P3 := src.scanline[y];
P4 := src.scanline[y + 1];
x := 0;
repeat
if p1[x] <> p1[x + 1] then
begin
if not hasb then
begin
tb := p1[x + 1];
hasb := true;
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
if p1[x] <> tb then
begin
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
p3[(x + 1) * 3] := TraceB;
p3[(x + 1) * 3 + 1] := TraceB;
p3[(x + 1) * 3 + 1] := TraceB;
end;
end;
end;
if p1[x] <> p2[x] then
begin
if not hasb then
begin
tb := p2[x];
hasb := true;
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
if p1[x] <> tb then
begin
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
p4[x * 3] := TraceB;
p4[x * 3 + 1] := TraceB;
p4[x * 3 + 2] := TraceB;
end;
end;
end;
inc(x);
until x >= (BitMap.width - 2);
end;
if i > 1 then
for y := BitMap.height - 1 downto 1 do
begin
P1 := BitMap.ScanLine[y];
P2 := BitMap.scanline[y - 1];
P3 := src.scanline[y];
P4 := src.scanline[y - 1];
x := Bitmap.width - 1;
repeat
if p1[x] <> p1[x - 1] then
begin
if not hasb then
begin
tb := p1[x - 1];
hasb := true;
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
if p1[x] <> tb then
begin
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
p3[(x - 1) * 3] := TraceB;
p3[(x - 1) * 3 + 1] := TraceB;
p3[(x - 1) * 3 + 2] := TraceB;
end;
end;
end;
if p1[x] <> p2[x] then
begin
if not hasb then
begin
tb := p2[x];
hasb := true;
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
if p1[x] <> tb then
begin
p3[x * 3] := TraceB;
p3[x * 3 + 1] := TraceB;
p3[x * 3 + 2] := TraceB;
end
else
begin
p4[x * 3] := TraceB;
p4[x * 3 + 1] := TraceB;
p4[x * 3 + 2] := TraceB;
end;
end;
end;
dec(x);
until x <= 1;
end;
end;
bitmap.free;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
Trace(BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoSplitlight(Amount: Integer);
procedure Splitlight(var clip: TDIB; amount: Integer);
var
x, y, i: Integer;
p1: pbytearray;
 
function sinpixs(a: Integer): Integer;
begin
result := variant(sin(a / 255 * pi / 2) * 255);
end;
begin
for i := 1 to amount do
for y := 0 to clip.height - 1 do
begin
p1 := clip.scanline[y];
for x := 0 to clip.width - 1 do
begin
p1[x * 3] := sinpixs(p1[x * 3]);
p1[x * 3 + 1] := sinpixs(p1[x * 3 + 1]);
p1[x * 3 + 2] := sinpixs(p1[x * 3 + 2]);
end;
end;
end;
var BB1 {,BB2}: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
// BB2 := TDIB.Create;
// BB2.BitCount := 24;
// BB2.Assign (BB1);
Splitlight(BB1, Amount);
Self.Assign(BB1);
BB1.Free;
// BB2.Free;
end;
 
procedure TDIB.DoTile(Amount: Integer);
procedure SmoothResize(var Src, Dst: TDIB);
var
x, y, xP, yP,
yP2, xP2: Integer;
Read, Read2: PByteArray;
t, z, z2, iz2: Integer;
pc: PBytearray;
w1, w2, w3, w4: Integer;
Col1r, col1g, col1b, Col2r, col2g, col2b: byte;
begin
xP2 := ((src.Width - 1) shl 15) div Dst.Width;
yP2 := ((src.Height - 1) shl 15) div Dst.Height;
yP := 0;
for y := 0 to Dst.Height - 1 do
begin
xP := 0;
Read := src.ScanLine[yP shr 15];
if yP shr 16 < src.Height - 1 then
Read2 := src.ScanLine[yP shr 15 + 1]
else
Read2 := src.ScanLine[yP shr 15];
pc := Dst.scanline[y];
z2 := yP and $7FFF;
iz2 := $8000 - z2;
for x := 0 to Dst.Width - 1 do
begin
t := xP shr 15;
Col1r := Read[t * 3];
Col1g := Read[t * 3 + 1];
Col1b := Read[t * 3 + 2];
Col2r := Read2[t * 3];
Col2g := Read2[t * 3 + 1];
Col2b := Read2[t * 3 + 2];
z := xP and $7FFF;
w2 := (z * iz2) shr 15;
w1 := iz2 - w2;
w4 := (z * z2) shr 15;
w3 := z2 - w4;
pc[x * 3 + 2] :=
(Col1b * w1 + Read[(t + 1) * 3 + 2] * w2 +
Col2b * w3 + Read2[(t + 1) * 3 + 2] * w4) shr 15;
pc[x * 3 + 1] :=
(Col1g * w1 + Read[(t + 1) * 3 + 1] * w2 +
Col2g * w3 + Read2[(t + 1) * 3 + 1] * w4) shr 15;
pc[x * 3] :=
(Col1r * w1 + Read2[(t + 1) * 3] * w2 +
Col2r * w3 + Read2[(t + 1) * 3] * w4) shr 15;
Inc(xP, xP2);
end;
Inc(yP, yP2);
end;
end;
procedure Tile(src, dst: TDIB; amount: Integer);
var
w, h, w2, h2, i, j: Integer;
bm: TDIB;
begin
w := src.width;
h := src.height;
dst.width := w;
dst.height := h;
dst.Canvas.draw(0, 0, src);
if (amount <= 0) or ((w div amount) < 5) or ((h div amount) < 5) then exit;
h2 := h div amount;
w2 := w div amount;
bm := TDIB.create;
bm.width := w2;
bm.height := h2;
bm.BitCount := 24;
smoothresize(src, bm);
for j := 0 to amount - 1 do
for i := 0 to amount - 1 do
dst.canvas.Draw(i * w2, j * h2, bm);
bm.free;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
Tile(BB1, BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoSpotLight(Amount: Integer; Spot: TRect);
procedure SpotLight(var src: TDIB; Amount: Integer; Spot: TRect);
var
bm, z: TDIB;
w, h: Integer;
begin
z := TDIB.Create;
try
z.SetSize(src.Width, src.Height, 24);
z.DrawTo(src, 0, 0, src.Width, src.Height, 0, 0);
w := z.Width;
h := z.Height;
bm := TDIB.create;
try
bm.Width := w;
bm.Height := h;
bm.Canvas.Brush.color := clblack;
bm.Canvas.FillRect(rect(0, 0, w, h));
bm.Canvas.Brush.Color := clwhite;
bm.Canvas.Ellipse(Spot.left, spot.top, spot.right, spot.bottom);
bm.Transparent := true;
z.Canvas.CopyMode := cmSrcAnd; {as transparentcolor for white}
z.Canvas.Draw(0, 0, src);
z.Canvas.Draw(0, 0, bm);
src.Darkness(Amount);
src.Canvas.CopyMode := cmSrcPaint;
src.DrawTransparent(z, 0, 0, z.Width, z.Height, 0, 0, clBlack);
finally
bm.Free;
end;
finally
z.Free
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
SpotLight(BB2, Amount, Spot);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoEmboss;
procedure Emboss(var Bmp: TDIB);
var
x, y: Integer;
p1, p2: Pbytearray;
begin
for y := 0 to Bmp.Height - 2 do
begin
p1 := bmp.scanline[y];
p2 := bmp.scanline[y + 1];
for x := 0 to Bmp.Width - 4 do
begin
p1[x * 3] := (p1[x * 3] + (p2[(x + 3) * 3] xor $FF)) shr 1;
p1[x * 3 + 1] := (p1[x * 3 + 1] + (p2[(x + 3) * 3 + 1] xor $FF)) shr 1;
p1[x * 3 + 2] := (p1[x * 3 + 2] + (p2[(x + 3) * 3 + 2] xor $FF)) shr 1;
end;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
Emboss(BB2);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoSolorize(Amount: Integer);
procedure Solorize(src, dst: TDIB; amount: Integer);
var
w, h, x, y: Integer;
ps, pd: pbytearray;
c: Integer;
begin
w := src.width;
h := src.height;
src.BitCount := 24;
dst.BitCount := 24;
for y := 0 to h - 1 do
begin
ps := src.scanline[y];
pd := dst.scanline[y];
for x := 0 to w - 1 do
begin
c := (ps[x * 3] + ps[x * 3 + 1] + ps[x * 3 + 2]) div 3;
if c > amount then
begin
pd[x * 3] := 255 - ps[x * 3];
pd[x * 3 + 1] := 255 - ps[x * 3 + 1];
pd[x * 3 + 2] := 255 - ps[x * 3 + 2];
end
else
begin
pd[x * 3] := ps[x * 3];
pd[x * 3 + 1] := ps[x * 3 + 1];
pd[x * 3 + 2] := ps[x * 3 + 2];
end;
end;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
Solorize(BB1, BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoPosterize(Amount: Integer);
procedure Posterize(src, dst: TDIB; amount: Integer);
var
w, h, x, y: Integer;
ps, pd: pbytearray;
begin
w := src.width;
h := src.height;
src.BitCount := 24;
dst.BitCount := 24;
for y := 0 to h - 1 do
begin
ps := src.scanline[y];
pd := dst.scanline[y];
for x := 0 to w - 1 do
begin
pd[x * 3] := round(ps[x * 3] / amount) * amount;
pd[x * 3 + 1] := round(ps[x * 3 + 1] / amount) * amount;
pd[x * 3 + 2] := round(ps[x * 3 + 2] / amount) * amount;
end;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
Posterize(BB1, BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoBrightness(Amount: Integer);
procedure Brightness(src, dst: TDIB; level: Integer);
const
MaxPixelCount = 32768;
type
pRGBArray = ^TRGBArray;
TRGBArray = array[0..MaxPixelCount - 1] of TRGBTriple;
var
i, j, value: Integer;
OrigRow, DestRow: pRGBArray;
begin
// get brightness increment value
value := level;
src.BitCount := 24;
dst.BitCount := 24;
// for each row of pixels
for i := 0 to src.Height - 1 do
begin
OrigRow := src.ScanLine[i];
DestRow := dst.ScanLine[i];
// for each pixel in row
for j := 0 to src.Width - 1 do
begin
// add brightness value to pixel's RGB values
if value > 0 then
begin
// RGB values must be less than 256
DestRow[j].rgbtRed := Min(255, OrigRow[j].rgbtRed + value);
DestRow[j].rgbtGreen := Min(255, OrigRow[j].rgbtGreen + value);
DestRow[j].rgbtBlue := Min(255, OrigRow[j].rgbtBlue + value);
end
else
begin
// RGB values must be greater or equal than 0
DestRow[j].rgbtRed := Max(0, OrigRow[j].rgbtRed + value);
DestRow[j].rgbtGreen := Max(0, OrigRow[j].rgbtGreen + value);
DestRow[j].rgbtBlue := Max(0, OrigRow[j].rgbtBlue + value);
end;
end;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.BitCount := 24;
BB2.Assign(BB1);
Brightness(BB1, BB2, Amount);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoResample(AmountX, AmountY: Integer; TypeResample: TFilterTypeResample);
procedure Resample(Src, Dst: TDIB; filtertype: TFilterTypeResample; fwidth: single);
// -----------------------------------------------------------------------------
//
// Filter functions
//
// -----------------------------------------------------------------------------
 
// Hermite filter
function HermiteFilter(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
// f(t) = 2|t|^3 - 3|t|^2 + 1, -1 <= t <= 1
if (Value < 0.0) then
Value := -Value;
if (Value < 1.0) then
Result := (2.0 * Value - 3.0) * Sqr(Value) + 1.0
else
Result := 0.0;
end;
 
// Box filter
// a.k.a. "Nearest Neighbour" filter
// anme: I have not been able to get acceptable
// results with this filter for subsampling.
function BoxFilter(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if (Value > -0.5) and (Value <= 0.5) then
Result := 1.0
else
Result := 0.0;
end;
 
// Triangle filter
// a.k.a. "Linear" or "Bilinear" filter
function TriangleFilter(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if (Value < 0.0) then
Value := -Value;
if (Value < 1.0) then
Result := 1.0 - Value
else
Result := 0.0;
end;
 
// Bell filter
function BellFilter(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if (Value < 0.0) then
Value := -Value;
if (Value < 0.5) then
Result := 0.75 - Sqr(Value)
else
if (Value < 1.5) then
begin
Value := Value - 1.5;
Result := 0.5 * Sqr(Value);
end
else
Result := 0.0;
end;
 
// B-spline filter
function SplineFilter(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
var
tt: single;
begin
if (Value < 0.0) then
Value := -Value;
if (Value < 1.0) then
begin
tt := Sqr(Value);
Result := 0.5 * tt * Value - tt + 2.0 / 3.0;
end
else
if (Value < 2.0) then
begin
Value := 2.0 - Value;
Result := 1.0 / 6.0 * Sqr(Value) * Value;
end
else
Result := 0.0;
end;
 
// Lanczos3 filter
function Lanczos3Filter(Value: Single): Single;
function SinC(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if (Value <> 0.0) then
begin
Value := Value * Pi;
Result := sin(Value) / Value
end
else
Result := 1.0;
end;
begin
if (Value < 0.0) then
Value := -Value;
if (Value < 3.0) then
Result := SinC(Value) * SinC(Value / 3.0)
else
Result := 0.0;
end;
 
function MitchellFilter(Value: Single): Single; {$IFDEF VER9UP}inline;{$ENDIF}
const
B = (1.0 / 3.0);
C = (1.0 / 3.0);
var
tt: single;
begin
if (Value < 0.0) then
Value := -Value;
tt := Sqr(Value);
if (Value < 1.0) then
begin
Value := (((12.0 - 9.0 * B - 6.0 * C) * (Value * tt))
+ ((-18.0 + 12.0 * B + 6.0 * C) * tt)
+ (6.0 - 2 * B));
Result := Value / 6.0;
end
else
if (Value < 2.0) then
begin
Value := (((-1.0 * B - 6.0 * C) * (Value * tt))
+ ((6.0 * B + 30.0 * C) * tt)
+ ((-12.0 * B - 48.0 * C) * Value)
+ (8.0 * B + 24 * C));
Result := Value / 6.0;
end
else
Result := 0.0;
end;
 
// -----------------------------------------------------------------------------
//
// Interpolator
//
// -----------------------------------------------------------------------------
type
// Contributor for a pixel
TContributor = packed record
pixel: Integer; // Source pixel
weight: single; // Pixel weight
end;
 
TContributorList = array[0..0] of TContributor;
PContributorList = ^TContributorList;
 
// List of source pixels contributing to a destination pixel
TCList = packed record
n: Integer;
p: PContributorList;
end;
 
TCListList = array[0..0] of TCList;
PCListList = ^TCListList;
 
TRGB = packed record
r, g, b: single;
end;
 
// Physical bitmap pixel
TColorRGB = packed record
r, g, b: BYTE;
end;
PColorRGB = ^TColorRGB;
 
// Physical bitmap scanline (row)
TRGBList = packed array[0..0] of TColorRGB;
PRGBList = ^TRGBList;
 
var
xscale, yscale: single; // Zoom scale factors
i, j, k: Integer; // Loop variables
center: single; // Filter calculation variables
width, fscale, weight: single; // Filter calculation variables
left, right: Integer; // Filter calculation variables
n: Integer; // Pixel number
Work: TDIB;
contrib: PCListList;
rgb: TRGB;
color: TColorRGB;
{$IFDEF USE_SCANLINE}
SourceLine,
DestLine: PRGBList;
//SourcePixel,
DestPixel: PColorRGB;
Delta,
DestDelta: Integer;
{$ENDIF}
SrcWidth,
SrcHeight,
DstWidth,
DstHeight: Integer;
 
function Color2RGB(Color: TColor): TColorRGB; {$IFDEF VER9UP}inline;{$ENDIF}
begin
Result.r := Color and $000000FF;
Result.g := (Color and $0000FF00) shr 8;
Result.b := (Color and $00FF0000) shr 16;
end;
 
function RGB2Color(Color: TColorRGB): TColor; {$IFDEF VER9UP}inline;{$ENDIF}
begin
Result := Color.r or (Color.g shl 8) or (Color.b shl 16);
end;
 
begin
DstWidth := Dst.Width;
DstHeight := Dst.Height;
SrcWidth := Src.Width;
SrcHeight := Src.Height;
if (SrcWidth < 1) or (SrcHeight < 1) then
raise Exception.Create('Source bitmap too small');
 
// Create intermediate image to hold horizontal zoom
Work := TDIB.Create;
try
Work.Height := SrcHeight;
Work.Width := DstWidth;
// xscale := DstWidth / SrcWidth;
// yscale := DstHeight / SrcHeight;
// Improvement suggested by David Ullrich:
if (SrcWidth = 1) then
xscale := DstWidth / SrcWidth
else
xscale := (DstWidth - 1) / (SrcWidth - 1);
if (SrcHeight = 1) then
yscale := DstHeight / SrcHeight
else
yscale := (DstHeight - 1) / (SrcHeight - 1);
// This implementation only works on 24-bit images because it uses
// TDIB.Scanline
{$IFDEF USE_SCANLINE}
//Src.PixelFormat := pf24bit;
Src.BitCount := 24;
//Dst.PixelFormat := Src.PixelFormat;
dst.BitCount := 24;
//Work.PixelFormat := Src.PixelFormat;
work.BitCount := 24;
{$ENDIF}
 
// --------------------------------------------
// Pre-calculate filter contributions for a row
// -----------------------------------------------
GetMem(contrib, DstWidth * sizeof(TCList));
// Horizontal sub-sampling
// Scales from bigger to smaller width
if (xscale < 1.0) then
begin
width := fwidth / xscale;
fscale := 1.0 / xscale;
for i := 0 to DstWidth - 1 do
begin
contrib^[i].n := 0;
GetMem(contrib^[i].p, trunc(width * 2.0 + 1) * sizeof(TContributor));
center := i / xscale;
// Original code:
// left := ceil(center - width);
// right := floor(center + width);
left := floor(center - width);
right := ceil(center + width);
for j := left to right do
begin
case filtertype of
ftrBox: weight := boxfilter((center - j) / fscale) / fscale;
ftrTriangle: weight := trianglefilter((center - j) / fscale) / fscale;
ftrHermite: weight := hermitefilter((center - j) / fscale) / fscale;
ftrBell: weight := bellfilter((center - j) / fscale) / fscale;
ftrBSpline: weight := splinefilter((center - j) / fscale) / fscale;
ftrLanczos3: weight := Lanczos3filter((center - j) / fscale) / fscale;
ftrMitchell: weight := Mitchellfilter((center - j) / fscale) / fscale;
else
weight := 0
end;
if (weight = 0.0) then
continue;
if (j < 0) then
n := -j
else if (j >= SrcWidth) then
n := SrcWidth - j + SrcWidth - 1
else
n := j;
k := contrib^[i].n;
contrib^[i].n := contrib^[i].n + 1;
contrib^[i].p^[k].pixel := n;
contrib^[i].p^[k].weight := weight;
end;
end;
end
else
// Horizontal super-sampling
// Scales from smaller to bigger width
begin
for i := 0 to DstWidth - 1 do
begin
contrib^[i].n := 0;
GetMem(contrib^[i].p, trunc(fwidth * 2.0 + 1) * sizeof(TContributor));
center := i / xscale;
// Original code:
// left := ceil(center - fwidth);
// right := floor(center + fwidth);
left := floor(center - fwidth);
right := ceil(center + fwidth);
for j := left to right do
begin
case filtertype of
ftrBox: weight := boxfilter(center - j);
ftrTriangle: weight := trianglefilter(center - j);
ftrHermite: weight := hermitefilter(center - j);
ftrBell: weight := bellfilter(center - j);
ftrBSpline: weight := splinefilter(center - j);
ftrLanczos3: weight := Lanczos3filter(center - j);
ftrMitchell: weight := Mitchellfilter(center - j);
else
weight := 0
end;
if (weight = 0.0) then
continue;
if (j < 0) then
n := -j
else if (j >= SrcWidth) then
n := SrcWidth - j + SrcWidth - 1
else
n := j;
k := contrib^[i].n;
contrib^[i].n := contrib^[i].n + 1;
contrib^[i].p^[k].pixel := n;
contrib^[i].p^[k].weight := weight;
end;
end;
end;
 
// ----------------------------------------------------
// Apply filter to sample horizontally from Src to Work
// ----------------------------------------------------
for k := 0 to SrcHeight - 1 do
begin
{$IFDEF USE_SCANLINE}
SourceLine := Src.ScanLine[k];
DestPixel := Work.ScanLine[k];
{$ENDIF}
for i := 0 to DstWidth - 1 do
begin
rgb.r := 0.0;
rgb.g := 0.0;
rgb.b := 0.0;
for j := 0 to contrib^[i].n - 1 do
begin
{$IFDEF USE_SCANLINE}
color := SourceLine^[contrib^[i].p^[j].pixel];
{$ELSE}
color := Color2RGB(Src.Canvas.Pixels[contrib^[i].p^[j].pixel, k]);
{$ENDIF}
weight := contrib^[i].p^[j].weight;
if (weight = 0.0) then
continue;
rgb.r := rgb.r + color.r * weight;
rgb.g := rgb.g + color.g * weight;
rgb.b := rgb.b + color.b * weight;
end;
if (rgb.r > 255.0) then
color.r := 255
else if (rgb.r < 0.0) then
color.r := 0
else
color.r := round(rgb.r);
if (rgb.g > 255.0) then
color.g := 255
else if (rgb.g < 0.0) then
color.g := 0
else
color.g := round(rgb.g);
if (rgb.b > 255.0) then
color.b := 255
else if (rgb.b < 0.0) then
color.b := 0
else
color.b := round(rgb.b);
{$IFDEF USE_SCANLINE}
// Set new pixel value
DestPixel^ := color;
// Move on to next column
inc(DestPixel);
{$ELSE}
Work.Canvas.Pixels[i, k] := RGB2Color(color);
{$ENDIF}
end;
end;
 
// Free the memory allocated for horizontal filter weights
for i := 0 to DstWidth - 1 do
FreeMem(contrib^[i].p);
 
FreeMem(contrib);
 
// -----------------------------------------------
// Pre-calculate filter contributions for a column
// -----------------------------------------------
GetMem(contrib, DstHeight * sizeof(TCList));
// Vertical sub-sampling
// Scales from bigger to smaller height
if (yscale < 1.0) then
begin
width := fwidth / yscale;
fscale := 1.0 / yscale;
for i := 0 to DstHeight - 1 do
begin
contrib^[i].n := 0;
GetMem(contrib^[i].p, trunc(width * 2.0 + 1) * sizeof(TContributor));
center := i / yscale;
// Original code:
// left := ceil(center - width);
// right := floor(center + width);
left := floor(center - width);
right := ceil(center + width);
for j := left to right do
begin
case filtertype of
ftrBox: weight := boxfilter((center - j) / fscale) / fscale;
ftrTriangle: weight := trianglefilter((center - j) / fscale) / fscale;
ftrHermite: weight := hermitefilter((center - j) / fscale) / fscale;
ftrBell: weight := bellfilter((center - j) / fscale) / fscale;
ftrBSpline: weight := splinefilter((center - j) / fscale) / fscale;
ftrLanczos3: weight := Lanczos3filter((center - j) / fscale) / fscale;
ftrMitchell: weight := Mitchellfilter((center - j) / fscale) / fscale;
else
weight := 0
end;
if (weight = 0.0) then
continue;
if (j < 0) then
n := -j
else if (j >= SrcHeight) then
n := SrcHeight - j + SrcHeight - 1
else
n := j;
k := contrib^[i].n;
contrib^[i].n := contrib^[i].n + 1;
contrib^[i].p^[k].pixel := n;
contrib^[i].p^[k].weight := weight;
end;
end
end
else
// Vertical super-sampling
// Scales from smaller to bigger height
begin
for i := 0 to DstHeight - 1 do
begin
contrib^[i].n := 0;
GetMem(contrib^[i].p, trunc(fwidth * 2.0 + 1) * sizeof(TContributor));
center := i / yscale;
// Original code:
// left := ceil(center - fwidth);
// right := floor(center + fwidth);
left := floor(center - fwidth);
right := ceil(center + fwidth);
for j := left to right do
begin
case filtertype of
ftrBox: weight := boxfilter(center - j);
ftrTriangle: weight := trianglefilter(center - j);
ftrHermite: weight := hermitefilter(center - j);
ftrBell: weight := bellfilter(center - j);
ftrBSpline: weight := splinefilter(center - j);
ftrLanczos3: weight := Lanczos3filter(center - j);
ftrMitchell: weight := Mitchellfilter(center - j);
else
weight := 0
end;
if (weight = 0.0) then
continue;
if (j < 0) then
n := -j
else if (j >= SrcHeight) then
n := SrcHeight - j + SrcHeight - 1
else
n := j;
k := contrib^[i].n;
contrib^[i].n := contrib^[i].n + 1;
contrib^[i].p^[k].pixel := n;
contrib^[i].p^[k].weight := weight;
end;
end;
end;
 
// --------------------------------------------------
// Apply filter to sample vertically from Work to Dst
// --------------------------------------------------
{$IFDEF USE_SCANLINE}
SourceLine := Work.ScanLine[0];
Delta := Integer(Work.ScanLine[1]) - Integer(SourceLine);
DestLine := Dst.ScanLine[0];
DestDelta := Integer(Dst.ScanLine[1]) - Integer(DestLine);
{$ENDIF}
for k := 0 to DstWidth - 1 do
begin
{$IFDEF USE_SCANLINE}
DestPixel := pointer(DestLine);
{$ENDIF}
for i := 0 to DstHeight - 1 do
begin
rgb.r := 0;
rgb.g := 0;
rgb.b := 0;
// weight := 0.0;
for j := 0 to contrib^[i].n - 1 do
begin
{$IFDEF USE_SCANLINE}
//color := PColorRGB(PByte(SourceLine) + contrib^[i].p^[j].pixel * Delta)^;
Move(Pointer(Integer(SourceLine) + contrib^[i].p^[j].pixel * Delta)^, Color, SizeOf(Color));
{$ELSE}
color := Color2RGB(Work.Canvas.Pixels[k, contrib^[i].p^[j].pixel]);
{$ENDIF}
weight := contrib^[i].p^[j].weight;
if (weight = 0.0) then
continue;
rgb.r := rgb.r + color.r * weight;
rgb.g := rgb.g + color.g * weight;
rgb.b := rgb.b + color.b * weight;
end;
if (rgb.r > 255.0) then
color.r := 255
else if (rgb.r < 0.0) then
color.r := 0
else
color.r := round(rgb.r);
if (rgb.g > 255.0) then
color.g := 255
else if (rgb.g < 0.0) then
color.g := 0
else
color.g := round(rgb.g);
if (rgb.b > 255.0) then
color.b := 255
else if (rgb.b < 0.0) then
color.b := 0
else
color.b := round(rgb.b);
{$IFDEF USE_SCANLINE}
DestPixel^ := color;
{$IFDEF WIN64}
inc(PByte(DestPixel), DestDelta);
{$ELSE}
inc(Integer(DestPixel), DestDelta);
{$ENDIF}
{$ELSE}
Dst.Canvas.Pixels[k, i] := RGB2Color(color);
{$ENDIF}
end;
{$IFDEF USE_SCANLINE}
Inc(SourceLine, 1);
Inc(DestLine, 1);
{$ENDIF}
end;
 
// Free the memory allocated for vertical filter weights
for i := 0 to DstHeight - 1 do
FreeMem(contrib^[i].p);
 
FreeMem(contrib);
 
finally
Work.Free;
end;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
BB2.SetSize(AmountX, AmountY, 24);
Resample(BB1, BB2, TypeResample, DefaultFilterRadius[TypeResample]);
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
procedure TDIB.DoColorize(ForeColor, BackColor: TColor);
procedure Colorize(src, dst: TDIB; iForeColor, iBackColor: TColor; iDither: Boolean{$IFDEF VER4UP} = False{$ENDIF});
{for monochromatic picture change colors}
procedure InvertBitmap(Bmp: TDIB);
begin
Bmp.Canvas.CopyMode := cmDstInvert;
Bmp.Canvas.CopyRect(rect(0, 0, Bmp.Width, Bmp.Height),
Bmp.Canvas, rect(0, 0, Bmp.Width, Bmp.Height));
end;
var
fForeColor: TColor;
fForeDither: Boolean;
lTempBitmap: TDIB;
lTempBitmap2: TDIB;
lDitherBitmap: TDIB;
lCRect: TRect;
x, y, w, h: Integer;
begin
{--}
//fColor := iBackColor; ;
fForeColor := iForeColor;
fForeDither := iDither;
w := src.Width;
h := src.Height;
lDitherBitmap := nil;
lTempBitmap := TDIB.Create;
lTempBitmap.SetSize(w, h, 24);
lTempBitmap2 := TDIB.Create;
lTempBitmap2.SetSize(w, h, 24);
lCRect := rect(0, 0, w, h);
with lTempBitmap.Canvas do
begin
Brush.Style := bsSolid;
Brush.Color := iBackColor;
FillRect(lCRect);
CopyMode := cmSrcInvert;
CopyRect(lCRect, src.Canvas, lCRect);
InvertBitmap(src);
CopyMode := cmSrcPaint;
CopyRect(lCRect, src.Canvas, lCRect);
InvertBitmap(lTempBitmap);
CopyMode := cmSrcInvert;
CopyRect(lCRect, src.Canvas, lCRect);
InvertBitmap(src);
end;
with lTempBitmap2.Canvas do
begin
Brush.Style := bsSolid;
Brush.Color := clBlack;
FillRect(lCRect);
if fForeDither then
begin
InvertBitmap(src);
lDitherBitmap := TDIB.Create;
lDitherBitmap.SetSize(8, 8, 24);
with lDitherBitmap.Canvas do
begin
for x := 0 to 7 do
for y := 0 to 7 do
if ((x mod 2 = 0) and (y mod 2 > 0)) or ((x mod 2 > 0) and (y mod 2 = 0)) then
pixels[x, y] := fForeColor
else
pixels[x, y] := iBackColor;
end;
Brush.Bitmap.Assign(lDitherBitmap);
end
else
begin
Brush.Style := bsSolid;
Brush.Color := fForeColor;
end;
if not fForeDither then
InvertBitmap(src);
CopyMode := cmPatPaint;
CopyRect(lCRect, src.Canvas, lCRect);
if fForeDither then
if Assigned(lDitherBitmap) then
lDitherBitmap.Free;
CopyMode := cmSrcInvert;
CopyRect(lCRect, src.Canvas, lCRect);
end;
lTempBitmap.Canvas.CopyMode := cmSrcInvert;
lTempBitmap.Canvas.Copyrect(lCRect, lTempBitmap2.Canvas, lCRect);
InvertBitmap(src);
lTempBitmap.Canvas.CopyMode := cmSrcErase;
lTempBitmap.Canvas.Copyrect(lCRect, src.Canvas, lCRect);
InvertBitmap(src);
lTempBitmap.Canvas.CopyMode := cmSrcInvert;
lTempBitmap.Canvas.Copyrect(lCRect, lTempBitmap2.Canvas, lCRect);
InvertBitmap(lTempBitmap);
InvertBitmap(src);
dst.Assign(lTempBitmap);
lTempBitmap.Free;
end;
var BB1, BB2: TDIB;
begin
BB1 := TDIB.Create;
BB1.BitCount := 24;
BB1.Assign(Self);
BB2 := TDIB.Create;
Colorize(BB1, BB2, ForeColor, BackColor{$IFNDEF VER4UP}, False{$ENDIF});
Self.Assign(BB2);
BB1.Free;
BB2.Free;
end;
 
{ procedure for special purpose }
(*
procedure TDIB.FadeOut(DIB2: TDIB; Step: Byte);
var
P1, P2: PByteArray;
W, H: Integer;
begin
P1 := ScanLine[DIB2.Height - 1];
P2 := DIB2.ScanLine[DIB2.Height - 1];
W := WidthBytes;
H := Height;
asm
PUSH ESI
PUSH EDI
MOV ESI, P1
MOV EDI, P2
MOV EDX, W
MOV EAX, H
IMUL EDX
MOV ECX, EAX
@@1:
MOV AL, Step
MOV AH, [ESI]
CMP AL, AH
JA @@2
MOV AL, AH
@@2:
MOV [EDI], AL
INC ESI
INC EDI
DEC ECX
JNZ @@1
POP EDI
POP ESI
end;
end;
*)
procedure TDIB.FadeOut(DIB2: TDIB; Step: Byte);
var
P1, P2: PByteArray;
W, H, i: Integer;
begin
P1 := ScanLine[DIB2.Height - 1];
P2 := DIB2.ScanLine[DIB2.Height - 1];
W := WidthBytes;
H := Height;
for i := 0 to W * H - 1 do
begin
if P1[i] < Step then P2[i] := P1[i]
else P2[i] := Step;
end;
end;
 
procedure TDIB.DoZoom(DIB2: TDIB; ZoomRatio: Real);
var
P1, P2: PByteArray;
W, H: Integer;
x, y: Integer;
xr, yr, xstep, ystep: real;
xstart: real;
begin
W := WidthBytes;
H := Height;
xstart := (W - (W * ZoomRatio)) / 2;
 
xr := xstart;
yr := (H - (H * ZoomRatio)) / 2;
xstep := ZoomRatio;
ystep := ZoomRatio;
 
for y := 1 to Height - 1 do
begin
P2 := DIB2.ScanLine[y];
if (yr >= 0) and (yr <= H) then
begin
P1 := ScanLine[Trunc(yr)];
for x := 1 to Width - 1 do
begin
if (xr >= 0) and (xr <= W) then
begin
P2[x] := P1[Trunc(xr)];
end
else
begin
P2[x] := 0;
end;
xr := xr + xstep;
end;
end
else
begin
for x := 1 to Width - 1 do
begin
P2[x] := 0;
end;
end;
xr := xstart;
yr := yr + ystep;
end;
end;
 
procedure TDIB.DoBlur(DIB2: TDIB);
var
P1, P2: PByteArray;
W: Integer;
x, y: Integer;
begin
W := WidthBytes;
for y := 1 to Height - 1 do
begin
P1 := ScanLine[y];
P2 := DIB2.ScanLine[y];
for x := 1 to Width - 1 do
begin
P2[x] := (P1[x] + P1[x - 1] + P1[x + 1] + P1[x + W] + P1[x - W]) div 5;
end;
end;
end;
(*
procedure TDIB.FadeIn(DIB2: TDIB; Step: Byte);
var
P1, P2: PByteArray;
W, H: Integer;
begin
P1 := ScanLine[DIB2.Height - 1];
P2 := DIB2.ScanLine[DIB2.Height - 1];
W := WidthBytes;
H := Height;
asm
PUSH ESI
PUSH EDI
MOV ESI, P1
MOV EDI, P2
MOV EDX, W
MOV EAX, H
IMUL EDX
MOV ECX, EAX
@@1:
MOV AL, Step
MOV AH, [ESI]
CMP AL, AH
JB @@2
MOV AL, AH
@@2:
MOV [EDI], AL
INC ESI
INC EDI
DEC ECX
JNZ @@1
POP EDI
POP ESI
end;
end;
*)
procedure TDIB.FadeIn(DIB2: TDIB; Step: Byte);
var
P1, P2: PByteArray;
W, H, i: Integer;
begin
P1 := ScanLine[DIB2.Height - 1];
P2 := DIB2.ScanLine[DIB2.Height - 1];
W := WidthBytes;
H := Height;
for i := 0 to W * H - 1 do
begin
if P1[i] > Step then P2[i] := P1[i]
else P2[i] := Step;
end;
end;
 
(*
procedure TDIB.FillDIB8(Color: Byte);
var
P: PByteArray;
W, H: Integer;
begin
P := ScanLine[Height - 1];
W := WidthBytes;
H := Height;
asm
PUSH ESI
MOV ESI, P
MOV EDX, W
MOV EAX, H
IMUL EDX
MOV ECX, EAX
MOV AL, Color
@@1:
MOV [ESI], AL
INC ESI
DEC ECX
JNZ @@1
POP ESI
end;
end;
*)
 
procedure TDIB.FillDIB8(Color: Byte);
var
P: PByteArray;
W, H, I: Integer;
begin
P := ScanLine[Height - 1];
W := WidthBytes;
H := Height;
for I := 0 to W * H - 1 do
P[I] := Color;
end;
 
 
procedure TDIB.DoRotate(DIB1: TDIB; cX, cY, Angle: Integer);
type
T3Byte = array[0..2] of Byte;
P3ByteArray = ^T3ByteArray;
T3ByteArray = array[0..32767] of T3Byte;
PLongArray = ^TLongArray;
TLongArray = array[0..32767] of LongInt;
var
p, p2: PByteArray;
x, y, x2, y2, angled: Integer;
cosy, siny: real;
begin
angled := 384 + Angle;
for y := 0 to Height - 1 do
begin
p := DIB1.ScanLine[y];
cosy := (y - cY) * dcos(angled and $1FF);
siny := (y - cY) * dsin(angled and $1FF);
for x := 0 to Width - 1 do
begin
x2 := Trunc((x - cX) * dsin(angled and $1FF) + cosy) + cX;
y2 := Trunc((x - cX) * dcos(angled and $1FF) - siny) + cY;
case bitcount of
8:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
p2 := ScanLine[y2];
p[x] := p2[Width - x2];
end
else
begin
if p[x] > 4 then
p[x] := p[x] - 4
else
p[x] := 0;
end;
end;
16:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
PWordArray(p2) := ScanLine[y2];
PWordArray(p)[x] := PWordArray(p2)[Width - x2];
end
else
begin
if PWordArray(p)[x] > 4 then
PWordArray(p)[x] := PWordArray(p)[x] - 4
else
PWordArray(p)[x] := 0;
end;
end;
24:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
P3ByteArray(p2) := ScanLine[y2];
P3ByteArray(p)[x] := P3ByteArray(p2)[Width - x2];
end
else
begin
if P3ByteArray(p)[x][0] > 4 then
P3ByteArray(p)[x][0] := P3ByteArray(p)[x][0] - 4
else if P3ByteArray(p)[x][1] > 4 then
P3ByteArray(p)[x][1] := P3ByteArray(p)[x][1] - 4
else if P3ByteArray(p)[x][2] > 4 then
P3ByteArray(p)[x][2] := P3ByteArray(p)[x][2] - 4
else
begin
P3ByteArray(p)[x][0] := 0;
P3ByteArray(p)[x][1] := 0;
P3ByteArray(p)[x][2] := 0;
end;
end;
end;
32: begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
plongarray(p2) := ScanLine[y2];
plongarray(p)[x] := plongarray(p2)[Width - x2];
end
else
begin
if plongarray(p)[x] > 4 then
plongarray(p)[x] := plongarray(p)[x] - 4
else
plongarray(p)[x] := 0;
end;
end;
end
end;
end;
end;
 
function TDIB.Ink(DIB: TDIB; const SprayInit: Boolean; const AmountSpray: Integer): Boolean;
type
T3Byte = array[0..2] of Byte;
P3ByteArray = ^T3ByteArray;
T3ByteArray = array[0..32767] of T3Byte;
PLongArray = ^TLongArray;
TLongArray = array[0..32767] of LongInt;
function ColorToRGBTriple(const Color: TColor): TRGBTriple;
begin
with RESULT do
begin
rgbtRed := GetRValue(Color);
rgbtGreen := GetGValue(Color);
rgbtBlue := GetBValue(Color)
end
end {ColorToRGBTriple};
 
function TestQuad(T: T3Byte; Color: Integer): Boolean;
begin
Result := (T[0] > GetRValue(Color)) and
(T[1] > GetGValue(Color)) and
(T[2] > GetBValue(Color))
end;
var
p0, p, p2: PByteArray;
x, y, c: Integer;
z: Integer;
begin
if SprayInit then
begin
DIB.Assign(Self);
{ Spray seeds }
for c := 0 to AmountSpray do
begin
DIB.Pixels[Random(Width - 1), Random(Height - 1)] := 0;
end;
end;
Result := True; {all is black}
for y := 0 to DIB.Height - 1 do
begin
p := DIB.ScanLine[y];
for x := 0 to DIB.Width - 1 do
begin
case bitcount of
8:
begin
if p[x] < 16 then
begin
if p[x] > 0 then Result := False;
if y > 0 then
begin
p0 := DIB.ScanLine[y - 1];
if p0[x] > 4 then
p0[x] := p0[x] - 4
else
p0[x] := 0;
if x > 0 then
if p0[x - 1] > 2 then
p0[x - 1] := p0[x - 1] - 2
else
p0[x - 1] := 0;
if x < (DIB.Width - 1) then
if p0[x + 1] > 2 then
p0[x + 1] := p0[x + 1] - 2
else
p0[x + 1] := 0;
end;
if y < (DIB.Height - 1) then
begin
p2 := DIB.ScanLine[y + 1];
if p2[x] > 4 then
p2[x] := p2[x] - 4
else
p2[x] := 0;
if x > 0 then
if p2[x - 1] > 2 then
p2[x - 1] := p2[x - 1] - 2
else
p2[x - 1] := 0;
if x < (DIB.Width - 1) then
if p2[x + 1] > 2 then
p2[x + 1] := p2[x + 1] - 2
else
p2[x + 1] := 0;
end;
if p[x] > 8 then
p[x] := p[x] - 8
else
p[x] := 0;
if x > 0 then
if p[x - 1] > 4 then
p[x - 1] := p[x - 1] - 4
else
p[x - 1] := 0;
if x < (DIB.Width - 1) then
if p[x + 1] > 4 then
p[x + 1] := p[x + 1] - 4
else
p[x + 1] := 0;
end;
end;
16:
begin
if pwordarray(p)[x] < 16 then
begin
if pwordarray(p)[x] > 0 then Result := False;
if y > 0 then
begin
pwordarray(p0) := DIB.ScanLine[y - 1];
if pwordarray(p0)[x] > 4 then
pwordarray(p0)[x] := pwordarray(p0)[x] - 4
else
pwordarray(p0)[x] := 0;
if x > 0 then
if pwordarray(p0)[x - 1] > 2 then
pwordarray(p0)[x - 1] := pwordarray(p0)[x - 1] - 2
else
pwordarray(p0)[x - 1] := 0;
if x < (DIB.Width - 1) then
if pwordarray(p0)[x + 1] > 2 then
pwordarray(p0)[x + 1] := pwordarray(p0)[x + 1] - 2
else
pwordarray(p0)[x + 1] := 0;
end;
if y < (DIB.Height - 1) then
begin
pwordarray(p2) := DIB.ScanLine[y + 1];
if pwordarray(p2)[x] > 4 then
pwordarray(p2)[x] := pwordarray(p2)[x] - 4
else
pwordarray(p2)[x] := 0;
if x > 0 then
if pwordarray(p2)[x - 1] > 2 then
pwordarray(p2)[x - 1] := pwordarray(p2)[x - 1] - 2
else
pwordarray(p2)[x - 1] := 0;
if x < (DIB.Width - 1) then
if pwordarray(p2)[x + 1] > 2 then
pwordarray(p2)[x + 1] := pwordarray(p2)[x + 1] - 2
else
pwordarray(p2)[x + 1] := 0;
end;
if pwordarray(p)[x] > 8 then
pwordarray(p)[x] := pwordarray(p)[x] - 8
else
pwordarray(p)[x] := 0;
if x > 0 then
if pwordarray(p)[x - 1] > 4 then
pwordarray(p)[x - 1] := pwordarray(p)[x - 1] - 4
else
pwordarray(p)[x - 1] := 0;
if x < (DIB.Width - 1) then
if pwordarray(p)[x + 1] > 4 then
pwordarray(p)[x + 1] := pwordarray(p)[x + 1] - 4
else
pwordarray(p)[x + 1] := 0;
end;
end;
24:
begin
if not TestQuad(P3ByteArray(p)[x], 16) then
begin
if TestQuad(P3ByteArray(p)[x], 0) then Result := False;
if y > 0 then
begin
P3ByteArray(p0) := DIB.ScanLine[y - 1];
if TestQuad(P3ByteArray(p0)[x], 4) then
begin
for z := 0 to 2 do
if P3ByteArray(p0)[x][z] > 4 then
P3ByteArray(p0)[x][z] := P3ByteArray(p0)[x][z] - 4
end
else
for z := 0 to 2 do
P3ByteArray(p0)[x][z] := 0;
if x > 0 then
if TestQuad(P3ByteArray(p0)[x - 1], 2) then
begin
for z := 0 to 2 do
if P3ByteArray(p0)[x - 1][z] > 2 then
P3ByteArray(p0)[x - 1][z] := P3ByteArray(p0)[x - 1][z] - 2
end
else
for z := 0 to 2 do
P3ByteArray(p0)[x - 1][z] := 0;
if x < (DIB.Width - 1) then
if TestQuad(P3ByteArray(p0)[x + 1], 2) then
begin
for z := 0 to 2 do
if P3ByteArray(p0)[x + 1][z] > 2 then
P3ByteArray(p0)[x + 1][z] := P3ByteArray(p0)[x + 1][z] - 2
end
else
for z := 0 to 2 do
P3ByteArray(p0)[x + 1][z] := 0;
end;
if y < (DIB.Height - 1) then
begin
P3ByteArray(p2) := DIB.ScanLine[y + 1];
if TestQuad(P3ByteArray(p2)[x], 4) then
begin
for z := 0 to 2 do
if P3ByteArray(p2)[x][z] > 4 then
P3ByteArray(p2)[x][z] := P3ByteArray(p2)[x][z] - 4
end
else
for z := 0 to 2 do
P3ByteArray(p2)[x][z] := 0;
if x > 0 then
if TestQuad(P3ByteArray(p2)[x - 1], 2) then
begin
for z := 0 to 2 do
if P3ByteArray(p2)[x - 1][z] > 2 then
P3ByteArray(p2)[x - 1][z] := P3ByteArray(p2)[x - 1][z] - 2
end
else
for z := 0 to 2 do
P3ByteArray(p2)[x - 1][z] := 0;
if x < (DIB.Width - 1) then
if TestQuad(P3ByteArray(p2)[x + 1], 2) then
begin
for z := 0 to 2 do
if P3ByteArray(p2)[x + 1][z] > 2 then
P3ByteArray(p2)[x + 1][z] := P3ByteArray(p2)[x + 1][z] - 2
end
else
for z := 0 to 2 do
P3ByteArray(p2)[x + 1][z] := 0;
end;
if TestQuad(P3ByteArray(p)[x], 8) then
begin
for z := 0 to 2 do
if P3ByteArray(p)[x][z] > 8 then
P3ByteArray(p)[x][z] := P3ByteArray(p)[x][z] - 8
end
else
for z := 0 to 2 do
P3ByteArray(p)[x][z] := 0;
if x > 0 then
if TestQuad(P3ByteArray(p)[x - 1], 4) then
begin
for z := 0 to 2 do
if P3ByteArray(p)[x - 1][z] > 4 then
P3ByteArray(p)[x - 1][z] := P3ByteArray(p)[x - 1][z] - 4
end
else
for z := 0 to 2 do
P3ByteArray(p)[x - 1][z] := 0;
if x < (DIB.Width - 1) then
if TestQuad(P3ByteArray(p)[x + 1], 4) then
begin
for z := 0 to 2 do
if P3ByteArray(p)[x + 1][z] > 4 then
P3ByteArray(p)[x + 1][z] := P3ByteArray(p)[x + 1][z] - 4
end
else
for z := 0 to 2 do
P3ByteArray(p)[x + 1][z] := 0;
end;
end;
32:
begin
if plongarray(p)[x] < 16 then
begin
if plongarray(p)[x] > 0 then Result := False;
if y > 0 then
begin
plongarray(p0) := DIB.ScanLine[y - 1];
if plongarray(p0)[x] > 4 then
plongarray(p0)[x] := plongarray(p0)[x] - 4
else
plongarray(p0)[x] := 0;
if x > 0 then
if plongarray(p0)[x - 1] > 2 then
plongarray(p0)[x - 1] := plongarray(p0)[x - 1] - 2
else
plongarray(p0)[x - 1] := 0;
if x < (DIB.Width - 1) then
if plongarray(p0)[x + 1] > 2 then
plongarray(p0)[x + 1] := plongarray(p0)[x + 1] - 2
else
plongarray(p0)[x + 1] := 0;
end;
if y < (DIB.Height - 1) then
begin
plongarray(p2) := DIB.ScanLine[y + 1];
if plongarray(p2)[x] > 4 then
plongarray(p2)[x] := plongarray(p2)[x] - 4
else
plongarray(p2)[x] := 0;
if x > 0 then
if plongarray(p2)[x - 1] > 2 then
plongarray(p2)[x - 1] := plongarray(p2)[x - 1] - 2
else
plongarray(p2)[x - 1] := 0;
if x < (DIB.Width - 1) then
if plongarray(p2)[x + 1] > 2 then
plongarray(p2)[x + 1] := plongarray(p2)[x + 1] - 2
else
plongarray(p2)[x + 1] := 0;
end;
if plongarray(p)[x] > 8 then
plongarray(p)[x] := plongarray(p)[x] - 8
else
plongarray(p)[x] := 0;
if x > 0 then
if plongarray(p)[x - 1] > 4 then
plongarray(p)[x - 1] := plongarray(p)[x - 1] - 4
else
plongarray(p)[x - 1] := 0;
if x < (DIB.Width - 1) then
if plongarray(p)[x + 1] > 4 then
plongarray(p)[x + 1] := plongarray(p)[x + 1] - 4
else
plongarray(p)[x + 1] := 0;
end;
end;
end {case};
end;
end;
end;
 
procedure TDIB.Distort(DIB1: TDIB; dt: TDistortType; cX, cY, Angle: Integer; Factor: Real);
type
T3Byte = array[0..2] of Byte;
P3ByteArray = ^T3ByteArray;
T3ByteArray = array[0..32767] of T3Byte;
PLongArray = ^TLongArray;
TLongArray = array[0..32767] of LongInt;
var
p, p2: PByteArray;
x, y, x2, y2, angled, ysqr: Integer;
actdist, dist, cosy, siny: real;
begin
dist := Factor * sqrt(sqr(cX) + sqr(cY));
for y := 0 to DIB1.Height - 1 do
begin
p := DIB1.ScanLine[y];
ysqr := sqr(y - cY);
for x := 0 to (DIB1.Width) - 1 do
begin
actdist := (sqrt((sqr(x - cX) + ysqr)) / dist);
if dt = dtSlow then
actdist := dsin((Trunc(actdist * 1024)) and $1FF);
angled := 384 + Trunc((actdist) * Angle);
 
cosy := (y - cY) * dcos(angled and $1FF);
siny := (y - cY) * dsin(angled and $1FF);
 
x2 := Trunc((x - cX) * dsin(angled and $1FF) + cosy) + cX;
y2 := Trunc((x - cX) * dcos(angled and $1FF) - siny) + cY;
case bitcount of
8:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
p2 := ScanLine[y2];
p[x] := p2[Width - x2];
end
else
begin
if p[x] > 2 then
p[x] := p[x] - 2
else
p[x] := 0;
end;
end;
16:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
pwordarray(p2) := ScanLine[y2];
pwordarray(p)[x] := pwordarray(p2)[Width - x2];
end
else
begin
if pwordarray(p)[x] > 2 then
pwordarray(p)[x] := pwordarray(p)[x] - 2
else
pwordarray(p)[x] := 0;
end;
end;
24:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
P3ByteArray(p2) := ScanLine[y2];
P3ByteArray(p)[x] := P3ByteArray(p2)[Width - x2];
end
else
begin
if P3ByteArray(p)[x][0] > 2 then
P3ByteArray(p)[x][0] := P3ByteArray(p)[x][0] - 2
else if P3ByteArray(p)[x][1] > 2 then
P3ByteArray(p)[x][1] := P3ByteArray(p)[x][1] - 2
else if P3ByteArray(p)[x][2] > 2 then
P3ByteArray(p)[x][2] := P3ByteArray(p)[x][2] - 2
else
begin
P3ByteArray(p)[x][0] := 0;
P3ByteArray(p)[x][1] := 0;
P3ByteArray(p)[x][2] := 0;
end;
end;
end;
32:
begin
if (y2 >= 0) and (y2 < Height) and (x2 >= 0) and (x2 < Width) then
begin
plongarray(p2) := ScanLine[y2];
plongarray(p)[x] := plongarray(p2)[Width - x2];
end
else
begin
if p[x] > 2 then
plongarray(p)[x] := plongarray(p)[x] - 2
else
plongarray(p)[x] := 0;
end;
end;
end {case}
end;
end;
end;
 
procedure TDIB.AntialiasedLine(x1, y1, x2, y2: Integer; color: TColor);
//anti-aliased line using the Wu algorithm by Peter Bone
var
dX, dY, X, Y, start, finish: Integer;
LM, LR: Integer;
dxi, dyi, dydxi: Integer;
P: PLines;
R, G, B: byte;
begin
R := GetRValue(Color);
G := GetGValue(Color);
B := GetBValue(Color);
dX := abs(x2 - x1); // Calculate deltax and deltay for initialisation
dY := abs(y2 - y1);
if (dX = 0) or (dY = 0) then
begin
Canvas.Pen.Color := (B shl 16) + (G shl 8) + R;
Canvas.MoveTo(x1, y1);
Canvas.LineTo(x2, y2);
exit;
end;
if dX > dY then
begin // horizontal or vertical
if y2 > y1 then // determine rise and run
dydxi := -dY shl 16 div dX
else
dydxi := dY shl 16 div dX;
if x2 < x1 then
begin
start := x2; // right to left
finish := x1;
dyi := y2 shl 16;
end
else
begin
start := x1; // left to right
finish := x2;
dyi := y1 shl 16;
dydxi := -dydxi; // inverse slope
end;
if finish >= Width then finish := Width - 1;
for X := start to finish do
begin
Y := dyi shr 16;
if (X < 0) or (Y < 0) or (Y > Height - 2) then
begin
Inc(dyi, dydxi);
Continue;
end;
LM := dyi - Y shl 16; // fractional part of dyi - in fixed-point
LR := 65536 - LM;
P := Scanline[Y];
P^[X].B := (B * LR + P^[X].B * LM) shr 16;
P^[X].G := (G * LR + P^[X].G * LM) shr 16;
P^[X].R := (R * LR + P^[X].R * LM) shr 16;
//Inc(Y);
P^[X].B := (B * LM + P^[X].B * LR) shr 16;
P^[X].G := (G * LM + P^[X].G * LR) shr 16;
P^[X].R := (R * LM + P^[X].R * LR) shr 16;
Inc(dyi, dydxi); // next point
end;
end
else
begin
if x2 > x1 then // determine rise and run
dydxi := -dX shl 16 div dY
else
dydxi := dX shl 16 div dY;
if y2 < y1 then
begin
start := y2; // right to left
finish := y1;
dxi := x2 shl 16;
end
else
begin
start := y1; // left to right
finish := y2;
dxi := x1 shl 16;
dydxi := -dydxi; // inverse slope
end;
if finish >= Height then finish := Height - 1;
for Y := start to finish do
begin
X := dxi shr 16;
if (Y < 0) or (X < 0) or (X > Width - 2) then
begin
Inc(dxi, dydxi);
Continue;
end;
LM := dxi - X shl 16;
LR := 65536 - LM;
P := Scanline[Y];
P^[X].B := (B * LR + P^[X].B * LM) shr 16;
P^[X].G := (G * LR + P^[X].G * LM) shr 16;
P^[X].R := (R * LR + P^[X].R * LM) shr 16;
Inc(X);
P^[X].B := (B * LM + P^[X].B * LR) shr 16;
P^[X].G := (G * LM + P^[X].G * LR) shr 16;
P^[X].R := (R * LM + P^[X].R * LR) shr 16;
Inc(dxi, dydxi); // next point
end;
end;
end;
(*
function TDIB.GetColorBetween(StartColor, EndColor: TColor; Pointvalue,
FromPoint, ToPoint: Extended): TColor;
var F: Extended; r1, r2, r3, g1, g2, g3, b1, b2, b3: Byte;
function CalcColorBytes(fb1, fb2: Byte): Byte;
begin
result := fb1;
if fb1 < fb2 then Result := FB1 + Trunc(F * (fb2 - fb1));
if fb1 > fb2 then Result := FB1 - Trunc(F * (fb1 - fb2));
end;
begin
if Pointvalue <= FromPoint then
begin
result := StartColor;
exit;
end;
if Pointvalue >= ToPoint then
begin
result := EndColor;
exit;
end;
F := (Pointvalue - FromPoint) / (ToPoint - FromPoint);
asm
mov EAX, Startcolor
cmp EAX, EndColor
je @@exit //when equal then exit
mov r1, AL
shr EAX,8
mov g1, AL
shr EAX,8
mov b1, AL
mov EAX, Endcolor
mov r2, AL
shr EAX,8
mov g2, AL
shr EAX,8
mov b2, AL
push ebp
mov AL, r1
mov DL, r2
call CalcColorBytes
pop ECX
push EBP
Mov r3, AL
mov DL, g2
mov AL, g1
call CalcColorBytes
pop ECX
push EBP
mov g3, Al
mov DL, B2
mov Al, B1
call CalcColorBytes
pop ECX
mov b3, AL
XOR EAX,EAX
mov AL, B3
shl EAX,8
mov AL, G3
shl EAX,8
mov AL, R3
@@Exit:
mov @result, EAX
end;
end;
*)
function TDIB.GetColorBetween(StartColor, EndColor: TColor; Pointvalue, FromPoint, ToPoint: Extended): TColor;
var
F: Extended;
r1, g1, b1, r2, g2, b2, r3, g3, b3: Byte;
 
function CalcColorBytes(const factor: Extended; const fb1, fb2: Byte): Byte; {$IFDEF VER9UP}inline;{$ENDIF}
begin
Result := fb1;
if fb1 < fb2 then Result := fb1 + Trunc(factor * (fb2 - fb1));
if fb1 > fb2 then Result := fb1 - Trunc(factor * (fb1 - fb2));
end;
 
procedure GetRGB(const AColor: TColor; var R, G, B: Byte); {$IFDEF VER9UP}inline;{$ENDIF}
begin
R := AColor and $FF;
G := (AColor shr 8) and $FF;
B := (AColor shr 16) and $FF;
end;
 
begin
if Pointvalue <= FromPoint then
begin
Result := StartColor;
Exit;
end;
if Pointvalue >= ToPoint then
begin
Result := EndColor;
Exit;
end;
 
F := (Pointvalue - FromPoint) / (ToPoint - FromPoint);
 
GetRGB(StartColor, r1, g1, b1);
// r1 := StartColor and $FF;
// g1 := (StartColor shr 8) and $FF;
// b1 := (StartColor shr 16) and $FF;
GetRGB(StartColor, r2, g2, b2);
// r2 := EndColor and $FF;
// g2 := (EndColor shr 8) and $FF;
// b2 := (EndColor shr 16) and $FF;
 
r3 := CalcColorBytes(F, r1, r2);
g3 := CalcColorBytes(F, g1, g2);
b3 := CalcColorBytes(F, b1, b2);
 
Result := (b3 shl 16) or (g3 shl 8) or r3;
end;
 
procedure TDIB.ColoredLine(const iStart, iEnd: TPoint; iColorStyle: TColorLineStyle;
iGradientFrom, iGradientTo: TColor; iPixelGeometry: TColorLinePixelGeometry; iRadius: Word);
var
tempColor: TColor;
const
WavelengthMinimum = 380;
WavelengthMaximum = 780;
 
procedure SetColor(Color: TColor);
begin
Canvas.Pen.Color := Color;
Canvas.Brush.Color := Color;
tempColor := Color
end {SetColor};
 
function WL2RGB(const Wavelength: Double): TColor; {$IFDEF VER9UP}inline;{$ENDIF}
const
Gamma = 0.80;
IntensityMax = 255;
var
Red, Blue, Green, Factor: Double;
 
function Adjust(const Color, Factor: Double): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if Color = 0.0 then Result := 0
else Result := Round(IntensityMax * Power(Color * Factor, Gamma))
end {Adjust};
begin
case Trunc(Wavelength) of
380..439:
begin
Red := -(Wavelength - 440) / (440 - 380);
Green := 0.0;
Blue := 1.0
end;
440..489:
begin
Red := 0.0;
Green := (Wavelength - 440) / (490 - 440);
Blue := 1.0
end;
490..509:
begin
Red := 0.0;
Green := 1.0;
Blue := -(Wavelength - 510) / (510 - 490)
end;
510..579:
begin
Red := (Wavelength - 510) / (580 - 510);
Green := 1.0;
Blue := 0.0
end;
580..644:
begin
Red := 1.0;
Green := -(Wavelength - 645) / (645 - 580);
Blue := 0.0
end;
645..780:
begin
Red := 1.0;
Green := 0.0;
Blue := 0.0
end;
else
Red := 0.0;
Green := 0.0;
Blue := 0.0
end;
case Trunc(Wavelength) of
380..419: factor := 0.3 + 0.7 * (Wavelength - 380) / (420 - 380);
420..700: factor := 1.0;
701..780: factor := 0.3 + 0.7 * (780 - Wavelength) / (780 - 700)
else
factor := 0.0
end;
Result := RGB(Adjust(Red, Factor), Adjust(Green, Factor), Adjust(Blue, Factor));
end;
 
function Rainbow(const fraction: Double): TColor; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if (fraction < 0.0) or (fraction > 1.0) then Result := clBlack
else
Result := WL2RGB(WavelengthMinimum + Fraction * (WavelengthMaximum - WavelengthMinimum))
end {Raindbow};
 
function ColorInterpolate(const fraction: Double; const Color1, Color2: TColor): TColor; {$IFDEF VER9UP}inline;{$ENDIF}
var
complement: Double;
R1, R2, G1, G2, B1, B2: BYTE;
begin
if fraction <= 0 then Result := Color1
else
if fraction >= 1.0 then Result := Color2
else
begin
R1 := GetRValue(Color1);
G1 := GetGValue(Color1);
B1 := GetBValue(Color1);
R2 := GetRValue(Color2);
G2 := GetGValue(Color2);
B2 := GetBValue(Color2);
complement := 1.0 - fraction;
Result := RGB(Round(complement * R1 + fraction * R2),
Round(complement * G1 + fraction * G2),
Round(complement * B1 + fraction * B2))
end
end {ColorInterpolate};
 
// Conversion utility routines
function ColorToRGBTriple(const Color: TColor): TRGBTriple; {$IFDEF VER9UP}inline;{$ENDIF}
begin
with Result do
begin
rgbtRed := GetRValue(Color);
rgbtGreen := GetGValue(Color);
rgbtBlue := GetBValue(Color)
end
end {ColorToRGBTriple};
 
function RGBTripleToColor(const Triple: TRGBTriple): TColor; {$IFDEF VER9UP}inline;{$ENDIF}
begin
Result := RGB(Triple.rgbtRed, Triple.rgbtGreen, Triple.rgbtBlue)
end {RGBTripleToColor};
// Bresenham's Line Algorithm. Byte, March 1988, pp. 249-253.
var
a, b, d, diag_inc, dXdg, dXndg, dYdg, dYndg, i, nDginc, nDswap, x, y: Integer;
begin {DrawLine}
x := iStart.X;
y := iStart.Y;
a := iEnd.X - iStart.X;
b := iEnd.Y - iStart.Y;
if a < 0 then
begin
a := -a;
dXdg := -1
end
else dXdg := 1;
if b < 0 then
begin
b := -b;
dYdg := -1
end
else dYdg := 1;
if a < b then
begin
nDswap := a;
a := b;
b := nDswap;
dXndg := 0;
dYndg := dYdg
end
else
begin
dXndg := dXdg;
dYndg := 0
end;
d := b + b - a;
nDginc := b + b;
diag_inc := b + b - a - a;
for i := 0 to a do
begin
case iPixelGeometry of
pgPoint:
case iColorStyle of
csSolid:
Canvas.Pixels[x, y] := tempColor;
csGradient:
Canvas.Pixels[x, y] := ColorInterpolate(i / a, iGradientFrom, iGradientTo);
csRainbow:
Canvas.Pixels[x, y] := Rainbow(i / a)
end;
pgCircular:
begin
case iColorStyle of
csSolid: ;
csGradient: SetColor(ColorInterpolate(i / a, iGradientFrom, iGradientTo));
csRainbow: SetColor(Rainbow(i / a))
end;
Canvas.Ellipse(x - iRadius, y - iRadius, x + iRadius, y + iRadius)
end;
pgRectangular:
begin
case iColorStyle of
csSolid: ;
csGradient: SetColor(ColorInterpolate(i / a, iGradientFrom, iGradientTo));
csRainbow: SetColor(Rainbow(i / a))
end;
Canvas.Rectangle(x - iRadius, y - iRadius, x + iRadius, y + iRadius)
end
end;
if d < 0 then
begin
Inc(x, dXndg);
Inc(y, dYndg);
Inc(d, nDginc);
end
else
begin
Inc(x, dXdg);
Inc(y, dYdg);
Inc(d, diag_inc);
end
end
end {Line};
 
procedure TDIB.DoNovaEffect(const sr, sg, sb, cx, cy, radius,
nspokes, randomhue, randomspok, randgauss: Integer; onProgress: TProgressEvent);
// Copyright (c) 2000 by Keith Murray (kmurray@hotfreeware.com)
// All rights reserved.
// Adapted for DIB by JB.
type
PByteArray = ^TByteArray;
TByteArray = array[0..32767] of Byte;
PDoubleArray = ^TDoubleArray;
TDoubleArray = array[0..0] of Double;
PIntegerArray = ^TIntegerArray;
TIntegerArray = array[0..0] of Integer;
type
TProgressEvent = procedure(progress: Integer; message: string;
var cancel: Boolean) of object;
const
M_PI = 3.14159265358979323846;
RAND_MAX = 2147483647;
 
function Gauss(const randgauss: Integer): double; {$IFDEF VER9UP}inline;{$ENDIF}
const magnitude = 6;
var
sum: double;
i: Integer;
begin
sum := 0;
for i := 1 to magnitude do
sum := sum + (randgauss / 2147483647);
result := sum / magnitude;
end;
 
function Clamp(const i, l, h: double): double; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if i < l then
result := l
else
if i > h then
result := h
else
result := i;
end;
 
function IClamp(const i, l, h: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
begin
if i < l then
result := l
else if i > h then
result := h
else result := i;
end;
{$IFNDEF VER9UP}
procedure rgb_to_hsl(const r, g, b: Double; var h, s, l: Double); {$IFDEF VER9UP}inline;{$ENDIF}
{$IFNDEF VER4UP}
function Max(a, b: Double): Double;
begin
Result := a; if b > a then Result := b;
end;
function Min(a, b: Double): Double;
begin
Result := a; if b < a then Result := b;
end;
{$ENDIF}
var
v, m, vm: Double;
r2, g2, b2: Double;
begin
h := 0;
s := 0;
l := 0;
v := Max(r, g);
v := Max(v, b);
m := Min(r, g);
m := Min(m, b);
l := (m + v) / 2.0;
if l <= 0.0 then
exit;
vm := v - m;
s := vm;
if s > 0.0 then
begin
if l <= 0.5 then
s := s / (v + m)
else s := s / (2.0 - v - m);
end
else exit;
r2 := (v - 4) / vm;
g2 := (v - g) / vm;
b2 := (v - b) / vm;
if r = v then
begin
if g = m then
h := b2 + 5.0
else h := 1.0 - g2;
end
else if g = v then
begin
if b = m then
h := 1.0 + r2
else h := 3.0 - b2;
end
else
begin
if r = m then
h := 3.0 + g2
else h := 5.0 - r2;
end;
h := h / 6;
end;
 
procedure hsl_to_rgb(h, sl, l: Double; var r, g, b: Double); {$IFDEF VER9UP}inline;{$ENDIF}
var
v: Double;
m, sv: Double;
sextant: Integer;
fract, vsf, mid1, mid2: Double;
begin
if l <= 0.5 then
v := l * (1.0 + sl)
else v := l + sl - l * sl;
if v <= 0 then
begin
r := 0.0;
g := 0.0;
b := 0.0;
end
else
begin
m := l + l - v;
sv := (v - m) / v;
h := h * 6.0;
sextant := Trunc(h);
fract := h - sextant;
vsf := v * sv * fract;
mid1 := m + vsf;
mid2 := v - vsf;
case sextant of
0:
begin
r := v; g := mid1; b := m;
end;
1:
begin
r := mid2; g := v; b := m;
end;
2:
begin
r := m; g := v; b := mid1;
end;
3:
begin
r := m; g := mid2; b := v;
end;
4:
begin
r := mid1; g := m; b := v;
end;
5:
begin
r := v; g := m; b := mid2;
end;
end;
end;
end;
{$ELSE}
procedure rgb_to_hsl(const r, g, b: Double; var h, s, l: Double); {$IFDEF VER9UP}inline;{$ENDIF}
var
h0, s0, l0: Word;
begin //procedure ColorRGBToHLS(clrRGB: TColorRef; var Hue, Luminance, Saturation: Word);
GraphUtil.ColorRGBToHLS(RGB(Trunc(r),Trunc(g),Trunc(b)), h0, s0, l0);
h := h0;
s := s0;
l := l0;
end;
 
procedure hsl_to_rgb(h, sl, l: Double; var r, g, b: Double); {$IFDEF VER9UP}inline;{$ENDIF}
var X: TColorRef;
begin //function ColorHLSToRGB(Hue, Luminance, Saturation: Word): TColorRef;
X := GraphUtil.ColorHLSToRGB(Trunc(h), Trunc(l), Trunc(sl));
r := GetRValue(X);
g := GetGValue(X);
b := GetBValue(X);
end;
{$ENDIF}
 
var
src_row, dest_row: PByte;
src, dest: PByteArray;
color, colors: array[0..3] of Integer;
SpokeColor: PIntegerArray;
spoke: PDoubleArray;
x2, row, col, x, y, alpha, has_alpha, bpp, xc, yc, i, j: Integer;
u, v, l, l0, w, w1, c, nova_alpha, new_alpha, compl_ratio, ratio, r, g, b, h, s, lu, SpokeCol: Double;
dstDIB: TDIB;
begin
colors[0] := sr;
colors[1] := sg;
colors[2] := sb;
new_alpha := 0;
 
GetMem(spoke, NSpokes * sizeof(Double));
GetMem(spokecolor, NSpokes * sizeof(Integer) * 3);
dstDIB := TDIB.Create;
try
dstDIB.Assign(Self);
dstDIB.Canvas.Brush.Color := clBlack;
dstDIB.Canvas.FillRect(dstDIB.Canvas.ClipRect);
// R G B
rgb_to_hsl(colors[0] / 255.0, colors[1] / 255.0, colors[2] / 255.0, h, s, lu);
 
for i := 0 to NSpokes - 1 do
begin
spoke[i] := gauss(randgauss);
h := h + randomhue / 360.0 * ({Random(RAND_MAX)}RandomSpok / RAND_MAX - 0.5);
if h < 0 then
h := h + 1.0
else if h > 1.0 then
h := h - 1.0;
hsl_to_rgb(h, s, lu, r, g, b);
spokecolor[3 * i + 0] := Trunc(255 * r);
spokecolor[3 * i + 1] := Trunc(255 * g);
spokecolor[3 * i + 2] := Trunc(255 * b);
end;
 
xc := cx;
yc := cy;
l0 := (x2 - xc) / 4 + 1;
bpp := Self.BitCount div 8;
has_alpha := 0;
alpha := bpp;
y := 0;
for row := 0 to Self.Height - 1 do
begin
src_row := Self.ScanLine[row];
dest_row := dstDIB.ScanLine[row];
src := Pointer(src_row);
dest := Pointer(dest_row);
x := 0;
for col := 0 to Self.Width - 1 do
begin
u := (x - xc) / radius;
v := (y - yc) / radius;
l := sqrt(sqr(u) + sqr(v));
c := (arctan2(u, v) / (2 * M_PI) + 0.51) * NSpokes;
i := floor(c);
c := c - i;
i := i mod NSpokes;
w1 := spoke[i] * (1 - c) + spoke[(i + 1) mod NSpokes] * c;
w1 := w1 * w1;
w := 1 / (l + 0.001) * 0.9;
nova_alpha := Clamp(w, 0.0, 1.0);
ratio := nova_alpha;
compl_ratio := 1.0 - ratio;
for j := 0 to alpha - 1 do
begin
spokecol := spokecolor[3 * i + j] * (1.0 - c) + spokecolor[3 * ((i + 1) mod nspokes) + j] * c;
if w > 1.0 then
color[j] := IClamp(Trunc(spokecol * w), 0, 255)
else
color[j] := Trunc(src[j] * compl_ratio + spokecol * ratio);
color[j] := Trunc(color[j] + 255 * Clamp(w1 * w, 0.0, 1.0));
dest[j] := IClamp(color[j], 0, 255);
end;
{$IFDEF WIN64}
Inc(PByte(src), bpp);
Inc(PBYTE(dest), bpp);
{$ELSE}
Inc(Integer(src), bpp);
Inc(Integer(dest), bpp);
{$ENDIF}
Inc(x);
end;
Inc(y);
end;
Self.Assign(dstDIB);
finally
dstDIB.Free;
FreeMem(Spoke);
FreeMem(SpokeColor);
end;
end;
 
procedure TDIB.DrawMandelbrot(ao, au: Integer; bo, bu: Double);
var
c1, c2, z1, z2, tmp: Double;
i, j, Count: Integer;
dstDIB: TDIB;
X, Y: Double;
X2, Y2: Integer;
begin
dstDIB := TDIB.Create;
dstDIB.Assign(Self);
X2 := dstDIB.FWidth;
Y2 := dstDIB.FHeight;
{as Example
ao := 1;
au := -2;
bo := 1.5;
bu := -1.5;
}
X := (ao - au) / dstDIB.FWidth;
Y := (bo - bu) / dstDIB.FHeight;
try
c2 := bu;
for i := 10 to X2 do
begin
c1 := au;
for j := 0 to Y2 do
begin
z1 := 0;
z2 := 0;
Count := 0;
{count is deep of iteration of the mandelbrot set
if |z| >=2 then z is not a member of a mandelset}
while (((z1 * z1 + z2 * z2 < 4) and (Count <= 90))) do
begin
tmp := z1;
z1 := z1 * z1 - z2 * z2 + c1;
z2 := 2 * tmp * z2 + c2;
Inc(Count);
end;
//the color-palette depends on TColor(n*count mod t)
dstDIB.Canvas.Pixels[j, i] := (16 * Count mod 255);
c1 := c1 + X;
end;
c2 := c2 + Y;
end;
finally
Self.Assign(dstDIB);
dstDIB.Free;
end;
end;
 
procedure TDIB.SephiaEffect(Depth: Integer{$IFDEF VER4UP} = 20{$ENDIF});
{Note: when depth parameter set to 0 will produce black and white picture only}
var
color, color2: LongInt;
r, g, b, rr, gg: byte;
h, w: Integer;
p0: PByteArray;
x, y: Integer;
begin
if Self.BitCount = 24 then
begin
Self.DoGrayScale;
for y := 0 to Self.Height - 1 do
begin
p0 := Self.ScanLine[y];
for x := 0 to Self.Width - 1 do
begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
rr := r + (depth * 2);
gg := g + depth;
if rr <= ((depth * 2) - 1) then
rr := 255;
if gg <= (depth - 1) then
gg := 255;
p0[x * 3] := rr;
p0[x * 3 + 1] := gg;
p0[x * 3 + 2] := b;
end;
end;
Exit
end;
{this alogorithm is slower because does not use scanline property}
for h := 0 to Self.Height-1 do
begin
for w := 0 to Self.Width-1 do
begin
//first convert the bitmap to greyscale
color := ColorToRGB(Self.Canvas.Pixels[w, h]);
r := GetRValue(color);
g := GetGValue(color);
b := GetBValue(color);
color2 := (r + g + b) div 3;
Self.Canvas.Pixels[w, h] := RGB(color2, color2, color2);
//then convert it to sepia
color := ColorToRGB(Self.Canvas.Pixels[w, h]);
r := GetRValue(color);
g := GetGValue(color);
b := GetBValue(color);
rr := r + (depth * 2);
gg := g + depth;
if rr <= ((depth * 2) - 1) then
rr := 255;
if gg <= (depth - 1) then
gg := 255;
Self.Canvas.Pixels[w, h] := RGB(rr, gg, b);
end;
end;
 
end;
 
procedure TDIB.EncryptDecrypt(const Key: Integer);
{for decript call it again}
var
BytesPorScan: Integer;
w, h: Integer;
p: pByteArray;
begin
try
BytesPorScan := Abs(Integer(Self.ScanLine[1]) -
Integer(Self.ScanLine[0]));
except
raise Exception.Create('Error ');
end;
RandSeed := Key;
for h := 0 to Self.Height - 1 do
begin
P := Self.ScanLine[h];
for w := 0 to BytesPorScan - 1 do
P^[w] := P^[w] xor Random(256);
end;
end;
 
procedure TDIB.LinePolar(x, y: Integer; AngleInDegree, Length: extended; Color: cardinal);
var
xp, yp: Integer;
begin
xp := Round(Sin(AngleInDegree * Pi / 180) * Length) + x;
yp := Round(Cos(AngleInDegree * Pi / 180) * Length) + y;
AntialiasedLine(x, y, xp, yp, Color);
end;
 
//y = 0.299*g + 0.587*b + 0.114*r;
 
procedure TDIB.BlendPixel(const X, Y: Integer; aColor: Cardinal; Alpha: byte);
var
cR, cG, cB: byte;
aR, aG, aB: byte;
dColor: Cardinal;
begin
aR := GetRValue(aColor);
aG := GetGValue(aColor);
aB := GetBValue(aColor);
dColor := Self.Canvas.Pixels[x, y];
cR := GetRValue(dColor);
cG := GetGValue(dColor);
cB := GetBValue(dColor);
Canvas.Pixels[x, y] := RGB((Alpha * (aR - cR) shr 8) + cR, // R alpha
(Alpha * (aG - cG) shr 8) + cG, // G alpha
(Alpha * (aB - cB) shr 8) + cB); // B alpha
end;
 
 
procedure MakeDib(out DIB: TDIB; const iWidth, iHeight, iBitCount: Integer; iFillColor: TColor{$IFDEF VER4UP} = clBlack{$ENDIF}); {$IFDEF VER4UP} overload; {$ENDIF}
begin
DIB := TDIB.Create;
DIB.SetSize(iWidth, iHeight, iBitCount);
DIB.Fill(iFillColor);
end;
 
procedure{$IFDEF VER4UP}MakeDib{$ELSE}MakeDib2{$ENDIF}(out DIB: TDIB; iBitmap: TBitmap); {$IFDEF VER4UP} overload; {$ENDIF}
begin
DIB := TDIB.Create;
if Assigned(iBitmap) then
DIB.CreateDIBFromBitmap(iBitmap)
else
DIB.Fill(clBlack);
end;
 
initialization
TPicture.RegisterClipBoardFormat(CF_DIB, TDIB);
TPicture.RegisterFileFormat('dib', 'Device Independent Bitmap', TDIB);
10186,4 → 3236,4
 
FEmptyDIBImage.Free;
FPaletteManager.Free;
end.
end.
/VCL_DELPHIX_D6/DXInptEdit.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DXClass.pas
5,15 → 5,7
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, MMSystem, Graphics, {$IFDEF _DMO_}MultiMon,{$ENDIF}
{$IfDef StandardDX}
{$IfDef DX9}
Direct3D, DirectInput,
{$EndIf}
DirectDraw, DirectSound;
{$Else}
DirectX;
{$EndIf}
Windows, Messages, SysUtils, Classes, Controls, Forms, MMSystem, DirectX;
 
type
 
58,46 → 50,6
property Drivers[Index: Integer]: TDirectXDriver read GetDriver; default;
end;
 
{$IFDEF _DMO_}
{ TDirectXDriverEx }
 
TDirectXDriverEx = class(TCollectionItem)
private
FGUID: PGUID;
FGUID2: TGUID;
FDescription: string;
FDriverName: string;
FMonitor: HMonitor;
FMonitorInfo: TMonitorInfo;
procedure SetGUID(Value: PGUID);
function ConvertHMonitor(iMonitor: HMonitor): TMonitorInfo;
function GetMonitorInfo: TMonitorInfo;
function GetFlags: DWORD;
function GetTempSpace: TRect;
function GetWorkSpace: TRect;
public
property GUID: PGUID read FGUID write SetGUID;
property Monitor: HMonitor read FMonitor write FMonitor;
property MonitorInfo: TMonitorInfo read GetMonitorInfo;
published
property Description: string read FDescription write FDescription;
property DriverName: string read FDriverName write FDriverName;
property WorkSpace: TRect read GetWorkSpace;
property TempSpace: TRect read GetTempSpace;
property Flags: DWORD read GetFlags;
end;
 
{ TDirectXDriversEx }
 
TDirectXDriversEx = class(TCollection)
private
function GetDriver(Index: Integer): TDirectXDriverEx;
public
constructor Create;
property Drivers[Index: Integer]: TDirectXDriverEx read GetDriver; default;
end;
{$ENDIF}
{ TDXForm }
 
TDXForm = class(TForm)
218,137 → 170,20
function IndexOf(const Name: string): Integer;
end;
 
{Addapted from RXLib.PicClip}
function Max(Val1, Val2: Integer): Integer;
function Min(Val1, Val2: Integer): Integer;
 
{ TPicClip }
TCellRange = 1..MaxInt;
 
TDXPictureClip = class(TComponent)
private
FPicture: TPicture;
FRows: TCellRange;
FCols: TCellRange;
FBitmap: TBitmap;
FMasked: Boolean;
FMaskColor: TColor;
FOnChange: TNotifyEvent;
procedure CheckIndex(Index: Integer);
function GetCell(Col, Row: Cardinal): TBitmap;
function GetGraphicCell(Index: Integer): TBitmap;
function GetDefaultMaskColor: TColor;
function GetIsEmpty: Boolean;
function GetCount: Integer;
function GetHeight: Integer;
function GetWidth: Integer;
function IsMaskStored: Boolean;
procedure PictureChanged(Sender: TObject);
procedure SetHeight(Value: Integer);
procedure SetPicture(Value: TPicture);
procedure SetWidth(Value: Integer);
procedure SetMaskColor(Value: TColor);
protected
procedure AssignTo(Dest: TPersistent); override;
procedure Changed; dynamic;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
function GetIndex(Col, Row: Cardinal): Integer;
procedure Draw(Canvas: TCanvas; X, Y, Index: Integer);
procedure DrawCenter(Canvas: TCanvas; Rect: TRect; Index: Integer);
property Cells[Col, Row: Cardinal]: TBitmap read GetCell;
property GraphicCell[Index: Integer]: TBitmap read GetGraphicCell;
property IsEmpty: Boolean read GetIsEmpty;
property Count: Integer read GetCount;
published
property Cols: TCellRange read FCols write FCols default 1;
property Height: Integer read GetHeight write SetHeight stored False;
property Masked: Boolean read FMasked write FMasked default True;
property Rows: TCellRange read FRows write FRows default 1;
property Picture: TPicture read FPicture write SetPicture;
property MaskColor: TColor read FMaskColor write SetMaskColor stored IsMaskStored;
property Width: Integer read GetWidth write SetWidth stored False;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
end;
 
function Max(Val1, Val2: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function Min(Val1, Val2: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
 
function Cos256(i: Integer): Double;
function Sin256(i: Integer): Double;
 
function PointInRect(const Point: TPoint; const Rect: TRect): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function RectInRect(const Rect1, Rect2: TRect): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function OverlapRect(const Rect1, Rect2: TRect): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function PointInRect(const Point: TPoint; const Rect: TRect): Boolean;
function RectInRect(const Rect1, Rect2: TRect): Boolean;
function OverlapRect(const Rect1, Rect2: TRect): Boolean;
 
function WideRect(ALeft, ATop, AWidth, AHeight: Integer): TRect; {$IFDEF VER9UP}inline;{$ENDIF}
 
{ Transformations routines}
 
const
L_Curve = 0;//The left curve
R_Curve = 1;//The right curve
 
C_Add = 0;//Increase (BTC)
C_Dec = 1;//Decrease (ETC)
 
Type
TDblPoint = packed record
X, Y: Double;
end;
TSngPoint = packed record //SinglePoint
X, Y: Single;
end;
 
 
//Transformation matrix
T2DRowCol = Array[1..3] of Array[1..3] of Double;
T2DVector = Array[1..3] of Double;
//Distance between 2 points
function Get2PointRange(a,b: TDblPoint):Double;
//From vector angular calculation
function Get256(dX,dY: Double):Double;
//The angular calculation of the A from B
function GetARadFromB(A,B: TDblPoint):Double;
 
//It calculates the TDblPoint
function DblPoint(a,b:Double):TDblPoint;
//It converts the TDboPoint to the TPoint
function TruncDblPoint(DblPos: TDblPoint): TPoint;
 
function GetPointFromRangeAndAngle(SP: TDblPoint; Range,Angle: Double): TDblPoint;
 
function Ini2DRowCol: T2DRowCol;
function Trans2DRowCol(x,y:double):T2DRowCol;
function Scale2DRowCol(x,y:double):T2DRowCol;
function Rotate2DRowCol(Theta:double):T2DRowCol;
function RotateIntoX2DRowCol(x,y: double):T2DRowCol;
function Multiply2DRowCol(A,B:T2DRowCol):T2DRowCol;
function ScaleAt2DRowCol(x,y,Sx,Sy:double):T2DRowCol;
function ReflectAcross2DRowCol(x,y,dx,dy:Double): T2DRowCol;
function Apply2DVector(V:T2DVector; M:T2DRowCol): T2DVector;
function RotateAround2DRowCol(x,y,Theta:Double): T2DRowCol;
 
//Collision decision
function PointInCircle(PPos,CPos: TPoint; R: integer): Boolean;
function CircleInCircle(C1Pos,C2Pos: TPoint; R1,R2:Integer): Boolean;
function SegmentInCircle(SPos,EPos,CPos: TPoint; R: Integer): Boolean;
 
//If A is closer than B from starting point S, the True is returned.
function CheckNearAThanB(S,A,B: TDblPoint): Boolean;
 
//The Angle of 256 period is returned
function Angle256(Angle: Single): Single;
 
{ Support functions }
 
function WideRect(ALeft, ATop, AWidth, AHeight: Integer): TRect;
procedure ReleaseCom(out Com);
function DXLoadLibrary(const FileName, FuncName: string): TFarProc;
 
{ Simple helper }
 
procedure Log(const Co: string; const FName: string{$IFDEF VER4UP} = 'c:\logerr.txt'{$ENDIF});
 
implementation
 
uses DXConsts;
855,763 → 690,8
Result := -1;
end;
 
{ TDXPictureClip }
 
constructor TDXPictureClip.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FPicture := TPicture.Create;
FPicture.OnChange := PictureChanged;
FBitmap := TBitmap.Create;
FRows := 1;
FCols := 1;
FMaskColor := GetDefaultMaskColor;
FMasked := True;
end;
 
destructor TDXPictureClip.Destroy;
begin
FOnChange := nil;
FPicture.OnChange := nil;
FBitmap.Free;
FPicture.Free;
inherited Destroy;
end;
 
procedure TDXPictureClip.Assign(Source: TPersistent);
begin
if Source is TDXPictureClip then begin
with TDXPictureClip(Source) do begin
Self.FRows := Rows;
Self.FCols := Cols;
Self.FMasked := Masked;
Self.FMaskColor := MaskColor;
Self.FPicture.Assign(FPicture);
end;
end
else if (Source is TPicture) or (Source is TGraphic) then
FPicture.Assign(Source)
else inherited Assign(Source);
end;
 
type
THack = class(TImageList);
 
procedure TDXPictureClip.AssignTo(Dest: TPersistent);
var
I: Integer;
SaveChange: TNotifyEvent;
begin
if (Dest is TPicture) then Dest.Assign(FPicture)
else if (Dest is TImageList) and not IsEmpty then begin
with TImageList(Dest) do begin
SaveChange := OnChange;
try
OnChange := nil;
Clear;
Width := Self.Width;
Height := Self.Height;
for I := 0 to Self.Count - 1 do begin
if Self.Masked and (MaskColor <> clNone) then
TImageList(Dest).AddMasked(GraphicCell[I], MaskColor)
else TImageList(Dest).Add(GraphicCell[I], nil);
end;
Masked := Self.Masked;
finally
OnChange := SaveChange;
end;
THack(Dest).Change;
end;
end
else inherited AssignTo(Dest);
end;
 
procedure TDXPictureClip.Changed;
begin
if Assigned(FOnChange) then FOnChange(Self);
end;
 
function TDXPictureClip.GetIsEmpty: Boolean;
begin
Result := not Assigned(Picture) or Picture.Graphic.Empty;
end;
 
function TDXPictureClip.GetCount: Integer;
begin
if IsEmpty then Result := 0
else Result := Cols * Rows;
end;
const
{ TBitmap.GetTransparentColor from GRAPHICS.PAS uses this value }
PaletteMask = $02000000;
 
procedure TDXPictureClip.Draw(Canvas: TCanvas; X, Y, Index: Integer);
 
function PaletteColor(Color: TColor): Longint;
begin
Result := ColorToRGB(Color) or PaletteMask;
end;
procedure StretchBltTransparent(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; Palette: HPalette;
TransparentColor: TColorRef);
var
Color: TColorRef;
bmAndBack, bmAndObject, bmAndMem, bmSave: HBitmap;
bmBackOld, bmObjectOld, bmMemOld, bmSaveOld: HBitmap;
MemDC, BackDC, ObjectDC, SaveDC: HDC;
palDst, palMem, palSave, palObj: HPalette;
begin
{ Create some DCs to hold temporary data }
BackDC := CreateCompatibleDC(DstDC);
ObjectDC := CreateCompatibleDC(DstDC);
MemDC := CreateCompatibleDC(DstDC);
SaveDC := CreateCompatibleDC(DstDC);
{ Create a bitmap for each DC }
bmAndObject := CreateBitmap(SrcW, SrcH, 1, 1, nil);
bmAndBack := CreateBitmap(SrcW, SrcH, 1, 1, nil);
bmAndMem := CreateCompatibleBitmap(DstDC, DstW, DstH);
bmSave := CreateCompatibleBitmap(DstDC, SrcW, SrcH);
{ Each DC must select a bitmap object to store pixel data }
bmBackOld := SelectObject(BackDC, bmAndBack);
bmObjectOld := SelectObject(ObjectDC, bmAndObject);
bmMemOld := SelectObject(MemDC, bmAndMem);
bmSaveOld := SelectObject(SaveDC, bmSave);
{ Select palette }
palDst := 0; palMem := 0; palSave := 0; palObj := 0;
if Palette <> 0 then begin
palDst := SelectPalette(DstDC, Palette, True);
RealizePalette(DstDC);
palSave := SelectPalette(SaveDC, Palette, False);
RealizePalette(SaveDC);
palObj := SelectPalette(ObjectDC, Palette, False);
RealizePalette(ObjectDC);
palMem := SelectPalette(MemDC, Palette, True);
RealizePalette(MemDC);
end;
{ Set proper mapping mode }
SetMapMode(SrcDC, GetMapMode(DstDC));
SetMapMode(SaveDC, GetMapMode(DstDC));
{ Save the bitmap sent here }
BitBlt(SaveDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SRCCOPY);
{ Set the background color of the source DC to the color, }
{ contained in the parts of the bitmap that should be transparent }
Color := SetBkColor(SaveDC, PaletteColor(TransparentColor));
{ Create the object mask for the bitmap by performing a BitBlt() }
{ from the source bitmap to a monochrome bitmap }
BitBlt(ObjectDC, 0, 0, SrcW, SrcH, SaveDC, 0, 0, SRCCOPY);
{ Set the background color of the source DC back to the original }
SetBkColor(SaveDC, Color);
{ Create the inverse of the object mask }
BitBlt(BackDC, 0, 0, SrcW, SrcH, ObjectDC, 0, 0, NOTSRCCOPY);
{ Copy the background of the main DC to the destination }
BitBlt(MemDC, 0, 0, DstW, DstH, DstDC, DstX, DstY, SRCCOPY);
{ Mask out the places where the bitmap will be placed }
StretchBlt(MemDC, 0, 0, DstW, DstH, ObjectDC, 0, 0, SrcW, SrcH, SRCAND);
{ Mask out the transparent colored pixels on the bitmap }
BitBlt(SaveDC, 0, 0, SrcW, SrcH, BackDC, 0, 0, SRCAND);
{ XOR the bitmap with the background on the destination DC }
StretchBlt(MemDC, 0, 0, DstW, DstH, SaveDC, 0, 0, SrcW, SrcH, SRCPAINT);
{ Copy the destination to the screen }
BitBlt(DstDC, DstX, DstY, DstW, DstH, MemDC, 0, 0,
SRCCOPY);
{ Restore palette }
if Palette <> 0 then begin
SelectPalette(MemDC, palMem, False);
SelectPalette(ObjectDC, palObj, False);
SelectPalette(SaveDC, palSave, False);
SelectPalette(DstDC, palDst, True);
end;
{ Delete the memory bitmaps }
DeleteObject(SelectObject(BackDC, bmBackOld));
DeleteObject(SelectObject(ObjectDC, bmObjectOld));
DeleteObject(SelectObject(MemDC, bmMemOld));
DeleteObject(SelectObject(SaveDC, bmSaveOld));
{ Delete the memory DCs }
DeleteDC(MemDC);
DeleteDC(BackDC);
DeleteDC(ObjectDC);
DeleteDC(SaveDC);
end;
procedure StretchBitmapTransparent(Dest: TCanvas; Bitmap: TBitmap;
TransparentColor: TColor; DstX, DstY, DstW, DstH, SrcX, SrcY,
SrcW, SrcH: Integer);
var
CanvasChanging: TNotifyEvent;
begin
if DstW <= 0 then DstW := Bitmap.Width;
if DstH <= 0 then DstH := Bitmap.Height;
if (SrcW <= 0) or (SrcH <= 0) then begin
SrcX := 0; SrcY := 0;
SrcW := Bitmap.Width;
SrcH := Bitmap.Height;
end;
if not Bitmap.Monochrome then
SetStretchBltMode(Dest.Handle, STRETCH_DELETESCANS);
CanvasChanging := Bitmap.Canvas.OnChanging;
Bitmap.Canvas.Lock;
try
Bitmap.Canvas.OnChanging := nil;
if TransparentColor = clNone then begin
StretchBlt(Dest.Handle, DstX, DstY, DstW, DstH, Bitmap.Canvas.Handle,
SrcX, SrcY, SrcW, SrcH, Dest.CopyMode);
end
else begin
if TransparentColor = clDefault then
TransparentColor := Bitmap.Canvas.Pixels[0, Bitmap.Height - 1];
if Bitmap.Monochrome then TransparentColor := clWhite
else TransparentColor := ColorToRGB(TransparentColor);
StretchBltTransparent(Dest.Handle, DstX, DstY, DstW, DstH,
Bitmap.Canvas.Handle, SrcX, SrcY, SrcW, SrcH, Bitmap.Palette,
TransparentColor);
end;
finally
Bitmap.Canvas.OnChanging := CanvasChanging;
Bitmap.Canvas.Unlock;
end;
end;
procedure DrawBitmapTransparent(Dest: TCanvas; DstX, DstY: Integer;
Bitmap: TBitmap; TransparentColor: TColor);
begin
StretchBitmapTransparent(Dest, Bitmap, TransparentColor, DstX, DstY,
Bitmap.Width, Bitmap.Height, 0, 0, Bitmap.Width, Bitmap.Height);
end;
var
Image: TGraphic;
begin
if Index < 0 then Image := Picture.Graphic
else Image := GraphicCell[Index];
if (Image <> nil) and not Image.Empty then begin
if FMasked and (FMaskColor <> clNone) and
(Picture.Graphic is TBitmap) then
DrawBitmapTransparent(Canvas, X, Y, TBitmap(Image), FMaskColor)
else Canvas.Draw(X, Y, Image);
end;
end;
 
procedure TDXPictureClip.DrawCenter(Canvas: TCanvas; Rect: TRect; Index: Integer);
var
X, Y: Integer;
begin
X := (Rect.Left + Rect.Right - Width) div 2;
Y := (Rect.Bottom + Rect.Top - Height) div 2;
Draw(Canvas, X, Y, Index);
end;
 
procedure TDXPictureClip.CheckIndex(Index: Integer);
begin
if (Index >= Cols * Rows) or (Index < 0) then
raise EListError.CreateFmt('%s (%d)', ['Load list error', Index]);
end;
 
function TDXPictureClip.GetIndex(Col, Row: Cardinal): Integer;
begin
Result := Col + (Row * Cols);
if (Result >= Cols * Rows) or IsEmpty then Result := -1;
end;
 
function TDXPictureClip.GetCell(Col, Row: Cardinal): TBitmap;
begin
Result := GetGraphicCell(GetIndex(Col, Row));
end;
 
function TDXPictureClip.GetGraphicCell(Index: Integer): TBitmap;
procedure AssignBitmapCell(Source: TGraphic; Dest: TBitmap; Cols, Rows,
Index: Integer);
var
CellWidth, CellHeight: Integer;
begin
if (Source <> nil) and (Dest <> nil) then begin
if Cols <= 0 then Cols := 1;
if Rows <= 0 then Rows := 1;
if Index < 0 then Index := 0;
CellWidth := Source.Width div Cols;
CellHeight := Source.Height div Rows;
with Dest do begin
Width := CellWidth; Height := CellHeight;
end;
if Source is TBitmap then begin
Dest.Canvas.CopyRect(Bounds(0, 0, CellWidth, CellHeight),
TBitmap(Source).Canvas, Bounds((Index mod Cols) * CellWidth,
(Index div Cols) * CellHeight, CellWidth, CellHeight));
Dest.TransparentColor := TBitmap(Source).TransparentColor;
end
else begin
Dest.Canvas.Brush.Color := clSilver;
Dest.Canvas.FillRect(Bounds(0, 0, CellWidth, CellHeight));
Dest.Canvas.Draw(-(Index mod Cols) * CellWidth,
-(Index div Cols) * CellHeight, Source);
end;
Dest.Transparent := Source.Transparent;
end;
end;
begin
CheckIndex(Index);
AssignBitmapCell(Picture.Graphic, FBitmap, Cols, Rows, Index);
if Picture.Graphic is TBitmap then
if FBitmap.PixelFormat <> pfDevice then
FBitmap.PixelFormat := TBitmap(Picture.Graphic).PixelFormat;
FBitmap.TransparentColor := FMaskColor or PaletteMask;
FBitmap.Transparent := (FMaskColor <> clNone) and Masked;
Result := FBitmap;
end;
 
function TDXPictureClip.GetDefaultMaskColor: TColor;
begin
Result := clOlive;
if (Picture.Graphic <> nil) and (Picture.Graphic is TBitmap) then
Result := TBitmap(Picture.Graphic).TransparentColor and
not PaletteMask;
end;
 
function TDXPictureClip.GetHeight: Integer;
begin
Result := Picture.Height div FRows;
end;
 
function TDXPictureClip.GetWidth: Integer;
begin
Result := Picture.Width div FCols;
end;
 
function TDXPictureClip.IsMaskStored: Boolean;
begin
Result := MaskColor <> GetDefaultMaskColor;
end;
 
procedure TDXPictureClip.SetMaskColor(Value: TColor);
begin
if Value <> FMaskColor then begin
FMaskColor := Value;
Changed;
end;
end;
 
procedure TDXPictureClip.PictureChanged(Sender: TObject);
begin
FMaskColor := GetDefaultMaskColor;
if not (csReading in ComponentState) then Changed;
end;
 
procedure TDXPictureClip.SetHeight(Value: Integer);
begin
if (Value > 0) and (Picture.Height div Value > 0) then
Rows := Picture.Height div Value;
end;
 
procedure TDXPictureClip.SetWidth(Value: Integer);
begin
if (Value > 0) and (Picture.Width div Value > 0) then
Cols := Picture.Width div Value;
end;
 
procedure TDXPictureClip.SetPicture(Value: TPicture);
begin
FPicture.Assign(Value);
end;
 
{ Transformations routines }
{ Authorisation: Mr. Takanori Kawasaki}
 
//Distance between 2 points is calculated
function Get2PointRange(a,b: TDblPoint):Double;
var
x,y: Double;
begin
x := a.X - b.X;
y := a.Y - b.Y;
Result := Sqrt(x*x+y*y);
end;
 
//Direction angle in the coordinate A which was seen from coordinate B is calculated
function GetARadFromB(A,B: TDblPoint):Double;
var
dX,dY: Double;
begin
dX := A.X - B.X;
dY := A.Y - B.Y;
Result := Get256(dX,dY);
end;
 
//Direction angle is returned with 0 - 255.
function Get256(dX,dY:Double):Double;
begin
Result := 0;
if dX > 0 then
begin//0-63
if dY > 0 then Result := ArcTan(dY / dX) // 0 < Res < 90
else//0
if dY = 0 then Result := 0 // 0
else//192-255
if dY < 0 then Result := 2*Pi + ArcTan(dY / dX) // 270 < Res < 360
end else
if dX = 0 then
begin//64
if dY > 0 then Result := 1 / 2 * Pi // 90
else//0
if dY = 0 then Result := 0 // 0
else//192
if dY < 0 then Result := 3 / 2 * Pi // 270
end else
if dX < 0 then
begin//64-127
if dY > 0 then Result := Pi + ArcTan(dY / dX) // 90 < Res < 180
else//128
if dY = 0 then Result := Pi // 180
else//128-191
if dY < 0 then Result := Pi + ArcTan(dY / dX) // 180 < Res < 270
end;
Result := 256 * Result / (2*Pi);
end;
 
//From the coordinate SP the Range it calculates the point which leaves with the angular Angle
function GetPointFromRangeAndAngle(SP: TDblPoint; Range,Angle: Double): TDblPoint;
begin
Result.X := SP.X + Range * Cos(Angle);
Result.Y := SP.Y + Range * Sin(Angle);
end;
 
//* As for coordinate transformation coordinate for mathematics is used
//Identity matrix for the 2d is returned.
function Ini2DRowCol: T2DRowCol;
var
i,ii:integer;
begin
for i := 1 to 3 do
for ii := 1 to 3 do
if i = ii then Result[i,ii] := 1 else Result[i,ii] := 0;
end;
 
//Transformation matrix of the portable quantity
//where the one for 2d is appointed is returned.
function Trans2DRowCol(x,y:double):T2DRowCol;
begin
Result := Ini2DRowCol;
Result[3,1] := x;
Result[3,2] := y;
end;
 
//Conversion coordinate of the expansion and contraction
//quantity where the one for 2d is appointed is returned.
function Scale2DRowCol(x,y:double):T2DRowCol;
begin
Result := Ini2DRowCol;
Result[1,1] := x;
Result[2,2] := y;
end;
 
//Coordinate transformation of the rotary quantity
//where the one for 2d is appointed is returned.
function Rotate2DRowCol(Theta:double):T2DRowCol;
begin
Result := Ini2DRowCol;
Result[1,1] := Cos256(Trunc(Theta));
Result[1,2] := Sin256(Trunc(Theta));
Result[2,1] := -1 * Result[1,2];
Result[2,2] := Result[1,1];
end;
 
//You apply two conversion coordinates and adjust.
function Multiply2DRowCol(A,B:T2DRowCol):T2DRowCol;
begin
Result[1,1] := A[1,1] * B[1,1] + A[1,2] * B[2,1];
Result[1,2] := A[1,1] * B[1,2] + A[1,2] * B[2,2];
Result[1,3] := 0;
Result[2,1] := A[2,1] * B[1,1] + A[2,2] * B[2,1];
Result[2,2] := A[2,1] * B[1,2] + A[2,2] * B[2,2];
Result[2,3] := 0;
Result[3,1] := A[3,1] * B[1,1] + A[3,2] * B[2,1] + B[3,1];
Result[3,2] := A[3,1] * B[1,2] + A[3,2] * B[2,2] + B[3,2];
Result[3,3] := 1;
end;
 
//Until coordinate (the X and the Y) comes on the X axis,
//the conversion coordinate which turns the position
//of the point is returned.
function RotateIntoX2DRowCol(x,y: double):T2DRowCol;
var
d: double;
begin
Result := Ini2DRowCol;
d := sqrt(x*x+y*y);
Result[1,1] := x / d;
Result[1,2] := y / d;
Result[2,1] := -1 * Result[1,2];
Result[2,2] := Result[1,1];
end;
 
//Coordinate (the X and the Y) as a center, the conversion
//coordinate which does the scaling of the magnification ratio
//which is appointed with the Sx and the Sy is returned.
function ScaleAt2DRowCol(x,y,Sx,Sy:double):T2DRowCol;
var
T,S,TInv,M:T2DRowCol;
begin
T := Trans2DRowCol(-x,-y);
TInv := Trans2DRowCol(x,y);
S := Scale2DRowCol(Sx,Sy);
M := Multiply2DRowCol(T,S);
Result := Multiply2DRowCol(M,T);
end;
 
//Coordinate (the X and the Y) it passes, comes hard and
//(DX and the dy) with the direction which is shown it
//returns the transformation matrix which does the reflected
//image conversion which centers the line which faces.
function ReflectAcross2DRowCol(x,y,dx,dy:Double): T2DRowCol;
var
T,R,S,RInv,TInv,M1,M2,M3: T2DRowCol;
begin
T := Trans2DRowCol(-x,-y);
TInv := Trans2DRowCol(x,y);
R := RotateIntoX2DRowCol(dx,dy);
RInv := RotateIntoX2DRowCol(dx,-dy);
S := Scale2DRowCol(1,-1);
M1 := Multiply2DRowCol(T,R);
M2 := Multiply2DRowCol(S,RInv);
M3 := Multiply2DRowCol(M1,M2);
Result := Multiply2DRowCol(M3,TInv);
end;
 
//Coordinate focusing on (the X and the Y) the transformation
//matrix which turns the position of the point with angle Theta is returned.
function RotateAround2DRowCol(x,y,Theta:Double): T2DRowCol;
var
T,R,TInv,M: T2DRowCol;
begin
T := Trans2DRowCol(-x,-y);
TInv := Trans2DRowCol(x,y);
R := Rotate2DRowCol(Theta);
M := Multiply2DRowCol(T,R);
Result := Multiply2DRowCol(M,TInv);
end;
 
//Transformation matrix is applied to the point.
function Apply2DVector(V:T2DVector; M:T2DRowCol): T2DVector;
begin
Result[1] := V[1] * M[1,1] + V[2] * M[2,1] + M[3,1];
Result[2] := V[1] * M[1,2] + V[2] * M[2,2] + M[3,2];
Result[3] := 1;
end;
 
//The TDblPoint is returned
function DblPoint(a,b:Double):TDblPoint;
begin
Result.X := a;
Result.Y := b;
end;
 
function TruncDblPoint(DblPos: TDblPoint): TPoint;
begin
Result.X := Trunc(DblPos.X);
Result.Y := Trunc(DblPos.Y);
end;
{
+-----------------------------------------------------------------------------+
|Collision decision |
+-----------------------------------------------------------------------------+}
 
//Point and circle
function PointInCircle(PPos,CPos: TPoint; R: integer): Boolean;
begin
Result := (PPos.X - CPos.X)*(PPos.X - CPos.X)+(PPos.Y - CPos.Y)*(PPos.Y - CPos.Y)<= R*R;
end;
 
//Circle and circle
function CircleInCircle(C1Pos,C2Pos: TPoint; R1,R2:Integer): Boolean;
begin
Result := (C1Pos.X - C2Pos.X)*(C1Pos.X - C2Pos.X)+(C1Pos.Y - C2Pos.Y)*(C1Pos.Y - C2Pos.Y) <= (R1+R2)*(R1+R2);
end;
 
//Circle and line segment
function SegmentInCircle(SPos,EPos,CPos: TPoint; R: Integer): Boolean;
var
V,C: TPoint;
VC,VV,CC:integer;
begin
Result := False;
V.X := EPos.X - SPos.X; V.Y := EPos.Y - SPos.Y;
C.X := CPos.X - SPos.X; C.Y := CPos.Y - SPos.Y;
VC := V.X * C.X + V.Y * C.Y;
if VC < 0 then
begin
Result := (C.X * C.X + C.Y * C.Y) <= R*R;
end
else
begin
VV := V.X * V.X + V.Y * V.Y;
if VC >= VV then
begin
Result := (EPos.X - CPos.X)*(EPos.X - CPos.X)+(EPos.Y - CPos.Y)*(EPos.Y - CPos.Y) <= R * R;
end
else
if VC < VV then
begin
CC := C.X * C.X + C.Y * C.Y;
Result := CC - (VC div VV)* VC <= R*R;
end;
end;
end;
 
//Angle recalc
function Angle256(Angle: Single): Single;
begin
Result := Angle;
While Result < 0 do Result := Result + 256;
While Result >= 256 do Result := Result -256;
end;
 
//If A is closer than B from starting point S, the True is returned.
function CheckNearAThanB(S,A,B: TDblPoint): Boolean;
begin
Result := (S.X-A.X)*(S.X-A.X)+(S.Y-A.Y)*(S.Y-A.Y) <= (S.X-B.X)*(S.X-B.X)+(S.Y-B.Y)*(S.Y-B.Y);
end;
 
function CircumCenter3Pt(const x1, y1, x2, y2, x3, y3: Single; out Px, Py: Single): Boolean;
var
A,B,C,D,E,F,G: Single;
begin
A := x2 - x1;
B := y2 - y1;
C := x3 - x1;
D := y3 - y1;
E := A * (x1 + x2) + B * (y1 + y2);
F := C * (x1 + x3) + D * (y1 + y3);
G := 2.0 * (A * (y3 - y2) - B * (x3 - x2));
Result := G <> 0.0;
if Result then begin
Px := (D * E - B * F) / G;
Py := (A * F - C * E) / G;
end;
end;
 
function Distance(const x1, y1, x2, y2: Double): Double;
begin
Result := Sqrt(Sqr(y2 - y1) + Sqr(x2 - x1));
end;
 
procedure InCenter(const x1, y1, x2, y2, x3, y3: Double; out Px, Py: Double);
var
Perim: Double;
Side12: Double;
Side23: Double;
Side31: Double;
begin
Side12 := Distance(x1, y1, x2, y2);
Side23 := Distance(x2, y2, x3, y3);
Side31 := Distance(x3, y3, x1, y1);
{ Using Heron's S=UR }
Perim := 1.0 / (Side12 + Side23 + Side31);
Px := (Side23 * x1 + Side31 * x2 + Side12 * x3) * Perim;
Py := (Side23 * y1 + Side31 * y2 + Side12 * y3) * Perim;
end;
 
function PointInTriangle(const Px, Py, x1, y1, x2, y2, x3, y3: Double): Boolean;
function Orientation(const x1, y1, x2, y2, Px, Py: Double): Integer;
var
Orin: Double;
begin
(* Linear determinant of the 3 points *)
Orin := (x2 - x1) * (py - y1) - (px - x1) * (y2 - y1);
 
if Orin > 0.0 then
Result := +1 (* Orientaion is to the right-hand side *)
else if Orin < 0.0 then
Result := -1 (* Orientaion is to the left-hand side *)
else
Result := 0; (* Orientaion is neutral aka collinear *)
end;
var
Or1, Or2, Or3: Integer;
begin
Or1 := Orientation(x1, y1, x2, y2, Px, Py);
Or2 := Orientation(x2, y2, x3, y3, Px, Py);
Or3 := Orientation(x3, y3, x1, y1, Px, Py);
 
if (Or1 = Or2) and (Or2 = Or3) then
Result := True
else if Or1 = 0 then
Result := (Or2 = 0) or (Or3 = 0)
else if Or2 = 0 then
Result := (Or1 = 0) or (Or3 = 0)
else if Or3 = 0 then
Result := (Or2 = 0) or (Or1 = 0)
else
Result := False;
end;
 
procedure Log(const Co: string; const FName: string);
var F: Text; D: TDateTime;
Hour, Minute, Second, MSec: Word;
begin
AsSignFile(F, FName);
if FileExists(FName) then Append(F)
else ReWrite(F);
try
D := Now;
DecodeTime(D, Hour, Minute, Second, MSec);
WriteLn(F, DateToStr(D) + ' ' + IntToStr(Hour)+':'+IntToStr(Minute)+':'+IntToStr(Second)+ '.'+IntToStr(MSec) +' ' + Co);
finally
CloseFile(F);
end;
end;
 
{$IFDEF _DMO_}
 
{ TDirectXDriverEx }
 
function TDirectXDriverEx.ConvertHMonitor(iMonitor: HMonitor): TMonitorInfo;
begin
ZeroMemory(@Result, sizeof(Result));
Result.cbSize := SizeOf(Result);
MultiMon.GetMonitorInfo(iMonitor, @Result);
end;
 
function TDirectXDriverEx.GetFlags: DWORD;
begin
Result := ConvertHMonitor(FMonitor).dwFlags;
end;
 
function TDirectXDriverEx.GetMonitorInfo: TMonitorInfo;
begin
Result:= ConvertHMonitor(FMonitor);
end;
 
function TDirectXDriverEx.GetTempSpace: TRect;
begin
Result := ConvertHMonitor(FMonitor).rcWork
end;
 
function TDirectXDriverEx.GetWorkSpace: TRect;
begin
Result := ConvertHMonitor(FMonitor).rcMonitor
end;
 
procedure TDirectXDriverEx.SetGUID(Value: PGUID);
begin
if not IsBadHugeReadPtr(Value, SizeOf(TGUID)) then
begin
FGUID2 := Value^;
FGUID := @FGUID2;
end else
FGUID := Value;
end;
 
{ TDirectXDriversEx }
 
constructor TDirectXDriversEx.Create;
begin
inherited Create(TDirectXDriverEx);
end;
 
function TDirectXDriversEx.GetDriver(Index: Integer): TDirectXDriverEx;
begin
Result := (inherited Items[Index]) as TDirectXDriverEx;
end;
 
{$ENDIF}
 
initialization
InitCosinTable;
finalization
FreeLibList;
end.
end.
/VCL_DELPHIX_D6/Wave.pas
0,0 → 1,726
unit Wave;
 
interface
 
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, SysUtils, Classes, MMSystem;
 
type
 
{ EWaveError }
 
EWaveError = class(Exception);
 
{ TWave }
 
TWave = class(TPersistent)
private
FData: Pointer;
FFormat: PWaveFormatEx;
FFormatSize: Integer;
FSize: Integer;
procedure SetFormatSize(Value: Integer);
procedure SetSize(Value: Integer);
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadData(Stream: TStream); virtual;
procedure WriteData(Stream: TStream); virtual;
public
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
procedure Clear;
procedure LoadFromFile(const FileName : string);
procedure LoadFromStream(Stream: TStream);
procedure SaveToFile(const FileName : string);
procedure SaveToStream(Stream: TStream);
procedure SetPCMFormat(SamplesPerSec, BitsPerSample, Channels: Integer);
property Data: Pointer read FData;
property Format: PWaveFormatEx read FFormat;
property FormatSize: Integer read FFormatSize write SetFormatSize;
property Size: Integer read FSize write SetSize;
end;
 
{ TCustomDXWave }
 
TCustomDXWave = class(TComponent)
private
FWave: TWave;
procedure SetWave(Value: TWave);
public
constructor Create(AOnwer: TComponent); override;
destructor Destroy; override;
property Wave: TWave read FWave write SetWave;
end;
 
{ TDXWave }
 
TDXWave = class(TCustomDXWave)
published
property Wave;
end;
 
{ EWaveStreamError }
 
EWaveStreamError = class(Exception);
 
{ TCustomWaveStream }
 
TCustomWaveStream = class(TStream)
private
FPosition: Integer;
protected
function GetFilledSize: Integer; virtual;
function GetFormat: PWaveFormatEx; virtual; abstract;
function GetFormatSize: Integer; virtual;
function GetSize: Integer; virtual;
function ReadWave(var Buffer; Count: Integer): Integer; virtual;
procedure SetFormatSize(Value: Integer); virtual; abstract;
procedure SetSize(Value: Integer); override;
function WriteWave(const Buffer; Count: Integer): Integer; virtual;
public
function Read(var Buffer; Count: Longint): Longint; override;
function Seek(Offset: Longint; Origin: Word): Longint; override;
function Write(const Buffer; Count: Longint): Longint; override;
procedure SetPCMFormat(SamplesPerSec, BitsPerSample, Channels: Integer);
property FilledSize: Integer read GetFilledSize;
property Format: PWaveFormatEx read GetFormat;
property FormatSize: Integer read GetFormatSize write SetFormatSize;
property Size: Integer read GetSize write SetSize;
end;
 
{ TCustomWaveStream2 }
 
TCustomWaveStream2 = class(TCustomWaveStream)
private
FFormat: PWaveFormatEx;
FFormatSize: Integer;
protected
function GetFormat: PWaveFormatEx; override;
function GetFormatSize: Integer; override;
procedure SetFormatSize(Value: Integer); override;
public
destructor Destroy; override;
end;
 
{ TWaveObjectStream }
 
TWaveObjectStream = class(TCustomWaveStream)
private
FWave: TWave;
protected
function GetFormat: PWaveFormatEx; override;
function GetFormatSize: Integer; override;
function GetSize: Integer; override;
function ReadWave(var Buffer; Count: Integer): Integer; override;
procedure SetFormatSize(Value: Integer); override;
procedure SetSize(Value: Integer); override;
function WriteWave(const Buffer; Count: Integer): Integer; override;
public
constructor Create(AWave: TWave);
end;
 
{ TWaveStream }
 
TWaveStream = class(TCustomWaveStream2)
private
FDataPosition: Integer;
FDataHeaderPosition: Integer;
FOpened: Boolean;
FOriPosition: Integer;
FReadMode: Boolean;
FSize: Integer;
FStream: TStream;
procedure CloseWriteMode;
procedure OpenReadMode;
procedure OpenWriteMode;
protected
function GetSize: Integer; override;
function ReadWave(var Buffer; Count: Integer): Integer; override;
function WriteWave(const Buffer; Count: Integer): Integer; override;
public
constructor Create(AStream: TStream);
destructor Destroy; override;
procedure Open(WriteMode: Boolean);
end;
 
{ TWaveFileStream }
 
TWaveFileStream = class(TWaveStream)
private
FFileStream: TFileStream;
public
constructor Create(const FileName: string; FileMode: Integer);
destructor Destroy; override;
end;
 
procedure MakePCMWaveFormatEx(var Format: TWaveFormatEx;
SamplesPerSec, BitsPerSample, Channels: Integer);
 
implementation
 
uses DXConsts;
 
procedure MakePCMWaveFormatEx(var Format: TWaveFormatEx;
SamplesPerSec, BitsPerSample, Channels: Integer);
begin
with Format do
begin
wFormatTag := WAVE_FORMAT_PCM;
nChannels := Channels;
nSamplesPerSec := SamplesPerSec;
wBitsPerSample := BitsPerSample;
nBlockAlign := nChannels*(wBitsPerSample div 8);
nAvgBytesPerSec := nBlockAlign*nSamplesPerSec;
cbSize := 0;
end;
end;
 
{ TWave }
 
const
WavePoolSize = 8096;
 
destructor TWave.Destroy;
begin
Clear;
inherited Destroy;
end;
 
procedure TWave.Assign(Source: TPersistent);
var
AWave: TWave;
begin
if Source=nil then
begin
Clear;
end else if Source is TWave then
begin
if Source<>Self then
begin
AWave := TWave(Source);
Size := AWave.Size;
FormatSize := AWave.FormatSize;
Move(AWave.Data^, FData^, FSize);
Move(AWave.Format^, FFormat^, FFormatSize);
end;
end else
inherited Assign(Source);
end;
 
procedure TWave.Clear;
begin
FreeMem(FData, 0); FData := nil;
FreeMem(FFormat, 0); FFormat := nil;
 
FSize := 0;
FFormatSize := 0;
end;
 
procedure TWave.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineBinaryProperty('WAVE', ReadData, WriteData, True);
end;
 
procedure TWave.LoadFromFile(const FileName : string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure TWave.LoadFromStream(Stream: TStream);
var
WaveStream: TWaveStream;
begin
Clear;
 
WaveStream := TWaveStream.Create(Stream);
try
WaveStream.Open(False);
 
FormatSize := WaveStream.FormatSize;
Move(WaveStream.Format^, Format^, FormatSize);
Size := WaveStream.Size;
WaveStream.ReadBuffer(FData^, Size);
finally
WaveStream.Free;
end;
end;
 
procedure TWave.ReadData(Stream: TStream);
begin
LoadFromStream(Stream);
end;
 
procedure TWave.SaveToFile(const FileName : string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure TWave.SaveToStream(Stream: TStream);
var
WaveStream: TWaveStream;
begin
if (FFormatSize<=0) or (FSize<=0) then Exit;
 
WaveStream := TWaveStream.Create(Stream);
try
WaveStream.FormatSize := FormatSize;
Move(Format^, WaveStream.Format^, FormatSize);
 
WaveStream.Open(True);
WaveStream.WriteBuffer(FData^, Size);
finally
WaveStream.Free;
end;
end;
 
procedure TWave.SetFormatSize(Value: Integer);
begin
if Value<=0 then Value := 0;
ReAllocMem(FFormat, Value);
FFormatSize := Value;
end;
 
procedure TWave.SetPCMFormat(SamplesPerSec, BitsPerSample, Channels: Integer);
begin
FormatSize := SizeOf(TWaveFormatEx);
MakePCMWaveFormatEx(Format^, SamplesPerSec, BitsPerSample, Channels);
end;
 
procedure TWave.SetSize(Value: Integer);
var
i: Integer;
begin
if Value<=0 then Value := 0;
 
i := (Value+WavePoolSize-1) div WavePoolSize;
if i<>(FSize+WavePoolSize-1) div WavePoolSize then
ReAllocMem(FData, i*WavePoolSize);
 
FSize := Value;
end;
 
procedure TWave.WriteData(Stream: TStream);
begin
SaveToStream(Stream);
end;
 
{ TCustomDXWave }
 
constructor TCustomDXWave.Create(AOnwer: TComponent);
begin
inherited Create(AOnwer);
FWave := TWave.Create;
end;
 
destructor TCustomDXWave.Destroy;
begin
FWave.Free;
inherited Destroy;
end;
 
procedure TCustomDXWave.SetWave(Value: TWave);
begin
FWave.Assign(Value);
end;
 
{ TCustomWaveStream }
 
function TCustomWaveStream.GetFilledSize: Longint;
begin
Result := -1;
end;
 
function TCustomWaveStream.GetFormatSize: Integer;
begin
Result := 0;
end;
 
function TCustomWaveStream.GetSize: Integer;
begin
Result := -1;
end;
 
function TCustomWaveStream.Read(var Buffer; Count: Longint): Longint;
begin
if GetSize<0 then
Result := ReadWave(Buffer, Count)
else
begin
if FPosition>Size then
FPosition := Size;
if FPosition+Count>Size then
Result := Size-FPosition
else
Result := Count;
 
Result := ReadWave(Buffer, Result);
end;
 
Inc(FPosition, Result);
end;
 
function TCustomWaveStream.ReadWave(var Buffer; Count: Integer): Integer;
begin
Result := 0;
end;
 
function TCustomWaveStream.Seek(Offset: Longint; Origin: Word): Longint;
begin
case Origin of
soFromBeginning: FPosition := Offset;
soFromCurrent : FPosition := FPosition + Offset;
soFromEnd : FPosition := GetSize + Offset;
end;
if FPosition<0 then FPosition := 0;
if FPosition>GetSize then FPosition := GetSize;
 
Result := FPosition;
end;
 
procedure TCustomWaveStream.SetPCMFormat(SamplesPerSec, BitsPerSample, Channels: Integer);
begin
FormatSize := SizeOf(TWaveFormatEx);
MakePCMWaveFormatEx(Format^, SamplesPerSec, BitsPerSample, Channels);
end;
 
procedure TCustomWaveStream.SetSize(Value: Integer);
begin
end;
 
function TCustomWaveStream.Write(const Buffer; Count: Longint): Longint;
begin
if FPosition>Size then
FPosition := Size;
Result := WriteWave(Buffer, Count);
Inc(FPosition, Result);
end;
 
function TCustomWaveStream.WriteWave(const Buffer; Count: Integer): Integer;
begin
Result := 0;
end;
 
{ TCustomWaveStream2 }
 
destructor TCustomWaveStream2.Destroy;
begin
FormatSize := 0;
inherited Destroy;
end;
 
function TCustomWaveStream2.GetFormat: PWaveFormatEx;
begin
Result := FFormat;
end;
 
function TCustomWaveStream2.GetFormatSize: Integer;
begin
Result := FFormatSize;
end;
 
procedure TCustomWaveStream2.SetFormatSize(Value: Integer);
begin
ReAllocMem(FFormat, Value);
FFormatSize := Value;
end;
 
{ TWaveObjectStream }
 
constructor TWaveObjectStream.Create(AWave: TWave);
begin
inherited Create;
FWave := AWave;
 
FormatSize := FWave.FormatSize;
Move(FWave.Format^, Format^, FormatSize);
end;
 
function TWaveObjectStream.GetFormat: PWaveFormatEx;
begin
Result := FWave.Format;
end;
 
function TWaveObjectStream.GetFormatSize: Integer;
begin
Result := FWave.FormatSize;
end;
 
function TWaveObjectStream.GetSize: Integer;
begin
Result := FWave.Size;
end;
 
function TWaveObjectStream.ReadWave(var Buffer; Count: Integer): Integer;
begin
Result := Count;
Move(Pointer(Integer(FWave.Data)+Position)^, Buffer, Count);
end;
 
procedure TWaveObjectStream.SetFormatSize(Value: Integer);
begin
FWave.FormatSize := Value;
end;
 
procedure TWaveObjectStream.SetSize(Value: Integer);
begin
FWave.Size := Value;
end;
 
function TWaveObjectStream.WriteWave(const Buffer; Count: Integer): Integer;
begin
Result := Count;
if Position+Count>Size then
SetSize(Size+(Position+Count+Size));
Move(Buffer, Pointer(Integer(FWave.Data)+Position)^, Count);
end;
 
{ TWaveStream }
 
const
ID_RIFF = Ord('R') + Ord('I')*$100 + Ord('F')*$10000 + Ord('F')*$1000000;
ID_WAVE = Ord('W') + Ord('A')*$100 + Ord('V')*$10000 + Ord('E')*$1000000;
ID_FMT = Ord('f') + Ord('m')*$100 + Ord('t')*$10000 + Ord(' ')*$1000000;
ID_FACT = Ord('f') + Ord('a')*$100 + Ord('c')*$10000 + Ord('t')*$1000000;
ID_DATA = Ord('d') + Ord('a')*$100 + Ord('t')*$10000 + Ord('a')*$1000000;
 
type
TWaveFileHeader = packed record
FType: Integer;
Size: Longint;
RType: Integer;
end;
 
TWaveChunkHeader = packed record
CType: Longint;
Size: Longint;
end;
 
constructor TWaveStream.Create(AStream: TStream);
begin
inherited Create;
FStream := AStream;
 
FOriPosition := FStream.Position;
end;
 
destructor TWaveStream.Destroy;
begin
if FOpened and (not FReadMode) then
CloseWriteMode;
inherited Destroy;
end;
 
function TWaveStream.GetSize: Integer;
begin
if FOpened then
begin
if not FReadMode then
Result := FStream.Size-FDataPosition
else
Result := FSize;
end else
Result := 0;
end;
 
function TWaveStream.ReadWave(var Buffer; Count: Integer): Integer;
begin
if not FOpened then
raise EWaveStreamError.Create(SStreamNotOpend);
 
FStream.Position := FDataPosition+Position;
Result := FStream.Read(Buffer, Count);
end;
 
function TWaveStream.WriteWave(const Buffer; Count: Integer): Integer;
begin
if not FOpened then
raise EWaveStreamError.Create(SStreamNotOpend);
 
if FReadMode then
begin
if Position+Count>FSize then
Count := FSize-Position;
end;
 
FStream.Position := FDataPosition+Position;
Result := FStream.Write(Buffer, Count);
end;
 
procedure TWaveStream.Open(WriteMode: Boolean);
begin
if WriteMode then
OpenWriteMode
else
OpenReadMode;
end;
 
procedure TWaveStream.OpenReadMode;
var
WF: TWaveFileHeader;
WC: TWaveChunkHeader;
 
procedure Readfmt; { fmt }
begin
FormatSize := WC.Size;
FStream.ReadBuffer(Format^, WC.Size);
end;
 
procedure Readdata; { data }
begin
FSize := WC.Size;
FDataPosition := FStream.Position;
FStream.Seek(FSize, 1);
end;
 
begin
if FOpened then
raise EWaveStreamError.Create(SStreamOpend);
 
FOpened := True;
FReadMode := True;
 
FStream.Position := FOriPosition;
 
//if FStream.Size-FStream.Position<=0 then Exit;
 
{ File header reading. }
FStream.ReadBuffer(WF, SizeOf(TWaveFileHeader));
 
{ Is it Wave file of the file? }
if (WF.FType<>ID_RIFF) or (WF.RType<>ID_WAVE) then
raise EWaveStreamError.Create(SInvalidWave);
 
{ Chunk reading. }
FillChar(WC, SizeOf(WC), 0);
FStream.Read(WC, SizeOf(TWaveChunkHeader));
while WC.CType<>0 do
begin
case WC.CType of
ID_FMT : Readfmt;
ID_DATA: Readdata;
else
{ Chunk which does not correspond is disregarded. }
FStream.Seek(WC.Size, 1);
end;
 
FillChar(WC, SizeOf(WC), 0);
FStream.Read(WC, SizeOf(TWaveChunkHeader));
end;
end;
 
procedure TWaveStream.OpenWriteMode;
 
procedure WriteFmt; { fmt }
var
WC: TWaveChunkHeader;
begin
with WC do
begin
CType := ID_FMT;
Size := FFormatSize;
end;
 
FStream.WriteBuffer(WC, SizeOf(WC));
FStream.WriteBuffer(FFormat^, FFormatSize);
end;
 
procedure WriteData; { data }
var
WC: TWaveChunkHeader;
begin
FDataHeaderPosition := FStream.Position;
 
with WC do
begin
CType := ID_DATA;
Size := 0;
end;
 
FStream.WriteBuffer(WC, SizeOf(WC));
 
FDataPosition := FStream.Position;
end;
 
var
WF: TWaveFileHeader;
begin
if FOpened then
raise EWaveStreamError.Create(SStreamOpend);
 
if FormatSize=0 then
raise EWaveStreamError.Create(SInvalidWaveFormat);
 
FOpened := True;
FStream.Position := FOriPosition;
 
FStream.WriteBuffer(WF, SizeOf(TWaveFileHeader));
 
{ Chunk writing. }
WriteFmt;
WriteData;
end;
 
procedure TWaveStream.CloseWriteMode;
 
procedure WriteDataHeader; { data }
var
WC: TWaveChunkHeader;
begin
FStream.Position := FDataHeaderPosition;
 
with WC do
begin
CType := ID_DATA;
Size := Self.Size;
end;
 
FStream.WriteBuffer(WC, SizeOf(WC));
end;
 
var
WF: TWaveFileHeader;
begin
with WF do
begin
FType := ID_RIFF;
Size := (FStream.Size-FOriPosition)-SizeOf(TWaveChunkHeader);
RType := ID_WAVE;
end;
FStream.Position := FOriPosition;
FStream.WriteBuffer(WF, SizeOf(TWaveFileHeader));
WriteDataHeader;
FStream.Position := FStream.Size;
end;
 
{ TWaveFileStream }
 
constructor TWaveFileStream.Create(const FileName: string; FileMode: Integer);
begin
FFileStream := TFileStream.Create(FileName, FileMode);
inherited Create(FFileStream);
end;
 
destructor TWaveFileStream.Destroy;
begin
inherited Destroy;
FFileStream.Free;
end;
 
end.
/VCL_DELPHIX_D6/DirectX.pas
25,119 → 25,118
* URL : http://www.infosakyu.ne.jp/~kazuya-y/index.html
*
***************************************************************************)
{
(c)2004 Jaro Benes Recompilation with Erik Unger's headers
 
Join in order:
1) DirectDraw
2) Direct3D
3) Direct3DRM
4) DirectInput
5) DirectPlay
6) DirectSetup
7) DirectSound
8) DirectMusic
}
Unit DirectX;
unit DirectX;
 
Interface
interface
 
{Delphi version marks}
{$Z4}
{$A+}
{$WEAKPACKAGEUNIT}
 
{$I DelphiXcfg.inc}
{$IFNDEF DirectX3}
{$IFNDEF DirectX5}
{$IFNDEF DirectX6}
{$IFNDEF DirectX7}
{$DEFINE DirectX7}
{$ENDIF}
{$ENDIF}
{$ENDIF}
{$ENDIF}
 
{$MINENUMSIZE 4}
{$ALIGN ON}
{$IFDEF DirectX3}
{$UNDEF DirectX5}
{$UNDEF DirectX6}
{$UNDEF DirectX7}
{$DEFINE SupportDirectX3}
{$ENDIF}
 
uses
Windows, MMSystem;
{$IFDEF DirectX5}
{$UNDEF DirectX3}
{$UNDEF DirectX6}
{$UNDEF DirectX7}
{$DEFINE SupportDirectX3}
{$DEFINE SupportDirectX5}
{$ENDIF}
 
type
{$IFDEF UNICODE}
PCharAW = PWideChar;
{$ELSE}
PCharAW = PAnsiChar;
{$IFDEF DirectX6}
{$UNDEF DirectX3}
{$UNDEF DirectX5}
{$UNDEF DirectX7}
{$DEFINE SupportDirectX3}
{$DEFINE SupportDirectX5}
{$DEFINE SupportDirectX6}
{$ENDIF}
 
//DirectDraw file
{$IFDEF DirectX7}
{$UNDEF DirectX3}
{$UNDEF DirectX5}
{$UNDEF DirectX6}
{$DEFINE SupportDirectX3}
{$DEFINE SupportDirectX5}
{$DEFINE SupportDirectX6}
{$DEFINE SupportDirectX7}
{$ENDIF}
 
uses Windows, MMSystem, ActiveX;
 
const
{$IFDEF DirectX3}
DirectXUnitVersion = 3;
{$ENDIF}{$IFDEF DirectX5}
DirectXUnitVersion = 5;
{$ENDIF}{$IFDEF DirectX6}
DirectXUnitVersion = 6;
{$ENDIF}{$IFDEF DirectX7}
DirectXUnitVersion = 7;
{$ENDIF}
 
(*==========================================================================;
*
* Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved.
* Copyright (C) Microsoft Corporation. All Rights Reserved.
*
* Files: ddraw.h dvp.h
* Content: DirectDraw and DirectDrawVideoPort include files
* File: ddraw.h
* Content: DirectDraw include file
*
* DirectX 7.0 Delphi adaptation by Erik Unger
*
* Modified: 10-Sep-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
*
***************************************************************************)
 
var
DDrawDLL : HMODULE = 0;
{ FOURCC codes for DX compressed-texture pixel formats }
 
function DDErrorString(Value: HResult) : string;
const
FOURCC_DXT1 = Ord('D') + Ord('X') shl 8 + Ord('T') shl 16 + Ord('1') shl 24;
FOURCC_DXT2 = Ord('D') + Ord('X') shl 8 + Ord('T') shl 16 + Ord('2') shl 24;
FOURCC_DXT3 = Ord('D') + Ord('X') shl 8 + Ord('T') shl 16 + Ord('3') shl 24;
FOURCC_DXT4 = Ord('D') + Ord('X') shl 8 + Ord('T') shl 16 + Ord('4') shl 24;
FOURCC_DXT5 = Ord('D') + Ord('X') shl 8 + Ord('T') shl 16 + Ord('5') shl 24;
 
function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
{ GUIDS used by DirectDraw objects }
 
(*
* FOURCC codes for DX compressed-texture pixel formats
*)
const
FOURCC_DXT1 = 'DXT1';
FOURCC_DXT2 = 'DXT2';
FOURCC_DXT3 = 'DXT3';
FOURCC_DXT4 = 'DXT4';
FOURCC_DXT5 = 'DXT5';
 
(*
* GUIDS used by DirectDraw objects
*)
const
CLSID_DirectDraw: TGUID = '{D7B70EE0-4340-11CF-B063-0020AFC2CD35}';
CLSID_DirectDraw7: TGUID = '{3c305196-50db-11d3-9cfe-00c04fd930c5}';
CLSID_DirectDrawClipper: TGUID = '{593817A0-7DB3-11CF-A2DE-00AA00b93356}';
CLSID_DirectDraw7: TGUID = '{3C305196-50DB-11D3-9CFE-00C04FD930C5}';
CLSID_DirectDrawClipper: TGUID = '{593817A0-7DB3-11CF-A2DE-00AA00B93356}';
IID_IDirectDraw: TGUID = '{6C14DB80-A733-11CE-A521-0020AF0BE560}';
IID_IDirectDraw2: TGUID = '{B3A6F3E0-2B43-11CF-A2DE-00AA00B93356}';
IID_IDirectDraw4: TGUID = '{9C59509A-39BD-11D1-8C4A-00C04FD930C5}';
IID_IDirectDraw7: TGUID = '{15E65EC0-3B9C-11D2-B92F-00609797EA5B}';
IID_IDirectDrawSurface: TGUID = '{6C14DB81-A733-11CE-A521-0020AF0BE560}';
IID_IDirectDrawSurface2: TGUID = '{57805885-6EEC-11CF-9441-A82303C10E27}';
IID_IDirectDrawSurface3: TGUID = '{DA044E00-69B2-11D0-A1D5-00AA00B8DFBB}';
IID_IDirectDrawSurface4: TGUID = '{0B2B8630-AD35-11D0-8EA6-00609797EA5B}';
IID_IDirectDrawSurface7: TGUID = '{06675A80-3B9B-11D2-B92F-00609797EA5B}';
IID_IDirectDrawPalette: TGUID = '{6C14DB84-A733-11CE-A521-0020AF0BE560}';
IID_IDirectDrawClipper: TGUID = '{6C14DB85-A733-11CE-A521-0020AF0BE560}';
IID_IDirectDrawColorControl: TGUID = '{4B9F0EE0-0D7E-11D0-9B06-00A0C903A3B8}';
IID_IDirectDrawGammaControl: TGUID = '{69C11C3E-B46B-11D1-AD7A-00C04FC29B4E}';
 
const
DD_ROP_SPACE = (256 div 32); // space required to store ROP array
DD_ROP_SPACE = 256 div 32; // space required to store ROP array
 
MAX_DDDEVICEID_STRING = 512;
MAX_DDDEVICEID_STRING = 512;
 
(*
* Flags for the IDirectDraw4::GetDeviceIdentifier method
*)
{ DirectDraw Structures }
 
(*
* This flag causes GetDeviceIdentifier to return information about the host (typically 2D) adapter in a system equipped
* with a stacked secondary 3D adapter. Such an adapter appears to the application as if it were part of the
* host adapter, but is typically physcially located on a separate card. The stacked secondary's information is
* returned when GetDeviceIdentifier's dwFlags field is zero, since this most accurately reflects the qualities
* of the DirectDraw object involved.
*)
DDGDI_GETHOSTIDENTIFIER = $00000001;
 
(*============================================================================
*
* DirectDraw Structures
*
* Various structures used to invoke DirectDraw.
*
*==========================================================================*)
 
var
NilGUID : TGUID{$IfNDef VER6UP} absolute 0{$EndIf};
 
type
TRefGUID = packed record
case integer of
1: (guid : PGUID);
2: (dwFlags : DWORD);
end;
 
IDirectDraw = interface;
IDirectDraw2 = interface;
IDirectDraw4 = interface;
147,168 → 146,200
IDirectDrawSurface3 = interface;
IDirectDrawSurface4 = interface;
IDirectDrawSurface7 = interface;
 
IDirectDrawPalette = interface;
IDirectDrawClipper = interface;
IDirectDrawColorControl = interface;
IDirectDrawGammaControl = interface;
 
(*
* Generic pixel format with 8-bit RGB and alpha components
*)
{ TDDARGB structure }
 
PDDARGB = ^TDDARGB;
TDDARGB = packed record
blue: BYTE;
green: BYTE;
red: BYTE;
alpha: BYTE;
TDDARGB = record
Blue: Byte;
Green: Byte;
Red: Byte;
Alpha: Byte;
end;
 
(*
* This version of the structure remains for backwards source compatibility.
* The DDARGB structure is the one that should be used for all DirectDraw APIs.
*)
DDARGB = TDDARGB;
LPDDARGB = PDDARGB;
 
{ TDDRGBA structure }
 
PDDRGBA = ^TDDRGBA;
TDDRGBA = packed record
red : BYTE;
green : BYTE;
blue : BYTE;
alpha : BYTE;
TDDRGBA = record
Red: Byte;
Green: Byte;
Blue: Byte;
Alpha: Byte;
end;
 
(*
* TDDColorKey
*)
DDRGBA = TDDRGBA;
LPDDRGBA = PDDRGBA;
 
{ TDDColorKey structure }
 
PDDColorKey = ^TDDColorKey;
TDDColorKey = packed record
TDDColorKey = record
dwColorSpaceLowValue: DWORD; // low boundary of color space that is to
// be treated as Color Key, inclusive
// be treated as Color Key, inclusive
dwColorSpaceHighValue: DWORD; // high boundary of color space that is
// to be treated as Color Key, inclusive
// to be treated as Color Key, inclusive
end;
 
// Delphi 5 can't handle interface in variant records
// so we have to use pointers instead (which can be type-casted into interfaces):
DDCOLORKEY = TDDColorKey;
LPDDCOLORKEY = PDDColorKey;
 
{$IFDEF VER5UP}
PDirectDrawSurface = Pointer;
{$ELSE}
PDirectDrawSurface = IDirectDrawSurface;
{$ENDIF}
{ TDDBltFX structure }
 
(*
* TDDBltFX
* Used to pass override information to the DIRECTDRAWSURFACE callback Blt.
*)
PDDBltFX = ^TDDBltFX;
TDDBltFX = packed record
dwSize : DWORD; // size of structure
dwDDFX : DWORD; // FX operations
dwROP : DWORD; // Win32 raster operations
dwDDROP : DWORD; // Raster operations new for DirectDraw
dwRotationAngle : DWORD; // Rotation angle for blt
dwZBufferOpCode : DWORD; // ZBuffer compares
dwZBufferLow : DWORD; // Low limit of Z buffer
dwZBufferHigh : DWORD; // High limit of Z buffer
dwZBufferBaseDest : DWORD; // Destination base value
dwZDestConstBitDepth : DWORD; // Bit depth used to specify Z constant for destination
case integer of
TDDBltFX = record
dwSize: DWORD; // size of structure
dwDDFX: DWORD; // FX operations
dwROP: DWORD; // Win32 raster operations
dwDDROP: DWORD; // Raster operations new for DirectDraw
dwRotationAngle: DWORD; // Rotation angle for blt
dwZBufferOpCode: DWORD; // ZBuffer compares
dwZBufferLow: DWORD; // Low limit of Z buffer
dwZBufferHigh: DWORD; // High limit of Z buffer
dwZBufferBaseDest: DWORD; // Destination base value
dwZDestConstBitDepth: DWORD; // Bit depth used to specify Z constant for destination
case Integer of
0: (
dwZDestConst : DWORD // Constant to use as Z buffer for dest
);
dwZDestConst: DWORD; // Constant to use as Z buffer for dest
dwZSrcConstBitDepth: DWORD; // Bit depth used to specify Z constant for source
dwZSrcConst: DWORD; // Constant to use as Z buffer for src
dwAlphaEdgeBlendBitDepth: DWORD; // Bit depth used to specify constant for alpha edge blend
dwAlphaEdgeBlend: DWORD; // Alpha for edge blending
dwReserved: DWORD;
dwAlphaDestConstBitDepth: DWORD; // Bit depth used to specify alpha constant for destination
dwAlphaDestConst: DWORD; // Constant to use as Alpha Channel
dwAlphaSrcConstBitDepth: DWORD; // Bit depth used to specify alpha constant for source
dwAlphaSrcConst: DWORD; // Constant to use as Alpha Channel
dwFillColor: DWORD; // color in RGB or Palettized
ddckDestColorkey: TDDColorKey; // DestColorkey override
ddckSrcColorkey: TDDColorKey; // SrcColorkey override
);
1: (
lpDDSZBufferDest : PDirectDrawSurface; // Surface to use as Z buffer for dest
dwZSrcConstBitDepth : DWORD; // Bit depth used to specify Z constant for source
case integer of
0: (
dwZSrcConst : DWORD; // Constant to use as Z buffer for src
);
1: (
lpDDSZBufferSrc : PDirectDrawSurface; // Surface to use as Z buffer for src
dwAlphaEdgeBlendBitDepth : DWORD; // Bit depth used to specify constant for alpha edge blend
dwAlphaEdgeBlend : DWORD; // Alpha for edge blending
dwReserved : DWORD;
dwAlphaDestConstBitDepth : DWORD; // Bit depth used to specify alpha constant for destination
case integer of
0: (
dwAlphaDestConst : DWORD; // Constant to use as Alpha Channel
);
1: (
lpDDSAlphaDest : PDirectDrawSurface; // Surface to use as Alpha Channel
dwAlphaSrcConstBitDepth : DWORD; // Bit depth used to specify alpha constant for source
case integer of
0: (
dwAlphaSrcConst : DWORD; // Constant to use as Alpha Channel
);
1: (
lpDDSAlphaSrc : PDirectDrawSurface; // Surface to use as Alpha Channel
case integer of
0: (
dwFillColor : DWORD; // color in RGB or Palettized
);
1: (
dwFillDepth : DWORD; // depth value for z-buffer
);
2: (
dwFillPixel : DWORD; // pixel value
);
3: (
lpDDSPattern : PDirectDrawSurface; // Surface to use as pattern
ddckDestColorkey : TDDColorKey; // DestColorkey override
ddckSrcColorkey : TDDColorKey; // SrcColorkey override
)
)
)
)
)
lpDDSZBufferDest: Pointer{IDirectDrawSurface}; // Surface to use as Z buffer for dest
_union1b: DWORD;
lpDDSZBufferSrc: Pointer{IDirectDrawSurface}; // Surface to use as Z buffer for src
_union1d: DWORD;
_union1e: DWORD;
_union1f: DWORD;
_union1g: DWORD;
lpDDSAlphaDest: Pointer{IDirectDrawSurface}; // Surface to use as Alpha Channel
_union1i: DWORD;
lpDDSAlphaSrc: Pointer{IDirectDrawSurface}; // Surface to use as Alpha Channel
dwFillDepth: DWORD; // depth value for z-buffer
);
2: (
_union2a: DWORD;
_union2b: DWORD;
_union2c: DWORD;
_union2d: DWORD;
_union2e: DWORD;
_union2f: DWORD;
_union2g: DWORD;
_union2h: DWORD;
_union2i: DWORD;
_union2j: DWORD;
lpDDSPattern: Pointer{IDirectDrawSurface}; // Surface to use as pattern
);
end;
 
(*
* TDDSCaps
*)
DDBLTFX = TDDBltFX;
LPDDBLTFX = PDDBltFX;
 
{ TDDSCaps structure }
 
PDDSCaps = ^TDDSCaps;
TDDSCaps = packed record
TDDSCaps = record
dwCaps: DWORD; // capabilities of surface wanted
end;
 
(*
* TDDOSCaps
*)
DDSCAPS = TDDSCaps;
LPDDSCAPS = PDDSCaps;
{ TDDOSCaps structure }
 
PDDOSCaps = ^TDDOSCaps;
TDDOSCaps = packed record
TDDOSCaps = record
dwCaps: DWORD; // capabilities of surface wanted
end;
 
(*
* This structure is used internally by DirectDraw.
*)
DDOSCAPS = TDDOSCaps;
LPDDOSCAPS = PDDOSCaps;
 
 
{ TDDSCapsEx structure }
 
PDDSCapsEx = ^TDDSCapsEx;
TDDSCapsEx = packed record
dwCaps2 : DWORD;
dwCaps3 : DWORD;
dwCaps4 : DWORD;
TDDSCapsEx = record
dwCaps2: DWORD;
dwCaps3: DWORD;
dwCaps4: DWORD;
end;
 
(*
* TDDSCaps2
*)
DDSCAPSEX = TDDSCapsEx;
LPDDSCAPSEX = PDDSCapsEx;
 
{ TDDSCaps2 structure }
 
PDDSCaps2 = ^TDDSCaps2;
TDDSCaps2 = packed record
TDDSCaps2 = record
dwCaps: DWORD; // capabilities of surface wanted
dwCaps2 : DWORD;
dwCaps3 : DWORD;
dwCaps4 : DWORD;
dwCaps2: DWORD;
dwCaps3: DWORD;
dwCaps4: DWORD;
end;
 
(*
* TDDCaps
*)
(*
* This structure is the TDDCaps structure as it was in version 2 and 3 of Direct X.
* It is present for back compatability.
*)
DDSCAPS2 = TDDSCaps2;
LPDDSCAPS2 = PDDSCaps2;
 
{ TDDCaps structure }
 
PDDCaps_DX1 = ^TDDCaps_DX1;
TDDCaps_DX1 = record
dwSize: DWORD; // size of the DDDRIVERCAPS structure
dwCaps: DWORD; // driver specific capabilities
dwCaps2: DWORD; // more driver specific capabilites
dwCKeyCaps: DWORD; // color key capabilities of the surface
dwFXCaps: DWORD; // driver specific stretching and effects capabilites
dwFXAlphaCaps: DWORD; // alpha driver specific capabilities
dwPalCaps: DWORD; // palette capabilities
dwSVCaps: DWORD; // stereo vision capabilities
dwAlphaBltConstBitDepths: DWORD; // DDBD_2,4,8
dwAlphaBltPixelBitDepths: DWORD; // DDBD_1,2,4,8
dwAlphaBltSurfaceBitDepths: DWORD; // DDBD_1,2,4,8
dwAlphaOverlayConstBitDepths: DWORD; // DDBD_2,4,8
dwAlphaOverlayPixelBitDepths: DWORD; // DDBD_1,2,4,8
dwAlphaOverlaySurfaceBitDepths: DWORD; // DDBD_1,2,4,8
dwZBufferBitDepths: DWORD; // DDBD_8,16,24,32
dwVidMemTotal: DWORD; // total amount of video memory
dwVidMemFree: DWORD; // amount of free video memory
dwMaxVisibleOverlays: DWORD; // maximum number of visible overlays
dwCurrVisibleOverlays: DWORD; // current number of visible overlays
dwNumFourCCCodes: DWORD; // number of four cc codes
dwAlignBoundarySrc: DWORD; // source rectangle alignment
dwAlignSizeSrc: DWORD; // source rectangle byte size
dwAlignBoundaryDest: DWORD; // dest rectangle alignment
dwAlignSizeDest: DWORD; // dest rectangle byte size
dwAlignStrideAlign: DWORD; // stride alignment
dwRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
ddsCaps: TDDSCaps; // TDDSCaps structure has all the general capabilities
dwMinOverlayStretch: DWORD; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxOverlayStretch: DWORD; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMinLiveVideoStretch: DWORD; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxLiveVideoStretch: DWORD; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMinHwCodecStretch: DWORD; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxHwCodecStretch: DWORD; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwReserved1: DWORD; // reserved
dwReserved2: DWORD; // reserved
dwReserved3: DWORD; // reserved
end;
 
PDDCaps_DX3 = ^TDDCaps_DX3;
TDDCaps_DX3 = packed record
TDDCaps_DX3 = record
dwSize: DWORD; // size of the DDDRIVERCAPS structure
dwCaps: DWORD; // driver specific capabilities
dwCaps2: DWORD; // more driver specific capabilites
334,7 → 365,7
dwAlignBoundaryDest: DWORD; // dest rectangle alignment
dwAlignSizeDest: DWORD; // dest rectangle byte size
dwAlignStrideAlign: DWORD; // stride alignment
dwRops: Array [0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
dwRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
ddsCaps: TDDSCaps; // TDDSCaps structure has all the general capabilities
dwMinOverlayStretch: DWORD; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxOverlayStretch: DWORD; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
348,26 → 379,22
dwSVBCaps: DWORD; // driver specific capabilities for System->Vmem blts
dwSVBCKeyCaps: DWORD; // driver color key capabilities for System->Vmem blts
dwSVBFXCaps: DWORD; // driver FX capabilities for System->Vmem blts
dwSVBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwSVBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwVSBCaps: DWORD; // driver specific capabilities for Vmem->System blts
dwVSBCKeyCaps: DWORD; // driver color key capabilities for Vmem->System blts
dwVSBFXCaps: DWORD; // driver FX capabilities for Vmem->System blts
dwVSBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwVSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwSSBCaps: DWORD; // driver specific capabilities for System->System blts
dwSSBCKeyCaps: DWORD; // driver color key capabilities for System->System blts
dwSSBFXCaps: DWORD; // driver FX capabilities for System->System blts
dwSSBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
dwReserved4 : DWORD;
dwReserved5 : DWORD;
dwReserved6 : DWORD;
dwSSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
dwReserved4: DWORD; // reserved
dwReserved5: DWORD; // reserved
dwReserved6: DWORD; // reserved
end;
 
(*
* This structure is the TDDCaps structure as it was in version 5 of Direct X.
* It is present for back compatability.
*)
PDDCaps_DX5 = ^TDDCaps_DX5;
TDDCaps_DX5 = packed record
TDDCaps_DX5 = record
dwSize: DWORD; // size of the DDDRIVERCAPS structure
dwCaps: DWORD; // driver specific capabilities
dwCaps2: DWORD; // more driver specific capabilites
393,7 → 420,7
dwAlignBoundaryDest: DWORD; // dest rectangle alignment
dwAlignSizeDest: DWORD; // dest rectangle byte size
dwAlignStrideAlign: DWORD; // stride alignment
dwRops: Array [0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
dwRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
ddsCaps: TDDSCaps; // TDDSCaps structure has all the general capabilities
dwMinOverlayStretch: DWORD; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxOverlayStretch: DWORD; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
407,33 → 434,96
dwSVBCaps: DWORD; // driver specific capabilities for System->Vmem blts
dwSVBCKeyCaps: DWORD; // driver color key capabilities for System->Vmem blts
dwSVBFXCaps: DWORD; // driver FX capabilities for System->Vmem blts
dwSVBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwSVBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwVSBCaps: DWORD; // driver specific capabilities for Vmem->System blts
dwVSBCKeyCaps: DWORD; // driver color key capabilities for Vmem->System blts
dwVSBFXCaps: DWORD; // driver FX capabilities for Vmem->System blts
dwVSBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwVSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwSSBCaps: DWORD; // driver specific capabilities for System->System blts
dwSSBCKeyCaps: DWORD; // driver color key capabilities for System->System blts
dwSSBFXCaps: DWORD; // driver FX capabilities for System->System blts
dwSSBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
// Members added for DX5:
dwMaxVideoPorts: DWORD; // maximum number of usable video ports
dwCurrVideoPorts: DWORD; // current number of video ports used
dwSVBCaps2: DWORD; // more driver specific capabilities for System->Vmem blts
dwNLVBCaps: DWORD; // driver specific capabilities for non-local->local vidmem blts
dwNLVBCaps2: DWORD; // more driver specific capabilities non-local->local vidmem blts
dwNLVBCKeyCaps: DWORD; // driver color key capabilities for non-local->local vidmem blts
dwNLVBFXCaps: DWORD; // driver FX capabilities for non-local->local blts
dwNLVBRops: Array [0..DD_ROP_SPACE-1] of DWORD; // ROPS supported for non-local->local blts
dwSSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
{ Members added for DX5 }
dwMaxVideoPorts: DWORD; // maximum number of usable video ports
dwCurrVideoPorts: DWORD; // current number of video ports used
dwSVBCaps2: DWORD; // more driver specific capabilities for System->Vmem blts
dwNLVBCaps: DWORD; // driver specific capabilities for non-local->local vidmem blts
dwNLVBCaps2: DWORD; // more driver specific capabilities non-local->local vidmem blts
dwNLVBCKeyCaps: DWORD; // driver color key capabilities for non-local->local vidmem blts
dwNLVBFXCaps: DWORD; // driver FX capabilities for non-local->local blts
dwNLVBRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported for non-local->local blts
end;
 
PDDCaps_DX6 = ^TDDCaps_DX6;
TDDCaps_DX6 = packed record
TDDCaps_DX6 = record
dwSize: DWORD; // size of the DDDRIVERCAPS structure
dwCaps: DWORD; // driver specific capabilities
dwCaps2: DWORD; // more driver specific capabilites
dwCKeyCaps: DWORD; // color key capabilities of the surface
dwFXCaps: DWORD; // driver specific stretching and effects capabilites
dwFXAlphaCaps: DWORD; // alpha caps
dwPalCaps: DWORD; // palette capabilities
dwSVCaps: DWORD; // stereo vision capabilities
dwAlphaBltConstBitDepths: DWORD; // DDBD_2,4,8
dwAlphaBltPixelBitDepths: DWORD; // DDBD_1,2,4,8
dwAlphaBltSurfaceBitDepths: DWORD; // DDBD_1,2,4,8
dwAlphaOverlayConstBitDepths: DWORD; // DDBD_2,4,8
dwAlphaOverlayPixelBitDepths: DWORD; // DDBD_1,2,4,8
dwAlphaOverlaySurfaceBitDepths: DWORD; // DDBD_1,2,4,8
dwZBufferBitDepths: DWORD; // DDBD_8,16,24,32
dwVidMemTotal: DWORD; // total amount of video memory
dwVidMemFree: DWORD; // amount of free video memory
dwMaxVisibleOverlays: DWORD; // maximum number of visible overlays
dwCurrVisibleOverlays: DWORD; // current number of visible overlays
dwNumFourCCCodes: DWORD; // number of four cc codes
dwAlignBoundarySrc: DWORD; // source rectangle alignment
dwAlignSizeSrc: DWORD; // source rectangle byte size
dwAlignBoundaryDest: DWORD; // dest rectangle alignment
dwAlignSizeDest: DWORD; // dest rectangle byte size
dwAlignStrideAlign: DWORD; // stride alignment
dwRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
ddsOldCaps: TDDSCaps; // Was TDDSCaps ddsCaps. ddsCaps is of type DDSCAPS2 for DX6
dwMinOverlayStretch: DWORD; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxOverlayStretch: DWORD; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMinLiveVideoStretch: DWORD; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxLiveVideoStretch: DWORD; // maximum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMinHwCodecStretch: DWORD; // minimum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxHwCodecStretch: DWORD; // maximum hardware codec stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwReserved1: DWORD; // reserved
dwReserved2: DWORD; // reserved
dwReserved3: DWORD; // reserved
dwSVBCaps: DWORD; // driver specific capabilities for System->Vmem blts
dwSVBCKeyCaps: DWORD; // driver color key capabilities for System->Vmem blts
dwSVBFXCaps: DWORD; // driver FX capabilities for System->Vmem blts
dwSVBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwVSBCaps: DWORD; // driver specific capabilities for Vmem->System blts
dwVSBCKeyCaps: DWORD; // driver color key capabilities for Vmem->System blts
dwVSBFXCaps: DWORD; // driver FX capabilities for Vmem->System blts
dwVSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwSSBCaps: DWORD; // driver specific capabilities for System->System blts
dwSSBCKeyCaps: DWORD; // driver color key capabilities for System->System blts
dwSSBFXCaps: DWORD; // driver FX capabilities for System->System blts
dwSSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
{ Members added for DX5 }
dwMaxVideoPorts: DWORD; // maximum number of usable video ports
dwCurrVideoPorts: DWORD; // current number of video ports used
dwSVBCaps2: DWORD; // more driver specific capabilities for System->Vmem blts
dwNLVBCaps: DWORD; // driver specific capabilities for non-local->local vidmem blts
dwNLVBCaps2: DWORD; // more driver specific capabilities non-local->local vidmem blts
dwNLVBCKeyCaps: DWORD; // driver color key capabilities for non-local->local vidmem blts
dwNLVBFXCaps: DWORD; // driver FX capabilities for non-local->local blts
dwNLVBRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported for non-local->local blts
{ Members added for DX6 }
ddsCaps: TDDSCaps2; // Surface Caps
end;
 
PDDCaps_DX7 = ^TDDCaps_DX7;
TDDCaps_DX7 = record
dwSize: DWORD; // size of the DDDRIVERCAPS structure
dwCaps: DWORD; // driver specific capabilities
dwCaps2: DWORD; // more driver specific capabilites
dwCKeyCaps: DWORD; // color key capabilities of the surface
dwFXCaps: DWORD; // driver specific stretching and effects capabilites
dwFXAlphaCaps: DWORD; // alpha driver specific capabilities
dwPalCaps: DWORD; // palette capabilities
dwSVCaps: DWORD; // stereo vision capabilities
454,8 → 544,8
dwAlignBoundaryDest: DWORD; // dest rectangle alignment
dwAlignSizeDest: DWORD; // dest rectangle byte size
dwAlignStrideAlign: DWORD; // stride alignment
dwRops: Array [0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
ddsOldCaps: TDDSCaps; // Was dssCaps: TDDSCaps. ddsCaps is of type TDDScaps2 for DX6
dwRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported
ddsOldCaps: TDDSCaps; // Was TDDSCaps ddsCaps. ddsCaps is of type DDSCAPS2 for DX6
dwMinOverlayStretch: DWORD; // minimum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMaxOverlayStretch: DWORD; // maximum overlay stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
dwMinLiveVideoStretch: DWORD; // minimum live video stretch factor multiplied by 1000, eg 1000 == 1.0, 1300 == 1.3
468,156 → 558,115
dwSVBCaps: DWORD; // driver specific capabilities for System->Vmem blts
dwSVBCKeyCaps: DWORD; // driver color key capabilities for System->Vmem blts
dwSVBFXCaps: DWORD; // driver FX capabilities for System->Vmem blts
dwSVBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwSVBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->Vmem blts
dwVSBCaps: DWORD; // driver specific capabilities for Vmem->System blts
dwVSBCKeyCaps: DWORD; // driver color key capabilities for Vmem->System blts
dwVSBFXCaps: DWORD; // driver FX capabilities for Vmem->System blts
dwVSBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwVSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for Vmem->System blts
dwSSBCaps: DWORD; // driver specific capabilities for System->System blts
dwSSBCKeyCaps: DWORD; // driver color key capabilities for System->System blts
dwSSBFXCaps: DWORD; // driver FX capabilities for System->System blts
dwSSBRops: Array [0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
// Members added for DX5:
dwMaxVideoPorts: DWORD; // maximum number of usable video ports
dwCurrVideoPorts: DWORD; // current number of video ports used
dwSVBCaps2: DWORD; // more driver specific capabilities for System->Vmem blts
dwNLVBCaps: DWORD; // driver specific capabilities for non-local->local vidmem blts
dwNLVBCaps2: DWORD; // more driver specific capabilities non-local->local vidmem blts
dwNLVBCKeyCaps: DWORD; // driver color key capabilities for non-local->local vidmem blts
dwNLVBFXCaps: DWORD; // driver FX capabilities for non-local->local blts
dwNLVBRops: Array [0..DD_ROP_SPACE-1] of DWORD; // ROPS supported for non-local->local blts
// Members added for DX6 release
ddsCaps : TDDSCaps2 ; // Surface Caps
dwSSBRops: array[0..DD_ROP_SPACE-1] of DWORD;// ROPS supported for System->System blts
{ Members added for DX5 }
dwMaxVideoPorts: DWORD; // maximum number of usable video ports
dwCurrVideoPorts: DWORD; // current number of video ports used
dwSVBCaps2: DWORD; // more driver specific capabilities for System->Vmem blts
dwNLVBCaps: DWORD; // driver specific capabilities for non-local->local vidmem blts
dwNLVBCaps2: DWORD; // more driver specific capabilities non-local->local vidmem blts
dwNLVBCKeyCaps: DWORD; // driver color key capabilities for non-local->local vidmem blts
dwNLVBFXCaps: DWORD; // driver FX capabilities for non-local->local blts
dwNLVBRops: array[0..DD_ROP_SPACE-1] of DWORD; // ROPS supported for non-local->local blts
{ Members added for DX6 }
ddsCaps: TDDSCaps2; // Surface Caps
end;
 
TDDCaps_DX7 = TDDCaps_DX6;
PDDCaps = ^TDDCaps;
 
{$IFDEF DIRECTX3}
{$IFDEF DirectX1}
TDDCaps = TDDCaps_DX1;
PDDCaps = PDDCaps_DX1;
{$ENDIF}{$IFDEF DirectX3}
TDDCaps = TDDCaps_DX3;
{$ELSE}
{$IFDEF DIRECTX5}
TDDCaps = TDDCaps_DX5;
{$ELSE}
{$IFDEF DIRECTX6}
TDDCaps = TDDCaps_DX6;
{$ELSE}
TDDCaps = TDDCaps_DX7;
{$ENDIF}
{$ENDIF}
PDDCaps = PDDCaps_DX3;
{$ENDIF}{$IFDEF DirectX5}
TDDCaps = TDDCaps_DX5;
PDDCaps = PDDCaps_DX5;
{$ENDIF}{$IFDEF DirectX6}
TDDCaps = TDDCaps_DX6;
PDDCaps = PDDCaps_DX6;
{$ENDIF}{$IFDEF DirectX7}
TDDCaps = TDDCaps_DX7;
PDDCaps = PDDCaps_DX7;
{$ENDIF}
 
DDCAPS = TDDCaps;
LPDDCAPS = PDDCaps;
 
{ TDDPixelFormat structure }
 
 
(*
* TDDPixelFormat
*)
PDDPixelFormat_DX5 = ^TDDPixelFormat_DX5;
TDDPixelFormat_DX5 = packed record
dwSize: DWORD; // size of structure
dwFlags: DWORD; // pixel format flags
dwFourCC: DWORD; // (FOURCC code)
PDDPixelFormat = ^TDDPixelFormat;
TDDPixelFormat = record
dwSize: DWORD; // size of structure
dwFlags: DWORD; // pixel format flags
dwFourCC: DWORD; // (FOURCC code)
case Integer of
0: (
dwZBufferBitDepth: DWORD; // how many bits for z buffers
);
1: (
dwAlphaBitDepth: DWORD; // how many bits for alpha channels
);
2: (
dwRGBBitCount: DWORD; // how many bits per pixel
dwRBitMask: DWORD; // mask for red bit
dwGBitMask: DWORD; // mask for green bits
dwBBitMask: DWORD; // mask for blue bits
dwRGBAlphaBitMask: DWORD; // mask for alpha channel
);
3: (
dwYUVBitCount: DWORD; // how many bits per pixel
dwYBitMask: DWORD; // mask for Y bits
dwUBitMask: DWORD; // mask for U bits
dwVBitMask: DWORD; // mask for V bits
case Integer of
0: (
dwYUVAlphaBitMask: DWORD; // mask for alpha channel
);
dwRGBBitCount: DWORD; // how many bits per pixel
dwRBitMask: DWORD; // mask for red bit
dwGBitMask: DWORD; // mask for green bits
dwBBitMask: DWORD; // mask for blue bits
dwRGBAlphaBitMask: DWORD; // mask for alpha channel
);
1: (
dwRGBZBitMask: DWORD;
);
_union1a: DWORD;
_union1b: DWORD;
_union1c: DWORD;
_union1d: DWORD;
dwRGBZBitMask: DWORD; // mask for Z channel
);
2: (
dwYUVZBitMask: DWORD;
);
);
end;
 
PDDPixelFormat_DX6 = ^TDDPixelFormat_DX6;
TDDPixelFormat_DX6 = packed record
dwSize: DWORD; // size of structure
dwFlags: DWORD; // pixel format flags
dwFourCC: DWORD; // (FOURCC code)
case Integer of
1: (
dwRGBBitCount : DWORD; // how many bits per pixel
dwRBitMask : DWORD; // mask for red bit
dwGBitMask : DWORD; // mask for green bits
dwBBitMask : DWORD; // mask for blue bits
dwRGBAlphaBitMask : DWORD; // mask for alpha channel
);
2: (
dwYUVBitCount : DWORD; // how many bits per pixel
dwYBitMask : DWORD; // mask for Y bits
dwUBitMask : DWORD; // mask for U bits
dwVBitMask : DWORD; // mask for V bits
dwYUVAlphaBitMask : DWORD; // mask for alpha channel
);
dwYUVBitCount: DWORD; // how many bits per pixel
dwYBitMask: DWORD; // mask for Y bits
dwUBitMask: DWORD; // mask for U bits
dwVBitMask: DWORD; // mask for V bits
dwYUVAlphaBitMask: DWORD; // mask for alpha channel
);
3: (
dwZBufferBitDepth : DWORD; // how many total bits/pixel in z buffer (including any stencil bits)
dwStencilBitDepth : DWORD; // how many stencil bits (note: dwZBufferBitDepth-dwStencilBitDepth is total Z-only bits)
dwZBitMask : DWORD; // mask for Z bits
dwStencilBitMask : DWORD; // mask for stencil bits
dwLuminanceAlphaBitMask : DWORD;// mask for alpha channel
);
_union3a: DWORD;
_union3b: DWORD;
_union3c: DWORD;
_union3d: DWORD;
dwYUVZBitMask: DWORD; // mask for Z channel
);
4: (
dwAlphaBitDepth : DWORD; // how many bits for alpha channels
dwLuminanceBitMask : DWORD; // mask for luminance bits
dwBumpDvBitMask : DWORD; // mask for bump map V delta bits
dwBumpLuminanceBitMask : DWORD; // mask for luminance in bump map
dwRGBZBitMask : DWORD; // mask for Z channel
);
dwZBufferBitDepth: DWORD; // how many bits for z buffers
dwStencilBitDepth: DWORD; // how many stencil bits (note: dwZBufferBitDepth-dwStencilBitDepth is total Z-only bits)
dwZBitMask: DWORD; // mask for Z bits
dwStencilBitMask: DWORD; // mask for stencil bits
);
5: (
dwLuminanceBitCount : DWORD; // how many bits per pixel
dwBumpDuBitMask : DWORD; // mask for bump map U delta bits
Fill1, Fill2 : DWORD;
dwYUVZBitMask : DWORD; // mask for Z channel
);
6: ( dwBumpBitCount : DWORD; // how many bits per "buxel", total
);
dwAlphaBitDepth: DWORD; // how many bits for alpha channels
);
6: (
dwLuminanceBitCount: DWORD; // how many bits per pixel
dwLuminanceBitMask: DWORD; // mask for luminance bits
_union6c: DWORD;
_union6d: DWORD;
dwLuminanceAlphaBitMask: DWORD;
);
7: (
dwBumpBitCount: DWORD; // how many bits per "buxel", total
dwBumpDuBitMask: DWORD; // mask for bump map U delta bits
dwBumpDvBitMask: DWORD; // mask for bump map V delta bits
dwBumpLuminanceBitMask: DWORD; // mask for luminance in bump map
);
end;
 
TDDPixelFormat_DX3 = TDDPixelFormat_DX5;
TDDPixelFormat_DX7 = TDDPixelFormat_DX6;
DDPIXELFORMAT = TDDPixelFormat;
LPDDPIXELFORMAT = PDDPixelFormat;
 
PDDPixelFormat = ^TDDPixelFormat;
{$IFDEF DIRECTX3}
TDDPixelFormat = TDDPixelFormat_DX3;
{$ELSE}
{$IFDEF DIRECTX5}
TDDPixelFormat = TDDPixelFormat_DX5;
{$ELSE}
{$IFDEF DIRECTX6}
TDDPixelFormat = TDDPixelFormat_DX6;
{$ELSE}
TDDPixelFormat = TDDPixelFormat_DX7;
{$ENDIF}
{$ENDIF}
{$ENDIF}
{ DDOVERLAYFX structure }
 
(*
* TDDOverlayFX
*)
PDDOverlayFX = ^TDDOverlayFX;
TDDOverlayFX = packed record
PDDOverlayFx = ^TDDOverlayFx;
TDDOverlayFx = record
dwSize: DWORD; // size of structure
dwAlphaEdgeBlendBitDepth: DWORD; // Bit depth used to specify constant for alpha edge blend
dwAlphaEdgeBlend: DWORD; // Constant to use as alpha for edge blend
625,49 → 674,166
dwAlphaDestConstBitDepth: DWORD; // Bit depth used to specify alpha constant for destination
case Integer of
0: (
dwAlphaDestConst: DWORD; // Constant to use as alpha channel for dest
dwAlphaSrcConstBitDepth: DWORD; // Bit depth used to specify alpha constant for source
dwAlphaSrcConst: DWORD; // Constant to use as alpha channel for src
dckDestColorkey: TDDColorKey; // DestColorkey override
dckSrcColorkey: TDDColorKey; // DestColorkey override
dwDDFX: DWORD; // Overlay FX
dwFlags: DWORD; // flags
);
dwAlphaDestConst: DWORD; // Constant to use as alpha channel for dest
dwAlphaSrcConstBitDepth: DWORD; // Bit depth used to specify alpha constant for source
dwAlphaSrcConst: DWORD; // Constant to use as alpha channel for src
dckDestColorkey: TDDColorKey; // DestColorkey override
dckSrcColorkey: TDDColorKey; // DestColorkey override
dwDDFX: DWORD; // Overlay FX
dwFlags: DWORD; // flags
);
1: (
lpDDSAlphaDest: PDirectDrawSurface; // Surface to use as alpha channel for dest
filler: DWORD;
lpDDSAlphaSrc: PDirectDrawSurface; // Surface to use as alpha channel for src
);
lpDDSAlphaDest: Pointer{IDirectDrawSurface}; // Surface to use as alpha channel for dest
_union1b: DWORD;
lpDDSAlphaSrc: Pointer{IDirectDrawSurface}; // Surface to use as alpha channel for src
);
end;
 
(*
* TDDBltBatch: BltBatch entry structure
*)
DDOVERLAYFX = TDDOverlayFx;
LPDDOVERLAYFX = PDDOverlayFx;
 
{ TDDBltBatch structure }
 
PDDBltBatch = ^TDDBltBatch;
TDDBltBatch = packed record
TDDBltBatch = record
lprDest: PRect;
lpDDSSrc: IDirectDrawSurface;
lprSrc: PRect;
dwFlags: DWORD;
lpDDBltFx: TDDBltFX;
lpDDBltFx: PDDBltFX;
end;
 
(*
* TDDGammaRamp
*)
DDBLTBATCH = TDDBltBatch;
LPDDBLTBATCH = PDDBltBatch;
 
{ TDDSurfaceDesc structure }
 
PDDSurfaceDesc = ^TDDSurfaceDesc;
TDDSurfaceDesc = record
dwSize: DWORD; // size of the TDDSurfaceDesc structure
dwFlags: DWORD; // determines what fields are valid
dwHeight: DWORD; // height of surface to be created
dwWidth: DWORD; // width of input surface
case Integer of
0: (
lPitch: Longint;
dwBackBufferCount: DWORD; // number of back buffers requested
case Integer of
0: (
dwMipMapCount: DWORD; // number of mip-map levels requested
dwAlphaBitDepth: DWORD; // depth of alpha buffer requested
dwReserved: DWORD; // reserved
lpSurface: Pointer; // pointer to the associated surface memory
ddckCKDestOverlay: TDDColorKey;// color key for destination overlay use
ddckCKDestBlt: TDDColorKey; // color key for destination blt use
ddckCKSrcOverlay: TDDColorKey; // color key for source overlay use
ddckCKSrcBlt: TDDColorKey; // color key for source blt use
ddpfPixelFormat: TDDPixelFormat;// pixel format description of the surface
ddsCaps: TDDSCaps; // direct draw surface capabilities
);
1: (
dwZBufferBitDepth: DWORD; // depth of Z buffer requested
);
2: (
dwRefreshRate: DWORD; // refresh rate (used when display mode is described)
);
);
1: (
dwLinearSize: DWORD
);
end;
 
DDSURFACEDESC = TDDSurfaceDesc;
LPDDSURFACEDESC = PDDSurfaceDesc;
 
{ TDDSurfaceDesc2 structure }
 
PDDSurfaceDesc2 = ^TDDSurfaceDesc2;
TDDSurfaceDesc2 = record
dwSize: DWORD; // size of the TDDSurfaceDesc2 structure
dwFlags: DWORD; // determines what fields are valid
dwHeight: DWORD; // height of surface to be created
dwWidth: DWORD; // width of input surface
case Integer of
0: (
lPitch: Longint;
dwBackBufferCount: DWORD; // number of back buffers requested
case Integer of
0: (
dwMipMapCount: DWORD; // number of mip-map levels requested
dwAlphaBitDepth: DWORD; // depth of alpha buffer requested
dwReserved: DWORD; // reserved
lpSurface: Pointer; // pointer to the associated surface memory
ddckCKDestOverlay: TDDColorKey;// color key for destination overlay use
ddckCKDestBlt: TDDColorKey; // color key for destination blt use
ddckCKSrcOverlay: TDDColorKey; // color key for source overlay use
ddckCKSrcBlt: TDDColorKey; // color key for source blt use
ddpfPixelFormat: TDDPixelFormat;// pixel format description of the surface
ddsCaps: TDDSCaps2; // direct draw surface capabilities
dwTextureStage: DWORD; // stage in multitexture cascade
);
1: (
dwRefreshRate: DWORD; // refresh rate (used when display mode is described)
);
);
1: (
dwLinearSize: DWORD
);
end;
 
DDSURFACEDESC2 = TDDSurfaceDesc2;
LPDDSURFACEDESC2 = PDDSurfaceDesc2;
 
{ TDDOptSurfaceDesc structure }
 
PDDOptSurfaceDesc = ^TDDOptSurfaceDesc;
TDDOptSurfaceDesc = record
dwSize: DWORD; // size of the DDOPTSURFACEDESC structure
dwFlags: DWORD; // determines what fields are valid
ddSCaps: TDDSCaps2; // Common caps like: Memory type
ddOSCaps: TDDOSCaps; // Common caps like: Memory type
guid: TGUID; // Compression technique GUID
dwCompressionRatio: DWORD; // Compression ratio
end;
 
DDOPTSURFACEDESC = TDDOptSurfaceDesc;
LPDDOPTSURFACEDESC = PDDOptSurfaceDesc;
 
{ TDDColorControl structure }
 
PDDColorControl = ^TDDColorControl;
TDDColorControl = record
dwSize: DWORD;
dwFlags: DWORD;
lBrightness: Longint;
lContrast: Longint;
lHue: Longint;
lSaturation: Longint;
lSharpness: Longint;
lGamma: Longint;
lColorEnable: Longint;
dwReserved1: DWORD;
end;
 
DDCOLORCONTROL = TDDColorControl;
LPDDCOLORCONTROL = PDDCOLORCONTROL;
 
{ TDDGammaRamp structure }
 
PDDGammaRamp = ^TDDGammaRamp;
TDDGammaRamp = packed record
red : array[0..255] of WORD;
green : array[0..255] of WORD;
blue : array[0..255] of WORD;
TDDGammaRamp = record
Red: array[0..255] of Word;
Green: array[0..255] of Word;
Blue: array[0..255] of Word;
end;
 
(*
* This is the structure within which DirectDraw returns data about the current graphics driver and chipset
*)
DDGAMMARAMP = TDDGammaRamp;
LPDDGAMMARAMP = PDDGammaRamp;
 
{ TDDDeviceIdentifier structure }
 
PDDDeviceIdentifier = ^TDDDeviceIdentifier;
TDDDeviceIdentifier = packed record
TDDDeviceIdentifier = record
//
// These elements are for presentation to the user only. They should not be used to identify particular
// drivers, since this is unreliable and many different strings may be associated with the same
710,8 → 876,13
guidDeviceIdentifier: TGUID;
end;
 
DDDEVICEIDENTIFIER = TDDDeviceIdentifier;
LPDDDEVICEIDENTIFIER = PDDDeviceIdentifier;
 
{ TDDDeviceIdentifier2 structure }
 
PDDDeviceIdentifier2 = ^TDDDeviceIdentifier2;
TDDDeviceIdentifier2 = packed record
TDDDeviceIdentifier2 = record
//
// These elements are for presentation to the user only. They should not be used to identify particular
// drivers, since this is unreliable and many different strings may be associated with the same
753,4118 → 924,1229
//
guidDeviceIdentifier: TGUID;
 
(*
* This element is used to determine the Windows Hardware Quality Lab (WHQL)
* certification level for this driver/device pair.
*)
//
// This element is used to determine the Windows Hardware Quality Lab (WHQL)
// certification level for this driver/device pair.
//
dwWHQLLevel: DWORD;
end;
 
(*
* callbacks
*)
DDDEVICEIDENTIFIER2 = TDDDeviceIdentifier2;
LPDDDEVICEIDENTIFIER2 = PDDDeviceIdentifier2;
 
{ Callbacks }
 
TClipperCallback = function(lpDDClipper: IDirectDrawClipper; hWnd: HWND;
Code: DWORD; lpContext: Pointer): HResult; stdcall;
LPCLIPPERCALLBACK = TClipperCallback;
 
TSurfacesStreamingCallback = function(Arg: DWORD): HResult; stdcall;
LPSURFACESTREAMINGCALLBACK =TSurfacesStreamingCallback;
 
(*
* TDDSurfaceDesc
*)
PDDSurfaceDesc_DX5 = ^TDDSurfaceDesc_DX5;
TDDSurfaceDesc_DX5 = packed record
dwSize: DWORD; // size of the TDDSurfaceDesc structure
dwFlags: DWORD; // determines what fields are valid
dwHeight: DWORD; // height of surface to be created
dwWidth: DWORD; // width of input surface
case Integer of
0: (
dwLinearSize : DWORD; // unused at the moment
);
1: (
lPitch: LongInt; // distance to start of next line (return value only)
dwBackBufferCount: DWORD; // number of back buffers requested
case Integer of
0: (
dwMipMapCount: DWORD; // number of mip-map levels requested
dwAlphaBitDepth: DWORD; // depth of alpha buffer requested
dwReserved: DWORD; // reserved
lpSurface: Pointer; // pointer to the associated surface memory
ddckCKDestOverlay: TDDColorKey; // color key for destination overlay use
ddckCKDestBlt: TDDColorKey; // color key for destination blt use
ddckCKSrcOverlay: TDDColorKey; // color key for source overlay use
ddckCKSrcBlt: TDDColorKey; // color key for source blt use
ddpfPixelFormat: TDDPixelFormat_DX5; // pixel format description of the surface
ddsCaps: TDDSCaps; // direct draw surface capabilities
);
1: (
dwZBufferBitDepth: DWORD; // depth of Z buffer requested
);
2: (
dwRefreshRate: DWORD; // refresh rate (used when display mode is described)
);
);
end;
TDDEnumModesCallback = function(const lpDDSurfaceDesc: TDDSurfaceDesc;
lpContext: Pointer): HResult; stdcall;
LPDDENUMMODESCALLBACK = TDDEnumModesCallback;
 
PDDSurfaceDesc_DX6 = ^TDDSurfaceDesc_DX6;
TDDSurfaceDesc_DX6 = packed record
dwSize: DWORD; // size of the TDDSurfaceDesc structure
dwFlags: DWORD; // determines what fields are valid
dwHeight: DWORD; // height of surface to be created
dwWidth: DWORD; // width of input surface
case Integer of
0: (
dwLinearSize : DWORD; // unused at the moment
);
1: (
lPitch: LongInt; // distance to start of next line (return value only)
dwBackBufferCount: DWORD; // number of back buffers requested
case Integer of
0: (
dwMipMapCount: DWORD; // number of mip-map levels requested
dwAlphaBitDepth: DWORD; // depth of alpha buffer requested
dwReserved: DWORD; // reserved
lpSurface: Pointer; // pointer to the associated surface memory
ddckCKDestOverlay: TDDColorKey; // color key for destination overlay use
ddckCKDestBlt: TDDColorKey; // color key for destination blt use
ddckCKSrcOverlay: TDDColorKey; // color key for source overlay use
ddckCKSrcBlt: TDDColorKey; // color key for source blt use
ddpfPixelFormat: TDDPixelFormat_DX6; // pixel format description of the surface
ddsCaps: TDDSCaps; // direct draw surface capabilities
);
1: (
dwZBufferBitDepth: DWORD; // depth of Z buffer requested
);
2: (
dwRefreshRate: DWORD; // refresh rate (used when display mode is described)
);
);
end;
TDDEnumModesCallback2 = function(const lpDDSurfaceDesc: TDDSurfaceDesc2;
lpContext: Pointer): HResult; stdcall;
LPDDENUMMODESCALLBACK2 = TDDEnumModesCallback2;
 
PDDSurfaceDesc = ^TDDSurfaceDesc;
{$IFDEF DIRECTX5}
TDDSurfaceDesc = TDDSurfaceDesc_DX5;
{$ELSE}
TDDSurfaceDesc = TDDSurfaceDesc_DX6;
{$ENDIF}
TDDEnumSurfacesCallback = function(lpDDSurface: IDirectDrawSurface;
const lpDDSurfaceDesc: TDDSurfaceDesc; lpContext: Pointer): HResult; stdcall;
LPDDENUMSURFACESCALLBACK = TDDEnumSurfacesCallback;
 
TDDEnumSurfacesCallback2 = function(lpDDSurface: IDirectDrawSurface4;
const lpDDSurfaceDesc: TDDSurfaceDesc2; lpContext: Pointer): HResult; stdcall;
LPDDENUMSURFACESCALLBACK2 = TDDEnumSurfacesCallback2;
 
(*
* TDDSurfaceDesc2
*)
PDDSurfaceDesc2 = ^TDDSurfaceDesc2;
TDDSurfaceDesc2 = packed record
dwSize: DWORD; // size of the TDDSurfaceDesc structure
dwFlags: DWORD; // determines what fields are valid
dwHeight: DWORD; // height of surface to be created
dwWidth: DWORD; // width of input surface
case Integer of
0: (
lPitch : LongInt; // distance to start of next line (return value only)
);
1: (
dwLinearSize : DWORD; // Formless late-allocated optimized surface size
dwBackBufferCount: DWORD; // number of back buffers requested
case Integer of
0: (
dwMipMapCount: DWORD; // number of mip-map levels requested
dwAlphaBitDepth: DWORD; // depth of alpha buffer requested
dwReserved: DWORD; // reserved
lpSurface: Pointer; // pointer to the associated surface memory
ddckCKDestOverlay: TDDColorKey; // color key for destination overlay use
ddckCKDestBlt: TDDColorKey; // color key for destination blt use
ddckCKSrcOverlay: TDDColorKey; // color key for source overlay use
ddckCKSrcBlt: TDDColorKey; // color key for source blt use
ddpfPixelFormat: TDDPixelFormat; // pixel format description of the surface
ddsCaps: TDDSCaps2; // direct draw surface capabilities
dwTextureStage: DWORD; // stage in multitexture cascade
);
1: (
dwRefreshRate: DWORD; // refresh rate (used when display mode is described)
);
);
end;
TDDEnumSurfacesCallback7 = function(lpDDSurface: IDirectDrawSurface7;
const lpDDSurfaceDesc: TDDSurfaceDesc2; lpContext: Pointer): HResult; stdcall;
LPDDENUMSURFACESCALLBACK7 = TDDEnumSurfacesCallback7;
 
(*
* TDDOptSurfaceDesc
*)
{ IDirectDraw Interface }
 
PDDOptSurfaceDesc = ^TDDOptSurfaceDesc;
TDDOptSurfaceDesc = packed record
dwSize : DWORD; // size of the DDOPTSURFACEDESC structure
dwFlags : DWORD; // determines what fields are valid
ddSCaps : TDDSCaps2; // Common caps like: Memory type
ddOSCaps : TDDOSCaps; // Common caps like: Memory type
guid : TGUID; // Compression technique GUID
dwCompressionRatio : DWORD; // Compression ratio
end;
 
(*
* DDCOLORCONTROL
*)
PDDColorControl = ^TDDColorControl;
TDDColorControl = packed record
dwSize: DWORD;
dwFlags: DWORD;
lBrightness: LongInt;
lContrast: LongInt;
lHue: LongInt;
lSaturation: LongInt;
lSharpness: LongInt;
lGamma: LongInt;
lColorEnable: LongInt;
dwReserved1: DWORD;
end;
 
(*
* callbacks
*)
 
{$IFNDEF WINNT}
TDDEnumModesCallback = function (const lpDDSurfaceDesc: TDDSurfaceDesc;
lpContext: Pointer) : HResult; stdcall;
TDDEnumModesCallback2 = function (const lpDDSurfaceDesc: TDDSurfaceDesc2;
lpContext: Pointer) : HResult; stdcall;
TDDEnumSurfacesCallback = function (lpDDSurface: IDirectDrawSurface;
const lpDDSurfaceDesc: TDDSurfaceDesc; lpContext: Pointer) : HResult; stdcall;
TDDEnumSurfacesCallback2 = function (lpDDSurface: IDirectDrawSurface4;
const lpDDSurfaceDesc: TDDSurfaceDesc2; lpContext: Pointer) : HResult; stdcall;
TDDEnumSurfacesCallback7 = function (lpDDSurface: IDirectDrawSurface7;
const lpDDSurfaceDesc: TDDSurfaceDesc2; lpContext: Pointer) : HResult; stdcall;
{$ENDIF}
 
(*
* INTERACES FOLLOW:
* IDirectDraw
* IDirectDrawClipper
* IDirectDrawPalette
* IDirectDrawSurface
*)
 
(*
* IDirectDraw
*)
 
IDirectDraw = interface (IUnknown)
IDirectDraw = interface(IUnknown)
['{6C14DB80-A733-11CE-A521-0020AF0BE560}']
(*** IDirectDraw methods ***)
// IDirectDraw methods
function Compact: HResult; stdcall;
function CreateClipper (dwFlags: DWORD;
out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreatePalette (dwFlags: DWORD; lpColorTable: pointer;
out lplpDDPalette: IDirectDrawPalette;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateSurface (var lpDDSurfaceDesc: TDDSurfaceDesc;
out lplpDDSurface: IDirectDrawSurface;
pUnkOuter: IUnknown) : HResult; stdcall;
function DuplicateSurface (lpDDSurface: IDirectDrawSurface;
out lplpDupDDSurface: IDirectDrawSurface) : HResult; stdcall;
function EnumDisplayModes (dwFlags: DWORD;
lpDDSurfaceDesc: PDDSurfaceDesc; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback) : HResult; stdcall;
function EnumSurfaces (dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback) :
HResult; stdcall;
function CreateClipper(dwFlags: DWORD; out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown): HResult; stdcall;
function CreatePalette(dwFlags: DWORD; lpColorTable: PPaletteEntry;
out lplpDDPalette: IDirectDrawPalette; pUnkOuter: IUnknown): HResult; stdcall;
function CreateSurface(const lpDDSurfaceDesc: TDDSurfaceDesc;
out lplpDDSurface: IDirectDrawSurface; pUnkOuter: IUnknown): HResult; stdcall;
function DuplicateSurface(lpDDSurface: IDirectDrawSurface;
out lplpDupDDSurface: IDirectDrawSurface): HResult; stdcall;
function EnumDisplayModes(dwFlags: DWORD;
const lpDDSurfaceDesc: TDDSurfaceDesc; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback): HResult; stdcall;
function EnumSurfaces(dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function FlipToGDISurface: HResult; stdcall;
function GetCaps (lpDDDriverCaps: PDDCaps; lpDDHELCaps: PDDCaps) : HResult; stdcall;
function GetDisplayMode (out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
function GetFourCCCodes (var lpNumCodes: DWORD; lpCodes: PDWORD) : HResult; stdcall;
function GetGDISurface (out lplpGDIDDSSurface: IDirectDrawSurface) :
HResult; stdcall;
function GetMonitorFrequency (out lpdwFrequency: DWORD) : HResult; stdcall;
function GetScanLine (out lpdwScanLine: DWORD) : HResult; stdcall;
function GetVerticalBlankStatus (out lpbIsInVB: BOOL) : HResult; stdcall;
function Initialize (lpGUID: PGUID) : HResult; stdcall;
function GetCaps(var lpDDDriverCaps: TDDCaps; var lpDDHELCaps: TDDCaps): HResult; stdcall;
function GetDisplayMode(var lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function GetFourCCCodes(var lpNumCodes, lpCodes: DWORD): HResult; stdcall;
function GetGDISurface(out lplpGDIDDSSurface: IDirectDrawSurface): HResult; stdcall;
function GetMonitorFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
function GetScanLine(var lpdwScanLine: DWORD): HResult; stdcall;
function GetVerticalBlankStatus(var lpbIsInVB: BOOL): HResult; stdcall;
function Initialize(lpGUID: PGUID): HResult; stdcall;
function RestoreDisplayMode: HResult; stdcall;
function SetCooperativeLevel (hWnd: HWND; dwFlags: DWORD) : HResult; stdcall;
(*** Warning! SetDisplayMode differs between DirectDraw 1 and DirectDraw 2 ***)
function SetDisplayMode (dwWidth: DWORD; dwHeight: DWORD;
dwBpp: DWORD) : HResult; stdcall;
function WaitForVerticalBlank (dwFlags: DWORD; hEvent: THandle) :
HResult; stdcall;
function SetCooperativeLevel(hWnd: HWND; dwFlags: DWORD): HResult; stdcall;
function SetDisplayMode(dwWidth, dwHeight, dwBpp: DWORD): HResult; stdcall;
function WaitForVerticalBlank(dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
end;
 
IDirectDraw2 = interface (IUnknown)
{ IDirectDraw2 Interface }
 
IDirectDraw2 = interface(IUnknown)
['{B3A6F3E0-2B43-11CF-A2DE-00AA00B93356}']
(*** IDirectDraw methods ***)
// IDirectDraw methods
function Compact: HResult; stdcall;
function CreateClipper (dwFlags: DWORD;
out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreatePalette (dwFlags: DWORD; lpColorTable: pointer;
out lplpDDPalette: IDirectDrawPalette;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateSurface (var lpDDSurfaceDesc: TDDSurfaceDesc;
out lplpDDSurface: IDirectDrawSurface;
pUnkOuter: IUnknown) : HResult; stdcall;
function DuplicateSurface (lpDDSurface: IDirectDrawSurface;
out lplpDupDDSurface: IDirectDrawSurface) : HResult; stdcall;
function EnumDisplayModes (dwFlags: DWORD;
lpDDSurfaceDesc: PDDSurfaceDesc; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback) : HResult; stdcall;
function EnumSurfaces (dwFlags: DWORD; var lpDDSD: TDDSurfaceDesc;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback) :
HResult; stdcall;
function CreateClipper(dwFlags: DWORD; out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown): HResult; stdcall;
function CreatePalette(dwFlags: DWORD; lpColorTable: PPaletteEntry;
out lplpDDPalette: IDirectDrawPalette; pUnkOuter: IUnknown): HResult; stdcall;
function CreateSurface(const lpDDSurfaceDesc: TDDSurfaceDesc;
out lplpDDSurface: IDirectDrawSurface; pUnkOuter: IUnknown): HResult; stdcall;
function DuplicateSurface(lpDDSurface: IDirectDrawSurface;
out lplpDupDDSurface: IDirectDrawSurface): HResult; stdcall;
function EnumDisplayModes(dwFlags: DWORD;
const lpDDSurfaceDesc: TDDSurfaceDesc; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback): HResult; stdcall;
function EnumSurfaces(dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function FlipToGDISurface: HResult; stdcall;
function GetCaps (lpDDDriverCaps: PDDCaps; lpDDHELCaps: PDDCaps) : HResult; stdcall;
function GetDisplayMode (out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
function GetFourCCCodes (var lpNumCodes: DWORD; lpCodes: PDWORD) : HResult; stdcall;
function GetGDISurface (out lplpGDIDDSSurface: IDirectDrawSurface) : HResult; stdcall;
function GetMonitorFrequency (out lpdwFrequency: DWORD) : HResult; stdcall;
function GetScanLine (out lpdwScanLine: DWORD) : HResult; stdcall;
function GetVerticalBlankStatus (out lpbIsInVB: BOOL) : HResult; stdcall;
function Initialize (lpGUID: PGUID) : HResult; stdcall;
function GetCaps(var lpDDDriverCaps: TDDCaps; var lpDDHELCaps: TDDCaps): HResult; stdcall;
function GetDisplayMode(var lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function GetFourCCCodes(var lpNumCodes, lpCodes: DWORD): HResult; stdcall;
function GetGDISurface(out lplpGDIDDSSurface: IDirectDrawSurface): HResult; stdcall;
function GetMonitorFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
function GetScanLine(var lpdwScanLine: DWORD): HResult; stdcall;
function GetVerticalBlankStatus(var lpbIsInVB: BOOL): HResult; stdcall;
function Initialize(lpGUID: PGUID): HResult; stdcall;
function RestoreDisplayMode: HResult; stdcall;
function SetCooperativeLevel (hWnd: HWND; dwFlags: DWORD) : HResult; stdcall;
(*** Warning! SetDisplayMode differs between DirectDraw 1 and DirectDraw 2 ***)
function SetDisplayMode (dwWidth: DWORD; dwHeight: DWORD; dwBPP: DWORD;
dwRefreshRate: DWORD; dwFlags: DWORD) : HResult; stdcall;
function WaitForVerticalBlank (dwFlags: DWORD; hEvent: THandle) :
HResult; stdcall;
(*** Added in the v2 interface ***)
function GetAvailableVidMem (var lpDDSCaps: TDDSCaps;
out lpdwTotal, lpdwFree: DWORD) : HResult; stdcall;
function SetCooperativeLevel(hWnd: HWND; dwFlags: DWORD): HResult; stdcall;
function SetDisplayMode(dwWidth, dwHeight, dwBPP, dwRefreshRate: DWORD;
dwFlags: DWORD): HResult; stdcall;
function WaitForVerticalBlank(dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
// IDirectDraw2 methods
function GetAvailableVidMem(var lpDDSCaps: TDDSCaps;
var lpdwTotal, lpdwFree: DWORD): HResult; stdcall;
end;
 
IDirectDraw4 = interface (IUnknown)
['{9c59509a-39bd-11d1-8c4a-00c04fd930c5}']
(*** IDirectDraw methods ***)
{ IDirectDraw4 Interface }
 
IDirectDraw4 = interface(IUnknown)
['{9C59509A-39BD-11D1-8C4A-00C04FD930C5}']
// IDirectDraw methods
function Compact: HResult; stdcall;
function CreateClipper (dwFlags: DWORD;
out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreatePalette (dwFlags: DWORD; lpColorTable: pointer;
out lplpDDPalette: IDirectDrawPalette;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateSurface (const lpDDSurfaceDesc: TDDSurfaceDesc2;
out lplpDDSurface: IDirectDrawSurface4;
pUnkOuter: IUnknown) : HResult; stdcall;
function DuplicateSurface (lpDDSurface: IDirectDrawSurface4;
out lplpDupDDSurface: IDirectDrawSurface4) : HResult; stdcall;
function EnumDisplayModes (dwFlags: DWORD;
lpDDSurfaceDesc: PDDSurfaceDesc2; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback2) : HResult; stdcall;
function EnumSurfaces (dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc2;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback2) :
HResult; stdcall;
function CreateClipper(dwFlags: DWORD; out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown): HResult; stdcall;
function CreatePalette(dwFlags: DWORD; lpColorTable: PPaletteEntry;
out lplpDDPalette: IDirectDrawPalette; pUnkOuter: IUnknown): HResult; stdcall;
function CreateSurface(const lpDDSurfaceDesc: TDDSurfaceDesc2;
out lplpDDSurface: IDirectDrawSurface4; pUnkOuter: IUnknown): HResult; stdcall;
function DuplicateSurface(lpDDSurface: IDirectDrawSurface4;
out lplpDupDDSurface: IDirectDrawSurface4): HResult; stdcall;
function EnumDisplayModes(dwFlags: DWORD;
const lpDDSurfaceDesc: TDDSurfaceDesc2; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback2): HResult; stdcall;
function EnumSurfaces(dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc2;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback2): HResult; stdcall;
function FlipToGDISurface: HResult; stdcall;
function GetCaps (lpDDDriverCaps: PDDCaps; lpDDHELCaps: PDDCaps) : HResult; stdcall;
function GetDisplayMode (out lpDDSurfaceDesc: TDDSurfaceDesc2) : HResult; stdcall;
function GetFourCCCodes (var lpNumCodes: DWORD; lpCodes: PDWORD) : HResult; stdcall;
function GetGDISurface (out lplpGDIDDSSurface: IDirectDrawSurface4) :
HResult; stdcall;
function GetMonitorFrequency (out lpdwFrequency: DWORD) : HResult; stdcall;
function GetScanLine (out lpdwScanLine: DWORD) : HResult; stdcall;
function GetVerticalBlankStatus (out lpbIsInVB: BOOL) : HResult; stdcall;
function Initialize (lpGUID: PGUID) : HResult; stdcall;
function GetCaps(var lpDDDriverCaps: TDDCaps; var lpDDHELCaps: TDDCaps): HResult; stdcall;
function GetDisplayMode(var lpDDSurfaceDesc: TDDSurfaceDesc2): HResult; stdcall;
function GetFourCCCodes(var lpNumCodes, lpCodes: DWORD): HResult; stdcall;
function GetGDISurface(out lplpGDIDDSSurface: IDirectDrawSurface2): HResult; stdcall;
function GetMonitorFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
function GetScanLine(var lpdwScanLine: DWORD): HResult; stdcall;
function GetVerticalBlankStatus(var lpbIsInVB: BOOL): HResult; stdcall;
function Initialize(lpGUID: PGUID): HResult; stdcall;
function RestoreDisplayMode: HResult; stdcall;
function SetCooperativeLevel (hWnd: HWND; dwFlags: DWORD) : HResult; stdcall;
(*** Warning! SetDisplayMode differs between DirectDraw 1 and DirectDraw 2 ***)
function SetDisplayMode (dwWidth: DWORD; dwHeight: DWORD; dwBPP: DWORD;
dwRefreshRate: DWORD; dwFlags: DWORD) : HResult; stdcall;
function WaitForVerticalBlank (dwFlags: DWORD; hEvent: THandle) :
HResult; stdcall;
(*** Added in the v2 interface ***)
function GetAvailableVidMem (const lpDDSCaps: TDDSCaps2;
out lpdwTotal, lpdwFree: DWORD) : HResult; stdcall;
(*** Added in the V4 Interface ***)
function GetSurfaceFromDC (hdc : Windows.HDC;
out lpDDS4: IDirectDrawSurface4) : HResult; stdcall;
function RestoreAllSurfaces : HResult; stdcall;
function TestCooperativeLevel : HResult; stdcall;
function GetDeviceIdentifier (out lpdddi: TDDDeviceIdentifier;
dwFlags: DWORD) : HResult; stdcall;
function SetCooperativeLevel(hWnd: HWND; dwFlags: DWORD): HResult; stdcall;
function SetDisplayMode(dwWidth, dwHeight, dwBPP, dwRefreshRate: DWORD;
dwFlags: DWORD): HResult; stdcall;
function WaitForVerticalBlank(dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
// IDirectDraw2 methods
function GetAvailableVidMem(var lpDDSCaps: TDDSCaps;
var lpdwTotal, lpdwFree: DWORD): HResult; stdcall;
// IDirectDraw4 methods
function GetSurfaceFromDC(hdc: HDC; lpDDS: IDirectDrawSurface4): HResult; stdcall;
function RestoreAllSurfaces: HResult; stdcall;
function TestCooperativeLevel: HResult; stdcall;
function GetDeviceIdentifier(var lpdddi: TDDDeviceIdentifier; dwFlags: DWORD): HResult; stdcall;
end;
 
IDirectDraw7 = interface (IUnknown)
['{15e65ec0-3b9c-11d2-b92f-00609797ea5b}']
(*** IDirectDraw methods ***)
{ IDirectDraw7 Interface }
 
IDirectDraw7 = interface(IUnknown)
['{15E65EC0-3B9C-11D2-B92F-00609797EA5B}']
// IDirectDraw methods
function Compact: HResult; stdcall;
function CreateClipper (dwFlags: DWORD;
out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreatePalette (dwFlags: DWORD; lpColorTable: pointer;
out lplpDDPalette: IDirectDrawPalette;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateSurface (const lpDDSurfaceDesc: TDDSurfaceDesc2;
out lplpDDSurface: IDirectDrawSurface7;
pUnkOuter: IUnknown) : HResult; stdcall;
function DuplicateSurface (lpDDSurface: IDirectDrawSurface7;
out lplpDupDDSurface: IDirectDrawSurface7) : HResult; stdcall;
function EnumDisplayModes (dwFlags: DWORD;
lpDDSurfaceDesc: PDDSurfaceDesc2; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback2) : HResult; stdcall;
function EnumSurfaces (dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc2;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback7) :
HResult; stdcall;
function CreateClipper(dwFlags: DWORD; out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown): HResult; stdcall;
function CreatePalette(dwFlags: DWORD; lpColorTable: PPaletteEntry;
out lplpDDPalette: IDirectDrawPalette; pUnkOuter: IUnknown): HResult; stdcall;
function CreateSurface(const lpDDSurfaceDesc: TDDSurfaceDesc2;
out lplpDDSurface: IDirectDrawSurface7; pUnkOuter: IUnknown): HResult; stdcall;
function DuplicateSurface(lpDDSurface: IDirectDrawSurface7;
out lplpDupDDSurface: IDirectDrawSurface7): HResult; stdcall;
function EnumDisplayModes(dwFlags: DWORD;
const lpDDSurfaceDesc: TDDSurfaceDesc2; lpContext: Pointer;
lpEnumModesCallback: TDDEnumModesCallback2): HResult; stdcall;
function EnumSurfaces(dwFlags: DWORD; const lpDDSD: TDDSurfaceDesc2;
lpContext: Pointer; lpEnumCallback: TDDEnumSurfacesCallback7): HResult; stdcall;
function FlipToGDISurface: HResult; stdcall;
function GetCaps (lpDDDriverCaps: PDDCaps; lpDDHELCaps: PDDCaps) : HResult; stdcall;
function GetDisplayMode (out lpDDSurfaceDesc: TDDSurfaceDesc2) : HResult; stdcall;
function GetFourCCCodes (var lpNumCodes: DWORD; lpCodes: PDWORD) : HResult; stdcall;
function GetGDISurface (out lplpGDIDDSSurface: IDirectDrawSurface7) :
HResult; stdcall;
function GetMonitorFrequency (out lpdwFrequency: DWORD) : HResult; stdcall;
function GetScanLine (out lpdwScanLine: DWORD) : HResult; stdcall;
function GetVerticalBlankStatus (out lpbIsInVB: BOOL) : HResult; stdcall;
function Initialize (lpGUID: PGUID) : HResult; stdcall;
function GetCaps(var lpDDDriverCaps: TDDCaps; var lpDDHELCaps: TDDCaps): HResult; stdcall;
function GetDisplayMode(var lpDDSurfaceDesc: TDDSurfaceDesc2): HResult; stdcall;
function GetFourCCCodes(var lpNumCodes, lpCodes: DWORD): HResult; stdcall;
function GetGDISurface(out lplpGDIDDSSurface: IDirectDrawSurface7): HResult; stdcall;
function GetMonitorFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
function GetScanLine(var lpdwScanLine: DWORD): HResult; stdcall;
function GetVerticalBlankStatus(var lpbIsInVB: BOOL): HResult; stdcall;
function Initialize(lpGUID: PGUID): HResult; stdcall;
function RestoreDisplayMode: HResult; stdcall;
function SetCooperativeLevel (hWnd: HWND; dwFlags: DWORD) : HResult; stdcall;
function SetDisplayMode (dwWidth: DWORD; dwHeight: DWORD; dwBPP: DWORD;
dwRefreshRate: DWORD; dwFlags: DWORD) : HResult; stdcall;
function WaitForVerticalBlank (dwFlags: DWORD; hEvent: THandle) :
HResult; stdcall;
(*** Added in the v2 interface ***)
function GetAvailableVidMem (const lpDDSCaps: TDDSCaps2;
out lpdwTotal, lpdwFree: DWORD) : HResult; stdcall;
(*** Added in the V4 Interface ***)
function GetSurfaceFromDC (hdc : Windows.HDC;
out lpDDS: IDirectDrawSurface7) : HResult; stdcall;
function RestoreAllSurfaces : HResult; stdcall;
function TestCooperativeLevel : HResult; stdcall;
function GetDeviceIdentifier (out lpdddi: TDDDeviceIdentifier2;
dwFlags: DWORD) : HResult; stdcall;
function StartModeTest(const lpModesToTest; dwNumEntries, dwFlags: DWORD) : HResult; stdcall;
function EvaluateMode(dwFlags: DWORD; out pSecondsUntilTimeout: DWORD) : HResult; stdcall;
function SetCooperativeLevel(hWnd: HWND; dwFlags: DWORD): HResult; stdcall;
function SetDisplayMode(dwWidth, dwHeight, dwBPP, dwRefreshRate: DWORD;
dwFlags: DWORD): HResult; stdcall;
function WaitForVerticalBlank(dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
// IDirectDraw2 methods
function GetAvailableVidMem(var lpDDSCaps: TDDSCaps;
var lpdwTotal, lpdwFree: DWORD): HResult; stdcall;
// IDirectDraw4 methods
function GetSurfaceFromDC(hdc: HDC; lpDDS: IDirectDrawSurface4): HResult; stdcall;
function RestoreAllSurfaces: HResult; stdcall;
function TestCooperativeLevel: HResult; stdcall;
function GetDeviceIdentifier(var lpdddi: TDDDeviceIdentifier; dwFlags: DWORD): HResult; stdcall;
// IDirectDraw7 methods
function StartModeTest(var lpModesToTest: TSize; dwNumEntries: DWORD; dwFlags: DWORD): HResult; stdcall;
function EvaluateMode(dwFlags: DWORD; var pSecondsUntilTimeout: DWORD): HResult; stdcall;
end;
 
{ IDirectDrawPalette Interface }
 
 
(*
* IDirectDrawPalette
*)
 
IDirectDrawPalette = interface (IUnknown)
IDirectDrawPalette = interface(IUnknown)
['{6C14DB84-A733-11CE-A521-0020AF0BE560}']
(*** IDirectDrawPalette methods ***)
function GetCaps (out lpdwCaps: DWORD) : HResult; stdcall;
function GetEntries (dwFlags: DWORD; dwBase: DWORD; dwNumEntries: DWORD;
lpEntries: pointer) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw; dwFlags: DWORD;
lpDDColorTable: pointer) : HResult; stdcall;
function SetEntries (dwFlags: DWORD; dwStartingEntry: DWORD;
dwCount: DWORD; lpEntries: pointer) : HResult; stdcall;
// IDirectDrawPalette methods
function GetCaps(varlpdwCaps: DWORD): HResult; stdcall;
function GetEntries(dwFlags: DWORD; dwBase: DWORD; dwNumEntries: DWORD;
lpEntries: PPaletteEntry): HResult; stdcall;
function Initialize(lpDD: IDirectDraw; dwFlags: DWORD;
lpDDColorTable: PPaletteEntry): HResult; stdcall;
function SetEntries(dwFlags: DWORD; dwStartingEntry: DWORD;
dwCount: DWORD; lpEntries: PPaletteEntry): HResult; stdcall;
end;
 
(*
* IDirectDrawClipper
*)
{ IDirectDrawClipper Interface }
 
IDirectDrawClipper = interface (IUnknown)
IDirectDrawClipper = interface(IUnknown)
['{6C14DB85-A733-11CE-A521-0020AF0BE560}']
(*** IDirectDrawClipper methods ***)
function GetClipList (lpRect: PRect; lpClipList: PRgnData;
var lpdwSize: DWORD) : HResult; stdcall;
function GetHWnd (out lphWnd: HWND) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw; dwFlags: DWORD) : HResult; stdcall;
function IsClipListChanged (out lpbChanged: BOOL) : HResult; stdcall;
function SetClipList (lpClipList: PRgnData; dwFlags: DWORD) : HResult; stdcall;
function SetHWnd (dwFlags: DWORD; hWnd: HWND) : HResult; stdcall;
// IDirectDrawClipper methods
function GetClipList(const lpRect: TRect; lpClipList: PRgnData;
var lpdwSize: DWORD): HResult; stdcall;
function GetHWnd(var lphWnd: HWND): HResult; stdcall;
function Initialize(lpDD: IDirectDraw; dwFlags: DWORD): HResult; stdcall;
function IsClipListChanged(var lpbChanged: BOOL): HResult; stdcall;
function SetClipList(lpClipList: PRgnData; dwFlags: DWORD): HResult; stdcall;
function SetHWnd(dwFlags: DWORD; hWnd: HWND): HResult; stdcall;
end;
 
(*
* IDirectDrawSurface and related interfaces
*)
{ IDirectDrawSurface Interface }
 
IDirectDrawSurface = interface (IUnknown)
IDirectDrawSurface = interface(IUnknown)
['{6C14DB81-A733-11CE-A521-0020AF0BE560}']
(*** IDirectDrawSurface methods ***)
function AddAttachedSurface (lpDDSAttachedSurface: IDirectDrawSurface) :
HResult; stdcall;
function AddOverlayDirtyRect (const lpRect: TRect) : HResult; stdcall;
function Blt (lpDestRect: PRect;
lpDDSrcSurface: IDirectDrawSurface; lpSrcRect: PRect;
dwFlags: DWORD; lpDDBltFx: PDDBltFX) : HResult; stdcall;
function BltBatch (const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function BltFast (dwX: DWORD; dwY: DWORD;
lpDDSrcSurface: IDirectDrawSurface; lpSrcRect: PRect;
dwTrans: DWORD) : HResult; stdcall;
function DeleteAttachedSurface (dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface) : HResult; stdcall;
function EnumAttachedSurfaces (lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback) : HResult; stdcall;
function EnumOverlayZOrders (dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback) : HResult; stdcall;
function Flip (lpDDSurfaceTargetOverride: IDirectDrawSurface;
dwFlags: DWORD) : HResult; stdcall;
function GetAttachedSurface (var lpDDSCaps: TDDSCaps;
(*out*)var lplpDDAttachedSurface: IDirectDrawSurface) : HResult; stdcall;
function GetBltStatus (dwFlags: DWORD) : HResult; stdcall;
function GetCaps (out lpDDSCaps: TDDSCaps) : HResult; stdcall;
function GetClipper (out lplpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function GetColorKey (dwFlags: DWORD; out lpDDColorKey: TDDColorKey) :
HResult; stdcall;
function GetDC (out lphDC: HDC) : HResult; stdcall;
function GetFlipStatus (dwFlags: DWORD) : HResult; stdcall;
function GetOverlayPosition (out lplX, lplY: LongInt) : HResult; stdcall;
function GetPalette (out lplpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function GetPixelFormat (out lpDDPixelFormat: TDDPixelFormat) : HResult; stdcall;
function GetSurfaceDesc (out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw;
out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
// IDirectDrawSurface methods
function AddAttachedSurface(lpDDSAttachedSurface: IDirectDrawSurface): HResult; stdcall;
function AddOverlayDirtyRect(const lpRect: TRect): HResult; stdcall;
function Blt(const lpDestRect: TRect; lpDDSrcSurface: IDirectDrawSurface;
const lpSrcRect: TRect; dwFlags: DWORD; const lpDDBltFx: TDDBltFX): HResult; stdcall;
function BltBatch(const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function BltFast(dwX, dwY: DWORD; lpDDSrcSurface: IDirectDrawSurface;
const lpSrcRect: TRect; dwTrans: DWORD): HResult; stdcall;
function DeleteAttachedSurface(dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface): HResult; stdcall;
function EnumAttachedSurfaces(lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function EnumOverlayZOrders(dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function Flip(lpDDSurfaceTargetOverride: IDirectDrawSurface;
dwFlags: DWORD): HResult; stdcall;
function GetAttachedSurface(var lpDDSCaps: TDDSCaps;
out lplpDDAttachedSurface: IDirectDrawSurface): HResult; stdcall;
function GetBltStatus(dwFlags: DWORD): HResult; stdcall;
function GetCaps(var lpDDSCaps: TDDSCaps): HResult; stdcall;
function GetClipper(out lplpDDClipper: IDirectDrawClipper): HResult; stdcall;
function GetColorKey(dwFlags: DWORD; var lpDDColorKey: TDDColorKey): HResult; stdcall;
function GetDC(var lphDC: HDC): HResult; stdcall;
function GetFlipStatus(dwFlags: DWORD): HResult; stdcall;
function GetOverlayPosition(var lplX, lplY: Longint): HResult; stdcall;
function GetPalette(out lplpDDPalette: IDirectDrawPalette): HResult; stdcall;
function GetPixelFormat(var lpDDPixelFormat: TDDPixelFormat): HResult; stdcall;
function GetSurfaceDesc(var lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function Initialize(lpDD: IDirectDraw;
const lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function IsLost: HResult; stdcall;
function Lock (lpDestRect: PRect; out lpDDSurfaceDesc:
TDDSurfaceDesc; dwFlags: DWORD; hEvent: THandle) : HResult; stdcall;
function ReleaseDC (hDC: Windows.HDC) : HResult; stdcall;
function _Restore: HResult; stdcall;
function SetClipper (lpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function SetColorKey (dwFlags: DWORD; lpDDColorKey: PDDColorKey) :
HResult; stdcall;
function SetOverlayPosition (lX, lY: LongInt) : HResult; stdcall;
function SetPalette (lpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function Unlock (lpSurfaceData: Pointer) : HResult; stdcall;
function UpdateOverlay (lpSrcRect: PRect;
lpDDDestSurface: IDirectDrawSurface; lpDestRect: PRect;
dwFlags: DWORD; lpDDOverlayFx: PDDOverlayFX) : HResult; stdcall;
function UpdateOverlayDisplay (dwFlags: DWORD) : HResult; stdcall;
function UpdateOverlayZOrder (dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface) : HResult; stdcall;
function Lock(lpDestRect: PRect; var lpDDSurfaceDesc: TDDSurfaceDesc;
dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
function ReleaseDC(hDC: HDC): HResult; stdcall;
function Restore: HResult; stdcall;
function SetClipper(lpDDClipper: IDirectDrawClipper): HResult; stdcall;
function SetColorKey(dwFlags: DWORD; const lpDDColorKey: TDDColorKey): HResult; stdcall;
function SetOverlayPosition(lX, lY: Longint): HResult; stdcall;
function SetPalette(lpDDPalette: IDirectDrawPalette): HResult; stdcall;
function Unlock(lpSurfaceData: Pointer): HResult; stdcall;
function UpdateOverlay(const lpSrcRect: TRect;
lpDDDestSurface: IDirectDrawSurface; const lpDestRect: TRect;
dwFlags: DWORD; const lpDDOverlayFx: TDDOverlayFX): HResult; stdcall;
function UpdateOverlayDisplay(dwFlags: DWORD): HResult; stdcall;
function UpdateOverlayZOrder(dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface): HResult; stdcall;
end;
 
(*
* IDirectDrawSurface2 and related interfaces
*)
{ IDirectDrawSurface2 Interface }
 
IDirectDrawSurface2 = interface (IUnknown)
['{57805885-6eec-11cf-9441-a82303c10e27}']
(*** IDirectDrawSurface methods ***)
function AddAttachedSurface (lpDDSAttachedSurface: IDirectDrawSurface2) :
HResult; stdcall;
function AddOverlayDirtyRect (const lpRect: TRect) : HResult; stdcall;
function Blt (lpDestRect: PRect;
lpDDSrcSurface: IDirectDrawSurface2; lpSrcRect: PRect;
dwFlags: DWORD; lpDDBltFx: PDDBltFX) : HResult; stdcall;
function BltBatch (const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function BltFast (dwX: DWORD; dwY: DWORD;
lpDDSrcSurface: IDirectDrawSurface2; lpSrcRect: PRect;
dwTrans: DWORD) : HResult; stdcall;
function DeleteAttachedSurface (dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface2) : HResult; stdcall;
function EnumAttachedSurfaces (lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback) : HResult; stdcall;
function EnumOverlayZOrders (dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback) : HResult; stdcall;
function Flip (lpDDSurfaceTargetOverride: IDirectDrawSurface2;
dwFlags: DWORD) : HResult; stdcall;
function GetAttachedSurface (var lpDDSCaps: TDDSCaps;
out lplpDDAttachedSurface: IDirectDrawSurface2) : HResult; stdcall;
function GetBltStatus (dwFlags: DWORD) : HResult; stdcall;
function GetCaps (out lpDDSCaps: TDDSCaps) : HResult; stdcall;
function GetClipper (out lplpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function GetColorKey (dwFlags: DWORD; out lpDDColorKey: TDDColorKey) :
HResult; stdcall;
function GetDC (out lphDC: HDC) : HResult; stdcall;
function GetFlipStatus (dwFlags: DWORD) : HResult; stdcall;
function GetOverlayPosition (out lplX, lplY: LongInt) : HResult; stdcall;
function GetPalette (out lplpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function GetPixelFormat (out lpDDPixelFormat: TDDPixelFormat) : HResult; stdcall;
function GetSurfaceDesc (out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw;
out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
IDirectDrawSurface2 = interface(IUnknown)
['{57805885-6EEC-11CF-9441-A82303C10E27}']
// IDirectDrawSurface methods
function AddAttachedSurface(lpDDSAttachedSurface: IDirectDrawSurface2): HResult; stdcall;
function AddOverlayDirtyRect(const lpRect: TRect): HResult; stdcall;
function Blt(const lpDestRect: TRect; lpDDSrcSurface: IDirectDrawSurface2;
const lpSrcRect: TRect; dwFlags: DWORD; const lpDDBltFx: TDDBltFX): HResult; stdcall;
function BltBatch(const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function BltFast(dwX, dwY: DWORD; lpDDSrcSurface: IDirectDrawSurface2;
const lpSrcRect: TRect; dwTrans: DWORD): HResult; stdcall;
function DeleteAttachedSurface(dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface2): HResult; stdcall;
function EnumAttachedSurfaces(lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function EnumOverlayZOrders(dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function Flip(lpDDSurfaceTargetOverride: IDirectDrawSurface2;
dwFlags: DWORD): HResult; stdcall;
function GetAttachedSurface(var lpDDSCaps: TDDSCaps;
out lplpDDAttachedSurface: IDirectDrawSurface2): HResult; stdcall;
function GetBltStatus(dwFlags: DWORD): HResult; stdcall;
function GetCaps(var lpDDSCaps: TDDSCaps): HResult; stdcall;
function GetClipper(out lplpDDClipper: IDirectDrawClipper): HResult; stdcall;
function GetColorKey(dwFlags: DWORD; var lpDDColorKey: TDDColorKey): HResult; stdcall;
function GetDC(var lphDC: HDC): HResult; stdcall;
function GetFlipStatus(dwFlags: DWORD): HResult; stdcall;
function GetOverlayPosition(var lplX, lplY: Longint): HResult; stdcall;
function GetPalette(out lplpDDPalette: IDirectDrawPalette): HResult; stdcall;
function GetPixelFormat(var lpDDPixelFormat: TDDPixelFormat): HResult; stdcall;
function GetSurfaceDesc(var lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function Initialize(lpDD: IDirectDraw; const lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function IsLost: HResult; stdcall;
function Lock (lpDestRect: PRect;
out lpDDSurfaceDesc: TDDSurfaceDesc; dwFlags: DWORD;
hEvent: THandle) : HResult; stdcall;
function ReleaseDC (hDC: Windows.HDC) : HResult; stdcall;
function _Restore: HResult; stdcall;
function SetClipper (lpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function SetColorKey (dwFlags: DWORD; lpDDColorKey: PDDColorKey) :
HResult; stdcall;
function SetOverlayPosition (lX, lY: LongInt) : HResult; stdcall;
function SetPalette (lpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function Unlock (lpSurfaceData: Pointer) : HResult; stdcall;
function UpdateOverlay (lpSrcRect: PRect;
lpDDDestSurface: IDirectDrawSurface2; lpDestRect: PRect;
dwFlags: DWORD; lpDDOverlayFx: PDDOverlayFX) : HResult; stdcall;
function UpdateOverlayDisplay (dwFlags: DWORD) : HResult; stdcall;
function UpdateOverlayZOrder (dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface2) : HResult; stdcall;
(*** Added in the v2 interface ***)
function GetDDInterface (var lplpDD: IDirectDraw) : HResult; stdcall;
function PageLock (dwFlags: DWORD) : HResult; stdcall;
function PageUnlock (dwFlags: DWORD) : HResult; stdcall;
function Lock(lpDestRect: PRect; const lpDDSurfaceDesc: TDDSurfaceDesc;
dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
function ReleaseDC(hDC: HDC): HResult; stdcall;
function Restore: HResult; stdcall;
function SetClipper(lpDDClipper: IDirectDrawClipper): HResult; stdcall;
function SetColorKey(dwFlags: DWORD; const lpDDColorKey: TDDColorKey): HResult; stdcall;
function SetOverlayPosition(lX, lY: Longint): HResult; stdcall;
function SetPalette(lpDDPalette: IDirectDrawPalette): HResult; stdcall;
function Unlock(lpSurfaceData: Pointer): HResult; stdcall;
function UpdateOverlay(const lpSrcRect: TRect;
lpDDDestSurface: IDirectDrawSurface2; const lpDestRect: TRect;
dwFlags: DWORD; const lpDDOverlayFx: TDDOverlayFX): HResult; stdcall;
function UpdateOverlayDisplay(dwFlags: DWORD): HResult; stdcall;
function UpdateOverlayZOrder(dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface2): HResult; stdcall;
// IDirectDrawSurface2 methods
function GetDDInterface(out lplpDD: IUnknown): HResult; stdcall;
function PageLock(dwFlags: DWORD): HResult; stdcall;
function PageUnlock(dwFlags: DWORD): HResult; stdcall;
end;
 
IDirectDrawSurface3 = interface (IUnknown)
{ IDirectDrawSurface3 Interface }
 
IDirectDrawSurface3 = interface(IUnknown)
['{DA044E00-69B2-11D0-A1D5-00AA00B8DFBB}']
(*** IDirectDrawSurface methods ***)
function AddAttachedSurface (lpDDSAttachedSurface: IDirectDrawSurface3) :
HResult; stdcall;
function AddOverlayDirtyRect (const lpRect: TRect) : HResult; stdcall;
function Blt (lpDestRect: PRect;
lpDDSrcSurface: IDirectDrawSurface3; lpSrcRect: PRect;
dwFlags: DWORD; lpDDBltFx: PDDBltFX) : HResult; stdcall;
function BltBatch (const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function BltFast (dwX: DWORD; dwY: DWORD;
lpDDSrcSurface: IDirectDrawSurface3; lpSrcRect: PRect;
dwTrans: DWORD) : HResult; stdcall;
function DeleteAttachedSurface (dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface3) : HResult; stdcall;
function EnumAttachedSurfaces (lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback) : HResult; stdcall;
function EnumOverlayZOrders (dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback) : HResult; stdcall;
function Flip (lpDDSurfaceTargetOverride: IDirectDrawSurface3;
dwFlags: DWORD) : HResult; stdcall;
function GetAttachedSurface (var lpDDSCaps: TDDSCaps;
out lplpDDAttachedSurface: IDirectDrawSurface3) : HResult; stdcall;
function GetBltStatus (dwFlags: DWORD) : HResult; stdcall;
function GetCaps (out lpDDSCaps: TDDSCaps) : HResult; stdcall;
function GetClipper (out lplpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function GetColorKey (dwFlags: DWORD; out lpDDColorKey: TDDColorKey) :
HResult; stdcall;
function GetDC (out lphDC: HDC) : HResult; stdcall;
function GetFlipStatus (dwFlags: DWORD) : HResult; stdcall;
function GetOverlayPosition (out lplX, lplY: LongInt) : HResult; stdcall;
function GetPalette (out lplpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function GetPixelFormat (out lpDDPixelFormat: TDDPixelFormat) : HResult; stdcall;
function GetSurfaceDesc (out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw;
out lpDDSurfaceDesc: TDDSurfaceDesc) : HResult; stdcall;
// IDirectDrawSurface methods
function AddAttachedSurface(lpDDSAttachedSurface: IDirectDrawSurface3): HResult; stdcall;
function AddOverlayDirtyRect(const lpRect: TRect): HResult; stdcall;
function Blt(const lpDestRect: TRect; lpDDSrcSurface: IDirectDrawSurface3;
const lpSrcRect: TRect; dwFlags: DWORD; const lpDDBltFx: TDDBltFX): HResult; stdcall;
function BltBatch(const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function BltFast(dwX, dwY: DWORD; lpDDSrcSurface: IDirectDrawSurface3;
const lpSrcRect: TRect; dwTrans: DWORD): HResult; stdcall;
function DeleteAttachedSurface(dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface3): HResult; stdcall;
function EnumAttachedSurfaces(lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function EnumOverlayZOrders(dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback): HResult; stdcall;
function Flip(lpDDSurfaceTargetOverride: IDirectDrawSurface3;
dwFlags: DWORD): HResult; stdcall;
function GetAttachedSurface(var lpDDSCaps: TDDSCaps;
out lplpDDAttachedSurface: IDirectDrawSurface3): HResult; stdcall;
function GetBltStatus(dwFlags: DWORD): HResult; stdcall;
function GetCaps(var lpDDSCaps: TDDSCaps): HResult; stdcall;
function GetClipper(out lplpDDClipper: IDirectDrawClipper): HResult; stdcall;
function GetColorKey(dwFlags: DWORD; var lpDDColorKey: TDDColorKey): HResult; stdcall;
function GetDC(var lphDC: HDC): HResult; stdcall;
function GetFlipStatus(dwFlags: DWORD): HResult; stdcall;
function GetOverlayPosition(var lplX, lplY: Longint): HResult; stdcall;
function GetPalette(out lplpDDPalette: IDirectDrawPalette): HResult; stdcall;
function GetPixelFormat(var lpDDPixelFormat: TDDPixelFormat): HResult; stdcall;
function GetSurfaceDesc(var lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function Initialize(lpDD: IDirectDraw; const lpDDSurfaceDesc: TDDSurfaceDesc): HResult; stdcall;
function IsLost: HResult; stdcall;
function Lock (lpDestRect: PRect;
out lpDDSurfaceDesc: TDDSurfaceDesc; dwFlags: DWORD;
hEvent: THandle) : HResult; stdcall;
function ReleaseDC (hDC: Windows.HDC) : HResult; stdcall;
function _Restore: HResult; stdcall;
function SetClipper (lpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function SetColorKey (dwFlags: DWORD; lpDDColorKey: PDDColorKey) :
HResult; stdcall;
function SetOverlayPosition (lX, lY: LongInt) : HResult; stdcall;
function SetPalette (lpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function Unlock (lpSurfaceData: Pointer) : HResult; stdcall;
function UpdateOverlay (lpSrcRect: PRect;
lpDDDestSurface: IDirectDrawSurface3; lpDestRect: PRect;
dwFlags: DWORD; lpDDOverlayFx: PDDOverlayFX) : HResult; stdcall;
function UpdateOverlayDisplay (dwFlags: DWORD) : HResult; stdcall;
function UpdateOverlayZOrder (dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface3) : HResult; stdcall;
(*** Added in the v2 interface ***)
function GetDDInterface (out lplpDD: IDirectDraw) : HResult; stdcall;
function PageLock (dwFlags: DWORD) : HResult; stdcall;
function PageUnlock (dwFlags: DWORD) : HResult; stdcall;
(*** Added in the V3 interface ***)
function SetSurfaceDesc(const lpddsd: TDDSurfaceDesc; dwFlags: DWORD) : HResult; stdcall;
function Lock(lpDestRect: PRect; const lpDDSurfaceDesc: TDDSurfaceDesc;
dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
function ReleaseDC(hDC: HDC): HResult; stdcall;
function Restore: HResult; stdcall;
function SetClipper(lpDDClipper: IDirectDrawClipper): HResult; stdcall;
function SetColorKey(dwFlags: DWORD; const lpDDColorKey: TDDColorKey): HResult; stdcall;
function SetOverlayPosition(lX, lY: Longint): HResult; stdcall;
function SetPalette(lpDDPalette: IDirectDrawPalette): HResult; stdcall;
function Unlock(lpSurfaceData: Pointer): HResult; stdcall;
function UpdateOverlay(const lpSrcRect: TRect;
lpDDDestSurface: IDirectDrawSurface3; const lpDestRect: TRect;
dwFlags: DWORD; const lpDDOverlayFx: TDDOverlayFX): HResult; stdcall;
function UpdateOverlayDisplay(dwFlags: DWORD): HResult; stdcall;
function UpdateOverlayZOrder(dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface3): HResult; stdcall;
// IDirectDrawSurface2 methods
function GetDDInterface(out lplpDD: IUnknown): HResult; stdcall;
function PageLock(dwFlags: DWORD): HResult; stdcall;
function PageUnlock(dwFlags: DWORD): HResult; stdcall;
// IDirectDrawSurface3 methods
function SetSurfaceDesc(const lpddsd: TDDSurfaceDesc; dwFlags: DWORD): HResult; stdcall;
end;
 
(*
* IDirectDrawSurface4 and related interfaces
*)
IDirectDrawSurface4 = interface (IUnknown)
{ IDirectDrawSurface4 Interface }
 
IDirectDrawSurface4 = interface(IUnknown)
['{0B2B8630-AD35-11D0-8EA6-00609797EA5B}']
(*** IDirectDrawSurface methods ***)
function AddAttachedSurface (lpDDSAttachedSurface: IDirectDrawSurface4) :
HResult; stdcall;
function AddOverlayDirtyRect (const lpRect: TRect) : HResult; stdcall;
function Blt (lpDestRect: PRect;
lpDDSrcSurface: IDirectDrawSurface4; lpSrcRect: PRect;
dwFlags: DWORD; lpDDBltFx: PDDBltFX) : HResult; stdcall;
function BltBatch (const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function BltFast (dwX: DWORD; dwY: DWORD;
lpDDSrcSurface: IDirectDrawSurface4; lpSrcRect: PRect;
dwTrans: DWORD) : HResult; stdcall;
function DeleteAttachedSurface (dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface4) : HResult; stdcall;
function EnumAttachedSurfaces (lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback2) : HResult; stdcall;
function EnumOverlayZOrders (dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback2) : HResult; stdcall;
function Flip (lpDDSurfaceTargetOverride: IDirectDrawSurface4;
dwFlags: DWORD) : HResult; stdcall;
function GetAttachedSurface (const lpDDSCaps: TDDSCaps2;
out lplpDDAttachedSurface: IDirectDrawSurface4) : HResult; stdcall;
function GetBltStatus (dwFlags: DWORD) : HResult; stdcall;
function GetCaps (out lpDDSCaps: TDDSCaps2) : HResult; stdcall;
function GetClipper (out lplpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function GetColorKey (dwFlags: DWORD; out lpDDColorKey: TDDColorKey) :
HResult; stdcall;
function GetDC (out lphDC: HDC) : HResult; stdcall;
function GetFlipStatus (dwFlags: DWORD) : HResult; stdcall;
function GetOverlayPosition (out lplX, lplY: LongInt) : HResult; stdcall;
function GetPalette (out lplpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function GetPixelFormat (out lpDDPixelFormat: TDDPixelFormat) : HResult; stdcall;
function GetSurfaceDesc (out lpDDSurfaceDesc: TDDSurfaceDesc2) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw;
out lpDDSurfaceDesc: TDDSurfaceDesc2) : HResult; stdcall;
// IDirectDrawSurface methods
function AddAttachedSurface(lpDDSAttachedSurface: IDirectDrawSurface4): HResult; stdcall;
function AddOverlayDirtyRect(const lpRect: TRect): HResult; stdcall;
function Blt(const lpDestRect: TRect; lpDDSrcSurface: IDirectDrawSurface4;
const lpSrcRect: TRect; dwFlags: DWORD; const lpDDBltFx: TDDBltFX): HResult; stdcall;
function BltBatch(const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function BltFast(dwX, dwY: DWORD; lpDDSrcSurface: IDirectDrawSurface4;
const lpSrcRect: TRect; dwTrans: DWORD): HResult; stdcall;
function DeleteAttachedSurface(dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface4): HResult; stdcall;
function EnumAttachedSurfaces(lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback2): HResult; stdcall;
function EnumOverlayZOrders(dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback2): HResult; stdcall;
function Flip(lpDDSurfaceTargetOverride: IDirectDrawSurface4;
dwFlags: DWORD): HResult; stdcall;
function GetAttachedSurface(var lpDDSCaps: TDDSCaps2;
out lplpDDAttachedSurface: IDirectDrawSurface4): HResult; stdcall;
function GetBltStatus(dwFlags: DWORD): HResult; stdcall;
function GetCaps(var lpDDSCaps: TDDSCaps2): HResult; stdcall;
function GetClipper(out lplpDDClipper: IDirectDrawClipper): HResult; stdcall;
function GetColorKey(dwFlags: DWORD; var lpDDColorKey: TDDColorKey): HResult; stdcall;
function GetDC(var lphDC: HDC): HResult; stdcall;
function GetFlipStatus(dwFlags: DWORD): HResult; stdcall;
function GetOverlayPosition(var lplX, lplY: Longint): HResult; stdcall;
function GetPalette(out lplpDDPalette: IDirectDrawPalette): HResult; stdcall;
function GetPixelFormat(var lpDDPixelFormat: TDDPixelFormat): HResult; stdcall;
function GetSurfaceDesc(var lpDDSurfaceDesc: TDDSurfaceDesc2): HResult; stdcall;
function Initialize(lpDD: IDirectDraw; const lpDDSurfaceDesc: TDDSurfaceDesc2): HResult; stdcall;
function IsLost: HResult; stdcall;
function Lock (lpDestRect: PRect;
out lpDDSurfaceDesc: TDDSurfaceDesc2; dwFlags: DWORD;
hEvent: THandle) : HResult; stdcall;
function ReleaseDC (hDC: Windows.HDC) : HResult; stdcall;
function _Restore: HResult; stdcall;
function SetClipper (lpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function SetColorKey (dwFlags: DWORD; lpDDColorKey: PDDColorKey) :
HResult; stdcall;
function SetOverlayPosition (lX, lY: LongInt) : HResult; stdcall;
function SetPalette (lpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function Unlock (lpRect: PRect) : HResult; stdcall;
function UpdateOverlay (lpSrcRect: PRect;
lpDDDestSurface: IDirectDrawSurface4; lpDestRect: PRect;
dwFlags: DWORD; lpDDOverlayFx: PDDOverlayFX) : HResult; stdcall;
function UpdateOverlayDisplay (dwFlags: DWORD) : HResult; stdcall;
function UpdateOverlayZOrder (dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface4) : HResult; stdcall;
(*** Added in the v2 interface ***)
function GetDDInterface (out lplpDD: IUnknown) : HResult; stdcall;
function PageLock (dwFlags: DWORD) : HResult; stdcall;
function PageUnlock (dwFlags: DWORD) : HResult; stdcall;
(*** Added in the V3 interface ***)
function SetSurfaceDesc(const lpddsd2: TDDSurfaceDesc2; dwFlags: DWORD) : HResult; stdcall;
(*** Added in the v4 interface ***)
function SetPrivateData(const guidTag: TGUID; lpData: pointer;
cbSize: DWORD; dwFlags: DWORD) : HResult; stdcall;
function GetPrivateData(const guidTag: TGUID; lpBuffer: pointer;
var lpcbBufferSize: DWORD) : HResult; stdcall;
function FreePrivateData(const guidTag: TGUID) : HResult; stdcall;
function GetUniquenessValue(out lpValue: DWORD) : HResult; stdcall;
function ChangeUniquenessValue : HResult; stdcall;
function Lock(lpDestRect: PRect; const lpDDSurfaceDesc: TDDSurfaceDesc2;
dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
function ReleaseDC(hDC: HDC): HResult; stdcall;
function Restore: HResult; stdcall;
function SetClipper(lpDDClipper: IDirectDrawClipper): HResult; stdcall;
function SetColorKey(dwFlags: DWORD; const lpDDColorKey: TDDColorKey): HResult; stdcall;
function SetOverlayPosition(lX, lY: Longint): HResult; stdcall;
function SetPalette(lpDDPalette: IDirectDrawPalette): HResult; stdcall;
function Unlock(lpSurfaceData: Pointer): HResult; stdcall;
function UpdateOverlay(const lpSrcRect: TRect; lpDDDestSurface: IDirectDrawSurface4;
const lpDestRect: TRect; dwFlags: DWORD; const lpDDOverlayFx: TDDOverlayFX): HResult; stdcall;
function UpdateOverlayDisplay(dwFlags: DWORD): HResult; stdcall;
function UpdateOverlayZOrder(dwFlags: DWORD; lpDDSReference: IDirectDrawSurface4): HResult; stdcall;
// IDirectDrawSurface2 methods
function GetDDInterface(out lplpDD: IUnknown): HResult; stdcall;
function PageLock(dwFlags: DWORD): HResult; stdcall;
function PageUnlock(dwFlags: DWORD): HResult; stdcall;
// IDirectDrawSurface3 methods
function SetSurfaceDesc(const lpddsd: TDDSurfaceDesc2; dwFlags: DWORD): HResult; stdcall;
// IDirectDrawSurface4 methods
function SetPrivateData(const guidTag: TGUID; lpData: Pointer;
cbSize: DWORD; dwFlags: DWORD): HResult; stdcall;
function GetPrivateData(const guidTag: TGUID; lpData: Pointer;
var cbSize: DWORD): HResult; stdcall;
function FreePrivateData(const guidTag: TGUID): HResult; stdcall;
function GetUniquenessValue(var lpValue: DWORD): HResult; stdcall;
function ChangeUniquenessValue: HResult; stdcall;
end;
 
IDirectDrawSurface7 = interface (IUnknown)
['{06675a80-3b9b-11d2-b92f-00609797ea5b}']
(*** IDirectDrawSurface methods ***)
function AddAttachedSurface (lpDDSAttachedSurface: IDirectDrawSurface7) :
HResult; stdcall;
function AddOverlayDirtyRect (const lpRect: TRect) : HResult; stdcall;
function Blt (lpDestRect: PRect;
lpDDSrcSurface: IDirectDrawSurface7; lpSrcRect: PRect;
dwFlags: DWORD; lpDDBltFx: PDDBltFX) : HResult; stdcall;
function BltBatch (const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function BltFast (dwX: DWORD; dwY: DWORD;
lpDDSrcSurface: IDirectDrawSurface7; lpSrcRect: PRect;
dwTrans: DWORD) : HResult; stdcall;
function DeleteAttachedSurface (dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface7) : HResult; stdcall;
function EnumAttachedSurfaces (lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback7) : HResult; stdcall;
function EnumOverlayZOrders (dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback7) : HResult; stdcall;
function Flip (lpDDSurfaceTargetOverride: IDirectDrawSurface7;
dwFlags: DWORD) : HResult; stdcall;
function GetAttachedSurface (const lpDDSCaps: TDDSCaps2;
out lplpDDAttachedSurface: IDirectDrawSurface7) : HResult; stdcall;
function GetBltStatus (dwFlags: DWORD) : HResult; stdcall;
function GetCaps (out lpDDSCaps: TDDSCaps2) : HResult; stdcall;
function GetClipper (out lplpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function GetColorKey (dwFlags: DWORD; out lpDDColorKey: TDDColorKey) :
HResult; stdcall;
function GetDC (out lphDC: HDC) : HResult; stdcall;
function GetFlipStatus (dwFlags: DWORD) : HResult; stdcall;
function GetOverlayPosition (out lplX, lplY: LongInt) : HResult; stdcall;
function GetPalette (out lplpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function GetPixelFormat (out lpDDPixelFormat: TDDPixelFormat) : HResult; stdcall;
function GetSurfaceDesc (out lpDDSurfaceDesc: TDDSurfaceDesc2) : HResult; stdcall;
function Initialize (lpDD: IDirectDraw;
out lpDDSurfaceDesc: TDDSurfaceDesc2) : HResult; stdcall;
{ IDirectDrawSurface7 Interface }
 
IDirectDrawSurface7 = interface(IUnknown)
['{06675A80-3B9B-11D2-B92F-00609797EA5B}']
// IDirectDrawSurface methods
function AddAttachedSurface(lpDDSAttachedSurface: IDirectDrawSurface7): HResult; stdcall;
function AddOverlayDirtyRect(const lpRect: TRect): HResult; stdcall;
function Blt(const lpDestRect: TRect; lpDDSrcSurface: IDirectDrawSurface7;
const lpSrcRect: TRect; dwFlags: DWORD; const lpDDBltFx: TDDBltFX): HResult; stdcall;
function BltBatch(const lpDDBltBatch: TDDBltBatch; dwCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function BltFast(dwX, dwY: DWORD; lpDDSrcSurface: IDirectDrawSurface7;
const lpSrcRect: TRect; dwTrans: DWORD): HResult; stdcall;
function DeleteAttachedSurface(dwFlags: DWORD;
lpDDSAttachedSurface: IDirectDrawSurface7): HResult; stdcall;
function EnumAttachedSurfaces(lpContext: Pointer;
lpEnumSurfacesCallback: TDDEnumSurfacesCallback7): HResult; stdcall;
function EnumOverlayZOrders(dwFlags: DWORD; lpContext: Pointer;
lpfnCallback: TDDEnumSurfacesCallback7): HResult; stdcall;
function Flip(lpDDSurfaceTargetOverride: IDirectDrawSurface7;
dwFlags: DWORD): HResult; stdcall;
function GetAttachedSurface(var lpDDSCaps: TDDSCaps2;
out lplpDDAttachedSurface: IDirectDrawSurface7): HResult; stdcall;
function GetBltStatus(dwFlags: DWORD): HResult; stdcall;
function GetCaps(var lpDDSCaps: TDDSCaps2): HResult; stdcall;
function GetClipper(out lplpDDClipper: IDirectDrawClipper): HResult; stdcall;
function GetColorKey(dwFlags: DWORD; var lpDDColorKey: TDDColorKey): HResult; stdcall;
function GetDC(var lphDC: HDC): HResult; stdcall;
function GetFlipStatus(dwFlags: DWORD): HResult; stdcall;
function GetOverlayPosition(var lplX, lplY: Longint): HResult; stdcall;
function GetPalette(out lplpDDPalette: IDirectDrawPalette): HResult; stdcall;
function GetPixelFormat(var lpDDPixelFormat: TDDPixelFormat): HResult; stdcall;
function GetSurfaceDesc(var lpDDSurfaceDesc: TDDSurfaceDesc2): HResult; stdcall;
function Initialize(lpDD: IDirectDraw; const lpDDSurfaceDesc: TDDSurfaceDesc2): HResult; stdcall;
function IsLost: HResult; stdcall;
function Lock (lpDestRect: PRect;
out lpDDSurfaceDesc: TDDSurfaceDesc2; dwFlags: DWORD;
hEvent: THandle) : HResult; stdcall;
function ReleaseDC (hDC: Windows.HDC) : HResult; stdcall;
function _Restore: HResult; stdcall;
function SetClipper (lpDDClipper: IDirectDrawClipper) : HResult; stdcall;
function SetColorKey (dwFlags: DWORD; lpDDColorKey: PDDColorKey) :
HResult; stdcall;
function SetOverlayPosition (lX, lY: LongInt) : HResult; stdcall;
function SetPalette (lpDDPalette: IDirectDrawPalette) : HResult; stdcall;
function Unlock (lpRect: PRect) : HResult; stdcall;
function UpdateOverlay (lpSrcRect: PRect;
lpDDDestSurface: IDirectDrawSurface7; lpDestRect: PRect;
dwFlags: DWORD; lpDDOverlayFx: PDDOverlayFX) : HResult; stdcall;
function UpdateOverlayDisplay (dwFlags: DWORD) : HResult; stdcall;
function UpdateOverlayZOrder (dwFlags: DWORD;
lpDDSReference: IDirectDrawSurface7) : HResult; stdcall;
(*** Added in the v2 interface ***)
function GetDDInterface (out lplpDD: IUnknown) : HResult; stdcall;
function PageLock (dwFlags: DWORD) : HResult; stdcall;
function PageUnlock (dwFlags: DWORD) : HResult; stdcall;
(*** Added in the V3 interface ***)
function SetSurfaceDesc(const lpddsd2: TDDSurfaceDesc2; dwFlags: DWORD) : HResult; stdcall;
(*** Added in the v4 interface ***)
function SetPrivateData(const guidTag: TGUID; lpData: pointer;
cbSize: DWORD; dwFlags: DWORD) : HResult; stdcall;
function GetPrivateData(const guidTag: TGUID; lpBuffer: pointer;
var lpcbBufferSize: DWORD) : HResult; stdcall;
function FreePrivateData(const guidTag: TGUID) : HResult; stdcall;
function GetUniquenessValue(out lpValue: DWORD) : HResult; stdcall;
function ChangeUniquenessValue : HResult; stdcall;
(*** Moved Texture7 methods here ***)
function SetPriority(dwPriority: DWORD) : HResult; stdcall;
function GetPriority(out lpdwPriority: DWORD) : HResult; stdcall;
function SetLOD(dwMaxLOD: DWORD) : HResult; stdcall;
function GetLOD(out lpdwMaxLOD: DWORD) : HResult; stdcall;
function Lock(lpDestRect: PRect; const lpDDSurfaceDesc: TDDSurfaceDesc2;
dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
function ReleaseDC(hDC: HDC): HResult; stdcall;
function Restore: HResult; stdcall;
function SetClipper(lpDDClipper: IDirectDrawClipper): HResult; stdcall;
function SetColorKey(dwFlags: DWORD; const lpDDColorKey: TDDColorKey): HResult; stdcall;
function SetOverlayPosition(lX, lY: Longint): HResult; stdcall;
function SetPalette(lpDDPalette: IDirectDrawPalette): HResult; stdcall;
function Unlock(lpSurfaceData: Pointer): HResult; stdcall;
function UpdateOverlay(const lpSrcRect: TRect; lpDDDestSurface: IDirectDrawSurface7;
const lpDestRect: TRect; dwFlags: DWORD; const lpDDOverlayFx: TDDOverlayFX): HResult; stdcall;
function UpdateOverlayDisplay(dwFlags: DWORD): HResult; stdcall;
function UpdateOverlayZOrder(dwFlags: DWORD; lpDDSReference: IDirectDrawSurface7): HResult; stdcall;
// IDirectDrawSurface2 methods
function GetDDInterface(out lplpDD: IUnknown): HResult; stdcall;
function PageLock(dwFlags: DWORD): HResult; stdcall;
function PageUnlock(dwFlags: DWORD): HResult; stdcall;
// IDirectDrawSurface3 methods
function SetSurfaceDesc(const lpddsd: TDDSurfaceDesc2; dwFlags: DWORD): HResult; stdcall;
// IDirectDrawSurface4 methods
function SetPrivateData(const guidTag: TGUID; lpData: Pointer;
cbSize: DWORD; dwFlags: DWORD): HResult; stdcall;
function GetPrivateData(const guidTag: TGUID; lpData: Pointer;
var cbSize: DWORD): HResult; stdcall;
function FreePrivateData(const guidTag: TGUID): HResult; stdcall;
function GetUniquenessValue(var lpValue: DWORD): HResult; stdcall;
function ChangeUniquenessValue: HResult; stdcall;
// Moved Texture7 methods here
function SetPriority(dwPriority: DWORD): HResult; stdcall;
function GetPriority(var lpdwPriority: DWORD): HResult; stdcall;
function SetLOD(dwMaxLOD: DWORD): HResult; stdcall;
function GetLOD(var lpdwMaxLOD: DWORD): HResult; stdcall;
end;
 
IDirectDrawColorControl = interface (IUnknown)
{ IDirectDrawColorControl Interface }
 
IDirectDrawColorControl = interface(IUnknown)
['{4B9F0EE0-0D7E-11D0-9B06-00A0C903A3B8}']
function GetColorControls(out lpColorControl: TDDColorControl) : HResult; stdcall;
function SetColorControls(const lpColorControl: TDDColorControl) : HResult; stdcall;
// IDirectDrawColorControl methods
function GetColorControls(var lpColorControl: TDDColorControl): HResult; stdcall;
function SetColorControls(const lpColorControl: TDDColorControl): HResult; stdcall;
end;
 
(*
* IDirectDrawGammaControl
*)
IDirectDrawGammaControl = interface (IUnknown)
{ IDirectDrawGammaControl Interface }
 
IDirectDrawGammaControl = interface(IUnknown)
['{69C11C3E-B46B-11D1-AD7A-00C04FC29B4E}']
function GetGammaRamp (dwFlags: DWORD; out lpRampData: TDDGammaRamp)
: HResult; stdcall;
function SetGammaRamp (dwFlags: DWORD; const lpRampData: TDDGammaRamp)
: HResult; stdcall;
// IDirectDrawGammaControl methods
function GetGammaRamp(dwFlags: DWORD; var lpRampData: TDDGammaRamp): HResult; stdcall;
function SetGammaRamp(dwFlags: DWORD; const lpRampData: TDDGammaRamp): HResult; stdcall;
end;
 
type
IID_IDirectDraw = IDirectDraw;
IID_IDirectDraw2 = IDirectDraw2;
IID_IDirectDraw4 = IDirectDraw4;
IID_IDirectDraw7 = IDirectDraw7;
IID_IDirectDrawSurface = IDirectDrawSurface;
IID_IDirectDrawSurface2 = IDirectDrawSurface2;
IID_IDirectDrawSurface3 = IDirectDrawSurface3;
IID_IDirectDrawSurface4 = IDirectDrawSurface4;
IID_IDirectDrawSurface7 = IDirectDrawSurface7;
const
{ Flags for DirectDrawEnumerateEx }
DDENUM_ATTACHEDSECONDARYDEVICES = $00000001;
DDENUM_DETACHEDSECONDARYDEVICES = $00000002;
DDENUM_NONDISPLAYDEVICES = $00000004;
 
IID_IDirectDrawPalette = IDirectDrawPalette;
IID_IDirectDrawClipper = IDirectDrawClipper;
IID_IDirectDrawColorControl = IDirectDrawColorControl;
IID_IDirectDrawGammaControl = IDirectDrawGammaControl;
{ Flags for the IDirectDraw4.GetDeviceIdentifier method }
DDGDI_GETHOSTIDENTIFIER = $00000001;
 
const
(*
* ddsCaps field is valid.
*)
{ ddsCaps field is valid. }
DDSD_CAPS = $00000001; // default
 
(*
* dwHeight field is valid.
*)
DDSD_HEIGHT = $00000002;
 
(*
* dwWidth field is valid.
*)
DDSD_WIDTH = $00000004;
 
(*
* lPitch is valid.
*)
DDSD_PITCH = $00000008;
 
(*
* dwBackBufferCount is valid.
*)
DDSD_BACKBUFFERCOUNT = $00000020;
 
(*
* dwZBufferBitDepth is valid. (shouldnt be used in DDSURFACEDESC2)
*)
DDSD_ZBUFFERBITDEPTH = $00000040;
 
(*
* dwAlphaBitDepth is valid.
*)
DDSD_ALPHABITDEPTH = $00000080;
 
(*
* lpSurface is valid.
*)
DDSD_LPSURFACE = $00000800;
 
(*
* ddpfPixelFormat is valid.
*)
DDSD_ALPHABITDEPTH = $00000080;
DDSD_LPSURFACE = $00000800;
DDSD_PIXELFORMAT = $00001000;
 
(*
* ddckCKDestOverlay is valid.
*)
DDSD_CKDESTOVERLAY = $00002000;
 
(*
* ddckCKDestBlt is valid.
*)
DDSD_CKDESTBLT = $00004000;
 
(*
* ddckCKSrcOverlay is valid.
*)
DDSD_CKSRCOVERLAY = $00008000;
 
(*
* ddckCKSrcBlt is valid.
*)
DDSD_CKSRCBLT = $00010000;
 
(*
* dwMipMapCount is valid.
*)
DDSD_MIPMAPCOUNT = $00020000;
 
(*
* dwRefreshRate is valid
*)
DDSD_REFRESHRATE = $00040000;
 
(*
* dwLinearSize is valid
*)
DDSD_LINEARSIZE = $00080000;
 
(*
* dwTextureStage is valid
*)
DDSD_LINEARSIZE = $00080000;
DDSD_TEXTURESTAGE = $00100000;
DDSD_FVF = $00200000;
DDSD_SRCVBHANDLE = $00400000;
DDSD_ALL = $007ff9ee;
 
(*
* All input fields are valid.
*)
DDSD_ALL = $001ff9ee;
{ DirectDraw Driver Capability Flags }
 
DDCAPS_3D = $00000001;
DDCAPS_ALIGNBOUNDARYDEST = $00000002;
DDCAPS_ALIGNSIZEDEST = $00000004;
DDCAPS_ALIGNBOUNDARYSRC = $00000008;
DDCAPS_ALIGNSIZESRC = $00000010;
DDCAPS_ALIGNSTRIDE = $00000020;
DDCAPS_BLT = $00000040;
DDCAPS_BLTQUEUE = $00000080;
DDCAPS_BLTFOURCC = $00000100;
DDCAPS_BLTSTRETCH = $00000200;
DDCAPS_GDI = $00000400;
DDCAPS_OVERLAY = $00000800;
DDCAPS_OVERLAYCANTCLIP = $00001000;
DDCAPS_OVERLAYFOURCC = $00002000;
DDCAPS_OVERLAYSTRETCH = $00004000;
DDCAPS_PALETTE = $00008000;
DDCAPS_PALETTEVSYNC = $00010000;
DDCAPS_READSCANLINE = $00020000;
DDCAPS_STEREOVIEW = $00040000;
DDCAPS_VBI = $00080000;
DDCAPS_ZBLTS = $00100000;
DDCAPS_ZOVERLAYS = $00200000;
DDCAPS_COLORKEY = $00400000;
DDCAPS_ALPHA = $00800000;
DDCAPS_COLORKEYHWASSIST = $01000000;
DDCAPS_NOHARDWARE = $02000000;
DDCAPS_BLTCOLORFILL = $04000000;
DDCAPS_BANKSWITCHED = $08000000;
DDCAPS_BLTDEPTHFILL = $10000000;
DDCAPS_CANCLIP = $20000000;
DDCAPS_CANCLIPSTRETCHED = $40000000;
DDCAPS_CANBLTSYSMEM = $80000000;
 
(*
* guid field is valid.
*)
DDOSD_GUID = $00000001;
{ More DirectDraw Driver Capability Flags (dwCaps2) }
 
(*
* dwCompressionRatio field is valid.
*)
DDOSD_COMPRESSION_RATIO = $00000002;
DDCAPS2_CERTIFIED = $00000001;
DDCAPS2_NO2DDURING3DSCENE = $00000002;
DDCAPS2_VIDEOPORT = $00000004;
DDCAPS2_AUTOFLIPOVERLAY = $00000008;
DDCAPS2_CANBOBINTERLEAVED = $00000010;
DDCAPS2_CANBOBNONINTERLEAVED = $00000020;
DDCAPS2_COLORCONTROLOVERLAY = $00000040;
DDCAPS2_COLORCONTROLPRIMARY = $00000080;
DDCAPS2_CANDROPZ16BIT = $00000100;
DDCAPS2_NONLOCALVIDMEM = $00000200;
DDCAPS2_NONLOCALVIDMEMCAPS = $00000400;
DDCAPS2_NOPAGELOCKREQUIRED = $00000800;
DDCAPS2_WIDESURFACES = $00001000;
DDCAPS2_CANFLIPODDEVEN = $00002000;
DDCAPS2_CANBOBHARDWARE = $00004000;
DDCAPS2_COPYFOURCC = $00008000;
DDCAPS2_PRIMARYGAMMA = $00020000;
DDCAPS2_CANRENDERWINDOWED = $00080000;
DDCAPS2_CANCALIBRATEGAMMA = $00100000;
DDCAPS2_FLIPINTERVAL = $00200000;
DDCAPS2_FLIPNOVSYNC = $00400000;
DDCAPS2_CANMANAGETEXTURE = $00800000;
DDCAPS2_TEXMANINNONLOCALVIDMEM = $01000000;
DDCAPS2_STEREO = $02000000;
DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL = $04000000;
 
(*
* ddSCaps field is valid.
*)
DDOSD_SCAPS = $00000004;
{ DirectDrawSurface Capability Flags }
 
(*
* ddOSCaps field is valid.
*)
DDOSD_OSCAPS = $00000008;
DDSCAPS_RESERVED1 = $00000001; { DDSCAPS_3D }
DDSCAPS_ALPHA = $00000002;
DDSCAPS_BACKBUFFER = $00000004;
DDSCAPS_COMPLEX = $00000008;
DDSCAPS_FLIP = $00000010;
DDSCAPS_FRONTBUFFER = $00000020;
DDSCAPS_OFFSCREENPLAIN = $00000040;
DDSCAPS_OVERLAY = $00000080;
DDSCAPS_PALETTE = $00000100;
DDSCAPS_PRIMARYSURFACE = $00000200;
DDSCAPS_RESERVED3 = $00000400; { DDSCAPS_PRIMARYSURFACELEFT }
DDSCAPS_SYSTEMMEMORY = $00000800;
DDSCAPS_TEXTURE = $00001000;
DDSCAPS_3DDEVICE = $00002000;
DDSCAPS_VIDEOMEMORY = $00004000;
DDSCAPS_VISIBLE = $00008000;
DDSCAPS_WRITEONLY = $00010000;
DDSCAPS_ZBUFFER = $00020000;
DDSCAPS_OWNDC = $00040000;
DDSCAPS_LIVEVIDEO = $00080000;
DDSCAPS_HWCODEC = $00100000;
DDSCAPS_MODEX = $00200000;
DDSCAPS_MIPMAP = $00400000;
DDSCAPS_RESERVED2 = $00800000;
DDSCAPS_ALLOCONLOAD = $04000000;
DDSCAPS_VIDEOPORT = $08000000;
DDSCAPS_LOCALVIDMEM = $10000000;
DDSCAPS_NONLOCALVIDMEM = $20000000;
DDSCAPS_STANDARDVGAMODE = $40000000;
DDSCAPS_OPTIMIZED = $80000000;
 
(*
* All input fields are valid.
*)
DDOSD_ALL = $0000000f;
{ DirectDrawSurface Capability Flags 2 }
 
(*
* The surface's optimized pixelformat is compressed
*)
DDOSDCAPS_OPTCOMPRESSED = $00000001;
DDSCAPS2_HARDWAREDEINTERLACE = $00000002;
DDSCAPS2_HINTDYNAMIC = $00000004;
DDSCAPS2_HINTSTATIC = $00000008;
DDSCAPS2_TEXTUREMANAGE = $00000010;
DDSCAPS2_RESERVED1 = $00000020;
DDSCAPS2_RESERVED2 = $00000040;
DDSCAPS2_OPAQUE = $00000080;
DDSCAPS2_HINTANTIALIASING = $00000100;
DDSCAPS2_CUBEMAP = $00000200;
DDSCAPS2_CUBEMAP_POSITIVEX = $00000400;
DDSCAPS2_CUBEMAP_NEGATIVEX = $00000800;
DDSCAPS2_CUBEMAP_POSITIVEY = $00001000;
DDSCAPS2_CUBEMAP_NEGATIVEY = $00002000;
DDSCAPS2_CUBEMAP_POSITIVEZ = $00004000;
DDSCAPS2_CUBEMAP_NEGATIVEZ = $00008000;
 
(*
* The surface's optimized pixelformat is reordered
*)
DDOSDCAPS_OPTREORDERED = $00000002;
DDSCAPS2_CUBEMAP_ALLFACES =
DDSCAPS2_CUBEMAP_POSITIVEX or DDSCAPS2_CUBEMAP_NEGATIVEX or
DDSCAPS2_CUBEMAP_POSITIVEY or DDSCAPS2_CUBEMAP_NEGATIVEY or
DDSCAPS2_CUBEMAP_POSITIVEZ or DDSCAPS2_CUBEMAP_NEGATIVEZ;
 
(*
* The opt surface is a monolithic mipmap
*)
DDOSDCAPS_MONOLITHICMIPMAP = $00000004;
DDSCAPS2_MIPMAPSUBLEVEL = $00010000;
DDSCAPS2_D3DTEXTUREMANAGE = $00020000;
DDSCAPS2_DONOTPERSIST = $00040000;
DDSCAPS2_STEREOSURFACELEFT = $00080000;
 
(*
* The valid Surf caps:
* DDSCAPS_SYSTEMMEMORY = $00000800;
* DDSCAPS_VIDEOMEMORY = $00004000;
* DDSCAPS_LOCALVIDMEM = $10000000;
* DDSCAPS_NONLOCALVIDMEM = $20000000;
*)
DDOSDCAPS_VALIDSCAPS = $30004800;
{ TDDOptSurfaceDesc flags }
 
(*
* The valid OptSurf caps
*)
DDOSDCAPS_VALIDOSCAPS = $00000007;
DDOSD_GUID = $00000001;
DDOSD_COMPRESSION_RATIO = $00000002;
DDOSD_SCAPS = $00000004;
DDOSD_OSCAPS = $00000008;
DDOSD_ALL = $0000000F;
 
{ ddOSCaps field is valid. }
 
(*
* DDCOLORCONTROL
*)
DDOSDCAPS_OPTCOMPRESSED = $00000001;
DDOSDCAPS_OPTREORDERED = $00000002;
DDOSDCAPS_MONOLITHICMIPMAP = $00000004;
DDOSDCAPS_VALIDSCAPS = $30004800;
DDOSDCAPS_VALIDOSCAPS = $00000007;
 
(*
* lBrightness field is valid.
*)
DDCOLOR_BRIGHTNESS = $00000001;
{ DirectDraw FX Alpha Capability Flags }
 
(*
* lContrast field is valid.
*)
DDCOLOR_CONTRAST = $00000002;
 
(*
* lHue field is valid.
*)
DDCOLOR_HUE = $00000004;
 
(*
* lSaturation field is valid.
*)
DDCOLOR_SATURATION = $00000008;
 
(*
* lSharpness field is valid.
*)
DDCOLOR_SHARPNESS = $00000010;
 
(*
* lGamma field is valid.
*)
DDCOLOR_GAMMA = $00000020;
 
(*
* lColorEnable field is valid.
*)
DDCOLOR_COLORENABLE = $00000040;
 
 
 
(*============================================================================
*
* Direct Draw Capability Flags
*
* These flags are used to describe the capabilities of a given Surface.
* All flags are bit flags.
*
*==========================================================================*)
 
(****************************************************************************
*
* DIRECTDRAWSURFACE CAPABILITY FLAGS
*
****************************************************************************)
(*
* This bit currently has no meaning.
*)
DDSCAPS_RESERVED1 = $00000001;
 
(*
* Indicates that this surface contains alpha-only information.
* (To determine if a surface is RGBA/YUVA, the pixel format must be
* interrogated.)
*)
DDSCAPS_ALPHA = $00000002;
 
(*
* Indicates that this surface is a backbuffer. It is generally
* set by CreateSurface when the DDSCAPS_FLIP capability bit is set.
* It indicates that this surface is THE back buffer of a surface
* flipping structure. DirectDraw supports N surfaces in a
* surface flipping structure. Only the surface that immediately
* precedeces the DDSCAPS_FRONTBUFFER has this capability bit set.
* The other surfaces are identified as back buffers by the presence
* of the DDSCAPS_FLIP capability, their attachment order, and the
* absence of the DDSCAPS_FRONTBUFFER and DDSCAPS_BACKBUFFER
* capabilities. The bit is sent to CreateSurface when a standalone
* back buffer is being created. This surface could be attached to
* a front buffer and/or back buffers to form a flipping surface
* structure after the CreateSurface call. See AddAttachments for
* a detailed description of the behaviors in this case.
*)
DDSCAPS_BACKBUFFER = $00000004;
 
(*
* Indicates a complex surface structure is being described. A
* complex surface structure results in the creation of more than
* one surface. The additional surfaces are attached to the root
* surface. The complex structure can only be destroyed by
* destroying the root.
*)
DDSCAPS_COMPLEX = $00000008;
 
(*
* Indicates that this surface is a part of a surface flipping structure.
* When it is passed to CreateSurface the DDSCAPS_FRONTBUFFER and
* DDSCAP_BACKBUFFER bits are not set. They are set by CreateSurface
* on the resulting creations. The dwBackBufferCount field in the
* TDDSurfaceDesc structure must be set to at least 1 in order for
* the CreateSurface call to succeed. The DDSCAPS_COMPLEX capability
* must always be set with creating multiple surfaces through CreateSurface.
*)
DDSCAPS_FLIP = $00000010;
 
(*
* Indicates that this surface is THE front buffer of a surface flipping
* structure. It is generally set by CreateSurface when the DDSCAPS_FLIP
* capability bit is set.
* If this capability is sent to CreateSurface then a standalonw front buffer
* is created. This surface will not have the DDSCAPS_FLIP capability.
* It can be attached to other back buffers to form a flipping structure.
* See AddAttachments for a detailed description of the behaviors in this
* case.
*)
DDSCAPS_FRONTBUFFER = $00000020;
 
(*
* Indicates that this surface is any offscreen surface that is not an overlay,
* texture, zbuffer, front buffer, back buffer, or alpha surface. It is used
* to identify plain vanilla surfaces.
*)
DDSCAPS_OFFSCREENPLAIN = $00000040;
 
(*
* Indicates that this surface is an overlay. It may or may not be directly visible
* depending on whether or not it is currently being overlayed onto the primary
* surface. DDSCAPS_VISIBLE can be used to determine whether or not it is being
* overlayed at the moment.
*)
DDSCAPS_OVERLAY = $00000080;
 
(*
* Indicates that unique DirectDrawPalette objects can be created and
* attached to this surface.
*)
DDSCAPS_PALETTE = $00000100;
 
(*
* Indicates that this surface is the primary surface. The primary
* surface represents what the user is seeing at the moment.
*)
DDSCAPS_PRIMARYSURFACE = $00000200;
 
(*
* This flag used to be DDSCAPS_PRIMARYSURFACELEFT, which is now
* obsolete.
*)
DDSCAPS_RESERVED3 = $00000400;
(*
* Indicates that this surface is the primary surface for the left eye.
* The primary surface for the left eye represents what the user is seeing
* at the moment with the users left eye. When this surface is created the
* DDSCAPS_PRIMARYSURFACE represents what the user is seeing with the users
* right eye.
*)
DDSCAPS_PRIMARYSURFACELEFT = DDSCAPS_RESERVED3;
 
(*
* Indicates that this surface memory was allocated in system memory
*)
DDSCAPS_SYSTEMMEMORY = $00000800;
 
(*
* Indicates that this surface can be used as a 3D texture. It does not
* indicate whether or not the surface is being used for that purpose.
*)
DDSCAPS_TEXTURE = $00001000;
 
(*
* Indicates that a surface may be a destination for 3D rendering. This
* bit must be set in order to query for a Direct3D Device Interface
* from this surface.
*)
DDSCAPS_3DDEVICE = $00002000;
 
(*
* Indicates that this surface exists in video memory.
*)
DDSCAPS_VIDEOMEMORY = $00004000;
 
(*
* Indicates that changes made to this surface are immediately visible.
* It is always set for the primary surface and is set for overlays while
* they are being overlayed and texture maps while they are being textured.
*)
DDSCAPS_VISIBLE = $00008000;
 
(*
* Indicates that only writes are permitted to the surface. Read accesses
* from the surface may or may not generate a protection fault, but the
* results of a read from this surface will not be meaningful. READ ONLY.
*)
DDSCAPS_WRITEONLY = $00010000;
 
(*
* Indicates that this surface is a z buffer. A z buffer does not contain
* displayable information. Instead it contains bit depth information that is
* used to determine which pixels are visible and which are obscured.
*)
DDSCAPS_ZBUFFER = $00020000;
 
(*
* Indicates surface will have a DC associated long term
*)
DDSCAPS_OWNDC = $00040000;
 
(*
* Indicates surface should be able to receive live video
*)
DDSCAPS_LIVEVIDEO = $00080000;
 
(*
* Indicates surface should be able to have a stream decompressed
* to it by the hardware.
*)
DDSCAPS_HWCODEC = $00100000;
 
(*
* Surface is a ModeX surface.
*
*)
DDSCAPS_MODEX = $00200000;
 
(*
* Indicates surface is one level of a mip-map. This surface will
* be attached to other DDSCAPS_MIPMAP surfaces to form the mip-map.
* This can be done explicitly, by creating a number of surfaces and
* attaching them with AddAttachedSurface or by implicitly by CreateSurface.
* If this bit is set then DDSCAPS_TEXTURE must also be set.
*)
DDSCAPS_MIPMAP = $00400000;
 
(*
* This bit is reserved. It should not be specified.
*)
DDSCAPS_RESERVED2 = $00800000;
 
(*
* Indicates that memory for the surface is not allocated until the surface
* is loaded (via the Direct3D texture Load() function).
*)
DDSCAPS_ALLOCONLOAD = $04000000;
 
(*
* Indicates that the surface will recieve data from a video port.
*)
DDSCAPS_VIDEOPORT = $08000000;
 
(*
* Indicates that a video memory surface is resident in true, local video
* memory rather than non-local video memory. If this flag is specified then
* so must DDSCAPS_VIDEOMEMORY. This flag is mutually exclusive with
* DDSCAPS_NONLOCALVIDMEM.
*)
DDSCAPS_LOCALVIDMEM = $10000000;
 
(*
* Indicates that a video memory surface is resident in non-local video
* memory rather than true, local video memory. If this flag is specified
* then so must DDSCAPS_VIDEOMEMORY. This flag is mutually exclusive with
* DDSCAPS_LOCALVIDMEM.
*)
DDSCAPS_NONLOCALVIDMEM = $20000000;
 
(*
* Indicates that this surface is a standard VGA mode surface, and not a
* ModeX surface. (This flag will never be set in combination with the
* DDSCAPS_MODEX flag).
*)
DDSCAPS_STANDARDVGAMODE = $40000000;
 
(*
* Indicates that this surface will be an optimized surface. This flag is
* currently only valid in conjunction with the DDSCAPS_TEXTURE flag. The surface
* will be created without any underlying video memory until loaded.
*)
DDSCAPS_OPTIMIZED = $80000000;
 
 
 
(*
* Indicates that this surface will receive data from a video port using
* the de-interlacing hardware. This allows the driver to allocate memory
* for any extra buffers that may be required. The DDSCAPS_VIDEOPORT and
* DDSCAPS_OVERLAY flags must also be set.
*)
DDSCAPS2_HARDWAREDEINTERLACE = $00000002;
 
(*
* Indicates to the driver that this surface will be locked very frequently
* (for procedural textures, dynamic lightmaps, etc). Surfaces with this cap
* set must also have DDSCAPS_TEXTURE. This cap cannot be used with
* DDSCAPS2_HINTSTATIC and DDSCAPS2_OPAQUE.
*)
DDSCAPS2_HINTDYNAMIC = $00000004;
 
(*
* Indicates to the driver that this surface can be re-ordered/retiled on
* load. This operation will not change the size of the texture. It is
* relatively fast and symmetrical, since the application may lock these
* bits (although it will take a performance hit when doing so). Surfaces
* with this cap set must also have DDSCAPS_TEXTURE. This cap cannot be
* used with DDSCAPS2_HINTDYNAMIC and DDSCAPS2_OPAQUE.
*)
DDSCAPS2_HINTSTATIC = $00000008;
 
(*
* Indicates that the client would like this texture surface to be managed by the
* DirectDraw/Direct3D runtime. Surfaces with this cap set must also have
* DDSCAPS_TEXTURE and DDSCAPS_SYSTEMMEMORY.
*)
DDSCAPS2_TEXTUREMANAGE = $00000010;
 
(*
* These bits are reserved for internal use *)
DDSCAPS2_RESERVED1 = $00000020;
DDSCAPS2_RESERVED2 = $00000040;
 
(*
* Indicates to the driver that this surface will never be locked again.
* The driver is free to optimize this surface via retiling and actual compression.
* All calls to Lock() or Blts from this surface will fail. Surfaces with this
* cap set must also have DDSCAPS_TEXTURE. This cap cannot be used with
* DDSCAPS2_HINTDYNAMIC and DDSCAPS2_HINTSTATIC.
*)
DDSCAPS2_OPAQUE = $00000080;
 
(*
* Applications should set this bit at CreateSurface time to indicate that they
* intend to use antialiasing. Only valid if DDSCAPS_3DDEVICE is also set.
*)
DDSCAPS2_HINTANTIALIASING = $00000100;
 
(*
* This flag is used at CreateSurface time to indicate that this set of
* surfaces is a cubic environment map
*)
DDSCAPS2_CUBEMAP = $00000200;
 
(*
* These flags preform two functions:
* - At CreateSurface time, they define which of the six cube faces are
* required by the application.
* - After creation, each face in the cubemap will have exactly one of these
* bits set.
*)
DDSCAPS2_CUBEMAP_POSITIVEX = $00000400;
DDSCAPS2_CUBEMAP_NEGATIVEX = $00000800;
DDSCAPS2_CUBEMAP_POSITIVEY = $00001000;
DDSCAPS2_CUBEMAP_NEGATIVEY = $00002000;
DDSCAPS2_CUBEMAP_POSITIVEZ = $00004000;
DDSCAPS2_CUBEMAP_NEGATIVEZ = $00008000;
 
(*
* This macro may be used to specify all faces of a cube map at CreateSurface time
*)
DDSCAPS2_CUBEMAP_ALLFACES = ( DDSCAPS2_CUBEMAP_POSITIVEX or
DDSCAPS2_CUBEMAP_NEGATIVEX or
DDSCAPS2_CUBEMAP_POSITIVEY or
DDSCAPS2_CUBEMAP_NEGATIVEY or
DDSCAPS2_CUBEMAP_POSITIVEZ or
DDSCAPS2_CUBEMAP_NEGATIVEZ );
 
 
(*
* This flag is an additional flag which is present on mipmap sublevels from DX7 onwards
* It enables easier use of GetAttachedSurface rather than EnumAttachedSurfaces for surface
* constructs such as Cube Maps, wherein there are more than one mipmap surface attached
* to the root surface.
* This caps bit is ignored by CreateSurface
*)
DDSCAPS2_MIPMAPSUBLEVEL = $00010000;
 
(* This flag indicates that the texture should be managed by D3D only *)
DDSCAPS2_D3DTEXTUREMANAGE = $00020000;
 
(* This flag indicates that the managed surface can be safely lost *)
DDSCAPS2_DONOTPERSIST = $00040000;
 
(* indicates that this surface is part of a stereo flipping chain *)
DDSCAPS2_STEREOSURFACELEFT = $00080000;
 
 
 
(****************************************************************************
*
* DIRECTDRAW DRIVER CAPABILITY FLAGS
*
****************************************************************************)
 
(*
* Display hardware has 3D acceleration.
*)
DDCAPS_3D = $00000001;
 
(*
* Indicates that DirectDraw will support only dest rectangles that are aligned
* on DIRECTDRAWCAPS.dwAlignBoundaryDest boundaries of the surface, respectively.
* READ ONLY.
*)
DDCAPS_ALIGNBOUNDARYDEST = $00000002;
 
(*
* Indicates that DirectDraw will support only source rectangles whose sizes in
* BYTEs are DIRECTDRAWCAPS.dwAlignSizeDest multiples, respectively. READ ONLY.
*)
DDCAPS_ALIGNSIZEDEST = $00000004;
(*
* Indicates that DirectDraw will support only source rectangles that are aligned
* on DIRECTDRAWCAPS.dwAlignBoundarySrc boundaries of the surface, respectively.
* READ ONLY.
*)
DDCAPS_ALIGNBOUNDARYSRC = $00000008;
 
(*
* Indicates that DirectDraw will support only source rectangles whose sizes in
* BYTEs are DIRECTDRAWCAPS.dwAlignSizeSrc multiples, respectively. READ ONLY.
*)
DDCAPS_ALIGNSIZESRC = $00000010;
 
(*
* Indicates that DirectDraw will create video memory surfaces that have a stride
* alignment equal to DIRECTDRAWCAPS.dwAlignStride. READ ONLY.
*)
DDCAPS_ALIGNSTRIDE = $00000020;
 
(*
* Display hardware is capable of blt operations.
*)
DDCAPS_BLT = $00000040;
 
(*
* Display hardware is capable of asynchronous blt operations.
*)
DDCAPS_BLTQUEUE = $00000080;
 
(*
* Display hardware is capable of color space conversions during the blt operation.
*)
DDCAPS_BLTFOURCC = $00000100;
 
(*
* Display hardware is capable of stretching during blt operations.
*)
DDCAPS_BLTSTRETCH = $00000200;
 
(*
* Display hardware is shared with GDI.
*)
DDCAPS_GDI = $00000400;
 
(*
* Display hardware can overlay.
*)
DDCAPS_OVERLAY = $00000800;
 
(*
* Set if display hardware supports overlays but can not clip them.
*)
DDCAPS_OVERLAYCANTCLIP = $00001000;
 
(*
* Indicates that overlay hardware is capable of color space conversions during
* the overlay operation.
*)
DDCAPS_OVERLAYFOURCC = $00002000;
 
(*
* Indicates that stretching can be done by the overlay hardware.
*)
DDCAPS_OVERLAYSTRETCH = $00004000;
 
(*
* Indicates that unique DirectDrawPalettes can be created for DirectDrawSurfaces
* other than the primary surface.
*)
DDCAPS_PALETTE = $00008000;
 
(*
* Indicates that palette changes can be syncd with the veritcal refresh.
*)
DDCAPS_PALETTEVSYNC = $00010000;
 
(*
* Display hardware can return the current scan line.
*)
DDCAPS_READSCANLINE = $00020000;
 
(*
* Display hardware has stereo vision capabilities. DDSCAPS_PRIMARYSURFACELEFT
* can be created.
*)
DDCAPS_STEREOVIEW = $00040000;
 
(*
* Display hardware is capable of generating a vertical blank interrupt.
*)
DDCAPS_VBI = $00080000;
 
(*
* Supports the use of z buffers with blt operations.
*)
DDCAPS_ZBLTS = $00100000;
 
(*
* Supports Z Ordering of overlays.
*)
DDCAPS_ZOVERLAYS = $00200000;
 
(*
* Supports color key
*)
DDCAPS_COLORKEY = $00400000;
 
(*
* Supports alpha surfaces
*)
DDCAPS_ALPHA = $00800000;
 
(*
* colorkey is hardware assisted(DDCAPS_COLORKEY will also be set)
*)
DDCAPS_COLORKEYHWASSIST = $01000000;
 
(*
* no hardware support at all
*)
DDCAPS_NOHARDWARE = $02000000;
 
(*
* Display hardware is capable of color fill with bltter
*)
DDCAPS_BLTCOLORFILL = $04000000;
 
(*
* Display hardware is bank switched, and potentially very slow at
* random access to VRAM.
*)
DDCAPS_BANKSWITCHED = $08000000;
 
(*
* Display hardware is capable of depth filling Z-buffers with bltter
*)
DDCAPS_BLTDEPTHFILL = $10000000;
 
(*
* Display hardware is capable of clipping while bltting.
*)
DDCAPS_CANCLIP = $20000000;
 
(*
* Display hardware is capable of clipping while stretch bltting.
*)
DDCAPS_CANCLIPSTRETCHED = $40000000;
 
(*
* Display hardware is capable of bltting to or from system memory
*)
DDCAPS_CANBLTSYSMEM = $80000000;
 
 
(****************************************************************************
*
* MORE DIRECTDRAW DRIVER CAPABILITY FLAGS (dwCaps2)
*
****************************************************************************)
 
(*
* Display hardware is certified
*)
DDCAPS2_CERTIFIED = $00000001;
 
(*
* Driver cannot interleave 2D operations (lock and blt) to surfaces with
* Direct3D rendering operations between calls to BeginScene() and EndScene()
*)
DDCAPS2_NO2DDURING3DSCENE = $00000002;
 
(*
* Display hardware contains a video port
*)
DDCAPS2_VIDEOPORT = $00000004;
 
(*
* The overlay can be automatically flipped according to the video port
* VSYNCs, providing automatic doubled buffered display of video port
* data using an overlay
*)
DDCAPS2_AUTOFLIPOVERLAY = $00000008;
 
(*
* Overlay can display each field of interlaced data individually while
* it is interleaved in memory without causing jittery artifacts.
*)
DDCAPS2_CANBOBINTERLEAVED = $00000010;
 
(*
* Overlay can display each field of interlaced data individually while
* it is not interleaved in memory without causing jittery artifacts.
*)
DDCAPS2_CANBOBNONINTERLEAVED = $00000020;
 
(*
* The overlay surface contains color controls (brightness, sharpness, etc.)
*)
DDCAPS2_COLORCONTROLOVERLAY = $00000040;
 
(*
* The primary surface contains color controls (gamma, etc.)
*)
DDCAPS2_COLORCONTROLPRIMARY = $00000080;
 
(*
* RGBZ -> RGB supported for 16:16 RGB:Z
*)
DDCAPS2_CANDROPZ16BIT = $00000100;
 
(*
* Driver supports non-local video memory.
*)
DDCAPS2_NONLOCALVIDMEM = $00000200;
 
(*
* Dirver supports non-local video memory but has different capabilities for
* non-local video memory surfaces. If this bit is set then so must
* DDCAPS2_NONLOCALVIDMEM.
*)
DDCAPS2_NONLOCALVIDMEMCAPS = $00000400;
 
(*
* Driver neither requires nor prefers surfaces to be pagelocked when performing
* blts involving system memory surfaces
*)
DDCAPS2_NOPAGELOCKREQUIRED = $00000800;
 
(*
* Driver can create surfaces which are wider than the primary surface
*)
DDCAPS2_WIDESURFACES = $00001000;
 
(*
* Driver supports bob without using a video port by handling the
* DDFLIP_ODD and DDFLIP_EVEN flags specified in Flip.
*)
DDCAPS2_CANFLIPODDEVEN = $00002000;
 
(*
* Driver supports bob using hardware
*)
DDCAPS2_CANBOBHARDWARE = $00004000;
 
(*
* Driver supports bltting any FOURCC surface to another surface of the same FOURCC
*)
DDCAPS2_COPYFOURCC = $00008000;
 
 
(*
* Driver supports loadable gamma ramps for the primary surface
*)
DDCAPS2_PRIMARYGAMMA = $00020000;
 
(*
* Driver can render in windowed mode.
*)
DDCAPS2_CANRENDERWINDOWED = $00080000;
 
(*
* A calibrator is available to adjust the gamma ramp according to the
* physical display properties so that the result will be identical on
* all calibrated systems.
*)
DDCAPS2_CANCALIBRATEGAMMA = $00100000;
 
(*
* Indicates that the driver will respond to DDFLIP_INTERVALn flags
*)
DDCAPS2_FLIPINTERVAL = $00200000;
 
(*
* Indicates that the driver will respond to DDFLIP_NOVSYNC
*)
DDCAPS2_FLIPNOVSYNC = $00400000;
 
(*
* Driver supports management of video memory, if this flag is ON,
* driver manages the texture if requested with DDSCAPS2_TEXTUREMANAGE on
* DirectX manages the texture if this flag is OFF and surface has DDSCAPS2_TEXTUREMANAGE on
*)
DDCAPS2_CANMANAGETEXTURE = $00800000;
 
(*
* The Direct3D texture manager uses this cap to decide whether to put managed
* surfaces in non-local video memory. If the cap is set, the texture manager will
* put managed surfaces in non-local vidmem. Drivers that cannot texture from
* local vidmem SHOULD NOT set this cap.
*)
DDCAPS2_TEXMANINNONLOCALVIDMEM = $01000000;
 
(*
* Indicates that the driver supports DX7 type of stereo in at least one mode (which may
* not necessarily be the current mode). Applications should use IDirectDraw7 (or higher)
* ::EnumDisplayModes and check the DDSURFACEDESC.ddsCaps.dwCaps2 field for the presence of
* DDSCAPS2_STEREOSURFACELEFT to check if a particular mode supports stereo. The application
* can also use IDirectDraw7(or higher)::GetDisplayMode to check the current mode.
*)
DDCAPS2_STEREO = $02000000;
 
(*
* This caps bit is intended for internal DirectDraw use.
* -It is only valid if DDCAPS2_NONLOCALVIDMEMCAPS is set.
* -If this bit is set, then DDCAPS_CANBLTSYSMEM MUST be set by the driver (and
* all the assoicated system memory blt caps must be correct).
* -It implies that the system->video blt caps in DDCAPS also apply to system to
* nonlocal blts. I.e. the dwSVBCaps, dwSVBCKeyCaps, dwSVBFXCaps and dwSVBRops
* members of DDCAPS (DDCORECAPS) are filled in correctly.
* -Any blt from system to nonlocal memory that matches these caps bits will
* be passed to the driver.
*
* NOTE: This is intended to enable the driver itself to do efficient reordering
* of textures. This is NOT meant to imply that hardware can write into AGP memory.
* This operation is not currently supported.
*)
DDCAPS2_SYSTONONLOCAL_AS_SYSTOLOCAL = $04000000;
 
(****************************************************************************
*
* DIRECTDRAW FX ALPHA CAPABILITY FLAGS
*
****************************************************************************)
 
(*
* Supports alpha blending around the edge of a source color keyed surface.
* For Blt.
*)
DDFXALPHACAPS_BLTALPHAEDGEBLEND = $00000001;
 
(*
* Supports alpha information in the pixel format. The bit depth of alpha
* information in the pixel format can be 1,2,4, or 8. The alpha value becomes
* more opaque as the alpha value increases. (0 is transparent.)
* For Blt.
*)
DDFXALPHACAPS_BLTALPHAPIXELS = $00000002;
 
(*
* Supports alpha information in the pixel format. The bit depth of alpha
* information in the pixel format can be 1,2,4, or 8. The alpha value
* becomes more transparent as the alpha value increases. (0 is opaque.)
* This flag can only be set if DDCAPS_ALPHA is set.
* For Blt.
*)
DDFXALPHACAPS_BLTALPHAPIXELSNEG = $00000004;
 
(*
* Supports alpha only surfaces. The bit depth of an alpha only surface can be
* 1,2,4, or 8. The alpha value becomes more opaque as the alpha value increases.
* (0 is transparent.)
* For Blt.
*)
DDFXALPHACAPS_BLTALPHASURFACES = $00000008;
 
(*
* The depth of the alpha channel data can range can be 1,2,4, or 8.
* The NEG suffix indicates that this alpha channel becomes more transparent
* as the alpha value increases. (0 is opaque.) This flag can only be set if
* DDCAPS_ALPHA is set.
* For Blt.
*)
DDFXALPHACAPS_BLTALPHASURFACESNEG = $00000010;
 
(*
* Supports alpha blending around the edge of a source color keyed surface.
* For Overlays.
*)
DDFXALPHACAPS_OVERLAYALPHAEDGEBLEND = $00000020;
 
(*
* Supports alpha information in the pixel format. The bit depth of alpha
* information in the pixel format can be 1,2,4, or 8. The alpha value becomes
* more opaque as the alpha value increases. (0 is transparent.)
* For Overlays.
*)
DDFXALPHACAPS_OVERLAYALPHAPIXELS = $00000040;
 
(*
* Supports alpha information in the pixel format. The bit depth of alpha
* information in the pixel format can be 1,2,4, or 8. The alpha value
* becomes more transparent as the alpha value increases. (0 is opaque.)
* This flag can only be set if DDCAPS_ALPHA is set.
* For Overlays.
*)
DDFXALPHACAPS_OVERLAYALPHAPIXELSNEG = $00000080;
 
(*
* Supports alpha only surfaces. The bit depth of an alpha only surface can be
* 1,2,4, or 8. The alpha value becomes more opaque as the alpha value increases.
* (0 is transparent.)
* For Overlays.
*)
DDFXALPHACAPS_OVERLAYALPHASURFACES = $00000100;
 
(*
* The depth of the alpha channel data can range can be 1,2,4, or 8.
* The NEG suffix indicates that this alpha channel becomes more transparent
* as the alpha value increases. (0 is opaque.) This flag can only be set if
* DDCAPS_ALPHA is set.
* For Overlays.
*)
DDFXALPHACAPS_OVERLAYALPHASURFACESNEG = $00000200;
 
(****************************************************************************
*
* DIRECTDRAW FX CAPABILITY FLAGS
*
****************************************************************************)
{ DirectDraw FX Capability Flags }
 
(*
* Uses arithmetic operations to stretch and shrink surfaces during blt
* rather than pixel doubling techniques. Along the Y axis.
*)
DDFXCAPS_BLTARITHSTRETCHY = $00000020;
 
(*
* Uses arithmetic operations to stretch during blt
* rather than pixel doubling techniques. Along the Y axis. Only
* works for x1, x2, etc.
*)
DDFXCAPS_BLTARITHSTRETCHYN = $00000010;
 
(*
* Supports mirroring left to right in blt.
*)
DDFXCAPS_BLTMIRRORLEFTRIGHT = $00000040;
 
(*
* Supports mirroring top to bottom in blt.
*)
DDFXCAPS_BLTMIRRORUPDOWN = $00000080;
 
(*
* Supports arbitrary rotation for blts.
*)
DDFXCAPS_BLTROTATION = $00000100;
 
(*
* Supports 90 degree rotations for blts.
*)
DDFXCAPS_BLTROTATION90 = $00000200;
 
(*
* DirectDraw supports arbitrary shrinking of a surface along the
* x axis (horizontal direction) for blts.
*)
DDFXCAPS_BLTROTATION90 = $00000200;
DDFXCAPS_BLTSHRINKX = $00000400;
 
(*
* DirectDraw supports integer shrinking (1x,2x,) of a surface
* along the x axis (horizontal direction) for blts.
*)
DDFXCAPS_BLTSHRINKXN = $00000800;
 
(*
* DirectDraw supports arbitrary shrinking of a surface along the
* y axis (horizontal direction) for blts.
*)
DDFXCAPS_BLTSHRINKY = $00001000;
 
(*
* DirectDraw supports integer shrinking (1x,2x,) of a surface
* along the y axis (vertical direction) for blts.
*)
DDFXCAPS_BLTSHRINKYN = $00002000;
 
(*
* DirectDraw supports arbitrary stretching of a surface along the
* x axis (horizontal direction) for blts.
*)
DDFXCAPS_BLTSTRETCHX = $00004000;
 
(*
* DirectDraw supports integer stretching (1x,2x,) of a surface
* along the x axis (horizontal direction) for blts.
*)
DDFXCAPS_BLTSTRETCHXN = $00008000;
 
(*
* DirectDraw supports arbitrary stretching of a surface along the
* y axis (horizontal direction) for blts.
*)
DDFXCAPS_BLTSTRETCHY = $00010000;
 
(*
* DirectDraw supports integer stretching (1x,2x,) of a surface
* along the y axis (vertical direction) for blts.
*)
DDFXCAPS_BLTSTRETCHYN = $00020000;
 
(*
* Uses arithmetic operations to stretch and shrink surfaces during
* overlay rather than pixel doubling techniques. Along the Y axis
* for overlays.
*)
DDFXCAPS_OVERLAYARITHSTRETCHY = $00040000;
 
(*
* Uses arithmetic operations to stretch surfaces during
* overlay rather than pixel doubling techniques. Along the Y axis
* for overlays. Only works for x1, x2, etc.
*)
DDFXCAPS_OVERLAYARITHSTRETCHYN = $00000008;
 
(*
* DirectDraw supports arbitrary shrinking of a surface along the
* x axis (horizontal direction) for overlays.
*)
DDFXCAPS_OVERLAYSHRINKX = $00080000;
 
(*
* DirectDraw supports integer shrinking (1x,2x,) of a surface
* along the x axis (horizontal direction) for overlays.
*)
DDFXCAPS_OVERLAYSHRINKXN = $00100000;
 
(*
* DirectDraw supports arbitrary shrinking of a surface along the
* y axis (horizontal direction) for overlays.
*)
DDFXCAPS_OVERLAYSHRINKY = $00200000;
 
(*
* DirectDraw supports integer shrinking (1x,2x,) of a surface
* along the y axis (vertical direction) for overlays.
*)
DDFXCAPS_OVERLAYSHRINKYN = $00400000;
 
(*
* DirectDraw supports arbitrary stretching of a surface along the
* x axis (horizontal direction) for overlays.
*)
DDFXCAPS_OVERLAYSTRETCHX = $00800000;
 
(*
* DirectDraw supports integer stretching (1x,2x,) of a surface
* along the x axis (horizontal direction) for overlays.
*)
DDFXCAPS_OVERLAYSTRETCHXN = $01000000;
 
(*
* DirectDraw supports arbitrary stretching of a surface along the
* y axis (horizontal direction) for overlays.
*)
DDFXCAPS_OVERLAYSTRETCHY = $02000000;
 
(*
* DirectDraw supports integer stretching (1x,2x,) of a surface
* along the y axis (vertical direction) for overlays.
*)
DDFXCAPS_OVERLAYSTRETCHYN = $04000000;
 
(*
* DirectDraw supports mirroring of overlays across the vertical axis
*)
DDFXCAPS_OVERLAYMIRRORLEFTRIGHT = $08000000;
 
(*
* DirectDraw supports mirroring of overlays across the horizontal axis
*)
DDFXCAPS_OVERLAYMIRRORUPDOWN = $10000000;
DDFXCAPS_BLTALPHA = $00000001;
DDFXCAPS_BLTTRANSFORM = $00000002;
DDFXCAPS_BLTFILTER = DDFXCAPS_BLTARITHSTRETCHY;
DDFXCAPS_OVERLAYALPHA = $00000004;
DDFXCAPS_OVERLAYTRANSFORM = $20000000;
DDFXCAPS_OVERLAYFILTER = DDFXCAPS_OVERLAYARITHSTRETCHY;
 
(*
* Driver can do alpha blending for blits.
*)
DDFXCAPS_BLTALPHA = $00000001;
{ DirectDraw Stereo View Capabilities }
 
(*
* Driver can do geometric transformations (or warps) for blits.
*)
DDFXCAPS_BLTTRANSFORM = $00000002;
 
(*
* Driver can do surface-reconstruction filtering for warped blits.
*)
DDFXCAPS_BLTFILTER = DDFXCAPS_BLTARITHSTRETCHY;
 
(*
* Driver can do alpha blending for overlays.
*)
DDFXCAPS_OVERLAYALPHA = $00000004;
 
(*
* Driver can do geometric transformations (or warps) for overlays.
*)
DDFXCAPS_OVERLAYTRANSFORM = $20000000;
 
(*
* Driver can do surface-reconstruction filtering for warped overlays.
*)
DDFXCAPS_OVERLAYFILTER = DDFXCAPS_OVERLAYARITHSTRETCHY;
 
(****************************************************************************
*
* DIRECTDRAW STEREO VIEW CAPABILITIES
*
****************************************************************************)
 
(*
* This flag used to be DDSVCAPS_ENIGMA, which is now obsolete
* The stereo view is accomplished via enigma encoding.
*)
DDSVCAPS_RESERVED1 = $00000001;
DDSVCAPS_ENIGMA = DDSVCAPS_RESERVED1;
 
(*
* This flag used to be DDSVCAPS_FLICKER, which is now obsolete
* The stereo view is accomplished via high frequency flickering.
*)
DDSVCAPS_RESERVED2 = $00000002;
DDSVCAPS_FLICKER = DDSVCAPS_RESERVED2;
 
(*
* This flag used to be DDSVCAPS_REDBLUE, which is now obsolete
* The stereo view is accomplished via red and blue filters applied
* to the left and right eyes. All images must adapt their colorspaces
* for this process.
*)
DDSVCAPS_RESERVED3 = $00000004;
DDSVCAPS_REDBLUE = DDSVCAPS_RESERVED3;
 
(*
* This flag used to be DDSVCAPS_SPLIT, which is now obsolete
* The stereo view is accomplished with split screen technology.
*)
DDSVCAPS_RESERVED4 = $00000008;
DDSVCAPS_SPLIT = DDSVCAPS_RESERVED4;
 
(*
* The stereo view is accomplished with switching technology
*)
DDSVCAPS_RESERVED1 = $00000001;
DDSVCAPS_RESERVED2 = $00000002;
DDSVCAPS_RESERVED3 = $00000004;
DDSVCAPS_RESERVED4 = $00000008;
DDSVCAPS_STEREOSEQUENTIAL = $00000010;
 
(****************************************************************************
*
* DIRECTDRAWPALETTE CAPABILITIES
*
****************************************************************************)
{ DirectDrawPalette Capabilities }
 
(*
* Index is 4 bits. There are sixteen color entries in the palette table.
*)
DDPCAPS_4BIT = $00000001;
DDPCAPS_4BIT = $00000001;
DDPCAPS_8BITENTRIES = $00000002;
DDPCAPS_8BIT = $00000004;
DDPCAPS_INITIALIZE = $00000008;
DDPCAPS_PRIMARYSURFACE = $00000010;
DDPCAPS_PRIMARYSURFACELEFT = $00000020;
DDPCAPS_ALLOW256 = $00000040;
DDPCAPS_VSYNC = $00000080;
DDPCAPS_1BIT = $00000100;
DDPCAPS_2BIT = $00000200;
DDPCAPS_ALPHA = $00000400;
 
(*
* Index is onto a 8 bit color index. This field is only valid with the
* DDPCAPS_1BIT, DDPCAPS_2BIT or DDPCAPS_4BIT capability and the target
* surface is in 8bpp. Each color entry is one byte long and is an index
* into destination surface's 8bpp palette.
*)
DDPCAPS_8BITENTRIES = $00000002;
{ DirectDraw BitDepth Constants }
 
(*
* Index is 8 bits. There are 256 color entries in the palette table.
*)
DDPCAPS_8BIT = $00000004;
DDBD_1 = $00004000;
DDBD_2 = $00002000;
DDBD_4 = $00001000;
DDBD_8 = $00000800;
DDBD_16 = $00000400;
DDBD_24 = $00000200;
DDBD_32 = $00000100;
 
(*
* Indicates that this DIRECTDRAWPALETTE should use the palette color array
* passed into the lpDDColorArray parameter to initialize the DIRECTDRAWPALETTE
* object.
* This flag is obsolete. DirectDraw always initializes the color array from
* the lpDDColorArray parameter. The definition remains for source-level
* compatibility.
*)
DDPCAPS_INITIALIZE = $00000008;
{ DirectDraw Set/Get Color Key Flags }
 
(*
* This palette is the one attached to the primary surface. Changing this
* table has immediate effect on the display unless DDPSETPAL_VSYNC is specified
* and supported.
*)
DDPCAPS_PRIMARYSURFACE = $00000010;
DDCKEY_COLORSPACE = $00000001;
DDCKEY_DESTBLT = $00000002;
DDCKEY_DESTOVERLAY = $00000004;
DDCKEY_SRCBLT = $00000008;
DDCKEY_SRCOVERLAY = $00000010;
 
(*
* This palette is the one attached to the primary surface left. Changing
* this table has immediate effect on the display for the left eye unless
* DDPSETPAL_VSYNC is specified and supported.
*)
DDPCAPS_PRIMARYSURFACELEFT = $00000020;
{ DirectDraw Color Key Capability Flags }
 
(*
* This palette can have all 256 entries defined
*)
DDPCAPS_ALLOW256 = $00000040;
DDCKEYCAPS_DESTBLT = $00000001;
DDCKEYCAPS_DESTBLTCLRSPACE = $00000002;
DDCKEYCAPS_DESTBLTCLRSPACEYUV = $00000004;
DDCKEYCAPS_DESTBLTYUV = $00000008;
DDCKEYCAPS_DESTOVERLAY = $00000010;
DDCKEYCAPS_DESTOVERLAYCLRSPACE = $00000020;
DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV = $00000040;
DDCKEYCAPS_DESTOVERLAYONEACTIVE = $00000080;
DDCKEYCAPS_DESTOVERLAYYUV = $00000100;
DDCKEYCAPS_SRCBLT = $00000200;
DDCKEYCAPS_SRCBLTCLRSPACE = $00000400;
DDCKEYCAPS_SRCBLTCLRSPACEYUV = $00000800;
DDCKEYCAPS_SRCBLTYUV = $00001000;
DDCKEYCAPS_SRCOVERLAY = $00002000;
DDCKEYCAPS_SRCOVERLAYCLRSPACE = $00004000;
DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV = $00008000;
DDCKEYCAPS_SRCOVERLAYONEACTIVE = $00010000;
DDCKEYCAPS_SRCOVERLAYYUV = $00020000;
DDCKEYCAPS_NOCOSTOVERLAY = $00040000;
 
(*
* This palette can have modifications to it synced with the monitors
* refresh rate.
*)
DDPCAPS_VSYNC = $00000080;
{ DirectDraw PixelFormat Flags }
 
(*
* Index is 1 bit. There are two color entries in the palette table.
*)
DDPCAPS_1BIT = $00000100;
DDPF_ALPHAPIXELS = $00000001;
DDPF_ALPHA = $00000002;
DDPF_FOURCC = $00000004;
DDPF_PALETTEINDEXED4 = $00000008;
DDPF_PALETTEINDEXEDTO8 = $00000010;
DDPF_PALETTEINDEXED8 = $00000020;
DDPF_RGB = $00000040;
DDPF_COMPRESSED = $00000080;
DDPF_RGBTOYUV = $00000100;
DDPF_YUV = $00000200;
DDPF_ZBUFFER = $00000400;
DDPF_PALETTEINDEXED1 = $00000800;
DDPF_PALETTEINDEXED2 = $00001000;
DDPF_ZPIXELS = $00002000;
DDPF_STENCILBUFFER = $00004000;
DDPF_ALPHAPREMULT = $00008000;
DDPF_LUMINANCE = $00020000;
DDPF_BUMPLUMINANCE = $00040000;
DDPF_BUMPDUDV = $00080000;
 
(*
* Index is 2 bit. There are four color entries in the palette table.
*)
DDPCAPS_2BIT = $00000200;
{ DirectDraw SetDisplayMode Flags }
 
(*
* The peFlags member of PALETTEENTRY denotes an 8 bit alpha value
*)
DDPCAPS_ALPHA = $00000400;
DDSDM_STANDARDVGAMODE = $00000001;
 
(****************************************************************************
*
* DIRECTDRAWPALETTE SETENTRY CONSTANTS
*
****************************************************************************)
{ DirectDraw EnumDisplayModes Flags }
 
DDEDM_REFRESHRATES = $00000001;
DDEDM_STANDARDVGAMODES = $00000002;
 
(****************************************************************************
*
* DIRECTDRAWPALETTE GETENTRY CONSTANTS
*
****************************************************************************)
{ DirectDraw EnumSurfaces Flags }
 
(* 0 is the only legal value *)
DDENUMSURFACES_ALL = $00000001;
DDENUMSURFACES_MATCH = $00000002;
DDENUMSURFACES_NOMATCH = $00000004;
DDENUMSURFACES_CANBECREATED = $00000008;
DDENUMSURFACES_DOESEXIST = $00000010;
 
(****************************************************************************
*
* DIRECTDRAWSURFACE SETPALETTE CONSTANTS
*
****************************************************************************)
{ DirectDraw SetCooperativeLevel Flags }
 
(*
* The passed pointer is an IUnknown ptr. The cbData argument to SetPrivateData
* must be set to sizeof(IUnknown^). DirectDraw will call AddRef through this
* pointer and Release when the private data is destroyed. This includes when
* the surface or palette is destroyed before such priovate data is destroyed.
*)
DDSPD_IUNKNOWNPOINTER = $00000001;
DDSCL_FULLSCREEN = $00000001;
DDSCL_ALLOWREBOOT = $00000002;
DDSCL_NOWINDOWCHANGES = $00000004;
DDSCL_NORMAL = $00000008;
DDSCL_EXCLUSIVE = $00000010;
DDSCL_ALLOWMODEX = $00000040;
DDSCL_SETFOCUSWINDOW = $00000080;
DDSCL_SETDEVICEWINDOW = $00000100;
DDSCL_CREATEDEVICEWINDOW = $00000200;
DDSCL_MULTITHREADED = $00000400;
DDSCL_FPUSETUP = $00000800;
DDSCL_FPUPRESERVE = $00001000;
 
(*
* Private data is only valid for the current state of the object,
* as determined by the uniqueness value.
*)
DDSPD_VOLATILE = $00000002;
{ DirectDraw Blt Flags }
 
(****************************************************************************
*
* DIRECTDRAWSURFACE SETPALETTE CONSTANTS
*
****************************************************************************)
DDBLT_ALPHADEST = $00000001;
DDBLT_ALPHADESTCONSTOVERRIDE = $00000002;
DDBLT_ALPHADESTNEG = $00000004;
DDBLT_ALPHADESTSURFACEOVERRIDE = $00000008;
DDBLT_ALPHAEDGEBLEND = $00000010;
DDBLT_ALPHASRC = $00000020;
DDBLT_ALPHASRCCONSTOVERRIDE = $00000040;
DDBLT_ALPHASRCNEG = $00000080;
DDBLT_ALPHASRCSURFACEOVERRIDE = $00000100;
DDBLT_ASYNC = $00000200;
DDBLT_COLORFILL = $00000400;
DDBLT_DDFX = $00000800;
DDBLT_DDROPS = $00001000;
DDBLT_KEYDEST = $00002000;
DDBLT_KEYDESTOVERRIDE = $00004000;
DDBLT_KEYSRC = $00008000;
DDBLT_KEYSRCOVERRIDE = $00010000;
DDBLT_ROP = $00020000;
DDBLT_ROTATIONANGLE = $00040000;
DDBLT_ZBUFFER = $00080000;
DDBLT_ZBUFFERDESTCONSTOVERRIDE = $00100000;
DDBLT_ZBUFFERDESTOVERRIDE = $00200000;
DDBLT_ZBUFFERSRCCONSTOVERRIDE = $00400000;
DDBLT_ZBUFFERSRCOVERRIDE = $00800000;
DDBLT_WAIT = $01000000;
DDBLT_DEPTHFILL = $02000000;
DDBLT_DONOTWAIT = $08000000;
 
{ BltFast Flags }
 
(****************************************************************************
*
* DIRECTDRAW BITDEPTH CONSTANTS
*
* NOTE: These are only used to indicate supported bit depths. These
* are flags only, they are not to be used as an actual bit depth. The
* absolute numbers 1, 2, 4, 8, 16, 24 and 32 are used to indicate actual
* bit depths in a surface or for changing the display mode.
*
****************************************************************************)
DDBLTFAST_NOCOLORKEY = $00000000;
DDBLTFAST_SRCCOLORKEY = $00000001;
DDBLTFAST_DESTCOLORKEY = $00000002;
DDBLTFAST_WAIT = $00000010;
DDBLTFAST_DONOTWAIT = $00000020;
 
(*
* 1 bit per pixel.
*)
DDBD_1 = $00004000;
{ Flip Flags }
 
(*
* 2 bits per pixel.
*)
DDBD_2 = $00002000;
DDFLIP_WAIT = $00000001;
DDFLIP_EVEN = $00000002;
DDFLIP_ODD = $00000004;
DDFLIP_NOVSYNC = $00000008;
DDFLIP_INTERVAL2 = $02000000;
DDFLIP_INTERVAL3 = $03000000;
DDFLIP_INTERVAL4 = $04000000;
DDFLIP_STEREO = $00000010;
DDFLIP_DONOTWAIT = $00000020;
 
(*
* 4 bits per pixel.
*)
DDBD_4 = $00001000;
{ DirectDraw Surface Overlay Flags }
 
(*
* 8 bits per pixel.
*)
DDBD_8 = $00000800;
DDOVER_ALPHADEST = $00000001;
DDOVER_ALPHADESTCONSTOVERRIDE = $00000002;
DDOVER_ALPHADESTNEG = $00000004;
DDOVER_ALPHADESTSURFACEOVERRIDE = $00000008;
DDOVER_ALPHAEDGEBLEND = $00000010;
DDOVER_ALPHASRC = $00000020;
DDOVER_ALPHASRCCONSTOVERRIDE = $00000040;
DDOVER_ALPHASRCNEG = $00000080;
DDOVER_ALPHASRCSURFACEOVERRIDE = $00000100;
DDOVER_HIDE = $00000200;
DDOVER_KEYDEST = $00000400;
DDOVER_KEYDESTOVERRIDE = $00000800;
DDOVER_KEYSRC = $00001000;
DDOVER_KEYSRCOVERRIDE = $00002000;
DDOVER_SHOW = $00004000;
DDOVER_ADDDIRTYRECT = $00008000;
DDOVER_REFRESHDIRTYRECTS = $00010000;
DDOVER_REFRESHALL = $00020000;
DDOVER_DDFX = $00080000;
DDOVER_AUTOFLIP = $00100000;
DDOVER_BOB = $00200000;
DDOVER_OVERRIDEBOBWEAVE = $00400000;
DDOVER_INTERLEAVED = $00800000;
DDOVER_BOBHARDWARE = $01000000;
DDOVER_ARGBSCALEFACTORS = $02000000;
DDOVER_DEGRADEARGBSCALING = $04000000;
 
(*
* 16 bits per pixel.
*)
DDBD_16 = $00000400;
{ DirectDrawSurface Lock Flags }
 
(*
* 24 bits per pixel.
*)
DDBD_24 = $00000200;
DDLOCK_SURFACEMEMORYPTR = $00000000; // default
DDLOCK_WAIT = $00000001;
DDLOCK_EVENT = $00000002;
DDLOCK_READONLY = $00000010;
DDLOCK_WRITEONLY = $00000020;
DDLOCK_NOSYSLOCK = $00000800;
DDLOCK_NOOVERWRITE = $00001000;
DDLOCK_DISCARDCONTENTS = $00002000;
DDLOCK_OKTOSWAP = $00002000;
DDLOCK_DONOTWAIT = $00004000;
 
(*
* 32 bits per pixel.
*)
DDBD_32 = $00000100;
{ DirectDrawSurface Blt FX Flags }
 
(****************************************************************************
*
* DIRECTDRAWSURFACE SET/GET COLOR KEY FLAGS
*
****************************************************************************)
DDBLTFX_ARITHSTRETCHY = $00000001;
DDBLTFX_MIRRORLEFTRIGHT = $00000002;
DDBLTFX_MIRRORUPDOWN = $00000004;
DDBLTFX_NOTEARING = $00000008;
DDBLTFX_ROTATE180 = $00000010;
DDBLTFX_ROTATE270 = $00000020;
DDBLTFX_ROTATE90 = $00000040;
DDBLTFX_ZBUFFERRANGE = $00000080;
DDBLTFX_ZBUFFERBASEDEST = $00000100;
 
(*
* Set if the structure contains a color space. Not set if the structure
* contains a single color key.
*)
DDCKEY_COLORSPACE = $00000001;
{ DirectDrawSurface Overlay FX Flags }
 
(*
* Set if the structure specifies a color key or color space which is to be
* used as a destination color key for blt operations.
*)
DDCKEY_DESTBLT = $00000002;
DDOVERFX_ARITHSTRETCHY = $00000001;
DDOVERFX_MIRRORLEFTRIGHT = $00000002;
DDOVERFX_MIRRORUPDOWN = $00000004;
 
(*
* Set if the structure specifies a color key or color space which is to be
* used as a destination color key for overlay operations.
*)
DDCKEY_DESTOVERLAY = $00000004;
{ Flags for dwDDFX member of DDSPRITEFX structure }
 
(*
* Set if the structure specifies a color key or color space which is to be
* used as a source color key for blt operations.
*)
DDCKEY_SRCBLT = $00000008;
DDSPRITEFX_AFFINETRANSFORM = $00000001;
DDSPRITEFX_RGBASCALING = $00000002;
DDSPRITEFX_DEGRADERGBASCALING = $00000004;
DDSPRITEFX_BILINEARFILTER = $00000008;
DDSPRITEFX_BLURFILTER = $00000010;
DDSPRITEFX_FLATFILTER = $00000020;
DDSPRITEFX_DEGRADEFILTER = $00000040;
 
(*
* Set if the structure specifies a color key or color space which is to be
* used as a source color key for overlay operations.
*)
DDCKEY_SRCOVERLAY = $00000010;
{ DirectDraw WaitForVerticalBlank Flags }
 
DDWAITVB_BLOCKBEGIN = $00000001;
DDWAITVB_BLOCKBEGINEVENT = $00000002;
DDWAITVB_BLOCKEND = $00000004;
 
(****************************************************************************
*
* DIRECTDRAW COLOR KEY CAPABILITY FLAGS
*
****************************************************************************)
{ DirectDraw GetFlipStatus Flags }
 
(*
* Supports transparent blting using a color key to identify the replaceable
* bits of the destination surface for RGB colors.
*)
DDCKEYCAPS_DESTBLT = $00000001;
DDGFS_CANFLIP = $00000001;
DDGFS_ISFLIPDONE = $00000002;
 
(*
* Supports transparent blting using a color space to identify the replaceable
* bits of the destination surface for RGB colors.
*)
DDCKEYCAPS_DESTBLTCLRSPACE = $00000002;
{ DirectDraw GetBltStatus Flags }
 
(*
* Supports transparent blting using a color space to identify the replaceable
* bits of the destination surface for YUV colors.
*)
DDCKEYCAPS_DESTBLTCLRSPACEYUV = $00000004;
DDGBS_CANBLT = $00000001;
DDGBS_ISBLTDONE = $00000002;
 
(*
* Supports transparent blting using a color key to identify the replaceable
* bits of the destination surface for YUV colors.
*)
DDCKEYCAPS_DESTBLTYUV = $00000008;
{ DirectDraw EnumOverlayZOrder Flags }
 
(*
* Supports overlaying using colorkeying of the replaceable bits of the surface
* being overlayed for RGB colors.
*)
DDCKEYCAPS_DESTOVERLAY = $00000010;
DDENUMOVERLAYZ_BACKTOFRONT = $00000000;
DDENUMOVERLAYZ_FRONTTOBACK = $00000001;
 
(*
* Supports a color space as the color key for the destination for RGB colors.
*)
DDCKEYCAPS_DESTOVERLAYCLRSPACE = $00000020;
{ DirectDraw UpdateOverlayZOrder Flags }
 
(*
* Supports a color space as the color key for the destination for YUV colors.
*)
DDCKEYCAPS_DESTOVERLAYCLRSPACEYUV = $00000040;
DDOVERZ_SENDTOFRONT = $00000000;
DDOVERZ_SENDTOBACK = $00000001;
DDOVERZ_MOVEFORWARD = $00000002;
DDOVERZ_MOVEBACKWARD = $00000003;
DDOVERZ_INSERTINFRONTOF = $00000004;
DDOVERZ_INSERTINBACKOF = $00000005;
 
(*
* Supports only one active destination color key value for visible overlay
* surfaces.
*)
DDCKEYCAPS_DESTOVERLAYONEACTIVE = $00000080;
{ DirectDrawSurface SetPrivateData Constants }
 
(*
* Supports overlaying using colorkeying of the replaceable bits of the
* surface being overlayed for YUV colors.
*)
DDCKEYCAPS_DESTOVERLAYYUV = $00000100;
DDSPD_IUNKNOWNPOINTER = $00000001;
DDSPD_VOLATILE = $00000002;
 
(*
* Supports transparent blting using the color key for the source with
* this surface for RGB colors.
*)
DDCKEYCAPS_SRCBLT = $00000200;
{ TDDColorControl flags }
 
(*
* Supports transparent blting using a color space for the source with
* this surface for RGB colors.
*)
DDCKEYCAPS_SRCBLTCLRSPACE = $00000400;
DDCOLOR_BRIGHTNESS = $00000001;
DDCOLOR_CONTRAST = $00000002;
DDCOLOR_HUE = $00000004;
DDCOLOR_SATURATION = $00000008;
DDCOLOR_SHARPNESS = $00000010;
DDCOLOR_GAMMA = $00000020;
DDCOLOR_COLORENABLE = $00000040;
 
(*
* Supports transparent blting using a color space for the source with
* this surface for YUV colors.
*)
DDCKEYCAPS_SRCBLTCLRSPACEYUV = $00000800;
{ DirectDraw SetGammaRamp Flags }
 
(*
* Supports transparent blting using the color key for the source with
* this surface for YUV colors.
*)
DDCKEYCAPS_SRCBLTYUV = $00001000;
DDSGR_CALIBRATE = $00000001;
 
(*
* Supports overlays using the color key for the source with this
* overlay surface for RGB colors.
*)
DDCKEYCAPS_SRCOVERLAY = $00002000;
{ DirectDraw StartModeTest Flags }
 
(*
* Supports overlays using a color space as the source color key for
* the overlay surface for RGB colors.
*)
DDCKEYCAPS_SRCOVERLAYCLRSPACE = $00004000;
DDSMT_ISTESTREQUIRED = $00000001;
 
(*
* Supports overlays using a color space as the source color key for
* the overlay surface for YUV colors.
*)
DDCKEYCAPS_SRCOVERLAYCLRSPACEYUV = $00008000;
{ DirectDraw EvaluateMode Flags }
 
(*
* Supports only one active source color key value for visible
* overlay surfaces.
*)
DDCKEYCAPS_SRCOVERLAYONEACTIVE = $00010000;
DDEM_MODEPASSED = $00000001;
DDEM_MODEFAILED = $00000002;
 
(*
* Supports overlays using the color key for the source with this
* overlay surface for YUV colors.
*)
DDCKEYCAPS_SRCOVERLAYYUV = $00020000;
{ DirectDraw Return Codes }
 
(*
* there are no bandwidth trade-offs for using colorkey with an overlay
*)
DDCKEYCAPS_NOCOSTOVERLAY = $00040000;
DD_OK = HResult(0);
DD_FALSE = HResult(S_FALSE);
 
{ DirectDraw EnumCallback Return Values }
 
(****************************************************************************
*
* DIRECTDRAW PIXELFORMAT FLAGS
*
****************************************************************************)
DDENUMRET_CANCEL = 0;
DDENUMRET_OK = 1;
 
(*
* The surface has alpha channel information in the pixel format.
*)
DDPF_ALPHAPIXELS = $00000001;
{ DirectDraw Error Codes }
 
(*
* The pixel format contains alpha only information
*)
DDPF_ALPHA = $00000002;
DDERR_ALREADYINITIALIZED = HResult($88760000 + 5);
DDERR_CANNOTATTACHSURFACE = HResult($88760000 + 10);
DDERR_CANNOTDETACHSURFACE = HResult($88760000 + 20);
DDERR_CURRENTLYNOTAVAIL = HResult($88760000 + 40);
DDERR_EXCEPTION = HResult($88760000 + 55);
DDERR_GENERIC = HResult(E_FAIL);
DDERR_HEIGHTALIGN = HResult($88760000 + 90);
DDERR_INCOMPATIBLEPRIMARY = HResult($88760000 + 95);
DDERR_INVALIDCAPS = HResult($88760000 + 100);
DDERR_INVALIDCLIPLIST = HResult($88760000 + 110);
DDERR_INVALIDMODE = HResult($88760000 + 120);
DDERR_INVALIDOBJECT = HResult($88760000 + 130);
DDERR_INVALIDPARAMS = HResult(E_INVALIDARG);
DDERR_INVALIDPIXELFORMAT = HResult($88760000 + 145);
DDERR_INVALIDRECT = HResult($88760000 + 150);
DDERR_LOCKEDSURFACES = HResult($88760000 + 160);
DDERR_NO3D = HResult($88760000 + 170);
DDERR_NOALPHAHW = HResult($88760000 + 180);
DDERR_NOSTEREOHARDWARE = HResult($88760000 + 181);
DDERR_NOSURFACELEFT = HResult($88760000 + 182);
DDERR_NOCLIPLIST = HResult($88760000 + 205);
DDERR_NOCOLORCONVHW = HResult($88760000 + 210);
DDERR_NOCOOPERATIVELEVELSET = HResult($88760000 + 212);
DDERR_NOCOLORKEY = HResult($88760000 + 215);
DDERR_NOCOLORKEYHW = HResult($88760000 + 220);
DDERR_NODIRECTDRAWSUPPORT = HResult($88760000 + 222);
DDERR_NOEXCLUSIVEMODE = HResult($88760000 + 225);
DDERR_NOFLIPHW = HResult($88760000 + 230);
DDERR_NOGDI = HResult($88760000 + 240);
DDERR_NOMIRRORHW = HResult($88760000 + 250);
DDERR_NOTFOUND = HResult($88760000 + 255);
DDERR_NOOVERLAYHW = HResult($88760000 + 260);
DDERR_OVERLAPPINGRECTS = HResult($88760000 + 270);
DDERR_NORASTEROPHW = HResult($88760000 + 280);
DDERR_NOROTATIONHW = HResult($88760000 + 290);
DDERR_NOSTRETCHHW = HResult($88760000 + 310);
DDERR_NOT4BITCOLOR = HResult($88760000 + 316);
DDERR_NOT4BITCOLORINDEX = HResult($88760000 + 317);
DDERR_NOT8BITCOLOR = HResult($88760000 + 320);
DDERR_NOTEXTUREHW = HResult($88760000 + 330);
DDERR_NOVSYNCHW = HResult($88760000 + 335);
DDERR_NOZBUFFERHW = HResult($88760000 + 340);
DDERR_NOZOVERLAYHW = HResult($88760000 + 350);
DDERR_OUTOFCAPS = HResult($88760000 + 360);
DDERR_OUTOFMEMORY = HResult(E_OUTOFMEMORY);
DDERR_OUTOFVIDEOMEMORY = HResult($88760000 + 380);
DDERR_OVERLAYCANTCLIP = HResult($88760000 + 382);
DDERR_OVERLAYCOLORKEYONLYONEACTIVE = HResult($88760000 + 384);
DDERR_PALETTEBUSY = HResult($88760000 + 387);
DDERR_COLORKEYNOTSET = HResult($88760000 + 400);
DDERR_SURFACEALREADYATTACHED = HResult($88760000 + 410);
DDERR_SURFACEALREADYDEPENDENT = HResult($88760000 + 420);
DDERR_SURFACEBUSY = HResult($88760000 + 430);
DDERR_CANTLOCKSURFACE = HResult($88760000 + 435);
DDERR_SURFACEISOBSCURED = HResult($88760000 + 440);
DDERR_SURFACELOST = HResult($88760000 + 450);
DDERR_SURFACENOTATTACHED = HResult($88760000 + 460);
DDERR_TOOBIGHEIGHT = HResult($88760000 + 470);
DDERR_TOOBIGSIZE = HResult($88760000 + 480);
DDERR_TOOBIGWIDTH = HResult($88760000 + 490);
DDERR_UNSUPPORTED = HResult(E_NOTIMPL);
DDERR_UNSUPPORTEDFORMAT = HResult($88760000 + 510);
DDERR_UNSUPPORTEDMASK = HResult($88760000 + 520);
DDERR_INVALIDSTREAM = HResult($88760000 + 521);
DDERR_VERTICALBLANKINPROGRESS = HResult($88760000 + 537);
DDERR_WASSTILLDRAWING = HResult($88760000 + 540);
DDERR_DDSCAPSCOMPLEXREQUIRED = HResult($88760000 + 542);
DDERR_XALIGN = HResult($88760000 + 560);
DDERR_INVALIDDIRECTDRAWGUID = HResult($88760000 + 561);
DDERR_DIRECTDRAWALREADYCREATED = HResult($88760000 + 562);
DDERR_NODIRECTDRAWHW = HResult($88760000 + 563);
DDERR_PRIMARYSURFACEALREADYEXISTS = HResult($88760000 + 564);
DDERR_NOEMULATION = HResult($88760000 + 565);
DDERR_REGIONTOOSMALL = HResult($88760000 + 566);
DDERR_CLIPPERISUSINGHWND = HResult($88760000 + 567);
DDERR_NOCLIPPERATTACHED = HResult($88760000 + 568);
DDERR_NOHWND = HResult($88760000 + 569);
DDERR_HWNDSUBCLASSED = HResult($88760000 + 570);
DDERR_HWNDALREADYSET = HResult($88760000 + 571);
DDERR_NOPALETTEATTACHED = HResult($88760000 + 572);
DDERR_NOPALETTEHW = HResult($88760000 + 573);
DDERR_BLTFASTCANTCLIP = HResult($88760000 + 574);
DDERR_NOBLTHW = HResult($88760000 + 575);
DDERR_NODDROPSHW = HResult($88760000 + 576);
DDERR_OVERLAYNOTVISIBLE = HResult($88760000 + 577);
DDERR_NOOVERLAYDEST = HResult($88760000 + 578);
DDERR_INVALIDPOSITION = HResult($88760000 + 579);
DDERR_NOTAOVERLAYSURFACE = HResult($88760000 + 580);
DDERR_EXCLUSIVEMODEALREADYSET = HResult($88760000 + 581);
DDERR_NOTFLIPPABLE = HResult($88760000 + 582);
DDERR_CANTDUPLICATE = HResult($88760000 + 583);
DDERR_NOTLOCKED = HResult($88760000 + 584);
DDERR_CANTCREATEDC = HResult($88760000 + 585);
DDERR_NODC = HResult($88760000 + 586);
DDERR_WRONGMODE = HResult($88760000 + 587);
DDERR_IMPLICITLYCREATED = HResult($88760000 + 588);
DDERR_NOTPALETTIZED = HResult($88760000 + 589);
DDERR_UNSUPPORTEDMODE = HResult($88760000 + 590);
DDERR_NOMIPMAPHW = HResult($88760000 + 591);
DDERR_INVALIDSURFACETYPE = HResult($88760000 + 592);
DDERR_NOOPTIMIZEHW = HResult($88760000 + 600);
DDERR_NOTLOADED = HResult($88760000 + 601);
DDERR_NOFOCUSWINDOW = HResult($88760000 + 602);
DDERR_NOTONMIPMAPSUBLEVEL = HResult($88760000 + 603);
DDERR_DCALREADYCREATED = HResult($88760000 + 620);
DDERR_NONONLOCALVIDMEM = HResult($88760000 + 630);
DDERR_CANTPAGELOCK = HResult($88760000 + 640);
DDERR_CANTPAGEUNLOCK = HResult($88760000 + 660);
DDERR_NOTPAGELOCKED = HResult($88760000 + 680);
DDERR_MOREDATA = HResult($88760000 + 690);
DDERR_EXPIRED = HResult($88760000 + 691);
DDERR_TESTFINISHED = HResult($88760000 + 692);
DDERR_NEWMODE = HResult($88760000 + 693);
DDERR_D3DNOTINITIALIZED = HResult($88760000 + 694);
DDERR_VIDEONOTACTIVE = HResult($88760000 + 695);
DDERR_NOMONITORINFORMATION = HResult($88760000 + 696);
DDERR_NODRIVERSUPPORT = HResult($88760000 + 697);
DDERR_DEVICEDOESNTOWNSURFACE = HResult($88760000 + 699);
DDERR_NOTINITIALIZED = HResult(CO_E_NOTINITIALIZED);
 
(*
* The FourCC code is valid.
*)
DDPF_FOURCC = $00000004;
{ API's }
 
(*
* The surface is 4-bit color indexed.
*)
DDPF_PALETTEINDEXED4 = $00000008;
function GET_WHQL_YEAR(dwWHQLLevel: DWORD): DWORD;
function GET_WHQL_MONTH(dwWHQLLevel: DWORD): DWORD;
function GET_WHQL_DAY(dwWHQLLevel: DWORD): DWORD;
 
(*
* The surface is indexed into a palette which stores indices
* into the destination surface's 8-bit palette.
*)
DDPF_PALETTEINDEXEDTO8 = $00000010;
type
HMonitor = THandle;
 
(*
* The surface is 8-bit color indexed.
*)
DDPF_PALETTEINDEXED8 = $00000020;
TDDEnumCallbackA = function(lpGUID: PGUID; lpDriverDescription: LPSTR;
lpDriverName: LPSTR; lpContext: Pointer): BOOL; stdcall;
LPDDENUMCALLBACKA = TDDEnumCallbackA;
 
(*
* The RGB data in the pixel format structure is valid.
*)
DDPF_RGB = $00000040;
TDDEnumCallbackW = function(lpGUID: PGUID; lpDriverDescription: LPWSTR;
lpDriverName: LPWSTR; lpContext: Pointer): BOOL; stdcall;
LPDDENUMCALLBACKW = TDDEnumCallbackW;
 
(*
* The surface will accept pixel data in the format specified
* and compress it during the write.
*)
DDPF_COMPRESSED = $00000080;
TDDEnumCallback = TDDEnumCallbackA;
LPDDENUMCALLBACK = TDDEnumCallback;
 
(*
* The surface will accept RGB data and translate it during
* the write to YUV data. The format of the data to be written
* will be contained in the pixel format structure. The DDPF_RGB
* flag will be set.
*)
DDPF_RGBTOYUV = $00000100;
TDDEnumCallbackExA = function(lpGUID: PGUID; lpDriverDescription: LPSTR;
lpDriverName: LPSTR; lpContext: Pointer; Monitor: HMonitor): BOOL; stdcall;
LPDDENUMCALLBACKEXA = TDDEnumCallbackExA;
 
(*
* pixel format is YUV - YUV data in pixel format struct is valid
*)
DDPF_YUV = $00000200;
TDDEnumCallbackExW = function(lpGUID: PGUID; lpDriverDescription: LPWSTR;
lpDriverName: LPWSTR; lpContext: Pointer; Monitor: HMonitor): BOOL; stdcall;
LPDDENUMCALLBACKEXW = TDDEnumCallbackExW;
 
(*
* pixel format is a z buffer only surface
*)
DDPF_ZBUFFER = $00000400;
 
(*
* The surface is 1-bit color indexed.
*)
DDPF_PALETTEINDEXED1 = $00000800;
 
(*
* The surface is 2-bit color indexed.
*)
DDPF_PALETTEINDEXED2 = $00001000;
 
(*
* The surface contains Z information in the pixels
*)
DDPF_ZPIXELS = $00002000;
 
(*
* The surface contains stencil information along with Z
*)
DDPF_STENCILBUFFER = $00004000;
 
(*
* Premultiplied alpha format -- the color components have been
* premultiplied by the alpha component.
*)
DDPF_ALPHAPREMULT = $00008000;
 
 
(*
* Luminance data in the pixel format is valid.
* Use this flag for luminance-only or luminance+alpha surfaces,
* the bit depth is then ddpf.dwLuminanceBitCount.
*)
DDPF_LUMINANCE = $00020000;
 
(*
* Luminance data in the pixel format is valid.
* Use this flag when hanging luminance off bumpmap surfaces,
* the bit mask for the luminance portion of the pixel is then
* ddpf.dwBumpLuminanceBitMask
*)
DDPF_BUMPLUMINANCE = $00040000;
 
(*
* Bump map dUdV data in the pixel format is valid.
*)
DDPF_BUMPDUDV = $00080000;
 
(*===========================================================================
*
*
* DIRECTDRAW CALLBACK FLAGS
*
*
*==========================================================================*)
 
(****************************************************************************
*
* DIRECTDRAW ENUMSURFACES FLAGS
*
****************************************************************************)
 
(*
* Enumerate all of the surfaces that meet the search criterion.
*)
DDENUMSURFACES_ALL = $00000001;
 
(*
* A search hit is a surface that matches the surface description.
*)
DDENUMSURFACES_MATCH = $00000002;
 
(*
* A search hit is a surface that does not match the surface description.
*)
DDENUMSURFACES_NOMATCH = $00000004;
 
(*
* Enumerate the first surface that can be created which meets the search criterion.
*)
DDENUMSURFACES_CANBECREATED = $00000008;
 
(*
* Enumerate the surfaces that already exist that meet the search criterion.
*)
DDENUMSURFACES_DOESEXIST = $00000010;
 
(****************************************************************************
*
* DIRECTDRAW SETDISPLAYMODE FLAGS
*
****************************************************************************)
 
(*
* The desired mode is a standard VGA mode
*)
DDSDM_STANDARDVGAMODE = $00000001;
 
(****************************************************************************
*
* DIRECTDRAW ENUMDISPLAYMODES FLAGS
*
****************************************************************************)
 
(*
* Enumerate Modes with different refresh rates. EnumDisplayModes guarantees
* that a particular mode will be enumerated only once. This flag specifies whether
* the refresh rate is taken into account when determining if a mode is unique.
*)
DDEDM_REFRESHRATES = $00000001;
 
(*
* Enumerate VGA modes. Specify this flag if you wish to enumerate supported VGA
* modes such as mode 0x13 in addition to the usual ModeX modes (which are always
* enumerated if the application has previously called SetCooperativeLevel with the
* DDSCL_ALLOWMODEX flag set).
*)
DDEDM_STANDARDVGAMODES = $00000002;
 
 
(****************************************************************************
*
* DIRECTDRAW SETCOOPERATIVELEVEL FLAGS
*
****************************************************************************)
 
(*
* Exclusive mode owner will be responsible for the entire primary surface.
* GDI can be ignored. used with DD
*)
DDSCL_FULLSCREEN = $00000001;
 
(*
* allow CTRL_ALT_DEL to work while in fullscreen exclusive mode
*)
DDSCL_ALLOWREBOOT = $00000002;
 
(*
* prevents DDRAW from modifying the application window.
* prevents DDRAW from minimize/restore the application window on activation.
*)
DDSCL_NOWINDOWCHANGES = $00000004;
 
(*
* app wants to work as a regular Windows application
*)
DDSCL_NORMAL = $00000008;
 
(*
* app wants exclusive access
*)
DDSCL_EXCLUSIVE = $00000010;
 
 
(*
* app can deal with non-windows display modes
*)
DDSCL_ALLOWMODEX = $00000040;
 
(*
* this window will receive the focus messages
*)
DDSCL_SETFOCUSWINDOW = $00000080;
 
(*
* this window is associated with the DDRAW object and will
* cover the screen in fullscreen mode
*)
DDSCL_SETDEVICEWINDOW = $00000100;
 
(*
* app wants DDRAW to create a window to be associated with the
* DDRAW object
*)
DDSCL_CREATEDEVICEWINDOW = $00000200;
 
(*
* App explicitly asks DDRAW/D3D to be multithread safe. This makes D3D
* take the global crtisec more frequently.
*)
DDSCL_MULTITHREADED = $00000400;
 
(*
* App hints that it would like to keep the FPU set up for optimal Direct3D
* performance (single precision and exceptions disabled) so Direct3D
* does not need to explicitly set the FPU each time
*)
DDSCL_FPUSETUP = $00000800;
 
(*
* App specifies that it needs either double precision FPU or FPU exceptions
* enabled. This makes Direct3D explicitly set the FPU state eah time it is
* called. Setting the flag will reduce Direct3D performance. The flag is
* assumed by default in DirectX 6 and earlier. See also DDSCL_FPUSETUP
*)
DDSCL_FPUPRESERVE = $00001000;
 
(****************************************************************************
*
* DIRECTDRAW BLT FLAGS
*
****************************************************************************)
 
(*
* Use the alpha information in the pixel format or the alpha channel surface
* attached to the destination surface as the alpha channel for this blt.
*)
DDBLT_ALPHADEST = $00000001;
 
(*
* Use the dwConstAlphaDest field in the TDDBltFX structure as the alpha channel
* for the destination surface for this blt.
*)
DDBLT_ALPHADESTCONSTOVERRIDE = $00000002;
 
(*
* The NEG suffix indicates that the destination surface becomes more
* transparent as the alpha value increases. (0 is opaque)
*)
DDBLT_ALPHADESTNEG = $00000004;
 
(*
* Use the lpDDSAlphaDest field in the TDDBltFX structure as the alpha
* channel for the destination for this blt.
*)
DDBLT_ALPHADESTSURFACEOVERRIDE = $00000008;
 
(*
* Use the dwAlphaEdgeBlend field in the TDDBltFX structure as the alpha channel
* for the edges of the image that border the color key colors.
*)
DDBLT_ALPHAEDGEBLEND = $00000010;
 
(*
* Use the alpha information in the pixel format or the alpha channel surface
* attached to the source surface as the alpha channel for this blt.
*)
DDBLT_ALPHASRC = $00000020;
 
(*
* Use the dwConstAlphaSrc field in the TDDBltFX structure as the alpha channel
* for the source for this blt.
*)
DDBLT_ALPHASRCCONSTOVERRIDE = $00000040;
 
(*
* The NEG suffix indicates that the source surface becomes more transparent
* as the alpha value increases. (0 is opaque)
*)
DDBLT_ALPHASRCNEG = $00000080;
 
(*
* Use the lpDDSAlphaSrc field in the TDDBltFX structure as the alpha channel
* for the source for this blt.
*)
DDBLT_ALPHASRCSURFACEOVERRIDE = $00000100;
 
(*
* Do this blt asynchronously through the FIFO in the order received. If
* there is no room in the hardware FIFO fail the call.
*)
DDBLT_ASYNC = $00000200;
 
(*
* Uses the dwFillColor field in the TDDBltFX structure as the RGB color
* to fill the destination rectangle on the destination surface with.
*)
DDBLT_COLORFILL = $00000400;
 
(*
* Uses the dwDDFX field in the TDDBltFX structure to specify the effects
* to use for the blt.
*)
DDBLT_DDFX = $00000800;
 
(*
* Uses the dwDDROPS field in the TDDBltFX structure to specify the ROPS
* that are not part of the Win32 API.
*)
DDBLT_DDROPS = $00001000;
 
(*
* Use the color key associated with the destination surface.
*)
DDBLT_KEYDEST = $00002000;
 
(*
* Use the dckDestColorkey field in the TDDBltFX structure as the color key
* for the destination surface.
*)
DDBLT_KEYDESTOVERRIDE = $00004000;
 
(*
* Use the color key associated with the source surface.
*)
DDBLT_KEYSRC = $00008000;
 
(*
* Use the dckSrcColorkey field in the TDDBltFX structure as the color key
* for the source surface.
*)
DDBLT_KEYSRCOVERRIDE = $00010000;
 
(*
* Use the dwROP field in the TDDBltFX structure for the raster operation
* for this blt. These ROPs are the same as the ones defined in the Win32 API.
*)
DDBLT_ROP = $00020000;
 
(*
* Use the dwRotationAngle field in the TDDBltFX structure as the angle
* (specified in 1/100th of a degree) to rotate the surface.
*)
DDBLT_ROTATIONANGLE = $00040000;
 
(*
* Z-buffered blt using the z-buffers attached to the source and destination
* surfaces and the dwZBufferOpCode field in the TDDBltFX structure as the
* z-buffer opcode.
*)
DDBLT_ZBUFFER = $00080000;
 
(*
* Z-buffered blt using the dwConstDest Zfield and the dwZBufferOpCode field
* in the TDDBltFX structure as the z-buffer and z-buffer opcode respectively
* for the destination.
*)
DDBLT_ZBUFFERDESTCONSTOVERRIDE = $00100000;
 
(*
* Z-buffered blt using the lpDDSDestZBuffer field and the dwZBufferOpCode
* field in the TDDBltFX structure as the z-buffer and z-buffer opcode
* respectively for the destination.
*)
DDBLT_ZBUFFERDESTOVERRIDE = $00200000;
 
(*
* Z-buffered blt using the dwConstSrcZ field and the dwZBufferOpCode field
* in the TDDBltFX structure as the z-buffer and z-buffer opcode respectively
* for the source.
*)
DDBLT_ZBUFFERSRCCONSTOVERRIDE = $00400000;
 
(*
* Z-buffered blt using the lpDDSSrcZBuffer field and the dwZBufferOpCode
* field in the TDDBltFX structure as the z-buffer and z-buffer opcode
* respectively for the source.
*)
DDBLT_ZBUFFERSRCOVERRIDE = $00800000;
 
(*
* wait until the device is ready to handle the blt
* this will cause blt to not return DDERR_WASSTILLDRAWING
*)
DDBLT_WAIT = $01000000;
 
(*
* Uses the dwFillDepth field in the TDDBltFX structure as the depth value
* to fill the destination rectangle on the destination Z-buffer surface
* with.
*)
DDBLT_DEPTHFILL = $02000000;
 
(*
* wait until the device is ready to handle the blt
* this will cause blt to not return DDERR_WASSTILLDRAWING
*)
DDBLT_DONOTWAIT = $08000000;
 
(****************************************************************************
*
* BLTFAST FLAGS
*
****************************************************************************)
 
DDBLTFAST_NOCOLORKEY = $00000000;
DDBLTFAST_SRCCOLORKEY = $00000001;
DDBLTFAST_DESTCOLORKEY = $00000002;
DDBLTFAST_WAIT = $00000010;
DDBLTFAST_DONOTWAIT = $00000020;
 
(****************************************************************************
*
* FLIP FLAGS
*
****************************************************************************)
 
 
DDFLIP_WAIT = $00000001;
 
(*
* Indicates that the target surface contains the even field of video data.
* This flag is only valid with an overlay surface.
*)
DDFLIP_EVEN = $00000002;
 
(*
* Indicates that the target surface contains the odd field of video data.
* This flag is only valid with an overlay surface.
*)
DDFLIP_ODD = $00000004;
 
(*
* Causes DirectDraw to perform the physical flip immediately and return
* to the application. Typically, what was the front buffer but is now the back
* buffer will still be visible (depending on timing) until the next vertical
* retrace. Subsequent operations involving the two flipped surfaces will
* not check to see if the physical flip has finished (i.e. will not return
* DDERR_WASSTILLDRAWING for that reason (but may for other reasons)).
* This allows an application to perform Flips at a higher frequency than the
* monitor refresh rate, but may introduce visible artifacts.
* Only effective if DDCAPS2_FLIPNOVSYNC is set. If that bit is not set,
* DDFLIP_NOVSYNC has no effect.
*)
DDFLIP_NOVSYNC = $00000008;
 
 
(*
* Flip Interval Flags. These flags indicate how many vertical retraces to wait between
* each flip. The default is one. DirectDraw will return DDERR_WASSTILLDRAWING for each
* surface involved in the flip until the specified number of vertical retraces has
* ocurred. Only effective if DDCAPS2_FLIPINTERVAL is set. If that bit is not set,
* DDFLIP_INTERVALn has no effect.
*)
 
(*
* DirectDraw will flip on every other vertical sync
*)
DDFLIP_INTERVAL2 = $02000000;
 
 
(*
* DirectDraw will flip on every third vertical sync
*)
DDFLIP_INTERVAL3 = $03000000;
 
 
(*
* DirectDraw will flip on every fourth vertical sync
*)
DDFLIP_INTERVAL4 = $04000000;
 
(*
* DirectDraw will flip and display a main stereo surface
*)
DDFLIP_STEREO = $00000010;
 
(*
* On IDirectDrawSurface7 and higher interfaces, the default is DDFLIP_WAIT. If you wish
* to override the default and use time when the accelerator is busy (as denoted by
* the DDERR_WASSTILLDRAWING return code) then use DDFLIP_DONOTWAIT.
*)
DDFLIP_DONOTWAIT = $00000020;
 
(****************************************************************************
*
* DIRECTDRAW SURFACE OVERLAY FLAGS
*
****************************************************************************)
 
(*
* Use the alpha information in the pixel format or the alpha channel surface
* attached to the destination surface as the alpha channel for the
* destination overlay.
*)
DDOVER_ALPHADEST = $00000001;
 
(*
* Use the dwConstAlphaDest field in the TDDOverlayFX structure as the
* destination alpha channel for this overlay.
*)
DDOVER_ALPHADESTCONSTOVERRIDE = $00000002;
 
(*
* The NEG suffix indicates that the destination surface becomes more
* transparent as the alpha value increases.
*)
DDOVER_ALPHADESTNEG = $00000004;
 
(*
* Use the lpDDSAlphaDest field in the TDDOverlayFX structure as the alpha
* channel destination for this overlay.
*)
DDOVER_ALPHADESTSURFACEOVERRIDE = $00000008;
 
(*
* Use the dwAlphaEdgeBlend field in the TDDOverlayFX structure as the alpha
* channel for the edges of the image that border the color key colors.
*)
DDOVER_ALPHAEDGEBLEND = $00000010;
 
(*
* Use the alpha information in the pixel format or the alpha channel surface
* attached to the source surface as the source alpha channel for this overlay.
*)
DDOVER_ALPHASRC = $00000020;
 
(*
* Use the dwConstAlphaSrc field in the TDDOverlayFX structure as the source
* alpha channel for this overlay.
*)
DDOVER_ALPHASRCCONSTOVERRIDE = $00000040;
 
(*
* The NEG suffix indicates that the source surface becomes more transparent
* as the alpha value increases.
*)
DDOVER_ALPHASRCNEG = $00000080;
 
(*
* Use the lpDDSAlphaSrc field in the TDDOverlayFX structure as the alpha channel
* source for this overlay.
*)
DDOVER_ALPHASRCSURFACEOVERRIDE = $00000100;
 
(*
* Turn this overlay off.
*)
DDOVER_HIDE = $00000200;
 
(*
* Use the color key associated with the destination surface.
*)
DDOVER_KEYDEST = $00000400;
 
(*
* Use the dckDestColorkey field in the TDDOverlayFX structure as the color key
* for the destination surface
*)
DDOVER_KEYDESTOVERRIDE = $00000800;
 
(*
* Use the color key associated with the source surface.
*)
DDOVER_KEYSRC = $00001000;
 
(*
* Use the dckSrcColorkey field in the TDDOverlayFX structure as the color key
* for the source surface.
*)
DDOVER_KEYSRCOVERRIDE = $00002000;
 
(*
* Turn this overlay on.
*)
DDOVER_SHOW = $00004000;
 
(*
* Add a dirty rect to an emulated overlayed surface.
*)
DDOVER_ADDDIRTYRECT = $00008000;
 
(*
* Redraw all dirty rects on an emulated overlayed surface.
*)
DDOVER_REFRESHDIRTYRECTS = $00010000;
 
(*
* Redraw the entire surface on an emulated overlayed surface.
*)
DDOVER_REFRESHALL = $00020000;
 
(*
* Use the overlay FX flags to define special overlay FX
*)
DDOVER_DDFX = $00080000;
 
(*
* Autoflip the overlay when ever the video port autoflips
*)
DDOVER_AUTOFLIP = $00100000;
 
(*
* Display each field of video port data individually without
* causing any jittery artifacts
*)
DDOVER_BOB = $00200000;
 
(*
* Indicates that bob/weave decisions should not be overridden by other
* interfaces.
*)
DDOVER_OVERRIDEBOBWEAVE = $00400000;
 
(*
* Indicates that the surface memory is composed of interleaved fields.
*)
DDOVER_INTERLEAVED = $00800000;
 
(*
* Indicates that bob will be performed using hardware rather than
* software or emulated.
*)
DDOVER_BOBHARDWARE = $01000000;
 
(*
* Indicates that overlay FX structure contains valid ARGB scaling factors.
*)
DDOVER_ARGBSCALEFACTORS = $02000000;
 
(*
* Indicates that ARGB scaling factors can be degraded to fit driver capabilities.
*)
DDOVER_DEGRADEARGBSCALING = $04000000;
 
(****************************************************************************
*
* DIRECTDRAWSURFACE LOCK FLAGS
*
****************************************************************************)
 
(*
* The default. Set to indicate that Lock should return a valid memory pointer
* to the top of the specified rectangle. If no rectangle is specified then a
* pointer to the top of the surface is returned.
*)
DDLOCK_SURFACEMEMORYPTR = $00000000; // = default
 
(*
* Set to indicate that Lock should wait until it can obtain a valid memory
* pointer before returning. If this bit is set, Lock will never return
* DDERR_WASSTILLDRAWING.
*)
DDLOCK_WAIT = $00000001;
 
(*
* Set if an event handle is being passed to Lock. Lock will trigger the event
* when it can return the surface memory pointer requested.
*)
DDLOCK_EVENT = $00000002;
 
(*
* Indicates that the surface being locked will only be read from.
*)
DDLOCK_READONLY = $00000010;
 
(*
* Indicates that the surface being locked will only be written to
*)
DDLOCK_WRITEONLY = $00000020;
 
(*
* Indicates that a system wide lock should not be taken when this surface
* is locked. This has several advantages (cursor responsiveness, ability
* to call more Windows functions, easier debugging) when locking video
* memory surfaces. However, an application specifying this flag must
* comply with a number of conditions documented in the help file.
* Furthermore, this flag cannot be specified when locking the primary.
*)
DDLOCK_NOSYSLOCK = $00000800;
 
(*
* Used only with Direct3D Vertex Buffer Locks. Indicates that no vertices
* that were referred to in Draw*PrimtiveVB calls since the start of the
* frame (or the last lock without this flag) will be modified during the
* lock. This can be useful when one is only appending data to the vertex
* buffer
*)
DDLOCK_NOOVERWRITE = $00001000;
 
(*
* Indicates that no assumptions will be made about the contents of the
* surface or vertex buffer during this lock.
* This enables two things:
* - Direct3D or the driver may provide an alternative memory
* area as the vertex buffer. This is useful when one plans to clear the
* contents of the vertex buffer and fill in new data.
* - Drivers sometimes store surface data in a re-ordered format.
* When the application locks the surface, the driver is forced to un-re-order
* the surface data before allowing the application to see the surface contents.
* This flag is a hint to the driver that it can skip the un-re-ordering process
* since the application plans to overwrite every single pixel in the surface
* or locked rectangle (and so erase any un-re-ordered pixels anyway).
* Applications should always set this flag when they intend to overwrite the entire
* surface or locked rectangle.
*)
DDLOCK_DISCARDCONTENTS = $00002000;
(*
* DDLOCK_OKTOSWAP is an older, less informative name for DDLOCK_DISCARDCONTENTS
*)
DDLOCK_OKTOSWAP = $00002000;
 
(*
* On IDirectDrawSurface7 and higher interfaces, the default is DDLOCK_WAIT. If you wish
* to override the default and use time when the accelerator is busy (as denoted by
* the DDERR_WASSTILLDRAWING return code) then use DDLOCK_DONOTWAIT.
*)
DDLOCK_DONOTWAIT = $00004000;
 
 
(****************************************************************************
*
* DIRECTDRAWSURFACE PAGELOCK FLAGS
*
****************************************************************************)
 
(*
* No flags defined at present
*)
 
 
(****************************************************************************
*
* DIRECTDRAWSURFACE PAGEUNLOCK FLAGS
*
****************************************************************************)
 
(*
* No flags defined at present
*)
 
 
(****************************************************************************
*
* DIRECTDRAWSURFACE BLT FX FLAGS
*
****************************************************************************)
 
(*
* If stretching, use arithmetic stretching along the Y axis for this blt.
*)
DDBLTFX_ARITHSTRETCHY = $00000001;
 
(*
* Do this blt mirroring the surface left to right. Spin the
* surface around its y-axis.
*)
DDBLTFX_MIRRORLEFTRIGHT = $00000002;
 
(*
* Do this blt mirroring the surface up and down. Spin the surface
* around its x-axis.
*)
DDBLTFX_MIRRORUPDOWN = $00000004;
 
(*
* Schedule this blt to avoid tearing.
*)
DDBLTFX_NOTEARING = $00000008;
 
(*
* Do this blt rotating the surface one hundred and eighty degrees.
*)
DDBLTFX_ROTATE180 = $00000010;
 
(*
* Do this blt rotating the surface two hundred and seventy degrees.
*)
DDBLTFX_ROTATE270 = $00000020;
 
(*
* Do this blt rotating the surface ninety degrees.
*)
DDBLTFX_ROTATE90 = $00000040;
 
(*
* Do this z blt using dwZBufferLow and dwZBufferHigh as range values
* specified to limit the bits copied from the source surface.
*)
DDBLTFX_ZBUFFERRANGE = $00000080;
 
(*
* Do this z blt adding the dwZBufferBaseDest to each of the sources z values
* before comparing it with the desting z values.
*)
DDBLTFX_ZBUFFERBASEDEST = $00000100;
 
(****************************************************************************
*
* DIRECTDRAWSURFACE OVERLAY FX FLAGS
*
****************************************************************************)
 
(*
* If stretching, use arithmetic stretching along the Y axis for this overlay.
*)
DDOVERFX_ARITHSTRETCHY = $00000001;
 
(*
* Mirror the overlay across the vertical axis
*)
DDOVERFX_MIRRORLEFTRIGHT = $00000002;
 
(*
* Mirror the overlay across the horizontal axis
*)
DDOVERFX_MIRRORUPDOWN = $00000004;
 
(****************************************************************************
*
* Flags for dwDDFX member of DDSPRITEFX structure
*
****************************************************************************)
(*
* Use affine transformation matrix in fTransform member.
*)
DDSPRITEFX_AFFINETRANSFORM = $00000001;
 
(*
* Use RGBA scaling factors in ddrgbaScaleFactors member.
*)
DDSPRITEFX_RGBASCALING = $00000002;
 
(*
* Degrade RGBA scaling factors to accommodate driver's capabilities.
*)
DDSPRITEFX_DEGRADERGBASCALING = $00000004;
 
(*
* Do bilinear filtering of stretched or warped sprite.
*)
DDSPRITEFX_BILINEARFILTER = $00000008;
 
(*
* Do "blur" filtering of stretched or warped sprite.
*)
DDSPRITEFX_BLURFILTER = $00000010;
 
(*
* Do "flat" filtering of stretched or warped sprite.
*)
DDSPRITEFX_FLATFILTER = $00000020;
 
(*
* Degrade filtering operation to accommodate driver's capabilities.
*)
DDSPRITEFX_DEGRADEFILTER = $00000040;
 
(****************************************************************************
*
* DIRECTDRAW WAITFORVERTICALBLANK FLAGS
*
****************************************************************************)
 
(*
* return when the vertical blank interval begins
*)
DDWAITVB_BLOCKBEGIN = $00000001;
 
(*
* set up an event to trigger when the vertical blank begins
*)
DDWAITVB_BLOCKBEGINEVENT = $00000002;
 
(*
* return when the vertical blank interval ends and display begins
*)
DDWAITVB_BLOCKEND = $00000004;
 
(****************************************************************************
*
* DIRECTDRAW GETFLIPSTATUS FLAGS
*
****************************************************************************)
 
(*
* is it OK to flip now?
*)
DDGFS_CANFLIP = $00000001;
 
(*
* is the last flip finished?
*)
DDGFS_ISFLIPDONE = $00000002;
 
(****************************************************************************
*
* DIRECTDRAW GETBLTSTATUS FLAGS
*
****************************************************************************)
 
(*
* is it OK to blt now?
*)
DDGBS_CANBLT = $00000001;
 
(*
* is the blt to the surface finished?
*)
DDGBS_ISBLTDONE = $00000002;
 
 
(****************************************************************************
*
* DIRECTDRAW ENUMOVERLAYZORDER FLAGS
*
****************************************************************************)
 
(*
* Enumerate overlays back to front.
*)
DDENUMOVERLAYZ_BACKTOFRONT = $00000000;
 
(*
* Enumerate overlays front to back
*)
DDENUMOVERLAYZ_FRONTTOBACK = $00000001;
 
(****************************************************************************
*
* DIRECTDRAW UPDATEOVERLAYZORDER FLAGS
*
****************************************************************************)
 
(*
* Send overlay to front
*)
DDOVERZ_SENDTOFRONT = $00000000;
 
(*
* Send overlay to back
*)
DDOVERZ_SENDTOBACK = $00000001;
 
(*
* Move Overlay forward
*)
DDOVERZ_MOVEFORWARD = $00000002;
 
(*
* Move Overlay backward
*)
DDOVERZ_MOVEBACKWARD = $00000003;
 
(*
* Move Overlay in front of relative surface
*)
DDOVERZ_INSERTINFRONTOF = $00000004;
 
(*
* Move Overlay in back of relative surface
*)
DDOVERZ_INSERTINBACKOF = $00000005;
 
(****************************************************************************
*
* DIRECTDRAW SETGAMMARAMP FLAGS
*
****************************************************************************)
 
(*
* Request calibrator to adjust the gamma ramp according to the physical
* properties of the display so that the result should appear identical
* on all systems.
*)
DDSGR_CALIBRATE = $00000001;
 
(****************************************************************************
*
* DIRECTDRAW STARTMODETEST FLAGS
*
****************************************************************************)
 
(*
* Indicates that the mode being tested has passed
*)
DDSMT_ISTESTREQUIRED = $00000001;
 
 
(****************************************************************************
*
* DIRECTDRAW EVALUATEMODE FLAGS
*
****************************************************************************)
 
(*
* Indicates that the mode being tested has passed
*)
DDEM_MODEPASSED = $00000001;
 
(*
* Indicates that the mode being tested has failed
*)
DDEM_MODEFAILED = $00000002;
 
(*===========================================================================
*
*
* DIRECTDRAW RETURN CODES
*
* The return values from DirectDraw Commands and Surface that return an HResult
* are codes from DirectDraw concerning the results of the action
* requested by DirectDraw.
*
*==========================================================================*)
 
(*
* Status is OK
*
* Issued by: DirectDraw Commands and all callbacks
*)
DD_OK = 0;
DD_FALSE = S_FALSE;
 
(****************************************************************************
*
* DIRECTDRAW ENUMCALLBACK RETURN VALUES
*
* EnumCallback returns are used to control the flow of the DIRECTDRAW and
* DIRECTDRAWSURFACE object enumerations. They can only be returned by
* enumeration callback routines.
*
****************************************************************************)
 
(*
* stop the enumeration
*)
DDENUMRET_CANCEL = 0;
 
(*
* continue the enumeration
*)
DDENUMRET_OK = 1;
 
(****************************************************************************
*
* DIRECTDRAW ERRORS
*
* Errors are represented by negative values and cannot be combined.
*
****************************************************************************)
 
_FACDD = $876;
MAKE_DDHRESULT = HResult(1 shl 31) or HResult(_FACDD shl 16);
 
 
(*
* This object is already initialized
*)
DDERR_ALREADYINITIALIZED = MAKE_DDHRESULT + 5;
 
(*
* This surface can not be attached to the requested surface.
*)
DDERR_CANNOTATTACHSURFACE = MAKE_DDHRESULT + 10;
 
(*
* This surface can not be detached from the requested surface.
*)
DDERR_CANNOTDETACHSURFACE = MAKE_DDHRESULT + 20;
 
(*
* Support is currently not available.
*)
DDERR_CURRENTLYNOTAVAIL = MAKE_DDHRESULT + 40;
 
(*
* An exception was encountered while performing the requested operation
*)
DDERR_EXCEPTION = MAKE_DDHRESULT + 55;
 
(*
* Generic failure.
*)
DDERR_GENERIC = E_FAIL;
 
(*
* Height of rectangle provided is not a multiple of reqd alignment
*)
DDERR_HEIGHTALIGN = MAKE_DDHRESULT + 90;
 
(*
* Unable to match primary surface creation request with existing
* primary surface.
*)
DDERR_INCOMPATIBLEPRIMARY = MAKE_DDHRESULT + 95;
 
(*
* One or more of the caps bits passed to the callback are incorrect.
*)
DDERR_INVALIDCAPS = MAKE_DDHRESULT + 100;
 
(*
* DirectDraw does not support provided Cliplist.
*)
DDERR_INVALIDCLIPLIST = MAKE_DDHRESULT + 110;
 
(*
* DirectDraw does not support the requested mode
*)
DDERR_INVALIDMODE = MAKE_DDHRESULT + 120;
 
(*
* DirectDraw received a pointer that was an invalid DIRECTDRAW object.
*)
DDERR_INVALIDOBJECT = MAKE_DDHRESULT + 130;
 
(*
* One or more of the parameters passed to the callback function are
* incorrect.
*)
DDERR_INVALIDPARAMS = E_INVALIDARG;
 
(*
* pixel format was invalid as specified
*)
DDERR_INVALIDPIXELFORMAT = MAKE_DDHRESULT + 145;
 
(*
* Rectangle provided was invalid.
*)
DDERR_INVALIDRECT = MAKE_DDHRESULT + 150;
 
(*
* Operation could not be carried out because one or more surfaces are locked
*)
DDERR_LOCKEDSURFACES = MAKE_DDHRESULT + 160;
 
(*
* There is no 3D present.
*)
DDERR_NO3D = MAKE_DDHRESULT + 170;
 
(*
* Operation could not be carried out because there is no alpha accleration
* hardware present or available.
*)
DDERR_NOALPHAHW = MAKE_DDHRESULT + 180;
 
(*
* Operation could not be carried out because there is no stereo
* hardware present or available.
*)
DDERR_NOSTEREOHARDWARE = MAKE_DDHRESULT + 181;
 
(*
* Operation could not be carried out because there is no hardware
* present which supports stereo surfaces
*)
DDERR_NOSURFACELEFT = MAKE_DDHRESULT + 182;
 
(*
* no clip list available
*)
DDERR_NOCLIPLIST = MAKE_DDHRESULT + 205;
 
(*
* Operation could not be carried out because there is no color conversion
* hardware present or available.
*)
DDERR_NOCOLORCONVHW = MAKE_DDHRESULT + 210;
 
(*
* Create function called without DirectDraw object method SetCooperativeLevel
* being called.
*)
DDERR_NOCOOPERATIVELEVELSET = MAKE_DDHRESULT + 212;
 
(*
* Surface doesn't currently have a color key
*)
DDERR_NOCOLORKEY = MAKE_DDHRESULT + 215;
 
(*
* Operation could not be carried out because there is no hardware support
* of the dest color key.
*)
DDERR_NOCOLORKEYHW = MAKE_DDHRESULT + 220;
 
(*
* No DirectDraw support possible with current display driver
*)
DDERR_NODIRECTDRAWSUPPORT = MAKE_DDHRESULT + 222;
 
(*
* Operation requires the application to have exclusive mode but the
* application does not have exclusive mode.
*)
DDERR_NOEXCLUSIVEMODE = MAKE_DDHRESULT + 225;
 
(*
* Flipping visible surfaces is not supported.
*)
DDERR_NOFLIPHW = MAKE_DDHRESULT + 230;
 
(*
* There is no GDI present.
*)
DDERR_NOGDI = MAKE_DDHRESULT + 240;
 
(*
* Operation could not be carried out because there is no hardware present
* or available.
*)
DDERR_NOMIRRORHW = MAKE_DDHRESULT + 250;
 
(*
* Requested item was not found
*)
DDERR_NOTFOUND = MAKE_DDHRESULT + 255;
 
(*
* Operation could not be carried out because there is no overlay hardware
* present or available.
*)
DDERR_NOOVERLAYHW = MAKE_DDHRESULT + 260;
 
(*
* Operation could not be carried out because the source and destination
* rectangles are on the same surface and overlap each other.
*)
DDERR_OVERLAPPINGRECTS = MAKE_DDHRESULT + 270;
 
(*
* Operation could not be carried out because there is no appropriate raster
* op hardware present or available.
*)
DDERR_NORASTEROPHW = MAKE_DDHRESULT + 280;
 
(*
* Operation could not be carried out because there is no rotation hardware
* present or available.
*)
DDERR_NOROTATIONHW = MAKE_DDHRESULT + 290;
 
(*
* Operation could not be carried out because there is no hardware support
* for stretching
*)
DDERR_NOSTRETCHHW = MAKE_DDHRESULT + 310;
 
(*
* DirectDrawSurface is not in 4 bit color palette and the requested operation
* requires 4 bit color palette.
*)
DDERR_NOT4BITCOLOR = MAKE_DDHRESULT + 316;
 
(*
* DirectDrawSurface is not in 4 bit color index palette and the requested
* operation requires 4 bit color index palette.
*)
DDERR_NOT4BITCOLORINDEX = MAKE_DDHRESULT + 317;
 
(*
* DirectDraw Surface is not in 8 bit color mode and the requested operation
* requires 8 bit color.
*)
DDERR_NOT8BITCOLOR = MAKE_DDHRESULT + 320;
 
(*
* Operation could not be carried out because there is no texture mapping
* hardware present or available.
*)
DDERR_NOTEXTUREHW = MAKE_DDHRESULT + 330;
 
(*
* Operation could not be carried out because there is no hardware support
* for vertical blank synchronized operations.
*)
DDERR_NOVSYNCHW = MAKE_DDHRESULT + 335;
 
(*
* Operation could not be carried out because there is no hardware support
* for zbuffer blting.
*)
DDERR_NOZBUFFERHW = MAKE_DDHRESULT + 340;
 
(*
* Overlay surfaces could not be z layered based on their BltOrder because
* the hardware does not support z layering of overlays.
*)
DDERR_NOZOVERLAYHW = MAKE_DDHRESULT + 350;
 
(*
* The hardware needed for the requested operation has already been
* allocated.
*)
DDERR_OUTOFCAPS = MAKE_DDHRESULT + 360;
 
(*
* DirectDraw does not have enough memory to perform the operation.
*)
DDERR_OUTOFMEMORY = E_OUTOFMEMORY;
 
(*
* DirectDraw does not have enough memory to perform the operation.
*)
DDERR_OUTOFVIDEOMEMORY = MAKE_DDHRESULT + 380;
 
(*
* hardware does not support clipped overlays
*)
DDERR_OVERLAYCANTCLIP = MAKE_DDHRESULT + 382;
 
(*
* Can only have ony color key active at one time for overlays
*)
DDERR_OVERLAYCOLORKEYONLYONEACTIVE = MAKE_DDHRESULT + 384;
 
(*
* Access to this palette is being refused because the palette is already
* locked by another thread.
*)
DDERR_PALETTEBUSY = MAKE_DDHRESULT + 387;
 
(*
* No src color key specified for this operation.
*)
DDERR_COLORKEYNOTSET = MAKE_DDHRESULT + 400;
 
(*
* This surface is already attached to the surface it is being attached to.
*)
DDERR_SURFACEALREADYATTACHED = MAKE_DDHRESULT + 410;
 
(*
* This surface is already a dependency of the surface it is being made a
* dependency of.
*)
DDERR_SURFACEALREADYDEPENDENT = MAKE_DDHRESULT + 420;
 
(*
* Access to this surface is being refused because the surface is already
* locked by another thread.
*)
DDERR_SURFACEBUSY = MAKE_DDHRESULT + 430;
 
(*
* Access to this surface is being refused because no driver exists
* which can supply a pointer to the surface.
* This is most likely to happen when attempting to lock the primary
* surface when no DCI provider is present.
* Will also happen on attempts to lock an optimized surface.
*)
DDERR_CANTLOCKSURFACE = MAKE_DDHRESULT + 435;
 
(*
* Access to Surface refused because Surface is obscured.
*)
DDERR_SURFACEISOBSCURED = MAKE_DDHRESULT + 440;
 
(*
* Access to this surface is being refused because the surface is gone.
* The DIRECTDRAWSURFACE object representing this surface should
* have Restore called on it.
*)
DDERR_SURFACELOST = MAKE_DDHRESULT + 450;
 
(*
* The requested surface is not attached.
*)
DDERR_SURFACENOTATTACHED = MAKE_DDHRESULT + 460;
 
(*
* Height requested by DirectDraw is too large.
*)
DDERR_TOOBIGHEIGHT = MAKE_DDHRESULT + 470;
 
(*
* Size requested by DirectDraw is too large -- The individual height and
* width are OK.
*)
DDERR_TOOBIGSIZE = MAKE_DDHRESULT + 480;
 
(*
* Width requested by DirectDraw is too large.
*)
DDERR_TOOBIGWIDTH = MAKE_DDHRESULT + 490;
 
(*
* Action not supported.
*)
DDERR_UNSUPPORTED = E_NOTIMPL;
 
(*
* FOURCC format requested is unsupported by DirectDraw
*)
DDERR_UNSUPPORTEDFORMAT = MAKE_DDHRESULT + 510;
 
(*
* Bitmask in the pixel format requested is unsupported by DirectDraw
*)
DDERR_UNSUPPORTEDMASK = MAKE_DDHRESULT + 520;
 
(*
* The specified stream contains invalid data
*)
DDERR_INVALIDSTREAM = MAKE_DDHRESULT + 521;
 
(*
* vertical blank is in progress
*)
DDERR_VERTICALBLANKINPROGRESS = MAKE_DDHRESULT + 537;
 
(*
* Informs DirectDraw that the previous Blt which is transfering information
* to or from this Surface is incomplete.
*)
DDERR_WASSTILLDRAWING = MAKE_DDHRESULT + 540;
 
(*
* The specified surface type requires specification of the COMPLEX flag
*)
DDERR_DDSCAPSCOMPLEXREQUIRED = MAKE_DDHRESULT + 542;
 
(*
* Rectangle provided was not horizontally aligned on reqd. boundary
*)
DDERR_XALIGN = MAKE_DDHRESULT + 560;
 
(*
* The GUID passed to DirectDrawCreate is not a valid DirectDraw driver
* identifier.
*)
DDERR_INVALIDDIRECTDRAWGUID = MAKE_DDHRESULT + 561;
 
(*
* A DirectDraw object representing this driver has already been created
* for this process.
*)
DDERR_DIRECTDRAWALREADYCREATED = MAKE_DDHRESULT + 562;
 
(*
* A hardware only DirectDraw object creation was attempted but the driver
* did not support any hardware.
*)
DDERR_NODIRECTDRAWHW = MAKE_DDHRESULT + 563;
 
(*
* this process already has created a primary surface
*)
DDERR_PRIMARYSURFACEALREADYEXISTS = MAKE_DDHRESULT + 564;
 
(*
* software emulation not available.
*)
DDERR_NOEMULATION = MAKE_DDHRESULT + 565;
 
(*
* region passed to Clipper::GetClipList is too small.
*)
DDERR_REGIONTOOSMALL = MAKE_DDHRESULT + 566;
 
(*
* an attempt was made to set a clip list for a clipper objec that
* is already monitoring an hwnd.
*)
DDERR_CLIPPERISUSINGHWND = MAKE_DDHRESULT + 567;
 
(*
* No clipper object attached to surface object
*)
DDERR_NOCLIPPERATTACHED = MAKE_DDHRESULT + 568;
 
(*
* Clipper notification requires an HWND or
* no HWND has previously been set as the CooperativeLevel HWND.
*)
DDERR_NOHWND = MAKE_DDHRESULT + 569;
 
(*
* HWND used by DirectDraw CooperativeLevel has been subclassed,
* this prevents DirectDraw from restoring state.
*)
DDERR_HWNDSUBCLASSED = MAKE_DDHRESULT + 570;
 
(*
* The CooperativeLevel HWND has already been set.
* It can not be reset while the process has surfaces or palettes created.
*)
DDERR_HWNDALREADYSET = MAKE_DDHRESULT + 571;
 
(*
* No palette object attached to this surface.
*)
DDERR_NOPALETTEATTACHED = MAKE_DDHRESULT + 572;
 
(*
* No hardware support for 16 or 256 color palettes.
*)
DDERR_NOPALETTEHW = MAKE_DDHRESULT + 573;
 
(*
* If a clipper object is attached to the source surface passed into a
* BltFast call.
*)
DDERR_BLTFASTCANTCLIP = MAKE_DDHRESULT + 574;
 
(*
* No blter.
*)
DDERR_NOBLTHW = MAKE_DDHRESULT + 575;
 
(*
* No DirectDraw ROP hardware.
*)
DDERR_NODDROPSHW = MAKE_DDHRESULT + 576;
 
(*
* returned when GetOverlayPosition is called on a hidden overlay
*)
DDERR_OVERLAYNOTVISIBLE = MAKE_DDHRESULT + 577;
 
(*
* returned when GetOverlayPosition is called on a overlay that UpdateOverlay
* has never been called on to establish a destionation.
*)
DDERR_NOOVERLAYDEST = MAKE_DDHRESULT + 578;
 
(*
* returned when the position of the overlay on the destionation is no longer
* legal for that destionation.
*)
DDERR_INVALIDPOSITION = MAKE_DDHRESULT + 579;
 
(*
* returned when an overlay member is called for a non-overlay surface
*)
DDERR_NOTAOVERLAYSURFACE = MAKE_DDHRESULT + 580;
 
(*
* An attempt was made to set the cooperative level when it was already
* set to exclusive.
*)
DDERR_EXCLUSIVEMODEALREADYSET = MAKE_DDHRESULT + 581;
 
(*
* An attempt has been made to flip a surface that is not flippable.
*)
DDERR_NOTFLIPPABLE = MAKE_DDHRESULT + 582;
 
(*
* Can't duplicate primary & 3D surfaces, or surfaces that are implicitly
* created.
*)
DDERR_CANTDUPLICATE = MAKE_DDHRESULT + 583;
 
(*
* Surface was not locked. An attempt to unlock a surface that was not
* locked at all, or by this process, has been attempted.
*)
DDERR_NOTLOCKED = MAKE_DDHRESULT + 584;
 
(*
* Windows can not create any more DCs, or a DC was requested for a paltte-indexed
* surface when the surface had no palette AND the display mode was not palette-indexed
* (in this case DirectDraw cannot select a proper palette into the DC)
*)
DDERR_CANTCREATEDC = MAKE_DDHRESULT + 585;
 
(*
* No DC was ever created for this surface.
*)
DDERR_NODC = MAKE_DDHRESULT + 586;
 
(*
* This surface can not be restored because it was created in a different
* mode.
*)
DDERR_WRONGMODE = MAKE_DDHRESULT + 587;
 
(*
* This surface can not be restored because it is an implicitly created
* surface.
*)
DDERR_IMPLICITLYCREATED = MAKE_DDHRESULT + 588;
 
(*
* The surface being used is not a palette-based surface
*)
DDERR_NOTPALETTIZED = MAKE_DDHRESULT + 589;
 
(*
* The display is currently in an unsupported mode
*)
DDERR_UNSUPPORTEDMODE = MAKE_DDHRESULT + 590;
 
(*
* Operation could not be carried out because there is no mip-map
* texture mapping hardware present or available.
*)
DDERR_NOMIPMAPHW = MAKE_DDHRESULT + 591;
 
(*
* The requested action could not be performed because the surface was of
* the wrong type.
*)
DDERR_INVALIDSURFACETYPE = MAKE_DDHRESULT + 592;
 
(*
* Device does not support optimized surfaces, therefore no video memory optimized surfaces
*)
DDERR_NOOPTIMIZEHW = MAKE_DDHRESULT + 600;
 
(*
* Surface is an optimized surface, but has not yet been allocated any memory
*)
DDERR_NOTLOADED = MAKE_DDHRESULT + 601;
 
(*
* Attempt was made to create or set a device window without first setting
* the focus window
*)
DDERR_NOFOCUSWINDOW = MAKE_DDHRESULT + 602;
 
(*
* Attempt was made to set a palette on a mipmap sublevel
*)
DDERR_NOTONMIPMAPSUBLEVEL = MAKE_DDHRESULT + 603;
 
(*
* A DC has already been returned for this surface. Only one DC can be
* retrieved per surface.
*)
DDERR_DCALREADYCREATED = MAKE_DDHRESULT + 620;
 
(*
* An attempt was made to allocate non-local video memory from a device
* that does not support non-local video memory.
*)
DDERR_NONONLOCALVIDMEM = MAKE_DDHRESULT + 630;
 
(*
* The attempt to page lock a surface failed.
*)
DDERR_CANTPAGELOCK = MAKE_DDHRESULT + 640;
 
(*
* The attempt to page unlock a surface failed.
*)
DDERR_CANTPAGEUNLOCK = MAKE_DDHRESULT + 660;
 
(*
* An attempt was made to page unlock a surface with no outstanding page locks.
*)
DDERR_NOTPAGELOCKED = MAKE_DDHRESULT + 680;
 
(*
* There is more data available than the specified buffer size could hold
*)
DDERR_MOREDATA = MAKE_DDHRESULT + 690;
 
(*
* The data has expired and is therefore no longer valid.
*)
DDERR_EXPIRED = MAKE_DDHRESULT + 691;
 
(*
* The mode test has finished executing.
*)
DDERR_TESTFINISHED = MAKE_DDHRESULT + 692;
 
(*
* The mode test has switched to a new mode.
*)
DDERR_NEWMODE = MAKE_DDHRESULT + 693;
 
(*
* D3D has not yet been initialized.
*)
DDERR_D3DNOTINITIALIZED = MAKE_DDHRESULT + 694;
 
(*
* The video port is not active
*)
DDERR_VIDEONOTACTIVE = MAKE_DDHRESULT + 695;
 
(*
* The monitor does not have EDID data.
*)
DDERR_NOMONITORINFORMATION = MAKE_DDHRESULT + 696;
 
(*
* The driver does not enumerate display mode refresh rates.
*)
DDERR_NODRIVERSUPPORT = MAKE_DDHRESULT + 697;
 
(*
* Surfaces created by one direct draw device cannot be used directly by
* another direct draw device.
*)
DDERR_DEVICEDOESNTOWNSURFACE = MAKE_DDHRESULT + 699;
 
(*
* An attempt was made to invoke an interface member of a DirectDraw object
* created by CoCreateInstance() before it was initialized.
*)
DDERR_NOTINITIALIZED = CO_E_NOTINITIALIZED;
 
(* Alpha bit depth constants *)
 
(*
* API's
*)
 
type
HMonitor = THandle;
 
TDDEnumCallbackA = function (lpGUID: PGUID; lpDriverDescription: PAnsiChar;
lpDriverName: PAnsiChar; lpContext: Pointer) : BOOL; stdcall;
TDDEnumCallbackW = function (lpGUID: PGUID; lpDriverDescription: PWideChar;
lpDriverName: PWideChar; lpContext: Pointer) : BOOL; stdcall;
{$IFDEF UNICODE}
TDDEnumCallback = TDDEnumCallbackW;
{$ELSE}
TDDEnumCallback = TDDEnumCallbackA;
{$ENDIF}
 
TDDEnumCallbackExA = function (lpGUID: PGUID; lpDriverDescription: PAnsiChar;
lpDriverName: PAnsiChar; lpContext: Pointer; Monitor: HMonitor) : BOOL;
stdcall;
TDDEnumCallbackExW = function (lpGUID: PGUID; lpDriverDescription: PWideChar;
lpDriverName: PWideChar; lpContext: Pointer; Monitor: HMonitor) : BOOL;
stdcall;
{$IFDEF UNICODE}
TDDEnumCallbackEx = TDDEnumCallbackExW;
{$ELSE}
TDDEnumCallbackEx = TDDEnumCallbackExA;
{$ENDIF}
LPDDENUMCALLBACKEX = TDDEnumCallbackEx;
 
var
DirectDrawEnumerateA : function (lpCallback: TDDEnumCallbackA;
lpContext: Pointer) : HResult; stdcall;
DirectDrawEnumerateW : function (lpCallback: TDDEnumCallbackW;
lpContext: Pointer) : HResult; stdcall;
DirectDrawEnumerate : function (lpCallback: TDDEnumCallback;
lpContext: Pointer) : HResult; stdcall;
 
DirectDrawEnumerateExA : function (lpCallback: TDDEnumCallbackExA;
lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
DirectDrawEnumerateExW : function (lpCallback: TDDEnumCallbackExW;
lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
DirectDrawEnumerateEx : function (lpCallback: TDDEnumCallbackEx;
lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
 
DirectDrawCreate : function (lpGUID: PGUID;
out lplpDD: IDirectDraw;
pUnkOuter: IUnknown) : HResult; stdcall;
DirectDrawCreateEx : function (lpGUID: PGUID;
out lplpDD: IDirectDraw7; const iid: TGUID;
pUnkOuter: IUnknown) : HResult; stdcall;
DirectDrawCreateClipper : function (dwFlags: DWORD;
out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown) : HResult; stdcall;
 
const
(*
* Flags for DirectDrawEnumerateEx
* DirectDrawEnumerateEx supercedes DirectDrawEnumerate. You must use GetProcAddress to
* obtain a function pointer (of type LPDIRECTDRAWENUMERATEEX) to DirectDrawEnumerateEx.
* By default, only the primary display device is enumerated.
* DirectDrawEnumerate is equivalent to DirectDrawEnumerate(,,DDENUM_NONDISPLAYDEVICES)
*)
 
(*
* This flag causes enumeration of any GDI display devices which are part of
* the Windows Desktop
*)
DDENUM_ATTACHEDSECONDARYDEVICES = $00000001;
 
(*
* This flag causes enumeration of any GDI display devices which are not
* part of the Windows Desktop
*)
DDENUM_DETACHEDSECONDARYDEVICES = $00000002;
 
(*
* This flag causes enumeration of non-display devices
*)
DDENUM_NONDISPLAYDEVICES = $00000004;
 
REGSTR_KEY_DDHW_DESCRIPTION = 'Description';
REGSTR_KEY_DDHW_DRIVERNAME = 'DriverName';
REGSTR_PATH_DDHW = 'Hardware\DirectDrawDrivers';
4872,62 → 2154,55
DDCREATE_HARDWAREONLY = $00000001;
DDCREATE_EMULATIONONLY = $00000002;
 
(*
* Macros for interpretting DDEVICEIDENTIFIER2.dwWHQLLevel
*)
function GET_WHQL_YEAR(dwWHQLLevel: DWORD) : DWORD;
function GET_WHQL_MONTH(dwWHQLLevel: DWORD) : DWORD;
function GET_WHQL_DAY(dwWHQLLevel: DWORD) : DWORD;
function DirectDrawEnumerateA(lpCallback: TDDEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function DirectDrawEnumerateW(lpCallback: TDDEnumCallbackW; lpContext: Pointer): HResult; stdcall;
function DirectDrawEnumerate(lpCallback: TDDEnumCallbackA; lpContext: Pointer): HResult; stdcall;
 
function DirectDrawEnumerateExA(lpCallback: TDDEnumCallbackExA; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function DirectDrawEnumerateExW(lpCallback: TDDEnumCallbackExW; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function DirectDrawEnumerateEx(lpCallback: TDDEnumCallbackExA; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
 
function DirectDrawCreate(lpGUID: PGUID; out lplpDD: IDirectDraw;
pUnkOuter: IUnknown): HResult; stdcall;
function DirectDrawCreateEx(lpGUID: PGUID; out lplpDD; const iid: TGUID;
pUnkOuter: IUnknown): HResult; stdcall;
function DirectDrawCreateClipper(dwFlags: DWORD; out lplpDDClipper: IDirectDrawClipper;
pUnkOuter: IUnknown): HResult; stdcall;
 
(*==========================================================================;
*
* Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dvp.h
* Content: DirectDrawVideoPort include file
* File: dvp.h
* Content: DirectDrawVideoPort include file
*
***************************************************************************)
 
{ GUIDS used by DirectDrawVideoPort objects }
 
const
(*
* GUIDS used by DirectDrawVideoPort objects
*)
DDVPTYPE_E_HREFH_VREFH: TGUID =
(D1:$54F39980;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
DDVPTYPE_E_HREFH_VREFL: TGUID =
(D1:$92783220;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
DDVPTYPE_E_HREFL_VREFH: TGUID =
(D1:$A07A02E0;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
DDVPTYPE_E_HREFL_VREFL: TGUID =
(D1:$E09C77E0;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
DDVPTYPE_CCIR656: TGUID =
(D1:$FCA326A0;D2:$DA60;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
DDVPTYPE_BROOKTREE: TGUID =
(D1:$1352A560;D2:$DA61;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
DDVPTYPE_PHILIPS: TGUID =
(D1:$332CF160;D2:$DA61;D3:$11CF;D4:($9B,$06,$00,$A0,$C9,$03,$A3,$B8));
IID_IDDVideoPortContainer: TGUID = '{6C142760-A733-11CE-A521-0020AF0BE560}';
IID_IDirectDrawVideoPort: TGUID = '{B36D93E0-2B43-11CF-A2DE-00AA00B93356}';
 
(*
* GUIDS used to describe connections
*)
DDVPTYPE_E_HREFH_VREFH: TGUID = '{54F39980-DA60-11CF-9B06-00A0C903A3B8}';
DDVPTYPE_E_HREFH_VREFL: TGUID = '{92783220-DA60-11CF-9B06-00A0C903A3B8}';
DDVPTYPE_E_HREFL_VREFH: TGUID = '{A07A02E0-DA60-11CF-9B06-00A0C903A3B8}';
DDVPTYPE_E_HREFL_VREFL: TGUID = '{E09C77E0-DA60-11CF-9B06-00A0C903A3B8}';
DDVPTYPE_CCIR656: TGUID = '{FCA326A0-DA60-11CF-9B06-00A0C903A3B8}';
DDVPTYPE_BROOKTREE: TGUID = '{1352A560-DA61-11CF-9B06-00A0C903A3B8}';
DDVPTYPE_PHILIPS: TGUID = '{332CF160-DA61-11CF-9B06-00A0C903A3B8}';
 
(*============================================================================
*
* DirectDraw Structures
*
* Various structures used to invoke DirectDraw.
*
*==========================================================================*)
{ DirectDraw Structures }
 
type
IDDVideoPortContainer = interface;
IDirectDrawVideoPort = interface;
 
(*
* TDDVideoPortConnect
*)
PDDVideoPortConnect = ^TDDVideoPortConnect;
TDDVideoPortConnect = packed record
dwSize: DWORD; // size of the TDDVideoPortConnect structure
{ TDDVideoportConnect structure }
 
PDDVideoportConnect = ^TDDVideoportConnect;
TDDVideoportConnect = record
dwSize: DWORD; // size of the TDDVideoportConnect structure
dwPortWidth: DWORD; // Width of the video port
guidTypeID: TGUID; // Description of video port connection
dwFlags: DWORD; // Connection flags
4934,12 → 2209,14
dwReserved1: DWORD; // Reserved, set to zero.
end;
 
(*
* TDDVideoPortCaps
*)
PDDVideoPortCaps = ^TDDVideoPortCaps;
TDDVideoPortCaps = packed record
dwSize: DWORD; // size of the TDDVideoPortCaps structure
DDVIDEOPORTCONNECT = TDDVideoportConnect;
LPDDVIDEOPORTCONNECT = PDDVideoportConnect;
 
{ TDDVideoportCaps structure }
 
PDDVideoportCaps = ^TDDVideoportCaps;
TDDVideoportCaps = record
dwSize: DWORD; // size of the TDDVideoportCaps structure
dwFlags: DWORD; // indicates which fields contain data
dwMaxWidth: DWORD; // max width of the video port field
dwMaxVBIWidth: DWORD; // max width of the VBI data
4955,64 → 2232,19
dwPreshrinkXStep: DWORD; // Width can be shrunk in steps of 1/x
dwPreshrinkYStep: DWORD; // Height can be shrunk in steps of 1/x
dwNumVBIAutoFlipSurfaces: DWORD; // Number of VBI autoflippable surfaces
dwNumPreferredAutoflip: DWORD; // Optimal number of autoflippable surfaces for hardware
wNumFilterTapsX: WORD; // Number of taps the prescaler uses in the X direction (0 - no prescale, 1 - replication, etc.)
wNumFilterTapsY: WORD; // Number of taps the prescaler uses in the Y direction (0 - no prescale, 1 - replication, etc.)
dwNumPreferredAutoflip: DWORD; // Optimal number of autoflippable surfaces for hardware
wNumFilterTapsX: WORD; // Number of taps the prescaler uses in the X direction (0 - no prescale, 1 - replication, etc.)
wNumFilterTapsY: WORD; // Number of taps the prescaler uses in the Y direction (0 - no prescale, 1 - replication, etc.)
end;
 
const
(*
* The dwMaxWidth and dwMaxVBIWidth members are valid
*)
DDVPD_WIDTH = $00000001;
DDVIDEOPORTCAPS = TDDVideoportCaps;
LPDDVIDEOPORTCAPS = PDDVideoportCaps;
 
(*
* The dwMaxHeight member is valid
*)
DDVPD_HEIGHT = $00000002;
{ TDDVideoportDesc structure }
 
(*
* The dwVideoPortID member is valid
*)
DDVPD_ID = $00000004;
 
(*
* The dwCaps member is valid
*)
DDVPD_CAPS = $00000008;
 
(*
* The dwFX member is valid
*)
DDVPD_FX = $00000010;
 
(*
* The dwNumAutoFlipSurfaces member is valid
*)
DDVPD_AUTOFLIP = $00000020;
 
(*
* All of the alignment members are valid
*)
DDVPD_ALIGN = $00000040;
 
(*
* The dwNumPreferredAutoflip member is valid
*)
DDVPD_PREFERREDAUTOFLIP = $00000080;
 
(*
* The wNumFilterTapsX and wNumFilterTapsY fields are valid
*)
DDVPD_FILTERQUALITY = $00000100;
 
type
(*
* TDDVideoPortDesc
*)
PDDVideoPortDesc = ^TDDVideoPortDesc;
TDDVideoPortDesc = packed record
dwSize: DWORD; // size of the TDDVideoPortDesc structure
PDDVideoportDesc = ^TDDVideoportDesc;
TDDVideoportDesc = record
dwSize: DWORD; // size of the TDDVideoportDesc structure
dwFieldWidth: DWORD; // width of the video port field
dwVBIWidth: DWORD; // width of the VBI data
dwFieldHeight: DWORD; // height of the video port field
5020,16 → 2252,18
dwMaxPixelsPerSecond: DWORD; // Maximum pixel rate per second
dwVideoPortID: DWORD; // Video port ID (0 - (dwMaxVideoPorts -1))
dwReserved1: DWORD; // Reserved for future use - set to zero
VideoPortType: TDDVideoPortConnect; // Description of video port connection
VideoPortType: TDDVideoportConnect; // Description of video port connection
dwReserved2: DWORD; // Reserved for future use - set to zero
dwReserved3: DWORD; // Reserved for future use - set to zero
end;
 
(*
* TDDVideoPortInfo
*)
PDDVideoPortInfo = ^TDDVideoPortInfo;
TDDVideoPortInfo = packed record
DDVIDEOPORTDESC = TDDVideoportDesc;
LPDDVIDEOPORTDESC = PDDVideoportDesc;
 
{ TDDVideoportInfo structure }
 
PDDVideoportInfo = ^TDDVideoportInfo;
TDDVideoportInfo = record
dwSize: DWORD; // Size of the structure
dwOriginX: DWORD; // Placement of the video data within the surface.
dwOriginY: DWORD; // Placement of the video data within the surface.
5037,19 → 2271,21
rCrop: TRect; // Cropping rectangle (optional).
dwPrescaleWidth: DWORD; // Determines pre-scaling/zooming in the X direction (optional).
dwPrescaleHeight: DWORD; // Determines pre-scaling/zooming in the Y direction (optional).
lpddpfInputFormat: PDDPixelFormat; // Video format written to the video port
lpddpfVBIInputFormat: PDDPixelFormat; // Input format of the VBI data
lpddpfVBIOutputFormat: PDDPixelFormat; // Output format of the data
lpddpfInputFormat: PDDPixelFormat; // Video format written to the video port
lpddpfVBIInputFormat: PDDPixelFormat; // Input format of the VBI data
lpddpfVBIOutputFormat: PDDPixelFormat; // Output format of the data
dwVBIHeight: DWORD; // Specifies the number of lines of data within the vertical blanking interval.
dwReserved1: DWORD; // Reserved for future use - set to zero
dwReserved2: DWORD; // Reserved for future use - set to zero
end;
 
(*
* TDDVideoPortBandWidth
*)
PDDVideoPortBandWidth = ^TDDVideoPortBandWidth;
TDDVideoPortBandWidth = packed record
DDVIDEOPORTINFO = TDDVideoportInfo;
LPDDVIDEOPORTINFO = PDDVideoportInfo;
 
{ TDDVideoportBandWidth structure }
 
PDDVideoportBandWidth = ^TDDVideoportBandWidth;
TDDVideoportBandWidth = record
dwSize: DWORD; // Size of the structure
dwCaps: DWORD;
dwOverlay: DWORD; // Zoom factor at which overlay is supported
5060,669 → 2296,226
dwReserved2: DWORD; // Reserved for future use - set to zero
end;
 
(*
* TDDVideoPortStatus
*)
PDDVideoPortStatus = ^TDDVideoPortStatus;
TDDVideoPortStatus = record
DDVIDEOPORTBANDWIDTH = TDDVideoportBandWidth;
LPDDVIDEOPORTBANDWIDTH = PDDVideoportBandWidth;
 
{ TDDVideoportStatus structure }
 
PDDVideoportStatus = ^TDDVideoportStatus;
TDDVideoportStatus = record
dwSize: DWORD; // Size of the structure
bInUse: BOOL; // TRUE if video port is currently being used
dwFlags: DWORD; // Currently not used
dwReserved1: DWORD; // Reserved for future use
VideoPortType: TDDVideoPortConnect; // Information about the connection
VideoPortType: TDDVideoportConnect; // Information about the connection
dwReserved2: DWORD; // Reserved for future use
dwReserved3: DWORD; // Reserved for future use
end;
 
const
(*============================================================================
*
* Video Port Flags
*
* All flags are bit flags.
*
*==========================================================================*)
DDVIDEOPORTSTATUS = TDDVideoportStatus;
LPDDVIDEOPORTSTATUS = PDDVideoportStatus;
 
(****************************************************************************
*
* VIDEOPORT TDDVideoPortConnect FLAGS
*
****************************************************************************)
{ API's }
 
(*
* When this is set by the driver and passed to the client, this
* indicates that the video port is capable of double clocking the data.
* When this is set by the client, this indicates that the video port
* should enable double clocking. This flag is only valid with external
* syncs.
*)
DDVPCONNECT_DOUBLECLOCK = $00000001;
TDDEnumVideoCallback = function(const lpDDVideoPortCaps: TDDVideoportCaps;
lpContext: Pointer): HResult; stdcall;
LPDDENUMVIDEOCALLBACK = TDDEnumVideoCallback;
 
(*
* When this is set by the driver and passed to the client, this
* indicates that the video port is capable of using an external VACT
* signal. When this is set by the client, this indicates that the
* video port should use the external VACT signal.
*)
DDVPCONNECT_VACT = $00000002;
{ IDirectDrawVideoPortContainer Interface }
 
(*
* When this is set by the driver and passed to the client, this
* indicates that the video port is capable of treating even fields
* like odd fields and visa versa. When this is set by the client,
* this indicates that the video port should treat even fields like odd
* fields.
*)
DDVPCONNECT_INVERTPOLARITY = $00000004;
IDDVideoPortContainer = interface(IUnknown)
['{6C142760-A733-11CE-A521-0020AF0BE560}']
// IDDVideoPortContainer methods
function CreateVideoPort(dwFlags: DWORD; const lpDDVideoPortDesc:
TDDVideoportDesc; out lplpDDVideoPort: IDirectDrawVideoPort;
pUnkOuter: IUnknown): HResult; stdcall;
function EnumVideoPorts(dwFlags: DWORD;
const lpDDVideoPortCaps: TDDVideoportCaps; lpContext: Pointer;
lpEnumVideoCallback: TDDEnumVideoCallback): HResult; stdcall;
function GetVideoPortConnectInfo(dwPortId: DWORD; var lpNumEntries: DWORD;
var lpConnectInfo: TDDVideoportConnect): HResult; stdcall;
function QueryVideoPortStatus(dwPortId: DWORD;
var lpVPStatus: TDDVideoportStatus): HResult; stdcall;
end;
 
(*
* Indicates that any data written to the video port during the VREF
* period will not be written into the frame buffer. This flag is read only.
*)
DDVPCONNECT_DISCARDSVREFDATA = $00000008;
{ IDirectDrawVideoPort Interface }
 
(*
* When this is set be the driver and passed to the client, this
* indicates that the device will write half lines into the frame buffer
* if half lines are provided by the decoder. If this is set by the client,
* this indicates that the decoder will be supplying half lines.
*)
DDVPCONNECT_HALFLINE = $00000010;
IDirectDrawVideoPort = interface(IUnknown)
['{B36D93E0-2B43-11CF-A2DE-00AA00B93356}']
// IDirectDrawVideoPort methods
function Flip(lpDDSurface: IDirectDrawSurface; dwFlags: DWORD): HResult; stdcall;
function GetBandwidthInfo(const lpddpfFormat: TDDPixelFormat; dwWidth: DWORD;
dwHeight: DWORD; dwFlags: DWORD; var lpBandwidth: TDDVideoportBandWidth): HResult; stdcall;
function GetColorControls(var lpColorControl: TDDColorControl): HResult; stdcall;
function GetInputFormats(var lpNumFormats: DWORD; var lpFormats:
TDDPixelFormat; dwFlags: DWORD): HResult; stdcall;
function GetOutputFormats(const lpInputFormat: TDDPixelFormat;
var lpNumFormats: DWORD; var lpFormats: TDDPixelFormat; dwFlags: DWORD): HResult; stdcall;
function GetFieldPolarity(var lpbVideoField: BOOL): HResult; stdcall;
function GetVideoLine(var lpdwLine: DWORD): HResult; stdcall;
function GetVideoSignalStatus(varlpdwStatus: DWORD): HResult; stdcall;
function SetColorControls(const lpColorControl: TDDColorControl): HResult; stdcall;
function SetTargetSurface(lpDDSurface: IDirectDrawSurface; dwFlags: DWORD): HResult; stdcall;
function StartVideo(const lpVideoInfo: TDDVideoportInfo): HResult; stdcall;
function StopVideo: HResult; stdcall;
function UpdateVideo(const lpVideoInfo: TDDVideoportInfo): HResult; stdcall;
function WaitForSync(dwFlags: DWORD; dwLine: DWORD; dwTimeout: DWORD): HResult; stdcall;
end;
 
(*
* Indicates that the signal is interlaced. This flag is only
* set by the client.
*)
DDVPCONNECT_INTERLACED = $00000020;
 
(*
* Indicates that video port is shareable and that this video port
* will use the even fields. This flag is only set by the client.
*)
DDVPCONNECT_SHAREEVEN = $00000040;
const
{ Video Port Flags }
 
(*
* Indicates that video port is shareable and that this video port
* will use the odd fields. This flag is only set by the client.
*)
DDVPCONNECT_SHAREODD = $00000080;
DDVPD_WIDTH = $00000001;
DDVPD_HEIGHT = $00000002;
DDVPD_ID = $00000004;
DDVPD_CAPS = $00000008;
DDVPD_FX = $00000010;
DDVPD_AUTOFLIP = $00000020;
DDVPD_ALIGN = $00000040;
DDVPD_PREFERREDAUTOFLIP = $00000080;
DDVPD_FILTERQUALITY = $00000100;
 
(****************************************************************************
*
* VIDEOPORT TDDVideoPortDesc CAPS
*
****************************************************************************)
{ TDDVideoportConnect flags }
 
(*
* Flip can be performed automatically to avoid tearing.
*)
DDVPCAPS_AUTOFLIP = $00000001;
DDVPCONNECT_DOUBLECLOCK = $00000001;
DDVPCONNECT_VACT = $00000002;
DDVPCONNECT_INVERTPOLARITY = $00000004;
DDVPCONNECT_DISCARDSVREFDATA = $00000008;
DDVPCONNECT_HALFLINE = $00000010;
DDVPCONNECT_INTERLACED = $00000020;
DDVPCONNECT_SHAREEVEN = $00000040;
DDVPCONNECT_SHAREODD = $00000080;
 
(*
* Supports interlaced video
*)
DDVPCAPS_INTERLACED = $00000002;
{ TDDVideoportDesc caps }
 
(*
* Supports non-interlaced video
*)
DDVPCAPS_NONINTERLACED = $00000004;
DDVPCAPS_AUTOFLIP = $00000001;
DDVPCAPS_INTERLACED = $00000002;
DDVPCAPS_NONINTERLACED = $00000004;
DDVPCAPS_READBACKFIELD = $00000008;
DDVPCAPS_READBACKLINE = $00000010;
DDVPCAPS_SHAREABLE = $00000020;
DDVPCAPS_SKIPEVENFIELDS = $00000040;
DDVPCAPS_SKIPODDFIELDS = $00000080;
DDVPCAPS_SYNCMASTER = $00000100;
DDVPCAPS_VBISURFACE = $00000200;
DDVPCAPS_COLORCONTROL = $00000400;
DDVPCAPS_OVERSAMPLEDVBI = $00000800;
DDVPCAPS_SYSTEMMEMORY = $00001000;
DDVPCAPS_VBIANDVIDEOINDEPENDENT = $00002000;
DDVPCAPS_HARDWAREDEINTERLACE = $00004000;
 
(*
* Indicates that the device can return whether the current field
* of an interlaced signal is even or odd.
*)
DDVPCAPS_READBACKFIELD = $00000008;
{ TDDVideoportDesc FX }
 
(*
* Indicates that the device can return the current line of video
* being written into the frame buffer.
*)
DDVPCAPS_READBACKLINE = $00000010;
 
(*
* Allows two gen-locked video streams to share a single video port,
* where one stream uses the even fields and the other uses the odd
* fields. Separate parameters (including address, scaling,
* cropping, etc.) are maintained for both fields.)
*)
DDVPCAPS_SHAREABLE = $00000020;
 
(*
* Even fields of video can be automatically discarded.
*)
DDVPCAPS_SKIPEVENFIELDS = $00000040;
 
(*
* Odd fields of video can be automatically discarded.
*)
DDVPCAPS_SKIPODDFIELDS = $00000080;
 
(*
* Indicates that the device is capable of driving the graphics
* VSYNC with the video port VSYNC.
*)
DDVPCAPS_SYNCMASTER = $00000100;
 
(*
* Indicates that data within the vertical blanking interval can
* be written to a different surface.
*)
DDVPCAPS_VBISURFACE = $00000200;
 
(*
* Indicates that the video port can perform color operations
* on the incoming data before it is written to the frame buffer.
*)
DDVPCAPS_COLORCONTROL = $00000400;
 
(*
* Indicates that the video port can accept VBI data in a different
* width or format than the regular video data.
*)
DDVPCAPS_OVERSAMPLEDVBI = $00000800;
 
(*
* Indicates that the video port can write data directly to system memory
*)
DDVPCAPS_SYSTEMMEMORY = $00001000;
 
(*
* Indicates that the VBI and video portions of the video stream can
* be controlled by an independent processes.
*)
DDVPCAPS_VBIANDVIDEOINDEPENDENT = $00002000;
 
(*
* Indicates that the video port contains high quality hardware
* de-interlacing hardware that should be used instead of the
* bob/weave algorithms.
*)
DDVPCAPS_HARDWAREDEINTERLACE = $00004000;
 
(****************************************************************************
*
* VIDEOPORT TDDVideoPortDesc FX
*
****************************************************************************)
 
(*
* Limited cropping is available to crop out the vertical interval data.
*)
DDVPFX_CROPTOPDATA = $00000001;
 
(*
* Incoming data can be cropped in the X direction before it is written
* to the surface.
*)
DDVPFX_CROPX = $00000002;
 
(*
* Incoming data can be cropped in the Y direction before it is written
* to the surface.
*)
DDVPFX_CROPY = $00000004;
 
(*
* Supports interleaving interlaced fields in memory.
*)
DDVPFX_INTERLEAVE = $00000008;
 
(*
* Supports mirroring left to right as the video data is written
* into the frame buffer.
*)
DDVPFX_CROPTOPDATA = $00000001;
DDVPFX_CROPX = $00000002;
DDVPFX_CROPY = $00000004;
DDVPFX_INTERLEAVE = $00000008;
DDVPFX_MIRRORLEFTRIGHT = $00000010;
DDVPFX_MIRRORUPDOWN = $00000020;
DDVPFX_PRESHRINKX = $00000040;
DDVPFX_PRESHRINKY = $00000080;
DDVPFX_PRESHRINKXB = $00000100;
DDVPFX_PRESHRINKYB = $00000200;
DDVPFX_PRESHRINKXS = $00000400;
DDVPFX_PRESHRINKYS = $00000800;
DDVPFX_PRESTRETCHX = $00001000;
DDVPFX_PRESTRETCHY = $00002000;
DDVPFX_PRESTRETCHXN = $00004000;
DDVPFX_PRESTRETCHYN = $00008000;
DDVPFX_VBICONVERT = $00010000;
DDVPFX_VBINOSCALE = $00020000;
DDVPFX_IGNOREVBIXCROP = $00040000;
DDVPFX_VBINOINTERLEAVE = $00080000;
 
(*
* Supports mirroring top to bottom as the video data is written
* into the frame buffer.
*)
DDVPFX_MIRRORUPDOWN = $00000020;
{ TDDVideoportInfo flags }
 
(*
* Data can be arbitrarily shrunk in the X direction before it
* is written to the surface.
*)
DDVPFX_PRESHRINKX = $00000040;
DDVP_AUTOFLIP = $00000001;
DDVP_CONVERT = $00000002;
DDVP_CROP = $00000004;
DDVP_INTERLEAVE = $00000008;
DDVP_MIRRORLEFTRIGHT = $00000010;
DDVP_MIRRORUPDOWN = $00000020;
DDVP_PRESCALE = $00000040;
DDVP_SKIPEVENFIELDS = $00000080;
DDVP_SKIPODDFIELDS = $00000100;
DDVP_SYNCMASTER = $00000200;
DDVP_VBICONVERT = $00000400;
DDVP_VBINOSCALE = $00000800;
DDVP_OVERRIDEBOBWEAVE = $00001000;
DDVP_IGNOREVBIXCROP = $00002000;
DDVP_HARDWAREDEINTERLACE = $00008000;
 
(*
* Data can be arbitrarily shrunk in the Y direction before it
* is written to the surface.
*)
DDVPFX_PRESHRINKY = $00000080;
{ DirectDrawVideoport GetInputFormat/GetOutputFormat flags }
 
(*
* Data can be binary shrunk (1/2, 1/4, 1/8, etc.) in the X
* direction before it is written to the surface.
*)
DDVPFX_PRESHRINKXB = $00000100;
 
(*
* Data can be binary shrunk (1/2, 1/4, 1/8, etc.) in the Y
* direction before it is written to the surface.
*)
DDVPFX_PRESHRINKYB = $00000200;
 
(*
* Data can be shrunk in increments of 1/x in the X direction
* (where X is specified in the TDDVideoPortCaps.dwPreshrinkXStep)
* before it is written to the surface.
*)
DDVPFX_PRESHRINKXS = $00000400;
 
(*
* Data can be shrunk in increments of 1/x in the Y direction
* (where X is specified in the TDDVideoPortCaps.dwPreshrinkYStep)
* before it is written to the surface.
*)
DDVPFX_PRESHRINKYS = $00000800;
 
(*
* Data can be arbitrarily stretched in the X direction before
* it is written to the surface.
*)
DDVPFX_PRESTRETCHX = $00001000;
 
(*
* Data can be arbitrarily stretched in the Y direction before
* it is written to the surface.
*)
DDVPFX_PRESTRETCHY = $00002000;
 
(*
* Data can be integer stretched in the X direction before it is
* written to the surface.
*)
DDVPFX_PRESTRETCHXN = $00004000;
 
(*
* Data can be integer stretched in the Y direction before it is
* written to the surface.
*)
DDVPFX_PRESTRETCHYN = $00008000;
 
(*
* Indicates that data within the vertical blanking interval can
* be converted independently of the remaining video data.
*)
DDVPFX_VBICONVERT = $00010000;
 
(*
* Indicates that scaling can be disabled for data within the
* vertical blanking interval.
*)
DDVPFX_VBINOSCALE = $00020000;
 
(*
* Indicates that the video data can ignore the left and right
* cropping coordinates when cropping oversampled VBI data.
*)
DDVPFX_IGNOREVBIXCROP = $00040000;
 
(*
* Indicates that interleaving can be disabled for data within the
* vertical blanking interval.
*)
DDVPFX_VBINOINTERLEAVE = $00080000;
 
(****************************************************************************
*
* VIDEOPORT TDDVideoPortInfo FLAGS
*
****************************************************************************)
 
(*
* Perform automatic flipping. Auto-flipping is performed between
* the overlay surface that was attached to the video port using
* IDirectDrawVideoPort::AttachSurface and the overlay surfaces that
* are attached to the surface via the IDirectDrawSurface::AttachSurface
* method. The flip order is the order in which the overlay surfaces
* were. attached.
*)
DDVP_AUTOFLIP = $00000001;
 
(*
* Perform conversion using the ddpfOutputFormat information.
*)
DDVP_CONVERT = $00000002;
 
(*
* Perform cropping using the specified rectangle.
*)
DDVP_CROP = $00000004;
 
(*
* Indicates that interlaced fields should be interleaved in memory.
*)
DDVP_INTERLEAVE = $00000008;
 
(*
* Indicates that the data should be mirrored left to right as it's
* written into the frame buffer.
*)
DDVP_MIRRORLEFTRIGHT = $00000010;
 
(*
* Indicates that the data should be mirrored top to bottom as it's
* written into the frame buffer.
*)
DDVP_MIRRORUPDOWN = $00000020;
 
(*
* Perform pre-scaling/zooming based on the pre-scale parameters.
*)
DDVP_PRESCALE = $00000040;
 
(*
* Ignore input of even fields.
*)
DDVP_SKIPEVENFIELDS = $00000080;
 
(*
* Ignore input of odd fields.
*)
DDVP_SKIPODDFIELDS = $00000100;
 
(*
* Drive the graphics VSYNCs using the video port VYSNCs.
*)
DDVP_SYNCMASTER = $00000200;
 
(*
* The ddpfVBIOutputFormatFormat member contains data that should be used
* to convert the data within the vertical blanking interval.
*)
DDVP_VBICONVERT = $00000400;
 
(*
* Indicates that data within the vertical blanking interval
* should not be scaled.
*)
DDVP_VBINOSCALE = $00000800;
 
(*
* Indicates that these bob/weave decisions should not be
* overriden by other interfaces.
*)
DDVP_OVERRIDEBOBWEAVE = $00001000;
 
(*
* Indicates that the video data should ignore the left and right
* cropping coordinates when cropping the VBI data.
*)
DDVP_IGNOREVBIXCROP = $00002000;
 
(*
* Indicates that interleaving can be disabled for data within the
* vertical blanking interval.
*)
DDVP_VBINOINTERLEAVE = $00004000;
 
(*
* Indicates that the video port should use the hardware
* de-interlacing hardware.
*)
DDVP_HARDWAREDEINTERLACE = $00008000;
 
(****************************************************************************
*
* DIRIRECTDRAWVIDEOPORT GETINPUTFORMAT/GETOUTPUTFORMAT FLAGS
*
****************************************************************************)
 
(*
* Return formats for the video data
*)
DDVPFORMAT_VIDEO = $00000001;
 
(*
* Return formats for the VBI data
*)
DDVPFORMAT_VBI = $00000002;
 
(****************************************************************************
*
* DIRIRECTDRAWVIDEOPORT SETTARGETSURFACE FLAGS
*
****************************************************************************)
{ DirectDrawVideoport SetTargetSurface flags }
 
(*
* Surface should receive video data (and VBI data if a surface
* is not explicitly attached for that purpose)
*)
DDVPTARGET_VIDEO = $00000001;
 
(*
* Surface should receive VBI data
*)
DDVPTARGET_VBI = $00000002;
 
(****************************************************************************
*
* DIRIRECTDRAWVIDEOPORT WAITFORSYNC FLAGS
*
****************************************************************************)
{ DirectDrawVideoport WaitForSync flags }
 
(*
* Waits until the beginning of the next VSYNC
*)
DDVPWAIT_BEGIN = $00000001;
 
(*
* Waits until the end of the next/current VSYNC
*)
DDVPWAIT_END = $00000002;
 
(*
* Waits until the beginning of the specified line
*)
DDVPWAIT_LINE = $00000003;
 
(****************************************************************************
*
* DIRECTDRAWVIDEOPORT FLIP FLAGS
*
****************************************************************************)
{ DirectDrawVideoport flip flags }
 
(*
* Flips the normal video surface
*)
DDVPFLIP_VIDEO = $00000001;
 
(*
* Flips the VBI surface
*)
DDVPFLIP_VBI = $00000002;
 
(****************************************************************************
*
* DIRIRECTDRAWVIDEOPORT GETVIDEOSIGNALSTATUS VALUES
*
****************************************************************************)
{ DirectDrawVideoport GetVideoSiginalStatus values }
 
(*
* No video signal is present at the video port
*)
DDVPSQ_NOSIGNAL = $00000001;
 
(*
* A valid video signal is present at the video port
*)
DDVPSQ_SIGNALOK = $00000002;
 
(****************************************************************************
*
* VIDEOPORTBANDWIDTH Flags
*
****************************************************************************)
{ TDDVideoportBandWidth Flags }
 
(*
* The specified height/width refer to the size of the video port data
* written into memory, after prescaling has occured.
*)
DDVPB_VIDEOPORT = $00000001;
 
(*
* The specified height/width refer to the source size of the overlay.
*)
DDVPB_OVERLAY = $00000002;
 
(*
* This is a query for the device to return which caps this device requires.
*)
DDVPB_TYPE = $00000004;
 
(****************************************************************************
*
* VIDEOPORTBANDWIDTH Caps
*
****************************************************************************)
{ TDDVideoportBandWidth Caps }
 
(*
* The bandwidth for this device is dependant on the overlay source size.
*)
DDVPBCAPS_SOURCE = $00000001;
 
(*
* The bandwidth for this device is dependant on the overlay destination
* size.
*)
DDVPBCAPS_DESTINATION = $00000002;
 
(****************************************************************************
*
* DDVIDEOPORTCONTAINER CreateVideoPort flags
*
****************************************************************************)
{ IDDVideoportContainer.CreateVideoPort flags }
 
(*
* The process only wants to control the VBI portion of the video stream.
*)
DDVPCREATE_VBIONLY = $00000001;
DDVPCREATE_VBIONLY = $00000001;
DDVPCREATE_VIDEOONLY = $00000002;
 
(*
* The process only wants to control the non-VBI (video) portion of
* the video stream.
*)
DDVPCREATE_VIDEOONLY = $00000002;
{ TDDVideoportStatus flags }
 
(****************************************************************************
*
* DDVIDEOPORTSTATUS flags
*
****************************************************************************)
DDVPSTATUS_VBIONLY = $00000001;
DDVPSTATUS_VIDEOONLY = $00000002;
 
(*
* The video port interface is only controlling the VBI portion of the
* video stream
*)
DDVPSTATUS_VBIONLY = $00000001;
 
(*
* The video port interface is only controlling the video portion of the
* video stream
*)
DDVPSTATUS_VIDEOONLY = $00000002;
 
 
type
(*
* API's
*)
 
TDDEnumVideoCallback = function (lpTDDVideoPortCaps: PDDVideoPortCaps;
lpContext: Pointer) : HResult; stdcall;
 
(*
* INTERACES FOLLOW:
* IDirectDrawVideoPort
* IVideoPort
*)
 
 
(*
* IDirectDrawVideoPort
*)
IDirectDrawVideoPort = interface (IUnknown)
['{B36D93E0-2B43-11CF-A2DE-00AA00B93356}']
(*** IDirectDrawVideoPort methods ***)
function Flip(lpDDSurface: IDirectDrawSurface; dwFlags: DWORD) : HResult; stdcall;
function GetBandwidthInfo(var lpddpfFormat: TDDPixelFormat;
dwWidth: DWORD; dwHeight: DWORD; dwFlags: DWORD;
var lpBandwidth: TDDVideoPortBandWidth) : HResult; stdcall;
function GetColorControls(var lpColorControl: TDDColorControl) : HResult; stdcall;
function GetInputFormats(var lpNumFormats: DWORD; var lpFormats:
TDDPixelFormat; dwFlags: DWORD) : HResult; stdcall;
function GetOutputFormats(var lpInputFormat: TDDPixelFormat;
var lpNumFormats: DWORD; lpFormats: PDDPixelFormat; dwFlags: DWORD)
: HResult; stdcall;
function GetFieldPolarity(var lpbVideoField: BOOL) : HResult; stdcall;
function GetVideoLine(var lpdwLine: DWORD) : HResult; stdcall;
function GetVideoSignalStatus(varlpdwStatus: DWORD) : HResult; stdcall;
function SetColorControls(var lpColorControl: TDDColorControl) : HResult; stdcall;
function SetTargetSurface(lpDDSurface: IDirectDrawSurface; dwFlags: DWORD) :
HResult; stdcall;
function StartVideo(var lpVideoInfo: TDDVideoPortInfo) : HResult; stdcall;
function StopVideo: HResult; stdcall;
function UpdateVideo(var lpVideoInfo: TDDVideoPortInfo) : HResult; stdcall;
function WaitForSync(dwFlags: DWORD; dwLine: DWORD; dwTimeout: DWORD) :
HResult; stdcall;
end;
 
(*
* IDirectDrawVideoPortContainer
*)
IDDVideoPortContainer = interface (IUnknown)
['{6C142760-A733-11CE-A521-0020AF0BE560}']
(*** IDDVideoPortContainer methods ***)
function CreateVideoPort(dwFlags: DWORD; var lpTDDVideoPortDesc:
TDDVideoPortDesc; var lplpDDVideoPort: IDirectDrawVideoPort;
pUnkOuter: IUnknown) : HResult; stdcall;
function EnumVideoPorts(dwFlags: DWORD;
lpTDDVideoPortCaps: PDDVideoPortCaps; lpContext: Pointer;
lpEnumVideoCallback: TDDEnumVideoCallback) : HResult; stdcall;
function GetVideoPortConnectInfo(dwPortId: DWORD; var lpNumEntries: DWORD;
lpConnectInfo: PDDVideoPortConnect) : HResult; stdcall;
function QueryVideoPortStatus(dwPortId: DWORD;
var lpVPStatus: TDDVideoPortStatus) : HResult; stdcall;
end;
 
IID_IDDVideoPortContainer = IDDVideoPortContainer;
IID_IDirectDrawVideoPort = IDirectDrawVideoPort;
 
 
//Direct3D file
(*==========================================================================;
*
* Copyright (C) 1995-1998 Microsoft Corporation. All Rights Reserved.
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* Files: d3dtypes.h d3dcaps.h d3d.h
* File: d3dtypes.h
* Content: Direct3D types include file
*
* DirectX 7.0 Delphi adaptation by Erik Unger
*
* Modyfied: 26-Jun-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
***************************************************************************)
 
(* TD3DValue is the fundamental Direct3D fractional data type *)
 
type
TRefClsID = TGUID;
TD3DValue = Single;
D3DValue = TD3DValue;
 
type
TD3DValue = Single;
TD3DFixed = LongInt;
float = TD3DValue;
PD3DColor = ^TD3DColor;
TD3DFixed = Longint;
D3DFIXED = TD3DFixed;
 
TD3DColor = DWORD;
D3DCOLOR = TD3DColor;
 
function D3DVal(val: variant) : float;
function D3DDivide(a,b: double) : float;
function D3DMultiply(a,b: double) : float;
function D3DVALP(val: TD3DValue; prec: Integer): TD3DValue;
function D3DVAL(val: TD3DValue): TD3DValue;
function D3DDivide(a, b: TD3DValue): TD3DValue;
function D3DMultiply(a, b: TD3DValue): TD3DValue;
 
(*
* Format of CI colors is
5731,24 → 2524,13
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*)
 
// #define CI_GETALPHA(ci) ((ci) >> 24)
function CI_GETALPHA(ci: DWORD) : DWORD;
function CI_GETALPHA(ci: Integer): Byte;
function CI_GETINDEX(ci: Integer): Word;
function CI_GETFRACTION(ci: Integer): Byte;
function CI_ROUNDINDEX(ci: Integer): Integer;
function CI_MASKALPHA(ci: Integer): Integer;
function CI_MAKE(a: Byte; i: Word; f: Byte): Integer;
 
// #define CI_GETINDEX(ci) (((ci) >> 8) & 0xffff)
function CI_GETINDEX(ci: DWORD) : DWORD;
 
// #define CI_GETFRACTION(ci) ((ci) & 0xff)
function CI_GETFRACTION(ci: DWORD) : DWORD;
 
// #define CI_ROUNDINDEX(ci) CI_GETINDEX((ci) + 0x80)
function CI_ROUNDINDEX(ci: DWORD) : DWORD;
 
// #define CI_MASKALPHA(ci) ((ci) & 0xffffff)
function CI_MASKALPHA(ci: DWORD) : DWORD;
 
// #define CI_MAKE(a, i, f) (((a) << 24) | ((i) << 8) | (f))
function CI_MAKE(a,i,f: DWORD) : DWORD;
 
(*
* Format of RGBA colors is
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5756,35 → 2538,19
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*)
 
// #define RGBA_GETALPHA(rgb) ((rgb) >> 24)
function RGBA_GETALPHA(rgb: TD3DColor) : DWORD;
function RGBA_GETALPHA(rgb: TD3DColor): Byte;
function RGBA_GETRED(rgb: TD3DColor): Byte;
function RGBA_GETGREEN(rgb: TD3DColor): Byte;
function RGBA_GETBLUE(rgb: TD3DColor): Byte;
function RGBA_MAKE(r, g, b, a: Byte): TD3DColor;
 
// #define RGBA_GETRED(rgb) (((rgb) >> 16) & 0xff)
function RGBA_GETRED(rgb: TD3DColor) : DWORD;
 
// #define RGBA_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
function RGBA_GETGREEN(rgb: TD3DColor) : DWORD;
 
// #define RGBA_GETBLUE(rgb) ((rgb) & 0xff)
function RGBA_GETBLUE(rgb: TD3DColor) : DWORD;
 
// #define RGBA_MAKE(r, g, b, a) ((TD3DColor) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
function RGBA_MAKE(r, g, b, a: DWORD) : TD3DColor;
 
(* D3DRGB and D3DRGBA may be used as initialisers for D3DCOLORs
* The float values must be in the range 0..1
*)
 
// #define D3DRGB(r, g, b) \
// (0xff000000L | (((long)((r) * 255)) << 16) | (((long)((g) * 255)) << 8) | (long)((b) * 255))
function D3DRGB(r, g, b: float) : TD3DColor;
function D3DRGB(r, g, b: TD3DValue): TD3DColor;
function D3DRGBA(r, g, b, a: TD3DValue): TD3DColor;
 
// #define D3DRGBA(r, g, b, a) \
// ( (((long)((a) * 255)) << 24) | (((long)((r) * 255)) << 16) \
// | (((long)((g) * 255)) << 8) | (long)((b) * 255) \
// )
function D3DRGBA(r, g, b, a: float) : TD3DColor;
 
(*
* Format of RGB colors is
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5792,64 → 2558,44
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*)
 
// #define RGB_GETRED(rgb) (((rgb) >> 16) & 0xff)
function RGB_GETRED(rgb: TD3DColor) : DWORD;
function RGB_GETRED(rgb: TD3DColor): Byte;
function RGB_GETGREEN(rgb: TD3DColor): Byte;
function RGB_GETBLUE(rgb: TD3DColor): Byte;
function RGBA_SETALPHA(rgba: TD3DColor; x: Byte): TD3DColor;
function RGB_MAKE(r, g, b: Byte): TD3DColor;
function RGBA_TORGB(rgba: TD3DColor): TD3DColor;
function RGB_TORGBA(rgb: TD3DColor): TD3DColor;
 
// #define RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
function RGB_GETGREEN(rgb: TD3DColor) : DWORD;
 
// #define RGB_GETBLUE(rgb) ((rgb) & 0xff)
function RGB_GETBLUE(rgb: TD3DColor) : DWORD;
 
// #define RGBA_SETALPHA(rgba, x) (((x) << 24) | ((rgba) & 0x00ffffff))
function RGBA_SETALPHA(rgba: TD3DColor; x: DWORD) : TD3DColor;
 
// #define RGB_MAKE(r, g, b) ((TD3DColor) (((r) << 16) | ((g) << 8) | (b)))
function RGB_MAKE(r, g, b: DWORD) : TD3DColor;
 
// #define RGBA_TORGB(rgba) ((TD3DColor) ((rgba) & 0xffffff))
function RGBA_TORGB(rgba: TD3DColor) : TD3DColor;
 
// #define RGB_TORGBA(rgb) ((TD3DColor) ((rgb) | 0xff000000))
function RGB_TORGBA(rgb: TD3DColor) : TD3DColor;
 
(*
* Flags for Enumerate functions
*)
const
{ Flags for Enumerate functions }
 
(*
* Stop the enumeration
*)
D3DENUMRET_CANCEL = DDENUMRET_CANCEL;
D3DENUMRET_OK = DDENUMRET_OK;
 
D3DENUMRET_CANCEL = DDENUMRET_CANCEL;
type
TD3DValidateCallback = function(lpUserArg: Pointer; dwOffset: DWORD): HResult; stdcall;
LPD3DVALIDATECALLBACK = TD3DValidateCallback;
 
(*
* Continue the enumeration
*)
TD3DEnumTextureFormatsCalback = function(const lpDdsd: TDDSurfaceDesc;
lpContext: Pointer): HResult; stdcall;
LPD3DENUMTEXTUREFORMATSCALLBACK = TD3DEnumTextureFormatsCalback;
 
D3DENUMRET_OK = DDENUMRET_OK;
 
type
TD3DValidateCallback = function (lpUserArg: Pointer;
dwOffset: DWORD): HResult; stdcall;
TD3DEnumTextureFormatsCallback = function (var lpDdsd: TDDSurfaceDesc;
TD3DEnumPixelFormatsCallback = function(const lpDDPixFmt: TDDPixelFormat;
lpContext: Pointer): HResult; stdcall;
TD3DEnumPixelFormatsCallback = function (var lpDDPixFmt: TDDPixelFormat;
lpContext: Pointer): HResult; stdcall;
 
 
PD3DMaterialHandle = ^TD3DMaterialHandle;
TD3DMaterialHandle = DWORD;
D3DMATERIALHANDLE = TD3DMaterialHandle;
 
PD3DTextureHandle = ^TD3DTextureHandle;
TD3DTextureHandle = DWORD;
D3DTEXTUREHANDLE = TD3DTextureHandle;
 
PD3DMatrixHandle = ^TD3DMatrixHandle;
TD3DMatrixHandle = DWORD;
D3DMATRIXHANDLE = TD3DMatrixHandle;
 
{ TD3DColorValue structure }
 
PD3DColorValue = ^TD3DColorValue;
TD3DColorValue = packed record
TD3DColorValue = record
case Integer of
0: (
r: TD3DValue;
5856,131 → 2602,126
g: TD3DValue;
b: TD3DValue;
a: TD3DValue;
);
);
1: (
dvR: TD3DValue;
dvG: TD3DValue;
dvB: TD3DValue;
dvA: TD3DValue;
);
);
end;
 
D3DCOLORVALUE = TD3DColorValue;
 
{ TD3DRect structure }
 
PD3DRect = ^TD3DRect;
TD3DRect = packed record
TD3DRect = record
case Integer of
0: (
x1: LongInt;
y1: LongInt;
x2: LongInt;
y2: LongInt;
);
x1: Longint;
y1: Longint;
x2: Longint;
y2: Longint;
);
1: (
lX1: LongInt;
lY1: LongInt;
lX2: LongInt;
lY2: LongInt;
);
2: (
a: array[0..3] of LongInt;
);
lX1: Longint;
lY1: Longint;
lX2: Longint;
lY2: Longint;
);
end;
 
D3DRECT = TD3DRect;
LPD3DRECT = PD3DRect;
 
{ TD3DVector structure }
 
PD3DVector = ^TD3DVector;
TD3DVector = packed record
TD3DVector = record
case Integer of
0: (
x: TD3DValue;
y: TD3DValue;
z: TD3DValue;
);
);
1: (
dvX: TD3DValue;
dvY: TD3DValue;
dvZ: TD3DValue;
);
);
end;
 
(******************************************************************
* *
* D3DVec.inl *
* *
* Float-valued 3D vector class for Direct3D. *
* *
* Copyright (c) 1996-1998 Microsoft Corp. All rights reserved. *
* *
******************************************************************)
D3DVECTOR = TD3DVector;
LPD3DVECTOR = PD3DVector;
 
// Addition and subtraction
function VectorAdd(const v1, v2: TD3DVector) : TD3DVector;
function VectorSub(const v1, v2: TD3DVector) : TD3DVector;
// Scalar multiplication and division
function VectorMulS(const v: TD3DVector; s: TD3DValue) : TD3DVector;
function VectorDivS(const v: TD3DVector; s: TD3DValue) : TD3DVector;
// Memberwise multiplication and division
function VectorMul(const v1, v2: TD3DVector) : TD3DVector;
function VectorDiv(const v1, v2: TD3DVector) : TD3DVector;
// Vector dominance
function VectorSmaller(v1, v2: TD3DVector) : boolean;
function VectorSmallerEquel(v1, v2: TD3DVector) : boolean;
// Bitwise equality
function VectorEquel(v1, v2: TD3DVector) : boolean;
// Length-related functions
function VectorSquareMagnitude(v: TD3DVector) : TD3DValue;
function VectorMagnitude(v: TD3DVector) : TD3DValue;
// Returns vector with same direction and unit length
function VectorNormalize(const v: TD3DVector) : TD3DVector;
// Return min/max component of the input vector
function VectorMin(v: TD3DVector) : TD3DValue;
function VectorMax(v: TD3DVector) : TD3DValue;
// Return memberwise min/max of input vectors
function VectorMinimize(const v1, v2: TD3DVector) : TD3DVector;
function VectorMaximize(const v1, v2: TD3DVector) : TD3DVector;
// Dot and cross product
function VectorDotProduct(v1, v2: TD3DVector) : TD3DValue;
function VectorCrossProduct(const v1, v2: TD3DVector) : TD3DVector;
// Addition and subtraction
function VectorAdd(v1, v2: TD3DVector) : TD3DVector;
function VectorSub(v1, v2: TD3DVector) : TD3DVector;
// Scalar multiplication and division
function VectorMulS(v: TD3DVector; s: TD3DValue) : TD3DVector;
function VectorDivS(v: TD3DVector; s: TD3DValue) : TD3DVector;
// Memberwise multiplication and division
function VectorMul(v1, v2: TD3DVector) : TD3DVector;
function VectorDiv(v1, v2: TD3DVector) : TD3DVector;
// Vector dominance
function VectorSmaller(v1, v2: TD3DVector) : boolean;
function VectorSmallerEquel(v1, v2: TD3DVector) : boolean;
// Bitwise equality
function VectorEquel(v1, v2: TD3DVector) : boolean;
// Length-related functions
function VectorSquareMagnitude(v: TD3DVector) : TD3DValue;
function VectorMagnitude(v: TD3DVector) : TD3DValue;
// Returns vector with same direction and unit length
function VectorNormalize(v: TD3DVector) : TD3DVector;
// Return min/max component of the input vector
function VectorMin(v: TD3DVector) : TD3DValue;
function VectorMax(v: TD3DVector) : TD3DValue;
// Return memberwise min/max of input vectors
function VectorMinimize(v1, v2: TD3DVector) : TD3DVector;
function VectorMaximize(v1, v2: TD3DVector) : TD3DVector;
// Dot and cross product
function VectorDotProduct(v1, v2: TD3DVector) : TD3DValue;
function VectorCrossProduct(v1, v2: TD3DVector) : TD3DVector;
 
type
(*
* Vertex data types supported in an ExecuteBuffer.
*)
{ Vertex data types supported in an ExecuteBuffer. }
 
(*
* Homogeneous vertices
*)
{ TD3DHVertex structure }
 
PD3DHVertex = ^TD3DHVertex;
TD3DHVertex = packed record
dwFlags: DWORD; (* Homogeneous clipping flags *)
TD3DHVertex = record
dwFlags: DWORD; // Homogeneous clipping flags
case Integer of
0: (
hx: TD3DValue;
hy: TD3DValue;
hz: TD3DValue;
);
);
1: (
dvHX: TD3DValue;
dvHY: TD3DValue;
dvHZ: TD3DValue;
);
);
end;
 
(*
* Transformed/lit vertices
*)
D3DHVERTEX = TD3DHVertex;
 
{ TD3DTLVertex structure }
 
PD3DTLVertex = ^TD3DTLVertex;
TD3DTLVertex = packed record
TD3DTLVertex = record
case Integer of
0: (
sx: TD3DValue; (* Screen coordinates *)
sx: TD3DValue; // Screen coordinates
sy: TD3DValue;
sz: TD3DValue;
rhw: TD3DValue; (* Reciprocal of homogeneous w *)
color: TD3DColor; (* Vertex color *)
specular: TD3DColor; (* Specular component of vertex *)
tu: TD3DValue; (* Texture coordinates *)
rhw: TD3DValue; // Reciprocal of homogeneous w
color: TD3DColor; // Vertex color
specular: TD3DColor; // Specular component of vertex
tu: TD3DValue; // Texture coordinates
tv: TD3DValue;
);
);
1: (
dvSX: TD3DValue;
dvSY: TD3DValue;
5990,55 → 2731,55
dcSpecular: TD3DColor;
dvTU: TD3DValue;
dvTV: TD3DValue;
);
);
end;
 
(*
* Untransformed/lit vertices
*)
D3DTLVERTEX = TD3DTLVertex;
 
{ TD3DLVertex structure }
 
PD3DLVertex = ^TD3DLVertex;
TD3DLVertex = packed record
TD3DLVertex = record
case Integer of
0: (
x: TD3DValue; (* Homogeneous coordinates *)
x: TD3DValue; // Homogeneous coordinates
y: TD3DValue;
z: TD3DValue;
dwReserved: DWORD;
color: TD3DColor; (* Vertex color *)
specular: TD3DColor; (* Specular component of vertex *)
tu: TD3DValue; (* Texture coordinates *)
color: TD3DColor; // Vertex color
specular: TD3DColor; // Specular component of vertex
tu: TD3DValue; // Texture coordinates
tv: TD3DValue;
);
);
1: (
dvX: TD3DValue;
dvY: TD3DValue;
dvZ: TD3DValue;
UNIONFILLER1d: DWORD;
_union1d: DWORD;
dcColor: TD3DColor;
dcSpecular: TD3DColor;
dvTU: TD3DValue;
dvTV: TD3DValue;
);
);
end;
 
(*
* Untransformed/unlit vertices
*)
D3DLVERTEX = TD3DLVertex;
 
{ TD3DVertex structure }
 
PD3DVertex = ^TD3DVertex;
TD3DVertex = packed record
TD3DVertex = record
case Integer of
0: (
x: TD3DValue; (* Homogeneous coordinates *)
x: TD3DValue; // Homogeneous coordinates
y: TD3DValue;
z: TD3DValue;
nx: TD3DValue; (* Normal *)
nx: TD3DValue; // Normal
ny: TD3DValue;
nz: TD3DValue;
tu: TD3DValue; (* Texture coordinates *)
tu: TD3DValue; // Texture coordinates
tv: TD3DValue;
);
);
1: (
dvX: TD3DValue;
dvY: TD3DValue;
6048,207 → 2789,214
dvNZ: TD3DValue;
dvTU: TD3DValue;
dvTV: TD3DValue;
);
);
end;
 
(*
* Matrix, viewport, and tranformation structures and definitions.
*)
D3DVERTEX = TD3DVertex;
 
{ TD3DMatrix structure }
 
PD3DMatrix = ^TD3DMatrix;
TD3DMatrix = packed record
case integer of
0 : (_11, _12, _13, _14: TD3DValue;
_21, _22, _23, _24: TD3DValue;
_31, _32, _33, _34: TD3DValue;
_41, _42, _43, _44: TD3DValue);
1 : (m : array [0..3, 0..3] of TD3DValue);
TD3DMatrix = record
_11, _12, _13, _14: TD3DValue;
_21, _22, _23, _24: TD3DValue;
_31, _32, _33, _34: TD3DValue;
_41, _42, _43, _44: TD3DValue;
end;
 
D3DMATRIX = TD3DMatrix;
 
{ TD3DViewport structure }
 
PD3DViewport = ^TD3DViewport;
TD3DViewport = packed record
TD3DViewport = record
dwSize: DWORD;
dwX: DWORD;
dwY: DWORD; (* Top left *)
dwY: DWORD; // Top left
dwWidth: DWORD;
dwHeight: DWORD; (* Dimensions *)
dvScaleX: TD3DValue; (* Scale homogeneous to screen *)
dvScaleY: TD3DValue; (* Scale homogeneous to screen *)
dvMaxX: TD3DValue; (* Min/max homogeneous x coord *)
dvMaxY: TD3DValue; (* Min/max homogeneous y coord *)
dwHeight: DWORD; // Dimensions
dvScaleX: TD3DValue; // Scale homogeneous to screen
dvScaleY: TD3DValue; // Scale homogeneous to screen
dvMaxX: TD3DValue; // Min/max homogeneous x coord
dvMaxY: TD3DValue; // Min/max homogeneous y coord
dvMinZ: TD3DValue;
dvMaxZ: TD3DValue; (* Min/max homogeneous z coord *)
dvMaxZ: TD3DValue; // Min/max homogeneous z coord
end;
 
D3DVIEWPORT = TD3DViewport;
 
{ TD3DViewport2 structure }
 
PD3DViewport2 = ^TD3DViewport2;
TD3DViewport2 = packed record
TD3DViewport2 = record
dwSize: DWORD;
dwX: DWORD;
dwY: DWORD; (* Viewport Top left *)
dwY: DWORD; // Top left
dwWidth: DWORD;
dwHeight: DWORD; (* Viewport Dimensions *)
dvClipX: TD3DValue; (* Top left of clip volume *)
dwHeight: DWORD; // Dimensions
dvClipX: TD3DValue; // Top left of clip volume
dvClipY: TD3DValue;
dvClipWidth: TD3DValue; (* Clip Volume Dimensions *)
dvClipWidth: TD3DValue; // Clip Volume Dimensions
dvClipHeight: TD3DValue;
dvMinZ: TD3DValue; (* Min/max of clip Volume *)
dvMaxZ: TD3DValue;
dvMinZ: TD3DValue;
dvMaxZ: TD3DValue; // Min/max homogeneous z coord
end;
 
D3DVIEWPORT2 = TD3DViewport2;
 
{ TD3DViewport2 structure }
 
PD3DViewport7 = ^TD3DViewport7;
TD3DViewport7 = packed record
TD3DViewport7 = record
dwX: DWORD;
dwY: DWORD; (* Viewport Top left *)
dwY: DWORD; // Top left
dwWidth: DWORD;
dwHeight: DWORD; (* Viewport Dimensions *)
dvMinZ: TD3DValue; (* Min/max of clip Volume *)
dvMaxZ: TD3DValue;
dwHeight: DWORD; // Dimensions
dvMinZ: TD3DValue;
dvMaxZ: TD3DValue; // Min/max homogeneous z coord
end;
 
(*
* Values for clip fields.
*)
D3DVIEWPORT7 = TD3DViewport7;
 
const
// Max number of user clipping planes, supported in D3D.
D3DMAXUSERCLIPPLANES = 32;
{ Max number of user clipping planes, supported in D3D. }
D3DMAXUSERCLIPPLANES = 32;
 
// These bits could be ORed together to use with D3DRENDERSTATE_CLIPPLANEENABLE
//
D3DCLIPPLANE0 = (1 shl 0);
D3DCLIPPLANE1 = (1 shl 1);
D3DCLIPPLANE2 = (1 shl 2);
D3DCLIPPLANE3 = (1 shl 3);
D3DCLIPPLANE4 = (1 shl 4);
D3DCLIPPLANE5 = (1 shl 5);
{ These bits could be ORed together to use with D3DRENDERSTATE_CLIPPLANEENABLE }
D3DCLIPPLANE0 = 1 shl 0;
D3DCLIPPLANE1 = 1 shl 1;
D3DCLIPPLANE2 = 1 shl 2;
D3DCLIPPLANE3 = 1 shl 3;
D3DCLIPPLANE4 = 1 shl 4;
D3DCLIPPLANE5 = 1 shl 5;
 
const
D3DCLIP_LEFT = $00000001;
D3DCLIP_RIGHT = $00000002;
D3DCLIP_TOP = $00000004;
D3DCLIP_BOTTOM = $00000008;
D3DCLIP_FRONT = $00000010;
D3DCLIP_BACK = $00000020;
D3DCLIP_GEN0 = $00000040;
D3DCLIP_GEN1 = $00000080;
D3DCLIP_GEN2 = $00000100;
D3DCLIP_GEN3 = $00000200;
D3DCLIP_GEN4 = $00000400;
D3DCLIP_GEN5 = $00000800;
{ Values for clip fields. }
 
(*
* Values for d3d status.
*)
D3DCLIP_LEFT = $00000001;
D3DCLIP_RIGHT = $00000002;
D3DCLIP_TOP = $00000004;
D3DCLIP_BOTTOM = $00000008;
D3DCLIP_FRONT = $00000010;
D3DCLIP_BACK = $00000020;
D3DCLIP_GEN0 = $00000040;
D3DCLIP_GEN1 = $00000080;
D3DCLIP_GEN2 = $00000100;
D3DCLIP_GEN3 = $00000200;
D3DCLIP_GEN4 = $00000400;
D3DCLIP_GEN5 = $00000800;
 
D3DSTATUS_CLIPUNIONLEFT = D3DCLIP_LEFT;
D3DSTATUS_CLIPUNIONRIGHT = D3DCLIP_RIGHT;
D3DSTATUS_CLIPUNIONTOP = D3DCLIP_TOP;
D3DSTATUS_CLIPUNIONBOTTOM = D3DCLIP_BOTTOM;
D3DSTATUS_CLIPUNIONFRONT = D3DCLIP_FRONT;
D3DSTATUS_CLIPUNIONBACK = D3DCLIP_BACK;
D3DSTATUS_CLIPUNIONGEN0 = D3DCLIP_GEN0;
D3DSTATUS_CLIPUNIONGEN1 = D3DCLIP_GEN1;
D3DSTATUS_CLIPUNIONGEN2 = D3DCLIP_GEN2;
D3DSTATUS_CLIPUNIONGEN3 = D3DCLIP_GEN3;
D3DSTATUS_CLIPUNIONGEN4 = D3DCLIP_GEN4;
D3DSTATUS_CLIPUNIONGEN5 = D3DCLIP_GEN5;
{ Values for d3d status. }
 
D3DSTATUS_CLIPINTERSECTIONLEFT = $00001000;
D3DSTATUS_CLIPINTERSECTIONRIGHT = $00002000;
D3DSTATUS_CLIPINTERSECTIONTOP = $00004000;
D3DSTATUS_CLIPINTERSECTIONBOTTOM = $00008000;
D3DSTATUS_CLIPINTERSECTIONFRONT = $00010000;
D3DSTATUS_CLIPINTERSECTIONBACK = $00020000;
D3DSTATUS_CLIPINTERSECTIONGEN0 = $00040000;
D3DSTATUS_CLIPINTERSECTIONGEN1 = $00080000;
D3DSTATUS_CLIPINTERSECTIONGEN2 = $00100000;
D3DSTATUS_CLIPINTERSECTIONGEN3 = $00200000;
D3DSTATUS_CLIPINTERSECTIONGEN4 = $00400000;
D3DSTATUS_CLIPINTERSECTIONGEN5 = $00800000;
D3DSTATUS_ZNOTVISIBLE = $01000000;
(* Do not use 0x80000000 for any status flags in future as it is reserved *)
D3DSTATUS_CLIPUNIONLEFT = D3DCLIP_LEFT;
D3DSTATUS_CLIPUNIONRIGHT = D3DCLIP_RIGHT;
D3DSTATUS_CLIPUNIONTOP = D3DCLIP_TOP;
D3DSTATUS_CLIPUNIONBOTTOM = D3DCLIP_BOTTOM;
D3DSTATUS_CLIPUNIONFRONT = D3DCLIP_FRONT;
D3DSTATUS_CLIPUNIONBACK = D3DCLIP_BACK;
D3DSTATUS_CLIPUNIONGEN0 = D3DCLIP_GEN0;
D3DSTATUS_CLIPUNIONGEN1 = D3DCLIP_GEN1;
D3DSTATUS_CLIPUNIONGEN2 = D3DCLIP_GEN2;
D3DSTATUS_CLIPUNIONGEN3 = D3DCLIP_GEN3;
D3DSTATUS_CLIPUNIONGEN4 = D3DCLIP_GEN4;
D3DSTATUS_CLIPUNIONGEN5 = D3DCLIP_GEN5;
 
D3DSTATUS_CLIPUNIONALL = (
D3DSTATUS_CLIPUNIONLEFT or
D3DSTATUS_CLIPUNIONRIGHT or
D3DSTATUS_CLIPUNIONTOP or
D3DSTATUS_CLIPUNIONBOTTOM or
D3DSTATUS_CLIPUNIONFRONT or
D3DSTATUS_CLIPUNIONBACK or
D3DSTATUS_CLIPUNIONGEN0 or
D3DSTATUS_CLIPUNIONGEN1 or
D3DSTATUS_CLIPUNIONGEN2 or
D3DSTATUS_CLIPUNIONGEN3 or
D3DSTATUS_CLIPUNIONGEN4 or
D3DSTATUS_CLIPUNIONGEN5);
D3DSTATUS_CLIPINTERSECTIONLEFT = $00001000;
D3DSTATUS_CLIPINTERSECTIONRIGHT = $00002000;
D3DSTATUS_CLIPINTERSECTIONTOP = $00004000;
D3DSTATUS_CLIPINTERSECTIONBOTTOM = $00008000;
D3DSTATUS_CLIPINTERSECTIONFRONT = $00010000;
D3DSTATUS_CLIPINTERSECTIONBACK = $00020000;
D3DSTATUS_CLIPINTERSECTIONGEN0 = $00040000;
D3DSTATUS_CLIPINTERSECTIONGEN1 = $00080000;
D3DSTATUS_CLIPINTERSECTIONGEN2 = $00100000;
D3DSTATUS_CLIPINTERSECTIONGEN3 = $00200000;
D3DSTATUS_CLIPINTERSECTIONGEN4 = $00400000;
D3DSTATUS_CLIPINTERSECTIONGEN5 = $00800000;
D3DSTATUS_ZNOTVISIBLE = $01000000;
 
D3DSTATUS_CLIPINTERSECTIONALL = (
D3DSTATUS_CLIPINTERSECTIONLEFT or
D3DSTATUS_CLIPINTERSECTIONRIGHT or
D3DSTATUS_CLIPINTERSECTIONTOP or
D3DSTATUS_CLIPINTERSECTIONBOTTOM or
D3DSTATUS_CLIPINTERSECTIONFRONT or
D3DSTATUS_CLIPINTERSECTIONBACK or
D3DSTATUS_CLIPINTERSECTIONGEN0 or
D3DSTATUS_CLIPINTERSECTIONGEN1 or
D3DSTATUS_CLIPINTERSECTIONGEN2 or
D3DSTATUS_CLIPINTERSECTIONGEN3 or
D3DSTATUS_CLIPINTERSECTIONGEN4 or
D3DSTATUS_CLIPINTERSECTIONGEN5);
D3DSTATUS_CLIPUNIONALL =
D3DSTATUS_CLIPUNIONLEFT or
D3DSTATUS_CLIPUNIONRIGHT or
D3DSTATUS_CLIPUNIONTOP or
D3DSTATUS_CLIPUNIONBOTTOM or
D3DSTATUS_CLIPUNIONFRONT or
D3DSTATUS_CLIPUNIONBACK or
D3DSTATUS_CLIPUNIONGEN0 or
D3DSTATUS_CLIPUNIONGEN1 or
D3DSTATUS_CLIPUNIONGEN2 or
D3DSTATUS_CLIPUNIONGEN3 or
D3DSTATUS_CLIPUNIONGEN4 or
D3DSTATUS_CLIPUNIONGEN5;
 
D3DSTATUS_CLIPINTERSECTIONALL =
D3DSTATUS_CLIPINTERSECTIONLEFT or
D3DSTATUS_CLIPINTERSECTIONRIGHT or
D3DSTATUS_CLIPINTERSECTIONTOP or
D3DSTATUS_CLIPINTERSECTIONBOTTOM or
D3DSTATUS_CLIPINTERSECTIONFRONT or
D3DSTATUS_CLIPINTERSECTIONBACK or
D3DSTATUS_CLIPINTERSECTIONGEN0 or
D3DSTATUS_CLIPINTERSECTIONGEN1 or
D3DSTATUS_CLIPINTERSECTIONGEN2 or
D3DSTATUS_CLIPINTERSECTIONGEN3 or
D3DSTATUS_CLIPINTERSECTIONGEN4 or
D3DSTATUS_CLIPINTERSECTIONGEN5;
 
D3DSTATUS_DEFAULT = (
D3DSTATUS_CLIPINTERSECTIONALL or
D3DSTATUS_ZNOTVISIBLE);
D3DSTATUS_CLIPINTERSECTIONALL or
D3DSTATUS_ZNOTVISIBLE );
 
(*
* Options for direct transform calls
*)
{ Options for direct transform calls }
 
D3DTRANSFORM_CLIPPED = $00000001;
D3DTRANSFORM_UNCLIPPED = $00000002;
 
type
{ TD3DTransformData structure }
 
PD3DTransformData = ^TD3DTransformData;
TD3DTransformData = packed record
TD3DTransformData = record
dwSize: DWORD;
lpIn: Pointer; (* Input vertices *)
dwInSize: DWORD; (* Stride of input vertices *)
lpOut: Pointer; (* Output vertices *)
dwOutSize: DWORD; (* Stride of output vertices *)
lpHOut: ^TD3DHVertex; (* Output homogeneous vertices *)
dwClip: DWORD; (* Clipping hint *)
lpIn: Pointer; // Input vertices
dwInSize: DWORD; // Stride of input vertices
lpOut: Pointer; // Output vertices
dwOutSize: DWORD; // Stride of output vertices
lpHOut: PD3DHVertex; // Output homogeneous vertices
dwClip: DWORD; // Clipping hint
dwClipIntersection: DWORD;
dwClipUnion: DWORD; (* Union of all clip flags *)
drExtent: TD3DRect; (* Extent of transformed vertices *)
dwClipUnion: DWORD; // Union of all clip flags
drExtent: TD3DRect; // Extent of transformed vertices
end;
 
(*
* Structure defining position and direction properties for lighting.
*)
D3DTRANSFORMDATA = TD3DTransformData;
LPD3DTRANSFORMDATA = PD3DTransformData;
 
{ TD3DLightingElement structure }
 
PD3DLightingElement = ^TD3DLightingElement;
TD3DLightingElement = packed record
dvPosition: TD3DVector; (* Lightable point in model space *)
dvNormal: TD3DVector; (* Normalised unit vector *)
TD3DLightingElement = record
dvPosition: TD3DVector; // Lightable point in model space
dvNormal: TD3DVector; // Normalised unit vector
end;
 
(*
* Structure defining material properties for lighting.
*)
D3DLIGHTINGELEMENT = TD3DLightingElement;
LPD3DLIGHTINGELEMENT = PD3DLightingElement;
 
{ TD3DMaterial structure }
 
PD3DMaterial = ^TD3DMaterial;
TD3DMaterial = packed record
TD3DMaterial = record
dwSize: DWORD;
case Integer of
0: (
diffuse: TD3DColorValue; (* Diffuse color RGBA *)
ambient: TD3DColorValue; (* Ambient color RGB *)
specular: TD3DColorValue; (* Specular 'shininess' *)
emissive: TD3DColorValue; (* Emissive color RGB *)
power: TD3DValue; (* Sharpness if specular highlight *)
hTexture: TD3DTextureHandle; (* Handle to texture map *)
diffuse: TD3DColorValue; // Diffuse color RGBA
ambient: TD3DColorValue; // Ambient color RGB
specular: TD3DColorValue; // Specular 'shininess'
emissive: TD3DColorValue; // Emissive color RGB
power: TD3DValue; // Sharpness if specular highlight
hTexture: TD3DTextureHandle; // Handle to texture map
dwRampSize: DWORD;
);
);
1: (
dcvDiffuse: TD3DColorValue;
dcvAmbient: TD3DColorValue;
6255,19 → 3003,24
dcvSpecular: TD3DColorValue;
dcvEmissive: TD3DColorValue;
dvPower: TD3DValue;
);
);
end;
 
D3DMATERIAL = TD3DMaterial;
LPD3DMATERIAL = PD3DMaterial;
 
{ TD3DMaterial7 structure }
 
PD3DMaterial7 = ^TD3DMaterial7;
TD3DMaterial7 = packed record
TD3DMaterial7 = record
case Integer of
0: (
diffuse: TD3DColorValue; (* Diffuse color RGBA *)
ambient: TD3DColorValue; (* Ambient color RGB *)
specular: TD3DColorValue; (* Specular 'shininess' *)
emissive: TD3DColorValue; (* Emissive color RGB *)
power: TD3DValue; (* Sharpness if specular highlight *)
);
diffuse: TD3DColorValue; // Diffuse color RGBA
ambient: TD3DColorValue; // Ambient color RGB
specular: TD3DColorValue; // Specular 'shininess'
emissive: TD3DColorValue; // Emissive color RGB
power: TD3DValue; // Sharpness if specular highlight
);
1: (
dcvDiffuse: TD3DColorValue;
dcvAmbient: TD3DColorValue;
6274,100 → 3027,120
dcvSpecular: TD3DColorValue;
dcvEmissive: TD3DColorValue;
dvPower: TD3DValue;
);
);
end;
 
PD3DLightType = ^TD3DLightType;
D3DMATERIAL7 = TD3DMaterial7;
LPD3DMATERIAL7 = PD3DMaterial7;
 
{ TD3DLightType }
 
TD3DLightType = (
D3DLIGHT_INVALID_0,
D3DLIGHT_POINT,
D3DLIGHT_SPOT,
D3DLIGHT_DIRECTIONAL,
// Note: The following light type (D3DLIGHT_PARALLELPOINT)
// is no longer supported from D3D for DX7 onwards.
D3DLIGHT_PARALLELPOINT,
D3DLIGHT_GLSPOT);
D3DLIGHT_PARALLELPOINT
{$IFNDEF SupportDirectX5},D3DLIGHT_GLSPOT{$ENDIF}
);
 
(*
* Structure defining a light source and its properties.
*)
D3DLIGHTTYPE = TD3DLightType;
 
{ TD3DLight structure }
 
PD3DLight = ^TD3DLight;
TD3DLight = packed record
TD3DLight = record
dwSize: DWORD;
dltType: TD3DLightType; (* Type of light source *)
dcvColor: TD3DColorValue; (* Color of light *)
dvPosition: TD3DVector; (* Position in world space *)
dvDirection: TD3DVector; (* Direction in world space *)
dvRange: TD3DValue; (* Cutoff range *)
dvFalloff: TD3DValue; (* Falloff *)
dvAttenuation0: TD3DValue; (* Constant attenuation *)
dvAttenuation1: TD3DValue; (* Linear attenuation *)
dvAttenuation2: TD3DValue; (* Quadratic attenuation *)
dvTheta: TD3DValue; (* Inner angle of spotlight cone *)
dvPhi: TD3DValue; (* Outer angle of spotlight cone *)
dltType: TD3DLightType; // Type of light source
dcvColor: TD3DColorValue; // Color of light
dvPosition: TD3DVector; // Position in world space
dvDirection: TD3DVector; // Direction in world space
dvRange: TD3DValue; // Cutoff range
dvFalloff: TD3DValue; // Falloff
dvAttenuation0: TD3DValue; // Constant attenuation
dvAttenuation1: TD3DValue; // Linear attenuation
dvAttenuation2: TD3DValue; // Quadratic attenuation
dvTheta: TD3DValue; // Inner angle of spotlight cone
dvPhi: TD3DValue; // Outer angle of spotlight cone
end;
 
D3DLIGHT = TD3DLight;
LPD3DLIGHT = PD3DLight;
 
{ TD3DLight7 structure }
 
PD3DLight7 = ^TD3DLight7;
TD3DLight7 = packed record
dltType: TD3DLightType; (* Type of light source *)
dcvDiffuse: TD3DColorValue; (* Diffuse color of light *)
dcvSpecular: TD3DColorValue;(* Specular color of light *)
dcvAmbient: TD3DColorValue; (* Ambient color of light *)
dvPosition: TD3DVector; (* Position in world space *)
dvDirection: TD3DVector; (* Direction in world space *)
dvRange: TD3DValue; (* Cutoff range *)
dvFalloff: TD3DValue; (* Falloff *)
dvAttenuation0: TD3DValue; (* Constant attenuation *)
dvAttenuation1: TD3DValue; (* Linear attenuation *)
dvAttenuation2: TD3DValue; (* Quadratic attenuation *)
dvTheta: TD3DValue; (* Inner angle of spotlight cone *)
dvPhi: TD3DValue; (* Outer angle of spotlight cone *)
TD3DLight7 = record
dltType: TD3DLightType; // Type of light source
dcvDiffuse: TD3DColorValue; // Diffuse color of light
dcvSpecular: TD3DColorValue;// Specular color of light
dcvAmbient: TD3DColorValue; // Ambient color of light
dvPosition: TD3DVector; // Position in world space
dvDirection: TD3DVector; // Direction in world space
dvRange: TD3DValue; // Cutoff range
dvFalloff: TD3DValue; // Falloff
dvAttenuation0: TD3DValue; // Constant attenuation
dvAttenuation1: TD3DValue; // Linear attenuation
dvAttenuation2: TD3DValue; // Quadratic attenuation
dvTheta: TD3DValue; // Inner angle of spotlight cone
dvPhi: TD3DValue; // Outer angle of spotlight cone
end;
 
(*
* Structure defining a light source and its properties.
*)
D3DLIGHT7 = TD3DLight7;
LPD3DLIGHT7 = PD3DLight7;
 
(* flags bits *)
{ Structure defining a light source and its properties. }
 
const
D3DLIGHT_ACTIVE = $00000001;
D3DLIGHT_NO_SPECULAR = $00000002;
D3DLIGHT_ALL = D3DLIGHT_ACTIVE or D3DLIGHT_ACTIVE;
{ flags bits }
 
(* maximum valid light range *)
D3DLIGHT_RANGE_MAX = 1.8439088915e+18; //sqrt(FLT_MAX);
D3DLIGHT_ACTIVE = $00000001;
D3DLIGHT_NO_SPECULAR = $00000002;
D3DLIGHT_ALL = D3DLIGHT_ACTIVE or D3DLIGHT_NO_SPECULAR;
 
{ maximum valid light range }
D3DLIGHT_RANGE_MAX: TD3DValue = 3.4 * 10e+38;
 
type
{ TD3DLight2 structure }
 
PD3DLight2 = ^TD3DLight2;
TD3DLight2 = packed record
TD3DLight2 = record
dwSize: DWORD;
dltType: TD3DLightType; (* Type of light source *)
dcvColor: TD3DColorValue; (* Color of light *)
dvPosition: TD3DVector; (* Position in world space *)
dvDirection: TD3DVector; (* Direction in world space *)
dvRange: TD3DValue; (* Cutoff range *)
dvFalloff: TD3DValue; (* Falloff *)
dvAttenuation0: TD3DValue; (* Constant attenuation *)
dvAttenuation1: TD3DValue; (* Linear attenuation *)
dvAttenuation2: TD3DValue; (* Quadratic attenuation *)
dvTheta: TD3DValue; (* Inner angle of spotlight cone *)
dvPhi: TD3DValue; (* Outer angle of spotlight cone *)
dltType: TD3DLightType; // Type of light source
dcvColor: TD3DColorValue; // Color of light
dvPosition: TD3DVector; // Position in world space
dvDirection: TD3DVector; // Direction in world space
dvRange: TD3DValue; // Cutoff range
dvFalloff: TD3DValue; // Falloff
dvAttenuation0: TD3DValue; // Constant attenuation
dvAttenuation1: TD3DValue; // Linear attenuation
dvAttenuation2: TD3DValue; // Quadratic attenuation
dvTheta: TD3DValue; // Inner angle of spotlight cone
dvPhi: TD3DValue; // Outer angle of spotlight cone
dwFlags: DWORD;
end;
 
D3DLIGHT2 = TD3DLight2;
LPD3DLIGHT2 = PD3DLight2;
 
{ TD3DLightData structure }
 
PD3DLightData = ^TD3DLightData;
TD3DLightData = packed record
TD3DLightData = record
dwSize: DWORD;
lpIn: ^TD3DLightingElement; (* Input positions and normals *)
dwInSize: DWORD; (* Stride of input elements *)
lpOut: ^TD3DTLVertex; (* Output colors *)
dwOutSize: DWORD; (* Stride of output colors *)
lpIn: PD3DLightingElement; // Input positions and normals
dwInSize: DWORD; // Stride of input elements
lpOut: PD3DTLVertex; // Output colors
dwOutSize: DWORD; // Stride of output colors
end;
 
D3DLIGHTDATA = TD3DLightData;
LPD3DLIGHTDATA = PD3DLightData;
 
(*
* Before DX5, these values were in an enum called
* TD3DColorModel. This was not correct, since they are
* D3DCOLORMODEL. This was not correct, since they are
* bit flags. A driver can surface either or both flags
* in the dcmColorModel member of D3DDEVICEDESC.
*)
6374,32 → 3147,23
 
type
TD3DColorModel = DWORD;
D3DCOLORMODEL = TD3DColorModel;
 
const
D3DCOLOR_INVALID_0 = 0;
D3DCOLOR_MONO = 1;
D3DCOLOR_RGB = 2;
D3DCOLOR_RGB = 2;
 
(*
* Options for clearing
*)
{ Options for clearing }
 
const
D3DCLEAR_TARGET = $00000001; (* Clear target surface *)
D3DCLEAR_ZBUFFER = $00000002; (* Clear target z buffer *)
D3DCLEAR_STENCIL = $00000004; (* Clear stencil planes *)
D3DCLEAR_TARGET = $00000001; // Clear target surface
D3DCLEAR_ZBUFFER = $00000002; // Clear target z buffer
D3DCLEAR_STENCIL = $00000004; // Clear stencil planes
 
(*
* Execute buffers are allocated via Direct3D. These buffers may then
* be filled by the application with instructions to execute along with
* vertex data.
*)
{ Supported op codes for execute instructions. }
 
(*
* Supported op codes for execute instructions.
*)
 
type
PD3DOpcode = ^TD3DOpcode;
TD3DOpcode = (
D3DOP_INVALID_0,
D3DOP_POINT,
6415,63 → 3179,71
D3DOP_EXIT,
D3DOP_BRANCHFORWARD,
D3DOP_SPAN,
D3DOP_SETSTATUS);
D3DOP_SETSTATUS
);
 
PD3DInstruction = ^TD3DInstruction;
TD3DInstruction = packed record
bOpcode: BYTE; (* Instruction opcode *)
bSize: BYTE; (* Size of each instruction data unit *)
wCount: WORD; (* Count of instruction data units to follow *)
D3DOPCODE = TD3DOpcode;
 
{ TD3DInstruction structure }
 
TD3DInstruction = record
bOpcode: Byte; // Instruction opcode
bSize: Byte; // Size of each instruction data unit
wCount: WORD; // Count of instruction data units to follow
end;
D3DINSTRUCTION = TD3DInstruction;
 
(*
* Structure for texture loads
*)
{ TD3DTextureLoad structure }
 
PD3DTextureLoad = ^TD3DTextureLoad;
TD3DTextureLoad = packed record
TD3DTextureLoad = record
hDestTexture: TD3DTextureHandle;
hSrcTexture: TD3DTextureHandle;
end;
D3DTEXTURELOAD = TD3DTextureLoad;
 
(*
* Structure for picking
*)
{ TD3DPickRecord structure }
 
PD3DPickRecord = ^TD3DPickRecord;
TD3DPickRecord = packed record
TD3DPickRecord = record
bOpcode: BYTE;
bPad: BYTE;
dwOffset: DWORD;
dvZ: TD3DValue;
end;
D3DPICKRECORD = TD3DPickRecord;
 
(*
* The following defines the rendering states which can be set in the
* execute buffer.
*)
{ TD3DShadeMode }
 
PD3DShadeMode = ^TD3DShadeMode;
TD3DShadeMode = (
D3DSHADE_INVALID_0,
D3DSHADE_FLAT,
D3DSHADE_GOURAUD,
D3DSHADE_PHONG);
D3DSHADE_PHONG
);
 
PD3DFillMode = ^TD3DFillMode;
D3DSHADEMODE = TD3DShadeMode;
 
{ TD3DFillMode }
 
TD3DFillMode = (
D3DFILL_INVALID_0,
D3DFILL_POINT,
D3DFILL_WIREFRAME,
D3DFILL_SOLID);
D3DFILL_SOLID
);
 
PD3DLinePattern = ^TD3DLinePattern;
TD3DLinePattern = packed record
D3DFILLMODE = TD3DFillMode;
 
{ TD3DLinePattern structure }
 
TD3DLinePattern = record
wRepeatFactor: WORD;
wLinePattern: WORD;
end;
 
PD3DTextureFilter = ^TD3DTextureFilter;
D3DLINEPATTERN = TD3DLinePattern;
 
{ TD3DTextureFilter }
 
TD3DTextureFilter = (
D3DFILTER_INVALID_0,
D3DFILTER_NEAREST,
6479,9 → 3251,13
D3DFILTER_MIPNEAREST,
D3DFILTER_MIPLINEAR,
D3DFILTER_LINEARMIPNEAREST,
D3DFILTER_LINEARMIPLINEAR);
D3DFILTER_LINEARMIPLINEAR
);
 
PD3DBlend = ^TD3DBlend;
D3DTEXTUREFILTER = TD3DTextureFilter;
 
{ TD3DBlend }
 
TD3DBlend = (
D3DBLEND_INVALID_0,
D3DBLEND_ZERO,
6496,9 → 3272,13
D3DBLEND_INVDESTCOLOR,
D3DBLEND_SRCALPHASAT,
D3DBLEND_BOTHSRCALPHA,
D3DBLEND_BOTHINVSRCALPHA);
D3DBLEND_BOTHINVSRCALPHA
);
 
PD3DTextureBlend = ^TD3DTextureBlend;
D3DBLEND = TD3DBlend;
 
{ TD3DTextureBlend }
 
TD3DTextureBlend = (
D3DTBLEND_INVALID_0,
D3DTBLEND_DECAL,
6508,24 → 3288,36
D3DTBLEND_DECALMASK,
D3DTBLEND_MODULATEMASK,
D3DTBLEND_COPY,
D3DTBLEND_ADD);
D3DTBLEND_ADD
);
 
PD3DTextureAddress = ^TD3DTextureAddress;
D3DTEXTUREBLEND = TD3DTextureBlend;
 
{ TD3DTextureAddress }
 
TD3DTextureAddress = (
D3DTADDRESS_INVALID_0,
D3DTADDRESS_WRAP,
D3DTADDRESS_MIRROR,
D3DTADDRESS_CLAMP,
D3DTADDRESS_BORDER);
D3DTADDRESS_BORDER
);
 
PD3DCull = ^TD3DCull;
D3DTEXTUREADDRESS = TD3DTextureAddress;
 
{ TD3DCull }
 
TD3DCull = (
D3DCULL_INVALID_0,
D3DCULL_NONE,
D3DCULL_CW,
D3DCULL_CCW);
D3DCULL_CCW
);
 
PD3DCmpFunc = ^TD3DCmpFunc;
D3DCULL = TD3DCull;
 
{ TD3DCmpFunc }
 
TD3DCmpFunc = (
D3DCMP_INVALID_0,
D3DCMP_NEVER,
6535,9 → 3327,13
D3DCMP_GREATER,
D3DCMP_NOTEQUAL,
D3DCMP_GREATEREQUAL,
D3DCMP_ALWAYS);
D3DCMP_ALWAYS
);
 
PD3DStencilOp = ^TD3DStencilOp;
D3DCMPFUNC = TD3DCmpFunc;
 
{ TD3DStencilOp }
 
TD3DStencilOp = (
D3DSTENCILOP_INVALID_0,
D3DSTENCILOP_KEEP,
6547,37 → 3343,55
D3DSTENCILOP_DECRSAT,
D3DSTENCILOP_INVERT,
D3DSTENCILOP_INCR,
D3DSTENCILOP_DECR);
PD3DFogMode = ^TD3DFogMode;
D3DSTENCILOP_DECR
);
 
D3DSTENCILOP = TD3DStencilOp;
 
{ TD3DFogMode }
 
TD3DFogMode = (
D3DFOG_NONE,
D3DFOG_EXP,
D3DFOG_EXP2,
D3DFOG_LINEAR);
D3DFOG_LINEAR
);
 
PD3DZBufferType = ^TD3DZBufferType;
D3DFOGMODE = TD3DFogMode;
 
{ TD3DZBufferType }
 
TD3DZBufferType = (
D3DZB_FALSE,
D3DZB_TRUE, // Z buffering
D3DZB_USEW); // W buffering
D3DZB_TRUE, // Z buffering
D3DZB_USEW // W buffering
);
 
PD3DAntialiasMode = ^TD3DAntialiasMode;
D3DZBUFFERTYPE = TD3DZBufferType;
 
{ TD3DAntialiasMode }
 
TD3DAntialiasMode = (
D3DANTIALIAS_NONE,
D3DANTIALIAS_SORTDEPENDENT,
D3DANTIALIAS_SORTINDEPENDENT);
D3DANTIALIAS_SORTINDEPENDENT
);
 
// Vertex types supported by Direct3D
PD3DVertexType = ^TD3DVertexType;
D3DANTIALIASMODE = TD3DAntialiasMode;
 
{ TD3DVertexType }
 
TD3DVertexType = (
D3DVT_INVALID_0,
D3DVT_VERTEX,
D3DVT_LVERTEX,
D3DVT_TLVERTEX);
D3DVT_TLVERTEX
);
 
// Primitives supported by draw-primitive API
PD3DPrimitiveType = ^TD3DPrimitiveType;
D3DVERTEXTYPE = TD3DVertexType;
 
{ TD3DPrimitiveType }
 
TD3DPrimitiveType = (
D3DPT_INVALID_0,
D3DPT_POINTLIST,
6585,42 → 3399,55
D3DPT_LINESTRIP,
D3DPT_TRIANGLELIST,
D3DPT_TRIANGLESTRIP,
D3DPT_TRIANGLEFAN);
D3DPT_TRIANGLEFAN
);
 
(*
* Amount to add to a state to generate the override for that state.
*)
D3DPRIMITIVETYPE = TD3DPrimitiveType;
 
{ Amount to add to a state to generate the override for that state. }
 
const
D3DSTATE_OVERRIDE_BIAS = 256;
D3DSTATE_OVERRIDE_BIAS = 256;
 
(*
* A state which sets the override flag for the specified state type.
*)
function D3DSTATE_OVERRIDE(typ: DWORD): DWORD;
 
function D3DSTATE_OVERRIDE(StateType: DWORD) : DWORD;
{ A state which sets the override flag for the specified state type. }
 
type
PD3DTransformStateType = ^TD3DTransformStateType;
TD3DTransformStateType = DWORD;
const
D3DTRANSFORMSTATE_WORLD = 1;
D3DTRANSFORMSTATE_VIEW = 2;
D3DTRANSFORMSTATE_PROJECTION = 3;
D3DTRANSFORMSTATE_WORLD1 = 4; // 2nd matrix to blend
D3DTRANSFORMSTATE_WORLD2 = 5; // 3rd matrix to blend
D3DTRANSFORMSTATE_WORLD3 = 6; // 4th matrix to blend
D3DTRANSFORMSTATE_TEXTURE0 = 16;
D3DTRANSFORMSTATE_TEXTURE1 = 17;
D3DTRANSFORMSTATE_TEXTURE2 = 18;
D3DTRANSFORMSTATE_TEXTURE3 = 19;
D3DTRANSFORMSTATE_TEXTURE4 = 20;
D3DTRANSFORMSTATE_TEXTURE5 = 21;
D3DTRANSFORMSTATE_TEXTURE6 = 22;
D3DTRANSFORMSTATE_TEXTURE7 = 23;
{ TD3DTransformStateType }
 
type
PD3DLightStateType = ^TD3DLightStateType;
TD3DTransformStateType = (
D3DTRANSFORMSTATE_INVALID_0,
D3DTRANSFORMSTATE_WORLD,
D3DTRANSFORMSTATE_VIEW,
D3DTRANSFORMSTATE_PROJECTION,
 
D3DTRANSFORMSTATE_WORLD1,
D3DTRANSFORMSTATE_WORLD2,
D3DTRANSFORMSTATE_WORLD3,
D3DTRANSFORMSTATE_INVALID_7,
D3DTRANSFORMSTATE_INVALID_8,
D3DTRANSFORMSTATE_INVALID_9,
D3DTRANSFORMSTATE_INVALID_10,
D3DTRANSFORMSTATE_INVALID_11,
D3DTRANSFORMSTATE_INVALID_12,
D3DTRANSFORMSTATE_INVALID_13,
D3DTRANSFORMSTATE_INVALID_14,
D3DTRANSFORMSTATE_INVALID_15,
D3DTRANSFORMSTATE_TEXTURE0,
D3DTRANSFORMSTATE_TEXTURE1,
D3DTRANSFORMSTATE_TEXTURE2,
D3DTRANSFORMSTATE_TEXTURE3,
D3DTRANSFORMSTATE_TEXTURE4,
D3DTRANSFORMSTATE_TEXTURE5,
D3DTRANSFORMSTATE_TEXTURE6,
D3DTRANSFORMSTATE_TEXTURE7
);
 
D3DTRANSFORMSTATETYPE = TD3DTransformStateType;
 
{ TD3DLightStateType }
 
TD3DLightStateType = (
D3DLIGHTSTATE_INVALID_0,
D3DLIGHTSTATE_MATERIAL,
6630,224 → 3457,255
D3DLIGHTSTATE_FOGSTART,
D3DLIGHTSTATE_FOGEND,
D3DLIGHTSTATE_FOGDENSITY,
D3DLIGHTSTATE_COLORVERTEX);
D3DLIGHTSTATE_COLORVERTEX
);
 
PD3DRenderStateType = ^TD3DRenderStateType;
TD3DRenderStateType = DWORD;
const
D3DRENDERSTATE_ANTIALIAS = 2; (* D3DANTIALIASMODE *)
D3DRENDERSTATE_TEXTUREPERSPECTIVE = 4; (* TRUE for perspective correction *)
D3DRENDERSTATE_ZENABLE = 7; (* D3DZBUFFERTYPE (or TRUE/FALSE for legacy) *)
D3DRENDERSTATE_FILLMODE = 8; (* D3DFILL_MODE *)
D3DRENDERSTATE_SHADEMODE = 9; (* D3DSHADEMODE *)
D3DRENDERSTATE_LINEPATTERN = 10; (* D3DLINEPATTERN *)
D3DRENDERSTATE_ZWRITEENABLE = 14; (* TRUE to enable z writes *)
D3DRENDERSTATE_ALPHATESTENABLE = 15; (* TRUE to enable alpha tests *)
D3DRENDERSTATE_LASTPIXEL = 16; (* TRUE for last-pixel on lines *)
D3DRENDERSTATE_SRCBLEND = 19; (* D3DBLEND *)
D3DRENDERSTATE_DESTBLEND = 20; (* D3DBLEND *)
D3DRENDERSTATE_CULLMODE = 22; (* D3DCULL *)
D3DRENDERSTATE_ZFUNC = 23; (* D3DCMPFUNC *)
D3DRENDERSTATE_ALPHAREF = 24; (* D3DFIXED *)
D3DRENDERSTATE_ALPHAFUNC = 25; (* D3DCMPFUNC *)
D3DRENDERSTATE_DITHERENABLE = 26; (* TRUE to enable dithering *)
D3DRENDERSTATE_ALPHABLENDENABLE = 27; (* TRUE to enable alpha blending *)
D3DRENDERSTATE_FOGENABLE = 28; (* TRUE to enable fog blending *)
D3DRENDERSTATE_SPECULARENABLE = 29; (* TRUE to enable specular *)
D3DRENDERSTATE_ZVISIBLE = 30; (* TRUE to enable z checking *)
D3DRENDERSTATE_STIPPLEDALPHA = 33; (* TRUE to enable stippled alpha (RGB device only) *)
D3DRENDERSTATE_FOGCOLOR = 34; (* D3DCOLOR *)
D3DRENDERSTATE_FOGTABLEMODE = 35; (* D3DFOGMODE *)
D3DRENDERSTATE_FOGSTART = 36; (* Fog start (for both vertex and pixel fog) *)
D3DRENDERSTATE_FOGEND = 37; (* Fog end *)
D3DRENDERSTATE_FOGDENSITY = 38; (* Fog density *)
D3DRENDERSTATE_EDGEANTIALIAS = 40; (* TRUE to enable edge antialiasing *)
D3DRENDERSTATE_COLORKEYENABLE = 41; (* TRUE to enable source colorkeyed textures *)
D3DRENDERSTATE_ZBIAS = 47; (* LONG Z bias *)
D3DRENDERSTATE_RANGEFOGENABLE = 48; (* Enables range-based fog *)
D3DLIGHTSTATETYPE = TD3DLightStateType;
 
D3DRENDERSTATE_STENCILENABLE = 52; (* BOOL enable/disable stenciling *)
D3DRENDERSTATE_STENCILFAIL = 53; (* D3DSTENCILOP to do if stencil test fails *)
D3DRENDERSTATE_STENCILZFAIL = 54; (* D3DSTENCILOP to do if stencil test passes and Z test fails *)
D3DRENDERSTATE_STENCILPASS = 55; (* D3DSTENCILOP to do if both stencil and Z tests pass *)
D3DRENDERSTATE_STENCILFUNC = 56; (* D3DCMPFUNC fn. Stencil Test passes if ((ref & mask) stencilfn (stencil & mask)) is true *)
D3DRENDERSTATE_STENCILREF = 57; (* Reference value used in stencil test *)
D3DRENDERSTATE_STENCILMASK = 58; (* Mask value used in stencil test *)
D3DRENDERSTATE_STENCILWRITEMASK = 59; (* Write mask applied to values written to stencil buffer *)
D3DRENDERSTATE_TEXTUREFACTOR = 60; (* D3DCOLOR used for multi-texture blend *)
{ TD3DRenderStateType }
 
(*
* 128 values [128; 255] are reserved for texture coordinate wrap flags.
* These are constructed with the D3DWRAP_U and D3DWRAP_V macros. Using
* a flags word preserves forward compatibility with texture coordinates
* that are >2D.
*)
D3DRENDERSTATE_WRAP0 = 128; (* wrap for 1st texture coord. set *)
D3DRENDERSTATE_WRAP1 = 129; (* wrap for 2nd texture coord. set *)
D3DRENDERSTATE_WRAP2 = 130; (* wrap for 3rd texture coord. set *)
D3DRENDERSTATE_WRAP3 = 131; (* wrap for 4th texture coord. set *)
D3DRENDERSTATE_WRAP4 = 132; (* wrap for 5th texture coord. set *)
D3DRENDERSTATE_WRAP5 = 133; (* wrap for 6th texture coord. set *)
D3DRENDERSTATE_WRAP6 = 134; (* wrap for 7th texture coord. set *)
D3DRENDERSTATE_WRAP7 = 135; (* wrap for 8th texture coord. set *)
D3DRENDERSTATE_CLIPPING = 136;
D3DRENDERSTATE_LIGHTING = 137;
D3DRENDERSTATE_EXTENTS = 138;
D3DRENDERSTATE_AMBIENT = 139;
D3DRENDERSTATE_FOGVERTEXMODE = 140;
D3DRENDERSTATE_COLORVERTEX = 141;
D3DRENDERSTATE_LOCALVIEWER = 142;
D3DRENDERSTATE_NORMALIZENORMALS = 143;
D3DRENDERSTATE_COLORKEYBLENDENABLE = 144;
D3DRENDERSTATE_DIFFUSEMATERIALSOURCE = 145;
D3DRENDERSTATE_SPECULARMATERIALSOURCE = 146;
D3DRENDERSTATE_AMBIENTMATERIALSOURCE = 147;
D3DRENDERSTATE_EMISSIVEMATERIALSOURCE = 148;
D3DRENDERSTATE_VERTEXBLEND = 151;
D3DRENDERSTATE_CLIPPLANEENABLE = 152;
TD3DRenderStateType = (
D3DRENDERSTATE_INVALID_0,
D3DRENDERSTATE_TEXTUREHANDLE, // Texture handle for legacy interfaces (Texture,Texture2)
D3DRENDERSTATE_ANTIALIAS, // TD3DAntialiasMode
D3DRENDERSTATE_TEXTUREADDRESS, // TD3DTextureAddress
D3DRENDERSTATE_TEXTUREPERSPECTIVE, // TRUE for perspective correction
D3DRENDERSTATE_WRAPU, // TRUE for wrapping in u
D3DRENDERSTATE_WRAPV, // TRUE for wrapping in v
D3DRENDERSTATE_ZENABLE, // TD3DZBufferType (or TRUE/FALSE for legacy)
D3DRENDERSTATE_FILLMODE, // TD3DFillMode
D3DRENDERSTATE_SHADEMODE, // TD3DShadeMode
D3DRENDERSTATE_LINEPATTERN, // TD3DLinePattern
D3DRENDERSTATE_MONOENABLE, // TRUE to enable mono rasterization
D3DRENDERSTATE_ROP2, // ROP2
D3DRENDERSTATE_PLANEMASK, // DWORD physical plane mask
D3DRENDERSTATE_ZWRITEENABLE, // TRUE to enable z writes
D3DRENDERSTATE_ALPHATESTENABLE, // TRUE to enable alpha tests
D3DRENDERSTATE_LASTPIXEL, // TRUE for last-pixel on lines
D3DRENDERSTATE_TEXTUREMAG, // TD3DTextureFilter
D3DRENDERSTATE_TEXTUREMIN, // TD3DTextureFilter
D3DRENDERSTATE_SRCBLEND, // TD3DBlend
D3DRENDERSTATE_DESTBLEND, // TD3DBlend
D3DRENDERSTATE_TEXTUREMAPBLEND, // TD3DTextureBlend
D3DRENDERSTATE_CULLMODE, // TD3DCull
D3DRENDERSTATE_ZFUNC, // TD3DCmpFunc
D3DRENDERSTATE_ALPHAREF, // TD3DFixed
D3DRENDERSTATE_ALPHAFUNC, // TD3DCmpFunc
D3DRENDERSTATE_DITHERENABLE, // TRUE to enable dithering
D3DRENDERSTATE_ALPHABLENDENABLE, // TRUE to enable alpha blending
D3DRENDERSTATE_FOGENABLE, // TRUE to enable fog
D3DRENDERSTATE_SPECULARENABLE, // TRUE to enable specular
D3DRENDERSTATE_ZVISIBLE, // TRUE to enable z checking
D3DRENDERSTATE_SUBPIXEL, // TRUE to enable subpixel correction
D3DRENDERSTATE_SUBPIXELX, // TRUE to enable correction in X only
D3DRENDERSTATE_STIPPLEDALPHA, // TRUE to enable stippled alpha
D3DRENDERSTATE_FOGCOLOR, // TD3DColor
D3DRENDERSTATE_FOGTABLEMODE, // TD3DFogMode
D3DRENDERSTATE_FOGSTART, // Fog start (for both vertex and pixel fog)
D3DRENDERSTATE_FOGEND, // Fog end
D3DRENDERSTATE_FOGDENSITY, // Fog density
D3DRENDERSTATE_STIPPLEENABLE, // TRUE to enable stippling
D3DRENDERSTATE_EDGEANTIALIAS, // TRUE to enable edge antialiasing
D3DRENDERSTATE_COLORKEYENABLE, // TRUE to enable source colorkeyed textures
D3DRENDERSTATE_BORDERCOLOR, // Border color for texturing w/border
D3DRENDERSTATE_TEXTUREADDRESSU, // Texture addressing mode for U coordinate
D3DRENDERSTATE_TEXTUREADDRESSV, // Texture addressing mode for V coordinate
D3DRENDERSTATE_MIPMAPLODBIAS, // TD3DValue Mipmap LOD bias
D3DRENDERSTATE_ZBIAS, // LONG Z bias
D3DRENDERSTATE_RANGEFOGENABLE, // Enables range-based fog
D3DRENDERSTATE_ANISOTROPY, // Max. anisotropy. 1 = no anisotropy
D3DRENDERSTATE_FLUSHBATCH, // Explicit flush for DP batching (DX5 Only)
D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT,// BOOL enable sort-independent transparency
D3DRENDERSTATE_STENCILENABLE, // BOOL enable/disable stenciling
D3DRENDERSTATE_STENCILFAIL, // TD3DStencilOp to do if stencil test fails
D3DRENDERSTATE_STENCILZFAIL, // TD3DStencilOp to do if stencil test passes and Z test fails
D3DRENDERSTATE_STENCILPASS, // TD3DStencilOp to do if both stencil and Z tests pass
D3DRENDERSTATE_STENCILFUNC , // TD3DCmpFunc fn. Stencil Test passes if ((ref & mask) stencilfn (stencil & mask)) is true
D3DRENDERSTATE_STENCILREF, // Reference value used in stencil test
D3DRENDERSTATE_STENCILMASK, // Mask value used in stencil test
D3DRENDERSTATE_STENCILWRITEMASK, // Write mask applied to values written to stencil buffer
D3DRENDERSTATE_TEXTUREFACTOR, // TD3DColor used for multi-texture blend
D3DRENDERSTATE_INVALID_61,
D3DRENDERSTATE_INVALID_62,
D3DRENDERSTATE_INVALID_63,
D3DRENDERSTATE_STIPPLEPATTERN00, // Stipple pattern 01...
D3DRENDERSTATE_STIPPLEPATTERN01,
D3DRENDERSTATE_STIPPLEPATTERN02,
D3DRENDERSTATE_STIPPLEPATTERN03,
D3DRENDERSTATE_STIPPLEPATTERN04,
D3DRENDERSTATE_STIPPLEPATTERN05,
D3DRENDERSTATE_STIPPLEPATTERN06,
D3DRENDERSTATE_STIPPLEPATTERN07,
D3DRENDERSTATE_STIPPLEPATTERN08,
D3DRENDERSTATE_STIPPLEPATTERN09,
D3DRENDERSTATE_STIPPLEPATTERN10,
D3DRENDERSTATE_STIPPLEPATTERN11,
D3DRENDERSTATE_STIPPLEPATTERN12,
D3DRENDERSTATE_STIPPLEPATTERN13,
D3DRENDERSTATE_STIPPLEPATTERN14,
D3DRENDERSTATE_STIPPLEPATTERN15,
D3DRENDERSTATE_STIPPLEPATTERN16,
D3DRENDERSTATE_STIPPLEPATTERN17,
D3DRENDERSTATE_STIPPLEPATTERN18,
D3DRENDERSTATE_STIPPLEPATTERN19,
D3DRENDERSTATE_STIPPLEPATTERN20,
D3DRENDERSTATE_STIPPLEPATTERN21,
D3DRENDERSTATE_STIPPLEPATTERN22,
D3DRENDERSTATE_STIPPLEPATTERN23,
D3DRENDERSTATE_STIPPLEPATTERN24,
D3DRENDERSTATE_STIPPLEPATTERN25,
D3DRENDERSTATE_STIPPLEPATTERN26,
D3DRENDERSTATE_STIPPLEPATTERN27,
D3DRENDERSTATE_STIPPLEPATTERN28,
D3DRENDERSTATE_STIPPLEPATTERN29,
D3DRENDERSTATE_STIPPLEPATTERN30,
D3DRENDERSTATE_STIPPLEPATTERN31,
D3DRENDERSTATE_INVALID_95,
D3DRENDERSTATE_INVALID_96,
D3DRENDERSTATE_INVALID_97,
D3DRENDERSTATE_INVALID_98,
D3DRENDERSTATE_INVALID_99,
D3DRENDERSTATE_INVALID_100,
D3DRENDERSTATE_INVALID_101,
D3DRENDERSTATE_INVALID_102,
D3DRENDERSTATE_INVALID_103,
D3DRENDERSTATE_INVALID_104,
D3DRENDERSTATE_INVALID_105,
D3DRENDERSTATE_INVALID_106,
D3DRENDERSTATE_INVALID_107,
D3DRENDERSTATE_INVALID_108,
D3DRENDERSTATE_INVALID_109,
D3DRENDERSTATE_INVALID_110,
D3DRENDERSTATE_INVALID_111,
D3DRENDERSTATE_INVALID_112,
D3DRENDERSTATE_INVALID_113,
D3DRENDERSTATE_INVALID_114,
D3DRENDERSTATE_INVALID_115,
D3DRENDERSTATE_INVALID_116,
D3DRENDERSTATE_INVALID_117,
D3DRENDERSTATE_INVALID_118,
D3DRENDERSTATE_INVALID_119,
D3DRENDERSTATE_INVALID_120,
D3DRENDERSTATE_INVALID_121,
D3DRENDERSTATE_INVALID_122,
D3DRENDERSTATE_INVALID_123,
D3DRENDERSTATE_INVALID_124,
D3DRENDERSTATE_INVALID_125,
D3DRENDERSTATE_INVALID_126,
D3DRENDERSTATE_INVALID_127,
//
// 128 values [128, 255] are reserved for texture coordinate wrap flags.
// These are constructed with the D3DWRAP_U and D3DWRAP_V macros. Using
// a flags word preserves forward compatibility with texture coordinates
// that are >2D.
//
D3DRENDERSTATE_WRAP0, // wrap for 1st texture coord. set
D3DRENDERSTATE_WRAP1, // wrap for 2nd texture coord. set
D3DRENDERSTATE_WRAP2, // wrap for 3rd texture coord. set
D3DRENDERSTATE_WRAP3, // wrap for 4th texture coord. set
D3DRENDERSTATE_WRAP4, // wrap for 5th texture coord. set
D3DRENDERSTATE_WRAP5, // wrap for 6th texture coord. set
D3DRENDERSTATE_WRAP6, // wrap for 7th texture coord. set
D3DRENDERSTATE_WRAP7, // wrap for 8th texture coord. set
D3DRENDERSTATE_CLIPPING,
D3DRENDERSTATE_LIGHTING,
D3DRENDERSTATE_EXTENTS,
D3DRENDERSTATE_AMBIENT,
D3DRENDERSTATE_FOGVERTEXMODE,
D3DRENDERSTATE_COLORVERTEX,
D3DRENDERSTATE_LOCALVIEWER,
D3DRENDERSTATE_NORMALIZENORMALS,
D3DRENDERSTATE_COLORKEYBLENDENABLE,
D3DRENDERSTATE_DIFFUSEMATERIALSOURCE,
D3DRENDERSTATE_SPECULARMATERIALSOURCE,
D3DRENDERSTATE_AMBIENTMATERIALSOURCE,
D3DRENDERSTATE_EMISSIVEMATERIALSOURCE,
D3DRENDERSTATE_INVALID_149,
D3DRENDERSTATE_INVALID_150,
D3DRENDERSTATE_VERTEXBLEND,
D3DRENDERSTATE_CLIPPLANEENABLE
);
 
//
// retired renderstates - not supported for DX7 interfaces
//
D3DRENDERSTATE_TEXTUREHANDLE = 1; (* Texture handle for legacy interfaces (Texture;Texture2) *)
D3DRENDERSTATE_TEXTUREADDRESS = 3; (* D3DTEXTUREADDRESS *)
D3DRENDERSTATE_WRAPU = 5; (* TRUE for wrapping in u *)
D3DRENDERSTATE_WRAPV = 6; (* TRUE for wrapping in v *)
D3DRENDERSTATE_MONOENABLE = 11; (* TRUE to enable mono rasterization *)
D3DRENDERSTATE_ROP2 = 12; (* ROP2 *)
D3DRENDERSTATE_PLANEMASK = 13; (* DWORD physical plane mask *)
D3DRENDERSTATE_TEXTUREMAG = 17; (* D3DTEXTUREFILTER *)
D3DRENDERSTATE_TEXTUREMIN = 18; (* D3DTEXTUREFILTER *)
D3DRENDERSTATE_TEXTUREMAPBLEND = 21; (* D3DTEXTUREBLEND *)
D3DRENDERSTATE_SUBPIXEL = 31; (* TRUE to enable subpixel correction *)
D3DRENDERSTATE_SUBPIXELX = 32; (* TRUE to enable correction in X only *)
D3DRENDERSTATE_STIPPLEENABLE = 39; (* TRUE to enable stippling *)
D3DRENDERSTATE_BORDERCOLOR = 43; (* Border color for texturing w/border *)
D3DRENDERSTATE_TEXTUREADDRESSU = 44; (* Texture addressing mode for U coordinate *)
D3DRENDERSTATE_TEXTUREADDRESSV = 45; (* Texture addressing mode for V coordinate *)
D3DRENDERSTATE_MIPMAPLODBIAS = 46; (* D3DVALUE Mipmap LOD bias *)
D3DRENDERSTATE_ANISOTROPY = 49; (* Max. anisotropy. 1 = no anisotropy *)
D3DRENDERSTATE_FLUSHBATCH = 50; (* Explicit flush for DP batching (DX5 Only) *)
D3DRENDERSTATE_TRANSLUCENTSORTINDEPENDENT=51; (* BOOL enable sort-independent transparency *)
D3DRENDERSTATE_STIPPLEPATTERN00 = 64; (* Stipple pattern 01... *)
D3DRENDERSTATE_STIPPLEPATTERN01 = 65;
D3DRENDERSTATE_STIPPLEPATTERN02 = 66;
D3DRENDERSTATE_STIPPLEPATTERN03 = 67;
D3DRENDERSTATE_STIPPLEPATTERN04 = 68;
D3DRENDERSTATE_STIPPLEPATTERN05 = 69;
D3DRENDERSTATE_STIPPLEPATTERN06 = 70;
D3DRENDERSTATE_STIPPLEPATTERN07 = 71;
D3DRENDERSTATE_STIPPLEPATTERN08 = 72;
D3DRENDERSTATE_STIPPLEPATTERN09 = 73;
D3DRENDERSTATE_STIPPLEPATTERN10 = 74;
D3DRENDERSTATE_STIPPLEPATTERN11 = 75;
D3DRENDERSTATE_STIPPLEPATTERN12 = 76;
D3DRENDERSTATE_STIPPLEPATTERN13 = 77;
D3DRENDERSTATE_STIPPLEPATTERN14 = 78;
D3DRENDERSTATE_STIPPLEPATTERN15 = 79;
D3DRENDERSTATE_STIPPLEPATTERN16 = 80;
D3DRENDERSTATE_STIPPLEPATTERN17 = 81;
D3DRENDERSTATE_STIPPLEPATTERN18 = 82;
D3DRENDERSTATE_STIPPLEPATTERN19 = 83;
D3DRENDERSTATE_STIPPLEPATTERN20 = 84;
D3DRENDERSTATE_STIPPLEPATTERN21 = 85;
D3DRENDERSTATE_STIPPLEPATTERN22 = 86;
D3DRENDERSTATE_STIPPLEPATTERN23 = 87;
D3DRENDERSTATE_STIPPLEPATTERN24 = 88;
D3DRENDERSTATE_STIPPLEPATTERN25 = 89;
D3DRENDERSTATE_STIPPLEPATTERN26 = 90;
D3DRENDERSTATE_STIPPLEPATTERN27 = 91;
D3DRENDERSTATE_STIPPLEPATTERN28 = 92;
D3DRENDERSTATE_STIPPLEPATTERN29 = 93;
D3DRENDERSTATE_STIPPLEPATTERN30 = 94;
D3DRENDERSTATE_STIPPLEPATTERN31 = 95;
D3DRENDERSTATETYPE = TD3DRenderStateType;
 
//
// retired renderstate names - the values are still used under new naming conventions
//
D3DRENDERSTATE_FOGTABLESTART = 36; (* Fog table start *)
D3DRENDERSTATE_FOGTABLEEND = 37; (* Fog table end *)
D3DRENDERSTATE_FOGTABLEDENSITY = 38; (* Fog table density *)
TD3DMaterialColorSource = (
D3DMCS_MATERIAL, // Color from material is used
D3DMCS_COLOR1, // Diffuse vertex color is used
D3DMCS_COLOR2 // Specular vertex color is used
); // force 32-bit size enum
 
type
// Values for material source
PD3DMateralColorSource = ^TD3DMateralColorSource;
TD3DMateralColorSource = (
D3DMCS_MATERIAL, // Color from material is used
D3DMCS_COLOR1, // Diffuse vertex color is used
D3DMCS_COLOR2 // Specular vertex color is used
);
 
const
// For back-compatibility with legacy compilations
D3DRENDERSTATE_BLENDENABLE = D3DRENDERSTATE_ALPHABLENDENABLE;
{ For back-compatibility with legacy compilations }
D3DRENDERSTATE_BLENDENABLE = D3DRENDERSTATE_ALPHABLENDENABLE;
D3DRENDERSTATE_FOGTABLESTART = D3DRENDERSTATE_FOGSTART;
D3DRENDERSTATE_FOGTABLEEND = D3DRENDERSTATE_FOGEND;
D3DRENDERSTATE_FOGTABLEDENSITY = D3DRENDERSTATE_FOGDENSITY;
 
{ Bias to apply to the texture coordinate set to apply a wrap to. }
D3DRENDERSTATE_WRAPBIAS = TD3DRenderStateType(128);
 
// Bias to apply to the texture coordinate set to apply a wrap to.
D3DRENDERSTATE_WRAPBIAS = 128;
{ Flags to construct the WRAP render states }
D3DWRAP_U = $00000001;
D3DWRAP_V = $00000002;
 
(* Flags to construct the WRAP render states *)
D3DWRAP_U = $00000001;
D3DWRAP_V = $00000002;
{ Flags to construct the WRAP render states for 1D thru 4D texture coordinates }
D3DWRAPCOORD_0 = $00000001; // same as D3DWRAP_U
D3DWRAPCOORD_1 = $00000002; // same as D3DWRAP_V
D3DWRAPCOORD_2 = $00000004;
D3DWRAPCOORD_3 = $00000008;
 
(* Flags to construct the WRAP render states for 1D thru 4D texture coordinates *)
D3DWRAPCOORD_0 = $00000001; // same as D3DWRAP_U
D3DWRAPCOORD_1 = $00000002; // same as D3DWRAP_V
D3DWRAPCOORD_2 = $00000004;
D3DWRAPCOORD_3 = $00000008;
function D3DRENDERSTATE_STIPPLEPATTERN(y: DWORD): TD3DRenderStateType;
 
function D3DRENDERSTATE_STIPPLEPATTERN(y: integer) : TD3DRenderStateType;
type
 
type
PD3DState = ^TD3DState;
TD3DState = packed record
TD3DState = record
case Integer of
0: (
dtstTransformStateType: TD3DTransformStateType;
dwArg: Array [ 0..0 ] of DWORD;
);
dwArg: array[0..0] of DWORD;
);
1: (
dlstLightStateType: TD3DLightStateType;
dvArg: Array [ 0..0 ] of TD3DValue;
);
dvArg: array[0..0] of TD3DValue;
);
2: (
drstRenderStateType: TD3DRenderStateType;
);
);
end;
 
(*
* Operation used to load matrices
* hDstMat = hSrcMat
*)
PD3DMatrixLoad = ^TD3DMatrixLoad;
TD3DMatrixLoad = packed record
hDestMatrix: TD3DMatrixHandle; (* Destination matrix *)
hSrcMatrix: TD3DMatrixHandle; (* Source matrix *)
D3DSTATE = TD3DState;
 
{ TD3DMatrixLoad structure }
 
TD3DMatrixLoad = record
hDestMatrix: TD3DMatrixHandle; // Destination matrix
hSrcMatrix: TD3DMatrixHandle; // Source matrix
end;
 
(*
* Operation used to multiply matrices
* hDstMat = hSrcMat1 * hSrcMat2
*)
PD3DMatrixMultiply = ^TD3DMatrixMultiply;
TD3DMatrixMultiply = packed record
hDestMatrix: TD3DMatrixHandle; (* Destination matrix *)
hSrcMatrix1: TD3DMatrixHandle; (* First source matrix *)
hSrcMatrix2: TD3DMatrixHandle; (* Second source matrix *)
D3DMATRIXLOAD = TD3DMatrixLoad;
 
{ TD3DMatrixMultiply structure }
 
TD3DMatrixMultiply = record
hDestMatrix: TD3DMatrixHandle; // Destination matrix
hSrcMatrix1: TD3DMatrixHandle; // First source matrix
hSrcMatrix2: TD3DMatrixHandle; // Second source matrix
end;
 
(*
* Operation used to transform and light vertices.
*)
PD3DProcessVertices = ^TD3DProcessVertices;
TD3DProcessVertices = packed record
dwFlags: DWORD; (* Do we transform or light or just copy? *)
wStart: WORD; (* Index to first vertex in source *)
wDest: WORD; (* Index to first vertex in local buffer *)
dwCount: DWORD; (* Number of vertices to be processed *)
dwReserved: DWORD; (* Must be zero *)
D3DMATRIXMULTIPLY = TD3DMatrixMultiply;
 
{ TD3DProcessVertices structure }
 
TD3DProcessVertices = record
dwFlags: DWORD; // Do we transform or light or just copy?
wStart: WORD; // Index to first vertex in source
wDest: WORD; // Index to first vertex in local buffer
dwCount: DWORD; // Number of vertices to be processed
dwReserved: DWORD; // Must be zero
end;
 
D3DPROCESSVERTICES = TD3DProcessVertices;
 
const
D3DPROCESSVERTICES_TRANSFORMLIGHT = $00000000;
D3DPROCESSVERTICES_TRANSFORM = $00000001;
6857,97 → 3715,90
D3DPROCESSVERTICES_UPDATEEXTENTS = $00000008;
D3DPROCESSVERTICES_NOCOLOR = $00000010;
 
{ TD3DTextureStagesStateType }
 
(*
* State enumerants for per-stage texture processing.
*)
type
PD3DTextureStageStateType = ^TD3DTextureStageStateType;
TD3DTextureStageStateType = DWORD;
TD3DTextureStagesStateType = (
D3DTSS_INVALID_0,
D3DTSS_COLOROP, // TD3DTextureOp - per-stage blending controls for color channels
D3DTSS_COLORARG1, // D3DTA_* (texture arg)
D3DTSS_COLORARG2, // D3DTA_* (texture arg)
D3DTSS_ALPHAOP, // TD3DTextureOp - per-stage blending controls for alpha channel
D3DTSS_ALPHAARG1, // D3DTA_* (texture arg)
D3DTSS_ALPHAARG2, // D3DTA_* (texture arg)
D3DTSS_BUMPENVMAT00, // TD3DValue (bump mapping matrix)
D3DTSS_BUMPENVMAT01, // TD3DValue (bump mapping matrix)
D3DTSS_BUMPENVMAT10, // TD3DValue (bump mapping matrix)
D3DTSS_BUMPENVMAT11, // TD3DValue (bump mapping matrix)
D3DTSS_TEXCOORDINDEX, // identifies which set of texture coordinates index this texture
D3DTSS_ADDRESS, // TD3DTextureAddress for both coordinates
D3DTSS_ADDRESSU, // TD3DTextureAddress for U coordinate
D3DTSS_ADDRESSV, // TD3DTextureAddress for V coordinate
D3DTSS_BORDERCOLOR, // TD3DColor
D3DTSS_MAGFILTER, // TD3DTextureMagFilter filter to use for magnification
D3DTSS_MINFILTER, // TD3DTextureMinFilter filter to use for minification
D3DTSS_MIPFILTER, // TD3DTextureMipFilter filter to use between mipmaps during minification
D3DTSS_MIPMAPLODBIAS, // D3DVALUE Mipmap LOD bias
D3DTSS_MAXMIPLEVEL, // DWORD 0..(n-1) LOD index of largest map to use (0 == largest)
D3DTSS_MAXANISOTROPY, // DWORD maximum anisotropy
D3DTSS_BUMPENVLSCALE, // TD3DValue scale for bump map luminance
D3DTSS_BUMPENVLOFFSET, // TD3DValue offset for bump map luminance
D3DTSS_TEXTURETRANSFORMFLAGS // D3DTEXTURETRANSFORMFLAGS controls texture transform
);
 
D3DTEXTURESTAGESTATETYPE = TD3DTextureStagesStateType;
 
const
D3DTSS_COLOROP = 1; (* D3DTEXTUREOP - per-stage blending controls for color channels *)
D3DTSS_COLORARG1 = 2; (* D3DTA_* (texture arg) *)
D3DTSS_COLORARG2 = 3; (* D3DTA_* (texture arg) *)
D3DTSS_ALPHAOP = 4; (* D3DTEXTUREOP - per-stage blending controls for alpha channel *)
D3DTSS_ALPHAARG1 = 5; (* D3DTA_* (texture arg) *)
D3DTSS_ALPHAARG2 = 6; (* D3DTA_* (texture arg) *)
D3DTSS_BUMPENVMAT00 = 7; (* D3DVALUE (bump mapping matrix) *)
D3DTSS_BUMPENVMAT01 = 8; (* D3DVALUE (bump mapping matrix) *)
D3DTSS_BUMPENVMAT10 = 9; (* D3DVALUE (bump mapping matrix) *)
D3DTSS_BUMPENVMAT11 = 10; (* D3DVALUE (bump mapping matrix) *)
D3DTSS_TEXCOORDINDEX = 11; (* identifies which set of texture coordinates index this texture *)
D3DTSS_ADDRESS = 12; (* D3DTEXTUREADDRESS for both coordinates *)
D3DTSS_ADDRESSU = 13; (* D3DTEXTUREADDRESS for U coordinate *)
D3DTSS_ADDRESSV = 14; (* D3DTEXTUREADDRESS for V coordinate *)
D3DTSS_BORDERCOLOR = 15; (* D3DCOLOR *)
D3DTSS_MAGFILTER = 16; (* D3DTEXTUREMAGFILTER filter to use for magnification *)
D3DTSS_MINFILTER = 17; (* D3DTEXTUREMINFILTER filter to use for minification *)
D3DTSS_MIPFILTER = 18; (* D3DTEXTUREMIPFILTER filter to use between mipmaps during minification *)
D3DTSS_MIPMAPLODBIAS = 19; (* D3DVALUE Mipmap LOD bias *)
D3DTSS_MAXMIPLEVEL = 20; (* DWORD 0..(n-1) LOD index of largest map to use (0 == largest) *)
D3DTSS_MAXANISOTROPY = 21; (* DWORD maximum anisotropy *)
D3DTSS_BUMPENVLSCALE = 22; (* D3DVALUE scale for bump map luminance *)
D3DTSS_BUMPENVLOFFSET = 23; (* D3DVALUE offset for bump map luminance *)
D3DTSS_TEXTURETRANSFORMFLAGS = 24; (* D3DTEXTURETRANSFORMFLAGS controls texture transform *)
{ Values, used with D3DTSS_TEXCOORDINDEX, to specify that the vertex data(position }
{ and normal in the camera space) should be taken as texture coordinates }
{ Low 16 bits are used to specify texture coordinate index, to take the WRAP mode from }
 
// Values, used with D3DTSS_TEXCOORDINDEX, to specify that the vertex data(position
// and normal in the camera space) should be taken as texture coordinates
// Low 16 bits are used to specify texture coordinate index, to take the WRAP mode from
//
D3DTSS_TCI_PASSTHRU = $00000000;
D3DTSS_TCI_CAMERASPACENORMAL = $00010000;
D3DTSS_TCI_CAMERASPACEPOSITION = $00020000;
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR = $00030000;
D3DTSS_TCI_PASSTHRU = $00000000;
D3DTSS_TCI_CAMERASPACENORMAL = $00010000;
D3DTSS_TCI_CAMERASPACEPOSITION = $00020000;
D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR = $00030000;
 
{ TD3DTextureOp }
 
type
(*
* Enumerations for COLOROP and ALPHAOP texture blending operations set in
* texture processing stage controls in D3DRENDERSTATE.
*)
PD3DTextureOp = ^TD3DTextureOp;
TD3DTextureOp = (
D3DTOP_INVALID_0,
// Control
D3DTOP_DISABLE , // disables stage
D3DTOP_SELECTARG1, // the default
// Control
D3DTOP_DISABLE, // disables stage
D3DTOP_SELECTARG1, // the default
D3DTOP_SELECTARG2,
 
// Modulate
D3DTOP_MODULATE , // multiply args together
D3DTOP_MODULATE2X, // multiply and 1 bit
D3DTOP_MODULATE4X, // multiply and 2 bits
 
// Add
D3DTOP_ADD , // add arguments together
D3DTOP_ADDSIGNED , // add with -0.5 bias
D3DTOP_ADDSIGNED2X, // as above but left 1 bit
D3DTOP_SUBTRACT , // Arg1 - Arg2, with no saturation
D3DTOP_ADDSMOOTH , // add 2 args, subtract product
// Arg1 + Arg2 - Arg1*Arg2
// = Arg1 + (1-Arg1)*Arg2
 
// Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha)
D3DTOP_BLENDDIFFUSEALPHA , // iterated alpha
D3DTOP_BLENDTEXTUREALPHA , // texture alpha
D3DTOP_BLENDFACTORALPHA , // alpha from D3DRENDERSTATE_TEXTUREFACTOR
// Modulate
D3DTOP_MODULATE, // multiply args together
D3DTOP_MODULATE2X, // multiply and 1 bit
D3DTOP_MODULATE4X, // multiply and 2 bits
// Add
D3DTOP_ADD, // add arguments together
D3DTOP_ADDSIGNED, // add with -0.5 bias
D3DTOP_ADDSIGNED2X, // as above but left 1 bit
D3DTOP_SUBTRACT, // Arg1 - Arg2, with no saturation
D3DTOP_ADDSMOOTH, // add 2 args, subtract product
// Arg1 + Arg2 - Arg1*Arg2
// = Arg1 + (1-Arg1)*Arg2
// Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha)
D3DTOP_BLENDDIFFUSEALPHA, // iterated alpha
D3DTOP_BLENDTEXTUREALPHA, // texture alpha
D3DTOP_BLENDFACTORALPHA, // alpha from D3DRENDERSTATE_TEXTUREFACTOR
// Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha)
D3DTOP_BLENDTEXTUREALPHAPM, // texture alpha
D3DTOP_BLENDCURRENTALPHA , // by alpha of current color
 
// Specular mapping
D3DTOP_PREMODULATE , // modulate with next texture before use
D3DTOP_BLENDTEXTUREALPHAPM, // texture alpha
D3DTOP_BLENDCURRENTALPHA, // by alpha of current color
// Specular mapping
D3DTOP_PREMODULATE, // modulate with next texture before use
D3DTOP_MODULATEALPHA_ADDCOLOR, // Arg1.RGB + Arg1.A*Arg2.RGB
// COLOROP only
D3DTOP_MODULATECOLOR_ADDALPHA, // Arg1.RGB*Arg2.RGB + Arg1.A
// COLOROP only
// COLOROP only
D3DTOP_MODULATEINVALPHA_ADDCOLOR, // (1-Arg1.A)*Arg2.RGB + Arg1.RGB
// COLOROP only
D3DTOP_MODULATEINVCOLOR_ADDALPHA, // (1-Arg1.RGB)*Arg2.RGB + Arg1.A
// COLOROP only
 
// Bump mapping
D3DTOP_BUMPENVMAP , // per pixel env map perturbation
D3DTOP_BUMPENVMAPLUMINANCE, // with luminance channel
// COLOROP only
// Bump mapping
D3DTOP_BUMPENVMAP, // per pixel env map perturbation
D3DTOP_BUMPENVMAPLUMINANCE, // with luminance channel
// This can do either diffuse or specular bump mapping with correct input.
// Performs the function (Arg1.R*Arg2.R + Arg1.G*Arg2.G + Arg1.B*Arg2.B)
// where each component has been scaled and offset to make it signed.
6956,195 → 3807,188
D3DTOP_DOTPRODUCT3
);
 
(*
* Values for COLORARG1,2 and ALPHAARG1,2 texture blending operations
* set in texture processing stage controls in D3DRENDERSTATE.
*)
D3DTEXTUREOP = TD3DTextureOp;
 
{ Values for COLORARG1,2 and ALPHAARG1,2 texture blending operations
set in texture processing stage controls in D3DRENDERSTATE. }
 
const
D3DTA_SELECTMASK = $0000000f; // mask for arg selector
D3DTA_DIFFUSE = $00000000; // select diffuse color
D3DTA_CURRENT = $00000001; // select result of previous stage
D3DTA_TEXTURE = $00000002; // select texture color
D3DTA_TFACTOR = $00000003; // select RENDERSTATE_TEXTUREFACTOR
D3DTA_SPECULAR = $00000004; // select specular color
D3DTA_COMPLEMENT = $00000010; // take 1.0 - x
D3DTA_ALPHAREPLICATE = $00000020; // replicate alpha to color components
D3DTA_SELECTMASK = $0000000f; // mask for arg selector
D3DTA_DIFFUSE = $00000000; // select diffuse color
D3DTA_CURRENT = $00000001; // select result of previous stage
D3DTA_TEXTURE = $00000002; // select texture color
D3DTA_TFACTOR = $00000003; // select RENDERSTATE_TEXTUREFACTOR
D3DTA_SPECULAR = $00000004; // select specular color
D3DTA_COMPLEMENT = $00000010; // take 1.0 - x
D3DTA_ALPHAREPLICATE = $00000020; // replicate alpha to color components
 
(*
* IDirect3DTexture2 State Filter Types
*)
{ IDirect3DTexture2 State Filter Types }
 
type
PD3DTextureMagFilter = ^TD3DTextureMagFilter;
TD3DTextureMagFilter = (
D3DTFG_INVALID_0,
D3DTFG_POINT , // nearest
D3DTFG_LINEAR , // linear interpolation
D3DTFG_FLATCUBIC , // cubic
D3DTFG_GAUSSIANCUBIC, // different cubic kernel
D3DTFG_POINT, // nearest
D3DTFG_LINEAR, // linear interpolation
D3DTFG_FLATCUBIC, // cubic
D3DTFG_GAUSSIANCUBIC, // different cubic kernel
D3DTFG_ANISOTROPIC
);
 
PD3DTextureMinFilter = ^TD3DTextureMinFilter;
D3DTEXTUREMAGFILTER = TD3DTextureMagFilter;
 
TD3DTextureMinFilter = (
D3DTFN_INVALID_0,
D3DTFN_POINT , // nearest
D3DTFN_LINEAR , // linear interpolation
D3DTFN_POINT, // nearest
D3DTFN_LINEAR, // linear interpolation
D3DTFN_ANISOTROPIC
);
 
PD3DTextureMipFilter = ^TD3DTextureMipFilter;
D3DTEXTUREMINFILTER = TD3DTextureMinFilter;
 
TD3DTextureMipFilter = (
D3DTFP_INVALID_0,
D3DTFP_NONE , // mipmapping disabled (use MAG filter)
D3DTFP_POINT , // nearest
D3DTFP_LINEAR // linear interpolation
D3DTFP_NONE, // mipmapping disabled (use MAG filter)
D3DTFP_POINT, // nearest
D3DTFP_LINEAR // linear interpolation
);
 
D3DTEXTUREMIPFILTER = TD3DTextureMipFilter;
 
(*
* Triangle flags
*)
{ Triangle flags }
 
(*
* Tri strip and fan flags.
* START loads all three vertices
* EVEN and ODD load just v3 with even or odd culling
* START_FLAT contains a count from 0 to 29 that allows the
* whole strip or fan to be culled in one hit.
* e.g. for a quad len = 1
*)
const
D3DTRIFLAG_START = $00000000;
// #define D3DTRIFLAG_STARTFLAT(len) (len) (* 0 < len < 30 *)
function D3DTRIFLAG_STARTFLAT(len: DWORD) : DWORD;
 
const
D3DTRIFLAG_ODD = $0000001e;
D3DTRIFLAG_EVEN = $0000001f;
 
(*
* Triangle edge flags
* enable edges for wireframe or antialiasing
*)
D3DTRIFLAG_EDGEENABLE1 = $00000100; (* v0-v1 edge *)
D3DTRIFLAG_EDGEENABLE2 = $00000200; (* v1-v2 edge *)
D3DTRIFLAG_EDGEENABLE3 = $00000400; (* v2-v0 edge *)
D3DTRIFLAG_EDGEENABLETRIANGLE = (
D3DTRIFLAG_EDGEENABLE1 or D3DTRIFLAG_EDGEENABLE2 or D3DTRIFLAG_EDGEENABLE3);
function D3DTRIFLAG_STARTFLAT(len: DWORD): DWORD;
 
(*
* Primitive structures and related defines. Vertex offsets are to types
* TD3DVertex, TD3DLVertex, or TD3DTLVertex.
*)
{ Triangle edge flags }
 
(*
* Triangle list primitive structure
*)
const
D3DTRIFLAG_EDGEENABLE1 = $00000100; // v0-v1 edge
D3DTRIFLAG_EDGEENABLE2 = $00000200; // v1-v2 edge
D3DTRIFLAG_EDGEENABLE3 = $00000400; // v2-v0 edge
D3DTRIFLAG_EDGEENABLETRIANGLE =
D3DTRIFLAG_EDGEENABLE1 or D3DTRIFLAG_EDGEENABLE2 or D3DTRIFLAG_EDGEENABLE3;
 
{ TD3DTriangle structure }
 
type
PD3DTriangle = ^TD3DTriangle;
TD3DTriangle = packed record
TD3DTriangle = record
case Integer of
0: (
v1: WORD; (* Vertex indices *)
v1: WORD; // Vertex indices
v2: WORD;
v3: WORD;
wFlags: WORD; (* Edge (and other) flags *)
);
wFlags: WORD; // Edge (and other) flags
);
1: (
wV1: WORD;
wV2: WORD;
wV3: WORD;
);
);
end;
 
(*
* Line strip structure.
* The instruction count - 1 defines the number of line segments.
*)
D3DTRIANGLE = TD3DTriangle;
LPD3DTRIANGLE = PD3DTriangle;
 
{ TD3DLine structure }
 
PD3DLine = ^TD3DLine;
TD3DLine = packed record
TD3DLine = record
case Integer of
0: (
v1: WORD; (* Vertex indices *)
v1: WORD; // Vertex indices
v2: WORD;
);
);
1: (
wV1: WORD;
wV2: WORD;
);
);
end;
 
(*
* Span structure
* Spans join a list of points with the same y value.
* If the y value changes, a new span is started.
*)
D3DLINE = TD3DLine;
LPD3DLINE = PD3DLine;
 
{ TD3DSpan structure }
 
PD3DSpan = ^TD3DSpan;
TD3DSpan = packed record
wCount: WORD; (* Number of spans *)
wFirst: WORD; (* Index to first vertex *)
TD3DSpan = record
wCount: WORD; // Number of spans
wFirst: WORD; // Index to first vertex
end;
 
(*
* Point structure
*)
D3DSPAN = TD3DSpan;
LPD3DSPAN = PD3DSpan;
 
{ TD3DPoint structure }
 
PD3DPoint = ^TD3DPoint;
TD3DPoint = packed record
wCount: WORD; (* number of points *)
wFirst: WORD; (* index to first vertex *)
TD3DPoint = record
wCount: WORD; // number of points
wFirst: WORD; // index to first vertex
end;
 
(*
* Forward branch structure.
* Mask is logically anded with the driver status mask
* if the result equals 'value', the branch is taken.
*)
D3DPOINT = TD3DPoint;
LPD3DPOINT = PD3DPoint;
 
{ TD3DBranch structure }
 
PD3DBranch = ^TD3DBranch;
TD3DBranch = packed record
dwMask: DWORD; (* Bitmask against D3D status *)
TD3DBranch = record
dwMask: DWORD; // Bitmask against D3D status
dwValue: DWORD;
bNegate: BOOL; (* TRUE to negate comparison *)
dwOffset: DWORD; (* How far to branch forward (0 for exit)*)
bNegate: BOOL; // TRUE to negate comparison
dwOffset: DWORD; // How far to branch forward (0 for exit)
end;
 
(*
* Status used for set status instruction.
* The D3D status is initialised on device creation
* and is modified by all execute calls.
*)
D3DBRANCH = TD3DBranch;
LPD3DBRANCH = PD3DBranch;
 
{ TD3DStatus structure }
 
PD3DStatus = ^TD3DStatus;
TD3DStatus = packed record
dwFlags: DWORD; (* Do we set extents or status *)
dwStatus: DWORD; (* D3D status *)
TD3DStatus = record
dwFlags: DWORD; // Do we set extents or status
dwStatus: DWORD; // D3D status
drExtent: TD3DRect;
end;
 
D3DSTATUS = TD3DStatus;
LPD3DSTATUS = PD3DStatus;
 
const
D3DSETSTATUS_STATUS = $00000001;
D3DSETSTATUS_EXTENTS = $00000002;
D3DSETSTATUS_ALL = (D3DSETSTATUS_STATUS or D3DSETSTATUS_EXTENTS);
D3DSETSTATUS_STATUS = $00000001;
D3DSETSTATUS_EXTENTS = $00000002;
D3DSETSTATUS_ALL = D3DSETSTATUS_STATUS or D3DSETSTATUS_EXTENTS;
 
{ TD3DClipStatus structure }
 
type
PD3DClipStatus = ^TD3DClipStatus;
TD3DClipStatus = packed record
dwFlags : DWORD; (* Do we set 2d extents, 3D extents or status *)
dwStatus : DWORD; (* Clip status *)
minx, maxx : float; (* X extents *)
miny, maxy : float; (* Y extents *)
minz, maxz : float; (* Z extents *)
TD3DClipStatus = record
dwFlags: DWORD; // Do we set 2d extents, 3D extents or status
dwStatus: DWORD; // Clip status
minx, maxx: Single; // X extents
miny, maxy: Single; // Y extents
minz, maxz: Single; // Z extents
end;
 
D3DCLIPSTATUS = TD3DClipStatus;
LPD3DCLIPSTATUS = PD3DClipStatus;
 
const
D3DCLIPSTATUS_STATUS = $00000001;
D3DCLIPSTATUS_EXTENTS2 = $00000002;
D3DCLIPSTATUS_EXTENTS3 = $00000004;
 
(*
* Statistics structure
*)
{ TD3DStats structure }
 
type
PD3DStats = ^TD3DStats;
TD3DStats = packed record
TD3DStats = record
dwSize: DWORD;
dwTrianglesDrawn: DWORD;
dwLinesDrawn: DWORD;
7153,18 → 3997,20
dwVerticesProcessed: DWORD;
end;
 
(*
* Execute options.
* When calling using D3DEXECUTE_UNCLIPPED all the primitives
* inside the buffer must be contained within the viewport.
*)
D3DSTATS = TD3DStats;
LPD3DSTATS = PD3DStats;
 
{ Execute options. }
 
const
D3DEXECUTE_CLIPPED = $00000001;
D3DEXECUTE_UNCLIPPED = $00000002;
 
{ TD3DExecuteData structure }
 
type
PD3DExecuteData = ^TD3DExecuteData;
TD3DExecuteData = packed record
TD3DExecuteData = record
dwSize: DWORD;
dwVertexOffset: DWORD;
dwVertexCount: DWORD;
7171,197 → 4017,459
dwInstructionOffset: DWORD;
dwInstructionLength: DWORD;
dwHVertexOffset: DWORD;
dsStatus: TD3DStatus; (* Status after execute *)
dsStatus: D3DSTATUS; // Status after execute
end;
 
(*
* Palette flags.
* This are or'ed with the peFlags in the PALETTEENTRYs passed to DirectDraw.
*)
D3DEXECUTEDATA = TD3DExecuteData;
LPD3DEXECUTEDATA = PD3DExecuteData;
 
{ Palette flags. }
 
const
D3DPAL_FREE = $00; (* Renderer may use this entry freely *)
D3DPAL_READONLY = $40; (* Renderer may not set this entry *)
D3DPAL_RESERVED = $80; (* Renderer may not use this entry *)
D3DPAL_FREE = $00; // Renderer may use this entry freely
D3DPAL_READONLY = $40; // Renderer may not set this entry
D3DPAL_RESERVED = $80; // Renderer may not use this entry
 
{ TD3DVertexBufferDesc structure }
 
type
PD3DVertexBufferDesc = ^TD3DVertexBufferDesc;
TD3DVertexBufferDesc = packed record
dwSize : DWORD;
dwCaps : DWORD;
dwFVF : DWORD;
dwNumVertices : DWORD;
TD3DVertexBufferDesc = record
dwSize: DWORD;
dwCaps: DWORD;
dwFVF: DWORD;
dwNumVertices: DWORD;
end;
 
D3DVERTEXBUFFERDESC = TD3DVertexBufferDesc;
LPD3DVERTEXBUFFERDESC = PD3DVertexBufferDesc;
 
{ These correspond to DDSCAPS_* flags }
 
const
(* These correspond to DDSCAPS_* flags *)
D3DVBCAPS_SYSTEMMEMORY = $00000800;
D3DVBCAPS_WRITEONLY = $00010000;
D3DVBCAPS_OPTIMIZED = $80000000;
D3DVBCAPS_DONOTCLIP = $00000001;
D3DVBCAPS_SYSTEMMEMORY = $00000800;
D3DVBCAPS_WRITEONLY = $00010000;
D3DVBCAPS_OPTIMIZED = $80000000;
D3DVBCAPS_DONOTCLIP = $00000001;
 
(* Vertex Operations for ProcessVertices *)
D3DVOP_LIGHT = (1 shl 10);
D3DVOP_TRANSFORM = (1 shl 0);
D3DVOP_CLIP = (1 shl 2);
D3DVOP_EXTENTS = (1 shl 3);
{ Vertex Operations for ProcessVertices }
 
(* The maximum number of vertices user can pass to any d3d
drawing function or to create vertex buffer with
*)
D3DMAXNUMVERTICES = ((1 shl 16) - 1);
(* The maximum number of primitives user can pass to any d3d
drawing function.
*)
D3DMAXNUMPRIMITIVES = ((1 shl 16) - 1);
D3DVOP_LIGHT = 1 shl 10;
D3DVOP_TRANSFORM = 1 shl 0;
D3DVOP_CLIP = 1 shl 2;
D3DVOP_EXTENTS = 1 shl 3;
 
(* Bits for dwFlags in ProcessVertices call *)
D3DPV_DONOTCOPYDATA = (1 shl 0);
{ The maximum number of vertices user can pass to any d3d
drawing function or to create vertex buffer with }
D3DMAXNUMVERTICES = (1 shl 16)-1;
 
//-------------------------------------------------------------------
{ The maximum number of primitives user can pass to any d3d drawing function. }
D3DMAXNUMPRIMITIVES = (1 shl 16)-1;
 
// Flexible vertex format bits
//
D3DFVF_RESERVED0 = $001;
D3DFVF_POSITION_MASK = $00E;
D3DFVF_XYZ = $002;
D3DFVF_XYZRHW = $004;
D3DFVF_XYZB1 = $006;
D3DFVF_XYZB2 = $008;
D3DFVF_XYZB3 = $00a;
D3DFVF_XYZB4 = $00c;
D3DFVF_XYZB5 = $00e;
{ Bits for dwFlags in ProcessVertices call }
D3DPV_DONOTCOPYDATA = 1 shl 0;
 
D3DFVF_NORMAL = $010;
D3DFVF_RESERVED1 = $020;
D3DFVF_DIFFUSE = $040;
D3DFVF_SPECULAR = $080;
{ Flexible vertex format bits }
 
D3DFVF_TEXCOUNT_MASK = $f00;
D3DFVF_TEXCOUNT_SHIFT = 8;
D3DFVF_TEX0 = $000;
D3DFVF_TEX1 = $100;
D3DFVF_TEX2 = $200;
D3DFVF_TEX3 = $300;
D3DFVF_TEX4 = $400;
D3DFVF_TEX5 = $500;
D3DFVF_TEX6 = $600;
D3DFVF_TEX7 = $700;
D3DFVF_TEX8 = $800;
D3DFVF_RESERVED0 = $001;
D3DFVF_POSITION_MASK = $00E;
D3DFVF_XYZ = $002;
D3DFVF_XYZRHW = $004;
D3DFVF_XYZB1 = $006;
D3DFVF_XYZB2 = $008;
D3DFVF_XYZB3 = $00a;
D3DFVF_XYZB4 = $00c;
D3DFVF_XYZB5 = $00e;
D3DFVF_NORMAL = $010;
D3DFVF_RESERVED1 = $020;
D3DFVF_DIFFUSE = $040;
D3DFVF_SPECULAR = $080;
D3DFVF_TEXCOUNT_MASK = $f00;
D3DFVF_TEXCOUNT_SHIFT = 8;
D3DFVF_TEX0 = $000;
D3DFVF_TEX1 = $100;
D3DFVF_TEX2 = $200;
D3DFVF_TEX3 = $300;
D3DFVF_TEX4 = $400;
D3DFVF_TEX5 = $500;
D3DFVF_TEX6 = $600;
D3DFVF_TEX7 = $700;
D3DFVF_TEX8 = $800;
 
D3DFVF_RESERVED2 = $f000; // 4 reserved bits
D3DFVF_RESERVED2 = $F000; // 4 reserved bits
 
D3DFVF_VERTEX = ( D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_TEX1 );
D3DFVF_LVERTEX = ( D3DFVF_XYZ or D3DFVF_RESERVED1 or D3DFVF_DIFFUSE or
D3DFVF_SPECULAR or D3DFVF_TEX1 );
D3DFVF_TLVERTEX = ( D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_SPECULAR or
D3DFVF_TEX1 );
D3DFVF_VERTEX = D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_TEX1;
D3DFVF_LVERTEX = D3DFVF_XYZ or D3DFVF_RESERVED1 or D3DFVF_DIFFUSE or
D3DFVF_SPECULAR or D3DFVF_TEX1;
D3DFVF_TLVERTEX = D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_SPECULAR or
D3DFVF_TEX1;
 
{ TD3DDP_PtrStride }
 
type
PD3DDP_PtrStride = ^TD3DDP_PtrStride;
TD3DDP_PtrStride = packed record
lpvData : pointer;
dwStride : DWORD;
TD3DDP_PtrStride = record
lpvData: Pointer;
dwStride: DWORD;
end;
 
D3DDP_PTRSTRIDE = TD3DDP_PtrStride;
 
const
D3DDP_MAXTEXCOORD = 8;
 
type
PD3DDrawPrimitiveStridedData = ^TD3DDrawPrimitiveStridedData;
TD3DDrawPrimitiveStridedData = packed record
position : TD3DDP_PtrStride;
normal : TD3DDP_PtrStride;
diffuse : TD3DDP_PtrStride;
specular : TD3DDP_PtrStride;
textureCoords : array [0..D3DDP_MAXTEXCOORD-1] of TD3DDP_PtrStride;
TD3DDrawPrimitiveStridedData = record
position: TD3DDP_PtrStride;
normal: TD3DDP_PtrStride;
diffuse: TD3DDP_PtrStride;
specular: TD3DDP_PtrStride;
textureCoords: array[0..D3DDP_MAXTEXCOORD-1] of TD3DDP_PtrStride;
end;
 
//---------------------------------------------------------------------
// ComputeSphereVisibility return values
//
D3DDRAWPRIMITIVESTRIDEDDATA = TD3DDrawPrimitiveStridedData;
LPD3DDRAWPRIMITIVESTRIDEDDATA = PD3DDrawPrimitiveStridedData;
 
{ ComputeSphereVisibility return values }
 
const
D3DVIS_INSIDE_FRUSTUM = 0;
D3DVIS_INTERSECT_FRUSTUM = 1;
D3DVIS_OUTSIDE_FRUSTUM = 2;
D3DVIS_INSIDE_LEFT = 0;
D3DVIS_INTERSECT_LEFT = (1 shl 2);
D3DVIS_OUTSIDE_LEFT = (2 shl 2);
D3DVIS_INSIDE_RIGHT = 0;
D3DVIS_INTERSECT_RIGHT = (1 shl 4);
D3DVIS_OUTSIDE_RIGHT = (2 shl 4);
D3DVIS_INSIDE_TOP = 0;
D3DVIS_INTERSECT_TOP = (1 shl 6);
D3DVIS_OUTSIDE_TOP = (2 shl 6);
D3DVIS_INSIDE_BOTTOM = 0;
D3DVIS_INTERSECT_BOTTOM = (1 shl 8);
D3DVIS_OUTSIDE_BOTTOM = (2 shl 8);
D3DVIS_INSIDE_NEAR = 0;
D3DVIS_INTERSECT_NEAR = (1 shl 10);
D3DVIS_OUTSIDE_NEAR = (2 shl 10);
D3DVIS_INSIDE_FAR = 0;
D3DVIS_INTERSECT_FAR = (1 shl 12);
D3DVIS_OUTSIDE_FAR = (2 shl 12);
D3DVIS_INSIDE_FRUSTUM = 0;
D3DVIS_INTERSECT_FRUSTUM = 1;
D3DVIS_OUTSIDE_FRUSTUM = 2;
D3DVIS_INSIDE_LEFT = 0;
D3DVIS_INTERSECT_LEFT = 1 shl 2;
D3DVIS_OUTSIDE_LEFT = 2 shl 2;
D3DVIS_INSIDE_RIGHT = 0;
D3DVIS_INTERSECT_RIGHT = 1 shl 4;
D3DVIS_OUTSIDE_RIGHT = 2 shl 4;
D3DVIS_INSIDE_TOP = 0;
D3DVIS_INTERSECT_TOP = 1 shl 6;
D3DVIS_OUTSIDE_TOP = 2 shl 6;
D3DVIS_INSIDE_BOTTOM = 0;
D3DVIS_INTERSECT_BOTTOM = 1 shl 8;
D3DVIS_OUTSIDE_BOTTOM = 2 shl 8;
D3DVIS_INSIDE_NEAR = 0;
D3DVIS_INTERSECT_NEAR = 1 shl 10;
D3DVIS_OUTSIDE_NEAR = 2 shl 10;
D3DVIS_INSIDE_FAR = 0;
D3DVIS_INTERSECT_FAR = 1 shl 12;
D3DVIS_OUTSIDE_FAR = 2 shl 12;
 
D3DVIS_MASK_FRUSTUM = (3 shl 0);
D3DVIS_MASK_LEFT = (3 shl 2);
D3DVIS_MASK_RIGHT = (3 shl 4);
D3DVIS_MASK_TOP = (3 shl 6);
D3DVIS_MASK_BOTTOM = (3 shl 8);
D3DVIS_MASK_NEAR = (3 shl 10);
D3DVIS_MASK_FAR = (3 shl 12);
D3DVIS_MASK_FRUSTUM = 3 shl 0;
D3DVIS_MASK_LEFT = 3 shl 2;
D3DVIS_MASK_RIGHT = 3 shl 4;
D3DVIS_MASK_TOP = 3 shl 6;
D3DVIS_MASK_BOTTOM = 3 shl 8;
D3DVIS_MASK_NEAR = 3 shl 10;
D3DVIS_MASK_FAR = 3 shl 12;
 
// To be used with GetInfo()
{ To be used with GetInfo() }
 
D3DDEVINFOID_TEXTUREMANAGER = 1;
D3DDEVINFOID_D3DTEXTUREMANAGER = 2;
D3DDEVINFOID_TEXTURING = 3;
 
type
PD3DStateBlockType = ^TD3DStateBlockType;
 
{ TD3DStateBlockType }
 
TD3DStateBlockType = (
D3DSBT_INVALID_0 ,
D3DSBT_ALL , // capture all state
D3DSBT_PIXELSTATE , // capture pixel state
D3DSBT_VERTEXSTATE // capture vertex state
D3DBST_INVALID_0,
D3DSBT_PIXELSTATE, // capture pixel state
D3DSBT_VERTEXSTATE // capture vertex state
);
 
// The D3DVERTEXBLENDFLAGS type is used with D3DRENDERSTATE_VERTEXBLEND state.
//
PD3DVertexBlendFlags = ^TD3DVertexBlendFlags;
D3DSTATEBLOCKTYPE = TD3DStateBlockType;
 
{ TD3DVertexBlendFlags }
 
TD3DVertexBlendFlags = (
D3DVBLEND_DISABLE , // Disable vertex blending
D3DVBLEND_1WEIGHT , // blend between 2 matrices
D3DVBLEND_2WEIGHTS, // blend between 3 matrices
D3DVBLEND_3WEIGHTS // blend between 4 matrices
D3DVBLEND_DISABLE, // Disable vertex blending
D3DVBLEND_1WEIGHT, // blend between 2 matrices
D3DVBLEND_2WEIGHTS, // blend between 3 matrices
D3DVBLEND_3WEIGHTS // blend between 4 matrices
);
 
PD3DTextureTransformFlags = ^TD3DTextureTransformFlags;
D3DVERTEXBLENDFLAGS = TD3DVertexBlendFlags;
 
{ TD3DTextureTransformFlags }
 
TD3DTextureTransformFlags = (
D3DTTFF_DISABLE , // texture coordinates are passed directly
D3DTTFF_COUNT1 , // rasterizer should expect 1-D texture coords
D3DTTFF_COUNT2 , // rasterizer should expect 2-D texture coords
D3DTTFF_COUNT3 , // rasterizer should expect 3-D texture coords
D3DTTFF_COUNT4 // rasterizer should expect 4-D texture coords
D3DTTFF_DISABLE, // texture coordinates are passed directly
D3DTTFF_COUNT1, // rasterizer should expect 1-D texture coords
D3DTTFF_COUNT2, // rasterizer should expect 2-D texture coords
D3DTTFF_COUNT3, // rasterizer should expect 3-D texture coords
D3DTTFF_COUNT4, // rasterizer should expect 4-D texture coords
D3DTIFF_INVALID_5,
D3DTIFF_INVALID_6,
D3DTIFF_INVALID_7,
D3DTIFF_INVALID_8,
D3DTIFF_INVALID_9,
D3DTIFF_INVALID_10,
D3DTIFF_INVALID_11,
D3DTIFF_INVALID_12,
D3DTIFF_INVALID_13,
D3DTIFF_INVALID_14,
D3DTIFF_INVALID_15,
D3DTIFF_INVALID_16,
D3DTIFF_INVALID_17,
D3DTIFF_INVALID_18,
D3DTIFF_INVALID_19,
D3DTIFF_INVALID_20,
D3DTIFF_INVALID_21,
D3DTIFF_INVALID_22,
D3DTIFF_INVALID_23,
D3DTIFF_INVALID_24,
D3DTIFF_INVALID_25,
D3DTIFF_INVALID_26,
D3DTIFF_INVALID_27,
D3DTIFF_INVALID_28,
D3DTIFF_INVALID_29,
D3DTIFF_INVALID_30,
D3DTIFF_INVALID_31,
D3DTIFF_INVALID_32,
D3DTIFF_INVALID_33,
D3DTIFF_INVALID_34,
D3DTIFF_INVALID_35,
D3DTIFF_INVALID_36,
D3DTIFF_INVALID_37,
D3DTIFF_INVALID_38,
D3DTIFF_INVALID_39,
D3DTIFF_INVALID_40,
D3DTIFF_INVALID_41,
D3DTIFF_INVALID_42,
D3DTIFF_INVALID_43,
D3DTIFF_INVALID_44,
D3DTIFF_INVALID_45,
D3DTIFF_INVALID_46,
D3DTIFF_INVALID_47,
D3DTIFF_INVALID_48,
D3DTIFF_INVALID_49,
D3DTIFF_INVALID_50,
D3DTIFF_INVALID_51,
D3DTIFF_INVALID_52,
D3DTIFF_INVALID_53,
D3DTIFF_INVALID_54,
D3DTIFF_INVALID_55,
D3DTIFF_INVALID_56,
D3DTIFF_INVALID_57,
D3DTIFF_INVALID_58,
D3DTIFF_INVALID_59,
D3DTIFF_INVALID_60,
D3DTIFF_INVALID_61,
D3DTIFF_INVALID_62,
D3DTIFF_INVALID_63,
D3DTIFF_INVALID_64,
D3DTIFF_INVALID_65,
D3DTIFF_INVALID_66,
D3DTIFF_INVALID_67,
D3DTIFF_INVALID_68,
D3DTIFF_INVALID_69,
D3DTIFF_INVALID_70,
D3DTIFF_INVALID_71,
D3DTIFF_INVALID_72,
D3DTIFF_INVALID_73,
D3DTIFF_INVALID_74,
D3DTIFF_INVALID_75,
D3DTIFF_INVALID_76,
D3DTIFF_INVALID_77,
D3DTIFF_INVALID_78,
D3DTIFF_INVALID_79,
D3DTIFF_INVALID_80,
D3DTIFF_INVALID_81,
D3DTIFF_INVALID_82,
D3DTIFF_INVALID_83,
D3DTIFF_INVALID_84,
D3DTIFF_INVALID_85,
D3DTIFF_INVALID_86,
D3DTIFF_INVALID_87,
D3DTIFF_INVALID_88,
D3DTIFF_INVALID_89,
D3DTIFF_INVALID_90,
D3DTIFF_INVALID_91,
D3DTIFF_INVALID_92,
D3DTIFF_INVALID_93,
D3DTIFF_INVALID_94,
D3DTIFF_INVALID_95,
D3DTIFF_INVALID_96,
D3DTIFF_INVALID_97,
D3DTIFF_INVALID_98,
D3DTIFF_INVALID_99,
D3DTIFF_INVALID_100,
D3DTIFF_INVALID_101,
D3DTIFF_INVALID_102,
D3DTIFF_INVALID_103,
D3DTIFF_INVALID_104,
D3DTIFF_INVALID_105,
D3DTIFF_INVALID_106,
D3DTIFF_INVALID_107,
D3DTIFF_INVALID_108,
D3DTIFF_INVALID_109,
D3DTIFF_INVALID_110,
D3DTIFF_INVALID_111,
D3DTIFF_INVALID_112,
D3DTIFF_INVALID_113,
D3DTIFF_INVALID_114,
D3DTIFF_INVALID_115,
D3DTIFF_INVALID_116,
D3DTIFF_INVALID_117,
D3DTIFF_INVALID_118,
D3DTIFF_INVALID_119,
D3DTIFF_INVALID_120,
D3DTIFF_INVALID_121,
D3DTIFF_INVALID_122,
D3DTIFF_INVALID_123,
D3DTIFF_INVALID_124,
D3DTIFF_INVALID_125,
D3DTIFF_INVALID_126,
D3DTIFF_INVALID_127,
D3DTIFF_INVALID_128,
D3DTIFF_INVALID_129,
D3DTIFF_INVALID_130,
D3DTIFF_INVALID_131,
D3DTIFF_INVALID_132,
D3DTIFF_INVALID_133,
D3DTIFF_INVALID_134,
D3DTIFF_INVALID_135,
D3DTIFF_INVALID_136,
D3DTIFF_INVALID_137,
D3DTIFF_INVALID_138,
D3DTIFF_INVALID_139,
D3DTIFF_INVALID_140,
D3DTIFF_INVALID_141,
D3DTIFF_INVALID_142,
D3DTIFF_INVALID_143,
D3DTIFF_INVALID_144,
D3DTIFF_INVALID_145,
D3DTIFF_INVALID_146,
D3DTIFF_INVALID_147,
D3DTIFF_INVALID_148,
D3DTIFF_INVALID_149,
D3DTIFF_INVALID_150,
D3DTIFF_INVALID_151,
D3DTIFF_INVALID_152,
D3DTIFF_INVALID_153,
D3DTIFF_INVALID_154,
D3DTIFF_INVALID_155,
D3DTIFF_INVALID_156,
D3DTIFF_INVALID_157,
D3DTIFF_INVALID_158,
D3DTIFF_INVALID_159,
D3DTIFF_INVALID_160,
D3DTIFF_INVALID_161,
D3DTIFF_INVALID_162,
D3DTIFF_INVALID_163,
D3DTIFF_INVALID_164,
D3DTIFF_INVALID_165,
D3DTIFF_INVALID_166,
D3DTIFF_INVALID_167,
D3DTIFF_INVALID_168,
D3DTIFF_INVALID_169,
D3DTIFF_INVALID_170,
D3DTIFF_INVALID_171,
D3DTIFF_INVALID_172,
D3DTIFF_INVALID_173,
D3DTIFF_INVALID_174,
D3DTIFF_INVALID_175,
D3DTIFF_INVALID_176,
D3DTIFF_INVALID_177,
D3DTIFF_INVALID_178,
D3DTIFF_INVALID_179,
D3DTIFF_INVALID_180,
D3DTIFF_INVALID_181,
D3DTIFF_INVALID_182,
D3DTIFF_INVALID_183,
D3DTIFF_INVALID_184,
D3DTIFF_INVALID_185,
D3DTIFF_INVALID_186,
D3DTIFF_INVALID_187,
D3DTIFF_INVALID_188,
D3DTIFF_INVALID_189,
D3DTIFF_INVALID_190,
D3DTIFF_INVALID_191,
D3DTIFF_INVALID_192,
D3DTIFF_INVALID_193,
D3DTIFF_INVALID_194,
D3DTIFF_INVALID_195,
D3DTIFF_INVALID_196,
D3DTIFF_INVALID_197,
D3DTIFF_INVALID_198,
D3DTIFF_INVALID_199,
D3DTIFF_INVALID_200,
D3DTIFF_INVALID_201,
D3DTIFF_INVALID_202,
D3DTIFF_INVALID_203,
D3DTIFF_INVALID_204,
D3DTIFF_INVALID_205,
D3DTIFF_INVALID_206,
D3DTIFF_INVALID_207,
D3DTIFF_INVALID_208,
D3DTIFF_INVALID_209,
D3DTIFF_INVALID_210,
D3DTIFF_INVALID_211,
D3DTIFF_INVALID_212,
D3DTIFF_INVALID_213,
D3DTIFF_INVALID_214,
D3DTIFF_INVALID_215,
D3DTIFF_INVALID_216,
D3DTIFF_INVALID_217,
D3DTIFF_INVALID_218,
D3DTIFF_INVALID_219,
D3DTIFF_INVALID_220,
D3DTIFF_INVALID_221,
D3DTIFF_INVALID_222,
D3DTIFF_INVALID_223,
D3DTIFF_INVALID_224,
D3DTIFF_INVALID_225,
D3DTIFF_INVALID_226,
D3DTIFF_INVALID_227,
D3DTIFF_INVALID_228,
D3DTIFF_INVALID_229,
D3DTIFF_INVALID_230,
D3DTIFF_INVALID_231,
D3DTIFF_INVALID_232,
D3DTIFF_INVALID_233,
D3DTIFF_INVALID_234,
D3DTIFF_INVALID_235,
D3DTIFF_INVALID_236,
D3DTIFF_INVALID_237,
D3DTIFF_INVALID_238,
D3DTIFF_INVALID_239,
D3DTIFF_INVALID_240,
D3DTIFF_INVALID_241,
D3DTIFF_INVALID_242,
D3DTIFF_INVALID_243,
D3DTIFF_INVALID_244,
D3DTIFF_INVALID_245,
D3DTIFF_INVALID_246,
D3DTIFF_INVALID_247,
D3DTIFF_INVALID_248,
D3DTIFF_INVALID_249,
D3DTIFF_INVALID_250,
D3DTIFF_INVALID_251,
D3DTIFF_INVALID_252,
D3DTIFF_INVALID_253,
D3DTIFF_INVALID_254,
D3DTIFF_INVALID_255,
D3DTTFF_PROJECTED // texcoords to be divided by COUNTth element
);
 
{ Macros to set texture coordinate format bits in the FVF id }
 
const
D3DTTFF_PROJECTED = TD3DTextureTransformFlags(256); // texcoords to be divided by COUNTth element
D3DFVF_TEXTUREFORMAT2 = 0; // Two floating point values
D3DFVF_TEXTUREFORMAT1 = 3; // One floating point value
D3DFVF_TEXTUREFORMAT3 = 1; // Three floating point values
D3DFVF_TEXTUREFORMAT4 = 2; // Four floating point values
 
// Macros to set texture coordinate format bits in the FVF id
function D3DFVF_TEXCOORDSIZE3(CoordIndex: DWORD): DWORD;
function D3DFVF_TEXCOORDSIZE2(CoordIndex: DWORD): DWORD;
function D3DFVF_TEXCOORDSIZE4(CoordIndex: DWORD): DWORD;
function D3DFVF_TEXCOORDSIZE1(CoordIndex: DWORD): DWORD;
 
D3DFVF_TEXTUREFORMAT2 = 0; // Two floating point values
D3DFVF_TEXTUREFORMAT1 = 3; // One floating point value
D3DFVF_TEXTUREFORMAT3 = 1; // Three floating point values
D3DFVF_TEXTUREFORMAT4 = 2; // Four floating point values
 
function D3DFVF_TEXCOORDSIZE3(CoordIndex: DWORD) : DWORD;
function D3DFVF_TEXCOORDSIZE2(CoordIndex: DWORD) : DWORD;
function D3DFVF_TEXCOORDSIZE4(CoordIndex: DWORD) : DWORD;
function D3DFVF_TEXCOORDSIZE1(CoordIndex: DWORD) : DWORD;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3dcaps.h
* Content: Direct3D capabilities include file
7368,46 → 4476,52
*
***************************************************************************)
 
(* Description of capabilities of transform *)
{ Description of capabilities of transform }
 
type
PD3DTransformCaps = ^TD3DTransformCaps;
TD3DTransformCaps = packed record
TD3DTransformCaps = record
dwSize: DWORD;
dwCaps: DWORD;
end;
 
D3DTRANSFORMCAPS = TD3DTransformCaps;
LPD3DTRANSFORMCAPS = PD3DTransformCaps;
 
const
D3DTRANSFORMCAPS_CLIP = $00000001; (* Will clip whilst transforming *)
D3DTRANSFORMCAPS_CLIP = $00000001; // Will clip whilst transforming
 
(* Description of capabilities of lighting *)
{ Description of capabilities of lighting }
 
type
PD3DLightingCaps = ^TD3DLightingCaps;
TD3DLightingCaps = packed record
TD3DLightingCaps = record
dwSize: DWORD;
dwCaps: DWORD; (* Lighting caps *)
dwLightingModel: DWORD; (* Lighting model - RGB or mono *)
dwNumLights: DWORD; (* Number of lights that can be handled *)
dwCaps: DWORD; // Lighting caps
dwLightingModel: DWORD; // Lighting model - RGB or mono
dwNumLights: DWORD; // Number of lights that can be handled
end;
 
D3DLIGHTINGCAPS = TD3DLightingCaps;
LPD3DLIGHTINGCAPS = PD3DLightingCaps;
 
const
D3DLIGHTINGMODEL_RGB = $00000001;
D3DLIGHTINGMODEL_MONO = $00000002;
D3DLIGHTINGMODEL_RGB = $00000001;
D3DLIGHTINGMODEL_MONO = $00000002;
 
D3DLIGHTCAPS_POINT = $00000001; (* Point lights supported *)
D3DLIGHTCAPS_SPOT = $00000002; (* Spot lights supported *)
D3DLIGHTCAPS_DIRECTIONAL = $00000004; (* Directional lights supported *)
D3DLIGHTCAPS_PARALLELPOINT = $00000008; (* Parallel point lights supported *)
D3DLIGHTCAPS_GLSPOT = $00000010; (* GL syle spot lights supported *)
D3DLIGHTCAPS_POINT = $00000001; // Point lights supported
D3DLIGHTCAPS_SPOT = $00000002; // Spot lights supported
D3DLIGHTCAPS_DIRECTIONAL = $00000004; // Directional lights supported
D3DLIGHTCAPS_PARALLELPOINT = $00000008; // Parallel point lights supported
D3DLIGHTCAPS_GLSPOT = $00000010; // GL syle spot lights supported
 
(* Description of capabilities for each primitive type *)
{ Description of capabilities for each primitive type }
 
type
PD3DPrimCaps = ^TD3DPrimCaps;
TD3DPrimCaps = packed record
TD3DPrimCaps = record
dwSize: DWORD;
dwMiscCaps: DWORD; (* Capability flags *)
dwMiscCaps: DWORD; // Capability flags
dwRasterCaps: DWORD;
dwZCmpCaps: DWORD;
dwSrcBlendCaps: DWORD;
7418,13 → 4532,16
dwTextureFilterCaps: DWORD;
dwTextureBlendCaps: DWORD;
dwTextureAddressCaps: DWORD;
dwStippleWidth: DWORD; (* maximum width and height of *)
dwStippleHeight: DWORD; (* of supported stipple (up to 32x32) *)
dwStippleWidth: DWORD; // maximum width and height of
dwStippleHeight: DWORD; // of supported stipple (up to 32x32)
end;
 
D3DPRIMCAPS = TD3DPrimCaps;
LPD3DPRIMCAPS = PD3DPrimCaps;
 
{ TD3DPrimCaps dwMiscCaps }
 
const
(* TD3DPrimCaps dwMiscCaps *)
 
D3DPMISCCAPS_MASKPLANES = $00000001;
D3DPMISCCAPS_MASKZ = $00000002;
D3DPMISCCAPS_LINEPATTERNREP = $00000004;
7433,34 → 4550,33
D3DPMISCCAPS_CULLCW = $00000020;
D3DPMISCCAPS_CULLCCW = $00000040;
 
(* TD3DPrimCaps dwRasterCaps *)
{ TD3DPrimCaps dwRasterCaps }
 
D3DPRASTERCAPS_DITHER = $00000001;
D3DPRASTERCAPS_ROP2 = $00000002;
D3DPRASTERCAPS_XOR = $00000004;
D3DPRASTERCAPS_PAT = $00000008;
D3DPRASTERCAPS_ZTEST = $00000010;
D3DPRASTERCAPS_SUBPIXEL = $00000020;
D3DPRASTERCAPS_SUBPIXELX = $00000040;
D3DPRASTERCAPS_FOGVERTEX = $00000080;
D3DPRASTERCAPS_FOGTABLE = $00000100;
D3DPRASTERCAPS_STIPPLE = $00000200;
D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT = $00000400;
D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT = $00000800;
D3DPRASTERCAPS_ANTIALIASEDGES = $00001000;
D3DPRASTERCAPS_MIPMAPLODBIAS = $00002000;
D3DPRASTERCAPS_ZBIAS = $00004000;
D3DPRASTERCAPS_ZBUFFERLESSHSR = $00008000;
D3DPRASTERCAPS_FOGRANGE = $00010000;
D3DPRASTERCAPS_ANISOTROPY = $00020000;
D3DPRASTERCAPS_WBUFFER = $00040000;
D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT = $00080000;
D3DPRASTERCAPS_WFOG = $00100000;
D3DPRASTERCAPS_ZFOG = $00200000;
D3DPRASTERCAPS_DITHER = $00000001;
D3DPRASTERCAPS_ROP2 = $00000002;
D3DPRASTERCAPS_XOR = $00000004;
D3DPRASTERCAPS_PAT = $00000008;
D3DPRASTERCAPS_ZTEST = $00000010;
D3DPRASTERCAPS_SUBPIXEL = $00000020;
D3DPRASTERCAPS_SUBPIXELX = $00000040;
D3DPRASTERCAPS_FOGVERTEX = $00000080;
D3DPRASTERCAPS_FOGTABLE = $00000100;
D3DPRASTERCAPS_STIPPLE = $00000200;
D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT = $00000400;
D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT = $00000800;
D3DPRASTERCAPS_ANTIALIASEDGES = $00001000;
D3DPRASTERCAPS_MIPMAPLODBIAS = $00002000;
D3DPRASTERCAPS_ZBIAS = $00004000;
D3DPRASTERCAPS_ZBUFFERLESSHSR = $00008000;
D3DPRASTERCAPS_FOGRANGE = $00010000;
D3DPRASTERCAPS_ANISOTROPY = $00020000;
D3DPRASTERCAPS_WBUFFER = $00040000;
D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT = $00080000;
D3DPRASTERCAPS_WFOG = $00100000;
D3DPRASTERCAPS_ZFOG = $00200000;
 
(* TD3DPrimCaps dwZCmpCaps, dwAlphaCmpCaps *)
{ TD3DPrimCaps dwZCmpCaps, dwAlphaCmpCaps }
 
const
D3DPCMPCAPS_NEVER = $00000001;
D3DPCMPCAPS_LESS = $00000002;
D3DPCMPCAPS_EQUAL = $00000004;
7470,7 → 4586,7
D3DPCMPCAPS_GREATEREQUAL = $00000040;
D3DPCMPCAPS_ALWAYS = $00000080;
 
(* TD3DPrimCaps dwSourceBlendCaps, dwDestBlendCaps *)
{ TD3DPrimCaps dwSourceBlendCaps, dwDestBlendCaps }
 
D3DPBLENDCAPS_ZERO = $00000001;
D3DPBLENDCAPS_ONE = $00000002;
7486,7 → 4602,7
D3DPBLENDCAPS_BOTHSRCALPHA = $00000800;
D3DPBLENDCAPS_BOTHINVSRCALPHA = $00001000;
 
(* TD3DPrimCaps dwShadeCaps *)
{ TD3DPrimCaps dwShadeCaps }
 
D3DPSHADECAPS_COLORFLATMONO = $00000001;
D3DPSHADECAPS_COLORFLATRGB = $00000002;
7513,92 → 4629,43
D3DPSHADECAPS_FOGGOURAUD = $00080000;
D3DPSHADECAPS_FOGPHONG = $00100000;
 
(* TD3DPrimCaps dwTextureCaps *)
{ TD3DPrimCaps dwTextureCaps }
 
(*
* Perspective-correct texturing is supported
*)
D3DPTEXTURECAPS_PERSPECTIVE = $00000001;
 
(*
* Power-of-2 texture dimensions are required
*)
D3DPTEXTURECAPS_POW2 = $00000002;
 
(*
* Alpha in texture pixels is supported
*)
D3DPTEXTURECAPS_ALPHA = $00000004;
 
(*
* Color-keyed textures are supported
*)
D3DPTEXTURECAPS_TRANSPARENCY = $00000008;
 
(*
* obsolete, see D3DPTADDRESSCAPS_BORDER
*)
D3DPTEXTURECAPS_BORDER = $00000010;
 
(*
* Only square textures are supported
*)
D3DPTEXTURECAPS_SQUAREONLY = $00000020;
 
(*
* Texture indices are not scaled by the texture size prior
* to interpolation.
*)
D3DPTEXTURECAPS_PERSPECTIVE = $00000001;
D3DPTEXTURECAPS_POW2 = $00000002;
D3DPTEXTURECAPS_ALPHA = $00000004;
D3DPTEXTURECAPS_TRANSPARENCY = $00000008;
D3DPTEXTURECAPS_BORDER = $00000010;
D3DPTEXTURECAPS_SQUAREONLY = $00000020;
D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE = $00000040;
D3DPTEXTURECAPS_ALPHAPALETTE = $00000080;
D3DPTEXTURECAPS_NONPOW2CONDITIONAL = $00000100;
D3DPTEXTURECAPS_PROJECTED = $00000400;
D3DPTEXTURECAPS_CUBEMAP = $00000800;
D3DPTEXTURECAPS_COLORKEYBLEND = $00001000;
 
(*
* Device can draw alpha from texture palettes
*)
D3DPTEXTURECAPS_ALPHAPALETTE = $00000080;
{ TD3DPrimCaps dwTextureFilterCaps }
 
(*
* Device can use non-POW2 textures if:
* 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage
* 2) D3DRS_WRAP(N) is zero for this texture's coordinates
* 3) mip mapping is not enabled (use magnification filter only)
*)
D3DPTEXTURECAPS_NONPOW2CONDITIONAL = $00000100;
D3DPTFILTERCAPS_NEAREST = $00000001;
D3DPTFILTERCAPS_LINEAR = $00000002;
D3DPTFILTERCAPS_MIPNEAREST = $00000004;
D3DPTFILTERCAPS_MIPLINEAR = $00000008;
D3DPTFILTERCAPS_LINEARMIPNEAREST = $00000010;
D3DPTFILTERCAPS_LINEARMIPLINEAR = $00000020;
 
// 0x00000200L unused
{ Device3 Min Filter }
 
(*
* Device can divide transformed texture coordinates by the
* COUNTth texture coordinate (can do D3DTTFF_PROJECTED)
*)
D3DPTEXTURECAPS_PROJECTED = $00000400;
 
(*
* Device can do cubemap textures
*)
D3DPTEXTURECAPS_CUBEMAP = $00000800;
 
D3DPTEXTURECAPS_COLORKEYBLEND = $00001000;
 
 
(* TD3DPrimCaps dwTextureFilterCaps *)
 
D3DPTFILTERCAPS_NEAREST = $00000001;
D3DPTFILTERCAPS_LINEAR = $00000002;
D3DPTFILTERCAPS_MIPNEAREST = $00000004;
D3DPTFILTERCAPS_MIPLINEAR = $00000008;
D3DPTFILTERCAPS_LINEARMIPNEAREST = $00000010;
D3DPTFILTERCAPS_LINEARMIPLINEAR = $00000020;
 
(* Device3 Min Filter *)
D3DPTFILTERCAPS_MINFPOINT = $00000100;
D3DPTFILTERCAPS_MINFLINEAR = $00000200;
D3DPTFILTERCAPS_MINFANISOTROPIC = $00000400;
 
(* Device3 Mip Filter *)
{ Device3 Mip Filter }
 
D3DPTFILTERCAPS_MIPFPOINT = $00010000;
D3DPTFILTERCAPS_MIPFLINEAR = $00020000;
 
(* Device3 Mag Filter *)
{ Device3 Mag Filter }
 
D3DPTFILTERCAPS_MAGFPOINT = $01000000;
D3DPTFILTERCAPS_MAGFLINEAR = $02000000;
D3DPTFILTERCAPS_MAGFANISOTROPIC = $04000000;
7605,7 → 4672,7
D3DPTFILTERCAPS_MAGFAFLATCUBIC = $08000000;
D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC = $10000000;
 
(* TD3DPrimCaps dwTextureBlendCaps *)
{ TD3DPrimCaps dwTextureBlendCaps }
 
D3DPTBLENDCAPS_DECAL = $00000001;
D3DPTBLENDCAPS_MODULATE = $00000002;
7614,9 → 4681,10
D3DPTBLENDCAPS_DECALMASK = $00000010;
D3DPTBLENDCAPS_MODULATEMASK = $00000020;
D3DPTBLENDCAPS_COPY = $00000040;
D3DPTBLENDCAPS_ADD = $00000080;
D3DPTBLENDCAPS_ADD = $00000080;
 
(* TD3DPrimCaps dwTextureAddressCaps *)
{ TD3DPrimCaps dwTextureAddressCaps }
 
D3DPTADDRESSCAPS_WRAP = $00000001;
D3DPTADDRESSCAPS_MIRROR = $00000002;
D3DPTADDRESSCAPS_CLAMP = $00000004;
7623,18 → 4691,18
D3DPTADDRESSCAPS_BORDER = $00000008;
D3DPTADDRESSCAPS_INDEPENDENTUV = $00000010;
 
(* D3DDEVICEDESC dwStencilCaps *)
{ D3DDEVICEDESC dwStencilCaps }
 
D3DSTENCILCAPS_KEEP = $00000001;
D3DSTENCILCAPS_ZERO = $00000002;
D3DSTENCILCAPS_REPLACE = $00000004;
D3DSTENCILCAPS_INCRSAT = $00000008;
D3DSTENCILCAPS_DECRSAT = $00000010;
D3DSTENCILCAPS_INVERT = $00000020;
D3DSTENCILCAPS_INCR = $00000040;
D3DSTENCILCAPS_DECR = $00000080;
D3DSTENCILCAPS_KEEP = $00000001;
D3DSTENCILCAPS_ZERO = $00000002;
D3DSTENCILCAPS_REPLACE = $00000004;
D3DSTENCILCAPS_INCRSAT = $00000008;
D3DSTENCILCAPS_DECRSAT = $00000010;
D3DSTENCILCAPS_INVERT = $00000020;
D3DSTENCILCAPS_INCR = $00000040;
D3DSTENCILCAPS_DECR = $00000080;
 
(* D3DDEVICEDESC dwTextureOpCaps *)
{ D3DDEVICEDESC dwTextureOpCaps }
 
D3DTEXOPCAPS_DISABLE = $00000001;
D3DTEXOPCAPS_SELECTARG1 = $00000002;
7661,202 → 4729,244
D3DTEXOPCAPS_BUMPENVMAPLUMINANCE = $00400000;
D3DTEXOPCAPS_DOTPRODUCT3 = $00800000;
 
(* D3DDEVICEDESC dwFVFCaps flags *)
{ D3DDEVICEDESC dwFVFCaps flags }
 
D3DFVFCAPS_TEXCOORDCOUNTMASK = $0000ffff; (* mask for texture coordinate count field *)
D3DFVFCAPS_DONOTSTRIPELEMENTS = $00080000; (* Device prefers that vertex elements not be stripped *)
D3DFVFCAPS_TEXCOORDCOUNTMASK = $0000ffff; // mask for texture coordinate count field
D3DFVFCAPS_DONOTSTRIPELEMENTS = $00080000; // Device prefers that vertex elements not be stripped
 
(*
* Description for a device.
* This is used to describe a device that is to be created or to query
* the current device.
*)
{ Description for a device. }
 
type
PD3DDeviceDesc = ^TD3DDeviceDesc;
TD3DDeviceDesc = packed record
dwSize: DWORD; (* Size of TD3DDeviceDesc structure *)
dwFlags: DWORD; (* Indicates which fields have valid data *)
dcmColorModel: TD3DColorModel; (* Color model of device *)
dwDevCaps: DWORD; (* Capabilities of device *)
dtcTransformCaps: TD3DTransformCaps; (* Capabilities of transform *)
bClipping: BOOL; (* Device can do 3D clipping *)
dlcLightingCaps: TD3DLightingCaps; (* Capabilities of lighting *)
PD3DDeviceDesc_DX3 = ^TD3DDeviceDesc_DX3;
TD3DDeviceDesc_DX3 = record
dwSize: DWORD; // Size of D3DDEVICEDESC structure
dwFlags: DWORD; // Indicates which fields have valid data
dcmColorModel: TD3DColorModel; // Color model of device
dwDevCaps: DWORD; // Capabilities of device
dtcTransformCaps: TD3DTransformCaps; // Capabilities of transform
bClipping: BOOL; // Device can do 3D clipping
dlcLightingCaps: TD3DLightingCaps; // Capabilities of lighting
dpcLineCaps: TD3DPrimCaps;
dpcTriCaps: TD3DPrimCaps;
dwDeviceRenderBitDepth: DWORD; (* One of DDBB_8, 16, etc.. *)
dwDeviceZBufferBitDepth: DWORD; (* One of DDBD_16, 32, etc.. *)
dwMaxBufferSize: DWORD; (* Maximum execute buffer size *)
dwMaxVertexCount: DWORD; (* Maximum vertex count *)
// *** New fields for DX5 *** //
dwDeviceRenderBitDepth: DWORD; // One of DDBB_8, 16, etc..
dwDeviceZBufferBitDepth: DWORD; // One of DDBD_16, 32, etc..
dwMaxBufferSize: DWORD; // Maximum execute buffer size
dwMaxVertexCount: DWORD; // Maximum vertex count
end;
 
PD3DDeviceDesc_DX5 = ^TD3DDeviceDesc_DX5;
TD3DDeviceDesc_DX5 = record
dwSize: DWORD; // Size of D3DDEVICEDESC structure
dwFlags: DWORD; // Indicates which fields have valid data
dcmColorModel: TD3DColorModel; // Color model of device
dwDevCaps: DWORD; // Capabilities of device
dtcTransformCaps: TD3DTransformCaps; // Capabilities of transform
bClipping: BOOL; // Device can do 3D clipping
dlcLightingCaps: TD3DLightingCaps; // Capabilities of lighting
dpcLineCaps: TD3DPrimCaps;
dpcTriCaps: TD3DPrimCaps;
dwDeviceRenderBitDepth: DWORD; // One of DDBB_8, 16, etc..
dwDeviceZBufferBitDepth: DWORD; // One of DDBD_16, 32, etc..
dwMaxBufferSize: DWORD; // Maximum execute buffer size
dwMaxVertexCount: DWORD; // Maximum vertex count
// New fields for DX5
// Width and height caps are 0 for legacy HALs.
dwMinTextureWidth, dwMinTextureHeight : DWORD;
dwMaxTextureWidth, dwMaxTextureHeight : DWORD;
dwMinStippleWidth, dwMaxStippleWidth : DWORD;
dwMinStippleHeight, dwMaxStippleHeight : DWORD;
end;
 
PD3DDeviceDesc_DX6 = ^TD3DDeviceDesc_DX6;
TD3DDeviceDesc_DX6 = record
dwSize: DWORD; // Size of D3DDEVICEDESC structure
dwFlags: DWORD; // Indicates which fields have valid data
dcmColorModel: TD3DColorModel; // Color model of device
dwDevCaps: DWORD; // Capabilities of device
dtcTransformCaps: TD3DTransformCaps; // Capabilities of transform
bClipping: BOOL; // Device can do 3D clipping
dlcLightingCaps: TD3DLightingCaps; // Capabilities of lighting
dpcLineCaps: TD3DPrimCaps;
dpcTriCaps: TD3DPrimCaps;
dwDeviceRenderBitDepth: DWORD; // One of DDBB_8, 16, etc..
dwDeviceZBufferBitDepth: DWORD; // One of DDBD_16, 32, etc..
dwMaxBufferSize: DWORD; // Maximum execute buffer size
dwMaxVertexCount: DWORD; // Maximum vertex count
 
// New fields for DX5
// Width and height caps are 0 for legacy HALs.
dwMinTextureWidth, dwMinTextureHeight : DWORD;
dwMaxTextureWidth, dwMaxTextureHeight : DWORD;
dwMinStippleWidth, dwMaxStippleWidth : DWORD;
dwMinStippleHeight, dwMaxStippleHeight : DWORD;
 
// New fields for DX6
dwMaxTextureRepeat : DWORD;
dwMaxTextureAspectRatio : DWORD;
dwMaxAnisotropy : DWORD;
dwMaxTextureRepeat: DWORD;
dwMaxTextureAspectRatio: DWORD;
dwMaxAnisotropy: DWORD;
 
// Guard band that the rasterizer can accommodate
// Screen-space vertices inside this space but outside the viewport
// will get clipped properly.
dvGuardBandLeft : TD3DValue;
dvGuardBandTop : TD3DValue;
dvGuardBandRight : TD3DValue;
dvGuardBandBottom : TD3DValue;
dvGuardBandLeft: TD3DValue;
dvGuardBandTop: TD3DValue;
dvGuardBandRight: TD3DValue;
dvGuardBandBottom: TD3DValue;
dvExtentsAdjust: TD3DValue;
dwStencilCaps: DWORD;
dwFVFCaps: DWORD; // low 4 bits: 0 implies TLVERTEX only, 1..8 imply FVF aware
dwTextureOpCaps: DWORD;
wMaxTextureBlendStages: Word;
wMaxSimultaneousTextures: Word;
end;
 
dvExtentsAdjust : TD3DValue;
dwStencilCaps : DWORD;
{$IFDEF DirectX3}
TD3DDeviceDesc = TD3DDeviceDesc_DX3;
PD3DDeviceDesc = PD3DDeviceDesc_DX3;
{$ENDIF}{$IFDEF DirectX5}
TD3DDeviceDesc = TD3DDeviceDesc_DX5;
PD3DDeviceDesc = PD3DDeviceDesc_DX5;
{$ENDIF}{$IFDEF DirectX6}
TD3DDeviceDesc = TD3DDeviceDesc_DX6;
PD3DDeviceDesc = PD3DDeviceDesc_DX6;
{$ENDIF}{$IFDEF DirectX7}
TD3DDeviceDesc = TD3DDeviceDesc_DX6;
PD3DDeviceDesc = PD3DDeviceDesc_DX6;
{$ENDIF}
 
dwFVFCaps : DWORD; (* low 4 bits: 0 implies TLVERTEX only, 1..8 imply FVF aware *)
dwTextureOpCaps : DWORD;
wMaxTextureBlendStages : WORD;
wMaxSimultaneousTextures : WORD;
end;
D3DDEVICEDESC = TD3DDeviceDesc;
LPD3DDEVICEDESC = PD3DDeviceDesc;
 
PD3DDeviceDesc7 = ^TD3DDeviceDesc7;
TD3DDeviceDesc7 = packed record
dwDevCaps: DWORD; (* Capabilities of device *)
dpcLineCaps: TD3DPrimCaps;
dpcTriCaps: TD3DPrimCaps;
dwDeviceRenderBitDepth: DWORD; (* One of DDBB_8, 16, etc.. *)
dwDeviceZBufferBitDepth: DWORD; (* One of DDBD_16, 32, etc.. *)
TD3DDeviceDesc7 = record
dwDevCaps: DWORD;
dpcLineCaps: TD3DPrimCaps;
dpcTriCaps: TD3DPrimCaps;
dwDeviceRenderBitDepth: DWORD;
dwDeviceZBufferBitDepth: DWORD;
 
dwMinTextureWidth, dwMinTextureHeight: DWORD;
dwMaxTextureWidth, dwMaxTextureHeight: DWORD;
dwMinTextureWidth: DWORD;
dwMinTextureHeight: DWORD;
dwMaxTextureWidth: DWORD;
dwMaxTextureHeight: DWORD;
 
dwMaxTextureRepeat: DWORD;
dwMaxTextureAspectRatio: DWORD;
dwMaxAnisotropy: DWORD;
dwMaxTextureRepeat: DWORD;
dwMaxTextureAspectRatio: DWORD;
dwMaxAnisotropy: DWORD;
 
dvGuardBandLeft: TD3DValue;
dvGuardBandTop: TD3DValue;
dvGuardBandRight: TD3DValue;
dvGuardBandBottom: TD3DValue;
dvGuardBandLeft: TD3DValue;
dvGuardBandTop: TD3DValue;
dvGuardBandRight: TD3DValue;
dvGuardBandBottom: TD3DValue;
 
dvExtentsAdjust: TD3DValue;
dwStencilCaps: DWORD;
dvExtentsAdjust: TD3DValue;
dwStencilCaps: DWORD;
 
dwFVFCaps: DWORD;
dwTextureOpCaps: DWORD;
wMaxTextureBlendStages: WORD;
wMaxSimultaneousTextures: WORD;
dwFVFCaps: DWORD;
dwTextureOpCaps: DWORD;
wMaxTextureBlendStages: Word;
wMaxSimultaneousTextures: Word;
 
dwMaxActiveLights: DWORD;
dvMaxVertexW: TD3DValue;
deviceGUID: TGUID;
dwMaxActiveLights: DWORD;
dvMaxVertexW: TD3DValue;
deviceGUID: TGUID;
 
wMaxUserClipPlanes: WORD;
wMaxVertexBlendMatrices: WORD;
wMaxUserClipPlanes: Word;
wMaxVertexBlendMatrices: Word;
 
dwVertexProcessingCaps: DWORD;
dwVertexProcessingCaps: DWORD;
 
dwReserved1: DWORD;
dwReserved2: DWORD;
dwReserved3: DWORD;
dwReserved4: DWORD;
dwReserved1: DWORD;
dwReserved2: DWORD;
dwReserved3: DWORD;
dwReserved4: DWORD;
end;
 
const
D3DDEVICEDESCSIZE = sizeof(TD3DDeviceDesc);
D3DDEVICEDESC7SIZE = sizeof(TD3DDeviceDesc7);
 
type
TD3DEnumDevicesCallbackA = function (lpGuid: PGUID; // nil for the default device
lpDeviceDescription: PAnsiChar; lpDeviceName: PAnsiChar;
var lpD3DHWDeviceDesc: TD3DDeviceDesc;
var lpD3DHELDeviceDesc: TD3DDeviceDesc;
lpContext : pointer) : HResult; stdcall;
TD3DEnumDevicesCallback = TD3DEnumDevicesCallbackA;
TD3DEnumDevicesCallback = function(const lpGuid: TGUID;
lpDeviceDescription: LPSTR; lpDeviceName: LPSTR;
const lpD3DHWDeviceDesc: TD3DDeviceDesc;
const lpD3DHELDeviceDesc: TD3DDeviceDesc;
lpUserArg: Pointer): HResult; stdcall;
 
TD3DEnumDevicesCallback7A = function (
lpDeviceDescription: PAnsiChar; lpDeviceName: PAnsiChar;
const lpD3DDeviceDesc: TD3DDeviceDesc7; lpContext: Pointer) : HResult; stdcall;
TD3DEnumDevicesCallback7 = TD3DEnumDevicesCallback7A;
LPD3DENUMDEVICESCALLBACK = TD3DEnumDevicesCallback;
 
(* TD3DDeviceDesc dwFlags indicating valid fields *)
TD3DEnumDevicesCallback7 = function(lpDeviceDescription: LPSTR; lpDeviceName: LPSTR;
const lpD3DDeviceDesc: TD3DDeviceDesc7; lpUserArg: Pointer): HResult; stdcall;
 
LPD3DENUMDEVICESCALLBACK7 = TD3DEnumDevicesCallback7;
 
{ TD3DDeviceDesc dwFlags indicating valid fields }
 
const
D3DDD_COLORMODEL = $00000001; (* dcmColorModel is valid *)
D3DDD_DEVCAPS = $00000002; (* dwDevCaps is valid *)
D3DDD_TRANSFORMCAPS = $00000004; (* dtcTransformCaps is valid *)
D3DDD_LIGHTINGCAPS = $00000008; (* dlcLightingCaps is valid *)
D3DDD_BCLIPPING = $00000010; (* bClipping is valid *)
D3DDD_LINECAPS = $00000020; (* dpcLineCaps is valid *)
D3DDD_TRICAPS = $00000040; (* dpcTriCaps is valid *)
D3DDD_DEVICERENDERBITDEPTH = $00000080; (* dwDeviceRenderBitDepth is valid *)
D3DDD_DEVICEZBUFFERBITDEPTH = $00000100; (* dwDeviceZBufferBitDepth is valid *)
D3DDD_MAXBUFFERSIZE = $00000200; (* dwMaxBufferSize is valid *)
D3DDD_MAXVERTEXCOUNT = $00000400; (* dwMaxVertexCount is valid *)
D3DDD_COLORMODEL = $00000001; // dcmColorModel is valid
D3DDD_DEVCAPS = $00000002; // dwDevCaps is valid
D3DDD_TRANSFORMCAPS = $00000004; // dtcTransformCaps is valid
D3DDD_LIGHTINGCAPS = $00000008; // dlcLightingCaps is valid
D3DDD_BCLIPPING = $00000010; // bClipping is valid
D3DDD_LINECAPS = $00000020; // dpcLineCaps is valid
D3DDD_TRICAPS = $00000040; // dpcTriCaps is valid
D3DDD_DEVICERENDERBITDEPTH = $00000080; // dwDeviceRenderBitDepth is valid
D3DDD_DEVICEZBUFFERBITDEPTH = $00000100; // dwDeviceZBufferBitDepth is valid
D3DDD_MAXBUFFERSIZE = $00000200; // dwMaxBufferSize is valid
D3DDD_MAXVERTEXCOUNT = $00000400; // dwMaxVertexCount is valid
 
(* TD3DDeviceDesc dwDevCaps flags *)
{ TD3DDeviceDesc dwDevCaps flags }
 
D3DDEVCAPS_FLOATTLVERTEX = $00000001; (* Device accepts floating point *)
(* for post-transform vertex data *)
D3DDEVCAPS_SORTINCREASINGZ = $00000002; (* Device needs data sorted for increasing Z*)
D3DDEVCAPS_SORTDECREASINGZ = $00000004; (* Device needs data sorted for decreasing Z*)
D3DDEVCAPS_SORTEXACT = $00000008; (* Device needs data sorted exactly *)
D3DDEVCAPS_FLOATTLVERTEX = $00000001; // Device accepts floating point
// for post-transform vertex data
D3DDEVCAPS_SORTINCREASINGZ = $00000002; // Device needs data sorted for increasing Z
D3DDEVCAPS_SORTDECREASINGZ = $00000004; // Device needs data sorted for decreasing Z
D3DDEVCAPS_SORTEXACT = $00000008; // Device needs data sorted exactly
 
D3DDEVCAPS_EXECUTESYSTEMMEMORY = $00000010; (* Device can use execute buffers from system memory *)
D3DDEVCAPS_EXECUTEVIDEOMEMORY = $00000020; (* Device can use execute buffers from video memory *)
D3DDEVCAPS_TLVERTEXSYSTEMMEMORY = $00000040; (* Device can use TL buffers from system memory *)
D3DDEVCAPS_TLVERTEXVIDEOMEMORY = $00000080; (* Device can use TL buffers from video memory *)
D3DDEVCAPS_TEXTURESYSTEMMEMORY = $00000100; (* Device can texture from system memory *)
D3DDEVCAPS_TEXTUREVIDEOMEMORY = $00000200; (* Device can texture from device memory *)
D3DDEVCAPS_DRAWPRIMTLVERTEX = $00000400; (* Device can draw TLVERTEX primitives *)
D3DDEVCAPS_CANRENDERAFTERFLIP = $00000800; (* Device can render without waiting for flip to complete *)
D3DDEVCAPS_TEXTURENONLOCALVIDMEM = $00001000; (* Device can texture from nonlocal video memory *)
D3DDEVCAPS_DRAWPRIMITIVES2 = $00002000; (* Device can support DrawPrimitives2 *)
D3DDEVCAPS_SEPARATETEXTUREMEMORIES = $00004000; (* Device is texturing from separate memory pools *)
D3DDEVCAPS_DRAWPRIMITIVES2EX = $00008000; (* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*)
D3DDEVCAPS_HWTRANSFORMANDLIGHT = $00010000; (* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also *)
D3DDEVCAPS_CANBLTSYSTONONLOCAL = $00020000; (* Device supports a Tex Blt from system memory to non-local vidmem *)
D3DDEVCAPS_HWRASTERIZATION = $00080000; (* Device has HW acceleration for rasterization *)
D3DDEVCAPS_EXECUTESYSTEMMEMORY = $00000010; // Device can use execute buffers from system memory
D3DDEVCAPS_EXECUTEVIDEOMEMORY = $00000020; // Device can use execute buffers from video memory
D3DDEVCAPS_TLVERTEXSYSTEMMEMORY = $00000040; // Device can use TL buffers from system memory
D3DDEVCAPS_TLVERTEXVIDEOMEMORY = $00000080; // Device can use TL buffers from video memory
D3DDEVCAPS_TEXTURESYSTEMMEMORY = $00000100; // Device can texture from system memory
D3DDEVCAPS_TEXTUREVIDEOMEMORY = $00000200; // Device can texture from device memory
D3DDEVCAPS_DRAWPRIMTLVERTEX = $00000400; // Device can draw TLVERTEX primitives
D3DDEVCAPS_CANRENDERAFTERFLIP = $00000800; // Device can render without waiting for flip to complete
D3DDEVCAPS_TEXTURENONLOCALVIDMEM = $00001000; // Device can texture from nonlocal video memory
D3DDEVCAPS_DRAWPRIMITIVES2 = $00002000; // Device can support DrawPrimitives2
D3DDEVCAPS_SEPARATETEXTUREMEMORIES = $00004000; // Device is texturing from separate memory pools
D3DDEVCAPS_DRAWPRIMITIVES2EX = $00008000; // Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver
D3DDEVCAPS_HWTRANSFORMANDLIGHT = $00010000; // Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also
D3DDEVCAPS_CANBLTSYSTONONLOCAL = $00020000; // Device supports a Tex Blt from system memory to non-local vidmem
D3DDEVCAPS_HWRASTERIZATION = $00080000; // Device has HW acceleration for rasterization
 
(*
* These are the flags in the D3DDEVICEDESC7.dwVertexProcessingCaps field
*)
{ TD3DDeviceDesc7.dwVertexProcessingCaps field }
 
(* device can do texgen *)
D3DVTXPCAPS_TEXGEN = $00000001;
(* device can do IDirect3DDevice7 colormaterialsource ops *)
D3DVTXPCAPS_MATERIALSOURCE7 = $00000002;
(* device can do vertex fog *)
D3DVTXPCAPS_VERTEXFOG = $00000004;
(* device can do directional lights *)
D3DVTXPCAPS_DIRECTIONALLIGHTS = $00000008;
(* device can do positional lights (includes point and spot) *)
D3DVTXPCAPS_POSITIONALLIGHTS = $00000010;
(* device can do local viewer *)
D3DVTXPCAPS_LOCALVIEWER = $00000020;
D3DVTXPCAPS_TEXGEN = $00000001;
D3DVTXPCAPS_MATERIALSOURCE7 = $00000002;
D3DVTXPCAPS_VERTEXFOG = $00000004;
D3DVTXPCAPS_DIRECTIONALLIGHTS = $00000008;
D3DVTXPCAPS_POSITIONALLIGHTS = $00000010;
D3DVTXPCAPS_LOCALVIEWER = $00000020;
 
D3DFDS_COLORMODEL = $00000001; (* Match color model *)
D3DFDS_GUID = $00000002; (* Match guid *)
D3DFDS_HARDWARE = $00000004; (* Match hardware/software *)
D3DFDS_TRIANGLES = $00000008; (* Match in triCaps *)
D3DFDS_LINES = $00000010; (* Match in lineCaps *)
D3DFDS_MISCCAPS = $00000020; (* Match primCaps.dwMiscCaps *)
D3DFDS_RASTERCAPS = $00000040; (* Match primCaps.dwRasterCaps *)
D3DFDS_ZCMPCAPS = $00000080; (* Match primCaps.dwZCmpCaps *)
D3DFDS_ALPHACMPCAPS = $00000100; (* Match primCaps.dwAlphaCmpCaps *)
D3DFDS_SRCBLENDCAPS = $00000200; (* Match primCaps.dwSourceBlendCaps *)
D3DFDS_DSTBLENDCAPS = $00000400; (* Match primCaps.dwDestBlendCaps *)
D3DFDS_SHADECAPS = $00000800; (* Match primCaps.dwShadeCaps *)
D3DFDS_TEXTURECAPS = $00001000; (* Match primCaps.dwTextureCaps *)
D3DFDS_TEXTUREFILTERCAPS = $00002000; (* Match primCaps.dwTextureFilterCaps *)
D3DFDS_TEXTUREBLENDCAPS = $00004000; (* Match primCaps.dwTextureBlendCaps *)
D3DFDS_TEXTUREADDRESSCAPS = $00008000; (* Match primCaps.dwTextureBlendCaps *)
D3DFDS_COLORMODEL = $00000001; // Match color model
D3DFDS_GUID = $00000002; // Match guid
D3DFDS_HARDWARE = $00000004; // Match hardware/software
D3DFDS_TRIANGLES = $00000008; // Match in triCaps
D3DFDS_LINES = $00000010; // Match in lineCaps
D3DFDS_MISCCAPS = $00000020; // Match primCaps.dwMiscCaps
D3DFDS_RASTERCAPS = $00000040; // Match primCaps.dwRasterCaps
D3DFDS_ZCMPCAPS = $00000080; // Match primCaps.dwZCmpCaps
D3DFDS_ALPHACMPCAPS = $00000100; // Match primCaps.dwAlphaCmpCaps
D3DFDS_SRCBLENDCAPS = $00000200; // Match primCaps.dwSourceBlendCaps
D3DFDS_DSTBLENDCAPS = $00000400; // Match primCaps.dwDestBlendCaps
D3DFDS_SHADECAPS = $00000800; // Match primCaps.dwShadeCaps
D3DFDS_TEXTURECAPS = $00001000; // Match primCaps.dwTextureCaps
D3DFDS_TEXTUREFILTERCAPS = $00002000; // Match primCaps.dwTextureFilterCaps
D3DFDS_TEXTUREBLENDCAPS = $00004000; // Match primCaps.dwTextureBlendCaps
D3DFDS_TEXTUREADDRESSCAPS = $00008000; // Match primCaps.dwTextureBlendCaps
 
(*
* FindDevice arguments
*)
{ FindDevice arguments }
 
type
PD3DFindDeviceSearch = ^TD3DFindDeviceSearch;
TD3DFindDeviceSearch = packed record
TD3DFindDeviceSearch = record
dwSize: DWORD;
dwFlags: DWORD;
bHardware: BOOL;
7866,103 → 4976,133
dpcPrimCaps: TD3DPrimCaps;
end;
 
D3DFINDDEVICESEARCH = TD3DFindDeviceSearch;
LPD3DFINDDEVICESEARCH = PD3DFindDeviceSearch;
 
PD3DFindDeviceResult = ^TD3DFindDeviceResult;
TD3DFindDeviceResult = packed record
TD3DFindDeviceResult = record
dwSize: DWORD;
guid: TGUID; (* guid which matched *)
ddHwDesc: TD3DDeviceDesc; (* hardware TD3DDeviceDesc *)
ddSwDesc: TD3DDeviceDesc; (* software TD3DDeviceDesc *)
guid: TGUID; // guid which matched
ddHwDesc: TD3DDeviceDesc; // hardware TD3DDeviceDesc
ddSwDesc: TD3DDeviceDesc; // software TD3DDeviceDesc
end;
 
(*
* Description of execute buffer.
*)
D3DFINDDEVICERESULT = TD3DFindDeviceResult;
LPD3DFINDDEVICERESULT = PD3DFindDeviceResult;
 
{ Description of execute buffer. }
 
PD3DExecuteBufferDesc = ^TD3DExecuteBufferDesc;
TD3DExecuteBufferDesc = packed record
dwSize: DWORD; (* size of this structure *)
dwFlags: DWORD; (* flags indicating which fields are valid *)
dwCaps: DWORD; (* capabilities of execute buffer *)
dwBufferSize: DWORD; (* size of execute buffer data *)
lpData: Pointer; (* pointer to actual data *)
TD3DExecuteBufferDesc = record
dwSize: DWORD; // size of this structure
dwFlags: DWORD; // flags indicating which fields are valid
dwCaps: DWORD; // capabilities of execute buffer
dwBufferSize: DWORD; // size of execute buffer data
lpData: Pointer; // pointer to actual data
end;
 
(* D3DEXECUTEBUFFER dwFlags indicating valid fields *)
D3DEXECUTEBUFFERDESC = TD3DExecuteBufferDesc;
LPD3DEXECUTEBUFFERDESC = PD3DExecuteBufferDesc;
 
{ D3DEXECUTEBUFFER dwFlags indicating valid fields }
 
const
D3DDEB_BUFSIZE = $00000001; (* buffer size valid *)
D3DDEB_CAPS = $00000002; (* caps valid *)
D3DDEB_LPDATA = $00000004; (* lpData valid *)
D3DDEB_BUFSIZE = $00000001; // buffer size valid
D3DDEB_CAPS = $00000002; // caps valid
D3DDEB_LPDATA = $00000004; // lpData valid
 
(* D3DEXECUTEBUFFER dwCaps *)
{ D3DEXECUTEBUFFER dwCaps }
 
D3DDEBCAPS_SYSTEMMEMORY = $00000001; (* buffer in system memory *)
D3DDEBCAPS_VIDEOMEMORY = $00000002; (* buffer in device memory *)
D3DDEBCAPS_MEM = (D3DDEBCAPS_SYSTEMMEMORY or D3DDEBCAPS_VIDEOMEMORY);
D3DDEBCAPS_SYSTEMMEMORY = $00000001; // buffer in system memory
D3DDEBCAPS_VIDEOMEMORY = $00000002; // buffer in device memory
D3DDEBCAPS_MEM = D3DDEBCAPS_SYSTEMMEMORY or D3DDEBCAPS_VIDEOMEMORY;
 
type
 
{ TD3DDevInfo_TextureManager }
 
PD3DDevInfo_TextureManager = ^TD3DDevInfo_TextureManager;
TD3DDevInfo_TextureManager = packed record
bThrashing: BOOL; (* indicates if thrashing *)
dwApproxBytesDownloaded: DWORD; (* Approximate number of bytes downloaded by texture manager *)
dwNumEvicts: DWORD; (* number of textures evicted *)
dwNumVidCreates: DWORD; (* number of textures created in video memory *)
dwNumTexturesUsed: DWORD; (* number of textures used *)
dwNumUsedTexInVid: DWORD; (* number of used textures present in video memory *)
dwWorkingSet: DWORD; (* number of textures in video memory *)
dwWorkingSetBytes: DWORD; (* number of bytes in video memory *)
dwTotalManaged: DWORD; (* total number of managed textures *)
dwTotalBytes: DWORD; (* total number of bytes of managed textures *)
dwLastPri: DWORD; (* priority of last texture evicted *)
TD3DDevInfo_TextureManager = record
bThrashing: BOOL; // indicates if thrashing
dwApproxBytesDownloaded: DWORD; // Approximate number of bytes downloaded by texture manager
dwNumEvicts: DWORD; // number of textures evicted
dwNumVidCreates: DWORD; // number of textures created in video memory
dwNumTexturesUsed: DWORD; // number of textures used
dwNumUsedTexInVid: DWORD; // number of used textures present in video memory
dwWorkingSet: DWORD; // number of textures in video memory
dwWorkingSetBytes: DWORD; // number of bytes in video memory
dwTotalManaged: DWORD; // total number of managed textures
dwTotalBytes: DWORD; // total number of bytes of managed textures
dwLastPri: DWORD; // priority of last texture evicted
end;
 
D3DDEVINFO_TEXTUREMANAGER = TD3DDevInfo_TextureManager;
LPD3DDEVINFO_TEXTUREMANAGER = PD3DDevInfo_TextureManager;
 
{ TD3DDevInfo_Texturing }
 
PD3DDevInfo_Texturing = ^TD3DDevInfo_Texturing;
TD3DDevInfo_Texturing = packed record
dwNumLoads: DWORD; (* counts Load() API calls *)
dwApproxBytesLoaded: DWORD; (* Approximate number bytes loaded via Load() *)
dwNumPreLoads: DWORD; (* counts PreLoad() API calls *)
dwNumSet: DWORD; (* counts SetTexture() API calls *)
dwNumCreates: DWORD; (* counts texture creates *)
dwNumDestroys: DWORD; (* counts texture destroys *)
dwNumSetPriorities: DWORD; (* counts SetPriority() API calls *)
dwNumSetLODs: DWORD; (* counts SetLOD() API calls *)
dwNumLocks: DWORD; (* counts number of texture locks *)
dwNumGetDCs: DWORD; (* counts number of GetDCs to textures *)
TD3DDevInfo_Texturing = record
dwNumLoads: DWORD; // counts Load() API calls
dwApproxBytesLoaded: DWORD; // Approximate number bytes loaded via Load()
dwNumPreLoads: DWORD; // counts PreLoad() API calls
dwNumSet: DWORD; // counts SetTexture() API calls
dwNumCreates: DWORD; // counts texture creates
dwNumDestroys: DWORD; // counts texture destroys
dwNumSetPriorities: DWORD; // counts SetPriority() API calls
dwNumSetLODs: DWORD; // counts SetLOD() API calls
dwNumLocks: DWORD; // counts number of texture locks
dwNumGetDCs: DWORD; // counts number of GetDCs to textures
end;
 
D3DDEVINFO_TEXTURING = TD3DDevInfo_Texturing;
LPD3DDEVINFO_TEXTURING = PD3DDevInfo_Texturing;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3d.h
* File: d3d.h
* Content: Direct3D include file
*
****************************************************************************)
***************************************************************************)
 
function D3DErrorString(Value: HResult) : string;
{ Interface IID's }
 
(*
* Interface IID's
*)
 
const
(*
* Internal Guid to distinguish requested MMX from MMX being used as an RGB rasterizer
*)
IID_IDirect3DRampDevice: TGUID =
(D1:$F2086B20;D2:$259F;D3:$11CF;D4:($A3,$1A,$00,$AA,$00,$B9,$33,$56));
IID_IDirect3DRGBDevice: TGUID =
(D1:$A4665C60;D2:$2673;D3:$11CF;D4:($A3,$1A,$00,$AA,$00,$B9,$33,$56));
IID_IDirect3DHALDevice: TGUID =
(D1:$84E63dE0;D2:$46AA;D3:$11CF;D4:($81,$6F,$00,$00,$C0,$20,$15,$6E));
IID_IDirect3DMMXDevice: TGUID =
(D1:$881949a1;D2:$d6f3;D3:$11d0;D4:($89,$ab,$00,$a0,$c9,$05,$41,$29));
IID_IDirect3D: TGUID = '{3BBA0080-2421-11CF-A31A-00AA00B93356}';
IID_IDirect3D2: TGUID = '{6AAE1EC1-662A-11D0-889D-00AA00BBB76A}';
IID_IDirect3D3: TGUID = '{BB223240-E72B-11D0-A9B4-00AA00C0993E}';
IID_IDirect3D7: TGUID = '{F5049E77-4861-11D2-A407-00A0C90629A8}';
 
IID_IDirect3DRefDevice: TGUID =
(D1:$50936643;D2:$13e9;D3:$11d1;D4:($89,$aa,$00,$a0,$c9,$05,$41,$29));
IID_IDirect3DNullDevice: TGUID =
(D1:$8767df22;D2:$bacc;D3:$11d1;D4:($89,$69,$00,$a0,$c9,$06,$29,$a8));
IID_IDirect3DRampDevice: TGUID = '{F2086B20-259F-11CF-A31A-00AA00B93356}';
IID_IDirect3DRGBDevice: TGUID = '{A4665C60-2673-11CF-A31A-00AA00B93356}';
IID_IDirect3DHALDevice: TGUID = '{84E63DE0-46AA-11CF-816F-0000C020156E}';
IID_IDirect3DMMXDevice: TGUID = '{881949A1-D6F3-11D0-89AB-00A0C9054129}';
IID_IDirect3DRefDevice: TGUID = '{50936643-13E9-11D1-89AA-00A0C9054129}';
IID_IDirect3DNullDevice: TGUID = '{8767DF22-BACC-11D1-8969-00A0C90629A8}';
IID_IDirect3DTnLHalDevice: TGUID = '{F5049E78-4861-11D2-A407-00A0C90629A8}';
 
IID_IDirect3DTnLHalDevice: TGUID = '{f5049e78-4861-11d2-a407-00a0c90629a8}';
IID_IDirect3DDevice: TGUID = '{64108800-957D-11D0-89AB-00A0C9054129}';
IID_IDirect3DDevice2: TGUID = '{93281501-8CF8-11D0-89AB-00A0C9054129}';
IID_IDirect3DDevice3: TGUID = '{B0AB3B60-33D7-11D1-A981-00C04FD7B174}';
IID_IDirect3DDevice7: TGUID = '{F5049E79-4861-11D2-A407-00A0C90629A8}';
IID_IDirect3DTexture: TGUID ='{2CDCD9E0-25A0-11CF-A31A-00AA00B93356}';
IID_IDirect3DTexture2: TGUID = '{93281502-8CF8-11D0-89AB-00A0C9054129}';
IID_IDirect3DLight: TGUID = '{4417C142-33AD-11CF-816F-0000C020156E}';
IID_IDirect3DMaterial: TGUID = '{4417C144-33AD-11CF-816F-0000C020156E}';
IID_IDirect3DMaterial2: TGUID = '{93281503-8CF8-11D0-89AB-00A0C9054129}';
IID_IDirect3DMaterial3: TGUID = '{CA9C46F4-D3C5-11D1-B75A-00600852B312}';
IID_IDirect3DExecuteBuffer: TGUID = '{4417C145-33AD-11CF-816F-0000C020156E}';
IID_IDirect3DViewport: TGUID = '{4417C146-33AD-11CF-816F-0000C020156E}';
IID_IDirect3DViewport2: TGUID = '{93281500-8CF8-11D0-89AB-00A0C9054129}';
IID_IDirect3DViewport3: TGUID = '{B0AB3B61-33D7-11D1-A981-00C04FD7B174}';
IID_IDirect3DVertexBuffer: TGUID = '{7A503555-4A83-11D1-A5DB-00A0C90367F8}';
IID_IDirect3DVertexBuffer7: TGUID = '{F5049E7D-4861-11D2-A407-00A0C90629A8}';
 
{ Data structures }
 
type
IDirect3D = interface;
IDirect3D2 = interface;
7985,1302 → 5125,564
IDirect3DVertexBuffer = interface;
IDirect3DVertexBuffer7 = interface;
 
(*
* Direct3D interfaces
*)
 
IDirect3D = interface (IUnknown)
IDirect3D = interface(IUnknown)
['{3BBA0080-2421-11CF-A31A-00AA00B93356}']
(*** IDirect3D methods ***)
function Initialize (lpREFIID: {REFIID} PGUID) : HResult; stdcall;
function EnumDevices (lpEnumDevicesCallback: TD3DEnumDevicesCallback;
lpUserArg: Pointer) : HResult; stdcall;
function CreateLight (var lplpDirect3Dlight: IDirect3DLight;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateMaterial (var lplpDirect3DMaterial: IDirect3DMaterial;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateViewport (var lplpD3DViewport: IDirect3DViewport;
pUnkOuter: IUnknown) : HResult; stdcall;
function FindDevice (var lpD3DFDS: TD3DFindDeviceSearch;
var lpD3DFDR: TD3DFindDeviceResult) : HResult; stdcall;
// IDirect3D methods
function Initialize(const lpREFIID: TGUID): HResult; stdcall;
function EnumDevices(lpEnumDevicesCallback: TD3DEnumDevicesCallback;
lpUserArg: Pointer): HResult; stdcall;
function CreateLight(out lplpDirect3Dlight: IDirect3DLight;
pUnkOuter: IUnknown): HResult; stdcall;
function CreateMaterial(out lplpDirect3DMaterial: IDirect3DMaterial;
pUnkOuter: IUnknown): HResult; stdcall;
function CreateViewport(out lplpD3DViewport: IDirect3DViewport;
pUnkOuter: IUnknown): HResult; stdcall;
function FindDevice(const lpD3DFDS: TD3DFindDeviceSearch;
var lpD3DFDR: TD3DFindDeviceResult): HResult; stdcall;
end;
 
IDirect3D2 = interface (IUnknown)
['{6aae1ec1-662a-11d0-889d-00aa00bbb76a}']
(*** IDirect3D2 methods ***)
IDirect3D2 = interface(IUnknown)
['{6AAE1EC1-662A-11D0-889D-00AA00BBB76A}']
// IDirect3D methods
function EnumDevices(lpEnumDevicesCallback: TD3DEnumDevicesCallback;
lpUserArg: pointer) : HResult; stdcall;
function CreateLight (var lplpDirect3Dlight: IDirect3DLight;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateMaterial (var lplpDirect3DMaterial2: IDirect3DMaterial2;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateViewport (var lplpD3DViewport2: IDirect3DViewport2;
pUnkOuter: IUnknown) : HResult; stdcall;
function FindDevice (var lpD3DFDS: TD3DFindDeviceSearch;
var lpD3DFDR: TD3DFindDeviceResult) : HResult; stdcall;
function CreateDevice (const rclsid: TRefClsID; lpDDS: IDirectDrawSurface;
out lplpD3DDevice2: IDirect3DDevice2) : HResult; stdcall;
lpUserArg: Pointer): HResult; stdcall;
function CreateLight(out lplpDirect3Dlight: IDirect3DLight;
pUnkOuter: IUnknown): HResult; stdcall;
function CreateMaterial(out lplpDirect3DMaterial: IDirect3DMaterial2;
pUnkOuter: IUnknown): HResult; stdcall;
function CreateViewport(out lplpD3DViewport: IDirect3DViewport2;
pUnkOuter: IUnknown ): HResult; stdcall;
function FindDevice(const lpD3DFDS: TD3DFindDeviceSearch;
var lpD3DFDR: TD3DFindDeviceResult): HResult; stdcall;
// IDirect3D2 methods
function CreateDevice(const rclsid: TGUID; lpDDS: IDirectDrawSurface;
out lplpD3DDevice2: IDirect3DDevice2): HResult; stdcall;
end;
 
IDirect3D3 = interface (IUnknown)
['{bb223240-e72b-11d0-a9b4-00aa00c0993e}']
(*** IDirect3D3 methods ***)
IDirect3D3 = interface(IUnknown)
['{BB223240-E72B-11D0-A9B4-00AA00C0993E}']
// IDirect3D methods
function EnumDevices(lpEnumDevicesCallback: TD3DEnumDevicesCallback;
lpUserArg: pointer) : HResult; stdcall;
function CreateLight (var lplpDirect3Dlight: IDirect3DLight;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateMaterial (var lplpDirect3DMaterial3: IDirect3DMaterial3;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreateViewport (var lplpD3DViewport3: IDirect3DViewport3;
pUnkOuter: IUnknown) : HResult; stdcall;
function FindDevice (var lpD3DFDS: TD3DFindDeviceSearch;
var lpD3DFDR: TD3DFindDeviceResult) : HResult; stdcall;
function CreateDevice (const rclsid: TRefClsID; lpDDS: IDirectDrawSurface4;
out lplpD3DDevice: IDirect3DDevice3; pUnkOuter: IUnknown) : HResult; stdcall;
function CreateVertexBuffer (var lpVBDesc: TD3DVertexBufferDesc;
var lpD3DVertexBuffer: IDirect3DVertexBuffer;
dwFlags: DWORD; pUnkOuter: IUnknown) : HResult; stdcall;
function EnumZBufferFormats (const riidDevice: TRefClsID; lpEnumCallback:
TD3DEnumPixelFormatsCallback; lpContext: pointer) : HResult; stdcall;
function EvictManagedTextures : HResult; stdcall;
lpUserArg: Pointer): HResult; stdcall;
function CreateLight(out lplpDirect3Dlight: IDirect3DLight;
pUnkOuter: IUnknown): HResult; stdcall;
function CreateMaterial(out lplpDirect3DMaterial: IDirect3DMaterial3;
pUnkOuter: IUnknown): HResult; stdcall;
function CreateViewport(out lplpD3DViewport: IDirect3DViewport3;
pUnkOuter: IUnknown ): HResult; stdcall;
function FindDevice(const lpD3DFDS: TD3DFindDeviceSearch;
var lpD3DFDR: TD3DFindDeviceResult): HResult; stdcall;
// IDirect3D2 methods
function CreateDevice(const rclsid: TGUID; lpDDS: IDirectDrawSurface4;
out lplpD3DDevice2: IDirect3DDevice3; pUnkOuter: IUnknown): HResult; stdcall;
// IDirect3D3 methods
function CreateVertexBuffer(const lpVBDesc: TD3DVertexBufferDesc;
out lpD3DVertexBuffer: IDirect3DVertexBuffer; dwFlags: DWORD; pUnkOuter: IUnknown): HResult; stdcall;
function EnumZBufferFormats(const riidDevice: TGUID; lpEnumCallback: TD3DEnumPixelFormatsCallback;
lpContext: Pointer): HResult; stdcall;
function EvictManagedTextures: HResult; stdcall;
end;
 
IDirect3D7 = interface (IUnknown)
['{f5049e77-4861-11d2-a407-00a0c90629a8}']
(*** IDirect3D7 methods ***)
IDirect3D7 = interface(IUnknown)
['{F5049E77-4861-11D2-A407-00A0C90629A8}']
// IDirect3D7 methods
function EnumDevices(lpEnumDevicesCallback: TD3DEnumDevicesCallback7;
lpUserArg: pointer) : HResult; stdcall;
function CreateDevice (const rclsid: TGUID; lpDDS: IDirectDrawSurface7;
out lplpD3DDevice: IDirect3DDevice7) : HResult; stdcall;
function CreateVertexBuffer (const lpVBDesc: TD3DVertexBufferDesc;
out lplpD3DVertexBuffer: IDirect3DVertexBuffer7;
dwFlags: DWORD) : HResult; stdcall;
function EnumZBufferFormats (const riidDevice: TGUID; lpEnumCallback:
TD3DEnumPixelFormatsCallback; lpContext: pointer) : HResult; stdcall;
function EvictManagedTextures : HResult; stdcall;
lpUserArg: Pointer): HResult; stdcall;
function CreateDevice(const rclsid: TGUID; lpDDS: IDirectDrawSurface7;
out lplpD3DDevice7: IDirect3DDevice7): HResult; stdcall;
function CreateVertexBuffer(const lpVBDesc: TD3DVertexBufferDesc;
out lpD3DVertexBuffer: IDirect3DVertexBuffer7; dwFlags: DWORD): HResult; stdcall;
function EnumZBufferFormats(const riidDevice: TGUID; lpEnumCallback: TD3DEnumPixelFormatsCallback;
lpContext: Pointer): HResult; stdcall;
function EvictManagedTextures: HResult; stdcall;
end;
(*
* Direct3D Device interfaces
*)
 
IDirect3DDevice = interface (IUnknown)
['{64108800-957d-11d0-89ab-00a0c9054129}']
(*** IDirect3DDevice methods ***)
function Initialize (lpd3d: IDirect3D; lpGUID: PGUID;
var lpd3ddvdesc: TD3DDeviceDesc) : HResult; stdcall;
function GetCaps (var lpD3DHWDevDesc: TD3DDeviceDesc;
var lpD3DHELDevDesc: TD3DDeviceDesc) : HResult; stdcall;
function SwapTextureHandles (lpD3DTex1: IDirect3DTexture;
lpD3DTex2: IDirect3DTexture) : HResult; stdcall;
function CreateExecuteBuffer (var lpDesc: TD3DExecuteBufferDesc ;
var lplpDirect3DExecuteBuffer: IDirect3DExecuteBuffer;
pUnkOuter: IUnknown) : HResult; stdcall;
function GetStats (var lpD3DStats: TD3DStats) : HResult; stdcall;
function Execute (lpDirect3DExecuteBuffer: IDirect3DExecuteBuffer;
lpDirect3DViewport: IDirect3DViewport; dwFlags: DWORD) : HResult; stdcall;
function AddViewport (lpDirect3DViewport: IDirect3DViewport) : HResult; stdcall;
function DeleteViewport (lpDirect3DViewport: IDirect3DViewport) : HResult; stdcall;
function NextViewport (lpDirect3DViewport: IDirect3DViewport;
var lplpDirect3DViewport: IDirect3DViewport; dwFlags: DWORD) : HResult; stdcall;
function Pick (lpDirect3DExecuteBuffer: IDirect3DExecuteBuffer;
IDirect3DDevice = interface(IUnknown)
['{64108800-957D-11D0-89AB-00A0C9054129}']
// IDirect3DDevice methods
function Initialize(lpd3d: IDirect3D; const lpGUID: TGUID;
const lpd3ddvdesc: TD3DDeviceDesc): HResult; stdcall;
function GetCaps(var lpD3DHWDevDesc: TD3DDeviceDesc;
var lpD3DHELDevDesc: TD3DDeviceDesc): HResult; stdcall;
function SwapTextureHandles(lpD3DTex1: IDirect3DTexture;
lpD3DTex2: IDirect3DTexture): HResult; stdcall;
function CreateExecuteBuffer(const lpDesc: TD3DExecuteBufferDesc;
out lplpDirect3DExecuteBuffer: IDirect3DExecuteBuffer;
pUnkOuter: IUnknown): HResult; stdcall;
function GetStats(var lpD3DStats: TD3DStats): HResult; stdcall;
function Execute(lpDirect3DExecuteBuffer: IDirect3DExecuteBuffer;
lpDirect3DViewport: IDirect3DViewport; dwFlags: DWORD): HResult; stdcall;
function AddViewport(lpDirect3DViewport: IDirect3DViewport): HResult; stdcall;
function DeleteViewport(lpDirect3DViewport: IDirect3DViewport): HResult; stdcall;
function NextViewport(lpDirect3DViewport: IDirect3DViewport;
out lplpDirect3DViewport: IDirect3DViewport; dwFlags: DWORD): HResult; stdcall;
function Pick(lpDirect3DExecuteBuffer: IDirect3DExecuteBuffer;
lpDirect3DViewport: IDirect3DViewport; dwFlags: DWORD;
var lpRect: TD3DRect) : HResult; stdcall;
function GetPickRecords (var lpCount: DWORD;
var lpD3DPickRec: TD3DPickRecord) : HResult; stdcall;
function EnumTextureFormats (lpd3dEnumTextureProc:
TD3DEnumTextureFormatsCallback; lpArg: Pointer) :
HResult; stdcall;
function CreateMatrix (var lpD3DMatHandle: TD3DMatrixHandle) : HResult; stdcall;
function SetMatrix (d3dMatHandle: TD3DMatrixHandle;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function GetMatrix (var lpD3DMatHandle: TD3DMatrixHandle;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function DeleteMatrix (d3dMatHandle: TD3DMatrixHandle) : HResult; stdcall;
const lpRect: TD3DRect): HResult; stdcall;
function GetPickRecords(var lpCount: DWORD;
var lpD3DPickRec: TD3DPickRecord): HResult; stdcall;
function EnumTextureFormats(lpd3dEnumTextureProc: TD3DEnumTextureFormatsCalback;
lpArg: Pointer): HResult; stdcall;
function CreateMatrix(var lpD3DMatHandle: TD3DMatrixHandle): HResult; stdcall;
function SetMatrix(d3dMatHandle: TD3DMatrixHandle;
const lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function GetMatrix(lpD3DMatHandle: TD3DMatrixHandle;
var lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function DeleteMatrix(d3dMatHandle: TD3DMatrixHandle): HResult; stdcall;
function BeginScene: HResult; stdcall;
function EndScene: HResult; stdcall;
function GetDirect3D (var lpD3D: IDirect3D) : HResult; stdcall;
function GetDirect3D(out lpD3D: IDirect3D): HResult; stdcall;
end;
 
IDirect3DDevice2 = interface (IUnknown)
['{93281501-8cf8-11d0-89ab-00a0c9054129}']
(*** IDirect3DDevice2 methods ***)
function GetCaps (var lpD3DHWDevDesc: TD3DDeviceDesc;
var lpD3DHELDevDesc: TD3DDeviceDesc) : HResult; stdcall;
function SwapTextureHandles (lpD3DTex1: IDirect3DTexture2;
lpD3DTex2: IDirect3DTexture2) : HResult; stdcall;
function GetStats (var lpD3DStats: TD3DStats) : HResult; stdcall;
function AddViewport (lpDirect3DViewport2: IDirect3DViewport2) : HResult; stdcall;
function DeleteViewport (lpDirect3DViewport: IDirect3DViewport2) : HResult; stdcall;
function NextViewport (lpDirect3DViewport: IDirect3DViewport2;
var lplpDirect3DViewport: IDirect3DViewport2; dwFlags: DWORD) :
HResult; stdcall;
function EnumTextureFormats (
lpd3dEnumTextureProc: TD3DEnumTextureFormatsCallback; lpArg: Pointer) :
HResult; stdcall;
IDirect3DDevice2 = interface(IUnknown)
['{93281501-8CF8-11D0-89AB-00A0C9054129}']
// IDirect3DDevice2 methods
function GetCaps(var lpD3DHWDevDesc: TD3DDeviceDesc;
var lpD3DHELDevDesc: TD3DDeviceDesc): HResult; stdcall;
function SwapTextureHandles(lpD3DTex1: IDirect3DTexture2;
lpD3DTex2: IDirect3DTexture2): HResult; stdcall;
function GetStats(var lpD3DStats: TD3DStats): HResult; stdcall;
function AddViewport(lpDirect3DViewport: IDirect3DViewport2): HResult; stdcall;
function DeleteViewport(lpDirect3DViewport: IDirect3DViewport2): HResult; stdcall;
function NextViewport(lpDirect3DViewport: IDirect3DViewport2;
out lplpDirect3DViewport: IDirect3DViewport2; dwFlags: DWORD): HResult; stdcall;
function EnumTextureFormats(lpd3dEnumTextureProc: TD3DEnumTextureFormatsCalback;
lpArg: Pointer): HResult; stdcall;
function BeginScene: HResult; stdcall;
function EndScene: HResult; stdcall;
function GetDirect3D (var lpD3D: IDirect3D2) : HResult; stdcall;
 
(*** DrawPrimitive API ***)
function SetCurrentViewport (lpd3dViewport2: IDirect3DViewport2)
: HResult; stdcall;
function GetCurrentViewport (var lplpd3dViewport2: IDirect3DViewport2)
: HResult; stdcall;
 
function SetRenderTarget (lpNewRenderTarget: IDirectDrawSurface)
: HResult; stdcall;
function GetRenderTarget (var lplpNewRenderTarget: IDirectDrawSurface)
: HResult; stdcall;
 
function Begin_ (d3dpt: TD3DPrimitiveType; d3dvt: TD3DVertexType;
dwFlags: DWORD) : HResult; stdcall;
function BeginIndexed (dptPrimitiveType: TD3DPrimitiveType; dvtVertexType:
TD3DVertexType; lpvVertices: pointer; dwNumVertices: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function Vertex (lpVertexType: pointer) : HResult; stdcall;
function Index (wVertexIndex: WORD) : HResult; stdcall;
function End_ (dwFlags: DWORD) : HResult; stdcall;
 
function GetRenderState (dwRenderStateType: TD3DRenderStateType;
var lpdwRenderState) : HResult; stdcall;
function SetRenderState (dwRenderStateType: TD3DRenderStateType;
dwRenderState: DWORD) : HResult; stdcall;
function GetLightState (dwLightStateType: TD3DLightStateType;
var lpdwLightState) : HResult; stdcall;
function SetLightState (dwLightStateType: TD3DLightStateType;
dwLightState: DWORD) : HResult; stdcall;
function SetTransform (dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function GetTransform (dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function MultiplyTransform (dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
 
function DrawPrimitive (dptPrimitiveType: TD3DPrimitiveType;
dvtVertexType: TD3DVertexType; var lpvVertices; dwVertexCount,
dwFlags: DWORD) : HResult; stdcall;
function DrawIndexedPrimitive (dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; lpvVertices: pointer; dwVertexCount: DWORD;
var lpwIndices: WORD; dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
function SetClipStatus (var lpD3DClipStatus: TD3DClipStatus) : HResult; stdcall;
function GetClipStatus (var lpD3DClipStatus: TD3DClipStatus) : HResult; stdcall;
function GetDirect3D(out lpD3D: IDirect3D2): HResult; stdcall;
function SetCurrentViewport(lpd3dViewport2: IDirect3DViewport2): HResult; stdcall;
function GetCurrentViewport(out lplpd3dViewport2: IDirect3DViewport2): HResult; stdcall;
function SetRenderTarget(lpNewRenderTarget: IDirectDrawSurface): HResult; stdcall;
function GetRenderTarget(out lplpNewRenderTarget: IDirectDrawSurface): HResult; stdcall;
function Begin_(d3dpt: TD3DPrimitiveType; d3dvt: TD3DVertexType;
dwFlags: DWORD): HResult; stdcall;
function BeginIndexed(dptPrimitiveType: TD3DPrimitiveType; dvtVertexType:
TD3DVertexType; const lpvVertices; dwNumVertices: DWORD;
dwFlags: DWORD): HResult; stdcall;
function Vertex(const lpVertexType): HResult; stdcall;
function Index(wVertexIndex: WORD): HResult; stdcall;
function End_(dwFlags: DWORD): HResult; stdcall;
function GetRenderState(dwRenderStateType: TD3DRenderStateType;
var lpdwRenderState: DWORD): HResult; stdcall;
function SetRenderState(dwRenderStateType: TD3DRenderStateType;
dwRenderState: DWORD): HResult; stdcall;
function GetLightState(dwLightStateType: TD3DLightStateType;
var lpdwLightState: DWORD): HResult; stdcall;
function SetLightState(dwLightStateType: TD3DLightStateType;
dwLightState: DWORD): HResult; stdcall;
function SetTransform(dtstTransformStateType: TD3DTransformStateType;
const lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function GetTransform(dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function MultiplyTransform(dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function DrawPrimitive(dptPrimitiveType: TD3DPrimitiveType;
dvtVertexType: TD3DVertexType; const lpvVertices; dwVertexCount,
dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitive(dptPrimitiveType: TD3DPrimitiveType;
dvtVertexType: TD3DVertexType; const lpvVertices;
dwVertexCount: DWORD; const dwIndices; dwIndexCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function SetClipStatus(const lpD3DClipStatus: TD3DClipStatus): HResult; stdcall;
function GetClipStatus(var lpD3DClipStatus: TD3DClipStatus): HResult; stdcall;
end;
 
IDirect3DDevice3 = interface (IUnknown)
['{b0ab3b60-33d7-11d1-a981-00c04fd7b174}']
(*** IDirect3DDevice2 methods ***)
function GetCaps (var lpD3DHWDevDesc: TD3DDeviceDesc;
var lpD3DHELDevDesc: TD3DDeviceDesc) : HResult; stdcall;
function GetStats (var lpD3DStats: TD3DStats) : HResult; stdcall;
function AddViewport (lpDirect3DViewport: IDirect3DViewport3) : HResult; stdcall;
function DeleteViewport (lpDirect3DViewport: IDirect3DViewport3) : HResult; stdcall;
function NextViewport (lpDirect3DViewport: IDirect3DViewport3;
var lplpAnotherViewport: IDirect3DViewport3; dwFlags: DWORD) : HResult; stdcall;
function EnumTextureFormats (
lpd3dEnumPixelProc: TD3DEnumPixelFormatsCallback; lpArg: Pointer) :
HResult; stdcall;
IDirect3DDevice3 = interface(IUnknown)
['{B0AB3B60-33D7-11D1-A981-00C04FD7B174}']
// IDirect3DDevice3 methods
function GetCaps(var lpD3DHWDevDesc: TD3DDeviceDesc;
var lpD3DHELDevDesc: TD3DDeviceDesc): HResult; stdcall;
function GetStats(var lpD3DStats: TD3DStats): HResult; stdcall;
function AddViewport(lpDirect3DViewport: IDirect3DViewport3): HResult; stdcall;
function DeleteViewport(lpDirect3DViewport: IDirect3DViewport3): HResult; stdcall;
function NextViewport(lpDirect3DViewport: IDirect3DViewport3;
out lplpDirect3DViewport: IDirect3DViewport3; dwFlags: DWORD): HResult; stdcall;
function EnumTextureFormats(lpd3dEnumPixelProc: TD3DEnumPixelFormatsCallback;
lpArg: Pointer): HResult; stdcall;
function BeginScene: HResult; stdcall;
function EndScene: HResult; stdcall;
function GetDirect3D (var lpD3D: IDirect3D3) : HResult; stdcall;
function SetCurrentViewport (lpd3dViewport: IDirect3DViewport3)
: HResult; stdcall;
function GetCurrentViewport (var lplpd3dViewport: IDirect3DViewport3)
: HResult; stdcall;
function SetRenderTarget (lpNewRenderTarget: IDirectDrawSurface4)
: HResult; stdcall;
function GetRenderTarget (var lplpNewRenderTarget: IDirectDrawSurface4)
: HResult; stdcall;
function Begin_ (d3dpt: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function BeginIndexed (dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; lpvVertices: pointer; dwNumVertices: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function Vertex (lpVertex: pointer) : HResult; stdcall;
function Index (wVertexIndex: WORD) : HResult; stdcall;
function End_ (dwFlags: DWORD) : HResult; stdcall;
function GetRenderState (dwRenderStateType: TD3DRenderStateType;
var lpdwRenderState) : HResult; stdcall;
function SetRenderState (dwRenderStateType: TD3DRenderStateType;
dwRenderState: DWORD) : HResult; stdcall;
function GetLightState (dwLightStateType: TD3DLightStateType;
var lpdwLightState) : HResult; stdcall;
function SetLightState (dwLightStateType: TD3DLightStateType;
dwLightState: DWORD) : HResult; stdcall;
function SetTransform (dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function GetTransform (dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function MultiplyTransform (dtstTransformStateType: TD3DTransformStateType;
var lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function DrawPrimitive (dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; const lpvVertices;
dwVertexCount, dwFlags: DWORD) : HResult; stdcall;
function DrawIndexedPrimitive (dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; const lpvVertices; dwVertexCount: DWORD;
var lpwIndices: WORD; dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
function SetClipStatus (var lpD3DClipStatus: TD3DClipStatus) : HResult; stdcall;
function GetClipStatus (var lpD3DClipStatus: TD3DClipStatus) : HResult; stdcall;
function DrawPrimitiveStrided (dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc : DWORD;
var lpVertexArray: TD3DDrawPrimitiveStridedData;
dwVertexCount, dwFlags: DWORD) : HResult; stdcall;
function DrawIndexedPrimitiveStrided (dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc : DWORD;
var lpVertexArray: TD3DDrawPrimitiveStridedData; dwVertexCount: DWORD;
var lpwIndices: WORD; dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
function DrawPrimitiveVB (dptPrimitiveType: TD3DPrimitiveType;
lpd3dVertexBuffer: IDirect3DVertexBuffer;
dwStartVertex, dwNumVertices, dwFlags: DWORD) : HResult; stdcall;
function DrawIndexedPrimitiveVB (dptPrimitiveType: TD3DPrimitiveType;
lpd3dVertexBuffer: IDirect3DVertexBuffer; var lpwIndices: WORD;
dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
function ComputeSphereVisibility (var lpCenters: TD3DVector;
var lpRadii: TD3DValue; dwNumSpheres, dwFlags: DWORD;
var lpdwReturnValues: DWORD) : HResult; stdcall;
function GetTexture (dwStage: DWORD; var lplpTexture: IDirect3DTexture2)
: HResult; stdcall;
function SetTexture (dwStage: DWORD; lplpTexture: IDirect3DTexture2)
: HResult; stdcall;
function GetTextureStageState (dwStage: DWORD;
dwState: TD3DTextureStageStateType; var lpdwValue: DWORD) : HResult; stdcall;
function SetTextureStageState (dwStage: DWORD;
dwState: TD3DTextureStageStateType; lpdwValue: DWORD) : HResult; stdcall;
function ValidateDevice (var lpdwExtraPasses: DWORD) : HResult; stdcall;
end;
 
IDirect3DDevice7 = interface (IUnknown)
['{f5049e79-4861-11d2-a407-00a0c90629a8}']
(*** IDirect3DDevice7 methods ***)
function GetCaps(out lpD3DDevDesc: TD3DDeviceDesc7) : HResult; stdcall;
function EnumTextureFormats(lpd3dEnumPixelProc: TD3DEnumPixelFormatsCallback; lpArg: Pointer) : HResult; stdcall;
function BeginScene: HResult; stdcall;
function EndScene: HResult; stdcall;
function GetDirect3D(out lpD3D: IDirect3D7) : HResult; stdcall;
function SetRenderTarget(lpNewRenderTarget: IDirectDrawSurface7; dwFlags: DWORD) : HResult; stdcall;
function GetRenderTarget(out lplpRenderTarget: IDirectDrawSurface7) : HResult; stdcall;
function Clear(dwCount: DWORD; lpRects: PD3DRect; dwFlags, dwColor: DWORD; dvZ: TD3DValue; dwStencil: DWORD) : HResult; stdcall;
function GetDirect3D(out lpD3D: IDirect3D3): HResult; stdcall;
function SetCurrentViewport(lpd3dViewport: IDirect3DViewport3): HResult; stdcall;
function GetCurrentViewport(out lplpd3dViewport: IDirect3DViewport3): HResult; stdcall;
function SetRenderTarget(lpNewRenderTarget: IDirectDrawSurface4): HResult; stdcall;
function GetRenderTarget(out lplpNewRenderTarget: IDirectDrawSurface4): HResult; stdcall;
function Begin_(d3dpt: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
dwFlags: DWORD): HResult; stdcall;
function BeginIndexed(dptPrimitiveType: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
const lpvVertices; dwNumVertices: DWORD; dwFlags: DWORD): HResult; stdcall;
function Vertex(const lpVertexType): HResult; stdcall;
function Index(wVertexIndex: WORD): HResult; stdcall;
function End_(dwFlags: DWORD): HResult; stdcall;
function GetRenderState(dwRenderStateType: TD3DRenderStateType;
var lpdwRenderState: DWORD): HResult; stdcall;
function SetRenderState(dwRenderStateType: TD3DRenderStateType;
dwRenderState: DWORD): HResult; stdcall;
function GetLightState(dwLightStateType: TD3DLightStateType;
var lpdwLightState: DWORD): HResult; stdcall;
function SetLightState(dwLightStateType: TD3DLightStateType;
dwLightState: DWORD): HResult; stdcall;
function SetTransform(dtstTransformStateType: TD3DTransformStateType;
const lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
const lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function GetTransform(dtstTransformStateType: TD3DTransformStateType;
out lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function SetViewport(const lpViewport: TD3DViewport7) : HResult; stdcall;
var lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function MultiplyTransform(dtstTransformStateType: TD3DTransformStateType;
const lpD3DMatrix: TD3DMatrix) : HResult; stdcall;
function GetViewport(out lpViewport: TD3DViewport7) : HResult; stdcall;
function SetMaterial(const lpMaterial: TD3DMaterial7) : HResult; stdcall;
function GetMaterial(out lpMaterial: TD3DMaterial7) : HResult; stdcall;
function SetLight(dwLightIndex: DWORD; const lpLight: TD3DLight7) : HResult; stdcall;
function GetLight(dwLightIndex: DWORD; out lpLight: TD3DLight7) : HResult; stdcall;
function SetRenderState(dwRenderStateType: TD3DRenderStateType; dwRenderState: DWORD) : HResult; stdcall;
function GetRenderState(dwRenderStateType: TD3DRenderStateType; out dwRenderState: DWORD) : HResult; stdcall;
function BeginStateBlock : HResult; stdcall;
function EndStateBlock(out lpdwBlockHandle: DWORD) : HResult; stdcall;
function PreLoad(lpddsTexture: IDirectDrawSurface7) : HResult; stdcall;
var lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function DrawPrimitive(dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; const lpvVertices; dwVertexCount,
dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitive(dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; const lpvVertices;
dwVertexCount, dwFlags: DWORD) : HResult; stdcall;
function DrawIndexedPrimitive(dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc: DWORD; const lpvVertices; dwVertexCount: DWORD;
const lpwIndices; dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
function SetClipStatus(const lpD3DClipStatus: TD3DClipStatus) : HResult; stdcall;
function GetClipStatus(out lpD3DClipStatus: TD3DClipStatus) : HResult; stdcall;
dwVertexCount: DWORD; const dwIndices; dwIndexCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function SetClipStatus(const lpD3DClipStatus: TD3DClipStatus): HResult; stdcall;
function GetClipStatus(var lpD3DClipStatus: TD3DClipStatus): HResult; stdcall;
function DrawPrimitiveStrided(dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc : DWORD;
const lpVertexArray: TD3DDrawPrimitiveStridedData;
dwVertexCount, dwFlags: DWORD) : HResult; stdcall;
dwVertexTypeDesc: DWORD; const lpVertexArray;
dwVertexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitiveStrided(dptPrimitiveType: TD3DPrimitiveType;
dwVertexTypeDesc : DWORD;
const lpVertexArray: TD3DDrawPrimitiveStridedData; dwVertexCount: DWORD;
var lpwIndices: WORD; dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
dwVertexTypeDesc: DWORD; const lpVertexArray;
dwVertexCount: DWORD; const lpwIndices; dwIndexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function DrawPrimitiveVB(dptPrimitiveType: TD3DPrimitiveType;
lpd3dVertexBuffer: IDirect3DVertexBuffer7;
dwStartVertex, dwNumVertices, dwFlags: DWORD) : HResult; stdcall;
lpd3dVertexBuffer: IDirect3DVertexBuffer; dwStartVertex, dwNumVertices: DWORD;
dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitiveVB(dptPrimitiveType: TD3DPrimitiveType;
lpd3dVertexBuffer: IDirect3DVertexBuffer7; dwStartVertex, dwNumVertices: DWORD;
var lpwIndices: WORD; dwIndexCount, dwFlags: DWORD) : HResult; stdcall;
function ComputeSphereVisibility(const lpCenters: TD3DVector;
var lpRadii: TD3DValue; dwNumSpheres, dwFlags: DWORD;
var lpdwReturnValues: DWORD) : HResult; stdcall;
function GetTexture(dwStage: DWORD; out lplpTexture: IDirectDrawSurface7) : HResult; stdcall;
function SetTexture(dwStage: DWORD; lpTexture: IDirectDrawSurface7) : HResult; stdcall;
function GetTextureStageState(dwStage: DWORD;
dwState: TD3DTextureStageStateType; out lpdwValue: DWORD) : HResult; stdcall;
function SetTextureStageState(dwStage: DWORD;
dwState: TD3DTextureStageStateType; lpdwValue: DWORD) : HResult; stdcall;
function ValidateDevice(out lpdwExtraPasses: DWORD) : HResult; stdcall;
function ApplyStateBlock(dwBlockHandle: DWORD) : HResult; stdcall;
function CaptureStateBlock(dwBlockHandle: DWORD) : HResult; stdcall;
function DeleteStateBlock(dwBlockHandle: DWORD) : HResult; stdcall;
function CreateStateBlock(d3dsbType: TD3DStateBlockType; out lpdwBlockHandle: DWORD) : HResult; stdcall;
function Load(lpDestTex: IDirectDrawSurface7; lpDestPoint: PPoint;
lpSrcTex: IDirectDrawSurface7; lprcSrcRect: PRect; dwFlags: DWORD) : HResult; stdcall;
function LightEnable(dwLightIndex: DWORD; bEnable: BOOL) : HResult; stdcall;
function GetLightEnable(dwLightIndex: DWORD; out bEnable: BOOL) : HResult; stdcall;
function SetClipPlane(dwIndex: DWORD; var pPlaneEquation: TD3DValue) : HResult; stdcall;
function GetClipPlane(dwIndex: DWORD; out pPlaneEquation: TD3DValue) : HResult; stdcall;
function GetInfo(dwDevInfoID: DWORD; pDevInfoStruct: Pointer; dwSize: DWORD) : HResult; stdcall;
lpd3dVertexBuffer: IDirect3DVertexBuffer; const lpwIndices; dwIndexCount: DWORD;
dwFlags: DWORD): HResult; stdcall;
function ComputeSphereVisibility(const lpCenters; const lpRadii;
dwNumSpheres: DWORD; dwFlags: DWORD; var lpdwReturnValues): HResult; stdcall;
function GetTexture(dwStage: DWORD; out lplpTexture: IDirect3DTexture2): HResult; stdcall;
function SetTexture(dwStage: DWORD; lpTexture: IDirect3DTexture2): HResult; stdcall;
function GetTextureStageState(dwStage: DWORD; dwState: TD3DTextureStagesStateType;
var lpdwValue: DWORD): HResult; stdcall;
function SetTextureStageState(dwStage: DWORD; dwState: TD3DTextureStagesStateType;
lpdwValue: DWORD): HResult; stdcall;
function ValidateDevice(var lpdwPasses: DWORD): HResult; stdcall;
end;
(*
* Execute Buffer interface
*)
 
IDirect3DExecuteBuffer = interface (IUnknown)
IDirect3DDevice7 = interface(IUnknown)
['{F5049E79-4861-11D2-A407-00A0C90629A8}']
// IDirect3DDevice7 methods
function GetCaps(var lpD3DDeviceDesc: TD3DDeviceDesc7): HResult; stdcall;
function EnumTextureFormats(lpd3dEnumPixelProc: TD3DEnumPixelFormatsCallback;
lpArg: Pointer): HResult; stdcall;
function BeginScene: HResult; stdcall;
function EndScene: HResult; stdcall;
function GetDirect3D(out lplpD3D: IDirect3D7): HResult; stdcall;
function SetRenderTarget(lpNewRenderTarget: IDirectDrawSurface7; dwFlags: DWORD): HResult; stdcall;
function GetRenderTarget(out lplpRenderTarget: IDirectDrawSurface7): HResult; stdcall;
function Clear(dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD; dwColor: TD3DColor;
dvZ: TD3DValue; dwStencil: DWORD): HResult; stdcall;
function SetTransform(dtstTransformStateType: TD3DTransformStateType; const lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function GetTransform(dtstTransformStateType: TD3DTransformStateType; var lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function SetViewport(const lpViewport: TD3DViewport7): HResult; stdcall;
function MultiplyTransform(dtstTransformStateType: TD3DTransformStateType; const lpD3DMatrix: TD3DMatrix): HResult; stdcall;
function GetViewport(var lpViewport: TD3DViewport7): HResult; stdcall;
function SetMaterial(const lpMaterial: TD3DMaterial7): HResult; stdcall;
function GetMaterial(var lpMaterial: TD3DMaterial7): HResult; stdcall;
function SetLight(dwLightIndex: DWORD; const lpLight: TD3DLight7): HResult; stdcall;
function GetLight(dwLightIndex: DWORD; var lpLight: TD3DLight7): HResult; stdcall;
function SetRenderState(dwRenderStateType: TD3DRenderStateType; dwRenderState: DWORD): HResult; stdcall;
function GetRenderState(dwRenderStateType: TD3DRenderStateType; var lpdwRenderState: DWORD): HResult; stdcall;
function BeginStateBlock: HResult; stdcall;
function EndStateBlock(var lpdwBlockHandle: DWORD): HResult; stdcall;
function PreLoad(lpddsTexture: IDirectDrawSurface7): HResult; stdcall;
function DrawPrimitive(dptPrimitiveType: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
const lpvVertices; dwVertexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitive(d3dptPrimitiveType: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
const lpvVertices; dwVertexCount: DWORD; const lpwIndices; dwIndexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function SetClipStatus(const lpD3DClipStatus: TD3DClipStatus): HResult; stdcall;
function GetClipStatus(var lpD3DClipStatus: TD3DClipStatus): HResult; stdcall;
function DrawPrimitiveStrided(dptPrimitiveType: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
const lpVertexArray; dwVertexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitiveStrided(d3dptPrimitiveType: TD3DPrimitiveType; dwVertexTypeDesc: DWORD;
const lpVertexArray; dwVertexCount: DWORD; const lpwIndices; dwIndexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function DrawPrimitiveVB(d3dptPrimitiveType: TD3DPrimitiveType; lpd3dVertexBuffer: IDirect3DVertexBuffer7;
dwStartVertex: DWORD; dwNumVertices: DWORD; dwFlags: DWORD): HResult; stdcall;
function DrawIndexedPrimitiveVB(d3dptPrimitiveType: TD3DPrimitiveType; lpd3dVertexBuffer: IDirect3DVertexBuffer7;
dwStartVertex: DWORD; dwNumVertices: DWORD; const lpwIndices; dwIndexCount: DWORD; dwFlags: DWORD): HResult; stdcall;
function ComputeSphereVisibility(const lpCenters; const lpRadii; dwNumSpheres: DWORD; dwFlags: DWORD; var lpdwReturnValue): HResult; stdcall;
function GetTexture(dwStage: DWORD; out lplpTexture: IDirectDrawSurface7): HResult; stdcall;
function SetTexture(dwStage: DWORD; lpTexture: IDirectDrawSurface7): HResult; stdcall;
function GetTextureStageState(dwStage: DWORD; dwState: TD3DTextureStagesStateType; var lpdwValue: DWORD): HResult; stdcall;
function SetTextureStageState(dwStage: DWORD; dwState: TD3DTextureStagesStateType; dwValue: DWORD): HResult; stdcall;
function ValidateDevice(var lpdwPasses: DWORD): HResult; stdcall;
function ApplyStateBlock(dwBlockHandle: DWORD): HResult; stdcall;
function CaptureStateBlock(dwBlockHandle: DWORD): HResult; stdcall;
function DeleteStateBlock(dwBlockHandle: DWORD): HResult; stdcall;
function CreateStateBlock(d3dsbType: TD3DSTATEBLOCKTYPE; var lpdwBlockHandle: DWORD): HResult; stdcall;
function Load(lpDestTex: IDirectDrawSurface7; const lpDestPoint: TPoint; lpSrcTex: IDirectDrawSurface7; const lprcSrcRect: TRect; dwFlags: DWORD): HResult; stdcall;
function LightEnable(dwLightIndex: DWORD; bEnable: BOOL): HResult; stdcall;
function GetLightEnable(dwLightIndex: DWORD; var pbEnable: BOOL): HResult; stdcall;
function SetClipPlane(dwIndex: DWORD; const pPlaneEquation): HResult; stdcall;
function GetClipPlane(dwIndex: DWORD; var pPlaneEquation): HResult; stdcall;
function GetInfo(dwDevInfoID: DWORD; pDevInfoStruct: Pointer; dwSize: DWORD): HResult; stdcall;
end;
 
IDirect3DExecuteBuffer = interface(IUnknown)
['{4417C145-33AD-11CF-816F-0000C020156E}']
(*** IDirect3DExecuteBuffer methods ***)
function Initialize (lpDirect3DDevice: IDirect3DDevice;
var lpDesc: TD3DExecuteBufferDesc) : HResult; stdcall;
function Lock (var lpDesc: TD3DExecuteBufferDesc) : HResult; stdcall;
// IDirect3DExecuteBuffer methods
function Initialize(lpDirect3DDevice: IDirect3DDevice;
const lpDesc: TD3DExecuteBufferDesc): HResult; stdcall;
function Lock(var lpDesc: TD3DExecuteBufferDesc): HResult; stdcall;
function Unlock: HResult; stdcall;
function SetExecuteData (var lpData: TD3DExecuteData) : HResult; stdcall;
function GetExecuteData (var lpData: TD3DExecuteData) : HResult; stdcall;
function Validate (var lpdwOffset: DWORD; lpFunc: TD3DValidateCallback;
lpUserArg: Pointer; dwReserved: DWORD) : HResult; stdcall;
(*** Warning! Optimize is defined differently in the header files
and the online documentation ***)
function Optimize (dwFlags: DWORD) : HResult; stdcall;
function SetExecuteData(const lpData: TD3DExecuteData): HResult; stdcall;
function GetExecuteData(var lpData: TD3DExecuteData): HResult; stdcall;
function Validate(var lpdwOffset: DWORD; lpFunc: TD3DValidateCallback;
lpUserArg: Pointer; dwReserved: DWORD): HResult; stdcall;
function Optimize(dwFlags: DWORD): HResult; stdcall;
end;
 
(*
* Light interfaces
*)
 
IDirect3DLight = interface (IUnknown)
IDirect3DLight = interface(IUnknown)
['{4417C142-33AD-11CF-816F-0000C020156E}']
(*** IDirect3DLight methods ***)
function Initialize (lpDirect3D: IDirect3D) : HResult; stdcall;
function SetLight (var lpLight: TD3DLight2) : HResult; stdcall;
function GetLight (var lpLight: TD3DLight2) : HResult; stdcall;
// IDirect3DLight methods
function Initialize(lpDirect3D: IDirect3D): HResult; stdcall;
function SetLight(const lpLight: TD3DLight): HResult; stdcall;
function GetLight(var lpLight: TD3DLight): HResult; stdcall;
end;
 
(*
* Material interfaces
*)
 
IDirect3DMaterial = interface (IUnknown)
IDirect3DMaterial = interface(IUnknown)
['{4417C144-33AD-11CF-816F-0000C020156E}']
(*** IDirect3DMaterial methods ***)
function Initialize (lpDirect3D: IDirect3D) : HResult; stdcall;
function SetMaterial (var lpMat: TD3DMaterial) : HResult; stdcall;
function GetMaterial (var lpMat: TD3DMaterial) : HResult; stdcall;
function GetHandle (lpDirect3DDevice: IDirect3DDevice;
var lpHandle: TD3DMaterialHandle) : HResult; stdcall;
// IDirect3DMaterial methods
function Initialize(lpDirect3D: IDirect3D): HResult; stdcall;
function SetMaterial(const lpMat: TD3DMaterial): HResult; stdcall;
function GetMaterial(var lpMat: TD3DMaterial): HResult; stdcall;
function GetHandle(lpDirect3DDevice: IDirect3DDevice;
var lpHandle: TD3DMaterialHandle): HResult; stdcall;
function Reserve: HResult; stdcall;
function Unreserve: HResult; stdcall;
end;
 
IDirect3DMaterial2 = interface (IUnknown)
['{93281503-8cf8-11d0-89ab-00a0c9054129}']
(*** IDirect3DMaterial2 methods ***)
function SetMaterial (var lpMat: TD3DMaterial) : HResult; stdcall;
function GetMaterial (var lpMat: TD3DMaterial) : HResult; stdcall;
function GetHandle (lpDirect3DDevice: IDirect3DDevice2;
var lpHandle: TD3DMaterialHandle) : HResult; stdcall;
IDirect3DMaterial2 = interface(IUnknown)
['{93281503-8CF8-11D0-89AB-00A0C9054129}']
// IDirect3DMaterial2 methods
function SetMaterial(const lpMat: TD3DMaterial): HResult; stdcall;
function GetMaterial(var lpMat: TD3DMaterial): HResult; stdcall;
function GetHandle(lpDirect3DDevice: IDirect3DDevice2;
var lpHandle: TD3DMaterialHandle): HResult; stdcall;
end;
 
IDirect3DMaterial3 = interface (IUnknown)
['{ca9c46f4-d3c5-11d1-b75a-00600852b312}']
(*** IDirect3DMaterial2 methods ***)
function SetMaterial (var lpMat: TD3DMaterial) : HResult; stdcall;
function GetMaterial (var lpMat: TD3DMaterial) : HResult; stdcall;
function GetHandle (lpDirect3DDevice: IDirect3DDevice3;
var lpHandle: TD3DMaterialHandle) : HResult; stdcall;
IDirect3DMaterial3 = interface(IUnknown)
['{CA9C46F4-D3C5-11D1-B75A-00600852B312}']
// IDirect3DMaterial3 methods
function SetMaterial(const lpMat: TD3DMaterial): HResult; stdcall;
function GetMaterial(var lpMat: TD3DMaterial): HResult; stdcall;
function GetHandle(lpDirect3DDevice: IDirect3DDevice3;
var lpHandle: TD3DMaterialHandle): HResult; stdcall;
end;
 
(*
* Texture interfaces
*)
 
IDirect3DTexture = interface (IUnknown)
IDirect3DTexture = interface(IUnknown)
['{2CDCD9E0-25A0-11CF-A31A-00AA00B93356}']
(*** IDirect3DTexture methods ***)
function Initialize (lpD3DDevice: IDirect3DDevice;
lpDDSurface: IDirectDrawSurface) : HResult; stdcall;
function GetHandle (lpDirect3DDevice: IDirect3DDevice;
var lpHandle: TD3DTextureHandle) : HResult; stdcall;
function PaletteChanged (dwStart: DWORD; dwCount: DWORD) : HResult; stdcall;
function Load (lpD3DTexture: IDirect3DTexture) : HResult; stdcall;
// IDirect3DTexture methods
function Initialize(lpD3DDevice: IDirect3DDevice;
lpDDSurface: IDirectDrawSurface): HResult; stdcall;
function GetHandle(lpDirect3DDevice: IDirect3DDevice;
var lpHandle: TD3DTextureHandle): HResult; stdcall;
function PaletteChanged(dwStart: DWORD; dwCount: DWORD): HResult; stdcall;
function Load(lpD3DTexture: IDirect3DTexture): HResult; stdcall;
function Unload: HResult; stdcall;
end;
 
IDirect3DTexture2 = interface (IUnknown)
['{93281502-8cf8-11d0-89ab-00a0c9054129}']
(*** IDirect3DTexture2 methods ***)
function GetHandle (lpDirect3DDevice: IDirect3DDevice2;
var lpHandle: TD3DTextureHandle) : HResult; stdcall;
function PaletteChanged (dwStart: DWORD; dwCount: DWORD) : HResult; stdcall;
function Load (lpD3DTexture: IDirect3DTexture2) : HResult; stdcall;
IDirect3DTexture2 = interface(IUnknown)
['{93281502-8CF8-11D0-89AB-00A0C9054129}']
// IDirect3DTexture2 methods
function GetHandle(lpDirect3DDevice2: IDirect3DDevice2;
var lpHandle: TD3DTextureHandle): HResult; stdcall;
function PaletteChanged(dwStart: DWORD; dwCount: DWORD): HResult; stdcall;
function Load(lpD3DTexture2: IDirect3DTexture2): HResult; stdcall;
end;
 
(*
* Viewport interfaces
*)
 
IDirect3DViewport = interface (IUnknown)
IDirect3DViewport = interface(IUnknown)
['{4417C146-33AD-11CF-816F-0000C020156E}']
(*** IDirect3DViewport methods ***)
function Initialize (lpDirect3D: IDirect3D) : HResult; stdcall;
function GetViewport (out lpData: TD3DViewport) : HResult; stdcall;
function SetViewport (const lpData: TD3DViewport) : HResult; stdcall;
function TransformVertices (dwVertexCount: DWORD;
const lpData: TD3DTransformData; dwFlags: DWORD;
out lpOffscreen: DWORD) : HResult; stdcall;
function LightElements (dwElementCount: DWORD;
var lpData: TD3DLightData) : HResult; stdcall;
function SetBackground (hMat: TD3DMaterialHandle) : HResult; stdcall;
function GetBackground (out hMat: TD3DMaterialHandle) : HResult; stdcall;
function SetBackgroundDepth (lpDDSurface: IDirectDrawSurface) :
HResult; stdcall;
function GetBackgroundDepth (out lplpDDSurface: IDirectDrawSurface;
out lpValid: BOOL) : HResult; stdcall;
function Clear (dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD) :
HResult; stdcall;
function AddLight (lpDirect3DLight: IDirect3DLight) : HResult; stdcall;
function DeleteLight (lpDirect3DLight: IDirect3DLight) : HResult; stdcall;
function NextLight (lpDirect3DLight: IDirect3DLight;
out lplpDirect3DLight: IDirect3DLight; dwFlags: DWORD) : HResult; stdcall;
// IDirect3DViewport methods
function Initialize(lpDirect3D: IDirect3D): HResult; stdcall;
function GetViewport(var lpData: TD3DViewport): HResult; stdcall;
function SetViewport(const lpData: TD3DViewport): HResult; stdcall;
function TransformVertices(dwVertexCount: DWORD;
var lpData: TD3DTransformData; dwFlags: DWORD;
var lpOffscreen: DWORD): HResult; stdcall;
function LightElements(dwElementCount: DWORD;
var lpData: TD3DLightData): HResult; stdcall;
function SetBackground(hMat: TD3DMaterialHandle): HResult; stdcall;
function GetBackground(hMat: TD3DMaterialHandle): HResult; stdcall;
function SetBackgroundDepth(lpDDSurface: IDirectDrawSurface): HResult; stdcall;
function GetBackgroundDepth(out lplpDDSurface: IDirectDrawSurface;
var lpValid: BOOL): HResult; stdcall;
function Clear(dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD): HResult; stdcall;
function AddLight(lpDirect3DLight: IDirect3DLight): HResult; stdcall;
function DeleteLight(lpDirect3DLight: IDirect3DLight): HResult; stdcall;
function NextLight(lpDirect3DLight: IDirect3DLight;
out lplpDirect3DLight: IDirect3DLight; dwFlags: DWORD): HResult; stdcall;
end;
 
IDirect3DViewport2 = interface (IUnknown)
['{93281500-8cf8-11d0-89ab-00a0c9054129}']
(*** IDirect3DViewport2 methods ***)
function Initialize (lpDirect3D: IDirect3D) : HResult; stdcall;
function GetViewport (out lpData: TD3DViewport) : HResult; stdcall;
function SetViewport (const lpData: TD3DViewport) : HResult; stdcall;
function TransformVertices (dwVertexCount: DWORD;
const lpData: TD3DTransformData; dwFlags: DWORD;
out lpOffscreen: DWORD) : HResult; stdcall;
function LightElements (dwElementCount: DWORD;
var lpData: TD3DLightData) : HResult; stdcall;
function SetBackground (hMat: TD3DMaterialHandle) : HResult; stdcall;
function GetBackground (out hMat: TD3DMaterialHandle) : HResult; stdcall;
function SetBackgroundDepth (lpDDSurface: IDirectDrawSurface) :
HResult; stdcall;
function GetBackgroundDepth (out lplpDDSurface: IDirectDrawSurface;
out lpValid: BOOL) : HResult; stdcall;
function Clear (dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD) :
HResult; stdcall;
function AddLight (lpDirect3DLight: IDirect3DLight) : HResult; stdcall;
function DeleteLight (lpDirect3DLight: IDirect3DLight) : HResult; stdcall;
function NextLight (lpDirect3DLight: IDirect3DLight;
out lplpDirect3DLight: IDirect3DLight; dwFlags: DWORD) : HResult; stdcall;
(*** IDirect3DViewport2 methods ***)
function GetViewport2 (out lpData: TD3DViewport2) : HResult; stdcall;
function SetViewport2 (const lpData: TD3DViewport2) : HResult; stdcall;
IDirect3DViewport2 = interface(IDirect3DViewport)
['{93281500-8CF8-11D0-89AB-00A0C9054129}']
// IDirect3DViewport2 methods
function GetViewport2(var lpData: TD3DViewport2): HResult; stdcall;
function SetViewport2(const lpData: TD3DViewport2): HResult; stdcall;
end;
 
IDirect3DViewport3 = interface (IUnknown)
['{b0ab3b61-33d7-11d1-a981-00c04fd7b174}']
(*** IDirect3DViewport3 methods ***)
function Initialize (lpDirect3D: IDirect3D) : HResult; stdcall;
function GetViewport (out lpData: TD3DViewport) : HResult; stdcall;
function SetViewport (const lpData: TD3DViewport) : HResult; stdcall;
function TransformVertices (dwVertexCount: DWORD;
const lpData: TD3DTransformData; dwFlags: DWORD;
out lpOffscreen: DWORD) : HResult; stdcall;
function LightElements (dwElementCount: DWORD;
var lpData: TD3DLightData) : HResult; stdcall;
function SetBackground (hMat: TD3DMaterialHandle) : HResult; stdcall;
function GetBackground (var hMat: TD3DMaterialHandle) : HResult; stdcall;
function SetBackgroundDepth (
lpDDSurface: IDirectDrawSurface) : HResult; stdcall;
function GetBackgroundDepth (out lplpDDSurface: IDirectDrawSurface;
out lpValid: BOOL) : HResult; stdcall;
function Clear (dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD) :
HResult; stdcall;
function AddLight (lpDirect3DLight: IDirect3DLight) : HResult; stdcall;
function DeleteLight (lpDirect3DLight: IDirect3DLight) : HResult; stdcall;
function NextLight (lpDirect3DLight: IDirect3DLight;
out lplpDirect3DLight: IDirect3DLight; dwFlags: DWORD) : HResult; stdcall;
function GetViewport2 (out lpData: TD3DViewport2) : HResult; stdcall;
function SetViewport2 (const lpData: TD3DViewport2) : HResult; stdcall;
function SetBackgroundDepth2 (
lpDDSurface: IDirectDrawSurface4) : HResult; stdcall;
function GetBackgroundDepth2 (out lplpDDSurface: IDirectDrawSurface4;
out lpValid: BOOL) : HResult; stdcall;
function Clear2 (dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD;
dwColor: DWORD; dvZ: TD3DValue; dwStencil: DWORD) : HResult; stdcall;
IDirect3DViewport3 = interface(IDirect3DViewport2)
['{B0AB3B61-33D7-11D1-A981-00C04FD7B174}']
// IDirect3DViewport3 methods
function SetBackgroundDepth2(lpDDS: IDirectDrawSurface4): HResult; stdcall;
function GetBackgroundDepth2(out lplpDDS: IDirectDrawSurface4; var lpValid: BOOL): HResult; stdcall;
function Clear2(dwCount: DWORD; const lpRects: TD3DRect; dwFlags: DWORD;
dwColor: DWORD; dvZ: TD3DValue; dwStencil: DWORD): HResult; stdcall;
end;
 
IDirect3DVertexBuffer = interface (IUnknown)
['{7a503555-4a83-11d1-a5db-00a0c90367f8}']
(*** IDirect3DVertexBuffer methods ***)
function Lock (dwFlags: DWORD; var lplpData: pointer; var lpdwSize: DWORD)
: HResult; stdcall;
function Unlock : HResult; stdcall;
function ProcessVertices (dwVertexOp, dwDestIndex, dwCount: DWORD;
lpSrcBuffer: IDirect3DVertexBuffer; dwSrcIndex: DWORD;
lpD3DDevice: IDirect3DDevice3; dwFlags: DWORD) : HResult; stdcall;
function GetVertexBufferDesc (var lpVBDesc: TD3DVertexBufferDesc) : HResult; stdcall;
function Optimize(lpD3DDevice: IDirect3DDevice3; dwFlags: DWORD) : HResult; stdcall;
IDirect3DVertexBuffer = interface(IUnknown)
['{7A503555-4A83-11D1-A5DB-00A0C90367F8}']
// IDirect3DVertexBuffer methods
function Lock(dwFlags: DWORD; var lplpData: Pointer; var lpdwSize: DWORD): HResult; stdcall;
function Unlock: HResult; stdcall;
function ProcessVertices(dwVertexOp: DWORD; dwDestIndex: DWORD; dwCount: DWORD;
lpSrcBuffer: IDirect3DVertexBuffer; dwSrcIndex: DWORD;
lpD3DDevice: IDirect3DDevice3; dwFlags: DWORD): HResult; stdcall;
function GetVertexBufferDesc(var lpVBDesc: TD3DVertexBufferDesc): HResult; stdcall;
function Optimize(lpD3DDevice: IDirect3DDevice3; dwFlags: DWORD): HResult; stdcall;
end;
 
IDirect3DVertexBuffer7 = interface (IUnknown)
['{f5049e7d-4861-11d2-a407-00a0c90629a8}']
(*** IDirect3DVertexBuffer methods ***)
function Lock (dwFlags: DWORD; out lplpData: Pointer; out lpdwSize: DWORD) : HResult; stdcall;
function Unlock : HResult; stdcall;
function ProcessVertices (dwVertexOp, dwDestIndex, dwCount: DWORD;
lpSrcBuffer: IDirect3DVertexBuffer7; dwSrcIndex: DWORD;
lpD3DDevice: IDirect3DDevice7; dwFlags: DWORD) : HResult; stdcall;
function GetVertexBufferDesc (out lpVBDesc: TD3DVertexBufferDesc) : HResult; stdcall;
function Optimize(lpD3DDevice: IDirect3DDevice7; dwFlags: DWORD) : HResult; stdcall;
function ProcessVerticesStrided(dwVertexOp, dwDestIndex, dwCount: DWORD;
lpVertexArray: TD3DDrawPrimitiveStridedData; dwVertexTypeDesc: DWORD;
lpD3DDevice: IDirect3DDevice7; dwFlags: DWORD) : HResult; stdcall;
IDirect3DVertexBuffer7 = interface(IUnknown)
['{F5049E7D-4861-11D2-A407-00A0C90629A8}']
// IDirect3DVertexBuffer7 methods
function Lock(dwFlags: DWORD; var lplpData: Pointer; var lpdwSize: DWORD): HResult; stdcall;
function Unlock: HResult; stdcall;
function ProcessVertices(dwVertexOp: DWORD; dwDestIndex: DWORD; dwCount: DWORD;
lpSrcBuffer: IDirect3DVertexBuffer7; dwSrcIndex: DWORD; lpD3DDevice: IDirect3DDevice7; dwFlags: DWORD): HResult; stdcall;
function GetVertexBufferDesc(var lpVBDesc: TD3DVertexBufferDesc): HResult; stdcall;
function Optimize(lpD3DDevice: IDirect3DDevice7; dwFlags: DWORD): HResult; stdcall;
function ProcessVerticesStrided(dwVertexOp: DWORD; dwDestIndex: DWORD; dwCount: DWORD;
const lpVertexArray; dwSrcIndex: DWORD; lpD3DDevice: IDirect3DDevice7; dwFlags: DWORD): HResult; stdcall;
end;
 
type
IID_IDirect3D = IDirect3D;
IID_IDirect3D2 = IDirect3D2;
IID_IDirect3D3 = IDirect3D3;
IID_IDirect3D7 = IDirect3D7;
 
IID_IDirect3DDevice = IDirect3DDevice;
IID_IDirect3DDevice2 = IDirect3DDevice2;
IID_IDirect3DDevice3 = IDirect3DDevice3;
IID_IDirect3DDevice7 = IDirect3DDevice7;
 
IID_IDirect3DTexture = IDirect3DTexture;
IID_IDirect3DTexture2 = IDirect3DTexture2;
IID_IDirect3DLight = IDirect3DLight;
IID_IDirect3DMaterial = IDirect3DMaterial;
IID_IDirect3DMaterial2 = IDirect3DMaterial2;
IID_IDirect3DMaterial3 = IDirect3DMaterial3;
IID_IDirect3DExecuteBuffer = IDirect3DExecuteBuffer;
IID_IDirect3DViewport = IDirect3DViewport;
IID_IDirect3DViewport2 = IDirect3DViewport2;
IID_IDirect3DViewport3 = IDirect3DViewport3;
IID_IDirect3DVertexBuffer = IDirect3DVertexBuffer;
IID_IDirect3DVertexBuffer7 = IDirect3DVertexBuffer7;
 
 
const
(****************************************************************************
*
* Flags for IDirect3DDevice::NextViewport
*
****************************************************************************)
 
(*
* Return the next viewport
*)
D3DNEXT_NEXT = $00000001;
{ Flags for IDirect3DDevice::NextViewport }
 
(*
* Return the first viewport
*)
D3DNEXT_HEAD = $00000002;
D3DNEXT_NEXT = $00000001;
D3DNEXT_HEAD = $00000002;
D3DNEXT_TAIL = $00000004;
 
(*
* Return the last viewport
*)
D3DNEXT_TAIL = $00000004;
{ Flags for DrawPrimitive/DrawIndexedPrimitive
Also valid for Begin/BeginIndexed }
 
D3DDP_WAIT = $00000001;
D3DDP_OUTOFORDER = $00000002;
D3DDP_DONOTCLIP = $00000004;
D3DDP_DONOTUPDATEEXTENTS = $00000008;
D3DDP_DONOTLIGHT = $00000010;
 
(****************************************************************************
*
* Flags for DrawPrimitive/DrawIndexedPrimitive
* Also valid for Begin/BeginIndexed
* Also valid for VertexBuffer::CreateVertexBuffer
****************************************************************************)
{ Direct3D Errors }
 
(*
* Wait until the device is ready to draw the primitive
* This will cause DP to not return DDERR_WASSTILLDRAWING
*)
D3DDP_WAIT = $00000001;
 
(*
* Hint that it is acceptable to render the primitive out of order.
*)
D3DDP_OUTOFORDER = $00000002;
 
(*
* Hint that the primitives have been clipped by the application.
*)
D3DDP_DONOTCLIP = $00000004;
 
(*
* Hint that the extents need not be updated.
*)
D3DDP_DONOTUPDATEEXTENTS = $00000008;
 
(*
* Hint that the lighting should not be applied on vertices.
*)
 
D3DDP_DONOTLIGHT = $00000010;
 
 
(*
* Direct3D Errors
* DirectDraw error codes are used when errors not specified here.
*)
 
const
MAKE_D3DHRESULT = HResult($88760000);
D3D_OK = HResult(DD_OK);
D3DERR_BADMAJORVERSION = HResult($88760000 + 700);
D3DERR_BADMINORVERSION = HResult($88760000 + 701);
 
D3D_OK = DD_OK;
D3DERR_BADMAJORVERSION = MAKE_D3DHRESULT + 700;
D3DERR_BADMINORVERSION = MAKE_D3DHRESULT + 701;
{ An invalid device was requested by the application. }
 
(*
* An invalid device was requested by the application.
*)
D3DERR_INVALID_DEVICE = MAKE_D3DHRESULT + 705;
D3DERR_INITFAILED = MAKE_D3DHRESULT + 706;
D3DERR_INVALID_DEVICE = HResult($88760000 + 705);
D3DERR_INITFAILED = HResult($88760000 + 706);
 
(*
* SetRenderTarget attempted on a device that was
* QI'd off the render target.
*)
D3DERR_DEVICEAGGREGATED = MAKE_D3DHRESULT + 707;
{ SetRenderTarget attempted on a device that was
QI'd off the render target. }
 
D3DERR_EXECUTE_CREATE_FAILED = MAKE_D3DHRESULT + 710;
D3DERR_EXECUTE_DESTROY_FAILED = MAKE_D3DHRESULT + 711;
D3DERR_EXECUTE_LOCK_FAILED = MAKE_D3DHRESULT + 712;
D3DERR_EXECUTE_UNLOCK_FAILED = MAKE_D3DHRESULT + 713;
D3DERR_EXECUTE_LOCKED = MAKE_D3DHRESULT + 714;
D3DERR_EXECUTE_NOT_LOCKED = MAKE_D3DHRESULT + 715;
D3DERR_DEVICEAGGREGATED = HResult($88760000 + 707);
 
D3DERR_EXECUTE_FAILED = MAKE_D3DHRESULT + 716;
D3DERR_EXECUTE_CLIPPED_FAILED = MAKE_D3DHRESULT + 717;
D3DERR_EXECUTE_CREATE_FAILED = HResult($88760000 + 710);
D3DERR_EXECUTE_DESTROY_FAILED = HResult($88760000 + 711);
D3DERR_EXECUTE_LOCK_FAILED = HResult($88760000 + 712);
D3DERR_EXECUTE_UNLOCK_FAILED = HResult($88760000 + 713);
D3DERR_EXECUTE_LOCKED = HResult($88760000 + 714);
D3DERR_EXECUTE_NOT_LOCKED = HResult($88760000 + 715);
 
D3DERR_TEXTURE_NO_SUPPORT = MAKE_D3DHRESULT + 720;
D3DERR_TEXTURE_CREATE_FAILED = MAKE_D3DHRESULT + 721;
D3DERR_TEXTURE_DESTROY_FAILED = MAKE_D3DHRESULT + 722;
D3DERR_TEXTURE_LOCK_FAILED = MAKE_D3DHRESULT + 723;
D3DERR_TEXTURE_UNLOCK_FAILED = MAKE_D3DHRESULT + 724;
D3DERR_TEXTURE_LOAD_FAILED = MAKE_D3DHRESULT + 725;
D3DERR_TEXTURE_SWAP_FAILED = MAKE_D3DHRESULT + 726;
D3DERR_TEXTURE_LOCKED = MAKE_D3DHRESULT + 727;
D3DERR_TEXTURE_NOT_LOCKED = MAKE_D3DHRESULT + 728;
D3DERR_TEXTURE_GETSURF_FAILED = MAKE_D3DHRESULT + 729;
D3DERR_EXECUTE_FAILED = HResult($88760000 + 716);
D3DERR_EXECUTE_CLIPPED_FAILED = HResult($88760000 + 717);
 
D3DERR_MATRIX_CREATE_FAILED = MAKE_D3DHRESULT + 730;
D3DERR_MATRIX_DESTROY_FAILED = MAKE_D3DHRESULT + 731;
D3DERR_MATRIX_SETDATA_FAILED = MAKE_D3DHRESULT + 732;
D3DERR_MATRIX_GETDATA_FAILED = MAKE_D3DHRESULT + 733;
D3DERR_SETVIEWPORTDATA_FAILED = MAKE_D3DHRESULT + 734;
D3DERR_TEXTURE_NO_SUPPORT = HResult($88760000 + 720);
D3DERR_TEXTURE_CREATE_FAILED = HResult($88760000 + 721);
D3DERR_TEXTURE_DESTROY_FAILED = HResult($88760000 + 722);
D3DERR_TEXTURE_LOCK_FAILED = HResult($88760000 + 723);
D3DERR_TEXTURE_UNLOCK_FAILED = HResult($88760000 + 724);
D3DERR_TEXTURE_LOAD_FAILED = HResult($88760000 + 725);
D3DERR_TEXTURE_SWAP_FAILED = HResult($88760000 + 726);
D3DERR_TEXTURE_LOCKED = HResult($88760000 + 727);
D3DERR_TEXTURE_NOT_LOCKED = HResult($88760000 + 728);
D3DERR_TEXTURE_GETSURF_FAILED = HResult($88760000 + 729);
 
D3DERR_INVALIDCURRENTVIEWPORT = MAKE_D3DHRESULT + 735;
D3DERR_INVALIDPRIMITIVETYPE = MAKE_D3DHRESULT + 736;
D3DERR_INVALIDVERTEXTYPE = MAKE_D3DHRESULT + 737;
D3DERR_TEXTURE_BADSIZE = MAKE_D3DHRESULT + 738;
D3DERR_INVALIDRAMPTEXTURE = MAKE_D3DHRESULT + 739;
D3DERR_MATRIX_CREATE_FAILED = HResult($88760000 + 730);
D3DERR_MATRIX_DESTROY_FAILED = HResult($88760000 + 731);
D3DERR_MATRIX_SETDATA_FAILED = HResult($88760000 + 732);
D3DERR_MATRIX_GETDATA_FAILED = HResult($88760000 + 733);
D3DERR_SETVIEWPORTDATA_FAILED = HResult($88760000 + 734);
 
D3DERR_MATERIAL_CREATE_FAILED = MAKE_D3DHRESULT + 740;
D3DERR_MATERIAL_DESTROY_FAILED = MAKE_D3DHRESULT + 741;
D3DERR_MATERIAL_SETDATA_FAILED = MAKE_D3DHRESULT + 742;
D3DERR_MATERIAL_GETDATA_FAILED = MAKE_D3DHRESULT + 743;
D3DERR_INVALIDCURRENTVIEWPORT = HResult($88760000 + 735);
D3DERR_INVALIDPRIMITIVETYPE = HResult($88760000 + 736);
D3DERR_INVALIDVERTEXTYPE = HResult($88760000 + 737);
D3DERR_TEXTURE_BADSIZE = HResult($88760000 + 738);
D3DERR_INVALIDRAMPTEXTURE = HResult($88760000 + 739);
 
D3DERR_INVALIDPALETTE = MAKE_D3DHRESULT + 744;
D3DERR_MATERIAL_CREATE_FAILED = HResult($88760000 + 740);
D3DERR_MATERIAL_DESTROY_FAILED = HResult($88760000 + 741);
D3DERR_MATERIAL_SETDATA_FAILED = HResult($88760000 + 742);
D3DERR_MATERIAL_GETDATA_FAILED = HResult($88760000 + 743);
 
D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY = MAKE_D3DHRESULT + 745;
D3DERR_ZBUFF_NEEDS_VIDEOMEMORY = MAKE_D3DHRESULT + 746;
D3DERR_SURFACENOTINVIDMEM = MAKE_D3DHRESULT + 747;
D3DERR_INVALIDPALETTE = HResult($88760000 + 744);
 
D3DERR_LIGHT_SET_FAILED = MAKE_D3DHRESULT + 750;
D3DERR_LIGHTHASVIEWPORT = MAKE_D3DHRESULT + 751;
D3DERR_LIGHTNOTINTHISVIEWPORT = MAKE_D3DHRESULT + 752;
D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY = HResult($88760000 + 745);
D3DERR_ZBUFF_NEEDS_VIDEOMEMORY = HResult($88760000 + 746);
D3DERR_SURFACENOTINVIDMEM = HResult($88760000 + 747);
 
D3DERR_SCENE_IN_SCENE = MAKE_D3DHRESULT + 760;
D3DERR_SCENE_NOT_IN_SCENE = MAKE_D3DHRESULT + 761;
D3DERR_SCENE_BEGIN_FAILED = MAKE_D3DHRESULT + 762;
D3DERR_SCENE_END_FAILED = MAKE_D3DHRESULT + 763;
D3DERR_LIGHT_SET_FAILED = HResult($88760000 + 750);
D3DERR_LIGHTHASVIEWPORT = HResult($88760000 + 751);
D3DERR_LIGHTNOTINTHISVIEWPORT = HResult($88760000 + 752);
 
D3DERR_INBEGIN = MAKE_D3DHRESULT + 770;
D3DERR_NOTINBEGIN = MAKE_D3DHRESULT + 771;
D3DERR_NOVIEWPORTS = MAKE_D3DHRESULT + 772;
D3DERR_VIEWPORTDATANOTSET = MAKE_D3DHRESULT + 773;
D3DERR_VIEWPORTHASNODEVICE = MAKE_D3DHRESULT + 774;
D3DERR_NOCURRENTVIEWPORT = MAKE_D3DHRESULT + 775;
D3DERR_SCENE_IN_SCENE = HResult($88760000 + 760);
D3DERR_SCENE_NOT_IN_SCENE = HResult($88760000 + 761);
D3DERR_SCENE_BEGIN_FAILED = HResult($88760000 + 762);
D3DERR_SCENE_END_FAILED = HResult($88760000 + 763);
 
D3DERR_INVALIDVERTEXFORMAT = MAKE_D3DHRESULT + 2048;
D3DERR_INBEGIN = HResult($88760000 + 770);
D3DERR_NOTINBEGIN = HResult($88760000 + 771);
D3DERR_NOVIEWPORTS = HResult($88760000 + 772);
D3DERR_VIEWPORTDATANOTSET = HResult($88760000 + 773);
D3DERR_VIEWPORTHASNODEVICE = HResult($88760000 + 774);
D3DERR_NOCURRENTVIEWPORT = HResult($88760000 + 775);
 
(*
* Attempted to CreateTexture on a surface that had a color key
*)
D3DERR_COLORKEYATTACHED = MAKE_D3DHRESULT + 2050;
D3DERR_INVALIDVERTEXFORMAT = HResult($88760000 + 2048);
 
D3DERR_VERTEXBUFFEROPTIMIZED = MAKE_D3DHRESULT + 2060;
D3DERR_VBUF_CREATE_FAILED = MAKE_D3DHRESULT + 2061;
D3DERR_VERTEXBUFFERLOCKED = MAKE_D3DHRESULT + 2062;
D3DERR_COLORKEYATTACHED = HResult($88760000 + 2050);
 
D3DERR_ZBUFFER_NOTPRESENT = MAKE_D3DHRESULT + 2070;
D3DERR_STENCILBUFFER_NOTPRESENT = MAKE_D3DHRESULT + 2071;
D3DERR_VERTEXBUFFEROPTIMIZED = HResult($88760000 + 2060);
D3DERR_VBUF_CREATE_FAILED = HResult($88760000 + 2061);
D3DERR_VERTEXBUFFERLOCKED = HResult($88760000 + 2062);
D3DERR_VERTEXBUFFERUNLOCKFAILED = HResult($88760000 + 2063);
 
D3DERR_WRONGTEXTUREFORMAT = MAKE_D3DHRESULT + 2072;
D3DERR_UNSUPPORTEDCOLOROPERATION = MAKE_D3DHRESULT + 2073;
D3DERR_UNSUPPORTEDCOLORARG = MAKE_D3DHRESULT + 2074;
D3DERR_UNSUPPORTEDALPHAOPERATION = MAKE_D3DHRESULT + 2075;
D3DERR_UNSUPPORTEDALPHAARG = MAKE_D3DHRESULT + 2076;
D3DERR_TOOMANYOPERATIONS = MAKE_D3DHRESULT + 2077;
D3DERR_CONFLICTINGTEXTUREFILTER = MAKE_D3DHRESULT + 2078;
D3DERR_UNSUPPORTEDFACTORVALUE = MAKE_D3DHRESULT + 2079;
D3DERR_CONFLICTINGRENDERSTATE = MAKE_D3DHRESULT + 2081;
D3DERR_UNSUPPORTEDTEXTUREFILTER = MAKE_D3DHRESULT + 2082;
D3DERR_TOOMANYPRIMITIVES = MAKE_D3DHRESULT + 2083;
D3DERR_INVALIDMATRIX = MAKE_D3DHRESULT + 2084;
D3DERR_TOOMANYVERTICES = MAKE_D3DHRESULT + 2085;
D3DERR_CONFLICTINGTEXTUREPALETTE = MAKE_D3DHRESULT + 2086;
D3DERR_ZBUFFER_NOTPRESENT = HResult($88760000 + 2070);
D3DERR_STENCILBUFFER_NOTPRESENT = HResult($88760000 + 2071);
 
D3DERR_INVALIDSTATEBLOCK = MAKE_D3DHRESULT + 2100;
D3DERR_INBEGINSTATEBLOCK = MAKE_D3DHRESULT + 2101;
D3DERR_NOTINBEGINSTATEBLOCK = MAKE_D3DHRESULT + 2102;
D3DERR_WRONGTEXTUREFORMAT = HResult($88760000 + 2072);
D3DERR_UNSUPPORTEDCOLOROPERATION = HResult($88760000 + 2073);
D3DERR_UNSUPPORTEDCOLORARG = HResult($88760000 + 2074);
D3DERR_UNSUPPORTEDALPHAOPERATION = HResult($88760000 + 2075);
D3DERR_UNSUPPORTEDALPHAARG = HResult($88760000 + 2076);
D3DERR_TOOMANYOPERATIONS = HResult($88760000 + 2077);
D3DERR_CONFLICTINGTEXTUREFILTER = HResult($88760000 + 2078);
D3DERR_UNSUPPORTEDFACTORVALUE = HResult($88760000 + 2079);
D3DERR_CONFLICTINGRENDERSTATE = HResult($88760000 + 2081);
D3DERR_UNSUPPORTEDTEXTUREFILTER = HResult($88760000 + 2082);
D3DERR_TOOMANYPRIMITIVES = HResult($88760000 + 2083);
D3DERR_INVALIDMATRIX = HResult($88760000 + 2084);
D3DERR_TOOMANYVERTICES = HResult($88760000 + 2085);
D3DERR_CONFLICTINGTEXTUREPALETTE = HResult($88760000 + 2086);
 
procedure DisableFPUExceptions;
procedure EnableFPUExceptions;
D3DERR_INVALIDSTATEBLOCK = HResult($88760000 + 2100);
D3DERR_INBEGINSTATEBLOCK = HResult($88760000 + 2101);
D3DERR_NOTINBEGINSTATEBLOCK = HResult($88760000 + 2102);
 
(***************************************************************************
*
* Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved.
*
* File: dxfile.h
*
* Content: DirectX File public header file
*
***************************************************************************)
 
var
DXFileDLL : HMODULE;
 
function DXFileErrorString(Value: HResult) : string;
 
type
TDXFileFormat = (
DXFILEFORMAT_BINARY,
DXFILEFORMAT_TEXT,
DXFILEFORMAT_COMPRESSED
);
 
TDXFileLoadOptions = (
DXFILELOAD_FROMFILE,
DXFILELOAD_FROMRESOURCE,
DXFILELOAD_FROMMEMORY,
DXFILELOAD_INVALID_3,
DXFILELOAD_FROMSTREAM,
DXFILELOAD_INVALID_5,
DXFILELOAD_INVALID_6,
DXFILELOAD_INVALID_7,
DXFILELOAD_FROMURL
);
 
PDXFileLoadResource = ^TDXFileLoadResource;
TDXFileLoadResource = packed record
hModule: HModule;
lpName: PAnsiChar;
lpType: PAnsiChar;
end;
 
PDXFileLoadMemory = ^TDXFileLoadMemory;
TDXFileLoadMemory = packed record
lpMemory: Pointer;
dSize: DWORD;
end;
 
(*
* DirectX File object types.
*)
 
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 (pvSource: Pointer;
dwLoadOptions: TDXFileLoadOptions;
var ppEnumObj: IDirectXFileEnumObject) : HResult; stdcall;
function CreateSaveObject (szFileName: PChar; dwFileFormat: TDXFileFormat;
var ppSaveObj: IDirectXFileSaveObject) : HResult; stdcall;
function RegisterTemplates (pvData: Pointer; cbSize: DWORD) : HResult; stdcall;
end;
 
IDirectXFileEnumObject = interface (IUnknown)
['{3d82ab41-62da-11cf-ab39-0020af71e433}']
function GetNextDataObject (var ppDataObj: IDirectXFileData) : HResult; stdcall;
function GetDataObjectById
(const rguid: TGUID; var ppDataObj: IDirectXFileData) : HResult; stdcall;
function GetDataObjectByName
(szName: PChar; var ppDataObj: IDirectXFileData) : HResult; stdcall;
end;
 
IDirectXFileSaveObject = interface (IUnknown)
['{3d82ab42-62da-11cf-ab39-0020af71e433}']
function SaveTemplates
(cTemplates: DWORD; var ppguidTemplates: PGUID) : HResult; stdcall;
function CreateDataObject (const rguidTemplate: TGUID; szName: PChar;
pguid: PGUID; cbSize: DWORD; pvData: Pointer;
var ppDataObj: IDirectXFileData) : HResult; stdcall;
function SaveData (pDataObj: IDirectXFileData) : HResult; stdcall;
end;
 
IDirectXFileObject = interface (IUnknown)
['{3d82ab43-62da-11cf-ab39-0020af71e433}']
function GetName (pstrNameBuf: PChar; var dwBufLen: DWORD) : HResult; stdcall;
function GetId (var pGuidBuf: TGUID) : HResult; stdcall;
end;
 
IDirectXFileData = interface (IDirectXFileObject)
['{3d82ab44-62da-11cf-ab39-0020af71e433}']
function GetData
(szMember: PChar; var pcbSize: DWORD; var ppvData: Pointer) : HResult; stdcall;
function GetType (var ppguid: PGUID) : HResult; stdcall;
function GetNextObject (var ppChildObj: IDirectXFileObject) : HResult; stdcall;
function AddDataObject (pDataObj: IDirectXFileData) : HResult; stdcall;
function AddDataReference (szRef: PChar; pguidRef: PGUID) : HResult; stdcall;
function AddBinaryObject (szName: PChar; pguid: PGUID; szMimeType: PChar;
pvData: Pointer; cbSize: DWORD) : HResult; stdcall;
end;
 
IDirectXFileDataReference = interface (IDirectXFileObject)
['{3d82ab45-62da-11cf-ab39-0020af71e433}']
function Resolve (var ppDataObj: IDirectXFileData) : HResult; stdcall;
end;
 
IDirectXFileBinary = interface (IDirectXFileObject)
['{3d82ab46-62da-11cf-ab39-0020af71e433}']
function GetSize (var pcbSize: DWORD) : HResult; stdcall;
function GetMimeType (var pszMimeType: PChar) : HResult; stdcall;
function Read(pvData: Pointer; cbSize: DWORD; pcbRead: PDWORD{?}) : HResult; stdcall;
end;
 
const
 
(*
* DirectXFile Object Class Id (for CoCreateInstance())
*)
 
CLSID_CDirectXFile: TGUID =
(D1:$4516ec43;D2:$8f20;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$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 =
(D1:$3d82ab43;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
 
(*
* DirectX File errors.
*)
 
const
DXFILE_OK = 0;
 
DXFILEERR_BADOBJECT = MAKE_D3DHRESULT or 850;
DXFILEERR_BADVALUE = MAKE_D3DHRESULT or 851;
DXFILEERR_BADTYPE = MAKE_D3DHRESULT or 852;
DXFILEERR_BADSTREAMHANDLE = MAKE_D3DHRESULT or 853;
DXFILEERR_BADALLOC = MAKE_D3DHRESULT or 854;
DXFILEERR_NOTFOUND = MAKE_D3DHRESULT or 855;
DXFILEERR_NOTDONEYET = MAKE_D3DHRESULT or 856;
DXFILEERR_FILENOTFOUND = MAKE_D3DHRESULT or 857;
DXFILEERR_RESOURCENOTFOUND = MAKE_D3DHRESULT or 858;
DXFILEERR_URLNOTFOUND = MAKE_D3DHRESULT or 859;
DXFILEERR_BADRESOURCE = MAKE_D3DHRESULT or 860;
DXFILEERR_BADFILETYPE = MAKE_D3DHRESULT or 861;
DXFILEERR_BADFILEVERSION = MAKE_D3DHRESULT or 862;
DXFILEERR_BADFILEFLOATSIZE = MAKE_D3DHRESULT or 863;
DXFILEERR_BADFILECOMPRESSIONTYPE = MAKE_D3DHRESULT or 864;
DXFILEERR_BADFILE = MAKE_D3DHRESULT or 865;
DXFILEERR_PARSEERROR = MAKE_D3DHRESULT or 866;
DXFILEERR_NOTEMPLATE = MAKE_D3DHRESULT or 867;
DXFILEERR_BADARRAYSIZE = MAKE_D3DHRESULT or 868;
DXFILEERR_BADDATAREFERENCE = MAKE_D3DHRESULT or 869;
DXFILEERR_INTERNALERROR = MAKE_D3DHRESULT or 870;
DXFILEERR_NOMOREOBJECTS = MAKE_D3DHRESULT or 871;
DXFILEERR_BADINTRINSICS = MAKE_D3DHRESULT or 872;
DXFILEERR_NOMORESTREAMHANDLES = MAKE_D3DHRESULT or 873;
DXFILEERR_NOMOREDATA = MAKE_D3DHRESULT or 874;
DXFILEERR_BADCACHEFILE = MAKE_D3DHRESULT or 875;
DXFILEERR_NOINTERNET = MAKE_D3DHRESULT or 876;
 
{$IFDEF D3DRM}
(*
* API for creating IDirectXFile interface.
*)
 
var
DirectXFileCreate : function
(out lplpDirectXFile: IDirectXFile) : HResult; stdcall;
 
(* D3DRM XFile templates in binary form *)
const
D3DRM_XTEMPLATE_BYTES = 3215;
D3DRM_XTEMPLATES: array [0..D3DRM_XTEMPLATE_BYTES-1] of byte = (
$78, $6f, $66, $20, $30, $33, $30, $32, $62,
$69, $6e, $20, $30, $30, $36, $34, $1f, 0, $1,
0, $6, 0, 0, 0, $48, $65, $61, $64, $65,
$72, $a, 0, $5, 0, $43, $ab, $82, $3d, $da,
$62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4,
$33, $28, 0, $1, 0, $5, 0, 0, 0, $6d,
$61, $6a, $6f, $72, $14, 0, $28, 0, $1, 0,
$5, 0, 0, 0, $6d, $69, $6e, $6f, $72, $14,
0, $29, 0, $1, 0, $5, 0, 0, 0, $66,
$6c, $61, $67, $73, $14, 0, $b, 0, $1f, 0,
$1, 0, $6, 0, 0, 0, $56, $65, $63, $74,
$6f, $72, $a, 0, $5, 0, $5e, $ab, $82, $3d,
$da, $62, $cf, $11, $ab, $39, 0, $20, $af, $71,
$e4, $33, $2a, 0, $1, 0, $1, 0, 0, 0,
$78, $14, 0, $2a, 0, $1, 0, $1, 0, 0,
0, $79, $14, 0, $2a, 0, $1, 0, $1, 0,
0, 0, $7a, $14, 0, $b, 0, $1f, 0, $1,
0, $8, 0, 0, 0, $43, $6f, $6f, $72, $64,
$73, $32, $64, $a, 0, $5, 0, $44, $3f, $f2,
$f6, $86, $76, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $2a, 0, $1, 0, $1, 0, 0,
0, $75, $14, 0, $2a, 0, $1, 0, $1, 0,
0, 0, $76, $14, 0, $b, 0, $1f, 0, $1,
0, $9, 0, 0, 0, $4d, $61, $74, $72, $69,
$78, $34, $78, $34, $a, 0, $5, 0, $45, $3f,
$f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40,
$33, $35, $94, $a3, $34, 0, $2a, 0, $1, 0,
$6, 0, 0, 0, $6d, $61, $74, $72, $69, $78,
$e, 0, $3, 0, $10, 0, 0, 0, $f, 0,
$14, 0, $b, 0, $1f, 0, $1, 0, $9, 0,
0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42,
$41, $a, 0, $5, 0, $e0, $44, $ff, $35, $7c,
$6c, $cf, $11, $8f, $52, 0, $40, $33, $35, $94,
$a3, $2a, 0, $1, 0, $3, 0, 0, 0, $72,
$65, $64, $14, 0, $2a, 0, $1, 0, $5, 0,
0, 0, $67, $72, $65, $65, $6e, $14, 0, $2a,
0, $1, 0, $4, 0, 0, 0, $62, $6c, $75,
$65, $14, 0, $2a, 0, $1, 0, $5, 0, 0,
0, $61, $6c, $70, $68, $61, $14, 0, $b, 0,
$1f, 0, $1, 0, $8, 0, 0, 0, $43, $6f,
$6c, $6f, $72, $52, $47, $42, $a, 0, $5, 0,
$81, $6e, $e1, $d3, $35, $78, $cf, $11, $8f, $52,
0, $40, $33, $35, $94, $a3, $2a, 0, $1, 0,
$3, 0, 0, 0, $72, $65, $64, $14, 0, $2a,
0, $1, 0, $5, 0, 0, 0, $67, $72, $65,
$65, $6e, $14, 0, $2a, 0, $1, 0, $4, 0,
0, 0, $62, $6c, $75, $65, $14, 0, $b, 0,
$1f, 0, $1, 0, $c, 0, 0, 0, $49, $6e,
$64, $65, $78, $65, $64, $43, $6f, $6c, $6f, $72,
$a, 0, $5, 0, $20, $b8, $30, $16, $42, $78,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $5, 0, 0, 0, $69, $6e,
$64, $65, $78, $14, 0, $1, 0, $9, 0, 0,
0, $43, $6f, $6c, $6f, $72, $52, $47, $42, $41,
$1, 0, $a, 0, 0, 0, $69, $6e, $64, $65,
$78, $43, $6f, $6c, $6f, $72, $14, 0, $b, 0,
$1f, 0, $1, 0, $7, 0, 0, 0, $42, $6f,
$6f, $6c, $65, $61, $6e, $a, 0, $5, 0, $a0,
$a6, $7d, $53, $37, $ca, $d0, $11, $94, $1c, 0,
$80, $c8, $c, $fa, $7b, $29, 0, $1, 0, $9,
0, 0, 0, $74, $72, $75, $65, $66, $61, $6c,
$73, $65, $14, 0, $b, 0, $1f, 0, $1, 0,
$9, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61,
$6e, $32, $64, $a, 0, $5, 0, $63, $ae, $85,
$48, $e8, $78, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $1, 0, $7, 0, 0, 0, $42,
$6f, $6f, $6c, $65, $61, $6e, $1, 0, $1, 0,
0, 0, $75, $14, 0, $1, 0, $7, 0, 0,
0, $42, $6f, $6f, $6c, $65, $61, $6e, $1, 0,
$1, 0, 0, 0, $76, $14, 0, $b, 0, $1f,
0, $1, 0, $c, 0, 0, 0, $4d, $61, $74,
$65, $72, $69, $61, $6c, $57, $72, $61, $70, $a,
0, $5, 0, $60, $ae, $85, $48, $e8, $78, $cf,
$11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1,
0, $7, 0, 0, 0, $42, $6f, $6f, $6c, $65,
$61, $6e, $1, 0, $1, 0, 0, 0, $75, $14,
0, $1, 0, $7, 0, 0, 0, $42, $6f, $6f,
$6c, $65, $61, $6e, $1, 0, $1, 0, 0, 0,
$76, $14, 0, $b, 0, $1f, 0, $1, 0, $f,
0, 0, 0, $54, $65, $78, $74, $75, $72, $65,
$46, $69, $6c, $65, $6e, $61, $6d, $65, $a, 0,
$5, 0, $e1, $90, $27, $a4, $10, $78, $cf, $11,
$8f, $52, 0, $40, $33, $35, $94, $a3, $31, 0,
$1, 0, $8, 0, 0, 0, $66, $69, $6c, $65,
$6e, $61, $6d, $65, $14, 0, $b, 0, $1f, 0,
$1, 0, $8, 0, 0, 0, $4d, $61, $74, $65,
$72, $69, $61, $6c, $a, 0, $5, 0, $4d, $ab,
$82, $3d, $da, $62, $cf, $11, $ab, $39, 0, $20,
$af, $71, $e4, $33, $1, 0, $9, 0, 0, 0,
$43, $6f, $6c, $6f, $72, $52, $47, $42, $41, $1,
0, $9, 0, 0, 0, $66, $61, $63, $65, $43,
$6f, $6c, $6f, $72, $14, 0, $2a, 0, $1, 0,
$5, 0, 0, 0, $70, $6f, $77, $65, $72, $14,
0, $1, 0, $8, 0, 0, 0, $43, $6f, $6c,
$6f, $72, $52, $47, $42, $1, 0, $d, 0, 0,
0, $73, $70, $65, $63, $75, $6c, $61, $72, $43,
$6f, $6c, $6f, $72, $14, 0, $1, 0, $8, 0,
0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42,
$1, 0, $d, 0, 0, 0, $65, $6d, $69, $73,
$73, $69, $76, $65, $43, $6f, $6c, $6f, $72, $14,
0, $e, 0, $12, 0, $12, 0, $12, 0, $f,
0, $b, 0, $1f, 0, $1, 0, $8, 0, 0,
0, $4d, $65, $73, $68, $46, $61, $63, $65, $a,
0, $5, 0, $5f, $ab, $82, $3d, $da, $62, $cf,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $29,
0, $1, 0, $12, 0, 0, 0, $6e, $46, $61,
$63, $65, $56, $65, $72, $74, $65, $78, $49, $6e,
$64, $69, $63, $65, $73, $14, 0, $34, 0, $29,
0, $1, 0, $11, 0, 0, 0, $66, $61, $63,
$65, $56, $65, $72, $74, $65, $78, $49, $6e, $64,
$69, $63, $65, $73, $e, 0, $1, 0, $12, 0,
0, 0, $6e, $46, $61, $63, $65, $56, $65, $72,
$74, $65, $78, $49, $6e, $64, $69, $63, $65, $73,
$f, 0, $14, 0, $b, 0, $1f, 0, $1, 0,
$d, 0, 0, 0, $4d, $65, $73, $68, $46, $61,
$63, $65, $57, $72, $61, $70, $73, $a, 0, $5,
0, $c0, $c5, $1e, $ed, $a8, $c0, $d0, $11, $94,
$1c, 0, $80, $c8, $c, $fa, $7b, $29, 0, $1,
0, $f, 0, 0, 0, $6e, $46, $61, $63, $65,
$57, $72, $61, $70, $56, $61, $6c, $75, $65, $73,
$14, 0, $34, 0, $1, 0, $9, 0, 0, 0,
$42, $6f, $6f, $6c, $65, $61, $6e, $32, $64, $1,
0, $e, 0, 0, 0, $66, $61, $63, $65, $57,
$72, $61, $70, $56, $61, $6c, $75, $65, $73, $e,
0, $1, 0, $f, 0, 0, 0, $6e, $46, $61,
$63, $65, $57, $72, $61, $70, $56, $61, $6c, $75,
$65, $73, $f, 0, $14, 0, $b, 0, $1f, 0,
$1, 0, $11, 0, 0, 0, $4d, $65, $73, $68,
$54, $65, $78, $74, $75, $72, $65, $43, $6f, $6f,
$72, $64, $73, $a, 0, $5, 0, $40, $3f, $f2,
$f6, $86, $76, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $29, 0, $1, 0, $e, 0, 0,
0, $6e, $54, $65, $78, $74, $75, $72, $65, $43,
$6f, $6f, $72, $64, $73, $14, 0, $34, 0, $1,
0, $8, 0, 0, 0, $43, $6f, $6f, $72, $64,
$73, $32, $64, $1, 0, $d, 0, 0, 0, $74,
$65, $78, $74, $75, $72, $65, $43, $6f, $6f, $72,
$64, $73, $e, 0, $1, 0, $e, 0, 0, 0,
$6e, $54, $65, $78, $74, $75, $72, $65, $43, $6f,
$6f, $72, $64, $73, $f, 0, $14, 0, $b, 0,
$1f, 0, $1, 0, $10, 0, 0, 0, $4d, $65,
$73, $68, $4d, $61, $74, $65, $72, $69, $61, $6c,
$4c, $69, $73, $74, $a, 0, $5, 0, $42, $3f,
$f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40,
$33, $35, $94, $a3, $29, 0, $1, 0, $a, 0,
0, 0, $6e, $4d, $61, $74, $65, $72, $69, $61,
$6c, $73, $14, 0, $29, 0, $1, 0, $c, 0,
0, 0, $6e, $46, $61, $63, $65, $49, $6e, $64,
$65, $78, $65, $73, $14, 0, $34, 0, $29, 0,
$1, 0, $b, 0, 0, 0, $66, $61, $63, $65,
$49, $6e, $64, $65, $78, $65, $73, $e, 0, $1,
0, $c, 0, 0, 0, $6e, $46, $61, $63, $65,
$49, $6e, $64, $65, $78, $65, $73, $f, 0, $14,
0, $e, 0, $1, 0, $8, 0, 0, 0, $4d,
$61, $74, $65, $72, $69, $61, $6c, $f, 0, $b,
0, $1f, 0, $1, 0, $b, 0, 0, 0, $4d,
$65, $73, $68, $4e, $6f, $72, $6d, $61, $6c, $73,
$a, 0, $5, 0, $43, $3f, $f2, $f6, $86, $76,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $8, 0, 0, 0, $6e, $4e,
$6f, $72, $6d, $61, $6c, $73, $14, 0, $34, 0,
$1, 0, $6, 0, 0, 0, $56, $65, $63, $74,
$6f, $72, $1, 0, $7, 0, 0, 0, $6e, $6f,
$72, $6d, $61, $6c, $73, $e, 0, $1, 0, $8,
0, 0, 0, $6e, $4e, $6f, $72, $6d, $61, $6c,
$73, $f, 0, $14, 0, $29, 0, $1, 0, $c,
0, 0, 0, $6e, $46, $61, $63, $65, $4e, $6f,
$72, $6d, $61, $6c, $73, $14, 0, $34, 0, $1,
0, $8, 0, 0, 0, $4d, $65, $73, $68, $46,
$61, $63, $65, $1, 0, $b, 0, 0, 0, $66,
$61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73,
$e, 0, $1, 0, $c, 0, 0, 0, $6e, $46,
$61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73,
$f, 0, $14, 0, $b, 0, $1f, 0, $1, 0,
$10, 0, 0, 0, $4d, $65, $73, $68, $56, $65,
$72, $74, $65, $78, $43, $6f, $6c, $6f, $72, $73,
$a, 0, $5, 0, $21, $b8, $30, $16, $42, $78,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $d, 0, 0, 0, $6e, $56,
$65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72,
$73, $14, 0, $34, 0, $1, 0, $c, 0, 0,
0, $49, $6e, $64, $65, $78, $65, $64, $43, $6f,
$6c, $6f, $72, $1, 0, $c, 0, 0, 0, $76,
$65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72,
$73, $e, 0, $1, 0, $d, 0, 0, 0, $6e,
$56, $65, $72, $74, $65, $78, $43, $6f, $6c, $6f,
$72, $73, $f, 0, $14, 0, $b, 0, $1f, 0,
$1, 0, $4, 0, 0, 0, $4d, $65, $73, $68,
$a, 0, $5, 0, $44, $ab, $82, $3d, $da, $62,
$cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33,
$29, 0, $1, 0, $9, 0, 0, 0, $6e, $56,
$65, $72, $74, $69, $63, $65, $73, $14, 0, $34,
0, $1, 0, $6, 0, 0, 0, $56, $65, $63,
$74, $6f, $72, $1, 0, $8, 0, 0, 0, $76,
$65, $72, $74, $69, $63, $65, $73, $e, 0, $1,
0, $9, 0, 0, 0, $6e, $56, $65, $72, $74,
$69, $63, $65, $73, $f, 0, $14, 0, $29, 0,
$1, 0, $6, 0, 0, 0, $6e, $46, $61, $63,
$65, $73, $14, 0, $34, 0, $1, 0, $8, 0,
0, 0, $4d, $65, $73, $68, $46, $61, $63, $65,
$1, 0, $5, 0, 0, 0, $66, $61, $63, $65,
$73, $e, 0, $1, 0, $6, 0, 0, 0, $6e,
$46, $61, $63, $65, $73, $f, 0, $14, 0, $e,
0, $12, 0, $12, 0, $12, 0, $f, 0, $b,
0, $1f, 0, $1, 0, $14, 0, 0, 0, $46,
$72, $61, $6d, $65, $54, $72, $61, $6e, $73, $66,
$6f, $72, $6d, $4d, $61, $74, $72, $69, $78, $a,
0, $5, 0, $41, $3f, $f2, $f6, $86, $76, $cf,
$11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1,
0, $9, 0, 0, 0, $4d, $61, $74, $72, $69,
$78, $34, $78, $34, $1, 0, $b, 0, 0, 0,
$66, $72, $61, $6d, $65, $4d, $61, $74, $72, $69,
$78, $14, 0, $b, 0, $1f, 0, $1, 0, $5,
0, 0, 0, $46, $72, $61, $6d, $65, $a, 0,
$5, 0, $46, $ab, $82, $3d, $da, $62, $cf, $11,
$ab, $39, 0, $20, $af, $71, $e4, $33, $e, 0,
$12, 0, $12, 0, $12, 0, $f, 0, $b, 0,
$1f, 0, $1, 0, $9, 0, 0, 0, $46, $6c,
$6f, $61, $74, $4b, $65, $79, $73, $a, 0, $5,
0, $a9, $46, $dd, $10, $5b, $77, $cf, $11, $8f,
$52, 0, $40, $33, $35, $94, $a3, $29, 0, $1,
0, $7, 0, 0, 0, $6e, $56, $61, $6c, $75,
$65, $73, $14, 0, $34, 0, $2a, 0, $1, 0,
$6, 0, 0, 0, $76, $61, $6c, $75, $65, $73,
$e, 0, $1, 0, $7, 0, 0, 0, $6e, $56,
$61, $6c, $75, $65, $73, $f, 0, $14, 0, $b,
0, $1f, 0, $1, 0, $e, 0, 0, 0, $54,
$69, $6d, $65, $64, $46, $6c, $6f, $61, $74, $4b,
$65, $79, $73, $a, 0, $5, 0, $80, $b1, $6,
$f4, $3b, $7b, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $29, 0, $1, 0, $4, 0, 0,
0, $74, $69, $6d, $65, $14, 0, $1, 0, $9,
0, 0, 0, $46, $6c, $6f, $61, $74, $4b, $65,
$79, $73, $1, 0, $6, 0, 0, 0, $74, $66,
$6b, $65, $79, $73, $14, 0, $b, 0, $1f, 0,
$1, 0, $c, 0, 0, 0, $41, $6e, $69, $6d,
$61, $74, $69, $6f, $6e, $4b, $65, $79, $a, 0,
$5, 0, $a8, $46, $dd, $10, $5b, $77, $cf, $11,
$8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0,
$1, 0, $7, 0, 0, 0, $6b, $65, $79, $54,
$79, $70, $65, $14, 0, $29, 0, $1, 0, $5,
0, 0, 0, $6e, $4b, $65, $79, $73, $14, 0,
$34, 0, $1, 0, $e, 0, 0, 0, $54, $69,
$6d, $65, $64, $46, $6c, $6f, $61, $74, $4b, $65,
$79, $73, $1, 0, $4, 0, 0, 0, $6b, $65,
$79, $73, $e, 0, $1, 0, $5, 0, 0, 0,
$6e, $4b, $65, $79, $73, $f, 0, $14, 0, $b,
0, $1f, 0, $1, 0, $10, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $4f, $70,
$74, $69, $6f, $6e, $73, $a, 0, $5, 0, $c0,
$56, $bf, $e2, $f, $84, $cf, $11, $8f, $52, 0,
$40, $33, $35, $94, $a3, $29, 0, $1, 0, $a,
0, 0, 0, $6f, $70, $65, $6e, $63, $6c, $6f,
$73, $65, $64, $14, 0, $29, 0, $1, 0, $f,
0, 0, 0, $70, $6f, $73, $69, $74, $69, $6f,
$6e, $71, $75, $61, $6c, $69, $74, $79, $14, 0,
$b, 0, $1f, 0, $1, 0, $9, 0, 0, 0,
$41, $6e, $69, $6d, $61, $74, $69, $6f, $6e, $a,
0, $5, 0, $4f, $ab, $82, $3d, $da, $62, $cf,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $e,
0, $12, 0, $12, 0, $12, 0, $f, 0, $b,
0, $1f, 0, $1, 0, $c, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $53, $65,
$74, $a, 0, $5, 0, $50, $ab, $82, $3d, $da,
$62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4,
$33, $e, 0, $1, 0, $9, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $f, 0,
$b, 0, $1f, 0, $1, 0, $a, 0, 0, 0,
$49, $6e, $6c, $69, $6e, $65, $44, $61, $74, $61,
$a, 0, $5, 0, $a0, $ee, $23, $3a, $b1, $94,
$d0, $11, $ab, $39, 0, $20, $af, $71, $e4, $33,
$e, 0, $1, 0, $6, 0, 0, 0, $42, $49,
$4e, $41, $52, $59, $f, 0, $b, 0, $1f, 0,
$1, 0, $3, 0, 0, 0, $55, $72, $6c, $a,
0, $5, 0, $a1, $ee, $23, $3a, $b1, $94, $d0,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $29,
0, $1, 0, $5, 0, 0, 0, $6e, $55, $72,
$6c, $73, $14, 0, $34, 0, $31, 0, $1, 0,
$4, 0, 0, 0, $75, $72, $6c, $73, $e, 0,
$1, 0, $5, 0, 0, 0, $6e, $55, $72, $6c,
$73, $f, 0, $14, 0, $b, 0, $1f, 0, $1,
0, $f, 0, 0, 0, $50, $72, $6f, $67, $72,
$65, $73, $73, $69, $76, $65, $4d, $65, $73, $68,
$a, 0, $5, 0, $60, $c3, $63, $8a, $7d, $99,
$d0, $11, $94, $1c, 0, $80, $c8, $c, $fa, $7b,
$e, 0, $1, 0, $3, 0, 0, 0, $55, $72,
$6c, $13, 0, $1, 0, $a, 0, 0, 0, $49,
$6e, $6c, $69, $6e, $65, $44, $61, $74, $61, $f,
0, $b, 0, $1f, 0, $1, 0, $4, 0, 0,
0, $47, $75, $69, $64, $a, 0, $5, 0, $e0,
$90, $27, $a4, $10, $78, $cf, $11, $8f, $52, 0,
$40, $33, $35, $94, $a3, $29, 0, $1, 0, $5,
0, 0, 0, $64, $61, $74, $61, $31, $14, 0,
$28, 0, $1, 0, $5, 0, 0, 0, $64, $61,
$74, $61, $32, $14, 0, $28, 0, $1, 0, $5,
0, 0, 0, $64, $61, $74, $61, $33, $14, 0,
$34, 0, $2d, 0, $1, 0, $5, 0, 0, 0,
$64, $61, $74, $61, $34, $e, 0, $3, 0, $8,
0, 0, 0, $f, 0, $14, 0, $b, 0, $1f,
0, $1, 0, $e, 0, 0, 0, $53, $74, $72,
$69, $6e, $67, $50, $72, $6f, $70, $65, $72, $74,
$79, $a, 0, $5, 0, $e0, $21, $f, $7f, $e1,
$bf, $d1, $11, $82, $c0, 0, $a0, $c9, $69, $72,
$71, $31, 0, $1, 0, $3, 0, 0, 0, $6b,
$65, $79, $14, 0, $31, 0, $1, 0, $5, 0,
0, 0, $76, $61, $6c, $75, $65, $14, 0, $b,
0, $1f, 0, $1, 0, $b, 0, 0, 0, $50,
$72, $6f, $70, $65, $72, $74, $79, $42, $61, $67,
$a, 0, $5, 0, $e1, $21, $f, $7f, $e1, $bf,
$d1, $11, $82, $c0, 0, $a0, $c9, $69, $72, $71,
$e, 0, $1, 0, $e, 0, 0, 0, $53, $74,
$72, $69, $6e, $67, $50, $72, $6f, $70, $65, $72,
$74, $79, $f, 0, $b, 0, $1f, 0, $1, 0,
$e, 0, 0, 0, $45, $78, $74, $65, $72, $6e,
$61, $6c, $56, $69, $73, $75, $61, $6c, $a, 0,
$5, 0, $a0, $6a, $11, $98, $ba, $bd, $d1, $11,
$82, $c0, 0, $a0, $c9, $69, $72, $71, $1, 0,
$4, 0, 0, 0, $47, $75, $69, $64, $1, 0,
$12, 0, 0, 0, $67, $75, $69, $64, $45, $78,
$74, $65, $72, $6e, $61, $6c, $56, $69, $73, $75,
$61, $6c, $14, 0, $e, 0, $12, 0, $12, 0,
$12, 0, $f, 0, $b, 0);
 
//---------------
 
//Direct3DRM file
(*==========================================================================;
*
* Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved.
*
* Files: D3DRMDef.h D3DRMObj.h D3DRM.h D3DRMWin.h RMXFGUID.h RMXFTmpl.h
* Content: Direct3D Retained Mode include files
*
* DirectX 7.0 Delphi adaptation by Erik Unger
*
* Modified: 10-Sep-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
*
***************************************************************************)
 
var
D3DRMDLL : HMODULE = 0;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3drmdef.h
9288,37 → 5690,64
*
***************************************************************************)
 
{ TD3DRMVector4D structure }
 
type
PD3DRMVector4D = ^TD3DRMVector4D;
TD3DRMVector4D = packed record
TD3DRMVector4D = record
x, y, z, w: TD3DValue;
end;
 
PD3DRMMatrix4D = ^TD3DRMMatrix4D;
TD3DRMMatrix4D = array [0..3, 0..3] of TD3DValue;
D3DRMVECTOR4D = TD3DRMVector4D;
LPD3DRMVECTOR4D = PD3DRMVector4D;
 
{ TD3DRMMatrix4D structure }
 
TD3DRMMatrix4D = array[0..3, 0..3] of TD3DValue;
D3DRMMATRIX4D = TD3DRMMatrix4D;
 
{ TD3DRMQuaternion structure }
 
PD3DRMQuaternion = ^TD3DRMQuaternion;
TD3DRMQuaternion = packed record
TD3DRMQuaternion = record
s: TD3DValue;
v: TD3DVector;
end;
 
D3DRMQUATERNION = TD3DRMQuaternion;
LPD3DRMQUATERNION = PD3DRMQUATERNION;
 
{ TD3DRMRay structure }
 
PD3DRMRay = ^TD3DRMRay;
TD3DRMRay = packed record
TD3DRMRay = record
dvDir: TD3DVector;
dvPos: TD3DVector;
end;
 
D3DRMRAY = TD3DRMRay;
LPD3DRMRAY = PD3DRMRay;
 
{ TD3DRMBox structure }
 
PD3DRMBox = ^TD3DRMBox;
TD3DRMBox = packed record
TD3DRMBox = record
min, max: TD3DVector;
end;
 
TD3DRMWrapCallback = procedure (var lpD3DVector: TD3DVector;
var lpU, lpV: Integer; var lpD3DRMVA, lpD3DRMVB: TD3DVector; lpArg:
Pointer); stdcall; // unused ?
D3DRMBOX = TD3DRMBox;
LPD3DRMBOX = PD3DRMBox;
 
PD3DRMLightType = ^TD3DRMLightType; // is it 16 or 32 bit ?
{ TD3DRMWrapCallback }
 
TD3DRMWrapCallback = procedure(var lpD3DVector: TD3DVector; var lpU: Integer;
var lpV: Integer; var lpD3DRMVA: TD3DVector; lpD3DRMVB: TD3DVector;
lpArg: Pointer); stdcall;
 
D3DRMWRAPCALLBACK = TD3DRMWrapCallback;
 
{ TD3DRMLightType }
 
TD3DRMLightType = (
D3DRMLIGHT_AMBIENT,
D3DRMLIGHT_POINT,
9327,9 → 5756,13
D3DRMLIGHT_PARALLELPOINT
);
 
PD3DRMShadeMode = ^TD3DRMShadeMode;
TD3DRMShadeMode = WORD;
D3DRMLIGHTTYPE = TD3DRMLightType;
 
{ TD3DRMShadeMode }
 
TD3DRMShadeMode = Word;
D3DRMSHADEMODE = TD3DRMShadeMode;
 
const
D3DRMSHADE_FLAT = 0;
D3DRMSHADE_GOURAUD = 1;
9337,9 → 5770,11
D3DRMSHADE_MASK = 7;
D3DRMSHADE_MAX = 8;
 
{ TD3DRMLightMode }
 
type
PD3DRMLightMode = ^TD3DRMLightMode;
TD3DRMLightMode = WORD;
TD3DRMLightMode = Word;
D3DRMLIGHTMODE = TD3DRMLightMode;
 
const
D3DRMLIGHT_OFF = 0 * D3DRMSHADE_MAX;
9347,9 → 5782,11
D3DRMLIGHT_MASK = 7 * D3DRMSHADE_MAX;
D3DRMLIGHT_MAX = 8 * D3DRMSHADE_MAX;
 
{ TD3DRMFillMode }
 
type
PD3DRMFillMode = ^TD3DRMFillMode;
TD3DRMFillMode = WORD;
TD3DRMFillMode = Word;
D3DRMFILLMODE = TD3DRMFillMode;
 
const
D3DRMFILL_POINTS = 0 * D3DRMLIGHT_MAX;
9358,85 → 5795,100
D3DRMFILL_MASK = 7 * D3DRMLIGHT_MAX;
D3DRMFILL_MAX = 8 * D3DRMLIGHT_MAX;
 
{ TD3DRMRenderQuality }
 
type
PD3DRMRenderQuality = ^TD3DRMRenderQuality;
TD3DRMRenderQuality = DWORD;
D3DRMRENDERQUALITY = TD3DRMRenderQuality;
 
const
D3DRMRENDER_WIREFRAME =
(D3DRMSHADE_FLAT + D3DRMLIGHT_OFF + D3DRMFILL_WIREFRAME);
D3DRMRENDER_UNLITFLAT =
(D3DRMSHADE_FLAT + D3DRMLIGHT_OFF + D3DRMFILL_SOLID);
D3DRMRENDER_FLAT =
(D3DRMSHADE_FLAT + D3DRMLIGHT_ON + D3DRMFILL_SOLID);
D3DRMRENDER_GOURAUD =
(D3DRMSHADE_GOURAUD + D3DRMLIGHT_ON + D3DRMFILL_SOLID);
D3DRMRENDER_PHONG =
(D3DRMSHADE_PHONG + D3DRMLIGHT_ON + D3DRMFILL_SOLID);
D3DRMRENDER_WIREFRAME = D3DRMSHADE_FLAT + D3DRMLIGHT_OFF + D3DRMFILL_WIREFRAME;
D3DRMRENDER_UNLITFLAT = D3DRMSHADE_FLAT + D3DRMLIGHT_OFF + D3DRMFILL_SOLID;
D3DRMRENDER_FLAT = D3DRMSHADE_FLAT + D3DRMLIGHT_ON + D3DRMFILL_SOLID;
D3DRMRENDER_GOURAUD = D3DRMSHADE_GOURAUD + D3DRMLIGHT_ON + D3DRMFILL_SOLID;
D3DRMRENDER_PHONG = D3DRMSHADE_PHONG + D3DRMLIGHT_ON + D3DRMFILL_SOLID;
 
D3DRMRENDERMODE_BLENDEDTRANSPARENCY = 1;
D3DRMRENDERMODE_SORTEDTRANSPARENCY = 2;
D3DRMRENDERMODE_LIGHTINMODELSPACE = 8;
D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR = 16;
D3DRMRENDERMODE_BLENDEDTRANSPARENCY = 1;
D3DRMRENDERMODE_SORTEDTRANSPARENCY = 2;
D3DRMRENDERMODE_LIGHTINMODELSPACE = 8;
D3DRMRENDERMODE_VIEWDEPENDENTSPECULAR = 16;
D3DRMRENDERMODE_DISABLESORTEDALPHAZWRITE = 32;
 
{ TD3DRMTextureQuality }
 
type
PD3DRMTextureQuality = ^TD3DRMTextureQuality;
TD3DRMTextureQuality = (
D3DRMTEXTURE_NEAREST, (* choose nearest texel *)
D3DRMTEXTURE_LINEAR, (* interpolate 4 texels *)
D3DRMTEXTURE_MIPNEAREST, (* nearest texel in nearest mipmap *)
D3DRMTEXTURE_MIPLINEAR, (* interpolate 2 texels from 2 mipmaps *)
D3DRMTEXTURE_LINEARMIPNEAREST, (* interpolate 4 texels in nearest mipmap *)
D3DRMTEXTURE_LINEARMIPLINEAR (* interpolate 8 texels from 2 mipmaps *)
D3DRMTEXTURE_NEAREST, // choose nearest texel
D3DRMTEXTURE_LINEAR, // interpolate 4 texels
D3DRMTEXTURE_MIPNEAREST, // nearest texel in nearest mipmap
D3DRMTEXTURE_MIPLINEAR, // interpolate 2 texels from 2 mipmaps
D3DRMTEXTURE_LINEARMIPNEAREST, // interpolate 4 texels in nearest mipmap
D3DRMTEXTURE_LINEARMIPLINEAR // interpolate 8 texels from 2 mipmaps
);
 
D3DRMTEXTUREQUALITY = TD3DRMTextureQuality;
 
{ Texture flags }
 
const
(*
* Texture flags
*)
D3DRMTEXTURE_FORCERESIDENT = $00000001; (* texture should be kept in video memory *)
D3DRMTEXTURE_STATIC = $00000002; (* texture will not change *)
D3DRMTEXTURE_DOWNSAMPLEPOINT = $00000004; (* point filtering should be used when downsampling *)
D3DRMTEXTURE_DOWNSAMPLEBILINEAR = $00000008; (* bilinear filtering should be used when downsampling *)
D3DRMTEXTURE_DOWNSAMPLEREDUCEDEPTH = $00000010; (* reduce bit depth when downsampling *)
D3DRMTEXTURE_DOWNSAMPLENONE = $00000020; (* texture should never be downsampled *)
D3DRMTEXTURE_CHANGEDPIXELS = $00000040; (* pixels have changed *)
D3DRMTEXTURE_CHANGEDPALETTE = $00000080; (* palette has changed *)
D3DRMTEXTURE_INVALIDATEONLY = $00000100; (* dirty regions are invalid *)
D3DRMTEXTURE_FORCERESIDENT = $00000001; // texture should be kept in video memory
D3DRMTEXTURE_STATIC = $00000002; // texture will not change
D3DRMTEXTURE_DOWNSAMPLEPOINT = $00000004; // point filtering should be used when downsampling
D3DRMTEXTURE_DOWNSAMPLEBILINEAR = $00000008; // bilinear filtering should be used when downsampling
D3DRMTEXTURE_DOWNSAMPLEREDUCEDEPTH = $00000010; // reduce bit depth when downsampling
D3DRMTEXTURE_DOWNSAMPLENONE = $00000020; // texture should never be downsampled
D3DRMTEXTURE_CHANGEDPIXELS = $00000040; // pixels have changed
D3DRMTEXTURE_CHANGEDPALETTE = $00000080; // palette has changed
D3DRMTEXTURE_INVALIDATEONLY = $00000100; // dirty regions are invalid
 
(*
* Shadow flags
*)
D3DRMSHADOW_TRUEALPHA = $00000001; (* shadow should render without artifacts when true alpha is on *)
{ Shadow flags }
 
const
D3DRMSHADOW_TRUEALPHA = $00000001; // shadow should render without artifacts when true alpha is on
 
{ TD3DRMCombineType }
 
type
PD3DRMCombineType = ^TD3DRMCombineType;
TD3DRMCombineType = (
D3DRMCOMBINE_REPLACE,
D3DRMCOMBINE_BEFORE,
D3DRMCOMBINE_AFTER
D3DRMCOMBINE_REPLACE,
D3DRMCOMBINE_BEFORE,
D3DRMCOMBINE_AFTER
);
 
PD3DRMColorModel = ^TD3DRMColorModel;
D3DRMCOMBINETYPE = TD3DRMCombineType;
 
{ TD3DRMColorModel }
 
TD3DRMColorModel = TD3DColorModel;
D3DRMCOLORMODEL = TD3DRMColorModel;
 
PD3DRMPaletteFlags = ^TD3DRMPaletteFlags;
{ TD3DRMPaletteFlags }
 
TD3DRMPaletteFlags = (
D3DRMPALETTE_FREE, (* renderer may use this entry freely *)
D3DRMPALETTE_READONLY, (* fixed but may be used by renderer *)
D3DRMPALETTE_RESERVED (* may not be used by renderer *)
D3DRMPALETTE_FREE, // renderer may use this entry freely
D3DRMPALETTE_READONLY, // fixed but may be used by renderer
D3DRMPALETTE_RESERVED // may not be used by renderer
);
 
D3DRMPALETTEFLAGS = TD3DRMPaletteFlags;
 
{ TD3DRMPaletteEntry structure }
 
PD3DRMPaletteEntry = ^TD3DRMPaletteEntry;
TD3DRMPaletteEntry = packed record
red: Byte; (* 0 .. 255 *)
green: Byte; (* 0 .. 255 *)
blue: Byte; (* 0 .. 255 *)
flags: Byte; (* one of D3DRMPALETTEFLAGS *)
TD3DRMPaletteEntry = record
red: Byte; // 0 .. 255
green: Byte; // 0 .. 255
blue: Byte; // 0 .. 255
flags: Byte; // one of TD3DRMPaletteFlags
end;
 
D3DRMPALETTEENTRY = TD3DRMPaletteEntry;
LPD3DRMPALETTEENTRY = PD3DRMPaletteEntry;
 
{ TD3DRMImage structure }
 
PD3DRMImage = ^TD3DRMImage;
TD3DRMImage = packed record
TD3DRMImage = record
width, height: Integer; (* width and height in pixels *)
aspectx, aspecty: Integer; (* aspect ratio for non-square pixels *)
depth: Integer; (* bits per pixel *)
9450,10 → 5902,10
buffer2: Pointer; (* second rendering buffer for double
buffering, set to NULL for single
buffering. *)
red_mask: DWORD;
green_mask: DWORD;
blue_mask: DWORD;
alpha_mask: DWORD; (* if rgb is true, these are masks for
red_mask: Longint;
green_mask: Longint;
blue_mask: Longint;
alpha_mask: Longint; (* if rgb is true, these are masks for
the red, green and blue parts of a
pixel. Otherwise, these are masks
for the significant bits of the
9468,7 → 5920,11
elements. *)
end;
 
PD3DRMWrapType = ^TD3DRMWrapType;
D3DRMIMAGE = TD3DRMImage;
LPD3DRMIMAGE = PD3DRMImage;
 
{ TD3DRMWrapType }
 
TD3DRMWrapType = (
D3DRMWRAP_FLAT,
D3DRMWRAP_CYLINDER,
9478,29 → 5934,31
D3DRMWRAP_BOX
);
 
D3DRMWRAPTYPE = TD3DRMWrapType;
 
const
D3DRMWIREFRAME_CULL = 1; (* cull backfaces *)
D3DRMWIREFRAME_HIDDENLINE = 2; (* lines are obscured by closer objects *)
D3DRMWIREFRAME_CULL = 1; // cull backfaces
D3DRMWIREFRAME_HIDDENLINE = 2; // lines are obscured by closer objects
 
{ TD3DRMProjectionType }
 
type
(*
* Do not use righthanded perspective in Viewport2::SetProjection().
* Set up righthanded mode by using IDirect3DRM3::SetOptions().
*)
PD3DRMProjectionType = ^TD3DRMProjectionType;
TD3DRMProjectionType = (
D3DRMPROJECT_PERSPECTIVE,
D3DRMPROJECT_ORTHOGRAPHIC,
D3DRMPROJECT_RIGHTHANDPERSPECTIVE, (* Only valid pre-DX6 *)
D3DRMPROJECT_RIGHTHANDORTHOGRAPHIC (* Only valid pre-DX6 *)
D3DRMPROJECT_RIGHTHANDPERSPECTIVE, // Only valid pre-DX6
D3DRMPROJECT_RIGHTHANDORTHOGRAPHIC // Only valid pre-DX6
);
 
D3DRMPROJECTIONTYPE = TD3DRMProjectionType;
 
const
D3DRMOPTIONS_LEFTHANDED = 00000001; (* Default *)
D3DRMOPTIONS_RIGHTHANDED = 00000002;
D3DRMOPTIONS_LEFTHANDED = $00000001; // Default
D3DRMOPTIONS_RIGHTHANDED = $00000002;
 
{ TD3DRMXOFFormat }
 
type
PD3DRMXOFFormat = ^TD3DRMXOFFormat;
TD3DRMXOFFormat = (
D3DRMXOF_BINARY,
D3DRMXOF_COMPRESSED,
9507,7 → 5965,13
D3DRMXOF_TEXT
);
 
D3DRMXOFFORMAT = TD3DRMXOFFormat;
 
{ TD3DRMSaveOptions }
 
TD3DRMSaveOptions = DWORD;
D3DRMSAVEOPTIONS = TD3DRMSaveOptions;
 
const
D3DRMXOFSAVE_NORMALS = 1;
D3DRMXOFSAVE_TEXTURECOORDINATES = 2;
9517,21 → 5981,28
D3DRMXOFSAVE_TEMPLATES = 16;
D3DRMXOFSAVE_TEXTURETOPOLOGY = 32;
 
{ TD3DRMColorSource }
 
type
PD3DRMColorSource = ^TD3DRMColorSource;
TD3DRMColorSource = (
D3DRMCOLOR_FROMFACE,
D3DRMCOLOR_FROMVERTEX
);
 
PD3DRMFrameConstraint = ^TD3DRMFrameConstraint;
D3DRMCOLORSOURCE = TD3DRMColorSource;
 
{ TD3DRMFrameConstraint }
 
TD3DRMFrameConstraint = (
D3DRMCONSTRAIN_Z, (* use only X and Y rotations *)
D3DRMCONSTRAIN_Y, (* use only X and Z rotations *)
D3DRMCONSTRAIN_X (* use only Y and Z rotations *)
D3DRMCONSTRAIN_Z, // use only X and Y rotations
D3DRMCONSTRAIN_Y, // use only X and Z rotations
D3DRMCONSTRAIN_X // use only Y and Z rotations
);
 
PD3DRMMaterialMode = ^TD3DRMMaterialMode;
D3DRMFRAMECONSTRAINT = TD3DRMFrameConstraint;
 
{ TD3DRMMaterialMode }
 
TD3DRMMaterialMode = (
D3DRMMATERIAL_FROMMESH,
D3DRMMATERIAL_FROMPARENT,
9538,39 → 6009,56
D3DRMMATERIAL_FROMFRAME
);
 
PD3DRMFogMode = ^TD3DRMFogMode;
D3DRMMATERIALMODE = TD3DRMMaterialMode;
 
{ TD3DRMFogMode }
 
TD3DRMFogMode = (
D3DRMFOG_LINEAR, (* linear between start and end *)
D3DRMFOG_EXPONENTIAL, (* density * exp(-distance) *)
D3DRMFOG_EXPONENTIALSQUARED (* density * exp(-distance*distance) *)
D3DRMFOG_LINEAR, // linear between start and end
D3DRMFOG_EXPONENTIAL, // density * exp(-distance)
D3DRMFOG_EXPONENTIALSQUARED // density * exp(-distance*distance)
);
 
PD3DRMZBufferMode = ^TD3DRMZBufferMode;
D3DRMFOGMODE = TD3DRMFogMode;
 
{ TD3DRMZBufferMode }
 
TD3DRMZBufferMode = (
D3DRMZBUFFER_FROMPARENT, (* default *)
D3DRMZBUFFER_ENABLE, (* enable zbuffering *)
D3DRMZBUFFER_DISABLE (* disable zbuffering *)
D3DRMZBUFFER_FROMPARENT, // default
D3DRMZBUFFER_ENABLE, // enable zbuffering
D3DRMZBUFFER_DISABLE // disable zbuffering
);
 
PD3DRMSortMode = ^TD3DRMSortMode;
D3DRMZBUFFERMODE = TD3DRMZBufferMode;
 
{ TD3DRMSortMode }
 
TD3DRMSortMode = (
D3DRMSORT_FROMPARENT, (* default *)
D3DRMSORT_NONE, (* don't sort child frames *)
D3DRMSORT_FRONTTOBACK, (* sort child frames front-to-back *)
D3DRMSORT_BACKTOFRONT (* sort child frames back-to-front *)
D3DRMSORT_FROMPARENT, // default
D3DRMSORT_NONE, // don't sort child frames
D3DRMSORT_FRONTTOBACK, // sort child frames front-to-back
D3DRMSORT_BACKTOFRONT // sort child frames back-to-front
);
 
TD3DRMMaterialOverride = packed record
dwSize : DWORD; (* Size of this structure *)
dwFlags : DWORD; (* Indicate which fields are valid *)
dcDiffuse : TD3DColorValue; (* RGBA *)
dcAmbient : TD3DColorValue; (* RGB *)
dcEmissive : TD3DColorValue; (* RGB *)
dcSpecular : TD3DColorValue; (* RGB *)
dvPower : TD3DValue;
lpD3DRMTex : IUnknown;
D3DRMSORTMODE = TD3DRMSortMode;
 
{ TD3DRMMaterialOverride structure }
 
PD3DRMMaterialOverride = ^TD3DRMMaterialOverride;
TD3DRMMaterialOverride = record
dwSize: DWORD; // Size of this structure
dwFlags: DWORD; // Indicate which fields are valid
dcDiffuse: TD3DColorValue; // RGBA
dcAmbient: TD3DColorValue; // RGB
dcEmissive: TD3DColorValue; // RGB
dcSpecular: TD3DColorValue; // RGB
dvPower: TD3DValue;
lpD3DRMTex: IUnknown;
end;
 
D3DRMMATERIALOVERRIDE = TD3DRMMaterialOverride;
LPD3DRMMATERIALOVERRIDE = PD3DRMMaterialOverride;
 
const
D3DRMMATERIALOVERRIDE_DIFFUSE_ALPHAONLY = $00000001;
D3DRMMATERIALOVERRIDE_DIFFUSE_RGBONLY = $00000002;
9583,133 → 6071,132
D3DRMMATERIALOVERRIDE_DIFFUSE_ALPHAMULTIPLY = $00000080;
D3DRMMATERIALOVERRIDE_ALL = $000000FF;
 
D3DRMFPTF_ALPHA = $00000001;
D3DRMFPTF_NOALPHA = $00000002;
D3DRMFPTF_PALETTIZED = $00000004;
D3DRMFPTF_NOTPALETTIZED = $00000008;
D3DRMFPTF_ALPHA = $00000001;
D3DRMFPTF_NOALPHA = $00000002;
D3DRMFPTF_PALETTIZED = $00000004;
D3DRMFPTF_NOTPALETTIZED = $00000008;
 
D3DRMSTATECHANGE_UPDATEONLY = $000000001;
D3DRMSTATECHANGE_VOLATILE = $000000002;
D3DRMSTATECHANGE_NONVOLATILE = $000000004;
D3DRMSTATECHANGE_RENDER = $000000020;
D3DRMSTATECHANGE_LIGHT = $000000040;
D3DRMSTATECHANGE_UPDATEONLY = $000000001;
D3DRMSTATECHANGE_VOLATILE = $000000002;
D3DRMSTATECHANGE_NONVOLATILE = $000000004;
D3DRMSTATECHANGE_RENDER = $000000020;
D3DRMSTATECHANGE_LIGHT = $000000040;
 
(*
* Values for flags in RM3::CreateDeviceFromSurface
*)
D3DRMDEVICE_NOZBUFFER = $00000001;
{ Values for flags in RM3::CreateDeviceFromSurface }
 
(*
* Values for flags in Object2::SetClientData
*)
D3DRMCLIENTDATA_NONE = $00000001;
D3DRMCLIENTDATA_LOCALFREE = $00000002;
D3DRMCLIENTDATA_IUNKNOWN = $00000004;
D3DRMDEVICE_NOZBUFFER = $00000001;
 
(*
* Values for flags in Frame2::AddMoveCallback.
*)
D3DRMCALLBACK_PREORDER = 0;
D3DRMCALLBACK_POSTORDER = 1;
{ Values for flags in Object2::SetClientData }
 
(*
* Values for flags in MeshBuilder2::RayPick.
*)
D3DRMRAYPICK_ONLYBOUNDINGBOXES = 1;
D3DRMRAYPICK_IGNOREFURTHERPRIMITIVES = 2;
D3DRMRAYPICK_INTERPOLATEUV = 4;
D3DRMRAYPICK_INTERPOLATECOLOR = 8;
D3DRMRAYPICK_INTERPOLATENORMAL = $10;
D3DRMCLIENTDATA_NONE = $00000001;
D3DRMCLIENTDATA_LOCALFREE = $00000002;
D3DRMCLIENTDATA_IUNKNOWN = $00000004;
 
(*
* Values for flags in MeshBuilder3::AddFacesIndexed.
*)
D3DRMADDFACES_VERTICESONLY = 1;
{ Values for flags in Frame2::AddMoveCallback. }
 
(*
* Values for flags in MeshBuilder2::GenerateNormals.
*)
D3DRMGENERATENORMALS_PRECOMPACT = 1;
D3DRMGENERATENORMALS_USECREASEANGLE = 2;
D3DRMCALLBACK_PREORDER = 0;
D3DRMCALLBACK_POSTORDER = 1;
 
(*
* Values for MeshBuilder3::GetParentMesh
*)
D3DRMMESHBUILDER_DIRECTPARENT = 1;
D3DRMMESHBUILDER_ROOTMESH = 2;
{ Values for flags in MeshBuilder2::RayPick. }
 
(*
* Flags for MeshBuilder3::Enable
*)
D3DRMMESHBUILDER_RENDERENABLE = $00000001;
D3DRMMESHBUILDER_PICKENABLE = $00000002;
D3DRMRAYPICK_ONLYBOUNDINGBOXES = 1;
D3DRMRAYPICK_IGNOREFURTHERPRIMITIVES = 2;
D3DRMRAYPICK_INTERPOLATEUV = 4;
D3DRMRAYPICK_INTERPOLATECOLOR = 8;
D3DRMRAYPICK_INTERPOLATENORMAL = $10;
 
(*
* Flags for Object2::GetAge when used with MeshBuilders
*)
D3DRMMESHBUILDERAGE_GEOMETRY = $00000001;
D3DRMMESHBUILDERAGE_MATERIALS = $00000002;
D3DRMMESHBUILDERAGE_TEXTURES = $00000004;
{ Values for flags in MeshBuilder3::AddFacesIndexed. }
 
(*
* Format flags for MeshBuilder3::AddTriangles.
*)
D3DRMFVF_TYPE = $00000001;
D3DRMFVF_NORMAL = $00000002;
D3DRMFVF_COLOR = $00000004;
D3DRMFVF_TEXTURECOORDS = $00000008;
D3DRMADDFACES_VERTICESONLY = 1;
 
D3DRMVERTEX_STRIP = $00000001;
D3DRMVERTEX_FAN = $00000002;
D3DRMVERTEX_LIST = $00000004;
 
(*
* Values for flags in Viewport2::Clear2
*)
D3DRMCLEAR_TARGET = $00000001;
D3DRMCLEAR_ZBUFFER = $00000002;
D3DRMCLEAR_DIRTYRECTS = $00000004;
D3DRMCLEAR_ALL = (D3DRMCLEAR_TARGET or
D3DRMCLEAR_ZBUFFER or
D3DRMCLEAR_DIRTYRECTS);
{ Values for flags in MeshBuilder2::GenerateNormals. }
 
(*
* Values for flags in Frame3::SetSceneFogMethod
*)
D3DRMFOGMETHOD_VERTEX = $00000001;
D3DRMFOGMETHOD_TABLE = $00000002;
D3DRMFOGMETHOD_ANY = $00000004;
D3DRMGENERATENORMALS_PRECOMPACT = 1;
D3DRMGENERATENORMALS_USECREASEANGLE = 2;
 
(*
* Values for flags in Frame3::SetTraversalOptions
*)
D3DRMFRAME_RENDERENABLE = $00000001;
D3DRMFRAME_PICKENABLE = $00000002;
{ Values for MeshBuilder3::GetParentMesh }
 
D3DRMMESHBUILDER_DIRECTPARENT = 1;
D3DRMMESHBUILDER_ROOTMESH = 2;
 
{ Flags for MeshBuilder3::Enable }
D3DRMMESHBUILDER_RENDERENABLE = $00000001;
D3DRMMESHBUILDER_PICKENABLE = $00000002;
 
{ Flags for MeshBuilder3::AddMeshBuilder }
D3DRMADDMESHBUILDER_DONTCOPYAPPDATA = 1;
D3DRMADDMESHBUILDER_FLATTENSUBMESHES = 2;
D3DRMADDMESHBUILDER_NOSUBMESHES = 4;
 
{ Flags for Object2::GetAge when used with MeshBuilders }
D3DRMMESHBUILDERAGE_GEOMETRY = $00000001;
D3DRMMESHBUILDERAGE_MATERIALS = $00000002;
D3DRMMESHBUILDERAGE_TEXTURES = $00000004;
 
{ Format flags for MeshBuilder3::AddTriangles. }
 
D3DRMFVF_TYPE = $00000001;
D3DRMFVF_NORMAL = $00000002;
D3DRMFVF_COLOR = $00000004;
D3DRMFVF_TEXTURECOORDS = $00000008;
 
D3DRMVERTEX_STRIP = $00000001;
D3DRMVERTEX_FAN = $00000002;
D3DRMVERTEX_LIST = $00000004;
 
{ Values for flags in Viewport2::Clear2 }
 
D3DRMCLEAR_TARGET = $00000001;
D3DRMCLEAR_ZBUFFER = $00000002;
D3DRMCLEAR_DIRTYRECTS = $00000004;
D3DRMCLEAR_ALL = D3DRMCLEAR_TARGET or D3DRMCLEAR_ZBUFFER or D3DRMCLEAR_DIRTYRECTS;
 
{ Values for flags in Frame3::SetSceneFogMethod }
 
D3DRMFOGMETHOD_VERTEX = $00000001;
D3DRMFOGMETHOD_TABLE = $00000002;
D3DRMFOGMETHOD_ANY = $00000004;
 
{ Values for flags in Frame3::SetTraversalOptions }
 
D3DRMFRAME_RENDERENABLE = $00000001;
D3DRMFRAME_PICKENABLE = $00000002;
 
{ TD3DRMAnimationOptions }
 
type
TD3DRMAnimationOptions = DWORD;
D3DRMANIMATIONOPTIONS = TD3DRMAnimationOptions;
 
const
D3DRMANIMATION_OPEN = $01;
D3DRMANIMATION_CLOSED = $02;
D3DRMANIMATION_LINEARPOSITION = $04;
D3DRMANIMATION_SPLINEPOSITION = $08;
D3DRMANIMATION_OPEN = $01;
D3DRMANIMATION_CLOSED = $02;
D3DRMANIMATION_LINEARPOSITION = $04;
D3DRMANIMATION_SPLINEPOSITION = $08;
D3DRMANIMATION_SCALEANDROTATION = $00000010;
D3DRMANIMATION_POSITION = $00000020;
D3DRMANIMATION_POSITION = $00000020;
 
{ TD3DRMInterpolationOptions }
 
type
TD3DRMInterpolationOptions = DWORD;
D3DRMINTERPOLATIONOPTIONS = TD3DRMInterpolationOptions;
 
const
D3DRMINTERPOLATION_OPEN = $01;
D3DRMINTERPOLATION_CLOSED = $02;
D3DRMINTERPOLATION_NEAREST = $0100;
D3DRMINTERPOLATION_LINEAR = $04;
D3DRMINTERPOLATION_SPLINE = $08;
D3DRMINTERPOLATION_VERTEXCOLOR = $40;
D3DRMINTERPOLATION_OPEN = $01;
D3DRMINTERPOLATION_CLOSED = $02;
D3DRMINTERPOLATION_NEAREST = $0100;
D3DRMINTERPOLATION_LINEAR = $04;
D3DRMINTERPOLATION_SPLINE = $08;
D3DRMINTERPOLATION_VERTEXCOLOR = $40;
D3DRMINTERPOLATION_SLERPNORMALS = $80;
 
{ TD3DRMLoadOptions }
 
type
TD3DRMLoadOptions = DWORD;
D3DRMLOADOPTIONS = TD3DRMLoadOptions;
 
const
D3DRMLOAD_FROMFILE = $00;
9728,98 → 6215,119
 
D3DRMLOAD_ASYNCHRONOUS = $400;
 
{ TD3DRMLoadReource }
 
type
PD3DRMLoadResource = ^TD3DRMLoadResource;
TD3DRMLoadResource = packed record
PD3DRMLoadReource = ^TD3DRMLoadReource;
TD3DRMLoadReource = record
hModule: HMODULE;
lpName: PAnsiChar;
lpType: PAnsiChar;
lpName: PChar;
lpType: PChar;
end;
 
D3DRMLOADRESOURCE = TD3DRMLoadReource;
LPD3DRMLOADRESOURCE = PD3DRMLoadReource;
 
{ TD3DRMLoadMemory }
 
PD3DRMLoadMemory = ^TD3DRMLoadMemory;
TD3DRMLoadMemory = packed record
TD3DRMLoadMemory = record
lpMemory: Pointer;
dwSize: DWORD;
dSize: DWORD;
end;
 
D3DRMLOADMEMORY = TD3DRMLoadMemory;
LPD3DRMLOADMEMORY = PD3DRMLoadMemory;
 
const
D3DRMPMESHSTATUS_VALID = $01;
D3DRMPMESHSTATUS_INTERRUPTED = $02;
D3DRMPMESHSTATUS_VALID = $01;
D3DRMPMESHSTATUS_INTERRUPTED = $02;
D3DRMPMESHSTATUS_BASEMESHCOMPLETE = $04;
D3DRMPMESHSTATUS_COMPLETE = $08;
D3DRMPMESHSTATUS_RENDERABLE = $10;
D3DRMPMESHSTATUS_COMPLETE = $08;
D3DRMPMESHSTATUS_RENDERABLE = $10;
 
D3DRMPMESHEVENT_BASEMESH = $01;
D3DRMPMESHEVENT_COMPLETE = $02;
 
{ TD3DRMPMeshLoadStatus }
 
type
PD3DRMPMeshLoadStatus = ^TD3DRMPMeshLoadStatus;
TD3DRMPMeshLoadStatus = packed record
dwSize, // Size of this structure
dwPMeshSize, // Total Size (bytes)
dwBaseMeshSize, // Total Size of the Base Mesh
dwBytesLoaded, // Total bytes loaded
dwVerticesLoaded, // Number of vertices loaded
dwFacesLoaded : DWORD; // Number of faces loaded
dwLoadResult : HResult; // Result of the load operation
dwFlags : DWORD;
TD3DRMPMeshLoadStatus = record
dwSize: DWORD; // Size of this structure
dwPMeshSize: DWORD; // Total Size (bytes)
dwBaseMeshSize: DWORD; // Total Size of the Base Mesh
dwBytesLoaded: DWORD; // Total bytes loaded
dwVerticesLoaded: DWORD; // Number of vertices loaded
dwFacesLoaded: DWORD; // Number of faces loaded
dwLoadResult: HResult; // Result of the load operation
dwFlags: DWORD;
end;
 
PD3DRMUserVisualReason = ^TD3DRMUserVisualReason;
D3DRMPMESHLOADSTATUS = TD3DRMPMeshLoadStatus;
LPD3DRMPMESHLOADSTATUS = PD3DRMPMeshLoadStatus;
 
{ TD3DRMUserVisualReason }
 
TD3DRMUserVisualReason = (
D3DRMUSERVISUAL_CANSEE,
D3DRMUSERVISUAL_RENDER
);
 
PD3DRMAnimationKey = ^TD3DRMAnimationKey;
TD3DRMAnimationKey = packed record
dwSize : DWORD;
dwKeyType : DWORD;
dvTime : TD3DValue;
dwID : DWORD;
case integer of
0 : (dqRotateKey : TD3DRMQuaternion);
1 : (dvScaleKey : TD3DVector);
2 : (dvPositionKey : TD3DVector);
3 : (dvK : array [0..3] of TD3DValue);
end;
D3DRMUSERVISUALREASON = TD3DRMUserVisualReason;
 
procedure D3DRMAnimationGetRotateKey
(var rmKey: TD3DRMAnimationKey; var rmQuat: TD3DRMQuaternion);
{ TD3DRMAnimationKey }
 
procedure D3DRMAnimationGetScaleKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
PD3DRMAnimationKey = ^TD3DRMAnimationKey;
TD3DRMAnimationKey = record
dwSize: DWORD;
dwKeyType: DWORD;
dvTime: TD3DValue;
dwID: DWORD;
 
procedure D3DRMAnimationGetPositionKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
case Integer of
0: (dqRotateKey: TD3DRMQuaternion);
1: (dvScaleKey: TD3DVector);
2: (dvPositionKey: TD3DVector);
3: (dvK: array[0..3] of TD3DValue);
end;
 
procedure D3DRMAnimatioSetRotateKey
(var rmKey: TD3DRMAnimationKey; var rmQuat: TD3DRMQuaternion);
D3DRMANIMATIONKEY = TD3DRMAnimationKey;
LPD3DRMANIMATIONKEY = PD3DRMAnimationKey;
 
procedure D3DRMAnimationSetScaleKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
procedure D3DRMAnimationGetRotateKey(const rmKey: TD3DRMAnimationKey; var rmQuat: TD3DRMQuaternion);
procedure D3DRMAnimationGetScaleKey(const rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
procedure D3DRMAnimationGetPositionKey(const rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
procedure D3DRMAnimationSetRotateKey(var rmKey: TD3DRMAnimationKey; const rmQuat: TD3DRMQuaternion);
procedure D3DRMAnimationSetScaleKey(var rmKey: TD3DRMAnimationKey; const dvVec: TD3DVector);
procedure D3DRMAnimationSetPositionKey(var rmKey: TD3DRMAnimationKey; const dvVec: TD3DVector);
 
procedure D3DRMAnimationSetPositionKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
 
const
D3DRMANIMATION_ROTATEKEY = 01;
D3DRMANIMATION_SCALEKEY = 02;
D3DRMANIMATION_POSITIONKEY = 03;
D3DRMANIMATION_ROTATEKEY = $01;
D3DRMANIMATION_SCALEKEY = $02;
D3DRMANIMATION_POSITIONKEY = $03;
 
{ TD3DRMMapping }
 
type
TD3DRMMapping = DWORD;
PD3DRMMappingFlag = ^TD3DRMMappingFlag;
D3DRMMAPPING = TD3DRMMapping;
 
{ TD3DRMMappingFlag }
 
TD3DRMMappingFlag = DWORD;
D3DRMMAPPINGFLAG = TD3DRMMappingFlag;
 
const
D3DRMMAP_WRAPU = 1;
D3DRMMAP_WRAPV = 2;
D3DRMMAP_WRAPU = 1;
D3DRMMAP_WRAPV = 2;
D3DRMMAP_PERSPCORRECT = 4;
 
{ TD3DRMVertex }
 
type
PD3DRMVertex = ^TD3DRMVertex;
TD3DRMVertex = packed record
TD3DRMVertex = record
position: TD3DVector;
normal: TD3DVector;
tu, tv: TD3DValue;
9826,197 → 6334,173
color: TD3DColor;
end;
 
TD3DRMGroupIndex = LongInt; (* group indexes begin a 0 *)
D3DRMVERTEX = TD3DRMVertex;
LPD3DRMVERTEX = PD3DRMVertex;
 
{ TD3DRMGroupIndex }
 
TD3DRMGroupIndex = Longint;
D3DRMGROUPINDEX = TD3DRMGroupIndex; // group indexes begin a 0
 
const
D3DRMGROUP_ALLGROUPS = -1;
 
var
(*
* Create a color from three components in the range 0-1 inclusive.
*)
D3DRMCreateColorRGB : function (red, green, blue: TD3DValue) : TD3DColor;
stdcall;
{ Create a color from three components in the range 0-1 inclusive. }
function D3DRMCreateColorRGB(red, green, blue: TD3DValue): TD3DColor; stdcall;
 
(*
* Create a color from four components in the range 0-1 inclusive.
*)
D3DRMCreateColorRGBA : function (red, green, blue, alpha: TD3DValue)
: TD3DColor; stdcall;
{ Create a color from four components in the range 0-1 inclusive. }
function D3DRMCreateColorRGBA(red, green, blue, alpha: TD3DValue): TD3DColor; stdcall;
 
(*
* Get the red component of a color.
*)
D3DRMColorGetRed : function (d3drmc: TD3DColor) : TD3DValue; stdcall;
{ Get the red component of a color. }
function D3DRMColorGetRed(d3drmc: TD3DColor): TD3DValue; stdcall;
 
(*
* Get the green component of a color.
*)
D3DRMColorGetGreen : function (d3drmc: TD3DColor) : TD3DValue; stdcall;
{ Get the green component of a color. }
function D3DRMColorGetGreen(d3drmc: TD3DColor): TD3DValue; stdcall;
 
(*
* Get the blue component of a color.
*)
D3DRMColorGetBlue : function (d3drmc: TD3DColor) : TD3DValue; stdcall;
{ Get the blue component of a color. }
function D3DRMColorGetBlue(d3drmc: TD3DColor): TD3DValue; stdcall;
 
(*
* Get the alpha component of a color.
*)
D3DRMColorGetAlpha : function (d3drmc: TD3DColor) : TD3DValue; stdcall;
{ Get the alpha component of a color. }
function D3DRMColorGetAlpha(d3drmc: TD3DColor): TD3DValue; stdcall;
 
(*
* Add two vectors. Returns its first argument.
*)
D3DRMVectorAdd : function (var d, s1, s2: TD3DVector) : PD3DVector; stdcall;
{ Add two vectors. Returns its first argument. }
function D3DRMVectorAdd(var d, s1, s2: TD3DVector): PD3DVector; stdcall;
 
(*
* Subtract two vectors. Returns its first argument.
*)
D3DRMVectorSubtract : function (var d, s1, s2: TD3DVector) : PD3DVector;
stdcall;
{ Subtract two vectors. Returns its first argument. }
function D3DRMVectorSubtract(var d, s1, s2: TD3DVector): PD3DVector; stdcall;
 
(*
* Reflect a ray about a given normal. Returns its first argument.
*)
D3DRMVectorReflect : function (var d, ray, norm: TD3DVector) : PD3DVector;
stdcall;
{ Reflect a ray about a given normal. Returns its first argument. }
function D3DRMVectorReflect(var d, ray, norm: TD3DVector): PD3DVector; stdcall;
 
(*
* Calculate the vector cross product. Returns its first argument.
*)
D3DRMVectorCrossProduct : function (var d, s1, s2: TD3DVector) : PD3DVector;
stdcall;
{ Calculate the vector cross product. Returns its first argument. }
function D3DRMVectorCrossProduct(var d, s1, s2: TD3DVector): PD3DVector; stdcall;
 
(*
* Return the vector dot product.
*)
D3DRMVectorDotProduct : function (var s1, s2: TD3DVector) : TD3DValue;
stdcall;
{ Return the vector dot product. }
function D3DRMVectorDotProduct(var s1, s2: TD3DVector): TD3DValue; stdcall;
 
(*
* Scale a vector so that its modulus is 1. Returns its argument or
* NULL if there was an error (e.g. a zero vector was passed).
*)
D3DRMVectorNormalize : function (var lpv: TD3DVector) : PD3DVector; stdcall;
{ Scale a vector so that its modulus is 1. Returns its argument or
NULL if there was an error (e.g. a zero vector was passed). }
function D3DRMVectorNormalize(var lpv: TD3DVector): PD3DVector; stdcall;
 
(*
* Return the length of a vector (e.g. sqrt(x*x + y*y + z*z)).
*)
D3DRMVectorModulus : function (var v: TD3DVector) : TD3DValue; stdcall;
{ Return the length of a vector (e.g. sqrt(x*x + y*y + z*z)). }
function D3DRMVectorModulus(var v: TD3DVector): TD3DValue; stdcall;
 
(*
* Set the rotation part of a matrix to be a rotation of theta radians
* around the given axis.
*)
D3DRMVectorRotate : function (var r, v, axis: TD3DVector; theta: TD3DValue) :
PD3DVector; stdcall;
{ Set the rotation part of a matrix to be a rotation of theta radians
around the given axis. }
function D3DRMVectorRotate(var r, v, axis: TD3DVector; theta: TD3DValue): PD3DVector; stdcall;
 
(*
* Scale a vector uniformly in all three axes
*)
D3DRMVectorScale : function (var d, s: TD3DVector; factor: TD3DValue) :
PD3DVector; stdcall;
{ Scale a vector uniformly in all three axes }
function D3DRMVectorScale( var d, s: TD3DVector; factor: TD3DValue): PD3DVector; stdcall;
 
(*
* Return a random unit vector
*)
D3DRMVectorRandom : function (var d: TD3DVector) : PD3DVector; stdcall;
{ Return a random unit vector }
function D3DRMVectorRandom(var d: TD3DVector): PD3DVector; stdcall;
 
(*
* Returns a unit quaternion that represents a rotation of theta radians
* around the given axis.
*)
{ Returns a unit quaternion that represents a rotation of theta radians
around the given axis. }
function D3DRMQuaternionFromRotation(var quat: PD3DRMQuaternion;
var v: TD3DVector; theta: TD3DValue): PD3DRMQuaternion; stdcall;
 
D3DRMQuaternionFromRotation : function (var quat: TD3DRMQuaternion;
var v: TD3DVector; theta: TD3DValue) : PD3DRMQuaternion; stdcall;
{ Calculate the product of two quaternions }
function D3DRMQuaternionMultiply(var q, a, b: TD3DRMQuaternion): PD3DRMQuaternion; stdcall;
 
(*
* Calculate the product of two quaternions
*)
D3DRMQuaternionMultiply : function (var q, a, b: TD3DRMQuaternion) :
PD3DRMQuaternion; stdcall;
{ Interpolate between two quaternions }
function D3DRMQuaternionSlerp(var q, a, b: TD3DRMQuaternion; alpha: TD3DValue): PD3DRMQuaternion; stdcall;
 
(*
* Interpolate between two quaternions
*)
D3DRMQuaternionSlerp : function (var q, a, b: TD3DRMQuaternion;
alpha: TD3DValue) : PD3DRMQuaternion; stdcall;
{ Calculate the matrix for the rotation that a unit quaternion represents }
procedure D3DRMMatrixFromQuaternion(dmMat: TD3DRMMatrix4D; var lpDqQuat: TD3DRMQuaternion); stdcall;
 
(*
* Calculate the matrix for the rotation that a unit quaternion represents
*)
D3DRMMatrixFromQuaternion : procedure (dmMat: TD3DRMMatrix4D; var lpDqQuat:
TD3DRMQuaternion); stdcall;
{ Calculate the quaternion that corresponds to a rotation matrix }
function D3DRMQuaternionFromMatrix(var lpQuat: TD3DRMQuaternion; Mat: TD3DRMMatrix4D): PD3DRMQuaternion;
 
(*
* Calculate the quaternion that corresponds to a rotation matrix
*)
D3DRMQuaternionFromMatrix : function (var lpQuat: TD3DRMQuaternion;
Mat: TD3DRMMatrix4D) : PD3DRMQuaternion; stdcall;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3drmobj.h
* File: d3drm.h, d3drmobj.h, d3drmwin.h
* Content: Direct3DRM include file
*
***************************************************************************)
 
(*
* Direct3DRM Object classes
*)
 
{ Direct3DRM Object classes }
const
CLSID_CDirect3DRMDevice: TGUID =
(D1:$4fa3568e;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMViewport: TGUID =
(D1:$4fa3568f;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMFrame: TGUID =
(D1:$4fa35690;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMMesh: TGUID =
(D1:$4fa35691;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMMeshBuilder: TGUID =
(D1:$4fa35692;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMFace: TGUID =
(D1:$4fa35693;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMLight: TGUID =
(D1:$4fa35694;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMTexture: TGUID =
(D1:$4fa35695;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMWrap: TGUID =
(D1:$4fa35696;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMMaterial: TGUID =
(D1:$4fa35697;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMAnimation: TGUID =
(D1:$4fa35698;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMAnimationSet: TGUID =
(D1:$4fa35699;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMUserVisual: TGUID =
(D1:$4fa3569a;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMShadow: TGUID =
(D1:$4fa3569b;D2:$623f;D3:$11cf;D4:($ac,$4a,$00,$00,$c0,$38,$25,$a1));
CLSID_CDirect3DRMViewportInterpolator: TGUID =
(D1:$0de9eaa1;D2:$3b84;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMFrameInterpolator: TGUID =
(D1:$0de9eaa2;D2:$3b84;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMMeshInterpolator: TGUID =
(D1:$0de9eaa3;D2:$3b84;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMLightInterpolator: TGUID =
(D1:$0de9eaa6;D2:$3b84;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMMaterialInterpolator: TGUID =
(D1:$0de9eaa7;D2:$3b84;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMTextureInterpolator: TGUID =
(D1:$0de9eaa8;D2:$3b84;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMProgressiveMesh: TGUID =
(D1:$4516ec40;D2:$8f20;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
CLSID_CDirect3DRMClippedVisual: TGUID =
(D1:$5434e72d;D2:$6d66;D3:$11d1;D4:($bb,$0b,$00,$00,$f8,$75,$86,$5a));
CLSID_CDirect3DRMDevice: TGUID = '{4FA3568E-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMViewport: TGUID = '{4FA3568F-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMFrame: TGUID = '{4FA35690-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMMesh: TGUID = '{4FA35691-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMMeshBuilder: TGUID = '{4FA35692-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMFace: TGUID = '{4FA35693-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMLight: TGUID = '{4FA35694-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMTexture: TGUID = '{4FA35695-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMWrap: TGUID = '{4FA35696-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMMaterial: TGUID = '{4FA35697-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMAnimation: TGUID = '{4FA35698-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMAnimationSet: TGUID = '{4FA35699-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMUserVisual: TGUID = '{4FA3569A-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMShadow: TGUID = '{4FA3569B-623F-11CF-AC4A-0000C03825A1}';
CLSID_CDirect3DRMViewportInterpolator: TGUID = '{0DE9EAA1-3B84-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMFrameInterpolator: TGUID = '{0DE9EAA2-3B84-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMMeshInterpolator: TGUID = '{0DE9EAA3-3B84-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMLightInterpolator: TGUID = '{0DE9EAA6-3B84-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMMaterialInterpolator: TGUID = '{0DE9EAA7-3B84-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMTextureInterpolator: TGUID = '{0DE9EAA8-3B84-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMProgressiveMesh: TGUID = '{4516EC40-8F20-11D0-9B6D-0000C0781BC3}';
CLSID_CDirect3DRMClippedVisual: TGUID = '{5434E72D-6D66-11D1-BB0B-0000F875865A}';
 
{ Direct3DRM Object interfaces }
 
IID_IDirect3DRMObject: TGUID = '{EB16CB00-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMObject2: TGUID = '{4516EC7C-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMDevice: TGUID = '{E9E19280-6E05-11CF-AC4A-0000C03825A1}';
IID_IDirect3DRMDevice2: TGUID = '{4516EC78-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMDevice3: TGUID = '{549F498B-BFEB-11D1-8ED8-00A0C967A482}';
IID_IDirect3DRMViewport: TGUID = '{EB16CB02-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMViewport2: TGUID = '{4A1B1BE6-BFED-11D1-8ED8-00A0C967A482}';
IID_IDirect3DRMFrame: TGUID = '{EB16CB03-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMFrame2: TGUID = '{C3DFBD60-3988-11D0-9EC2-0000C0291AC3}';
IID_IDirect3DRMFrame3: TGUID = '{FF6B7F70-A40E-11D1-91F9-0000F8758E66}';
IID_IDirect3DRMVisual: TGUID = '{EB16CB04-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMMesh: TGUID = '{A3A80D01-6E12-11CF-AC4A-0000C03825A1}';
IID_IDirect3DRMMeshBuilder: TGUID = '{A3A80D02-6E12-11CF-AC4A-0000C03825A1}';
IID_IDirect3DRMMeshBuilder2: TGUID = '{4516EC77-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMMeshBuilder3: TGUID = '{4516EC82-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMFace: TGUID = '{EB16CB07-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMFace2: TGUID = '{4516EC81-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMLight: TGUID = '{EB16CB08-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMTexture: TGUID = '{EB16CB09-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMTexture2: TGUID = '{120F30C0-1629-11D0-941C-0080C80CFA7B}';
IID_IDirect3DRMTexture3: TGUID = '{FF6B7F73-A40E-11D1-91F9-0000F8758E66}';
IID_IDirect3DRMWrap: TGUID = '{EB16CB0A-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMMaterial: TGUID = '{EB16CB0B-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMMaterial2: TGUID = '{FF6B7F75-A40E-11D1-91F9-0000F8758E66}';
IID_IDirect3DRMAnimation: TGUID = '{EB16CB0D-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMAnimation2: TGUID = '{FF6B7F77-A40E-11D1-91F9-0000F8758E66}';
IID_IDirect3DRMAnimationSet: TGUID = '{EB16CB0E-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMAnimationSet2: TGUID = '{FF6B7F79-A40E-11D1-91F9-0000F8758E66}';
IID_IDirect3DRMObjectArray: TGUID = '{242F6BC2-3849-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMDeviceArray: TGUID = '{EB16CB10-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMViewportArray: TGUID = '{EB16CB11-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMFrameArray: TGUID = '{EB16CB12-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMVisualArray: TGUID = '{EB16CB13-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMLightArray: TGUID = '{EB16CB14-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMPickedArray: TGUID = '{EB16CB16-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMFaceArray: TGUID = '{EB16CB17-D271-11CE-AC48-0000C03825A1}';
IID_IDirect3DRMAnimationArray: TGUID = '{D5F1CAE0-4BD7-11D1-B974-0060083E45F3}';
IID_IDirect3DRMUserVisual: TGUID = '{59163DE0-6D43-11CF-AC4A-0000C03825A1}';
IID_IDirect3DRMShadow: TGUID = '{AF359780-6BA3-11CF-AC4A-0000C03825A1}';
IID_IDirect3DRMShadow2: TGUID = '{86B44E25-9C82-11D1-BB0B-00A0C981A0A6}';
IID_IDirect3DRMInterpolator: TGUID = '{242F6BC1-3849-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMProgressiveMesh: TGUID = '{4516EC79-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMPicked2Array: TGUID = '{4516EC7B-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRMClippedVisual: TGUID = '{5434E733-6D66-11D1-BB0B-0000F875865A}';
 
IID_IDirect3DRMWinDevice: TGUID = '{C5016CC0-D273-11CE-AC48-0000C03825A1}';
IID_IDirect3DRM: TGUID = '{2BC49361-8327-11CF-AC4A-0000C03825A1}';
IID_IDirect3DRM2: TGUID = '{4516ECC8-8F20-11D0-9B6D-0000C0781BC3}';
IID_IDirect3DRM3: TGUID = '{4516EC83-8F20-11D0-9B6D-0000C0781BC3}';
 
type
IDirect3DRMObject = interface;
IDirect3DRMObject2 = interface;
IDirect3DRMDevice = interface;
IDirect3DRMDevice2 = interface;
IDirect3DRMDevice3 = interface;
10039,117 → 6523,94
IDirect3DRMWrap = interface;
IDirect3DRMMaterial = interface;
IDirect3DRMMaterial2 = interface;
IDirect3DRMInterpolator = interface;
IDirect3DRMAnimation = interface;
IDirect3DRMAnimation2 = interface;
IDirect3DRMAnimationSet = interface;
IDirect3DRMAnimationSet2 = interface;
IDirect3DRMArray = interface;
IDirect3DRMUserVisual = interface;
IDirect3DRMShadow = interface;
IDirect3DRMShadow2 = interface;
IDirect3DRMArray= interface;
IDirect3DRMObjectArray = interface;
IDirect3DRMDeviceArray = interface;
IDirect3DRMFaceArray = interface;
IDirect3DRMViewportArray = interface;
IDirect3DRMFrameArray = interface;
IDirect3DRMAnimationArray = interface;
IDirect3DRMVisualArray = interface;
IDirect3DRMPickedArray = interface;
IDirect3DRMPicked2Array = interface;
IDirect3DRMLightArray = interface;
IDirect3DRMPickedArray = interface;
IDirect3DRMFaceArray = interface;
IDirect3DRMAnimationArray = interface;
IDirect3DRMUserVisual = interface;
IDirect3DRMShadow = interface;
IDirect3DRMShadow2 = interface;
IDirect3DRMInterpolator = interface;
IDirect3DRMProgressiveMesh = interface;
IDirect3DRMPicked2Array = interface;
IDirect3DRMClippedVisual = interface;
 
(*
* Direct3DRM Object interfaces
*)
IID_IDirect3DRMObject = IDirect3DRMObject;
IID_IDirect3DRMDevice = IDirect3DRMDevice;
IID_IDirect3DRMDevice2 = IDirect3DRMDevice2;
IID_IDirect3DRMDevice3 = IDirect3DRMDevice3;
IID_IDirect3DRMViewport = IDirect3DRMViewport;
IID_IDirect3DRMViewport2 = IDirect3DRMViewport2;
IID_IDirect3DRMFrame = IDirect3DRMFrame;
IID_IDirect3DRMFrame2 = IDirect3DRMFrame2;
IID_IDirect3DRMFrame3 = IDirect3DRMFrame3;
IID_IDirect3DRMVisual = IDirect3DRMVisual;
IID_IDirect3DRMMesh = IDirect3DRMMesh;
IID_IDirect3DRMMeshBuilder = IDirect3DRMMeshBuilder;
IID_IDirect3DRMMeshBuilder2 = IDirect3DRMMeshBuilder2;
IID_IDirect3DRMMeshBuilder3 = IDirect3DRMMeshBuilder3;
IID_IDirect3DRMFace = IDirect3DRMFace;
IID_IDirect3DRMFace2 = IDirect3DRMFace2;
IID_IDirect3DRMLight = IDirect3DRMLight;
IID_IDirect3DRMTexture = IDirect3DRMTexture;
IID_IDirect3DRMTexture2 = IDirect3DRMTexture2;
IID_IDirect3DRMTexture3 = IDirect3DRMTexture3;
IID_IDirect3DRMWrap = IDirect3DRMWrap;
IID_IDirect3DRMMaterial = IDirect3DRMMaterial;
IID_IDirect3DRMMaterial2 = IDirect3DRMMaterial2;
IID_IDirect3DRMAnimation = IDirect3DRMAnimation;
IID_IDirect3DRMAnimation2 = IDirect3DRMAnimation2;
IID_IDirect3DRMAnimationSet = IDirect3DRMAnimationSet;
IID_IDirect3DRMAnimationSet2 = IDirect3DRMAnimationSet2;
IID_IDirect3DRMObjectArray = IDirect3DRMObjectArray;
IID_IDirect3DRMDeviceArray = IDirect3DRMDeviceArray;
IID_IDirect3DRMViewportArray = IDirect3DRMViewportArray;
IID_IDirect3DRMFrameArray = IDirect3DRMFrameArray;
IID_IDirect3DRMVisualArray = IDirect3DRMVisualArray;
IID_IDirect3DRMLightArray = IDirect3DRMLightArray;
IID_IDirect3DRMPickedArray = IDirect3DRMPickedArray;
IID_IDirect3DRMFaceArray = IDirect3DRMFaceArray;
IID_IDirect3DRMAnimationArray = IDirect3DRMAnimationArray;
IID_IDirect3DRMUserVisual = IDirect3DRMUserVisual;
IID_IDirect3DRMShadow = IDirect3DRMShadow;
IID_IDirect3DRMShadow2 = IDirect3DRMShadow2;
IID_IDirect3DRMInterpolator = IDirect3DRMInterpolator;
IID_IDirect3DRMProgressiveMesh = IDirect3DRMProgressiveMesh;
IID_IDirect3DRMPicked2Array = IDirect3DRMPicked2Array;
IID_IDirect3DRMClippedVisual = IDirect3DRMClippedVisual;
IDirect3DRMWinDevice = interface;
IDirect3DRM = interface;
IDirect3DRM2 = interface;
IDirect3DRM3 = interface;
 
TD3DRMObjectCallback = procedure(obj: IDirect3DRMObject; arg: Pointer); cdecl;
D3DRMOBJECTCALLBACK = TD3DRMObjectCallback;
 
TD3DRMFrameMoveCallback = procedure(obj: IDirect3DRMFrame; arg: Pointer; delta: TD3DValue); cdecl;
D3DRMFRAMEMOVECALLBACK = TD3DRMFrameMoveCallback;
 
TD3DRMFrame3MoveCallback = procedure(obj: IDirect3DRMFrame3; arg: Pointer; delta: TD3DValue); cdecl;
D3DRMFRAME3MOVECALLBACK = TD3DRMFrame3MoveCallback;
 
TD3DRMUpdateCallback = procedure(obj: IDirect3DRMDevice; arg: Pointer;
iRectCount: DWORD; d3dRectUpdate: PD3DRect); cdecl;
D3DRMUPDATECALLBACK = TD3DRMUpdateCallback;
 
PIDirect3DRMFaceArray = ^IDirect3DRMFaceArray;
TD3DRMDevice3UpdateCallback = procedure(obj: IDirect3DRMDevice3; arg: Pointer;
iRectCount: DWORD; d3dRectUpdate: PD3DRect); cdecl;
D3DRMDEVICE3UPDATECALLBACK = TD3DRMDevice3UpdateCallback;
 
TD3DRMObjectCallback = procedure (lpD3DRMobj: IDirect3DRMObject;
lpArg: Pointer); cdecl;
TD3DRMFrameMoveCallback = procedure (lpD3DRMFrame: IDirect3DRMFrame;
lpArg: Pointer; delta: TD3DValue); cdecl;
TD3DRMFrame3MoveCallback = procedure (lpD3DRMFrame: IDirect3DRMFrame3;
lpArg: Pointer; delta: TD3DValue); cdecl;
TD3DRMUpdateCallback = procedure (lpobj: IDirect3DRMDevice; lpArg: Pointer;
iRectCount: Integer; const d3dRectUpdate: TD3DRect); cdecl;
TD3DRMDevice3UpdateCallback = procedure (lpobj: IDirect3DRMDevice3;
lpArg: Pointer; iRectCount: Integer; const d3dRectUpdate: TD3DRect);cdecl;
TD3DRMUserVisualCallback = function (lpD3DRMUV: IDirect3DRMUserVisual;
TD3DRMUserVisualCallback = function(lpD3DRMUV: IDirect3DRMUserVisual;
lpArg: Pointer; lpD3DRMUVreason: TD3DRMUserVisualReason;
lpD3DRMDev: IDirect3DRMDevice;
lpD3DRMview: IDirect3DRMViewport) : Integer; cdecl;
TD3DRMLoadTextureCallback = function (tex_name: PAnsiChar; lpArg: Pointer;
out lpD3DRMTex: IDirect3DRMTexture) : HResult; cdecl;
TD3DRMLoadTexture3Callback = function (tex_name: PAnsiChar; lpArg: Pointer;
out lpD3DRMTex: IDirect3DRMTexture3) : HResult; cdecl;
TD3DRMLoadCallback = procedure (lpObject: IDirect3DRMObject;
const ObjectGuid: TGUID; lpArg: Pointer); cdecl;
TD3DRMDownSampleCallback = function (lpDirect3DRMTexture: IDirect3DRMTexture3;
pArg: pointer; pDDSSrc, pDDSDst: IDirectDrawSurface) : HResult; cdecl;
TD3DRMValidationCallback = function (lpDirect3DRMTexture: IDirect3DRMTexture3;
pArg: pointer; dwFlags, DWcRects: DWORD; const pRects: TRect) : HResult; cdecl;
lpD3DRMview: IDirect3DRMViewport): Longint; cdecl;
D3DRMUSERVISUALCALLBACK = TD3DRMUserVisualCallback;
 
TD3DRMLoadTextureCallback = function(tex_name: PChar; arg: Pointer;
out lpD3DRMTex: IDirect3DRMTexture): HResult; cdecl;
D3DRMLOADTEXTURECALLBACK = TD3DRMLoadTextureCallback;
 
TD3DRMLoadTexture3Callback = function(tex_name: PChar; arg: Pointer;
out lpD3DRMTex: IDirect3DRMTexture3): HResult; cdecl;
D3DRMLOADTEXTURE3CALLBACK = TD3DRMLoadTexture3Callback;
 
TD3DRMLoadCallback = procedure(lpObject: IDirect3DRMObject; const ObjectGuid: TGUID;
lpArg: Pointer); cdecl;
D3DRMLOADCALLBACK = TD3DRMLoadCallback;
 
TD3DRMDownSampleCallback = function(lpDirect3DRMTexture: IDirect3DRMTexture3;
pArg: Pointer; pDDSSrc, pDDSDst: IDirectDrawSurface): HResult; cdecl;
D3DRMDOWNSAMPLECALLBACK = TD3DRMDownSampleCallback;
 
TD3DRMValidationCallback = function(lpDirect3DRMTexture: IDirect3DRMTexture3;
pArg: Pointer; dwFlags: DWORD; dwcRects: DWORD; pRects: PRect): HResult; cdecl;
D3DRMVALIDATIONCALLBACK = TD3DRMValidationCallback;
 
{ TD3DRMPickDesc }
 
PD3DRMPickDesc = ^TD3DRMPickDesc;
TD3DRMPickDesc = packed record
ulFaceIdx: DWORD;
lGroupIdx: LongInt;
TD3DRMPickDesc = record
ulFaceIdx: Longint;
lGroupIdx: Longint;
vPosition: TD3DVector;
end;
 
D3DRMPICKDESC = TD3DRMPickDesc;
LPD3DRMPICKDESC = PD3DRMPickDesc;
 
{ TD3DRMPickDesc2 }
 
PD3DRMPickDesc2 = ^TD3DRMPickDesc2;
TD3DRMPickDesc2 = packed record
ulFaceIdx: DWORD;
lGroupIdx: LongInt;
TD3DRMPickDesc2 = record
ulFaceIdx: Longint;
lGroupIdx: Longint;
dvPosition: TD3DVector;
tu, tv: TD3DValue;
dvNormal: TD3DVector;
10156,55 → 6617,63
dcColor: TD3DColor;
end;
 
(*
* Base class
*)
{$IFDEF D2COM}
IDirect3DRMObject = class (IUnknown)
{$ELSE}
IDirect3DRMObject = interface (IUnknown)
['{eb16cb00-d271-11ce-ac48-0000c03825a1}']
{$ENDIF}
(*
* The methods for IDirect3DRMObject
*)
function Clone (pUnkOuter: IUnknown; riid: TGUID;
var ppvObj: Pointer) : HResult; stdcall;
function AddDestroyCallback (lpCallback: TD3DRMObjectCallback;
lpArg: Pointer) : HResult; stdcall;
function DeleteDestroyCallback (d3drmObjProc: TD3DRMObjectCallback;
lpArg: Pointer) : HResult; stdcall;
function SetAppData (ulData: DWORD) : HResult; stdcall;
D3DRMPICKDESC2 = TD3DRMPickDesc2;
LPD3DRMPICKDESC2 = PD3DRMPickDesc2;
 
IDirect3DRMObject = interface(IUnknown)
['{EB16CB00-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMObject methods
function Clone(pUnkOuter: IUnknown; const riid: TGUID; out ppvObj): HResult; stdcall;
function AddDestroyCallback(lpCallback: TD3DRMObjectCallback;
lpArg: Pointer): HResult; stdcall;
function DeleteDestroyCallback(d3drmObjProc: TD3DRMObjectCallback;
lpArg: Pointer): HResult; stdcall;
function SetAppData(ulData: DWORD): HResult; stdcall;
function GetAppData: DWORD; stdcall;
function SetName (lpName: PAnsiChar) : HResult; stdcall;
function GetName (var lpdwSize: DWORD; lpName: PAnsiChar) : HResult; stdcall;
function GetClassName (var lpdwSize: DWORD; lpName: PAnsiChar) : HResult; stdcall;
function SetName(lpName: PChar): HResult; stdcall;
function GetName(var lpdwSize: DWORD; lpName: PChar): HResult; stdcall;
function GetClassName(var lpdwSize: DWORD; lpName: PChar): HResult; stdcall;
end;
 
IDirect3DRMVisual = interface (IDirect3DRMObject)
IDirect3DRMObject2 = interface(IUnknown)
['{EB16CB00-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMObject2 methods
function AddDestroyCallback(lpCallback: TD3DRMObjectCallback; lpArg: Pointer): HResult; stdcall;
function Clone(pUnkOuter: IUnknown; const riid: TGUID;
out ppvObj): HResult; stdcall;
function DeleteDestroyCallback(d3drmObjProc: TD3DRMObjectCallback;
lpArg: Pointer): HResult; stdcall;
function GetClientData(dwID: DWORD; var lplpvData: Pointer): HResult; stdcall;
function GetDirect3DRM(out lplpDirect3DRM: IDirect3DRM): HResult; stdcall;
function GetName(var lpdwSize: DWORD; lpName: LPSTR): HResult; stdcall;
function SetClientData(dwID: DWORD; lplpvData: Pointer; dwFlags: DWORD): HResult; stdcall;
function SetName(lpName: PChar): HResult; stdcall;
function GetAge(dwFlags: DWORD; var pdwAge: DWORD): HResult; stdcall;
end;
 
IDirect3DRMDevice = interface (IDirect3DRMObject)
['{e9e19280-6e05-11cf-ac4a-0000c03825a1}']
(*
* IDirect3DRMDevice methods
*)
function Init (width: LongInt; height: LongInt) : HResult; stdcall;
function InitFromD3D (lpD3D: IDirect3D; lpD3DIMDev: IDirect3DDevice) : HResult; stdcall;
function InitFromClipper (lpDDClipper: IDirectDrawClipper; lpGUID: PGUID;
width: Integer; height: Integer) : HResult; stdcall;
IDirect3DRMVisual = interface(IDirect3DRMObject)
['{EB16CB04-D271-11CE-AC48-0000C03825A1}']
end;
 
IDirect3DRMDevice = interface(IDirect3DRMObject)
['{E9E19280-6E05-11CF-AC4A-0000C03825A1}']
// IDirect3DRMDevice methods
function Init(width, height: DWORD): HResult; stdcall;
function InitFromD3D(lpD3D: IDirect3D; lpD3DIMDev: IDirect3DDevice): HResult; stdcall;
function InitFromClipper(lpDDClipper: IDirectDrawClipper;
const lpGUID: TGUID; width, height: DWORD): HResult; stdcall;
function Update: HResult; stdcall;
function AddUpdateCallback (d3drmUpdateProc: TD3DRMUpdateCallback;
arg: Pointer) : HResult; stdcall;
function DeleteUpdateCallback (d3drmUpdateProc: TD3DRMUpdateCallback;
arg: Pointer) : HResult; stdcall;
function SetBufferCount (dwCount: DWORD) : HResult; stdcall;
function AddUpdateCallback(d3drmUpdateProc: TD3DRMUpdateCallback;
arg: Pointer): HResult; stdcall;
function DeleteUpdateCallback(d3drmUpdateProc: TD3DRMUpdateCallback;
arg: Pointer): HResult; stdcall;
function SetBufferCount(dwCount: DWORD): HResult; stdcall;
function GetBufferCount: DWORD; stdcall;
function SetDither (bDither: BOOL) : HResult; stdcall;
function SetShades (ulShades: DWORD) : HResult; stdcall;
function SetQuality (rqQuality: TD3DRMRenderQuality) : HResult; stdcall;
function SetTextureQuality (tqTextureQuality: TD3DRMTextureQuality) : HResult; stdcall;
function GetViewports (out lplpViewports: IDirect3DRMViewportArray) : HResult; stdcall;
function SetDither(bDither: BOOL): HResult; stdcall;
function SetShades(ulShades: DWORD): HResult; stdcall;
function SetQuality(rqQuality: TD3DRMRenderQuality): HResult; stdcall;
function SetTextureQuality(tqTextureQuality: TD3DRMTextureQuality): HResult; stdcall;
function GetViewports(out lplpViewports: IDirect3DRMViewportArray): HResult; stdcall;
function GetDither: BOOL; stdcall;
function GetShades: DWORD; stdcall;
function GetHeight: DWORD; stdcall;
10214,105 → 6683,62
function GetQuality: TD3DRMRenderQuality; stdcall;
function GetColorModel: TD3DColorModel; stdcall;
function GetTextureQuality: TD3DRMTextureQuality; stdcall;
function GetDirect3DDevice (out lplpD3DDevice: IDirect3DDevice) : HResult; stdcall;
function GetDirect3DDevice(out lplpD3DDevice: IDirect3DDevice): HResult; stdcall;
end;
 
IDirect3DRMDevice2 = interface (IDirect3DRMDevice)
['{4516ec78-8f20-11d0-9b6d-0000c0781bc3}']
(*
* IDirect3DRMDevice2 methods
*)
function InitFromD3D2(lpD3D: IDirect3D2; lpD3DIMDev: IDirect3DDevice2) : HResult; stdcall;
function InitFromSurface(const lpGUID: TGUID; lpDD: IDirectDraw; lpDDSBack: IDirectDrawSurface) : HResult; stdcall;
function SetRenderMode(dwFlags: DWORD ) : HResult; stdcall;
function GetRenderMode : DWORD; stdcall;
function GetDirect3DDevice2(out lplpD3DDevice: IDirect3DDevice2) : HResult; stdcall;
IDirect3DRMDevice2 = interface(IDirect3DRMDevice)
['{4516EC78-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMDevice2 methods
function InitFromD3D2(lpD3D: IDirect3D2; lpD3DIMDev: IDirect3DDevice2): HResult; stdcall;
function InitFromSurface(const lpGUID: TGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface): HResult; stdcall;
function SetRenderMode(dwFlags: DWORD): HResult; stdcall;
function GetRenderMode: DWORD; stdcall;
function GetDirect3DDevice2(out lplpD3DDevice: IDirect3DDevice2): HResult; stdcall;
end;
 
IDirect3DRMDevice3 = interface (IDirect3DRMObject)
['{549f498b-bfeb-11d1-8ed8-00a0c967a482}']
(*
* IDirect3DRMDevice methods
*)
function Init (width: LongInt; height: LongInt) : HResult; stdcall;
function InitFromD3D (lpD3D: IDirect3D2; lpD3DIMDev: IDirect3DDevice2) : HResult; stdcall;
function InitFromClipper (lpDDClipper: IDirectDrawClipper; lpGUID: PGUID;
width: Integer; height: Integer) : HResult; stdcall;
function Update: HResult; stdcall;
function AddUpdateCallback (d3drmUpdateProc: TD3DRMDevice3UpdateCallback;
arg: Pointer) : HResult; stdcall;
function DeleteUpdateCallback (d3drmUpdateProc: TD3DRMDevice3UpdateCallback;
arg: Pointer) : HResult; stdcall;
function SetBufferCount (dwCount: DWORD) : HResult; stdcall;
function GetBufferCount: DWORD; stdcall;
function SetDither (bDither: BOOL) : HResult; stdcall;
function SetShades (ulShades: DWORD) : HResult; stdcall;
function SetQuality (rqQuality: TD3DRMRenderQuality) : HResult; stdcall;
function SetTextureQuality (tqTextureQuality: TD3DRMTextureQuality) : HResult; stdcall;
function GetViewports (out lplpViewports: IDirect3DRMViewportArray) : HResult; stdcall;
function GetDither: BOOL; stdcall;
function GetShades: DWORD; stdcall;
function GetHeight: DWORD; stdcall;
function GetWidth: DWORD; stdcall;
function GetTrianglesDrawn: DWORD; stdcall;
function GetWireframeOptions: DWORD; stdcall;
function GetQuality: TD3DRMRenderQuality; stdcall;
function GetColorModel: TD3DColorModel; stdcall;
function GetTextureQuality: TD3DRMTextureQuality; stdcall;
function GetDirect3DDevice (out lplpD3DDevice: IDirect3DDevice) : HResult; stdcall;
(*
* IDirect3DRMDevice2 methods
*)
function InitFromD3D2(lpD3D: IDirect3D2; lpD3DIMDev: IDirect3DDevice2) : HResult; stdcall;
function InitFromSurface(const lpGUID: TGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface) : HResult; stdcall;
function SetRenderMode(dwFlags: DWORD ) : HResult; stdcall;
function GetRenderMode : DWORD; stdcall;
function GetDirect3DDevice2(out lplpD3DDevice: IDirect3DDevice2) : HResult; stdcall;
(*
* IDirect3DRMDevice3 methods
*)
function FindPreferredTextureFormat (dwBitDepths, dwFlags: DWORD;
out lpDDPF: TDDPixelFormat) : HResult; stdcall;
function RenderStateChange (dwStateNum, dwVal, dwFlags: DWORD) : HResult; stdcall;
 
function LightStateChange (drsType: TD3DLightStateType; // defined different in header and help
dwVal, dwFlags: DWORD) : HResult; stdcall;
function GetStateChangeOptions (dwStateClass, dwStateNum: DWORD;
var pdwFlags: DWORD) : HResult; stdcall;
function SetStateChangeOptions ( dwStateClass, dwStateNum, dwFlags: DWORD) : HResult; stdcall;
IDirect3DRMDevice3 = interface(IDirect3DRMDevice2)
['{549F498B-BFEB-11D1-8ED8-00A0C967A482}']
// IDirect3DRMDevice3 methods
function FindPreferredTextureFormat(dwBitDepths: DWORD; dwFlags: DWORD;
var lpDDPF: TDDPixelFormat): HResult; stdcall;
function RenderStateChange(drsType: TD3DRenderStateType; dwVal: DWORD;
dwFlags: DWORD): HResult; stdcall;
function LightStateChange(drsType: TD3DLightStateType; dwVal: DWORD;
dwFlags: DWORD): HResult; stdcall;
function GetStateChangeOptions(dwStateClass: DWORD; dwStateNum: DWORD;
var pdwFlags: DWORD): HResult; stdcall;
function SetStateChangeOptions(dwStateClass: DWORD; dwStateNum: DWORD;
dwFlags: DWORD): HResult; stdcall;
end;
 
IDirect3DRMViewport = interface (IDirect3DRMObject)
['{eb16cb02-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMViewport methods
*)
function Init (lpD3DRMDevice: IDirect3DRMDevice;
lpD3DRMFrameCamera: IDirect3DRMFrame; xpos, ypos,
width, height: DWORD) : HResult; stdcall;
IDirect3DRMViewport = interface(IDirect3DRMObject)
['{EB16CB02-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMViewport methods
function Init(lpD3DRMDevice: IDirect3DRMDevice;
lpD3DRMFrameCamera: IDirect3DRMFrame; xpos, ypos, width, height: DWORD): HResult; stdcall;
function Clear: HResult; stdcall;
function Render (lpD3DRMFrame: IDirect3DRMFrame) : HResult; stdcall;
function SetFront (rvFront: TD3DValue) : HResult; stdcall;
function SetBack (rvBack: TD3DValue) : HResult; stdcall;
function SetField (rvField: TD3DValue) : HResult; stdcall;
function SetUniformScaling (bScale: BOOL) : HResult; stdcall;
function SetCamera (lpCamera: IDirect3DRMFrame) : HResult; stdcall;
function SetProjection (rptType: TD3DRMProjectionType) : HResult; stdcall;
function Transform (out lprvDst: TD3DRMVector4D; const lprvSrc: TD3DVector) : HResult; stdcall;
function InverseTransform (out lprvDst: TD3DVector;
const lprvSrc: TD3DRMVector4D) : HResult; stdcall;
function Configure (lX, lY: LongInt; dwWidth, dwHeight: DWORD) : HResult; stdcall;
function ForceUpdate (dwX1, dwY1, dwX2, dwY2: DWORD) : HResult; stdcall;
function SetPlane (rvLeft, rvRight, rvBottom, rvTop: TD3DValue) : HResult; stdcall;
function GetCamera (out lpCamera: IDirect3DRMFrame) : HResult; stdcall;
function GetDevice (out lpD3DRMDevice: IDirect3DRMDevice) : HResult; stdcall;
function GetPlane (out lpd3dvLeft, lpd3dvRight, lpd3dvBottom, lpd3dvTop:
TD3DValue) : HResult; stdcall;
function Pick (lX, lY: LongInt; var lplpVisuals: IDirect3DRMPickedArray) : HResult; stdcall;
function GetUniformScaling: BOOL; stdcall;
function GetX: LongInt; stdcall;
function GetY: LongInt; stdcall;
function Render(lpD3DRMFrame: IDirect3DRMFrame): HResult; stdcall;
function SetFront(rvFront: TD3DValue): HResult; stdcall;
function SetBack(rvBack: TD3DValue): HResult; stdcall;
function SetField(rvField: TD3DValue): HResult; stdcall;
function SetUniformScaling(bScale: BOOL): HResult; stdcall;
function SetCamera(lpCamera: IDirect3DRMFrame): HResult; stdcall;
function SetProjection(rptType: TD3DRMProjectionType): HResult; stdcall;
function Transform(var lprvDst: TD3DRMVector4D; const lprvSrc: TD3DVector): HResult; stdcall;
function InverseTransform(var lprvDst: TD3DVector;
var lprvSrc: TD3DRMVector4D): HResult; stdcall;
function Configure(lX, lY: Longint; dwWidth, dwHeight: DWORD): HResult; stdcall;
function ForceUpdate(dwX1, dwY1, dwX2, dwY2: DWORD): HResult; stdcall;
function SetPlane(rvLeft, rvRight, rvBottom, rvTop: TD3DValue): HResult; stdcall;
function GetCamera(out lpCamera: IDirect3DRMFrame): HResult; stdcall;
function GetDevice(out lpD3DRMDevice: IDirect3DRMDevice): HResult; stdcall;
function GetPlane(var lpd3dvLeft, lpd3dvRight, lpd3dvBottom,
lpd3dvTop: TD3DValue): HResult; stdcall;
function Pick(lX, lY: Longint; out lplpVisuals: IDirect3DRMPickedArray): HResult; stdcall;
function GetUniformScaling: BOOL; stdcall;
function GetX: Longint; stdcall;
function GetY: Longint; stdcall;
function GetWidth: DWORD; stdcall;
function GetHeight: DWORD; stdcall;
function GetField: TD3DValue; stdcall;
10319,39 → 6745,36
function GetBack: TD3DValue; stdcall;
function GetFront: TD3DValue; stdcall;
function GetProjection: TD3DRMProjectionType; stdcall;
function GetDirect3DViewport (out lplpD3DViewport: IDirect3DViewport) : HResult; stdcall;
function GetDirect3DViewport(out lplpD3DViewport: IDirect3DViewport): HResult; stdcall;
end;
 
IDirect3DRMViewport2 = interface (IDirect3DRMObject)
['{4a1b1be6-bfed-11d1-8ed8-00a0c967a482}']
(*
* IDirect3DRMViewport2 methods
*)
function Init (lpD3DRMDevice: IDirect3DRMDevice3;
lpD3DRMFrameCamera: IDirect3DRMFrame3; xpos, ypos,
width, height: DWORD) : HResult; stdcall;
function Clear (dwFlags: DWORD): HResult; stdcall;
function Render (lpD3DRMFrame: IDirect3DRMFrame3) : HResult; stdcall;
function SetFront (rvFront: TD3DValue) : HResult; stdcall;
function SetBack (rvBack: TD3DValue) : HResult; stdcall;
function SetField (rvField: TD3DValue) : HResult; stdcall;
function SetUniformScaling (bScale: BOOL) : HResult; stdcall;
function SetCamera (lpCamera: IDirect3DRMFrame3) : HResult; stdcall;
function SetProjection (rptType: TD3DRMProjectionType) : HResult; stdcall;
function Transform (out lprvDst: TD3DRMVector4D; const lprvSrc: TD3DVector) : HResult; stdcall;
function InverseTransform (out lprvDst: TD3DVector;
const lprvSrc: TD3DRMVector4D) : HResult; stdcall;
function Configure (lX, lY: LongInt; dwWidth, dwHeight: DWORD) : HResult; stdcall;
function ForceUpdate (dwX1, dwY1, dwX2, dwY2: DWORD) : HResult; stdcall;
function SetPlane (rvLeft, rvRight, rvBottom, rvTop: TD3DValue) : HResult; stdcall;
function GetCamera (out lpCamera: IDirect3DRMFrame3) : HResult; stdcall;
function GetDevice (out lpD3DRMDevice: IDirect3DRMDevice3) : HResult; stdcall;
function GetPlane (out lpd3dvLeft, lpd3dvRight, lpd3dvBottom, lpd3dvTop:
TD3DValue) : HResult; stdcall;
function Pick (lX, lY: LongInt; var lplpVisuals: IDirect3DRMPickedArray) : HResult; stdcall;
IDirect3DRMViewport2 = interface(IDirect3DRMObject)
['{4A1B1BE6-BFED-11D1-8ED8-00A0C967A482}']
// IDirect3DRMViewport2 methods
function Init(dec: IDirect3DRMDevice3; camera: IDirect3DRMFrame3;
xpos, ypos: DWORD; width, height: DWORD): HResult; stdcall;
function Clear(dwFlags: DWORD): HResult; stdcall;
function Render(lpD3DRMFrame: IDirect3DRMFrame3): HResult; stdcall;
function SetFront(rvFront: TD3DValue): HResult; stdcall;
function SetBack(rvBack: TD3DValue): HResult; stdcall;
function SetField(rvField: TD3DValue): HResult; stdcall;
function SetUniformScaling(bScale: BOOL): HResult; stdcall;
function SetCamera(lpCamera: IDirect3DRMFrame3): HResult; stdcall;
function SetProjection(rptType: TD3DRMProjectionType): HResult; stdcall;
function Transform(var lprvDst: TD3DRMVector4D; const lprvSrc: TD3DVector): HResult; stdcall;
function InverseTransform(var lprvDst: TD3DVector;
const lprvSrc: TD3DRMVector4D): HResult; stdcall;
function Configure(lX, lY: Longint; dwWidth, dwHeight: DWORD): HResult; stdcall;
function ForceUpdate(dwX1, dwY1, dwX2, dwY2: DWORD): HResult; stdcall;
function SetPlane(rvLeft, rvRight, rvBottom, rvTop: TD3DValue): HResult; stdcall;
function GetCamera(out lpCamera: IDirect3DRMFrame3): HResult; stdcall;
function GetDevice(out lpD3DRMDevice: IDirect3DRMDevice3): HResult; stdcall;
function GetPlane(var lpd3dvLeft, lpd3dvRight, lpd3dvBottom,
lpd3dvTop: TD3DValue): HResult; stdcall;
function Pick(lX, lY: Longint; out lplpVisuals: IDirect3DRMPickedArray): HResult; stdcall;
function GetUniformScaling: BOOL; stdcall;
function GetX: LongInt; stdcall;
function GetY: LongInt; stdcall;
function GetX: Longint; stdcall;
function GetY: Longint; stdcall;
function GetWidth: DWORD; stdcall;
function GetHeight: DWORD; stdcall;
function GetField: TD3DValue; stdcall;
10358,537 → 6781,482
function GetBack: TD3DValue; stdcall;
function GetFront: TD3DValue; stdcall;
function GetProjection: TD3DRMProjectionType; stdcall;
function GetDirect3DViewport (var lplpD3DViewport: IDirect3DViewport) : HResult; stdcall;
function TransformVectors (dwNumVectors: DWORD; out lpDstVectors:
TD3DRMVector4D; const lpSrcVectors: TD3DVector) : HResult; stdcall;
function InverseTransformVectors (dwNumVectors: DWORD; out lpDstVectors:
TD3DRMVector4D; const lpSrcVectors: TD3DVector) : HResult; stdcall;
function GetDirect3DViewport(out lplpD3DViewport: IDirect3DViewport): HResult; stdcall;
function TransformVectors(dwNumVectors: DWORD; var lpDstVectors: TD3DRMVector4D;
const lpSrcVectors: TD3DVector): HResult; stdcall;
function InverseTransformVectors(dwNumVectors: DWORD; var lpDstVectors: TD3DVector;
const lpSrcVectors: TD3DRMVector4D): HResult; stdcall;
end;
 
IDirect3DRMFrame = interface (IDirect3DRMVisual)
['{eb16cb03-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMFrame methods
*)
function AddChild (lpD3DRMFrameChild: IDirect3DRMFrame) : HResult; stdcall;
function AddLight (lpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function AddMoveCallback (d3drmFMC: TD3DRMFrameMoveCallback;
lpArg: Pointer) : HResult; stdcall;
function AddTransform (rctCombine: TD3DRMCombineType;
rmMatrix: TD3DRMMatrix4D) : HResult; stdcall;
function AddTranslation (rctCombine: TD3DRMCombineType; rvX, rvY, rvZ:
TD3DValue) : HResult; stdcall;
function AddScale (rctCombine: TD3DRMCombineType; rvX, rvY, rvZ: TD3DValue) : HResult; stdcall;
function AddRotation (rctCombine: TD3DRMCombineType; rvX, rvY, rvZ,
rvTheta: TD3DValue) : HResult; stdcall;
function AddVisual (lpD3DRMVisual: IDirect3DRMVisual) : HResult; stdcall;
function GetChildren (out lplpChildren: IDirect3DRMFrameArray) : HResult; stdcall;
IDirect3DRMFrame = interface(IDirect3DRMVisual)
['{EB16CB03-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMFrame methods
function AddChild(lpD3DRMFrameChild: IDirect3DRMFrame): HResult; stdcall;
function AddLight(lpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function AddMoveCallback(d3drmFMC: TD3DRMFrameMoveCallback;
lpArg: Pointer): HResult; stdcall;
function AddTransform(rctCombine: TD3DRMCombineType;
rmMatrix: TD3DRMMatrix4D): HResult; stdcall;
function AddTranslation(rctCombine: TD3DRMCombineType; rvX, rvY,
rvZ: TD3DValue): HResult; stdcall;
function AddScale(rctCombine: TD3DRMCombineType; rvX, rvY,
rvZ: TD3DValue): HResult; stdcall;
function AddRotation(rctCombine: TD3DRMCombineType; rvX, rvY, rvZ,
rvTheta: TD3DValue): HResult; stdcall;
function AddVisual(lpD3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
function GetChildren(out lplpChildren: IDirect3DRMFrameArray): HResult; stdcall;
function GetColor: TD3DColor; stdcall;
function GetLights (out lplpLights: IDirect3DRMLightArray) : HResult; stdcall;
function GetLights(out lplpLights: IDirect3DRMLightArray): HResult; stdcall;
function GetMaterialMode: TD3DRMMaterialMode; stdcall;
function GetParent (out lplpParent: IDirect3DRMFrame) : HResult; stdcall;
function GetPosition (lpRef: IDirect3DRMFrame; out lprvPos: TD3DVector) : HResult; stdcall;
function GetRotation (lpRef: IDirect3DRMFrame; out lprvAxis: TD3DVector;
out lprvTheta: TD3DValue) : HResult; stdcall;
function GetScene (out lplpRoot: IDirect3DRMFrame) : HResult; stdcall;
function GetParent(out lplpParent: IDirect3DRMFrame): HResult; stdcall;
function GetPosition(lpRef: IDirect3DRMFrame; var lprvPos: TD3DVector): HResult; stdcall;
function GetRotation(lpRef: IDirect3DRMFrame; var lprvAxis: TD3DVector;
var lprvTheta: TD3DValue): HResult; stdcall;
function GetScene(out lplpRoot: IDirect3DRMFrame): HResult; stdcall;
function GetSortMode: TD3DRMSortMode; stdcall;
function GetTexture (out lplpTexture: IDirect3DRMTexture) : HResult; stdcall;
function GetTransform (out rmMatrix: TD3DRMMatrix4D) : HResult; stdcall;
function GetVelocity (lpRef: IDirect3DRMFrame; var lprvVel: TD3DVector;
fRotVel: BOOL) : HResult; stdcall;
function GetOrientation (lpRef: IDirect3DRMFrame; var lprvDir: TD3DVector;
var lprvUp: TD3DVector) : HResult; stdcall;
function GetVisuals (out lplpVisuals: IDirect3DRMVisualArray) : HResult; stdcall;
function GetTextureTopology (out lpU, lpV: BOOL) : HResult; stdcall;
function InverseTransform (out lprvDst: TD3DVector; const lprvSrc: TD3DVector) : HResult; stdcall;
function Load (lpvObjSource: Pointer; lpvObjID: Pointer;
function GetTexture(out lplpTexture: IDirect3DRMTexture): HResult; stdcall;
function GetTransform(var rmMatrix: TD3DRMMatrix4D): HResult; stdcall;
function GetVelocity(lpRef: IDirect3DRMFrame; var lprvVel: TD3DVector;
fRotVel: BOOL): HResult; stdcall;
function GetOrientation(lpRef: IDirect3DRMFrame; var lprvDir: TD3DVector;
var lprvUp: TD3DVector): HResult; stdcall;
function GetVisuals(out lplpVisuals: IDirect3DRMVisualArray): HResult; stdcall;
function GetTextureTopology(var lpU, lpV: BOOL): HResult; stdcall;
function InverseTransform(var lprvDst, lprvSrc: TD3DVector): HResult; stdcall;
function Load(lpvObjSource: Pointer; lpvObjID: Pointer;
d3drmLOFlags: TD3DRMLoadOptions; d3drmLoadTextureProc:
TD3DRMLoadTextureCallback; lpArgLTP: Pointer) : HResult; stdcall;
function LookAt (lpTarget, lpRef: IDirect3DRMFrame;
rfcConstraint: TD3DRMFrameConstraint ) : HResult; stdcall;
function Move (delta: TD3DValue) : HResult; stdcall;
function DeleteChild (lpChild: IDirect3DRMFrame) : HResult; stdcall;
function DeleteLight (lpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function DeleteMoveCallback (d3drmFMC: TD3DRMFrameMoveCallback;
lpArg: Pointer) : HResult; stdcall;
function DeleteVisual (lpD3DRMVisual: IDirect3DRMVisual) : HResult; stdcall;
TD3DRMLoadTextureCallback; lpArgLTP: Pointer): HResult; stdcall;
function LookAt(lpTarget, lpRef: IDirect3DRMFrame;
rfcConstraint: TD3DRMFrameConstraint ): HResult; stdcall;
function Move(delta: TD3DValue): HResult; stdcall;
function DeleteChild(lpChild: IDirect3DRMFrame): HResult; stdcall;
function DeleteLight(lpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function DeleteMoveCallback(d3drmFMC: TD3DRMFrameMoveCallback;
lpArg: Pointer): HResult; stdcall;
function DeleteVisual(lpD3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
function GetSceneBackground: TD3DColor; stdcall;
function GetSceneBackgroundDepth (out lplpDDSurface: IDirectDrawSurface) : HResult; stdcall;
function GetSceneBackgroundDepth(out lplpDDSurface: IDirectDrawSurface): HResult; stdcall;
function GetSceneFogColor: TD3DColor; stdcall;
function GetSceneFogEnable: BOOL; stdcall;
function GetSceneFogMode: TD3DRMFogMode; stdcall;
function GetSceneFogParams (out lprvStart, lprvEnd, lprvDensity: TD3DValue) : HResult; stdcall;
function SetSceneBackground (rcColor: TD3DColor) : HResult; stdcall;
function SetSceneBackgroundRGB (rvRed, rvGreen, rvBlue: TD3DValue) : HResult; stdcall;
function SetSceneBackgroundDepth (lpImage: IDirectDrawSurface) : HResult; stdcall;
function SetSceneBackgroundImage (lpTexture: IDirect3DRMTexture) : HResult; stdcall;
function SetSceneFogEnable (bEnable: BOOL) : HResult; stdcall;
function SetSceneFogColor (rcColor: TD3DColor) : HResult; stdcall;
function SetSceneFogMode (rfMode: TD3DRMFogMode) : HResult; stdcall;
function SetSceneFogParams (rvStart, rvEnd, rvDensity: TD3DValue) : HResult; stdcall;
function SetColor (rcColor: TD3DColor) : HResult; stdcall;
function SetColorRGB (rvRed, rvGreen, rvBlue: TD3DValue) : HResult; stdcall;
function GetSceneFogParams(var lprvStart, lprvEnd, lprvDensity: TD3DValue): HResult; stdcall;
function SetSceneBackground(rcColor: TD3DColor): HResult; stdcall;
function SetSceneBackgroundRGB(rvRed, rvGreen, rvBlue: TD3DValue): HResult; stdcall;
function SetSceneBackgroundDepth(lpImage: IDirectDrawSurface): HResult; stdcall;
function SetSceneBackgroundImage(lpTexture: IDirect3DRMTexture): HResult; stdcall;
function SetSceneFogEnable(bEnable: BOOL): HResult; stdcall;
function SetSceneFogColor(rcColor: TD3DColor): HResult; stdcall;
function SetSceneFogMode(rfMode: TD3DRMFogMode): HResult; stdcall;
function SetSceneFogParams(rvStart, rvEnd, rvDensity: TD3DValue): HResult; stdcall;
function SetColor(rcColor: TD3DColor): HResult; stdcall;
function SetColorRGB(rvRed, rvGreen, rvBlue: TD3DValue): HResult; stdcall;
function GetZbufferMode: TD3DRMZBufferMode; stdcall;
function SetMaterialMode (rmmMode: TD3DRMMaterialMode) : HResult; stdcall;
function SetOrientation (lpRef: IDirect3DRMFrame; rvDx, rvDy, rvDz, rvUx,
rvUy, rvUz: TD3DValue) : HResult; stdcall;
function SetPosition (lpRef: IDirect3DRMFrame; rvX, rvY, rvZ: TD3DValue) : HResult; stdcall;
function SetRotation (lpRef: IDirect3DRMFrame; rvX, rvY, rvZ,
rvTheta: TD3DValue) : HResult; stdcall;
function SetSortMode (d3drmSM: TD3DRMSortMode) : HResult; stdcall;
function SetTexture (lpD3DRMTexture: IDirect3DRMTexture) : HResult; stdcall;
function SetTextureTopology (cylU, cylV: BOOL) : HResult; stdcall;
function SetVelocity (lpRef: IDirect3DRMFrame; rvX, rvY, rvZ: TD3DValue;
fRotVel: BOOL) : HResult; stdcall;
function SetZbufferMode (d3drmZBM: TD3DRMZBufferMode) : HResult; stdcall;
function Transform (out lpd3dVDst: TD3DVector; const lpd3dVSrc: TD3DVector) : HResult; stdcall;
function SetMaterialMode(rmmMode: TD3DRMMaterialMode): HResult; stdcall;
function SetOrientation(lpRef: IDirect3DRMFrame; rvDx, rvDy, rvDz, rvUx,
rvUy, rvUz: TD3DValue): HResult; stdcall;
function SetPosition(lpRef: IDirect3DRMFrame; rvX, rvY, rvZ: TD3DValue): HResult; stdcall;
function SetRotation(lpRef: IDirect3DRMFrame; rvX, rvY, rvZ,
rvTheta: TD3DValue): HResult; stdcall;
function SetSortMode(d3drmSM: TD3DRMSortMode): HResult; stdcall;
function SetTexture(lpD3DRMTexture: IDirect3DRMTexture): HResult; stdcall;
function SetTextureTopology(cylU, cylV: BOOL): HResult; stdcall;
function SetVelocity(lpRef: IDirect3DRMFrame; rvX, rvY, rvZ: TD3DValue;
fRotVel: BOOL): HResult; stdcall;
function SetZbufferMode(d3drmZBM: TD3DRMZBufferMode): HResult; stdcall;
function Transform(var lpd3dVDst, lpd3dVSrc: TD3DVector): HResult; stdcall;
end;
 
IDirect3DRMFrame2 = interface (IDirect3DRMFrame)
['{c3dfbd60-3988-11d0-9ec2-0000c0291ac3}']
(*
* IDirect3DRMFrame2 methods
*)
function AddMoveCallback2 (d3drmFMC: TD3DRMFrameMoveCallback; lpArg:
Pointer; dwFlags: DWORD) : HResult; stdcall;
function GetBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function GetBoxEnable : boolean; stdcall;
function GetAxes (out dir, up: TD3DVector) : HResult; stdcall;
function GetMaterial (out lplpMaterial: IDirect3DRMMaterial) : HResult; stdcall;
function GetInheritAxes : boolean; stdcall;
function GetHierarchyBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function SetBox (const lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function SetBoxEnable (bEnableFlag: BOOL) : HResult; stdcall;
function SetAxes (dx, dy, dz, ux, uy, uz: TD3DValue) : HResult; stdcall;
function SetInheritAxes (inherit_from_parent: BOOL) : HResult; stdcall;
function SetMaterial (var lplpMaterial: IDirect3DRMMaterial) : HResult; stdcall;
function SetQuaternion (lpRef: IDirect3DRMFrame;
const quat: TD3DRMQuaternion) : HResult; stdcall;
function RayPick (lpRefFrame: IDirect3DRMFrame; var ray: TD3DRMRay;
dwFlags: DWORD; out lplpPicked2Array: IDirect3DRMPicked2Array) :
HResult; stdcall;
function Save (lpFilename: PAnsiChar; d3dFormat: TD3DRMXOFFormat;
d3dSaveFlags: TD3DRMSaveOptions) : HResult; stdcall;
IDirect3DRMFrame2 = interface(IDirect3DRMFrame)
['{C3DFBD60-3988-11D0-9EC2-0000C0291AC3}']
// IDirect3DRMFrame2 methods
function AddMoveCallback2(d3drmFMC: TD3DRMFrameMoveCallback; lpArg:
Pointer; dwFlags: DWORD): HResult; stdcall;
function GetBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function GetBoxEnable: BOOL; stdcall;
function GetAxes(var dir, up: TD3DVector): HResult; stdcall;
function GetMaterial(out lplpMaterial: IDirect3DRMMaterial): HResult; stdcall;
function GetInheritAxes: BOOL; stdcall;
function GetHierarchyBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function SetBox(const lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function SetBoxEnable(bEnableFlag: BOOL): HResult; stdcall;
function SetAxes(dx, dy, dz, ux, uy, uz: TD3DValue): HResult; stdcall;
function SetInheritAxes(inherit_from_parent: BOOL): HResult; stdcall;
function SetMaterial(lplpMaterial: IDirect3DRMMaterial): HResult; stdcall;
function SetQuaternion(lpRef: IDirect3DRMFrame2; var quat: TD3DRMQuaternion): HResult; stdcall;
function RayPick(lpRefFrame: IDirect3DRMFrame; const ray: TD3DRMRay;
dwFlags: DWORD; out lplpPicked2Array: IDirect3DRMPicked2Array): HResult; stdcall;
function Save(lpFilename: PChar; d3dFormat: TD3DRMXOFFormat;
d3dSaveFlags: TD3DRMSaveOptions): HResult; stdcall;
end;
 
IDirect3DRMFrame3 = interface (IDirect3DRMVisual)
['{ff6b7f70-a40e-11d1-91f9-0000f8758e66}']
(*
* IDirect3DRMFrame3 methods
*)
function AddChild (lpD3DRMFrameChild: IDirect3DRMFrame3) : HResult; stdcall;
function AddLight (lpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function AddMoveCallback (d3drmFMC: TD3DRMFrame3MoveCallback;
lpArg: Pointer; dwFlags: DWORD) : HResult; stdcall;
function AddTransform (rctCombine: TD3DRMCombineType;
rmMatrix: TD3DRMMatrix4D) : HResult; stdcall;
function AddTranslation (rctCombine: TD3DRMCombineType; rvX, rvY, rvZ:
TD3DValue) : HResult; stdcall;
function AddScale (rctCombine: TD3DRMCombineType; rvX, rvY, rvZ: TD3DValue) : HResult; stdcall;
function AddRotation (rctCombine: TD3DRMCombineType; rvX, rvY, rvZ,
rvTheta: TD3DValue) : HResult; stdcall;
function AddVisual (lpD3DRMVisual: IDirect3DRMVisual) : HResult; stdcall;
function GetChildren (out lplpChildren: IDirect3DRMFrameArray) : HResult; stdcall;
IDirect3DRMFrame3 = interface(IDirect3DRMVisual)
['{FF6B7F70-A40E-11D1-91F9-0000F8758E66}']
function AddChild(lpD3DRMFrameChild: IDirect3DRMFrame3): HResult; stdcall;
function AddLight(lpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function AddMoveCallback(d3drmFMC: TD3DRMFrame3MoveCallback;
lpArg: Pointer; dwFlags: DWORD): HResult; stdcall;
function AddTransform(rctCombine: TD3DRMCombineType;
rmMatrix: TD3DRMMatrix4D): HResult; stdcall;
function AddTranslation(rctCombine: TD3DRMCombineType; rvX, rvY,
rvZ: TD3DValue): HResult; stdcall;
function AddScale(rctCombine: TD3DRMCombineType; rvX, rvY,
rvZ: TD3DValue): HResult; stdcall;
function AddRotation(rctCombine: TD3DRMCombineType; rvX, rvY, rvZ,
rvTheta: TD3DValue): HResult; stdcall;
function AddVisual(lpD3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
function GetChildren(out lplpChildren: IDirect3DRMFrameArray): HResult; stdcall;
function GetColor: TD3DColor; stdcall;
function GetLights (out lplpLights: IDirect3DRMLightArray) : HResult; stdcall;
function GetLights(out lplpLights: IDirect3DRMLightArray): HResult; stdcall;
function GetMaterialMode: TD3DRMMaterialMode; stdcall;
function GetParent (out lplpParent: IDirect3DRMFrame3) : HResult; stdcall;
function GetPosition (lpRef: IDirect3DRMFrame3; out lprvPos: TD3DVector) : HResult; stdcall;
function GetRotation (lpRef: IDirect3DRMFrame3; out lprvAxis: TD3DVector;
out lprvTheta: TD3DValue) : HResult; stdcall;
function GetScene (out lplpRoot: IDirect3DRMFrame3) : HResult; stdcall;
function GetParent(out lplpParent: IDirect3DRMFrame3): HResult; stdcall;
function GetPosition(lpRef: IDirect3DRMFrame3; var lprvPos: TD3DVector): HResult; stdcall;
function GetRotation(lpRef: IDirect3DRMFrame3; var lprvAxis: TD3DVector;
var lprvTheta: TD3DValue): HResult; stdcall;
function GetScene(out lplpRoot: IDirect3DRMFrame3): HResult; stdcall;
function GetSortMode: TD3DRMSortMode; stdcall;
function GetTexture (out lplpTexture: IDirect3DRMTexture3) : HResult; stdcall;
function GetTransform (lpRefFrame: IDirect3DRMFrame3;
var rmMatrix: TD3DRMMatrix4D) : HResult; stdcall;
function GetVelocity (lpRef: IDirect3DRMFrame3; out lprvVel: TD3DVector;
fRotVel: BOOL) : HResult; stdcall;
function GetOrientation (lpRef: IDirect3DRMFrame3; out lprvDir: TD3DVector;
out lprvUp: TD3DVector) : HResult; stdcall;
function GetVisuals (out lplpVisuals: IDirect3DRMVisualArray) : HResult; stdcall;
function InverseTransform (out lprvDst: TD3DVector; const lprvSrc: TD3DVector) : HResult; stdcall;
function Load (lpvObjSource: Pointer; lpvObjID: Pointer;
function GetTexture(out lplpTexture: IDirect3DRMTexture3): HResult; stdcall;
function GetTransform(RefFrame: IDirect3DRMFrame3; var rmMatrix: TD3DRMMatrix4D): HResult; stdcall;
function GetVelocity(lpRef: IDirect3DRMFrame3; var lprvVel: TD3DVector;
fRotVel: BOOL): HResult; stdcall;
function GetOrientation(lpRef: IDirect3DRMFrame3; var lprvDir: TD3DVector;
var lprvUp: TD3DVector): HResult; stdcall;
function GetVisuals(var pdwNumVisuals: DWORD; var lplpVisuals: Pointer): HResult; stdcall;
function InverseTransform(var lprvDst, lprvSrc: TD3DVector): HResult; stdcall;
function Load(lpvObjSource: Pointer; lpvObjID: Pointer;
d3drmLOFlags: TD3DRMLoadOptions; d3drmLoadTextureProc:
TD3DRMLoadTexture3Callback; lpArgLTP: Pointer) : HResult; stdcall;
function LookAt (lpTarget, lpRef: IDirect3DRMFrame3;
rfcConstraint: TD3DRMFrameConstraint ) : HResult; stdcall;
function Move (delta: TD3DValue) : HResult; stdcall;
function DeleteChild (lpChild: IDirect3DRMFrame3) : HResult; stdcall;
function DeleteLight (lpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function DeleteMoveCallback (d3drmFMC: TD3DRMFrame3MoveCallback; lpArg: Pointer) : HResult; stdcall;
function DeleteVisual (lpD3DRMVisual: IDirect3DRMVisual) : HResult; stdcall;
TD3DRMLoadTexture3Callback; lpArgLTP: Pointer): HResult; stdcall;
function LookAt(lpTarget, lpRef: IDirect3DRMFrame3;
rfcConstraint: TD3DRMFrameConstraint): HResult; stdcall;
function Move(delta: TD3DValue): HResult; stdcall;
function DeleteChild(lpChild: IDirect3DRMFrame3): HResult; stdcall;
function DeleteLight(lpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function DeleteMoveCallback(d3drmFMC: TD3DRMFrame3MoveCallback; lpArg: Pointer): HResult; stdcall;
function DeleteVisual(lpD3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
function GetSceneBackground: TD3DColor; stdcall;
function GetSceneBackgroundDepth (out lplpDDSurface: IDirectDrawSurface) : HResult; stdcall;
function GetSceneBackgroundDepth(out lplpDDSurface: IDirectDrawSurface): HResult; stdcall;
function GetSceneFogColor: TD3DColor; stdcall;
function GetSceneFogEnable: BOOL; stdcall;
function GetSceneFogMode: TD3DRMFogMode; stdcall;
function GetSceneFogParams (out lprvStart, lprvEnd, lprvDensity: TD3DValue) : HResult; stdcall;
function SetSceneBackground (rcColor: TD3DColor) : HResult; stdcall;
function SetSceneBackgroundRGB (rvRed, rvGreen, rvBlue: TD3DValue) : HResult; stdcall;
function SetSceneBackgroundDepth (lpImage: IDirectDrawSurface) : HResult; stdcall;
function SetSceneBackgroundImage (lpTexture: IDirect3DRMTexture3) : HResult; stdcall;
function SetSceneFogEnable (bEnable: BOOL) : HResult; stdcall;
function SetSceneFogColor (rcColor: TD3DColor) : HResult; stdcall;
function SetSceneFogMode (rfMode: TD3DRMFogMode) : HResult; stdcall;
function SetSceneFogParams (rvStart, rvEnd, rvDensity: TD3DValue) : HResult; stdcall;
function SetColor (rcColor: TD3DColor) : HResult; stdcall;
function SetColorRGB (rvRed, rvGreen, rvBlue: TD3DValue) : HResult; stdcall;
function GetSceneFogParams(var lprvStart, lprvEnd, lprvDensity: TD3DValue): HResult; stdcall;
function SetSceneBackground(rcColor: TD3DColor): HResult; stdcall;
function SetSceneBackgroundRGB(rvRed, rvGreen, rvBlue: TD3DValue): HResult; stdcall;
function SetSceneBackgroundDepth(lpImage: IDirectDrawSurface): HResult; stdcall;
function SetSceneBackgroundImage(lpTexture: IDirect3DRMTexture3): HResult; stdcall;
function SetSceneFogEnable(bEnable: BOOL): HResult; stdcall;
function SetSceneFogColor(rcColor: TD3DColor): HResult; stdcall;
function SetSceneFogMode(rfMode: TD3DRMFogMode): HResult; stdcall;
function SetSceneFogParams(rvStart, rvEnd, rvDensity: TD3DValue): HResult; stdcall;
function SetColor(rcColor: TD3DColor): HResult; stdcall;
function SetColorRGB(rvRed, rvGreen, rvBlue: TD3DValue): HResult; stdcall;
function GetZbufferMode: TD3DRMZBufferMode; stdcall;
function SetMaterialMode (rmmMode: TD3DRMMaterialMode) : HResult; stdcall;
function SetOrientation (lpRef: IDirect3DRMFrame3; rvDx, rvDy, rvDz, rvUx,
rvUy, rvUz: TD3DValue) : HResult; stdcall;
function SetPosition (lpRef: IDirect3DRMFrame3; rvX, rvY, rvZ: TD3DValue) :
HResult; stdcall;
function SetRotation (lpRef: IDirect3DRMFrame3; rvX, rvY, rvZ,
rvTheta: TD3DValue) : HResult; stdcall;
function SetSortMode (d3drmSM: TD3DRMSortMode) : HResult; stdcall;
function SetTexture (lpD3DRMTexture: IDirect3DRMTexture3) : HResult; stdcall;
function SetVelocity (lpRef: IDirect3DRMFrame3; rvX, rvY, rvZ: TD3DValue;
fRotVel: BOOL) : HResult; stdcall;
function SetZbufferMode (d3drmZBM: TD3DRMZBufferMode) : HResult; stdcall;
function Transform (out lpd3dVDst: TD3DVector; const lpd3dVSrc: TD3DVector) : HResult; stdcall;
 
function GetBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function GetBoxEnable : boolean; stdcall;
function GetAxes (out dir, up: TD3DVector) : HResult; stdcall;
function GetMaterial (out lplpMaterial: IDirect3DRMMaterial2) : HResult; stdcall;
function GetInheritAxes : boolean; stdcall;
function GetHierarchyBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function SetBox (const lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function SetBoxEnable (bEnableFlag: BOOL) : HResult; stdcall;
function SetAxes (dx, dy, dz, ux, uy, uz: TD3DValue) : HResult; stdcall;
function SetInheritAxes (inherit_from_parent: BOOL) : HResult; stdcall;
function SetMaterial (var lplpMaterial: IDirect3DRMMaterial2) : HResult; stdcall;
function SetQuaternion (lpRef: IDirect3DRMFrame3;
const quat: TD3DRMQuaternion) : HResult; stdcall;
function RayPick (lpRefFrame: IDirect3DRMFrame3; var ray: TD3DRMRay;
dwFlags: DWORD; out lplpPicked2Array: IDirect3DRMPicked2Array) : HResult; stdcall;
function Save (lpFilename: PAnsiChar; d3dFormat: TD3DRMXOFFormat;
d3dSaveFlags: TD3DRMSaveOptions) : HResult; stdcall;
function TransformVectors (lpRefFrame: IDirect3DRMFrame3;
dwNumVectors: DWORD; out lpDstVectors: TD3DVector;
const lpSrcVectors: TD3DVector) : HResult; stdcall;
function InverseTransformVectors (lpRefFrame: IDirect3DRMFrame3;
dwNumVectors: DWORD; out lpDstVectors: TD3DVector;
const lpSrcVectors: TD3DVector) : HResult; stdcall;
function SetTraversalOptions (dwFlags: DWORD) : HResult; stdcall;
function GetTraversalOptions (out lpdwFlags: DWORD) : HResult; stdcall;
function SetSceneFogMethod (dwFlags: DWORD) : HResult; stdcall;
function GetSceneFogMethod (out lpdwFlags: DWORD) : HResult; stdcall;
function SetMaterialOverride (
const lpdmOverride: TD3DRMMaterialOverride) : HResult; stdcall;
function GetMaterialOverride (
const lpdmOverride: TD3DRMMaterialOverride) : HResult; stdcall;
function SetMaterialMode(rmmMode: TD3DRMMaterialMode): HResult; stdcall;
function SetOrientation(lpRef: IDirect3DRMFrame3; rvDx, rvDy, rvDz, rvUx,
rvUy, rvUz: TD3DValue): HResult; stdcall;
function SetPosition(lpRef: IDirect3DRMFrame3; rvX, rvY, rvZ: TD3DValue): HResult; stdcall;
function SetRotation(lpRef: IDirect3DRMFrame3; rvX, rvY, rvZ, rvTheta: TD3DValue): HResult; stdcall;
function SetSortMode(d3drmSM: TD3DRMSortMode): HResult; stdcall;
function SetTexture(lpD3DRMTexture: IDirect3DRMTexture3): HResult; stdcall;
function SetVelocity(lpRef: IDirect3DRMFrame3; rvX, rvY, rvZ: TD3DValue;
fRotVel: BOOL): HResult; stdcall;
function SetZbufferMode(d3drmZBM: TD3DRMZBufferMode): HResult; stdcall;
function Transform(var lpd3dVDst, lpd3dVSrc: TD3DVector): HResult; stdcall;
function GetBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function GetBoxEnable: BOOL; stdcall;
function GetAxes(var dir, up: TD3DVector): HResult; stdcall;
function GetMaterial(out lplpMaterial: IDirect3DRMMaterial2): HResult; stdcall;
function GetInheritAxes: BOOL; stdcall;
function GetHierarchyBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function SetBox(const lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function SetBoxEnable(bEnableFlag: BOOL): HResult; stdcall;
function SetAxes(dx, dy, dz, ux, uy, uz: TD3DValue): HResult; stdcall;
function SetInheritAxes(inherit_from_parent: BOOL): HResult; stdcall;
function SetMaterial(lplpMaterial: IDirect3DRMMaterial2): HResult; stdcall;
function SetQuaternion(lpRef: IDirect3DRMFrame3; var quat: TD3DRMQuaternion): HResult; stdcall;
function RayPick(lpRefFrame: IDirect3DRMFrame3; const ray: TD3DRMRay;
dwFlags: DWORD; out lplpPicked2Array: IDirect3DRMPicked2Array): HResult; stdcall;
function Save(lpFilename: PChar; d3dFormat: TD3DRMXOFFormat;
d3dSaveFlags: TD3DRMSaveOptions): HResult; stdcall;
function TransformVectors(reference: IDirect3DRMFrame3; dwNumVectors: DWORD;
var lpDstVectors: TD3DVector; const lpSrcVectors: TD3DVector): HResult; stdcall;
function InverseTransformVectors(reference: IDirect3DRMFrame3; dwNumVectors: DWORD;
var lpDstVectors: TD3DVector; const lpSrcVectors: TD3DVector): HResult; stdcall;
function SetTraversalOptions(dwFlags: DWORD): HResult; stdcall;
function GetTraversalOptions(var lpdwFlags: DWORD): HResult; stdcall;
function SetSceneFogMethod(dwFlags: DWORD): HResult; stdcall;
function GetSceneFogMethod(var lpdwFlags: DWORD): HResult; stdcall;
function SetMaterialOverride(lpdmOverride: TD3DRMMaterialOverride): HResult; stdcall;
function GetMaterialOverride(var lplpdmOverride: TD3DRMMaterialOverride): HResult; stdcall;
end;
 
 
IDirect3DRMMesh = interface (IDirect3DRMVisual)
['{a3a80d01-6e12-11cf-ac4a-0000c03825a1}']
(*
* IDirect3DRMMesh methods
*)
function Scale (sx, sy, sz: TD3DValue) : HResult; stdcall;
function Translate (tx, ty, tz: TD3DValue) : HResult; stdcall;
function GetBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function AddGroup (vCount, fCount, vPerFace: DWORD; var fData: DWORD;
var returnId: TD3DRMGroupIndex) : HResult; stdcall;
function SetVertices (id: TD3DRMGroupIndex; index, count: DWORD;
var values: TD3DRMVertex) : HResult; stdcall;
function SetGroupColor (id: TD3DRMGroupIndex; value: TD3DColor) : HResult; stdcall;
function SetGroupColorRGB (id: TD3DRMGroupIndex; red, green,
blue: TD3DValue) : HResult; stdcall;
function SetGroupMapping (id: TD3DRMGroupIndex;
value: TD3DRMMapping) : HResult; stdcall;
function SetGroupQuality (id: TD3DRMGroupIndex;
value: TD3DRMRenderQuality) : HResult; stdcall;
function SetGroupMaterial (id: TD3DRMGroupIndex; value:
IDirect3DRMMaterial) : HResult; stdcall;
function SetGroupTexture (id: TD3DRMGroupIndex; value: IDirect3DRMTexture) : HResult; stdcall;
IDirect3DRMMesh = interface(IDirect3DRMVisual)
['{A3A80D01-6E12-11CF-AC4A-0000C03825A1}']
// IDirect3DRMMesh methods
function Scale(sx, sy, sz: TD3DValue): HResult; stdcall;
function Translate(tx, ty, tz: TD3DValue): HResult; stdcall;
function GetBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function AddGroup(vCount, fCount, vPerFace: DWORD; var fData: DWORD;
var returnId: TD3DRMGroupIndex): HResult; stdcall;
function SetVertices(id: TD3DRMGroupIndex; index, count: DWORD;
var values: TD3DRMVertex): HResult; stdcall;
function SetGroupColor(id: TD3DRMGroupIndex; value: TD3DColor): HResult; stdcall;
function SetGroupColorRGB(id: TD3DRMGroupIndex; red, green,
blue: TD3DValue): HResult; stdcall;
function SetGroupMapping(id: TD3DRMGroupIndex;
value: TD3DRMMapping): HResult; stdcall;
function SetGroupQuality(id: TD3DRMGroupIndex;
value: TD3DRMRenderQuality): HResult; stdcall;
function SetGroupMaterial(id: TD3DRMGroupIndex; value:
IDirect3DRMMaterial): HResult; stdcall;
function SetGroupTexture(id: TD3DRMGroupIndex; value: IDirect3DRMTexture): HResult; stdcall;
function GetGroupCount: DWORD; stdcall;
function GetGroup (id: TD3DRMGroupIndex; vCount, fCount, vPerFace : PDWORD;
var fDataSize: DWORD; fData: PDWORD) : HResult; stdcall;
function GetVertices (id: TD3DRMGroupIndex; index, count : DWORD;
out returnPtr : TD3DRMVertex) : HResult; stdcall;
function GetGroupColor (id: TD3DRMGroupIndex) : TD3DColor; stdcall;
function GetGroupMapping (id: TD3DRMGroupIndex) : TD3DRMMapping; stdcall;
function GetGroupQuality (id: TD3DRMGroupIndex) : TD3DRMRenderQuality; stdcall;
function GetGroupMaterial (id: TD3DRMGroupIndex;
out returnPtr: IDirect3DRMMaterial) : HResult; stdcall;
function GetGroupTexture (id: TD3DRMGroupIndex;
out returnPtr: IDirect3DRMTexture) : HResult; stdcall;
function GetGroup(id: TD3DRMGroupIndex; var vCount, fCount, vPerFace,
fDataSize, fData: DWORD): HResult; stdcall;
function GetVertices(id: TD3DRMGroupIndex; index: DWORD; count: DWORD;
var returnPtr: TD3DRMVertex): HResult; stdcall;
function GetGroupColor(id: TD3DRMGroupIndex): TD3DColor; stdcall;
function GetGroupMapping(id: TD3DRMGroupIndex): TD3DRMMapping; stdcall;
function GetGroupQuality(id: TD3DRMGroupIndex): TD3DRMRenderQuality; stdcall;
function GetGroupMaterial(id: TD3DRMGroupIndex;
out returnPtr: IDirect3DRMMaterial): HResult; stdcall;
function GetGroupTexture(id: TD3DRMGroupIndex;
out returnPtr: IDirect3DRMTexture): HResult; stdcall;
end;
 
IDirect3DRMProgressiveMesh = interface (IDirect3DRMVisual)
['{4516ec79-8f20-11d0-9b6d-0000c0781bc3}']
(*
* IDirect3DRMProgressiveMesh methods
*)
function Load (lpSource, lpObjID: pointer; dloLoadflags : TD3DRMLoadOptions;
lpCallback: TD3DRMLoadTextureCallback; lpArg: pointer) : HResult; stdcall;
function GetLoadStatus (out lpStatus: TD3DRMPMeshLoadStatus) : HResult; stdcall;
function SetMinRenderDetail (d3dVal: TD3DValue) : HResult; stdcall;
function Abort (dwFlags: DWORD) : HResult; stdcall;
function GetFaceDetail (out lpdwCount: DWORD) : HResult; stdcall;
function GetVertexDetail (out lpdwCount: DWORD) : HResult; stdcall;
function SetFaceDetail (dwCount: DWORD) : HResult; stdcall;
function SetVertexDetail (dwCount: DWORD) : HResult; stdcall;
function GetFaceDetailRange (out lpdwMin, lpdwMax: DWORD) : HResult; stdcall;
function GetVertexDetailRange (out lpdwMin, lpdwMax: DWORD) : HResult; stdcall;
function GetDetail (out lpdvVal: TD3DValue) : HResult; stdcall;
function SetDetail (lpdvVal: TD3DValue) : HResult; stdcall;
function RegisterEvents (hEvent: THANDLE; dwFlags, dwReserved: DWORD) : HResult; stdcall;
function CreateMesh (out lplpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function Duplicate (out lplpD3DRMPMesh: IDirect3DRMProgressiveMesh) : HResult; stdcall;
function GetBox (out lpBBox: TD3DRMBox) : HResult; stdcall;
function SetQuality (quality: TD3DRMRenderQuality) : HResult; stdcall;
function GetQuality (out lpdwquality: TD3DRMRenderQuality) : HResult; stdcall;
IDirect3DRMProgressiveMesh = interface(IDirect3DRMVisual)
['{4516EC79-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMProgressiveMesh methods
function Load(lpSource, lpObjID: pointer; dloLoadflags: TD3DRMLoadOptions;
lpCallback: TD3DRMLoadTextureCallback; lpArg: pointer): HResult; stdcall;
function GetLoadStatus(var lpStatus: TD3DRMPMeshLoadStatus): HResult; stdcall;
function SetMinRenderDetail(d3dVal: TD3DValue): HResult; stdcall;
function Abort(dwFlags: DWORD): HResult; stdcall;
function GetFaceDetail(var lpdwCount: DWORD): HResult; stdcall;
function GetVertexDetail(var lpdwCount: DWORD): HResult; stdcall;
function SetFaceDetail(dwCount: DWORD): HResult; stdcall;
function SetVertexDetail(dwCount: DWORD): HResult; stdcall;
function GetFaceDetailRange(var lpdwMin, lpdwMax: DWORD): HResult; stdcall;
function GetVertexDetailRange(var lpdwMin, lpdwMax: DWORD): HResult; stdcall;
function GetDetail(var lpdvVal: TD3DValue): HResult; stdcall;
function SetDetail(lpdvVal: TD3DValue): HResult; stdcall;
function RegisterEvents(hEvent: THANDLE; dwFlags, dwReserved: DWORD): HResult; stdcall;
function CreateMesh(out lplpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function Duplicate(out lplpD3DRMPMesh: IDirect3DRMProgressiveMesh): HResult; stdcall;
function GetBox(var lpBBox: TD3DRMBox): HResult; stdcall;
function SetQuality(quality: TD3DRMRenderQuality): HResult; stdcall;
function GetQuality(var lpdwquality: TD3DRMRenderQuality): HResult; stdcall;
end;
 
IDirect3DRMShadow = interface (IDirect3DRMVisual)
['{af359780-6ba3-11cf-ac4a-0000c03825a1}']
(*
* IDirect3DRMShadow methods
*)
function Init (lpD3DRMVisual: IDirect3DRMVisual;
lpD3DRMLight: IDirect3DRMLight;
px, py, pz, nx, ny, nz: TD3DValue) : HResult; stdcall;
IDirect3DRMShadow = interface(IDirect3DRMVisual)
['{AF359780-6BA3-11CF-AC4A-0000C03825A1}']
// IDirect3DRMShadow methods
function Init(lpD3DRMVisual: IDirect3DRMVisual;
lpD3DRMLight: IDirect3DRMLight; px, py, pz, nx, ny, nz: TD3DValue): HResult; stdcall;
end;
 
IDirect3DRMShadow2 = interface (IDirect3DRMShadow)
['{86b44e25-9c82-11d1-bb0b-00a0c981a0a6}']
(*
* IDirect3DRMShadow2 methods
*)
function GetVisual (out lplpDirect3DRMVisual: IDirect3DRMVisual) : HResult; stdcall;
function SetVisual (lpDirect3DRMVisual: IDirect3DRMVisual;
dwFlags: DWORD) : HResult; stdcall;
function GetLight (out lplpDirect3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function SetLight (lplpDirect3DRMLight: IDirect3DRMLight;
dwFlags: DWORD) : HResult; stdcall;
function GetPlane (
var pdvPX, pdvPY, pdvPZ, pdvNX, pdvNY, pdvNZ: TD3DValue) : HResult; stdcall;
function SetPlane (px, py, pz, nx, ny, nz: TD3DValue;
dwFlags: DWORD) : HResult; stdcall;
function GetOptions (out pdwOptions: DWORD) : HResult; stdcall;
function SetOptions (dwOptions: DWORD) : HResult; stdcall;
 
IDirect3DRMShadow2 = interface(IDirect3DRMShadow)
['{86B44E25-9C82-11D1-BB0B-00A0C981A0A6}']
// IDirect3DRMShadow2 methods
function GetVisual(out lplpDirect3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
function SetVisual(pUNK: IUnknown; dwFlags: DWORD): HResult; stdcall;
function GetLight(out lplpDirect3DRMLight: IDirect3DRMLight): HResult; stdcall;
function SetLight(lpDirect3DRMLight: IDirect3DRMLight; dwFlags: DWORD): HResult; stdcall;
function GetPlane(var px, py, pz: TD3DValue; var nx, ny, nz: TD3DValue): HResult; stdcall;
function SetPlane(px, py, pz: TD3DValue; nx, ny, nz: TD3DValue): HResult; stdcall;
function GetOptions(var pdwOptions: DWORD): HResult; stdcall;
function SetOptions(dwOptions: DWORD): HResult; stdcall;
end;
 
IDirect3DRMFace = interface (IDirect3DRMObject)
['{eb16cb07-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMFace methods
*)
function AddVertex (x, y, z: TD3DValue) : HResult; stdcall;
function AddVertexAndNormalIndexed (vertex: DWORD; normal: DWORD) : HResult; stdcall;
function SetColorRGB (red, green, blue: TD3DValue) : HResult; stdcall;
function SetColor (color: TD3DColor) : HResult; stdcall;
function SetTexture (lpD3DRMTexture: IDirect3DRMTexture) : HResult; stdcall;
function SetTextureCoordinates (vertex: DWORD; u, v: TD3DValue) : HResult; stdcall;
function SetMaterial (lpMat: IDirect3DRMMaterial) : HResult; stdcall;
function SetTextureTopology (cylU, cylV: BOOL) : HResult; stdcall;
function GetVertex (index: DWORD; out lpPosition: TD3DVector;
out lpNormal: TD3DVector) : HResult; stdcall;
function GetVertices (var lpdwVertexCount: DWORD;
out lpPosition, lpNormal: TD3DVector) : HResult; stdcall;
function GetTextureCoordinates (index: DWORD; out lpU, lpV: TD3DValue) : HResult; stdcall;
function GetTextureTopology (out lpU, lpV: BOOL) : HResult; stdcall;
function GetNormal (out lpNormal: TD3DVector) : HResult; stdcall;
function GetTexture (out lplpTexture: IDirect3DRMTexture) : HResult; stdcall;
function GetMaterial (out lpMat: IDirect3DRMMaterial) : HResult; stdcall;
function GetVertexCount: Integer; stdcall;
function GetVertexIndex (dwIndex: DWORD) : Integer; stdcall;
function GetTextureCoordinateIndex (dwIndex: DWORD) : Integer; stdcall;
IDirect3DRMFace = interface(IDirect3DRMObject)
['{EB16CB07-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMFace methods
function AddVertex(x, y, z: TD3DValue): HResult; stdcall;
function AddVertexAndNormalIndexed(vertex: DWORD; normal: DWORD): HResult; stdcall;
function SetColorRGB(red, green, blue: TD3DValue): HResult; stdcall;
function SetColor(color: TD3DColor): HResult; stdcall;
function SetTexture(lpD3DRMTexture: IDirect3DRMTexture): HResult; stdcall;
function SetTextureCoordinates(vertex: DWORD; u, v: TD3DValue): HResult; stdcall;
function SetMaterial(lpMat: IDirect3DRMMaterial): HResult; stdcall;
function SetTextureTopology(cylU, cylV: BOOL): HResult; stdcall;
function GetVertex(index: DWORD; var lpPosition: TD3DVector; var lpNormal: TD3DVector): HResult; stdcall;
function GetVertices(var lpdwVertexCount: DWORD; var lpPosition, lpNormal: TD3DVector): HResult; stdcall;
function GetTextureCoordinates(index: DWORD; var lpU, lpV: TD3DValue): HResult; stdcall;
function GetTextureTopology(var lpU, lpV: BOOL): HResult; stdcall;
function GetNormal(var lpNormal: TD3DVector): HResult; stdcall;
function GetTexture(out lplpTexture: IDirect3DRMTexture): HResult; stdcall;
function GetMaterial(out lpMat: IDirect3DRMMaterial): HResult; stdcall;
function GetVertexCount: Longint; stdcall;
function GetVertexIndex(dwIndex: DWORD): Longint; stdcall;
function GetTextureCoordinateIndex(dwIndex: DWORD): Longint; stdcall;
function GetColor: TD3DColor; stdcall;
end;
 
IDirect3DRMFace2 = interface (IDirect3DRMObject)
['{4516ec81-8f20-11d0-9b6d-0000c0781bc3}']
(*
* IDirect3DRMFace2 methods
*)
function AddVertex (x, y, z: TD3DValue) : HResult; stdcall;
function AddVertexAndNormalIndexed (vertex: DWORD; normal: DWORD) : HResult; stdcall;
function SetColorRGB (red, green, blue: TD3DValue) : HResult; stdcall;
function SetColor (color: TD3DColor) : HResult; stdcall;
function SetTexture (lpD3DRMTexture: IDirect3DRMTexture3) : HResult; stdcall;
function SetTextureCoordinates (vertex: DWORD; u, v: TD3DValue) : HResult; stdcall;
function SetMaterial (lpMat: IDirect3DRMMaterial2) : HResult; stdcall;
function SetTextureTopology (cylU, cylV: BOOL) : HResult; stdcall;
function GetVertex (index: DWORD; out lpPosition: TD3DVector;
out lpNormal: TD3DVector) : HResult; stdcall;
function GetVertices (var lpdwVertexCount: DWORD;
out lpPosition, lpNormal: TD3DVector) : HResult; stdcall;
function GetTextureCoordinates (index: DWORD; out lpU, lpV: TD3DValue) : HResult; stdcall;
function GetTextureTopology (out lpU, lpV: BOOL) : HResult; stdcall;
function GetNormal (out lpNormal: TD3DVector) : HResult; stdcall;
function GetTexture (out lplpTexture: IDirect3DRMTexture3) : HResult; stdcall;
function GetMaterial (out lpMat: IDirect3DRMMaterial2) : HResult; stdcall;
function GetVertexCount: Integer; stdcall;
function GetVertexIndex (dwIndex: DWORD) : Integer; stdcall;
function GetTextureCoordinateIndex (dwIndex: DWORD) : Integer; stdcall;
IDirect3DRMFace2 = interface(IDirect3DRMObject)
['{4516EC81-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMFace methods
function AddVertex(x, y, z: TD3DValue): HResult; stdcall;
function AddVertexAndNormalIndexed(vertex: DWORD; normal: DWORD): HResult; stdcall;
function SetColorRGB(red, green, blue: TD3DValue): HResult; stdcall;
function SetColor(color: TD3DColor): HResult; stdcall;
function SetTexture(lpD3DRMTexture: IDirect3DRMTexture3): HResult; stdcall;
function SetTextureCoordinates(vertex: DWORD; u, v: TD3DValue): HResult; stdcall;
function SetMaterial(lpMat: IDirect3DRMMaterial2): HResult; stdcall;
function SetTextureTopology(cylU, cylV: BOOL): HResult; stdcall;
function GetVertex(index: DWORD; var lpPosition: TD3DVector; var lpNormal: TD3DVector): HResult; stdcall;
function GetVertices(var lpdwVertexCount: DWORD; var lpPosition, lpNormal: TD3DVector): HResult; stdcall;
function GetTextureCoordinates(index: DWORD; var lpU, lpV: TD3DValue): HResult; stdcall;
function GetTextureTopology(var lpU, lpV: BOOL): HResult; stdcall;
function GetNormal(var lpNormal: TD3DVector): HResult; stdcall;
function GetTexture(out lplpTexture: IDirect3DRMTexture3): HResult; stdcall;
function GetMaterial(out lpMat: IDirect3DRMMaterial2): HResult; stdcall;
function GetVertexCount: Longint; stdcall;
function GetVertexIndex(dwIndex: DWORD): Longint; stdcall;
function GetTextureCoordinateIndex(dwIndex: DWORD): Longint; stdcall;
function GetColor: TD3DColor; stdcall;
end;
 
IDirect3DRMMeshBuilder = interface (IDirect3DRMVisual)
['{a3a80d02-6e12-11cf-ac4a-0000c03825a1}']
(*
* IDirect3DRMMeshBuilder methods
*)
function Load (lpvObjSource, lpvObjID: Pointer; d3drmLOFlags:
TD3DRMLoadOptions; d3drmLoadTextureProc: TD3DRMLoadTextureCallback;
lpvArg: Pointer) : HResult; stdcall;
function Save (lpFilename: PChar; TD3DRMXOFFormat: TD3DRMXOFFormat;
d3drmSOContents: TD3DRMSaveOptions) : HResult; stdcall;
function Scale (sx, sy, sz: TD3DValue) : HResult; stdcall;
function Translate (tx, ty, tz: TD3DValue) : HResult; stdcall;
function SetColorSource (source: TD3DRMColorSource) : HResult; stdcall;
function GetBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function GenerateNormals : HResult; stdcall;
IDirect3DRMMeshBuilder = interface(IDirect3DRMVisual)
['{A3A80D02-6E12-11CF-AC4A-0000C03825A1}']
// IDirect3DRMMeshBuilder methods
function Load(lpvObjSource, lpvObjID: Pointer; d3drmLOFlags: TD3DRMLoadOptions;
d3drmLoadTextureProc: TD3DRMLoadTextureCallback; lpvArg: Pointer): HResult; stdcall;
function Save(lpFilename: PChar; TD3DRMXOFFormat: TD3DRMXOFFormat;
d3drmSOContents: TD3DRMSaveOptions): HResult; stdcall;
function Scale(sx, sy, sz: TD3DValue): HResult; stdcall;
function Translate(tx, ty, tz: TD3DValue): HResult; stdcall;
function SetColorSource(source: TD3DRMColorSource): HResult; stdcall;
function GetBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function GenerateNormals: HResult; stdcall;
function GetColorSource: TD3DRMColorSource; stdcall;
function AddMesh (lpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function AddMeshBuilder (lpD3DRMMeshBuild: IDirect3DRMMeshBuilder) : HResult; stdcall;
function AddFrame (lpD3DRMFrame: IDirect3DRMFrame) : HResult; stdcall;
function AddFace (lpD3DRMFace: IDirect3DRMFace) : HResult; stdcall;
function AddFaces (dwVertexCount: DWORD; const lpD3DVertices: TD3DVector;
normalCount: DWORD; lpNormals: PD3DVector; var lpFaceData: DWORD;
lplpD3DRMFaceArray: PIDirect3DRMFaceArray) : HResult; stdcall;
function ReserveSpace (vertexCount, normalCount, faceCount: DWORD) : HResult; stdcall;
function SetColorRGB (red, green, blue: TD3DValue) : HResult; stdcall;
function SetColor (color: TD3DColor) : HResult; stdcall;
function SetTexture (lpD3DRMTexture: IDirect3DRMTexture) : HResult; stdcall;
function SetMaterial (lpIDirect3DRMmaterial: IDirect3DRMMaterial) : HResult; stdcall;
function SetTextureTopology (cylU, cylV: BOOL) : HResult; stdcall;
function SetQuality (quality: TD3DRMRenderQuality) : HResult; stdcall;
function SetPerspective (perspective: BOOL) : HResult; stdcall;
function SetVertex (index: DWORD; x, y, z: TD3DValue) : HResult; stdcall;
function SetNormal (index: DWORD; x, y, z: TD3DValue) : HResult; stdcall;
function SetTextureCoordinates (index: DWORD; u, v: TD3DValue) : HResult; stdcall;
function SetVertexColor (index: DWORD; color: TD3DColor) : HResult; stdcall;
function SetVertexColorRGB (index: DWORD; red, green, blue: TD3DValue) : HResult; stdcall;
function GetFaces (out lplpD3DRMFaceArray: IDirect3DRMFaceArray) : HResult; stdcall;
function GetVertices (var vcount: DWORD; var vertices : TD3DVector;
var ncount : DWORD;
var normals : TD3DVector;
var face_data_size, face_data : DWORD) : HResult; stdcall;
function GetTextureCoordinates(index : DWORD; out u, v : TD3DValue) : HResult; stdcall;
function AddVertex (x, y, z: TD3DValue) : Integer; stdcall;
function AddNormal (x, y, z: TD3DValue) : Integer; stdcall;
function CreateFace (out lplpd3drmFace: IDirect3DRMFace) : HResult; stdcall;
function AddMesh(lpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function AddMeshBuilder(lpD3DRMMeshBuild: IDirect3DRMMeshBuilder): HResult; stdcall;
function AddFrame(lpD3DRMFrame: IDirect3DRMFrame): HResult; stdcall;
function AddFace(lpD3DRMFace: IDirect3DRMFace): HResult; stdcall;
function AddFaces(dwVertexCount: DWORD; var lpD3DVertices: TD3DVector;
normalCount: DWORD; var lpNormals: TD3DVector; var lpFaceData: DWORD;
out lplpD3DRMFaceArray: IDirect3DRMFaceArray): HResult; stdcall;
function ReserveSpace(vertexCount, normalCount, faceCount: DWORD): HResult; stdcall;
function SetColorRGB(red, green, blue: TD3DValue): HResult; stdcall;
function SetColor(color: TD3DColor): HResult; stdcall;
function SetTexture(lpD3DRMTexture: IDirect3DRMTexture): HResult; stdcall;
function SetMaterial(lpIDirect3DRMmaterial: IDirect3DRMMaterial): HResult; stdcall;
function SetTextureTopology(cylU, cylV: BOOL): HResult; stdcall;
function SetQuality(quality: TD3DRMRenderQuality): HResult; stdcall;
function SetPerspective(perspective: BOOL): HResult; stdcall;
function SetVertex(index: DWORD; x, y, z: TD3DValue): HResult; stdcall;
function SetNormal(index: DWORD; x, y, z: TD3DValue): HResult; stdcall;
function SetTextureCoordinates(index: DWORD; u, v: TD3DValue): HResult; stdcall;
function SetVertexColor(index: DWORD; color: TD3DColor): HResult; stdcall;
function SetVertexColorRGB(index: DWORD; red, green, blue: TD3DValue): HResult; stdcall;
function GetFaces(out lplpD3DRMFaceArray: IDirect3DRMFaceArray): HResult; stdcall;
function GetVertices(var vcount: DWORD; var vertices: TD3DVector;
var ncount: DWORD; var normals: TD3DVector; var face_data_size: DWORD;
var face_data: DWORD): HResult; stdcall;
function GetTextureCoordinates(index: DWORD; var u, v: TD3DValue): HResult; stdcall;
function AddVertex(x, y, z: TD3DValue): Longint; stdcall;
function AddNormal(x, y, z: TD3DValue): Longint; stdcall;
function CreateFace(out lplpd3drmFace: IDirect3DRMFace): HResult; stdcall;
function GetQuality: TD3DRMRenderQuality; stdcall;
function GetPerspective: BOOL; stdcall;
function GetFaceCount: Integer; stdcall;
function GetVertexCount: Integer; stdcall;
function GetVertexColor (index: DWORD) : TD3DColor; stdcall;
function CreateMesh (out lplpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function GetFaceCount: Longint; stdcall;
function GetVertexCount: Longint; stdcall;
function GetVertexColor(index: DWORD): TD3DColor; stdcall;
function CreateMesh(out lplpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
end;
 
IDirect3DRMMeshBuilder2 = interface (IDirect3DRMMeshBuilder)
['{4516ec77-8f20-11d0-9b6d-0000c0781bc3}']
(*
* IDirect3DRMMeshBuilder2 methods
*)
function GenerateNormals2 (
dvCreaseAngle: TD3DValue; dwFlags: DWORD) : HResult; stdcall;
function GetFace (dwIndex: DWORD; lplpD3DRMFace: IDirect3DRMFace) : HResult; stdcall;
IDirect3DRMMeshBuilder2 = interface(IDirect3DRMMeshBuilder)
['{4516EC77-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMMeshBuilder2 methods
function GenerateNormals2(dvCreaseAngle: TD3DValue; dwFlags: DWORD): HResult; stdcall;
function GetFace(dwIndex: DWORD; out lplpD3DRMFace: IDirect3DRMFace): HResult; stdcall;
end;
 
IDirect3DRMMeshBuilder3 = interface (IDirect3DRMVisual)
['{ff6b7f71-a40e-11d1-91f9-0000f8758e66}']
(*
* IDirect3DRMMeshBuilder3 methods
*)
function Load (lpvObjSource, lpvObjID: Pointer;
d3drmLOFlags: TD3DRMLoadOptions;
d3drmLoadTextureProc: TD3DRMLoadTexture3Callback;
lpvArg: Pointer) : HResult; stdcall;
function Save (lpFilename: PAnsiChar; TD3DRMXOFFormat: TD3DRMXOFFormat;
d3drmSOContents: TD3DRMSaveOptions) : HResult; stdcall;
function Scale (sx, sy, sz: TD3DValue) : HResult; stdcall;
function Translate (tx, ty, tz: TD3DValue) : HResult; stdcall;
function SetColorSource (source: TD3DRMColorSource) : HResult; stdcall;
function GetBox (out lpTD3DRMBox: TD3DRMBox) : HResult; stdcall;
function GenerateNormals (
dvCreaseAngle: TD3DValue; dwFlags: DWORD): HResult; stdcall;
IDirect3DRMMeshBuilder3 = interface(IDirect3DRMVisual)
['{4516EC82-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMMeshBuilder methods
function Load(lpvObjSource, lpvObjID: Pointer; d3drmLOFlags: TD3DRMLoadOptions;
d3drmLoadTextureProc: TD3DRMLoadTexture3Callback; lpvArg: Pointer): HResult; stdcall;
function Save(lpFilename: PChar; TD3DRMXOFFormat: TD3DRMXOFFormat;
d3drmSOContents: TD3DRMSaveOptions): HResult; stdcall;
function Scale(sx, sy, sz: TD3DValue): HResult; stdcall;
function Translate(tx, ty, tz: TD3DValue): HResult; stdcall;
function SetColorSource(source: TD3DRMColorSource): HResult; stdcall;
function GetBox(var lpD3DRMBox: TD3DRMBox): HResult; stdcall;
function GenerateNormals(dvCreaseAngle: TD3DValue; dwFlags: DWORD): HResult; stdcall;
function GetColorSource: TD3DRMColorSource; stdcall;
function AddMesh (lpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function AddMeshBuilder (
lpD3DRMMeshBuild: IDirect3DRMMeshBuilder3) : HResult; stdcall;
function AddFrame (lpD3DRMFrame: IDirect3DRMFrame3) : HResult; stdcall;
function AddFace (lpD3DRMFace: IDirect3DRMFace2) : HResult; stdcall;
function AddFaces (dwVertexCount: DWORD; const lpD3DVertices: TD3DVector;
normalCount: DWORD; lpNormals: PD3DVector; var lpFaceData: DWORD;
lplpD3DRMFaceArray: PIDirect3DRMFaceArray) : HResult; stdcall;
function ReserveSpace (vertexCount, normalCount, faceCount: DWORD) : HResult; stdcall;
function SetColorRGB (red, green, blue: TD3DValue) : HResult; stdcall;
function SetColor (color: TD3DColor) : HResult; stdcall;
function SetTexture (lpD3DRMTexture: IDirect3DRMTexture3) : HResult; stdcall;
function SetMaterial (lpIDirect3DRMmaterial: IDirect3DRMMaterial2) : HResult; stdcall;
function SetTextureTopology (cylU, cylV: BOOL) : HResult; stdcall;
function SetQuality (quality: TD3DRMRenderQuality) : HResult; stdcall;
function SetPerspective (perspective: BOOL) : HResult; stdcall;
function SetVertex (index: DWORD; x, y, z: TD3DValue) : HResult; stdcall;
function SetNormal (index: DWORD; x, y, z: TD3DValue) : HResult; stdcall;
function SetTextureCoordinates (index: DWORD; u, v: TD3DValue) : HResult; stdcall;
function SetVertexColor (index: DWORD; color: TD3DColor) : HResult; stdcall;
function SetVertexColorRGB (index: DWORD; red, green, blue: TD3DValue) : HResult; stdcall;
function GetFaces (out lplpD3DRMFaceArray: IDirect3DRMFaceArray) : HResult; stdcall;
function GetGeometry (var vcount: DWORD; var vertices : TD3DVector;
var ncount : DWORD; var normals : TD3DVector;
var face_data_size, face_data : DWORD) : HResult; stdcall;
function GetTextureCoordinates(index : DWORD; out u, v : TD3DValue) : HResult; stdcall;
function AddVertex (x, y, z: TD3DValue) : Integer; stdcall;
function AddNormal (x, y, z: TD3DValue) : Integer; stdcall;
function CreateFace (out lplpd3drmFace: IDirect3DRMFace2) : HResult; stdcall;
function AddMesh(lpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function AddMeshBuilder(lpD3DRMMeshBuild: IDirect3DRMMeshBuilder3): HResult; stdcall;
function AddFrame(lpD3DRMFrame: IDirect3DRMFrame3): HResult; stdcall;
function AddFace(lpD3DRMFace: IDirect3DRMFace2): HResult; stdcall;
function AddFaces(dwVertexCount: DWORD; var lpD3DVertices: TD3DVector;
normalCount: DWORD; var lpNormals: TD3DVector; var lpFaceData: DWORD;
out lplpD3DRMFaceArray: IDirect3DRMFaceArray): HResult; stdcall;
function ReserveSpace(vertexCount, normalCount, faceCount: DWORD): HResult; stdcall;
function SetColorRGB(red, green, blue: TD3DValue): HResult; stdcall;
function SetColor(color: TD3DColor): HResult; stdcall;
function SetTexture(lpD3DRMTexture: IDirect3DRMTexture3): HResult; stdcall;
function SetMaterial(lpDirect3DRMMaterial: IDirect3DRMMaterial2): HResult; stdcall;
function SetTextureTopology(cylU, cylV: BOOL): HResult; stdcall;
function SetQuality(quality: TD3DRMRenderQuality): HResult; stdcall;
function SetPerspective(perspective: BOOL): HResult; stdcall;
function SetVertex(index: DWORD; x, y, z: TD3DValue): HResult; stdcall;
function SetNormal(index: DWORD; x, y, z: TD3DValue): HResult; stdcall;
function SetTextureCoordinates(index: DWORD; u, v: TD3DValue): HResult; stdcall;
function SetVertexColor(index: DWORD; color: TD3DColor): HResult; stdcall;
function SetVertexColorRGB(index: DWORD; red, green, blue: TD3DValue): HResult; stdcall;
function GetFaces(out lplpD3DRMFaceArray: IDirect3DRMFaceArray): HResult; stdcall;
function GetGeometry(var vcount: DWORD; var vertices; var ncount: DWORD; var normals;
var face_data_size: DWORD; var face_data): HResult; stdcall;
function GetTextureCoordinates(index: DWORD; var u, v: TD3DValue): HResult; stdcall;
function AddVertex(x, y, z: TD3DValue): Longint; stdcall;
function AddNormal(x, y, z: TD3DValue): Longint; stdcall;
function CreateFace(out lplpd3drmFace: IDirect3DRMFace2): HResult; stdcall;
function GetQuality: TD3DRMRenderQuality; stdcall;
function GetPerspective: BOOL; stdcall;
function GetFaceCount: Integer; stdcall;
function GetVertexCount: Integer; stdcall;
function GetVertexColor (index: DWORD) : TD3DColor; stdcall;
function CreateMesh (out lplpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function GetFace
(dwIndex: DWORD; lplpD3DRMFace: IDirect3DRMFace) : HResult; stdcall;
function GetVertex (dwIndex: DWORD; out lpVector: TD3DVector) : HResult; stdcall;
function GetNormal (dwIndex: DWORD; out lpVector: TD3DVector) : HResult; stdcall;
function DeleteVertices (dwFirstIndex, dwCount: DWORD) : HResult; stdcall;
function DeleteNormals (dwFirstIndex, dwCount: DWORD) : HResult; stdcall;
function DeleteFace (lpFace: IDirect3DRMFace2) : HResult; stdcall;
function Empty (dwFlags: DWORD) : HResult; stdcall;
function Optimize (dwFlags: DWORD) : HResult; stdcall;
function AddFacesIndexed (dwFlags: DWORD; var lpdwvIndices: DWORD;
lpdwIndexFirst, lpdwCount: PDWORD) : HResult; stdcall;
function CreateSubMesh (out lplpUnk: IUnknown) : HResult; stdcall;
function GetParentMesh (dwFlags: DWORD; out lplpUnk: IUnknown) : HResult; stdcall;
function GetSubMeshes (lpdwCount: PDWORD; lpUnk: IUnknown) : HResult; stdcall;
function DeleteSubMesh (lplpUnk: IUnknown) : HResult; stdcall;
function Enable (dwFlags: DWORD) : HResult; stdcall;
function GetEnable (out lpdwFlags: DWORD) : HResult; stdcall;
function AddTriangles (dwFlags, dwFormat, dwVertexCount: DWORD;
lpData: pointer) : HResult; stdcall;
function SetVertices
(dwFirst, dwCount: DWORD; const lpdvVector: TD3DVector) : HResult; stdcall;
function GetVertices(dwFirst: DWORD; var lpdwCount: DWORD;
lpdvVector: PD3DVector) : HResult; stdcall;
function SetNormals(dwFirst, dwCount: DWORD; const lpdvVector: TD3DVector) : HResult; stdcall;
function GetNormals (dwFirst: DWORD; lpdwCount: PDWORD;
var lpdvVector: TD3DVector) : HResult; stdcall;
function GetNormalCount : integer; stdcall;
function GetFaceCount: Longint; stdcall;
function GetVertexCount: Longint; stdcall;
function GetVertexColor(index: DWORD): TD3DColor; stdcall;
function CreateMesh(out lplpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function GetFace(dwIndex: DWORD; out lplpD3DRMFace: IDirect3DRMFace2): HResult; stdcall;
function GetVertex(dwIndex: DWORD; var lpVector: TD3DVector): HResult; stdcall;
function GetNormal(dwIndex: DWORD; var lpVector: TD3DVector): HResult; stdcall;
function DeleteVertices(dwIndexFirst: DWORD; dwCount: DWORD): HResult; stdcall;
function DeleteNormals(dwIndexFirst: DWORD; dwCount: DWORD): HResult; stdcall;
function DeleteFace(lpD3DRMFace: IDirect3DRMFace2): HResult; stdcall;
function Empty(dwFlags: DWORD): HResult; stdcall;
function Optimize(dwFlags: DWORD): HResult; stdcall;
function AddFacesIndexed(dwFlags: DWORD; var lpdwvIndices: DWORD;
var dwIndexFirst: DWORD; var dwCount: DWORD): HResult; stdcall;
function CreateSubMesh(out lplpUnk: IUnknown): HResult; stdcall;
function GetParentMesh(dwFlags: DWORD; out lplpUnk: IUnknown): HResult; stdcall;
function GetSubMeshes(var lpdwCount: DWORD; out lplpUnk: IUnknown): HResult; stdcall;
function DeleteSubMesh(lpUnk: IUnknown): HResult; stdcall;
function Enable(dwFlags: DWORD): HResult; stdcall;
function GetEnable(var lpdwFlags: DWORD): HResult; stdcall;
function AddTriangles(dwFlags: DWORD; dwFormat: DWORD; dwVertexCount: DWORD;
lpvData: Pointer): HResult; stdcall;
function SetVertices(dwIndexFirst: DWORD; dwCount: DWORD;
const lpdvVector: TD3DVector): HResult; stdcall;
function GetVertices(dwIndexFirst: DWORD; var lpdwCount: DWORD;
var lpdvVector: TD3DVector): HResult; stdcall;
function SetNormals(dwIndexFirst: DWORD; dwCount: DWORD;
const lpdvVector: TD3DVector): HResult; stdcall;
function GetNormals(dwIndexFirst: DWORD; var lpdwCount: DWORD;
var lpdvVector: TD3DVector): HResult; stdcall;
function GetNormalCount: Longint; stdcall;
end;
 
IDirect3DRMLight = interface (IDirect3DRMObject)
['{eb16cb08-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMLight methods
*)
function SetType (d3drmtType: TD3DRMLightType) : HResult; stdcall;
function SetColor (rcColor: TD3DColor) : HResult; stdcall;
function SetColorRGB (rvRed, rvGreen, rvBlue: TD3DValue) : HResult; stdcall;
function SetRange (rvRange: TD3DValue) : HResult; stdcall;
function SetUmbra (rvAngle: TD3DValue) : HResult; stdcall;
function SetPenumbra (rvAngle: TD3DValue) : HResult; stdcall;
function SetConstantAttenuation (rvAtt: TD3DValue) : HResult; stdcall;
function SetLinearAttenuation (rvAtt: TD3DValue) : HResult; stdcall;
function SetQuadraticAttenuation (rvAtt: TD3DValue) : HResult; stdcall;
IDirect3DRMLight = interface(IDirect3DRMObject)
['{EB16CB08-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMLight methods
function SetType(d3drmtType: TD3DRMLightType): HResult; stdcall;
function SetColor(rcColor: TD3DColor): HResult; stdcall;
function SetColorRGB(rvRed, rvGreen, rvBlue: TD3DValue): HResult; stdcall;
function SetRange(rvRange: TD3DValue): HResult; stdcall;
function SetUmbra(rvAngle: TD3DValue): HResult; stdcall;
function SetPenumbra(rvAngle: TD3DValue): HResult; stdcall;
function SetConstantAttenuation(rvAtt: TD3DValue): HResult; stdcall;
function SetLinearAttenuation(rvAtt: TD3DValue): HResult; stdcall;
function SetQuadraticAttenuation(rvAtt: TD3DValue): HResult; stdcall;
function GetRange: TD3DValue; stdcall;
function GetUmbra: TD3DValue; stdcall;
function GetPenumbra: TD3DValue; stdcall;
10897,28 → 7265,26
function GetQuadraticAttenuation: TD3DValue; stdcall;
function GetColor: TD3DColor; stdcall;
function GetType: TD3DRMLightType; stdcall;
function SetEnableFrame (lpEnableFrame: IDirect3DRMFrame) : HResult; stdcall;
function GetEnableFrame (out lplpEnableFrame: IDirect3DRMFrame) : HResult; stdcall;
function SetEnableFrame(lpEnableFrame: IDirect3DRMFrame): HResult; stdcall;
function GetEnableFrame(out lplpEnableFrame: IDirect3DRMFrame): HResult; stdcall;
end;
 
IDirect3DRMTexture = interface (IDirect3DRMVisual)
['{eb16cb09-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMTexture methods
*)
function InitFromFile (filename: PAnsiChar) : HResult; stdcall;
function InitFromSurface (lpDDS: IDirectDrawSurface) : HResult; stdcall;
function InitFromResource (rs: HRSRC) : HResult; stdcall;
function Changed (bPixels, bPalette: BOOL) : HResult; stdcall;
function SetColors (ulColors: DWORD) : HResult; stdcall;
function SetShades (ulShades: DWORD) : HResult; stdcall;
function SetDecalSize (rvWidth, rvHeight: TD3DValue) : HResult; stdcall;
function SetDecalOrigin (lX, lY: LongInt) : HResult; stdcall;
function SetDecalScale (dwScale: DWORD) : HResult; stdcall;
function SetDecalTransparency (bTransp: BOOL) : HResult; stdcall;
function SetDecalTransparentColor (rcTransp: TD3DColor) : HResult; stdcall;
function GetDecalSize (out lprvWidth, lprvHeight: TD3DValue) : HResult; stdcall;
function GetDecalOrigin (out lplX, lplY: LongInt) : HResult; stdcall;
IDirect3DRMTexture = interface(IDirect3DRMVisual)
['{EB16CB09-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMTexture methods
function InitFromFile(filename: PChar): HResult; stdcall;
function InitFromSurface(lpDDS: IDirectDrawSurface): HResult; stdcall;
function InitFromResource(rs: HRSRC): HResult; stdcall;
function Changed(bPixels, bPalette: BOOL): HResult; stdcall;
function SetColors(ulColors: DWORD): HResult; stdcall;
function SetShades(ulShades: DWORD): HResult; stdcall;
function SetDecalSize(rvWidth, rvHeight: TD3DValue): HResult; stdcall;
function SetDecalOrigin(lX, lY: Longint): HResult; stdcall;
function SetDecalScale(dwScale: DWORD): HResult; stdcall;
function SetDecalTransparency(bTransp: BOOL): HResult; stdcall;
function SetDecalTransparentColor(rcTransp: TD3DColor): HResult; stdcall;
function GetDecalSize(var lprvWidth, lprvHeight: TD3DValue): HResult; stdcall;
function GetDecalOrigin(var lplX, lplY: Longint): HResult; stdcall;
function GetImage: PD3DRMImage; stdcall;
function GetShades: DWORD; stdcall;
function GetColors: DWORD; stdcall;
10927,133 → 7293,113
function GetDecalTransparentColor: TD3DColor; stdcall;
end;
 
IDirect3DRMTexture2 = interface (IDirect3DRMTexture)
['{120f30c0-1629-11d0-941c-0080c80cfa7b}']
(*
* IDirect3DRMTexture2 methods
*)
function InitFromImage (const lpImage: TD3DRMImage) : HResult; stdcall;
function InitFromResource2 (hModule: HModule;
strName, strType: PAnsiChar) : HResult; stdcall;
function GenerateMIPMap (dwFlags: DWORD) : HResult; stdcall;
IDirect3DRMTexture2 = interface(IDirect3DRMTexture)
['{120F30C0-1629-11D0-941C-0080C80CFA7B}']
// IDirect3DRMTexture2 methods
function InitFromImage(const lpImage: TD3DRMImage): HResult; stdcall;
function InitFromResource2(hModule: HModule; strName, strType: PChar): HResult; stdcall;
function GenerateMIPMap(dwFlags: DWORD): HResult; stdcall;
end;
 
IDirect3DRMTexture3 = interface (IDirect3DRMTexture2)
['{ff6b7f73-a40e-11d1-91f9-0000f8758e66}']
(*
* IDirect3DRMTexture3 methods
*)
function GetSurface
(dwFlags: DWORD; out lplpDDS: IDirectDrawSurface) : HResult; stdcall;
function SetCacheOptions (lImportance: integer; dwFlags: DWORD) : HResult; stdcall;
function GetCacheOptions (var lplImportance: integer; var lpdwFlags: DWORD) : HResult; stdcall;
function SetDownsampleCallback (
pCallback: TD3DRMDownSampleCallback; pArg: pointer) : HResult; stdcall;
function SetValidationCallback (
pCallback: TD3DRMValidationCallback; pArg: pointer) : HResult; stdcall;
IDirect3DRMTexture3 = interface(IDirect3DRMTexture2)
['{FF6B7F73-A40E-11D1-91F9-0000F8758E66}']
// IDirect3DRMTexture3 methods
function GetSurface(dwFlags: DWORD; out lplpDDS: IDirectDrawSurface): HResult; stdcall;
function SetCacheOptions(lImportance: Longint; dwFlags: DWORD): HResult; stdcall;
function GetCacheOptions(var lplImportance: Longint; var lpdwFlags: DWORD): HResult; stdcall;
function SetDownsampleCallback(pCallback: TD3DRMDownSampleCallback; pArg: Pointer): HResult; stdcall;
function SetValidationCallback(pCallback: TD3DRMValidationCallback; pArg: Pointer): HResult; stdcall;
end;
 
IDirect3DRMWrap = interface (IDirect3DRMObject)
['{eb16cb0a-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMWrap methods
*)
function Init (d3drmwt: TD3DRMWrapType; lpd3drmfRef: IDirect3DRMFrame;
ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv: TD3DValue)
: HResult; stdcall;
function Apply (lpObject: IDirect3DRMObject) : HResult; stdcall;
function ApplyRelative(frame: IDirect3DRMFrame; mesh: IDirect3DRMObject) : HResult; stdcall;
IDirect3DRMWrap = interface(IDirect3DRMObject)
['{EB16CB0A-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMWrap methods
function Init(d3drmwt: TD3DRMWrapType; lpd3drmfRef: IDirect3DRMFrame;
ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv: TD3DValue): HResult; stdcall;
function Apply(lpObject: IDirect3DRMObject): HResult; stdcall;
function ApplyRelative(frame: IDirect3DRMFrame; mesh: IDirect3DRMObject): HResult; stdcall;
end;
 
IDirect3DRMMaterial = interface (IDirect3DRMObject)
['{eb16cb0b-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMMaterial methods
*)
function SetPower (rvPower: TD3DValue) : HResult; stdcall;
function SetSpecular (r, g, b: TD3DValue) : HResult; stdcall;
function SetEmissive (r, g, b: TD3DValue) : HResult; stdcall;
IDirect3DRMMaterial = interface(IDirect3DRMObject)
['{EB16CB0B-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMMaterial methods
function SetPower(rvPower: TD3DValue): HResult; stdcall;
function SetSpecular(r, g, b: TD3DValue): HResult; stdcall;
function SetEmissive(r, g, b: TD3DValue): HResult; stdcall;
function GetPower: TD3DValue; stdcall;
function GetSpecular (out lpr, lpg, lpb: TD3DValue) : HResult; stdcall;
function GetEmissive (out lpr, lpg, lpb: TD3DValue) : HResult; stdcall;
function GetSpecular(var r, g, b: TD3DValue): HResult; stdcall;
function GetEmissive(var r, g, b: TD3DValue): HResult; stdcall;
end;
 
IDirect3DRMMaterial2 = interface (IDirect3DRMMaterial)
['{ff6b7f75-a40e-11d1-91f9-0000f8758e66}']
(*
* IDirect3DRMMaterial2 methods
*)
function GetAmbient(out r,g,b: TD3DValue) : HResult; stdcall;
function SetAmbient(r,g,b: TD3DValue) : HResult; stdcall;
IDirect3DRMMaterial2 = interface(IDirect3DRMMaterial)
['{FF6B7F75-A40E-11D1-91F9-0000F8758E66}']
// IDirect3DRMMaterial2 methods
function GetAmbient(var r, g, b: TD3DValue): HResult; stdcall;
function SetAmbient(r, g, b: TD3DValue): HResult; stdcall;
end;
 
IDirect3DRMAnimation = interface (IDirect3DRMObject)
['{eb16cb0d-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMAnimation methods
*)
function SetOptions (d3drmanimFlags: TD3DRMAnimationOptions) : HResult; stdcall;
function AddRotateKey (rvTime: TD3DValue; const rqQuat: TD3DRMQuaternion) : HResult; stdcall;
function AddPositionKey (rvTime, rvX, rvY, rvZ: TD3DValue) : HResult; stdcall;
function AddScaleKey (time, x, y, z: TD3DValue) : HResult; stdcall;
function DeleteKey (time: TD3DValue) : HResult; stdcall;
function SetFrame (lpD3DRMFrame: IDirect3DRMFrame) : HResult; stdcall;
function SetTime (rvTime: TD3DValue) : HResult; stdcall;
IDirect3DRMAnimation = interface(IDirect3DRMObject)
['{EB16CB0D-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMAnimation methods
function SetOptions(d3drmanimFlags: TD3DRMAnimationOptions): HResult; stdcall;
function AddRotateKey(rvTime: TD3DValue; const rqQuat: TD3DRMQuaternion): HResult; stdcall;
function AddPositionKey(rvTime, rvX, rvY, rvZ: TD3DValue): HResult; stdcall;
function AddScaleKey(time, x, y, z: TD3DValue): HResult; stdcall;
function DeleteKey(time: TD3DValue): HResult; stdcall;
function SetFrame(lpD3DRMFrame: IDirect3DRMFrame): HResult; stdcall;
function SetTime(rvTime: TD3DValue): HResult; stdcall;
function GetOptions: TD3DRMAnimationOptions; stdcall;
end;
 
IDirect3DRMAnimation2 = interface (IDirect3DRMAnimation)
['{ff6b7f77-a40e-11d1-91f9-0000f8758e66}']
(*
* IDirect3DRMAnimation methods
*)
function GetFrame (out lpD3DFrame: IDirect3DRMFrame3) : HResult; stdcall;
function DeleteKeyByID (dwID: DWORD) : HResult; stdcall;
function AddKey (const lpKey: TD3DRMAnimationKey) : HResult; stdcall;
function ModifyKey (const lpKey: TD3DRMAnimationKey) : HResult; stdcall;
function GetKeys (dvTimeMin, dvTimeMax: TD3DValue; var lpdwNumKeys: DWORD;
lpKey: PD3DRMAnimationKey) : HResult; stdcall;
IDirect3DRMAnimation2 = interface(IDirect3DRMObject)
['{FF6B7F77-A40E-11D1-91F9-0000F8758E66}']
// IDirect3DRMAnimation2 methods
function SetOptions(d3drmanimFlags: TD3DRMAnimationOptions): HResult; stdcall;
function AddRotateKey(rvTime: TD3DValue; const rqQuat: TD3DRMQuaternion): HResult; stdcall;
function AddPositionKey(rvTime, rvX, rvY, rvZ: TD3DValue): HResult; stdcall;
function AddScaleKey(time, x, y, z: TD3DValue): HResult; stdcall;
function DeleteKey(time: TD3DValue): HResult; stdcall;
function SetFrame(lpD3DRMFrame: IDirect3DRMFrame3): HResult; stdcall;
function SetTime(rvTime: TD3DValue): HResult; stdcall;
function GetOptions: TD3DRMAnimationOptions; stdcall;
function GetFrame(out lpD3DFrame: IDirect3DRMFrame3): HResult; stdcall;
function DeleteKeyByID(dwID: DWORD): HResult; stdcall;
function AddKey(const lpKey: TD3DRMAnimationKey): HResult; stdcall;
function ModifyKey(const lpKey: TD3DRMAnimationKey): HResult; stdcall;
function GetKeys(dvTimeMin, dvTimeMax: TD3DValue; var lpdwNumKeys: DWORD;
var lpKey: TD3DRMAnimationKey): HResult; stdcall;
end;
 
IDirect3DRMAnimationSet = interface (IDirect3DRMObject)
['{eb16cb0e-d271-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMAnimationSet methods
*)
function AddAnimation (lpD3DRMAnimation: IDirect3DRMAnimation) : HResult; stdcall;
function Load (lpvObjSource, lpvObjID: Pointer;
d3drmLOFlags: TD3DRMLoadOptions;
IDirect3DRMAnimationSet = interface(IDirect3DRMObject)
['{EB16CB0E-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMAnimationSet methods
function AddAnimation(lpD3DRMAnimation: IDirect3DRMAnimation): HResult; stdcall;
function Load(lpvObjSource, lpvObjID: Pointer; d3drmLOFlags: TD3DRMLoadOptions;
d3drmLoadTextureProc: TD3DRMLoadTextureCallback; lpArgLTP: Pointer;
lpParentFrame: IDirect3DRMFrame) : HResult; stdcall;
function DeleteAnimation (lpD3DRMAnimation: IDirect3DRMAnimation) : HResult; stdcall;
function SetTime (rvTime: TD3DValue) : HResult; stdcall;
lpParentFrame: IDirect3DRMFrame): HResult; stdcall;
function DeleteAnimation(lpD3DRMAnimation: IDirect3DRMAnimation): HResult; stdcall;
function SetTime(rvTime: TD3DValue): HResult; stdcall;
end;
 
IDirect3DRMAnimationSet2 = interface (IDirect3DRMObject)
['{ff6b7f79-a40e-11d1-91f9-0000f8758e66}']
(*
* IDirect3DRMAnimationSet methods
*)
function AddAnimation (lpD3DRMAnimation: IDirect3DRMAnimation2) : HResult; stdcall;
function Load (lpvObjSource, lpvObjID: Pointer;
d3drmLOFlags: TD3DRMLoadOptions;
d3drmLoadTextureProc: TD3DRMLoadTexture3Callback; lpArgLTP: Pointer;
lpParentFrame: IDirect3DRMFrame3) : HResult; stdcall;
function DeleteAnimation (lpD3DRMAnimation: IDirect3DRMAnimation2) : HResult; stdcall;
function SetTime (rvTime: TD3DValue) : HResult; stdcall;
function GetAnimations(out lplpArray: IDirect3DRMAnimationArray) : HResult; stdcall;
IDirect3DRMAnimationSet2 = interface(IDirect3DRMObject)
['{FF6B7F79-A40E-11D1-91F9-0000F8758E66}']
// IDirect3DRMAnimationSet2 methods
function AddAnimation(aid: IDirect3DRMAnimation2): HResult; stdcall;
function Load(filename, name: Pointer; loadflags: TD3DRMLoadOptions;
d3drmLoadTextureProc: TD3DRMLoadTexture3Callback; lpArg: Pointer;
lpParentFrame: IDirect3DRMFrame3): HResult; stdcall;
function DeleteAnimation(aid: IDirect3DRMAnimation2): HResult; stdcall;
function SetTime(time: TD3DValue): HResult; stdcall;
function GetAnimations(out lpAnimationArray: IDirect3DRMAnimationArray): HResult; stdcall;
end;
 
IDirect3DRMUserVisual = interface (IDirect3DRMVisual)
['{59163de0-6d43-11cf-ac4a-0000c03825a1}']
(*
* IDirect3DRMUserVisual methods
*)
function Init (d3drmUVProc: TD3DRMUserVisualCallback;
lpArg: Pointer) : HResult; stdcall;
IDirect3DRMUserVisual = interface(IDirect3DRMVisual)
['{59163DE0-6D43-11CF-AC4A-0000C03825A1}']
// IDirect3DRMUserVisual methods
function Init(d3drmUVProc: TD3DRMUserVisualCallback; lpArg: Pointer): HResult; stdcall;
end;
 
IDirect3DRMArray = interface (IUnknown)
IDirect3DRMArray = interface(IUnknown)
function GetSize: DWORD; stdcall;
(* No GetElement method as it would get overloaded
* in derived classes, and overloading is
11061,1155 → 7407,1153
*)
end;
 
IDirect3DRMObjectArray = interface (IDirect3DRMArray)
['{242f6bc2-3849-11d0-9b6d-0000c0781bc3}']
function GetElement (index: DWORD; out lplpD3DRMObject:
IDirect3DRMObject) : HResult; stdcall;
IDirect3DRMObjectarray = interface(IDirect3DRMArray)
function GetElement(index: DWORD; out lplpD3DRMObject: IDirect3DRMObject): HResult; stdcall;
end;
 
IDirect3DRMDeviceArray = interface (IDirect3DRMArray)
['{eb16cb0e-d271-11ce-ac48-0000c03825a1}']
function GetElement (index: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice) : HResult; stdcall;
IDirect3DRMDeviceArray = interface(IDirect3DRMArray)
['{EB16CB10-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMDevicearraymethods
function GetElement(index: DWORD; out lplpD3DRMDevice: IDirect3DRMDevice): HResult; stdcall;
end;
 
IDirect3DRMFrameArray = interface (IDirect3DRMArray)
['{eb16cb12-d271-11ce-ac48-0000c03825a1}']
function GetElement (index: DWORD; out lplpD3DRMFrame: IDirect3DRMFrame) : HResult; stdcall;
IDirect3DRMFrameArray = interface(IDirect3DRMArray)
['{EB16CB12-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMFramearraymethods
function GetElement(index: DWORD; out lplpD3DRMFrame: IDirect3DRMFrame): HResult; stdcall;
end;
 
IDirect3DRMViewportArray = interface (IDirect3DRMArray)
['{eb16cb11-d271-11ce-ac48-0000c03825a1}']
function GetElement (index: DWORD; out lplpD3DRMViewport:
IDirect3DRMViewport) : HResult; stdcall;
IDirect3DRMViewportArray = interface(IDirect3DRMArray)
['{EB16CB11-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMViewportarraymethods
function GetElement(index: DWORD; out lplpD3DRMViewport: IDirect3DRMViewport): HResult; stdcall;
end;
 
IDirect3DRMVisualArray = interface (IDirect3DRMArray)
['{eb16cb13-d271-11ce-ac48-0000c03825a1}']
function GetElement (index: DWORD; out lplpD3DRMVisual:
IDirect3DRMVisual) : HResult; stdcall;
IDirect3DRMVisualArray = interface(IDirect3DRMArray)
['{EB16CB13-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMVisualarraymethods
function GetElement(index: DWORD; out lplpD3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
end;
 
IDirect3DRMAnimationArray = interface (IDirect3DRMArray)
['{d5f1cae0-4bd7-11d1-b974-0060083e45f3}']
function GetElement (index: DWORD; out lplpD3DRMAnimation2:
IDirect3DRMAnimation2) : HResult; stdcall;
IDirect3DRMAnimationArray = interface(IDirect3DRMArray)
['{D5F1CAE0-4BD7-11D1-B974-0060083E45F3}']
function GetElement(index: DWORD; out lplpD3DRMAnimation: IDirect3DRMAnimation2): HResult; stdcall;
end;
 
IDirect3DRMPickedArray = interface (IDirect3DRMArray)
['{eb16cb16-d271-11ce-ac48-0000c03825a1}']
function GetPick (index: DWORD; out lplpVisual: IDirect3DRMVisual;
IDirect3DRMPickedArray = interface(IDirect3DRMArray)
['{EB16CB16-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMPickedarraymethods
function GetPick(index: DWORD; out lplpVisual: IDirect3DRMVisual;
out lplpFrameArray: IDirect3DRMFrameArray;
const lpD3DRMPickDesc: TD3DRMPickDesc) : HResult; stdcall;
 
var lpD3DRMPickDesc: TD3DRMPickDesc): HResult; stdcall;
end;
 
IDirect3DRMLightArray = interface (IDirect3DRMArray)
['{eb16cb14-d271-11ce-ac48-0000c03825a1}']
function GetElement (index: DWORD; out lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
IDirect3DRMLightArray = interface(IDirect3DRMArray)
['{EB16CB14-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMLightarraymethods
function GetElement(index: DWORD; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
end;
 
 
IDirect3DRMFaceArray = interface (IDirect3DRMArray)
['{eb16cb17-d271-11ce-ac48-0000c03825a1}']
function GetElement (index: DWORD; out lplpD3DRMFace: IDirect3DRMFace) : HResult; stdcall;
IDirect3DRMFaceArray = interface(IDirect3DRMArray)
['{EB16CB17-D271-11CE-AC48-0000C03825A1}']
// IDirect3DRMFacearraymethods
function GetElement(index: DWORD; out lplpD3DRMFace: IDirect3DRMFace): HResult; stdcall;
end;
 
IDirect3DRMPicked2Array = interface (IDirect3DRMArray)
['{4516ec7b-8f20-11d0-9b6d-0000c0781bc3}']
function GetPick (index: DWORD; out lplpVisual: IDirect3DRMVisual;
out lplpFrameArray: IDirect3DRMFrameArray; const lpD3DRMPickDesc2:
TD3DRMPickDesc2) : HResult; stdcall;
IDirect3DRMPicked2Array = interface(IDirect3DRMArray)
['{4516EC7B-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMPicked2arraymethods
function GetPick(index: DWORD; out lplpVisual: IDirect3DRMVisual;
out lplpFrameArray: IDirect3DRMFrameArray;
const lpD3DRMPickDesc2: D3DRMPICKDESC2): HResult; stdcall;
end;
 
IDirect3DRMInterpolator = interface (IDirect3DRMObject)
['{242f6bc1-3849-11d0-9b6d-0000c0781bc3}']
(*
* IDirect3DRMInterpolator methods
*)
function AttachObject (lpD3DRMObject: IDirect3DRMObject) : HResult; stdcall;
function GetAttachedObjects
(lpD3DRMObjectArray: IDirect3DRMObjectArray) : HResult; stdcall;
function DetachObject (lpD3DRMObject: IDirect3DRMObject) : HResult; stdcall;
function SetIndex (d3dVal: TD3DValue) : HResult; stdcall;
function GetIndex : TD3DValue; stdcall;
function Interpolate (d3dVal: TD3DValue; lpD3DRMObject: IDirect3DRMObject;
d3drmInterpFlags: TD3DRMInterpolationOptions) : HResult; stdcall;
IDirect3DRMInterpolator = interface(IDirect3DRMObject)
['{242F6BC1-3849-11D0-9B6D-0000C0781BC3}']
// IDirect3DRMInterpolator methods
function AttachObject(lpD3DRMObject: IDirect3DRMObject): HResult; stdcall;
function GetAttachedObjects(lpD3DRMObjectArray: IDirect3DRMObjectArray): HResult; stdcall;
function DetachObject(lpD3DRMObject: IDirect3DRMObject): HResult; stdcall;
function SetIndex(d3dVal: TD3DValue): HResult; stdcall;
function GetIndex: TD3DValue; stdcall;
function Interpolate(d3dVal: TD3DValue; lpD3DRMObject: IDirect3DRMObject;
d3drmInterpFlags: TD3DRMInterpolationOptions): HResult; stdcall;
end;
 
IDirect3DRMClippedVisual = interface (IDirect3DRMObject)
['{5434e733-6d66-11d1-bb0b-0000f875865a}']
(*
* IDirect3DRMClippedVisual methods
*)
function Init (lpD3DRMVisual: IDirect3DRMVisual) : HResult; stdcall;
function AddPlane (lpRef: IDirect3DRMFrame3;
const lpdvPoint, lpdvNormal: TD3DVector;
dwFlags: DWORD; out lpdwReturnID: DWORD) : HResult; stdcall;
function DeletePlane (dwID, dwFlags: DWORD) : HResult; stdcall;
function GetPlaneIDs (var lpdwCount: DWORD; out lpdwID: DWORD; dwFlags: DWORD) : HResult; stdcall;
IDirect3DRMClippedVisual = interface(IDirect3DRMVisual)
['{5434E733-6D66-11D1-BB0B-0000F875865A}']
// IDirect3DRMClippedVisual methods
function Init(lpD3DRMVisual: IDirect3DRMVisual): HResult; stdcall;
function AddPlane(lpRef: IDirect3DRMFrame3; const lpdvPoint, lpdvNormal: TD3DVector;
dwFlags: DWORD; var lpdwReturnID: DWORD): HResult; stdcall;
function DeletePlane(dwID, dwFlags: DWORD): HResult; stdcall;
function GetPlaneIDs(var lpdwCount, lpdwID: DWORD; dwFlags: DWORD): HResult; stdcall;
function GetPlane (dwID: DWORD; lpRef: IDirect3DRMFrame3;
out lpdvPoint, lpdvNormal: TD3DVector; dwFlags: DWORD) : HResult; stdcall;
var lpdvPoint, lpdvNormal: TD3DVector; dwFlags: DWORD): HResult; stdcall;
function SetPlane (dwID: DWORD; lpRef: IDirect3DRMFrame3;
const lpdvPoint, lpdvNormal: TD3DVector; dwFlags: DWORD) : HResult; stdcall;
const lpdvPoint, lpdvNormal: TD3DVector; dwFlags: DWORD): HResult; stdcall;
end;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3drm.h
* Content: Direct3DRM include file
*
***************************************************************************)
IDirect3DRMWinDevice = interface(IDirect3DRMObject)
['{C5016CC0-D273-11CE-AC48-0000C03825A1}']
// IDirect3DRMWinDevice methods
function HandlePaint(hDC: HDC): HResult; stdcall;
function HandleActivate(wparam: WORD): HResult; stdcall;
end;
 
function D3DRMErrorString(Value: HResult) : string;
 
//type
//TRefClsID = TGUID;
 
type
TD3DRMDevicePaletteCallback = procedure (lpDirect3DRMDev: IDirect3DRMDevice;
lpArg: Pointer; dwIndex: DWORD; red, green, blue: LongInt); cdecl;
 
(*
* Direct3DRM Object Class (for CoCreateInstance())
*)
const
CLSID_CDirect3DRM: TGUID =
(D1:$4516ec41;D2:$8f20;D3:$11d0;D4:($9b,$6d,$00,$00,$c0,$78,$1b,$c3));
 
type
IDirect3DRM = interface (IUnknown)
['{2bc49361-8327-11cf-ac4a-0000c03825a1}']
function CreateObject (const rclsid: TRefClsID; pUnkOuter: IUnknown;
const riid: TGUID; out ppv) : HResult; stdcall;
function CreateFrame (lpD3DRMFrame: IDirect3DRMFrame;
var lplpD3DRMFrame: IDirect3DRMFrame) : HResult; stdcall;
function CreateMesh (var lplpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function CreateMeshBuilder (var lplpD3DRMMeshBuilder:
IDirect3DRMMeshBuilder) : HResult; stdcall;
function CreateFace (var lplpd3drmFace: IDirect3DRMFace) : HResult; stdcall;
function CreateAnimation (var lplpD3DRMAnimation: IDirect3DRMAnimation) : HResult; stdcall;
function CreateAnimationSet (var lplpD3DRMAnimationSet:
IDirect3DRMAnimationSet) : HResult; stdcall;
function CreateTexture (var lpImage: TD3DRMImage;
var lplpD3DRMTexture: IDirect3DRMTexture) : HResult; stdcall;
function CreateLight (d3drmltLightType: TD3DRMLightType;
cColor: TD3DColor; var lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function CreateLightRGB (ltLightType: TD3DRMLightType; vRed,
vGreen, vBlue: TD3DValue; var lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function CreateMaterial (vPower: TD3DValue; var lplpD3DRMMaterial:
IDirect3DRMMaterial) : HResult; stdcall;
function CreateDevice (dwWidth, dwHeight: DWORD; var lplpD3DRMDevice:
IDirect3DRMDevice) : HResult; stdcall;
 
(* Create a Windows Device using DirectDraw surfaces *)
function CreateDeviceFromSurface (lpGUID: PGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface; var lplpD3DRMDevice: IDirect3DRMDevice) :
HResult; stdcall;
 
(* Create a Windows Device using D3D objects *)
function CreateDeviceFromD3D (lpD3D: IDirect3D; lpD3DDev: IDirect3DDevice;
var lplpD3DRMDevice: IDirect3DRMDevice) : HResult; stdcall;
 
function CreateDeviceFromClipper (lpDDClipper: IDirectDrawClipper;
lpGUID: PGUID; width, height: Integer; var lplpD3DRMDevice:
IDirect3DRMDevice) : HResult; stdcall;
 
function CreateTextureFromSurface ( lpDDS: IDirectDrawSurface;
var lplpD3DRMTexture: IDirect3DRMTexture) : HResult; stdcall;
 
function CreateShadow (lpVisual: IDirect3DRMVisual;
IDirect3DRM = interface(IUnknown)
['{2BC49361-8327-11CF-AC4A-0000C03825A1}']
// IDirect3DRM methods
function CreateObject(const rclsid: TGUID; pUnkOuter: IUnknown;
const riid: TGUID; out ppv): HResult; stdcall;
function CreateFrame(lpD3DRMFrame: IDirect3DRMFrame;
out lplpD3DRMFrame: IDirect3DRMFrame): HResult; stdcall;
function CreateMesh(out lplpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function CreateMeshBuilder(out lplpD3DRMMeshBuilder:
IDirect3DRMMeshBuilder): HResult; stdcall;
function CreateFace(out lplpd3drmFace: IDirect3DRMFace): HResult; stdcall;
function CreateAnimation(out lplpD3DRMAnimation: IDirect3DRMAnimation): HResult; stdcall;
function CreateAnimationSet(out lplpD3DRMAnimationSet:
IDirect3DRMAnimationSet): HResult; stdcall;
function CreateTexture(const lpImage: TD3DRMImage;
out lplpD3DRMTexture: IDirect3DRMTexture): HResult; stdcall;
function CreateLight(d3drmltLightType: TD3DRMLightType;
cColor: TD3DColor; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function CreateLightRGB(ltLightType: TD3DRMLightType; vRed, vGreen, vBlue:
TD3DValue; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function CreateMaterial(vPower: TD3DValue; out lplpD3DRMMaterial:
IDirect3DRMMaterial): HResult; stdcall;
function CreateDevice(dwWidth, dwHeight: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice): HResult; stdcall;
function CreateDeviceFromSurface(const lpGUID: TGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface; out lplpD3DRMDevice: IDirect3DRMDevice): HResult; stdcall;
function CreateDeviceFromD3D(lpD3D: IDirect3D; lpD3DDev: IDirect3DDevice;
out lplpD3DRMDevice: IDirect3DRMDevice): HResult; stdcall;
function CreateDeviceFromClipper(lpDDClipper: IDirectDrawClipper;
const lpGUID: TGUID; width, height: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice): HResult; stdcall;
function CreateTextureFromSurface(lpDDS: IDirectDrawSurface;
out lplpD3DRMTexture: IDirect3DRMTexture): HResult; stdcall;
function CreateShadow(lpVisual: IDirect3DRMVisual;
lpLight: IDirect3DRMLight; px, py, pz, nx, ny, nz: TD3DValue;
var lplpShadow: IDirect3DRMVisual) : HResult; stdcall;
function CreateViewport (lpDev: IDirect3DRMDevice;
out lplpShadow: IDirect3DRMVisual): HResult; stdcall;
function CreateViewport(lpDev: IDirect3DRMDevice;
lpCamera: IDirect3DRMFrame; dwXPos, dwYPos, dwWidth, dwHeight: DWORD;
var lplpD3DRMViewport: IDirect3DRMViewport) : HResult; stdcall;
function CreateWrap (wraptype: TD3DRMWrapType; lpRef: IDirect3DRMFrame;
out lplpD3DRMViewport: IDirect3DRMViewport): HResult; stdcall;
function CreateWrap(wraptype: TD3DRMWrapType; lpRef: IDirect3DRMFrame;
ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv: TD3DValue;
var lplpD3DRMWrap: IDirect3DRMWrap) : HResult; stdcall;
function CreateUserVisual (fn: TD3DRMUserVisualCallback; lpArg: Pointer;
var lplpD3DRMUV: IDirect3DRMUserVisual) : HResult; stdcall;
function LoadTexture (lpFileName: PAnsiChar; var lplpD3DRMTexture:
IDirect3DRMTexture) : HResult; stdcall;
function LoadTextureFromResource (rs: HRSRC; var lplpD3DRMTexture:
IDirect3DRMTexture) : HResult; stdcall;
 
function SetSearchPath (lpPath: PAnsiChar) : HResult; stdcall;
function AddSearchPath (lpPath: PAnsiChar) : HResult; stdcall;
function GetSearchPath (var lpdwSize: DWORD; lpszPath: PAnsiChar) : HResult; stdcall;
function SetDefaultTextureColors (dwColors: DWORD) : HResult; stdcall;
function SetDefaultTextureShades (dwShades: DWORD) : HResult; stdcall;
 
function GetDevices (var lplpDevArray: IDirect3DRMDeviceArray) : HResult; stdcall;
function GetNamedObject (lpName: PAnsiChar; var lplpD3DRMObject: IDirect3DRMObject) : HResult; stdcall;
 
function EnumerateObjects (func: TD3DRMObjectCallback; lpArg: Pointer) : HResult; stdcall;
 
function Load (lpvObjSource, lpvObjID: Pointer; var lplpGUIDs: PGUID;
out lplpD3DRMWrap: IDirect3DRMWrap): HResult; stdcall;
function CreateUserVisual(fn: TD3DRMUserVisualCallback; lpArg: Pointer;
out lplpD3DRMUV: IDirect3DRMUserVisual): HResult; stdcall;
function LoadTexture(lpFileName: LPSTR; out lplpD3DRMTexture:
IDirect3DRMTexture): HResult; stdcall;
function LoadTextureFromResource(rs: HRSRC; out lplpD3DRMTexture:
IDirect3DRMTexture): HResult; stdcall;
function SetSearchPath(lpPath: LPSTR): HResult; stdcall;
function AddSearchPath(lpPath: LPSTR): HResult; stdcall;
function GetSearchPath(var lpdwSize: DWORD; lpszPath: LPSTR): HResult; stdcall;
function SetDefaultTextureColors(dwColors: DWORD): HResult; stdcall;
function SetDefaultTextureShades(dwShades: DWORD): HResult; stdcall;
function GetDevices(out lplpDevArray: IDirect3DRMDeviceArray): HResult; stdcall;
function GetNamedObject(lpName: LPSTR; out lplpD3DRMObject:
IDirect3DRMObject): HResult; stdcall;
function EnumerateObjects(func: TD3DRMObjectCallback; lpArg: Pointer): HResult; stdcall;
function Load(lpvObjSource, lpvObjID: Pointer; var lplpGUIDs: PGUID;
dwcGUIDs: DWORD; d3drmLOFlags: TD3DRMLoadOptions; d3drmLoadProc:
TD3DRMLoadCallback; lpArgLP: Pointer; d3drmLoadTextureProc:
TD3DRMLoadTextureCallback; lpArgLTP: Pointer; lpParentFrame:
IDirect3DRMFrame) : HResult; stdcall;
function Tick (d3dvalTick: TD3DValue) : HResult; stdcall;
D3DRMLOADCALLBACK; lpArgLP: Pointer; d3drmLoadTextureProc:
TD3DRMLoadTextureCallback; lpArgLTP: Pointer;
lpParentFrame: IDirect3DRMFrame): HResult; stdcall;
function Tick(d3dvalTick: TD3DValue): HResult; stdcall;
end;
 
// Moved from D3DRMObj, to avoid circular unit reference:
 
IDirect3DRMObject2 = interface (IUnknown)
['{4516ec7c-8f20-11d0-9b6d-0000c0781bc3}']
(*
* IDirect3DRMObject2 methods
*)
function AddDestroyCallback (lpCallback: TD3DRMObjectCallback;
lpArg: Pointer) : HResult; stdcall;
function Clone (pUnkOuter: IUnknown; const riid: TGUID;
out ppvObj) : HResult; stdcall;
function DeleteDestroyCallback (d3drmObjProc: TD3DRMObjectCallback;
lpArg: Pointer) : HResult; stdcall;
function GetClientData (dwID: DWORD; out lplpvData: Pointer) : HResult; stdcall;
function GetDirect3DRM (out lplpDirect3DRM: IDirect3DRM) : HResult; stdcall;
function GetName (var lpdwSize: DWORD; lpName: PAnsiChar) : HResult; stdcall;
function SetClientData (dwID: DWORD; lpvData: pointer; dwFlags: DWORD) : HResult; stdcall;
function SetName (lpName: PAnsiChar) : HResult; stdcall;
function GetAge (dwFlags: DWORD; out pdwAge: DWORD) : HResult; stdcall;
end;
 
IID_IDirect3DRMObject2 = IDirect3DRMObject2;
 
IDirect3DRM2 = interface (IUnknown)
['{4516ecc8-8f20-11d0-9b6d-0000c0781bc3}']
function CreateObject (const rclsid: TRefClsID; pUnkOuter: IUnknown;
const riid: TGUID; out ppv) : HResult; stdcall;
function CreateFrame (lpD3DRMFrame: IDirect3DRMFrame2;
var lplpD3DRMFrame: IDirect3DRMFrame2) : HResult; stdcall;
function CreateMesh (var lplpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function CreateMeshBuilder (var lplpD3DRMMeshBuilder:
IDirect3DRMMeshBuilder2) : HResult; stdcall;
function CreateFace (var lplpd3drmFace: IDirect3DRMFace) : HResult; stdcall;
function CreateAnimation (var lplpD3DRMAnimation: IDirect3DRMAnimation) : HResult; stdcall;
function CreateAnimationSet (var lplpD3DRMAnimationSet:
IDirect3DRMAnimationSet) : HResult; stdcall;
function CreateTexture (var lpImage: TD3DRMImage;
var lplpD3DRMTexture: IDirect3DRMTexture2) : HResult; stdcall;
function CreateLight (d3drmltLightType: TD3DRMLightType;
cColor: TD3DColor; var lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function CreateLightRGB (ltLightType: TD3DRMLightType; vRed,
vGreen, vBlue: TD3DValue; var lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function CreateMaterial (vPower: TD3DValue; var lplpD3DRMMaterial:
IDirect3DRMMaterial) : HResult; stdcall;
function CreateDevice (dwWidth, dwHeight: DWORD; var lplpD3DRMDevice:
IDirect3DRMDevice2) : HResult; stdcall;
 
(* Create a Windows Device using DirectDraw surfaces *)
function CreateDeviceFromSurface (lpGUID: PGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface; var lplpD3DRMDevice: IDirect3DRMDevice2) :
HResult; stdcall;
 
(* Create a Windows Device using D3D objects *)
function CreateDeviceFromD3D (lpD3D: IDirect3D2; lpD3DDev: IDirect3DDevice2;
var lplpD3DRMDevice: IDirect3DRMDevice2) : HResult; stdcall;
 
function CreateDeviceFromClipper (lpDDClipper: IDirectDrawClipper;
lpGUID: PGUID; width, height: Integer; var lplpD3DRMDevice:
IDirect3DRMDevice2) : HResult; stdcall;
 
function CreateTextureFromSurface ( lpDDS: IDirectDrawSurface;
var lplpD3DRMTexture: IDirect3DRMTexture2) : HResult; stdcall;
 
function CreateShadow (lpVisual: IDirect3DRMVisual;
IDirect3DRM2 = interface(IUnknown)
['{4516ECC8-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRM2 methods
function CreateObject(const rclsid: TGUID; pUnkOuter: IUnknown;
const riid: TGUID; out ppv): HResult; stdcall;
function CreateFrame(lpD3DRMFrame: IDirect3DRMFrame2;
out lplpD3DRMFrame: IDirect3DRMFrame2): HResult; stdcall;
function CreateMesh(out lplpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function CreateMeshBuilder(out lplpD3DRMMeshBuilder:
IDirect3DRMMeshBuilder2): HResult; stdcall;
function CreateFace(out lplpd3drmFace: IDirect3DRMFace): HResult; stdcall;
function CreateAnimation(out lplpD3DRMAnimation: IDirect3DRMAnimation): HResult; stdcall;
function CreateAnimationSet(out lplpD3DRMAnimationSet:
IDirect3DRMAnimationSet): HResult; stdcall;
function CreateTexture(const lpImage: TD3DRMImage;
out lplpD3DRMTexture: IDirect3DRMTexture2): HResult; stdcall;
function CreateLight(d3drmltLightType: TD3DRMLightType;
cColor: TD3DColor; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function CreateLightRGB(ltLightType: TD3DRMLightType; vRed,
vGreen, vBlue: TD3DValue; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function CreateMaterial(vPower: TD3DValue; out lplpD3DRMMaterial:
IDirect3DRMMaterial): HResult; stdcall;
function CreateDevice(dwWidth, dwHeight: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice2): HResult; stdcall;
function CreateDeviceFromSurface(const lpGUID: TGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface; out lplpD3DRMDevice: IDirect3DRMDevice2): HResult; stdcall;
function CreateDeviceFromD3D(lpD3D: IDirect3D2; lpD3DDev: IDirect3DDevice2;
out lplpD3DRMDevice: IDirect3DRMDevice2): HResult; stdcall;
function CreateDeviceFromClipper(lpDDClipper: IDirectDrawClipper;
const lpGUID: TGUID; width, height: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice2): HResult; stdcall;
function CreateTextureFromSurface( lpDDS: IDirectDrawSurface;
out lplpD3DRMTexture: IDirect3DRMTexture2): HResult; stdcall;
function CreateShadow(lpVisual: IDirect3DRMVisual;
lpLight: IDirect3DRMLight; px, py, pz, nx, ny, nz: TD3DValue;
var lplpShadow: IDirect3DRMVisual) : HResult; stdcall;
function CreateViewport (lpDev: IDirect3DRMDevice;
out lplpShadow: IDirect3DRMVisual): HResult; stdcall;
function CreateViewport(lpDev: IDirect3DRMDevice;
lpCamera: IDirect3DRMFrame; dwXPos, dwYPos, dwWidth, dwHeight: DWORD;
var lplpD3DRMViewport: IDirect3DRMViewport) : HResult; stdcall;
function CreateWrap (wraptype: TD3DRMWrapType; lpRef: IDirect3DRMFrame;
out lplpD3DRMViewport: IDirect3DRMViewport): HResult; stdcall;
function CreateWrap(wraptype: TD3DRMWrapType; lpRef: IDirect3DRMFrame;
ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv: TD3DValue;
var lplpD3DRMWrap: IDirect3DRMWrap) : HResult; stdcall;
function CreateUserVisual (fn: TD3DRMUserVisualCallback; lpArg: Pointer;
var lplpD3DRMUV: IDirect3DRMUserVisual) : HResult; stdcall;
function LoadTexture (lpFileName: PAnsiChar; var lplpD3DRMTexture:
IDirect3DRMTexture2) : HResult; stdcall;
function LoadTextureFromResource (rs: HRSRC; var lplpD3DRMTexture:
IDirect3DRMTexture2) : HResult; stdcall;
 
function SetSearchPath (lpPath: PAnsiChar) : HResult; stdcall;
function AddSearchPath (lpPath: PAnsiChar) : HResult; stdcall;
function GetSearchPath (var lpdwSize: DWORD; lpszPath: PAnsiChar) : HResult; stdcall;
function SetDefaultTextureColors (dwColors: DWORD) : HResult; stdcall;
function SetDefaultTextureShades (dwShades: DWORD) : HResult; stdcall;
 
function GetDevices (var lplpDevArray: IDirect3DRMDeviceArray) : HResult; stdcall;
function GetNamedObject (lpName: PAnsiChar; var lplpD3DRMObject:
IDirect3DRMObject) : HResult; stdcall;
 
function EnumerateObjects (func: TD3DRMObjectCallback; lpArg: Pointer) : HResult; stdcall;
 
function Load (lpvObjSource, lpvObjID: Pointer; var lplpGUIDs: PGUID;
out lplpD3DRMWrap: IDirect3DRMWrap): HResult; stdcall;
function CreateUserVisual(fn: TD3DRMUserVisualCallback; lpArg: Pointer;
out lplpD3DRMUV: IDirect3DRMUserVisual): HResult; stdcall;
function LoadTexture(lpFileName: LPSTR; out lplpD3DRMTexture:
IDirect3DRMTexture2): HResult; stdcall;
function LoadTextureFromResource(hModule: HModule; str: LPCSTR; out lplpD3DRMTexture:
IDirect3DRMTexture2): HResult; stdcall;
function SetSearchPath(lpPath: LPSTR): HResult; stdcall;
function AddSearchPath(lpPath: LPSTR): HResult; stdcall;
function GetSearchPath(var lpdwSize: DWORD; lpszPath: LPSTR): HResult; stdcall;
function SetDefaultTextureColors(dwColors: DWORD): HResult; stdcall;
function SetDefaultTextureShades(dwShades: DWORD): HResult; stdcall;
function GetDevices(out lplpDevArray: IDirect3DRMDeviceArray): HResult; stdcall;
function GetNamedObject(lpName: LPSTR; out lplpD3DRMObject:
IDirect3DRMObject): HResult; stdcall;
function EnumerateObjects(func: TD3DRMObjectCallback; lpArg: Pointer): HResult; stdcall;
function Load(lpvObjSource, lpvObjID: Pointer; var lplpGUIDs: PGUID;
dwcGUIDs: DWORD; d3drmLOFlags: TD3DRMLoadOptions; d3drmLoadProc:
TD3DRMLoadCallback; lpArgLP: Pointer; d3drmLoadTextureProc:
D3DRMLOADCALLBACK; lpArgLP: Pointer; d3drmLoadTextureProc:
TD3DRMLoadTextureCallback; lpArgLTP: Pointer; lpParentFrame:
IDirect3DRMFrame) : HResult; stdcall;
function Tick (d3dvalTick: TD3DValue) : HResult; stdcall;
function CreateProgressiveMesh (var lplpD3DRMProgressiveMesh:
IDirect3DRMProgressiveMesh) : HResult; stdcall;
IDirect3DRMFrame): HResult; stdcall;
function Tick(d3dvalTick: TD3DValue): HResult; stdcall;
function CreateProgressiveMesh(out lplpD3DRMProgressiveMesh:
IDirect3DRMProgressiveMesh): HResult; stdcall;
end;
 
IDirect3DRM3 = interface (IUnknown)
['{4516ec83-8f20-11d0-9b6d-0000c0781bc3}']
function CreateObject (const rclsid: TRefClsID; pUnkOuter: IUnknown;
const riid: TGUID; out ppv) : HResult; stdcall;
function CreateFrame (lpD3DRMFrame: IDirect3DRMFrame3;
out lplpD3DRMFrame: IDirect3DRMFrame3) : HResult; stdcall;
function CreateMesh (out lplpD3DRMMesh: IDirect3DRMMesh) : HResult; stdcall;
function CreateMeshBuilder (out lplpD3DRMMeshBuilder:
IDirect3DRMMeshBuilder3) : HResult; stdcall;
function CreateFace (out lplpd3drmFace: IDirect3DRMFace2) : HResult; stdcall;
function CreateAnimation (out lplpD3DRMAnimation: IDirect3DRMAnimation2) : HResult; stdcall;
function CreateAnimationSet (out lplpD3DRMAnimationSet:
IDirect3DRMAnimationSet2) : HResult; stdcall;
function CreateTexture (const lpImage: TD3DRMImage;
out lplpD3DRMTexture: IDirect3DRMTexture3) : HResult; stdcall;
function CreateLight (d3drmltLightType: TD3DRMLightType;
cColor: TD3DColor; out lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function CreateLightRGB (ltLightType: TD3DRMLightType; vRed,
vGreen, vBlue: TD3DValue; out lplpD3DRMLight: IDirect3DRMLight) : HResult; stdcall;
function CreateMaterial (vPower: TD3DValue; out lplpD3DRMMaterial:
IDirect3DRMMaterial2) : HResult; stdcall;
function CreateDevice (dwWidth, dwHeight: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice3) : HResult; stdcall;
 
(* Create a Windows Device using DirectDraw surfaces *)
function CreateDeviceFromSurface (lpGUID: PGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface; dwFlags: DWORD;
out lplpD3DRMDevice: IDirect3DRMDevice3) : HResult; stdcall;
 
(* Create a Windows Device using D3D objects *)
function CreateDeviceFromD3D (lpD3D: IDirect3D2; lpD3DDev: IDirect3DDevice2;
out lplpD3DRMDevice: IDirect3DRMDevice3) : HResult; stdcall;
 
function CreateDeviceFromClipper (lpDDClipper: IDirectDrawClipper;
lpGUID: PGUID; width, height: Integer;
out lplpD3DRMDevice: IDirect3DRMDevice3) : HResult; stdcall;
 
function CreateTextureFromSurface ( lpDDS: IDirectDrawSurface;
out lplpD3DRMTexture: IDirect3DRMTexture3) : HResult; stdcall;
 
function CreateShadow (pUnk: IUnknown; lpLight: IDirect3DRMLight;
px, py, pz, nx, ny, nz: TD3DValue;
out lplpShadow: IDirect3DRMShadow2) : HResult; stdcall;
function CreateViewport (lpDev: IDirect3DRMDevice3;
IDirect3DRM3 = interface(IUnknown)
['{4516EC83-8F20-11D0-9B6D-0000C0781BC3}']
// IDirect3DRM2 methods
function CreateObject(const rclsid: TGUID; pUnkOuter: IUnknown;
const riid: TGUID; out ppv): HResult; stdcall;
function CreateFrame(lpD3DRMFrame: IDirect3DRMFrame3;
out lplpD3DRMFrame: IDirect3DRMFrame3): HResult; stdcall;
function CreateMesh(out lplpD3DRMMesh: IDirect3DRMMesh): HResult; stdcall;
function CreateMeshBuilder(out lplpD3DRMMeshBuilder:
IDirect3DRMMeshBuilder3): HResult; stdcall;
function CreateFace(out lplpd3drmFace: IDirect3DRMFace2): HResult; stdcall;
function CreateAnimation(out lplpD3DRMAnimation: IDirect3DRMAnimation2): HResult; stdcall;
function CreateAnimationSet(out lplpD3DRMAnimationSet:
IDirect3DRMAnimationSet2): HResult; stdcall;
function CreateTexture(const lpImage: TD3DRMImage;
out lplpD3DRMTexture: IDirect3DRMTexture3): HResult; stdcall;
function CreateLight(d3drmltLightType: TD3DRMLightType;
cColor: TD3DColor; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function CreateLightRGB(ltLightType: TD3DRMLightType; vRed,
vGreen, vBlue: TD3DValue; out lplpD3DRMLight: IDirect3DRMLight): HResult; stdcall;
function CreateMaterial(vPower: TD3DValue; out lplpD3DRMMaterial:
IDirect3DRMMaterial2): HResult; stdcall;
function CreateDevice(dwWidth, dwHeight: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice3): HResult; stdcall;
function CreateDeviceFromSurface(const lpGUID: TGUID; lpDD: IDirectDraw;
lpDDSBack: IDirectDrawSurface; out lplpD3DRMDevice: IDirect3DRMDevice3): HResult; stdcall;
function CreateDeviceFromD3D(lpD3D: IDirect3D2; lpD3DDev: IDirect3DDevice2;
out lplpD3DRMDevice: IDirect3DRMDevice3): HResult; stdcall;
function CreateDeviceFromClipper(lpDDClipper: IDirectDrawClipper;
const lpGUID: TGUID; width, height: DWORD; out lplpD3DRMDevice:
IDirect3DRMDevice3): HResult; stdcall;
function CreateTextureFromSurface( lpDDS: IDirectDrawSurface;
out lplpD3DRMTexture: IDirect3DRMTexture3): HResult; stdcall;
function CreateShadow(lpVisual: IDirect3DRMVisual;
lpLight: IDirect3DRMLight; px, py, pz, nx, ny, nz: TD3DValue;
out lplpShadow: IDirect3DRMShadow): HResult; stdcall;
function CreateViewport(lpDev: IDirect3DRMDevice3;
lpCamera: IDirect3DRMFrame3; dwXPos, dwYPos, dwWidth, dwHeight: DWORD;
out lplpD3DRMViewport: IDirect3DRMViewport2) : HResult; stdcall;
function CreateWrap (wraptype: TD3DRMWrapType; lpRef: IDirect3DRMFrame3;
out lplpD3DRMViewport: IDirect3DRMViewport2): HResult; stdcall;
function CreateWrap(wraptype: TD3DRMWrapType; lpRef: IDirect3DRMFrame3;
ox, oy, oz, dx, dy, dz, ux, uy, uz, ou, ov, su, sv: TD3DValue;
out lplpD3DRMWrap: IDirect3DRMWrap) : HResult; stdcall;
function CreateUserVisual (fn: TD3DRMUserVisualCallback; lpArg: Pointer;
out lplpD3DRMUV: IDirect3DRMUserVisual) : HResult; stdcall;
function LoadTexture (lpFileName: PAnsiChar; out lplpD3DRMTexture:
IDirect3DRMTexture3) : HResult; stdcall;
function LoadTextureFromResource (hModule: HMODULE;
strName, strType: PAnsiChar;
out lplpD3DRMTexture: IDirect3DRMTexture3) : HResult; stdcall;
out lplpD3DRMWrap: IDirect3DRMWrap): HResult; stdcall;
function CreateUserVisual(fn: TD3DRMUserVisualCallback; lpArg: Pointer;
out lplpD3DRMUV: IDirect3DRMUserVisual): HResult; stdcall;
function LoadTexture(lpFileName: LPSTR; out lplpD3DRMTexture:
IDirect3DRMTexture3): HResult; stdcall;
function LoadTextureFromResource(hModule: HModule; str: LPCSTR; out lplpD3DRMTexture:
IDirect3DRMTexture3): HResult; stdcall;
 
function SetSearchPath (lpPath: PAnsiChar) : HResult; stdcall;
function AddSearchPath (lpPath: PAnsiChar) : HResult; stdcall;
function GetSearchPath (var lpdwSize: DWORD; lpszPath: PAnsiChar) : HResult; stdcall;
function SetDefaultTextureColors (dwColors: DWORD) : HResult; stdcall;
function SetDefaultTextureShades (dwShades: DWORD) : HResult; stdcall;
 
function GetDevices (out lplpDevArray: IDirect3DRMDeviceArray) : HResult; stdcall;
function GetNamedObject (lpName: PAnsiChar; out lplpD3DRMObject: IDirect3DRMObject) : HResult; stdcall;
 
function EnumerateObjects (func: TD3DRMObjectCallback; lpArg: Pointer) : HResult; stdcall;
 
function Load (lpvObjSource, lpvObjID: Pointer; var lplpGUIDs: PGUID;
function SetSearchPath(lpPath: LPSTR): HResult; stdcall;
function AddSearchPath(lpPath: LPSTR): HResult; stdcall;
function GetSearchPath(var lpdwSize: DWORD; lpszPath: LPSTR): HResult; stdcall;
function SetDefaultTextureColors(dwColors: DWORD): HResult; stdcall;
function SetDefaultTextureShades(dwShades: DWORD): HResult; stdcall;
function GetDevices(out lplpDevArray: IDirect3DRMDeviceArray): HResult; stdcall;
function GetNamedObject(lpName: LPSTR; out lplpD3DRMObject:
IDirect3DRMObject): HResult; stdcall;
function EnumerateObjects(func: TD3DRMObjectCallback; lpArg: Pointer): HResult; stdcall;
function Load(lpvObjSource, lpvObjID: Pointer; var lplpGUIDs: PGUID;
dwcGUIDs: DWORD; d3drmLOFlags: TD3DRMLoadOptions; d3drmLoadProc:
TD3DRMLoadCallback; lpArgLP: Pointer; d3drmLoadTextureProc:
D3DRMLOADCALLBACK; lpArgLP: Pointer; d3drmLoadTextureProc:
TD3DRMLoadTexture3Callback; lpArgLTP: Pointer; lpParentFrame:
IDirect3DRMFrame3) : HResult; stdcall;
function Tick (d3dvalTick: TD3DValue) : HResult; stdcall;
function CreateProgressiveMesh (out lplpD3DRMProgressiveMesh:
IDirect3DRMProgressiveMesh) : HResult; stdcall;
 
(* Used with IDirect3DRMObject2 *)
function RegisterClient (const rguid: TGUID; out lpdwID: DWORD) : HResult; stdcall;
function UnregisterClient (const rguid: TGUID) : HResult; stdcall;
 
function CreateClippedVisual (lpVisual: IDirect3DRMVisual;
lpClippedVisual: IDirect3DRMClippedVisual) : HResult; stdcall;
function SetOptions (dwOptions: DWORD) : HResult; stdcall;
function GetOptions (out lpdwOptions: DWORD) : HResult; stdcall;
IDirect3DRMFrame3): HResult; stdcall;
function Tick(d3dvalTick: TD3DValue): HResult; stdcall;
function CreateProgressiveMesh(out lplpD3DRMProgressiveMesh:
IDirect3DRMProgressiveMesh): HResult; stdcall;
// IDirect3RM3 methods
function RegisterClient(const rguid: TGUID; var lpdwID: DWORD): HResult; stdcall;
function UnregisterClient(const rguid: TGUID): HResult; stdcall;
function CreateClippedVisual(lpVisual: IDirect3DRMVisual;
out lpClippedVisual: IDirect3DRMVisual): HResult; stdcall;
function SetOptions(lpdwOptions: DWORD): HResult; stdcall;
function GetOptions(var lpdwOptions: DWORD): HResult; stdcall;
end;
 
IID_IDirect3DRM = IDirect3DRM;
IID_IDirect3DRM2 = IDirect3DRM2;
IID_IDirect3DRM3 = IDirect3DRM3;
 
const
MAKE_D3RMDHRESULT = HResult($88760000);
D3DRM_OK = HResult(DD_OK);
D3DRMERR_BADOBJECT = HResult($88760000 + 781);
D3DRMERR_BADTYPE = HResult($88760000 + 782);
D3DRMERR_BADALLOC = HResult($88760000 + 783);
D3DRMERR_FACEUSED = HResult($88760000 + 784);
D3DRMERR_NOTFOUND = HResult($88760000 + 785);
D3DRMERR_NOTDONEYET = HResult($88760000 + 786);
D3DRMERR_FILENOTFOUND = HResult($88760000 + 787);
D3DRMERR_BADFILE = HResult($88760000 + 788);
D3DRMERR_BADDEVICE = HResult($88760000 + 789);
D3DRMERR_BADVALUE = HResult($88760000 + 790);
D3DRMERR_BADMAJORVERSION = HResult($88760000 + 791);
D3DRMERR_BADMINORVERSION = HResult($88760000 + 792);
D3DRMERR_UNABLETOEXECUTE = HResult($88760000 + 793);
D3DRMERR_LIBRARYNOTFOUND = HResult($88760000 + 794);
D3DRMERR_INVALIDLIBRARY = HResult($88760000 + 795);
D3DRMERR_PENDING = HResult($88760000 + 796);
D3DRMERR_NOTENOUGHDATA = HResult($88760000 + 797);
D3DRMERR_REQUESTTOOLARGE = HResult($88760000 + 798);
D3DRMERR_REQUESTTOOSMALL = HResult($88760000 + 799);
D3DRMERR_CONNECTIONLOST = HResult($88760000 + 800);
D3DRMERR_LOADABORTED = HResult($88760000 + 801);
D3DRMERR_NOINTERNET = HResult($88760000 + 802);
D3DRMERR_BADCACHEFILE = HResult($88760000 + 803);
D3DRMERR_BOXNOTSET = HResult($88760000 + 804);
D3DRMERR_BADPMDATA = HResult($88760000 + 805);
D3DRMERR_CLIENTNOTREGISTERED = HResult($88760000 + 806);
D3DRMERR_NOTCREATEDFROMDDS = HResult($88760000 + 807);
D3DRMERR_NOSUCHKEY = HResult($88760000 + 808);
D3DRMERR_INCOMPATABLEKEY = HResult($88760000 + 809);
D3DRMERR_ELEMENTINUSE = HResult($88760000 + 810);
D3DRMERR_TEXTUREFORMATNOTFOUND = HResult($88760000 + 811);
D3DRMERR_NOTAGGREGATED = HResult($88760000 + 812);
 
D3DRM_OK = DD_OK;
D3DRMERR_BADOBJECT = MAKE_D3RMDHRESULT + 781;
D3DRMERR_BADTYPE = MAKE_D3RMDHRESULT + 782;
D3DRMERR_BADALLOC = MAKE_D3RMDHRESULT + 783;
D3DRMERR_FACEUSED = MAKE_D3RMDHRESULT + 784;
D3DRMERR_NOTFOUND = MAKE_D3RMDHRESULT + 785;
D3DRMERR_NOTDONEYET = MAKE_D3RMDHRESULT + 786;
D3DRMERR_FILENOTFOUND = MAKE_D3RMDHRESULT + 787;
D3DRMERR_BADFILE = MAKE_D3RMDHRESULT + 788;
D3DRMERR_BADDEVICE = MAKE_D3RMDHRESULT + 789;
D3DRMERR_BADVALUE = MAKE_D3RMDHRESULT + 790;
D3DRMERR_BADMAJORVERSION = MAKE_D3RMDHRESULT + 791;
D3DRMERR_BADMINORVERSION = MAKE_D3RMDHRESULT + 792;
D3DRMERR_UNABLETOEXECUTE = MAKE_D3RMDHRESULT + 793;
D3DRMERR_LIBRARYNOTFOUND = MAKE_D3RMDHRESULT + 794;
D3DRMERR_INVALIDLIBRARY = MAKE_D3RMDHRESULT + 795;
D3DRMERR_PENDING = MAKE_D3RMDHRESULT + 796;
D3DRMERR_NOTENOUGHDATA = MAKE_D3RMDHRESULT + 797;
D3DRMERR_REQUESTTOOLARGE = MAKE_D3RMDHRESULT + 798;
D3DRMERR_REQUESTTOOSMALL = MAKE_D3RMDHRESULT + 799;
D3DRMERR_CONNECTIONLOST = MAKE_D3RMDHRESULT + 800;
D3DRMERR_LOADABORTED = MAKE_D3RMDHRESULT + 801;
D3DRMERR_NOINTERNET = MAKE_D3RMDHRESULT + 802;
D3DRMERR_BADCACHEFILE = MAKE_D3RMDHRESULT + 803;
D3DRMERR_BOXNOTSET = MAKE_D3RMDHRESULT + 804;
D3DRMERR_BADPMDATA = MAKE_D3RMDHRESULT + 805;
D3DRMERR_CLIENTNOTREGISTERED = MAKE_D3RMDHRESULT + 806;
D3DRMERR_NOTCREATEDFROMDDS = MAKE_D3RMDHRESULT + 807;
D3DRMERR_NOSUCHKEY = MAKE_D3RMDHRESULT + 808;
D3DRMERR_INCOMPATABLEKEY = MAKE_D3RMDHRESULT + 809;
D3DRMERR_ELEMENTINUSE = MAKE_D3RMDHRESULT + 810;
D3DRMERR_TEXTUREFORMATNOTFOUND = MAKE_D3RMDHRESULT + 811;
{ Create a Direct3DRM API }
function Direct3DRMCreate(out lplpDirect3DRM: IDirect3DRM): HResult; stdcall;
 
(* Create a Direct3DRM API *)
var
Direct3DRMCreate : function (out lplpDirect3DRM: IDirect3DRM) : HResult; stdcall;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3drmwin.h
* Content: Direct3DRM include file
*
***************************************************************************)
 
type
IDirect3DRMWinDevice = interface (IDirect3DRMObject)
['{c5016cc0-d273-11ce-ac48-0000c03825a1}']
(*
* IDirect3DRMWinDevice methods
*)
 
(* Repaint the window with the last frame which was rendered. *)
function HandlePaint (hDC: HDC) : HResult; stdcall;
 
(* Respond to a WM_ACTIVATE message. *)
function HandleActivate (wparam: WORD) : HResult; stdcall;
end;
 
(*
* GUIDS used by Direct3DRM Windows interface
*)
IID_IDirect3DRMWinDevice = IDirect3DRMWinDevice;
 
(***************************************************************************
*
* Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved.
*
* File: rmxfguid.h
* File: dxfile.h
*
* Content: Defines GUIDs of D3DRM's templates.
* Content: DirectX File public header file
*
***************************************************************************)
const
(* {2B957100-9E9A-11cf-AB39-0020AF71E433} *)
TID_D3DRMInfo: TGUID =
(D1:$2b957100;D2:$9e9a;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
 
(* {3D82AB44-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMMesh: TGUID =
(D1:$3d82ab44;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
{ DirectXFile Object Class Id (for CoCreateInstance()) }
 
(* {3D82AB5E-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMVector: TGUID =
(D1:$3d82ab5e;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
const
CLSID_CDirectXFile: TGUID = '{4516EC43-8F20-11D0-9B6D-0000C0781BC3}';
 
(* {3D82AB5F-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMMeshFace: TGUID =
(D1:$3d82ab5f;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
{ DirectX File Interface GUIDs. }
 
(* {3D82AB4D-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMMaterial: TGUID =
(D1:$3d82ab4d;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
IID_IDirectXFile: TGUID = '{3D82AB40-62DA-11CF-AB39-0020AF71E433}';
IID_IDirectXFileEnumObject: TGUID = '{3D82AB41-62DA-11CF-AB39-0020AF71E433}';
IID_IDirectXFileSaveObject: TGUID = '{3D82AB42-62DA-11CF-AB39-0020AF71E433}';
IID_IDirectXFileObject: TGUID = '{3D82AB43-62DA-11CF-AB39-0020AF71E433}';
IID_IDirectXFileData: TGUID = '{3D82AB44-62DA-11CF-AB39-0020AF71E433}';
IID_IDirectXFileDataReference: TGUID = '{3D82AB45-62DA-11CF-AB39-0020AF71E433}';
IID_IDirectXFileBinary: TGUID = '{3D82AB46-62DA-11CF-AB39-0020AF71E433}';
 
(* {35FF44E1-6C7C-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialArray: TGUID =
(D1:$35ff44e1;D2:$6c7c;D3:$11cf;D4:($8F,$52,$00,$40,$33,$35,$94,$a3));
type
TDXFileFormat = DWORD;
DXFILEFORMAT = TDXFileFormat;
 
(* {3D82AB46-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMFrame: TGUID =
(D1:$3d82ab46;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
const
DXFILEFORMAT_BINARY = 0;
DXFILEFORMAT_TEXT = 1;
DXFILEFORMAT_COMPRESSED = 2;
 
(* {F6F23F41-7686-11cf-8F52-0040333594A3} *)
TID_D3DRMFrameTransformMatrix: TGUID =
(D1:$f6f23f41;D2:$7686;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
type
TDXFileLoadOptions = DWORD;
DXFILELOADOPTIONS = TDXFileLoadOptions;
 
(* {F6F23F42-7686-11cf-8F52-0040333594A3} *)
TID_D3DRMMeshMaterialList: TGUID =
(D1:$f6f23f42;D2:$7686;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
const
DXFILELOAD_FROMFILE = $00;
DXFILELOAD_FROMRESOURCE = $01;
DXFILELOAD_FROMMEMORY = $02;
DXFILELOAD_FROMSTREAM = $04;
DXFILELOAD_FROMURL = $08;
 
(* {F6F23F40-7686-11cf-8F52-0040333594A3} *)
TID_D3DRMMeshTextureCoords: TGUID =
(D1:$f6f23f40;D2:$7686;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
type
PDXFileLoadResource = ^TDXFileLoadResource;
TDXFileLoadResource = record
hModule: HModule;
lpName: PChar;
lpType: PChar;
end;
 
(* {F6F23F43-7686-11cf-8F52-0040333594A3} *)
TID_D3DRMMeshNormals: TGUID =
(D1:$f6f23f43;D2:$7686;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
DXFILELOADRESOURCE = TDXFileLoadResource;
LPDXFILELOADRESOURCE = PDXFileLoadResource;
 
(* {F6F23F44-7686-11cf-8F52-0040333594A3} *)
TID_D3DRMCoords2d: TGUID =
(D1:$f6f23f44;D2:$7686;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
PDXFileLoadMemory = ^TDXFileLoadMemory;
TDXFileLoadMemory = record
lpMemory: Pointer;
dSize: DWORD;
end;
 
(* {F6F23F45-7686-11cf-8F52-0040333594A3} *)
TID_D3DRMMatrix4x4: TGUID =
(D1:$f6f23f45;D2:$7686;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
DXFILELOADMEMORY = TDXFileLoadMemory;
LPDXFILELOADMEMORY = PDXFileLoadMemory;
 
(* {3D82AB4F-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMAnimation: TGUID =
(D1:$3d82ab4f;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
{ DirectX File object types. }
 
(* {3D82AB50-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMAnimationSet: TGUID =
(D1:$3d82ab50;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
type
IDirectXFile = interface;
IDirectXFileEnumObject = interface;
IDirectXFileSaveObject = interface;
IDirectXFileObject = interface;
IDirectXFileData = interface;
IDirectXFileDataReference = interface;
IDirectXFileBinary = interface;
 
(* {10DD46A8-775B-11cf-8F52-0040333594A3} *)
TID_D3DRMAnimationKey: TGUID =
(D1:$10dd46a8;D2:$775b;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
IDirectXFile = interface(IUnknown)
['{3D82AB40-62DA-11CF-AB39-0020AF71E433}']
function CreateEnumObject(pvSource: Pointer; dwLoadOptions: TDXFileLoadOptions;
out ppEnumObj: IDirectXFileEnumObject): HResult; stdcall;
function CreateSaveObject(szFileName: PChar; dwFileFormat: TDXFileFormat;
out ppSaveObj: IDirectXFileSaveObject): HResult; stdcall;
function RegisterTemplates(pvData: Pointer; cbSize: DWORD): HResult; stdcall;
end;
 
(* {10DD46A9-775B-11cf-8F52-0040333594A3} *)
TID_D3DRMFloatKeys: TGUID =
(D1:$10dd46a9;D2:$775b;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
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(szName: PChar; out ppDataObj: IDirectXFileData): HResult; stdcall;
end;
 
(* {01411840-7786-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialAmbientColor: TGUID =
(D1:$01411840;D2:$7786;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
IDirectXFileSaveObject = interface(IUnknown)
['{3D82AB42-62DA-11CF-AB39-0020AF71E433}']
function SaveTemplates(cTemplates: DWORD; var ppguidTemplates: PGUID): HResult; stdcall;
function CreateDataObject(const rguidTemplate: TGUID; szName: PChar;
const pguid: TGUID; cbSize: DWORD; pvData: Pointer;
out ppDataObj: IDirectXFileData): HResult; stdcall;
function SaveData(pDataObj: IDirectXFileData): HResult; stdcall;
end;
 
(* {01411841-7786-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialDiffuseColor: TGUID =
(D1:$01411841;D2:$7786;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
IDirectXFileObject = interface(IUnknown)
['{3D82AB43-62DA-11CF-AB39-0020AF71E433}']
function GetName(pstrNameBuf: PChar; var dwBufLen: DWORD): HResult; stdcall;
function GetId (var pGuidBuf: TGUID): HResult; stdcall;
end;
 
(* {01411842-7786-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialSpecularColor: TGUID =
(D1:$01411842;D2:$7786;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
IDirectXFileData = interface(IDirectXFileObject)
['{3D82AB44-62DA-11CF-AB39-0020AF71E433}']
function GetData(szMember: PChar; var pcbSize: DWORD; var ppvData: Pointer): HResult; stdcall;
function GetType(var ppguid: PGUID): HResult; stdcall;
function GetNextObject(out ppChildObj: IDirectXFileObject): HResult; stdcall;
function AddDataObject(pDataObj: IDirectXFileData): HResult; stdcall;
function AddDataReference(szRef: PChar; pguidRef: PGUID): HResult; stdcall;
function AddBinaryObjec (szName: PChar; pguid: PGUID; szMimeType: PChar;
pvData: Pointer; cbSize: DWORD): HResult; stdcall;
end;
 
(* {D3E16E80-7835-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialEmissiveColor: TGUID =
(D1:$d3e16e80;D2:$7835;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
IDirectXFileDataReference = interface(IDirectXFileObject)
['{3D82AB45-62DA-11CF-AB39-0020AF71E433}']
function Resolve(out ppDataObj: IDirectXFileData): HResult; stdcall;
end;
 
(* {01411843-7786-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialPower: TGUID =
(D1:$01411843;D2:$7786;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
IDirectXFileBinary = interface(IDirectXFileObject)
['{3D82AB46-62DA-11CF-AB39-0020AF71E433}']
function GetSize(var pcbSize: DWORD): HResult; stdcall;
function GetMimeType(var pszMimeType: PChar): HResult; stdcall;
function Read(pvData: Pointer; cbSize: DWORD; var pcbRead: DWORD): HResult; stdcall;
end;
 
(* {35FF44E0-6C7C-11cf-8F52-0040333594A3} *)
TID_D3DRMColorRGBA: TGUID =
(D1:$35ff44e0;D2:$6c7c;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$A3));
{ DirectX File Header template's GUID. }
 
(* {D3E16E81-7835-11cf-8F52-0040333594A3} *)
TID_D3DRMColorRGB: TGUID =
(D1:$d3e16e81;D2:$7835;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
const
TID_DXFILEHeader: TGUID = '{3D82AB43-62DA-11CF-AB39-0020AF71E433}';
 
(* {A42790E0-7810-11cf-8F52-0040333594A3} *)
TID_D3DRMGuid: TGUID =
(D1:$a42790e0;D2:$7810;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
{ DirectX File errors. }
 
(* {A42790E1-7810-11cf-8F52-0040333594A3} *)
TID_D3DRMTextureFilename: TGUID =
(D1:$a42790e1;D2:$7810;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
const
DXFILE_OK = HResult(0);
 
(* {A42790E2-7810-11cf-8F52-0040333594A3} *)
TID_D3DRMTextureReference: TGUID =
(D1:$a42790e2;D2:$7810;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
DXFILEERR_BADOBJECT = HResult($88760000 + 850);
DXFILEERR_BADVALUE = HResult($88760000 + 851);
DXFILEERR_BADTYPE = HResult($88760000 + 852);
DXFILEERR_BADSTREAMHANDLE = HResult($88760000 + 853);
DXFILEERR_BADALLOC = HResult($88760000 + 854);
DXFILEERR_NOTFOUND = HResult($88760000 + 855);
DXFILEERR_NOTDONEYET = HResult($88760000 + 856);
DXFILEERR_FILENOTFOUND = HResult($88760000 + 857);
DXFILEERR_RESOURCENOTFOUND = HResult($88760000 + 858);
DXFILEERR_URLNOTFOUND = HResult($88760000 + 859);
DXFILEERR_BADRESOURCE = HResult($88760000 + 860);
DXFILEERR_BADFILETYPE = HResult($88760000 + 861);
DXFILEERR_BADFILEVERSION = HResult($88760000 + 862);
DXFILEERR_BADFILEFLOATSIZE = HResult($88760000 + 863);
DXFILEERR_BADFILECOMPRESSIONTYPE = HResult($88760000 + 864);
DXFILEERR_BADFILE = HResult($88760000 + 865);
DXFILEERR_PARSEERROR = HResult($88760000 + 866);
DXFILEERR_NOTEMPLATE = HResult($88760000 + 867);
DXFILEERR_BADARRAYSIZE = HResult($88760000 + 868);
DXFILEERR_BADDATAREFERENCE = HResult($88760000 + 869);
DXFILEERR_INTERNALERROR = HResult($88760000 + 870);
DXFILEERR_NOMOREOBJECTS = HResult($88760000 + 871);
DXFILEERR_BADINTRINSICS = HResult($88760000 + 872);
DXFILEERR_NOMORESTREAMHANDLES = HResult($88760000 + 873);
DXFILEERR_NOMOREDATA = HResult($88760000 + 874);
DXFILEERR_BADCACHEFILE = HResult($88760000 + 875);
DXFILEERR_NOINTERNET = HResult($88760000 + 876);
 
(* {1630B820-7842-11cf-8F52-0040333594A3} *)
TID_D3DRMIndexedColor: TGUID =
(D1:$1630b820;D2:$7842;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
{ API for creating IDirectXFile interface. }
 
(* {1630B821-7842-11cf-8F52-0040333594A3} *)
TID_D3DRMMeshVertexColors: TGUID =
(D1:$1630b821;D2:$7842;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
function DirectXFileCreate(out lplpDirectXFile: IDirectXFile): HResult; stdcall;
 
(* {4885AE60-78E8-11cf-8F52-0040333594A3} *)
TID_D3DRMMaterialWrap: TGUID =
(D1:$4885ae60;D2:$78e8;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
(***************************************************************************
*
* Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved.
*
* File: rmxfguid.h
*
* Content: Defines GUIDs of D3DRM's templates.
*
***************************************************************************)
 
(* {537DA6A0-CA37-11d0-941C-0080C80CFA7B} *)
TID_D3DRMBoolean: TGUID =
(D1:$537da6a0;D2:$ca37;D3:$11d0;D4:($94,$1c,$00,$80,$c8,$0c,$fa,$7b));
const
TID_D3DRMInfo: TGUID = '{2B957100-9E9A-11cf-AB39-0020AF71E433}';
TID_D3DRMMesh: TGUID = '{3D82AB44-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMVector: TGUID = '{3D82AB5E-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMMeshFace: TGUID = '{3D82AB5F-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMMaterial: TGUID = '{3D82AB4D-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMMaterialArray: TGUID = '{35FF44E1-6C7C-11cf-8F52-0040333594A3}';
TID_D3DRMFrame: TGUID = '{3D82AB46-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMFrameTransformMatrix: TGUID = '{F6F23F41-7686-11cf-8F52-0040333594A3}';
TID_D3DRMMeshMaterialList: TGUID = '{F6F23F42-7686-11cf-8F52-0040333594A3}';
TID_D3DRMMeshTextureCoords: TGUID = '{F6F23F40-7686-11cf-8F52-0040333594A3}';
TID_D3DRMMeshNormals: TGUID = '{F6F23F43-7686-11cf-8F52-0040333594A3}';
TID_D3DRMCoords2d: TGUID = '{F6F23F44-7686-11cf-8F52-0040333594A3}';
TID_D3DRMMatrix4x4: TGUID = '{F6F23F45-7686-11cf-8F52-0040333594A3}';
TID_D3DRMAnimation: TGUID = '{3D82AB4F-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMAnimationSet: TGUID = '{3D82AB50-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMAnimationKey: TGUID = '{10DD46A8-775B-11cf-8F52-0040333594A3}';
TID_D3DRMFloatKeys: TGUID = '{10DD46A9-775B-11cf-8F52-0040333594A3}';
TID_D3DRMMaterialAmbientColor: TGUID = '{01411840-7786-11cf-8F52-0040333594A3}';
TID_D3DRMMaterialDiffuseColor: TGUID = '{01411841-7786-11cf-8F52-0040333594A3}';
TID_D3DRMMaterialSpecularColor: TGUID = '{01411842-7786-11cf-8F52-0040333594A3}';
TID_D3DRMMaterialEmissiveColor: TGUID = '{D3E16E80-7835-11cf-8F52-0040333594A3}';
TID_D3DRMMaterialPower: TGUID = '{01411843-7786-11cf-8F52-0040333594A3}';
TID_D3DRMColorRGBA: TGUID = '{35FF44E0-6C7C-11cf-8F52-0040333594A3}';
TID_D3DRMColorRGB: TGUID = '{D3E16E81-7835-11cf-8F52-0040333594A3}';
TID_D3DRMGuid: TGUID = '{A42790E0-7810-11cf-8F52-0040333594A3}';
TID_D3DRMTextureFilename: TGUID = '{A42790E1-7810-11cf-8F52-0040333594A3}';
TID_D3DRMTextureReference: TGUID = '{A42790E2-7810-11cf-8F52-0040333594A3}';
TID_D3DRMIndexedColor: TGUID = '{1630B820-7842-11cf-8F52-0040333594A3}';
TID_D3DRMMeshVertexColors: TGUID = '{1630B821-7842-11cf-8F52-0040333594A3}';
TID_D3DRMMaterialWrap: TGUID = '{4885AE60-78E8-11cf-8F52-0040333594A3}';
TID_D3DRMBoolean: TGUID = '{537DA6A0-CA37-11d0-941C-0080C80CFA7B}';
TID_D3DRMMeshFaceWraps: TGUID = '{ED1EC5C0-C0A8-11d0-941C-0080C80CFA7B}';
TID_D3DRMBoolean2d: TGUID = '{4885AE63-78E8-11cf-8F52-0040333594A3}';
TID_D3DRMTimedFloatKeys: TGUID = '{F406B180-7B3B-11cf-8F52-0040333594A3}';
TID_D3DRMAnimationOptions: TGUID = '{E2BF56C0-840F-11cf-8F52-0040333594A3}';
TID_D3DRMFramePosition: TGUID = '{E2BF56C1-840F-11cf-8F52-0040333594A3}';
TID_D3DRMFrameVelocity: TGUID = '{E2BF56C2-840F-11cf-8F52-0040333594A3}';
TID_D3DRMFrameRotation: TGUID = '{E2BF56C3-840F-11cf-8F52-0040333594A3}';
TID_D3DRMLight: TGUID = '{3D82AB4A-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMCamera: TGUID = '{3D82AB51-62DA-11cf-AB39-0020AF71E433}';
TID_D3DRMAppData: TGUID = '{E5745280-B24F-11cf-9DD5-00AA00A71A2F}';
TID_D3DRMLightUmbra: TGUID = '{AED22740-B31F-11cf-9DD5-00AA00A71A2F}';
TID_D3DRMLightRange: TGUID = '{AED22742-B31F-11cf-9DD5-00AA00A71A2F}';
TID_D3DRMLightPenumbra: TGUID = '{AED22741-B31F-11cf-9DD5-00AA00A71A2F}';
TID_D3DRMLightAttenuation: TGUID = '{A8A98BA0-C5E5-11cf-B941-0080C80CFA7B}';
TID_D3DRMInlineData: TGUID = '{3A23EEA0-94B1-11d0-AB39-0020AF71E433}';
TID_D3DRMUrl: TGUID = '{3A23EEA1-94B1-11d0-AB39-0020AF71E433}';
 
(* {ED1EC5C0-C0A8-11d0-941C-0080C80CFA7B} *)
TID_D3DRMMeshFaceWraps: TGUID =
(D1:$ed1ec5c0;D2:$c0a8;D3:$11d0;D4:($94,$1c,$00,$80,$c8,$0c,$fa,$7b));
TID_D3DRMProgressiveMesh: TGUID = '{8A63C360-997D-11d0-941C-0080C80CFA7B}';
TID_D3DRMExternalVisual: TGUID = '{98116AA0-BDBA-11d1-82C0-00A0C9697271}';
TID_D3DRMStringProperty: TGUID = '{7F0F21E0-BFE1-11d1-82C0-00A0C9697271}';
TID_D3DRMPropertyBag: TGUID = '{7F0F21E1-BFE1-11d1-82C0-00A0C9697271}';
TID_D3DRMRightHanded: TGUID = '{7F5D5EA0-D53A-11d1-82C0-00A0C9697271}';
 
(* {4885AE63-78E8-11cf-8F52-0040333594A3} *)
TID_D3DRMBoolean2d: TGUID =
(D1:$4885ae63;D2:$78e8;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
 
(* {F406B180-7B3B-11cf-8F52-0040333594A3} *)
TID_D3DRMTimedFloatKeys: TGUID =
(D1:$f406b180;D2:$7b3b;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
 
(* {E2BF56C0-840F-11cf-8F52-0040333594A3} *)
TID_D3DRMAnimationOptions: TGUID =
(D1:$e2bf56c0;D2:$840f;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
 
(* {E2BF56C1-840F-11cf-8F52-0040333594A3} *)
TID_D3DRMFramePosition: TGUID =
(D1:$e2bf56c1;D2:$840f;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
 
(* {E2BF56C2-840F-11cf-8F52-0040333594A3} *)
TID_D3DRMFrameVelocity: TGUID =
(D1:$e2bf56c2;D2:$840f;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
 
(* {E2BF56C3-840F-11cf-8F52-0040333594A3} *)
TID_D3DRMFrameRotation: TGUID =
(D1:$e2bf56c3;D2:$840f;D3:$11cf;D4:($8f,$52,$00,$40,$33,$35,$94,$a3));
 
(* {3D82AB4A-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMLight: TGUID =
(D1:$3d82ab4a;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
 
(* {3D82AB51-62DA-11cf-AB39-0020AF71E433} *)
TID_D3DRMCamera: TGUID =
(D1:$3d82ab51;D2:$62da;D3:$11cf;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
 
(* {E5745280-B24F-11cf-9DD5-00AA00A71A2F} *)
TID_D3DRMAppData: TGUID =
(D1:$e5745280;D2:$b24f;D3:$11cf;D4:($9d,$d5,$00,$aa,$00,$a7,$1a,$2f));
 
(* {AED22740-B31F-11cf-9DD5-00AA00A71A2F} *)
TID_D3DRMLightUmbra: TGUID =
(D1:$aed22740;D2:$b31f;D3:$11cf;D4:($9d,$d5,$00,$aa,$00,$a7,$1a,$2f));
 
(* {AED22742-B31F-11cf-9DD5-00AA00A71A2F} *)
TID_D3DRMLightRange: TGUID =
(D1:$aed22742;D2:$b31f;D3:$11cf;D4:($9d,$d5,$00,$aa,$00,$a7,$1a,$2f));
 
(* {AED22741-B31F-11cf-9DD5-00AA00A71A2F} *)
TID_D3DRMLightPenumbra: TGUID =
(D1:$aed22741;D2:$b31f;D3:$11cf;D4:($9d,$d5,$00,$aa,$00,$a7,$1a,$2f));
 
(* {A8A98BA0-C5E5-11cf-B941-0080C80CFA7B} *)
TID_D3DRMLightAttenuation: TGUID =
(D1:$a8a98ba0;D2:$c5e5;D3:$11cf;D4:($b9,$41,$00,$80,$c8,$0c,$fa,$7b));
 
(* {3A23EEA0-94B1-11d0-AB39-0020AF71E433} *)
TID_D3DRMInlineData: TGUID =
(D1:$3a23eea0;D2:$94b1;D3:$11d0;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
 
(* {3A23EEA1-94B1-11d0-AB39-0020AF71E433} *)
TID_D3DRMUrl: TGUID =
(D1:$3a23eea1;D2:$94b1;D3:$11d0;D4:($ab,$39,$00,$20,$af,$71,$e4,$33));
 
(* {8A63C360-997D-11d0-941C-0080C80CFA7B} *)
TID_D3DRMProgressiveMesh: TGUID =
(D1:$8A63C360;D2:$997D;D3:$11d0;D4:($94,$1C,$00,$80,$C8,$0C,$FA,$7B));
 
(* {98116AA0-BDBA-11d1-82C0-00A0C9697271} *)
TID_D3DRMExternalVisual: TGUID =
(D1:$98116AA0;D2:$BDBA;D3:$11d1;D4:($82,$C0,$00,$A0,$C9,$69,$72,$71));
 
(* {7F0F21E0-BFE1-11d1-82C0-00A0C9697271} *)
TID_D3DRMStringProperty: TGUID =
(D1:$7f0f21e0;D2:$bfe1;D3:$11d1;D4:($82,$c0,$00,$a0,$c9,$69,$72,$71));
 
(* {7F0F21E1-BFE1-11d1-82C0-00A0C9697271} *)
TID_D3DRMPropertyBag: TGUID =
(D1:$7f0f21e1;D2:$bfe1;D3:$11d1;D4:($82,$c0,$00,$a0,$c9,$69,$72,$71));
 
// {7F5D5EA0-D53A-11d1-82C0-00A0C9697271}
TID_D3DRMRightHanded: TGUID =
(D1:$7f5d5ea0;D2:$d53a;D3:$11d1;D4:($82,$c0,$00,$a0,$c9,$69,$72,$71));
 
(*==========================================================================;
(***************************************************************************
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
* Copyright (C) 1998-1999 Microsoft Corporation. All Rights Reserved.
*
* File: rmxftmpl.h
* Content: D3DRM XFile templates in binary form
*
* Content: D3DRM XFile templates in binary form.
*
***************************************************************************)
 
const
D3DRM_XTEMPLATE_BYTES_2 = 3278;
D3DRM_XTEMPLATES: array [0..3214] of byte = (
$78, $6f, $66, $20, $30, $33, $30, $32, $62,
$69, $6e, $20, $30, $30, $36, $34, $1f, 0, $1,
0, $6, 0, 0, 0, $48, $65, $61, $64, $65,
$72, $a, 0, $5, 0, $43, $ab, $82, $3d, $da,
$62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4,
$33, $28, 0, $1, 0, $5, 0, 0, 0, $6d,
$61, $6a, $6f, $72, $14, 0, $28, 0, $1, 0,
$5, 0, 0, 0, $6d, $69, $6e, $6f, $72, $14,
0, $29, 0, $1, 0, $5, 0, 0, 0, $66,
$6c, $61, $67, $73, $14, 0, $b, 0, $1f, 0,
$1, 0, $6, 0, 0, 0, $56, $65, $63, $74,
$6f, $72, $a, 0, $5, 0, $5e, $ab, $82, $3d,
$da, $62, $cf, $11, $ab, $39, 0, $20, $af, $71,
$e4, $33, $2a, 0, $1, 0, $1, 0, 0, 0,
$78, $14, 0, $2a, 0, $1, 0, $1, 0, 0,
0, $79, $14, 0, $2a, 0, $1, 0, $1, 0,
0, 0, $7a, $14, 0, $b, 0, $1f, 0, $1,
0, $8, 0, 0, 0, $43, $6f, $6f, $72, $64,
$73, $32, $64, $a, 0, $5, 0, $44, $3f, $f2,
$f6, $86, $76, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $2a, 0, $1, 0, $1, 0, 0,
0, $75, $14, 0, $2a, 0, $1, 0, $1, 0,
0, 0, $76, $14, 0, $b, 0, $1f, 0, $1,
0, $9, 0, 0, 0, $4d, $61, $74, $72, $69,
$78, $34, $78, $34, $a, 0, $5, 0, $45, $3f,
$f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40,
$33, $35, $94, $a3, $34, 0, $2a, 0, $1, 0,
$6, 0, 0, 0, $6d, $61, $74, $72, $69, $78,
$e, 0, $3, 0, $10, 0, 0, 0, $f, 0,
$14, 0, $b, 0, $1f, 0, $1, 0, $9, 0,
0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42,
$41, $a, 0, $5, 0, $e0, $44, $ff, $35, $7c,
$6c, $cf, $11, $8f, $52, 0, $40, $33, $35, $94,
$a3, $2a, 0, $1, 0, $3, 0, 0, 0, $72,
$65, $64, $14, 0, $2a, 0, $1, 0, $5, 0,
0, 0, $67, $72, $65, $65, $6e, $14, 0, $2a,
0, $1, 0, $4, 0, 0, 0, $62, $6c, $75,
$65, $14, 0, $2a, 0, $1, 0, $5, 0, 0,
0, $61, $6c, $70, $68, $61, $14, 0, $b, 0,
$1f, 0, $1, 0, $8, 0, 0, 0, $43, $6f,
$6c, $6f, $72, $52, $47, $42, $a, 0, $5, 0,
$81, $6e, $e1, $d3, $35, $78, $cf, $11, $8f, $52,
0, $40, $33, $35, $94, $a3, $2a, 0, $1, 0,
$3, 0, 0, 0, $72, $65, $64, $14, 0, $2a,
0, $1, 0, $5, 0, 0, 0, $67, $72, $65,
$65, $6e, $14, 0, $2a, 0, $1, 0, $4, 0,
0, 0, $62, $6c, $75, $65, $14, 0, $b, 0,
$1f, 0, $1, 0, $c, 0, 0, 0, $49, $6e,
$64, $65, $78, $65, $64, $43, $6f, $6c, $6f, $72,
$a, 0, $5, 0, $20, $b8, $30, $16, $42, $78,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $5, 0, 0, 0, $69, $6e,
$64, $65, $78, $14, 0, $1, 0, $9, 0, 0,
0, $43, $6f, $6c, $6f, $72, $52, $47, $42, $41,
$1, 0, $a, 0, 0, 0, $69, $6e, $64, $65,
$78, $43, $6f, $6c, $6f, $72, $14, 0, $b, 0,
$1f, 0, $1, 0, $7, 0, 0, 0, $42, $6f,
$6f, $6c, $65, $61, $6e, $a, 0, $5, 0, $a0,
$a6, $7d, $53, $37, $ca, $d0, $11, $94, $1c, 0,
$80, $c8, $c, $fa, $7b, $29, 0, $1, 0, $9,
0, 0, 0, $74, $72, $75, $65, $66, $61, $6c,
$73, $65, $14, 0, $b, 0, $1f, 0, $1, 0,
$9, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61,
$6e, $32, $64, $a, 0, $5, 0, $63, $ae, $85,
$48, $e8, $78, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $1, 0, $7, 0, 0, 0, $42,
$6f, $6f, $6c, $65, $61, $6e, $1, 0, $1, 0,
0, 0, $75, $14, 0, $1, 0, $7, 0, 0,
0, $42, $6f, $6f, $6c, $65, $61, $6e, $1, 0,
$1, 0, 0, 0, $76, $14, 0, $b, 0, $1f,
0, $1, 0, $c, 0, 0, 0, $4d, $61, $74,
$65, $72, $69, $61, $6c, $57, $72, $61, $70, $a,
0, $5, 0, $60, $ae, $85, $48, $e8, $78, $cf,
$11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1,
0, $7, 0, 0, 0, $42, $6f, $6f, $6c, $65,
$61, $6e, $1, 0, $1, 0, 0, 0, $75, $14,
0, $1, 0, $7, 0, 0, 0, $42, $6f, $6f,
$6c, $65, $61, $6e, $1, 0, $1, 0, 0, 0,
$76, $14, 0, $b, 0, $1f, 0, $1, 0, $f,
0, 0, 0, $54, $65, $78, $74, $75, $72, $65,
$46, $69, $6c, $65, $6e, $61, $6d, $65, $a, 0,
$5, 0, $e1, $90, $27, $a4, $10, $78, $cf, $11,
$8f, $52, 0, $40, $33, $35, $94, $a3, $31, 0,
$1, 0, $8, 0, 0, 0, $66, $69, $6c, $65,
$6e, $61, $6d, $65, $14, 0, $b, 0, $1f, 0,
$1, 0, $8, 0, 0, 0, $4d, $61, $74, $65,
$72, $69, $61, $6c, $a, 0, $5, 0, $4d, $ab,
$82, $3d, $da, $62, $cf, $11, $ab, $39, 0, $20,
$af, $71, $e4, $33, $1, 0, $9, 0, 0, 0,
$43, $6f, $6c, $6f, $72, $52, $47, $42, $41, $1,
0, $9, 0, 0, 0, $66, $61, $63, $65, $43,
$6f, $6c, $6f, $72, $14, 0, $2a, 0, $1, 0,
$5, 0, 0, 0, $70, $6f, $77, $65, $72, $14,
0, $1, 0, $8, 0, 0, 0, $43, $6f, $6c,
$6f, $72, $52, $47, $42, $1, 0, $d, 0, 0,
0, $73, $70, $65, $63, $75, $6c, $61, $72, $43,
$6f, $6c, $6f, $72, $14, 0, $1, 0, $8, 0,
0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42,
$1, 0, $d, 0, 0, 0, $65, $6d, $69, $73,
$73, $69, $76, $65, $43, $6f, $6c, $6f, $72, $14,
0, $e, 0, $12, 0, $12, 0, $12, 0, $f,
0, $b, 0, $1f, 0, $1, 0, $8, 0, 0,
0, $4d, $65, $73, $68, $46, $61, $63, $65, $a,
0, $5, 0, $5f, $ab, $82, $3d, $da, $62, $cf,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $29,
0, $1, 0, $12, 0, 0, 0, $6e, $46, $61,
$63, $65, $56, $65, $72, $74, $65, $78, $49, $6e,
$64, $69, $63, $65, $73, $14, 0, $34, 0, $29,
0, $1, 0, $11, 0, 0, 0, $66, $61, $63,
$65, $56, $65, $72, $74, $65, $78, $49, $6e, $64,
$69, $63, $65, $73, $e, 0, $1, 0, $12, 0,
0, 0, $6e, $46, $61, $63, $65, $56, $65, $72,
$74, $65, $78, $49, $6e, $64, $69, $63, $65, $73,
$f, 0, $14, 0, $b, 0, $1f, 0, $1, 0,
$d, 0, 0, 0, $4d, $65, $73, $68, $46, $61,
$63, $65, $57, $72, $61, $70, $73, $a, 0, $5,
0, $c0, $c5, $1e, $ed, $a8, $c0, $d0, $11, $94,
$1c, 0, $80, $c8, $c, $fa, $7b, $29, 0, $1,
0, $f, 0, 0, 0, $6e, $46, $61, $63, $65,
$57, $72, $61, $70, $56, $61, $6c, $75, $65, $73,
$14, 0, $34, 0, $1, 0, $9, 0, 0, 0,
$42, $6f, $6f, $6c, $65, $61, $6e, $32, $64, $1,
0, $e, 0, 0, 0, $66, $61, $63, $65, $57,
$72, $61, $70, $56, $61, $6c, $75, $65, $73, $e,
0, $1, 0, $f, 0, 0, 0, $6e, $46, $61,
$63, $65, $57, $72, $61, $70, $56, $61, $6c, $75,
$65, $73, $f, 0, $14, 0, $b, 0, $1f, 0,
$1, 0, $11, 0, 0, 0, $4d, $65, $73, $68,
$54, $65, $78, $74, $75, $72, $65, $43, $6f, $6f,
$72, $64, $73, $a, 0, $5, 0, $40, $3f, $f2,
$f6, $86, $76, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $29, 0, $1, 0, $e, 0, 0,
0, $6e, $54, $65, $78, $74, $75, $72, $65, $43,
$6f, $6f, $72, $64, $73, $14, 0, $34, 0, $1,
0, $8, 0, 0, 0, $43, $6f, $6f, $72, $64,
$73, $32, $64, $1, 0, $d, 0, 0, 0, $74,
$65, $78, $74, $75, $72, $65, $43, $6f, $6f, $72,
$64, $73, $e, 0, $1, 0, $e, 0, 0, 0,
$6e, $54, $65, $78, $74, $75, $72, $65, $43, $6f,
$6f, $72, $64, $73, $f, 0, $14, 0, $b, 0,
$1f, 0, $1, 0, $10, 0, 0, 0, $4d, $65,
$73, $68, $4d, $61, $74, $65, $72, $69, $61, $6c,
$4c, $69, $73, $74, $a, 0, $5, 0, $42, $3f,
$f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40,
$33, $35, $94, $a3, $29, 0, $1, 0, $a, 0,
0, 0, $6e, $4d, $61, $74, $65, $72, $69, $61,
$6c, $73, $14, 0, $29, 0, $1, 0, $c, 0,
0, 0, $6e, $46, $61, $63, $65, $49, $6e, $64,
$65, $78, $65, $73, $14, 0, $34, 0, $29, 0,
$1, 0, $b, 0, 0, 0, $66, $61, $63, $65,
$49, $6e, $64, $65, $78, $65, $73, $e, 0, $1,
0, $c, 0, 0, 0, $6e, $46, $61, $63, $65,
$49, $6e, $64, $65, $78, $65, $73, $f, 0, $14,
0, $e, 0, $1, 0, $8, 0, 0, 0, $4d,
$61, $74, $65, $72, $69, $61, $6c, $f, 0, $b,
0, $1f, 0, $1, 0, $b, 0, 0, 0, $4d,
$65, $73, $68, $4e, $6f, $72, $6d, $61, $6c, $73,
$a, 0, $5, 0, $43, $3f, $f2, $f6, $86, $76,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $8, 0, 0, 0, $6e, $4e,
$6f, $72, $6d, $61, $6c, $73, $14, 0, $34, 0,
$1, 0, $6, 0, 0, 0, $56, $65, $63, $74,
$6f, $72, $1, 0, $7, 0, 0, 0, $6e, $6f,
$72, $6d, $61, $6c, $73, $e, 0, $1, 0, $8,
0, 0, 0, $6e, $4e, $6f, $72, $6d, $61, $6c,
$73, $f, 0, $14, 0, $29, 0, $1, 0, $c,
0, 0, 0, $6e, $46, $61, $63, $65, $4e, $6f,
$72, $6d, $61, $6c, $73, $14, 0, $34, 0, $1,
0, $8, 0, 0, 0, $4d, $65, $73, $68, $46,
$61, $63, $65, $1, 0, $b, 0, 0, 0, $66,
$61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73,
$e, 0, $1, 0, $c, 0, 0, 0, $6e, $46,
$61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73,
$f, 0, $14, 0, $b, 0, $1f, 0, $1, 0,
$10, 0, 0, 0, $4d, $65, $73, $68, $56, $65,
$72, $74, $65, $78, $43, $6f, $6c, $6f, $72, $73,
$a, 0, $5, 0, $21, $b8, $30, $16, $42, $78,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $d, 0, 0, 0, $6e, $56,
$65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72,
$73, $14, 0, $34, 0, $1, 0, $c, 0, 0,
0, $49, $6e, $64, $65, $78, $65, $64, $43, $6f,
$6c, $6f, $72, $1, 0, $c, 0, 0, 0, $76,
$65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72,
$73, $e, 0, $1, 0, $d, 0, 0, 0, $6e,
$56, $65, $72, $74, $65, $78, $43, $6f, $6c, $6f,
$72, $73, $f, 0, $14, 0, $b, 0, $1f, 0,
$1, 0, $4, 0, 0, 0, $4d, $65, $73, $68,
$a, 0, $5, 0, $44, $ab, $82, $3d, $da, $62,
$cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33,
$29, 0, $1, 0, $9, 0, 0, 0, $6e, $56,
$65, $72, $74, $69, $63, $65, $73, $14, 0, $34,
0, $1, 0, $6, 0, 0, 0, $56, $65, $63,
$74, $6f, $72, $1, 0, $8, 0, 0, 0, $76,
$65, $72, $74, $69, $63, $65, $73, $e, 0, $1,
0, $9, 0, 0, 0, $6e, $56, $65, $72, $74,
$69, $63, $65, $73, $f, 0, $14, 0, $29, 0,
$1, 0, $6, 0, 0, 0, $6e, $46, $61, $63,
$65, $73, $14, 0, $34, 0, $1, 0, $8, 0,
0, 0, $4d, $65, $73, $68, $46, $61, $63, $65,
$1, 0, $5, 0, 0, 0, $66, $61, $63, $65,
$73, $e, 0, $1, 0, $6, 0, 0, 0, $6e,
$46, $61, $63, $65, $73, $f, 0, $14, 0, $e,
0, $12, 0, $12, 0, $12, 0, $f, 0, $b,
0, $1f, 0, $1, 0, $14, 0, 0, 0, $46,
$72, $61, $6d, $65, $54, $72, $61, $6e, $73, $66,
$6f, $72, $6d, $4d, $61, $74, $72, $69, $78, $a,
0, $5, 0, $41, $3f, $f2, $f6, $86, $76, $cf,
$11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1,
0, $9, 0, 0, 0, $4d, $61, $74, $72, $69,
$78, $34, $78, $34, $1, 0, $b, 0, 0, 0,
$66, $72, $61, $6d, $65, $4d, $61, $74, $72, $69,
$78, $14, 0, $b, 0, $1f, 0, $1, 0, $5,
0, 0, 0, $46, $72, $61, $6d, $65, $a, 0,
$5, 0, $46, $ab, $82, $3d, $da, $62, $cf, $11,
$ab, $39, 0, $20, $af, $71, $e4, $33, $e, 0,
$12, 0, $12, 0, $12, 0, $f, 0, $b, 0,
$1f, 0, $1, 0, $9, 0, 0, 0, $46, $6c,
$6f, $61, $74, $4b, $65, $79, $73, $a, 0, $5,
0, $a9, $46, $dd, $10, $5b, $77, $cf, $11, $8f,
$52, 0, $40, $33, $35, $94, $a3, $29, 0, $1,
0, $7, 0, 0, 0, $6e, $56, $61, $6c, $75,
$65, $73, $14, 0, $34, 0, $2a, 0, $1, 0,
$6, 0, 0, 0, $76, $61, $6c, $75, $65, $73,
$e, 0, $1, 0, $7, 0, 0, 0, $6e, $56,
$61, $6c, $75, $65, $73, $f, 0, $14, 0, $b,
0, $1f, 0, $1, 0, $e, 0, 0, 0, $54,
$69, $6d, $65, $64, $46, $6c, $6f, $61, $74, $4b,
$65, $79, $73, $a, 0, $5, 0, $80, $b1, $6,
$f4, $3b, $7b, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $29, 0, $1, 0, $4, 0, 0,
0, $74, $69, $6d, $65, $14, 0, $1, 0, $9,
0, 0, 0, $46, $6c, $6f, $61, $74, $4b, $65,
$79, $73, $1, 0, $6, 0, 0, 0, $74, $66,
$6b, $65, $79, $73, $14, 0, $b, 0, $1f, 0,
$1, 0, $c, 0, 0, 0, $41, $6e, $69, $6d,
$61, $74, $69, $6f, $6e, $4b, $65, $79, $a, 0,
$5, 0, $a8, $46, $dd, $10, $5b, $77, $cf, $11,
$8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0,
$1, 0, $7, 0, 0, 0, $6b, $65, $79, $54,
$79, $70, $65, $14, 0, $29, 0, $1, 0, $5,
0, 0, 0, $6e, $4b, $65, $79, $73, $14, 0,
$34, 0, $1, 0, $e, 0, 0, 0, $54, $69,
$6d, $65, $64, $46, $6c, $6f, $61, $74, $4b, $65,
$79, $73, $1, 0, $4, 0, 0, 0, $6b, $65,
$79, $73, $e, 0, $1, 0, $5, 0, 0, 0,
$6e, $4b, $65, $79, $73, $f, 0, $14, 0, $b,
0, $1f, 0, $1, 0, $10, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $4f, $70,
$74, $69, $6f, $6e, $73, $a, 0, $5, 0, $c0,
$56, $bf, $e2, $f, $84, $cf, $11, $8f, $52, 0,
$40, $33, $35, $94, $a3, $29, 0, $1, 0, $a,
0, 0, 0, $6f, $70, $65, $6e, $63, $6c, $6f,
$73, $65, $64, $14, 0, $29, 0, $1, 0, $f,
0, 0, 0, $70, $6f, $73, $69, $74, $69, $6f,
$6e, $71, $75, $61, $6c, $69, $74, $79, $14, 0,
$b, 0, $1f, 0, $1, 0, $9, 0, 0, 0,
$41, $6e, $69, $6d, $61, $74, $69, $6f, $6e, $a,
0, $5, 0, $4f, $ab, $82, $3d, $da, $62, $cf,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $e,
0, $12, 0, $12, 0, $12, 0, $f, 0, $b,
0, $1f, 0, $1, 0, $c, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $53, $65,
$74, $a, 0, $5, 0, $50, $ab, $82, $3d, $da,
$62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4,
$33, $e, 0, $1, 0, $9, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $f, 0,
$b, 0, $1f, 0, $1, 0, $a, 0, 0, 0,
$49, $6e, $6c, $69, $6e, $65, $44, $61, $74, $61,
$a, 0, $5, 0, $a0, $ee, $23, $3a, $b1, $94,
$d0, $11, $ab, $39, 0, $20, $af, $71, $e4, $33,
$e, 0, $1, 0, $6, 0, 0, 0, $42, $49,
$4e, $41, $52, $59, $f, 0, $b, 0, $1f, 0,
$1, 0, $3, 0, 0, 0, $55, $72, $6c, $a,
0, $5, 0, $a1, $ee, $23, $3a, $b1, $94, $d0,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $29,
0, $1, 0, $5, 0, 0, 0, $6e, $55, $72,
$6c, $73, $14, 0, $34, 0, $31, 0, $1, 0,
$4, 0, 0, 0, $75, $72, $6c, $73, $e, 0,
$1, 0, $5, 0, 0, 0, $6e, $55, $72, $6c,
$73, $f, 0, $14, 0, $b, 0, $1f, 0, $1,
0, $f, 0, 0, 0, $50, $72, $6f, $67, $72,
$65, $73, $73, $69, $76, $65, $4d, $65, $73, $68,
$a, 0, $5, 0, $60, $c3, $63, $8a, $7d, $99,
$d0, $11, $94, $1c, 0, $80, $c8, $c, $fa, $7b,
$e, 0, $1, 0, $3, 0, 0, 0, $55, $72,
$6c, $13, 0, $1, 0, $a, 0, 0, 0, $49,
$6e, $6c, $69, $6e, $65, $44, $61, $74, $61, $f,
0, $b, 0, $1f, 0, $1, 0, $4, 0, 0,
0, $47, $75, $69, $64, $a, 0, $5, 0, $e0,
$90, $27, $a4, $10, $78, $cf, $11, $8f, $52, 0,
$40, $33, $35, $94, $a3, $29, 0, $1, 0, $5,
0, 0, 0, $64, $61, $74, $61, $31, $14, 0,
$28, 0, $1, 0, $5, 0, 0, 0, $64, $61,
$74, $61, $32, $14, 0, $28, 0, $1, 0, $5,
0, 0, 0, $64, $61, $74, $61, $33, $14, 0,
$34, 0, $2d, 0, $1, 0, $5, 0, 0, 0,
$64, $61, $74, $61, $34, $e, 0, $3, 0, $8,
0, 0, 0, $f, 0, $14, 0, $b, 0, $1f,
0, $1, 0, $e, 0, 0, 0, $53, $74, $72,
$69, $6e, $67, $50, $72, $6f, $70, $65, $72, $74,
$79, $a, 0, $5, 0, $e0, $21, $f, $7f, $e1,
$bf, $d1, $11, $82, $c0, 0, $a0, $c9, $69, $72,
$71, $31, 0, $1, 0, $3, 0, 0, 0, $6b,
$65, $79, $14, 0, $31, 0, $1, 0, $5, 0,
0, 0, $76, $61, $6c, $75, $65, $14, 0, $b,
0, $1f, 0, $1, 0, $b, 0, 0, 0, $50,
$72, $6f, $70, $65, $72, $74, $79, $42, $61, $67,
$a, 0, $5, 0, $e1, $21, $f, $7f, $e1, $bf,
$d1, $11, $82, $c0, 0, $a0, $c9, $69, $72, $71,
$e, 0, $1, 0, $e, 0, 0, 0, $53, $74,
$72, $69, $6e, $67, $50, $72, $6f, $70, $65, $72,
$74, $79, $f, 0, $b, 0, $1f, 0, $1, 0,
$e, 0, 0, 0, $45, $78, $74, $65, $72, $6e,
$61, $6c, $56, $69, $73, $75, $61, $6c, $a, 0,
$5, 0, $a0, $6a, $11, $98, $ba, $bd, $d1, $11,
$82, $c0, 0, $a0, $c9, $69, $72, $71, $1, 0,
$4, 0, 0, 0, $47, $75, $69, $64, $1, 0,
$12, 0, 0, 0, $67, $75, $69, $64, $45, $78,
$74, $65, $72, $6e, $61, $6c, $56, $69, $73, $75,
$61, $6c, $14, 0, $e, 0, $12, 0, $12, 0,
$12, 0, $f, 0, $b, 0);
 
D3DRM_XTEMPLATES_2: array [0..D3DRM_XTEMPLATE_BYTES_2-1] of byte = (
$78, $6f, $66, $20, $30, $33, $30, $32, $62, $69, $6e, $20, $30, $30, $36, $34, $1f, 0, $1,
0, $6, 0, 0, 0, $48, $65, $61, $64, $65, $72, $a, 0, $5, 0, $43, $ab, $82, $3d, $da,
$62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $28, 0, $1, 0, $5, 0, 0, 0, $6d,
$61, $6a, $6f, $72, $14, 0, $28, 0, $1, 0, $5, 0, 0, 0, $6d, $69, $6e, $6f, $72, $14,
0, $29, 0, $1, 0, $5, 0, 0, 0, $66, $6c, $61, $67, $73, $14, 0, $b, 0, $1f, 0,
$1, 0, $6, 0, 0, 0, $56, $65, $63, $74, $6f, $72, $a, 0, $5, 0, $5e, $ab, $82, $3d,
$da, $62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $2a, 0, $1, 0, $1, 0, 0, 0,
$78, $14, 0, $2a, 0, $1, 0, $1, 0, 0, 0, $79, $14, 0, $2a, 0, $1, 0, $1, 0,
0, 0, $7a, $14, 0, $b, 0, $1f, 0, $1, 0, $8, 0, 0, 0, $43, $6f, $6f, $72, $64,
$73, $32, $64, $a, 0, $5, 0, $44, $3f, $f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $2a, 0, $1, 0, $1, 0, 0, 0, $75, $14, 0, $2a, 0, $1, 0, $1, 0,
0, 0, $76, $14, 0, $b, 0, $1f, 0, $1, 0, $9, 0, 0, 0, $4d, $61, $74, $72, $69,
$78, $34, $78, $34, $a, 0, $5, 0, $45, $3f, $f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40,
$33, $35, $94, $a3, $34, 0, $2a, 0, $1, 0, $6, 0, 0, 0, $6d, $61, $74, $72, $69, $78,
$e, 0, $3, 0, $10, 0, 0, 0, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0, $9, 0,
0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42, $41, $a, 0, $5, 0, $e0, $44, $ff, $35, $7c,
$6c, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $2a, 0, $1, 0, $3, 0, 0, 0, $72,
$65, $64, $14, 0, $2a, 0, $1, 0, $5, 0, 0, 0, $67, $72, $65, $65, $6e, $14, 0, $2a,
0, $1, 0, $4, 0, 0, 0, $62, $6c, $75, $65, $14, 0, $2a, 0, $1, 0, $5, 0, 0,
0, $61, $6c, $70, $68, $61, $14, 0, $b, 0, $1f, 0, $1, 0, $8, 0, 0, 0, $43, $6f,
$6c, $6f, $72, $52, $47, $42, $a, 0, $5, 0, $81, $6e, $e1, $d3, $35, $78, $cf, $11, $8f, $52,
0, $40, $33, $35, $94, $a3, $2a, 0, $1, 0, $3, 0, 0, 0, $72, $65, $64, $14, 0, $2a,
0, $1, 0, $5, 0, 0, 0, $67, $72, $65, $65, $6e, $14, 0, $2a, 0, $1, 0, $4, 0,
0, 0, $62, $6c, $75, $65, $14, 0, $b, 0, $1f, 0, $1, 0, $c, 0, 0, 0, $49, $6e,
$64, $65, $78, $65, $64, $43, $6f, $6c, $6f, $72, $a, 0, $5, 0, $20, $b8, $30, $16, $42, $78,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $5, 0, 0, 0, $69, $6e,
$64, $65, $78, $14, 0, $1, 0, $9, 0, 0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42, $41,
$1, 0, $a, 0, 0, 0, $69, $6e, $64, $65, $78, $43, $6f, $6c, $6f, $72, $14, 0, $b, 0,
$1f, 0, $1, 0, $7, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61, $6e, $a, 0, $5, 0, $a0,
$a6, $7d, $53, $37, $ca, $d0, $11, $94, $1c, 0, $80, $c8, $c, $fa, $7b, $29, 0, $1, 0, $9,
0, 0, 0, $74, $72, $75, $65, $66, $61, $6c, $73, $65, $14, 0, $b, 0, $1f, 0, $1, 0,
$9, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61, $6e, $32, $64, $a, 0, $5, 0, $63, $ae, $85,
$48, $e8, $78, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1, 0, $7, 0, 0, 0, $42,
$6f, $6f, $6c, $65, $61, $6e, $1, 0, $1, 0, 0, 0, $75, $14, 0, $1, 0, $7, 0, 0,
0, $42, $6f, $6f, $6c, $65, $61, $6e, $1, 0, $1, 0, 0, 0, $76, $14, 0, $b, 0, $1f,
0, $1, 0, $c, 0, 0, 0, $4d, $61, $74, $65, $72, $69, $61, $6c, $57, $72, $61, $70, $a,
0, $5, 0, $60, $ae, $85, $48, $e8, $78, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1,
0, $7, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61, $6e, $1, 0, $1, 0, 0, 0, $75, $14,
0, $1, 0, $7, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61, $6e, $1, 0, $1, 0, 0, 0,
$76, $14, 0, $b, 0, $1f, 0, $1, 0, $f, 0, 0, 0, $54, $65, $78, $74, $75, $72, $65,
$46, $69, $6c, $65, $6e, $61, $6d, $65, $a, 0, $5, 0, $e1, $90, $27, $a4, $10, $78, $cf, $11,
$8f, $52, 0, $40, $33, $35, $94, $a3, $31, 0, $1, 0, $8, 0, 0, 0, $66, $69, $6c, $65,
$6e, $61, $6d, $65, $14, 0, $b, 0, $1f, 0, $1, 0, $8, 0, 0, 0, $4d, $61, $74, $65,
$72, $69, $61, $6c, $a, 0, $5, 0, $4d, $ab, $82, $3d, $da, $62, $cf, $11, $ab, $39, 0, $20,
$af, $71, $e4, $33, $1, 0, $9, 0, 0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42, $41, $1,
0, $9, 0, 0, 0, $66, $61, $63, $65, $43, $6f, $6c, $6f, $72, $14, 0, $2a, 0, $1, 0,
$5, 0, 0, 0, $70, $6f, $77, $65, $72, $14, 0, $1, 0, $8, 0, 0, 0, $43, $6f, $6c,
$6f, $72, $52, $47, $42, $1, 0, $d, 0, 0, 0, $73, $70, $65, $63, $75, $6c, $61, $72, $43,
$6f, $6c, $6f, $72, $14, 0, $1, 0, $8, 0, 0, 0, $43, $6f, $6c, $6f, $72, $52, $47, $42,
$1, 0, $d, 0, 0, 0, $65, $6d, $69, $73, $73, $69, $76, $65, $43, $6f, $6c, $6f, $72, $14,
0, $e, 0, $12, 0, $12, 0, $12, 0, $f, 0, $b, 0, $1f, 0, $1, 0, $8, 0, 0,
0, $4d, $65, $73, $68, $46, $61, $63, $65, $a, 0, $5, 0, $5f, $ab, $82, $3d, $da, $62, $cf,
$11, $ab, $39, 0, $20, $af, $71, $e4, $33, $29, 0, $1, 0, $12, 0, 0, 0, $6e, $46, $61,
$63, $65, $56, $65, $72, $74, $65, $78, $49, $6e, $64, $69, $63, $65, $73, $14, 0, $34, 0, $29,
0, $1, 0, $11, 0, 0, 0, $66, $61, $63, $65, $56, $65, $72, $74, $65, $78, $49, $6e, $64,
$69, $63, $65, $73, $e, 0, $1, 0, $12, 0, 0, 0, $6e, $46, $61, $63, $65, $56, $65, $72,
$74, $65, $78, $49, $6e, $64, $69, $63, $65, $73, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0,
$d, 0, 0, 0, $4d, $65, $73, $68, $46, $61, $63, $65, $57, $72, $61, $70, $73, $a, 0, $5,
0, $c0, $c5, $1e, $ed, $a8, $c0, $d0, $11, $94, $1c, 0, $80, $c8, $c, $fa, $7b, $29, 0, $1,
0, $f, 0, 0, 0, $6e, $46, $61, $63, $65, $57, $72, $61, $70, $56, $61, $6c, $75, $65, $73,
$14, 0, $34, 0, $1, 0, $9, 0, 0, 0, $42, $6f, $6f, $6c, $65, $61, $6e, $32, $64, $1,
0, $e, 0, 0, 0, $66, $61, $63, $65, $57, $72, $61, $70, $56, $61, $6c, $75, $65, $73, $e,
0, $1, 0, $f, 0, 0, 0, $6e, $46, $61, $63, $65, $57, $72, $61, $70, $56, $61, $6c, $75,
$65, $73, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0, $11, 0, 0, 0, $4d, $65, $73, $68,
$54, $65, $78, $74, $75, $72, $65, $43, $6f, $6f, $72, $64, $73, $a, 0, $5, 0, $40, $3f, $f2,
$f6, $86, $76, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $e, 0, 0,
0, $6e, $54, $65, $78, $74, $75, $72, $65, $43, $6f, $6f, $72, $64, $73, $14, 0, $34, 0, $1,
0, $8, 0, 0, 0, $43, $6f, $6f, $72, $64, $73, $32, $64, $1, 0, $d, 0, 0, 0, $74,
$65, $78, $74, $75, $72, $65, $43, $6f, $6f, $72, $64, $73, $e, 0, $1, 0, $e, 0, 0, 0,
$6e, $54, $65, $78, $74, $75, $72, $65, $43, $6f, $6f, $72, $64, $73, $f, 0, $14, 0, $b, 0,
$1f, 0, $1, 0, $10, 0, 0, 0, $4d, $65, $73, $68, $4d, $61, $74, $65, $72, $69, $61, $6c,
$4c, $69, $73, $74, $a, 0, $5, 0, $42, $3f, $f2, $f6, $86, $76, $cf, $11, $8f, $52, 0, $40,
$33, $35, $94, $a3, $29, 0, $1, 0, $a, 0, 0, 0, $6e, $4d, $61, $74, $65, $72, $69, $61,
$6c, $73, $14, 0, $29, 0, $1, 0, $c, 0, 0, 0, $6e, $46, $61, $63, $65, $49, $6e, $64,
$65, $78, $65, $73, $14, 0, $34, 0, $29, 0, $1, 0, $b, 0, 0, 0, $66, $61, $63, $65,
$49, $6e, $64, $65, $78, $65, $73, $e, 0, $1, 0, $c, 0, 0, 0, $6e, $46, $61, $63, $65,
$49, $6e, $64, $65, $78, $65, $73, $f, 0, $14, 0, $e, 0, $1, 0, $8, 0, 0, 0, $4d,
$61, $74, $65, $72, $69, $61, $6c, $f, 0, $b, 0, $1f, 0, $1, 0, $b, 0, 0, 0, $4d,
$65, $73, $68, $4e, $6f, $72, $6d, $61, $6c, $73, $a, 0, $5, 0, $43, $3f, $f2, $f6, $86, $76,
$cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $8, 0, 0, 0, $6e, $4e,
$6f, $72, $6d, $61, $6c, $73, $14, 0, $34, 0, $1, 0, $6, 0, 0, 0, $56, $65, $63, $74,
$6f, $72, $1, 0, $7, 0, 0, 0, $6e, $6f, $72, $6d, $61, $6c, $73, $e, 0, $1, 0, $8,
0, 0, 0, $6e, $4e, $6f, $72, $6d, $61, $6c, $73, $f, 0, $14, 0, $29, 0, $1, 0, $c,
0, 0, 0, $6e, $46, $61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73, $14, 0, $34, 0, $1,
0, $8, 0, 0, 0, $4d, $65, $73, $68, $46, $61, $63, $65, $1, 0, $b, 0, 0, 0, $66,
$61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73, $e, 0, $1, 0, $c, 0, 0, 0, $6e, $46,
$61, $63, $65, $4e, $6f, $72, $6d, $61, $6c, $73, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0,
$10, 0, 0, 0, $4d, $65, $73, $68, $56, $65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72, $73,
$a, 0, $5, 0, $21, $b8, $30, $16, $42, $78, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3,
$29, 0, $1, 0, $d, 0, 0, 0, $6e, $56, $65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72,
$73, $14, 0, $34, 0, $1, 0, $c, 0, 0, 0, $49, $6e, $64, $65, $78, $65, $64, $43, $6f,
$6c, $6f, $72, $1, 0, $c, 0, 0, 0, $76, $65, $72, $74, $65, $78, $43, $6f, $6c, $6f, $72,
$73, $e, 0, $1, 0, $d, 0, 0, 0, $6e, $56, $65, $72, $74, $65, $78, $43, $6f, $6c, $6f,
$72, $73, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0, $4, 0, 0, 0, $4d, $65, $73, $68,
$a, 0, $5, 0, $44, $ab, $82, $3d, $da, $62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33,
$29, 0, $1, 0, $9, 0, 0, 0, $6e, $56, $65, $72, $74, $69, $63, $65, $73, $14, 0, $34,
0, $1, 0, $6, 0, 0, 0, $56, $65, $63, $74, $6f, $72, $1, 0, $8, 0, 0, 0, $76,
$65, $72, $74, $69, $63, $65, $73, $e, 0, $1, 0, $9, 0, 0, 0, $6e, $56, $65, $72, $74,
$69, $63, $65, $73, $f, 0, $14, 0, $29, 0, $1, 0, $6, 0, 0, 0, $6e, $46, $61, $63,
$65, $73, $14, 0, $34, 0, $1, 0, $8, 0, 0, 0, $4d, $65, $73, $68, $46, $61, $63, $65,
$1, 0, $5, 0, 0, 0, $66, $61, $63, $65, $73, $e, 0, $1, 0, $6, 0, 0, 0, $6e,
$46, $61, $63, $65, $73, $f, 0, $14, 0, $e, 0, $12, 0, $12, 0, $12, 0, $f, 0, $b,
0, $1f, 0, $1, 0, $14, 0, 0, 0, $46, $72, $61, $6d, $65, $54, $72, $61, $6e, $73, $66,
$6f, $72, $6d, $4d, $61, $74, $72, $69, $78, $a, 0, $5, 0, $41, $3f, $f2, $f6, $86, $76, $cf,
$11, $8f, $52, 0, $40, $33, $35, $94, $a3, $1, 0, $9, 0, 0, 0, $4d, $61, $74, $72, $69,
$78, $34, $78, $34, $1, 0, $b, 0, 0, 0, $66, $72, $61, $6d, $65, $4d, $61, $74, $72, $69,
$78, $14, 0, $b, 0, $1f, 0, $1, 0, $5, 0, 0, 0, $46, $72, $61, $6d, $65, $a, 0,
$5, 0, $46, $ab, $82, $3d, $da, $62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $e, 0,
$12, 0, $12, 0, $12, 0, $f, 0, $b, 0, $1f, 0, $1, 0, $9, 0, 0, 0, $46, $6c,
$6f, $61, $74, $4b, $65, $79, $73, $a, 0, $5, 0, $a9, $46, $dd, $10, $5b, $77, $cf, $11, $8f,
$52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $7, 0, 0, 0, $6e, $56, $61, $6c, $75,
$65, $73, $14, 0, $34, 0, $2a, 0, $1, 0, $6, 0, 0, 0, $76, $61, $6c, $75, $65, $73,
$e, 0, $1, 0, $7, 0, 0, 0, $6e, $56, $61, $6c, $75, $65, $73, $f, 0, $14, 0, $b,
0, $1f, 0, $1, 0, $e, 0, 0, 0, $54, $69, $6d, $65, $64, $46, $6c, $6f, $61, $74, $4b,
$65, $79, $73, $a, 0, $5, 0, $80, $b1, $6, $f4, $3b, $7b, $cf, $11, $8f, $52, 0, $40, $33,
$35, $94, $a3, $29, 0, $1, 0, $4, 0, 0, 0, $74, $69, $6d, $65, $14, 0, $1, 0, $9,
0, 0, 0, $46, $6c, $6f, $61, $74, $4b, $65, $79, $73, $1, 0, $6, 0, 0, 0, $74, $66,
$6b, $65, $79, $73, $14, 0, $b, 0, $1f, 0, $1, 0, $c, 0, 0, 0, $41, $6e, $69, $6d,
$61, $74, $69, $6f, $6e, $4b, $65, $79, $a, 0, $5, 0, $a8, $46, $dd, $10, $5b, $77, $cf, $11,
$8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $7, 0, 0, 0, $6b, $65, $79, $54,
$79, $70, $65, $14, 0, $29, 0, $1, 0, $5, 0, 0, 0, $6e, $4b, $65, $79, $73, $14, 0,
$34, 0, $1, 0, $e, 0, 0, 0, $54, $69, $6d, $65, $64, $46, $6c, $6f, $61, $74, $4b, $65,
$79, $73, $1, 0, $4, 0, 0, 0, $6b, $65, $79, $73, $e, 0, $1, 0, $5, 0, 0, 0,
$6e, $4b, $65, $79, $73, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0, $10, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $4f, $70, $74, $69, $6f, $6e, $73, $a, 0, $5, 0, $c0,
$56, $bf, $e2, $f, $84, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $a,
0, 0, 0, $6f, $70, $65, $6e, $63, $6c, $6f, $73, $65, $64, $14, 0, $29, 0, $1, 0, $f,
0, 0, 0, $70, $6f, $73, $69, $74, $69, $6f, $6e, $71, $75, $61, $6c, $69, $74, $79, $14, 0,
$b, 0, $1f, 0, $1, 0, $9, 0, 0, 0, $41, $6e, $69, $6d, $61, $74, $69, $6f, $6e, $a,
0, $5, 0, $4f, $ab, $82, $3d, $da, $62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $e,
0, $12, 0, $12, 0, $12, 0, $f, 0, $b, 0, $1f, 0, $1, 0, $c, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $53, $65, $74, $a, 0, $5, 0, $50, $ab, $82, $3d, $da,
$62, $cf, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $e, 0, $1, 0, $9, 0, 0, 0, $41,
$6e, $69, $6d, $61, $74, $69, $6f, $6e, $f, 0, $b, 0, $1f, 0, $1, 0, $a, 0, 0, 0,
$49, $6e, $6c, $69, $6e, $65, $44, $61, $74, $61, $a, 0, $5, 0, $a0, $ee, $23, $3a, $b1, $94,
$d0, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $e, 0, $1, 0, $6, 0, 0, 0, $42, $49,
$4e, $41, $52, $59, $f, 0, $b, 0, $1f, 0, $1, 0, $3, 0, 0, 0, $55, $72, $6c, $a,
0, $5, 0, $a1, $ee, $23, $3a, $b1, $94, $d0, $11, $ab, $39, 0, $20, $af, $71, $e4, $33, $29,
0, $1, 0, $5, 0, 0, 0, $6e, $55, $72, $6c, $73, $14, 0, $34, 0, $31, 0, $1, 0,
$4, 0, 0, 0, $75, $72, $6c, $73, $e, 0, $1, 0, $5, 0, 0, 0, $6e, $55, $72, $6c,
$73, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0, $f, 0, 0, 0, $50, $72, $6f, $67, $72,
$65, $73, $73, $69, $76, $65, $4d, $65, $73, $68, $a, 0, $5, 0, $60, $c3, $63, $8a, $7d, $99,
$d0, $11, $94, $1c, 0, $80, $c8, $c, $fa, $7b, $e, 0, $1, 0, $3, 0, 0, 0, $55, $72,
$6c, $13, 0, $1, 0, $a, 0, 0, 0, $49, $6e, $6c, $69, $6e, $65, $44, $61, $74, $61, $f,
0, $b, 0, $1f, 0, $1, 0, $4, 0, 0, 0, $47, $75, $69, $64, $a, 0, $5, 0, $e0,
$90, $27, $a4, $10, $78, $cf, $11, $8f, $52, 0, $40, $33, $35, $94, $a3, $29, 0, $1, 0, $5,
0, 0, 0, $64, $61, $74, $61, $31, $14, 0, $28, 0, $1, 0, $5, 0, 0, 0, $64, $61,
$74, $61, $32, $14, 0, $28, 0, $1, 0, $5, 0, 0, 0, $64, $61, $74, $61, $33, $14, 0,
$34, 0, $2d, 0, $1, 0, $5, 0, 0, 0, $64, $61, $74, $61, $34, $e, 0, $3, 0, $8,
0, 0, 0, $f, 0, $14, 0, $b, 0, $1f, 0, $1, 0, $e, 0, 0, 0, $53, $74, $72,
$69, $6e, $67, $50, $72, $6f, $70, $65, $72, $74, $79, $a, 0, $5, 0, $e0, $21, $f, $7f, $e1,
$bf, $d1, $11, $82, $c0, 0, $a0, $c9, $69, $72, $71, $31, 0, $1, 0, $3, 0, 0, 0, $6b,
$65, $79, $14, 0, $31, 0, $1, 0, $5, 0, 0, 0, $76, $61, $6c, $75, $65, $14, 0, $b,
0, $1f, 0, $1, 0, $b, 0, 0, 0, $50, $72, $6f, $70, $65, $72, $74, $79, $42, $61, $67,
$a, 0, $5, 0, $e1, $21, $f, $7f, $e1, $bf, $d1, $11, $82, $c0, 0, $a0, $c9, $69, $72, $71,
$e, 0, $1, 0, $e, 0, 0, 0, $53, $74, $72, $69, $6e, $67, $50, $72, $6f, $70, $65, $72,
$74, $79, $f, 0, $b, 0, $1f, 0, $1, 0, $e, 0, 0, 0, $45, $78, $74, $65, $72, $6e,
$61, $6c, $56, $69, $73, $75, $61, $6c, $a, 0, $5, 0, $a0, $6a, $11, $98, $ba, $bd, $d1, $11,
$82, $c0, 0, $a0, $c9, $69, $72, $71, $1, 0, $4, 0, 0, 0, $47, $75, $69, $64, $1, 0,
$12, 0, 0, 0, $67, $75, $69, $64, $45, $78, $74, $65, $72, $6e, $61, $6c, $56, $69, $73, $75,
$61, $6c, $14, 0, $e, 0, $12, 0, $12, 0, $12, 0, $f, 0, $b, 0, $1f, 0, $1, 0,
$b, 0, 0, 0, $52, $69, $67, $68, $74, $48, $61, $6e, $64, $65, $64, $a, 0, $5, 0, $a0,
$5e, $5d, $7f, $3a, $d5, $d1, $11, $82, $c0, 0, $a0, $c9, $69, $72, $71, $29, 0, $1, 0, $c,
0, 0, 0, $62, $52, $69, $67, $68, $74, $48, $61, $6e, $64, $65, $64, $14, 0, $b, 0);
D3DRM_XTEMPLATE_BYTES = 3278;
 
//---------------
{$ENDIF}
//DirectInput file
(*==========================================================================;
*
* Copyright (C) 1996-1999 Microsoft Corporation. All Rights Reserved.
* Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dinput.h
* Content: DirectInput include file
*
* DirectX 7.0 Delphi adaptation by Erik Unger, input format
* variable structure & other fixups by Arne Schäpers (as)
*
* Modified: 10-Sep-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
* a.schaepers@digitalpublishing.de
*
***************************************************************************)
****************************************************************************)
 
{ Some notes from as:
1. DirectInput Enum callback functions which are documented with result
type BOOL in the SDK had to be changed to result type integer because the debug
version of DINPUT.DLL (which is the same for SDK versions 5.0, 5.2, 6.0, and 6.1)
explicitely checks for two possible return values:
 
0 - FALSE in C and in Delphi
1 - TRUE in C, defined as DIENUM_CONTINUE
 
In Delphi, TRUE means $FFFFFFFF (= -1) for the LongBool (= BOOL) data
type, and AL = 1 (upper three bytes undefined) for the Boolean data type.
The debug version of DINPUT.DLL will throw an external exception
("invalid return value for callback") when fed with either value.
 
This change affects the following methods:
EnumDevices, EnumObjects, EnumEffects, EnumCreatedEffectObjects
 
2. Windows 98 and DX6 debug versions DInput and DSound
 
Under Windows 98, the "debug" setup of the DirectX SDK 6.x skips DInput.DLL
and DSound.DLL, i.e. makes you end up with the retail version of these two
files without any notice.
The debug versions of DInput.DLL and DSound.DLL can be found in the
\extras\Win98\Win98Dbg folder of the SDK CD; they need to be installed
"manually".
 
This problem has been fixed with DX7 where the SDK installs the debug versions
of DInput and DSound without any "manual" help.
 
}
 
 
var
DInputDLL : HMODULE;
 
{$IFDEF DIRECTX3}
const DIRECTINPUT_VERSION = $0300;
{$ELSE}
const DIRECTINPUT_VERSION = $0700;
const
{$IFDEF DirectX3}
DIRECTINPUT_VERSION = $0300;
{$ENDIF}{$IFDEF DirectX5}
DIRECTINPUT_VERSION = $0500;
{$ENDIF}{$IFDEF DirectX6}
DIRECTINPUT_VERSION = $0500;
{$ENDIF}{$IFDEF DirectX7}
DIRECTINPUT_VERSION = $0700;
{$ENDIF}
 
function DIErrorString(Value: HResult) : string;
{ Class IDs }
 
//type
// TRefGUID = packed record
// case integer of
// 1: (guid : PGUID);
// 2: (dwFlags : DWORD);
// end;
 
(****************************************************************************
*
* Class IDs
*
****************************************************************************)
const
CLSID_DirectInput: TGUID =
(D1:$25E609E0;D2:$B259;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
CLSID_DirectInputDevice: TGUID =
(D1:$25E609E1;D2:$B259;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
CLSID_DirectInput: TGUID = '{25E609E0-B259-11CF-BFC7-444553540000}';
CLSID_DirectInputDevice: TGUID = '{25E609E1-B259-11CF-BFC7-444553540000}';
 
(****************************************************************************
*
* Predefined object types
*
****************************************************************************)
{ Interfaces }
 
GUID_XAxis: TGUID =
(D1:$A36D02E0;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_YAxis: TGUID =
(D1:$A36D02E1;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_ZAxis: TGUID =
(D1:$A36D02E2;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_RxAxis: TGUID =
(D1:$A36D02F4;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_RyAxis: TGUID =
(D1:$A36D02F5;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_RzAxis: TGUID =
(D1:$A36D02E3;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_Slider: TGUID =
(D1:$A36D02E4;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
const
IID_IDirectInputA: TGUID = '{89521360-AA8A-11CF-BFC7-444553540000}';
IID_IDirectInputW: TGUID = '{89521361-AA8A-11CF-BFC7-444553540000}';
IID_IDirectInput2A: TGUID = '{5944E662-AA8A-11CF-BFC7-444553540000}';
IID_IDirectInput2W: TGUID = '{5944E663-AA8A-11CF-BFC7-444553540000}';
IID_IDirectInput7A: TGUID = '{9A4CB684-236D-11D3-8E9D-00C04F6844AE}';
IID_IDirectInput7W: TGUID = '{9A4CB685-236D-11D3-8E9D-00C04F6844AE}';
IID_IDirectInputDeviceA: TGUID = '{5944E680-C92E-11CF-BFC7-444553540000}';
IID_IDirectInputDeviceW: TGUID = '{5944E681-C92E-11CF-BFC7-444553540000}';
IID_IDirectInputDevice2A: TGUID = '{5944E682-C92E-11CF-BFC7-444553540000}';
IID_IDirectInputDevice2W: TGUID = '{5944E683-C92E-11CF-BFC7-444553540000}';
IID_IDirectInputDevice7A: TGUID = '{57D7C6BC-2356-11D3-8E9D-00C04F6844AE}';
IID_IDirectInputDevice7W: TGUID = '{57D7C6BD-2356-11D3-8E9D-00C04F6844AE}';
IID_IDirectInputEffect: TGUID = '{E7E1F7C0-88D2-11D0-9AD0-00A0C9A06E35}';
 
GUID_Button: TGUID =
(D1:$A36D02F0;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_Key: TGUID =
(D1:$55728220;D2:$D33C;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
{ Predefined object types }
 
GUID_POV: TGUID =
(D1:$A36D02F2;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_XAxis: TGUID = '{A36D02E0-C9F3-11CF-BFC7-444553540000}';
GUID_YAxis: TGUID = '{A36D02E1-C9F3-11CF-BFC7-444553540000}';
GUID_ZAxis: TGUID = '{A36D02E2-C9F3-11CF-BFC7-444553540000}';
GUID_RxAxis: TGUID = '{A36D02F4-C9F3-11CF-BFC7-444553540000}';
GUID_RyAxis: TGUID = '{A36D02F5-C9F3-11CF-BFC7-444553540000}';
GUID_RzAxis: TGUID = '{A36D02E3-C9F3-11CF-BFC7-444553540000}';
GUID_Slider: TGUID = '{A36D02E4-C9F3-11CF-BFC7-444553540000}';
GUID_Button: TGUID = '{A36D02F0-C9F3-11CF-BFC7-444553540000}';
GUID_Key: TGUID = '{55728220-D33C-11CF-BFC7-444553540000}';
GUID_POV: TGUID = '{A36D02F2-C9F3-11CF-BFC7-444553540000}';
GUID_Unknown: TGUID = '{A36D02F3-C9F3-11CF-BFC7-444553540000}';
 
GUID_Unknown: TGUID =
(D1:$A36D02F3;D2:$C9F3;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
{ Predefined product GUIDs }
 
(****************************************************************************
*
* Predefined product GUIDs
*
****************************************************************************)
 
GUID_SysMouse: TGUID =
(D1:$6F1D2B60;D2:$D5A0;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_SysKeyboard: TGUID =
(D1:$6F1D2B61;D2:$D5A0;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_Joystick: TGUID =
(D1:$6F1D2B70;D2:$D5A0;D3:$11CF;D4:($BF,$C7,$44,$45,$53,$54,$00,$00));
GUID_SysMouse: TGUID = '{6F1D2B60-D5A0-11CF-BFC7-444553540000}';
GUID_SysKeyboard: TGUID = '{6F1D2B61-D5A0-11CF-BFC7-444553540000}';
GUID_Joystick: TGUID = '{6F1D2B70-D5A0-11CF-BFC7-444553540000}';
GUID_SysMouseEm: TGUID = '{6F1D2B80-D5A0-11CF-BFC7-444553540000}';
GUID_SysMouseEm2: TGUID = '{6F1D2B81-D5A0-11CF-BFC7-444553540000}';
GUID_SysKeyboardEm: TGUID = '{6F1D2B82-D5A0-11CF-BFC7-444553540000}';
GUID_SysKeyboardEm2: TGUID = '{6F1D2B83-D5A0-11CF-BFC7-444553540000}';
 
(****************************************************************************
*
* Predefined force feedback effects
*
****************************************************************************)
{ Predefined force feedback effects }
 
GUID_ConstantForce: TGUID =
(D1:$13541C20;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_RampForce: TGUID =
(D1:$13541C21;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Square: TGUID =
(D1:$13541C22;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Sine: TGUID =
(D1:$13541C23;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Triangle: TGUID =
(D1:$13541C24;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_SawtoothUp: TGUID =
(D1:$13541C25;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_SawtoothDown: TGUID =
(D1:$13541C26;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Spring: TGUID =
(D1:$13541C27;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Damper: TGUID =
(D1:$13541C28;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Inertia: TGUID =
(D1:$13541C29;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_Friction: TGUID =
(D1:$13541C2A;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_CustomForce: TGUID =
(D1:$13541C2B;D2:$8E33;D3:$11D0;D4:($9A,$D0,$00,$A0,$C9,$A0,$6E,$35));
GUID_ConstantForce: TGUID = '{13541C20-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_RampForce: TGUID = '{13541C21-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Square: TGUID = '{13541C22-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Sine: TGUID = '{13541C23-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Triangle: TGUID = '{13541C24-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_SawtoothUp: TGUID = '{13541C25-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_SawtoothDown: TGUID = '{13541C26-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Spring: TGUID = '{13541C27-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Damper: TGUID = '{13541C28-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Inertia: TGUID = '{13541C29-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_Friction: TGUID = '{13541C2A-8E33-11D0-9AD0-00A0C9A06E35}';
GUID_CustomForce: TGUID = '{13541C2B-8E33-11D0-9AD0-00A0C9A06E35}';
 
{ IDirectInputEffect }
 
 
(****************************************************************************
*
* Interfaces and Structures...
*
****************************************************************************)
 
(****************************************************************************
*
* IDirectInputEffect
*
****************************************************************************)
 
const
DIEFT_ALL = $00000000;
DIEFT_ALL = $00000000;
 
DIEFT_CONSTANTFORCE = $00000001;
DIEFT_RAMPFORCE = $00000002;
DIEFT_PERIODIC = $00000003;
DIEFT_CONDITION = $00000004;
DIEFT_CUSTOMFORCE = $00000005;
DIEFT_HARDWARE = $000000FF;
DIEFT_CONSTANTFORCE = $00000001;
DIEFT_RAMPFORCE = $00000002;
DIEFT_PERIODIC = $00000003;
DIEFT_CONDITION = $00000004;
DIEFT_CUSTOMFORCE = $00000005;
DIEFT_HARDWARE = $000000FF;
 
DIEFT_FFATTACK = $00000200;
DIEFT_FFFADE = $00000400;
DIEFT_SATURATION = $00000800;
DIEFT_POSNEGCOEFFICIENTS = $00001000;
DIEFT_POSNEGSATURATION = $00002000;
DIEFT_DEADBAND = $00004000;
DIEFT_STARTDELAY = $00008000;
DIEFT_FFATTACK = $00000200;
DIEFT_FFFADE = $00000400;
DIEFT_SATURATION = $00000800;
DIEFT_POSNEGCOEFFICIENTS = $00001000;
DIEFT_POSNEGSATURATION = $00002000;
DIEFT_DEADBAND = $00004000;
DIEFT_STARTDELAY = $00008000;
 
function DIEFT_GETTYPE(n: variant) : byte;
function DIEFT_GETTYPE(n: DWORD): DWORD;
 
const
DI_DEGREES = 100;
DI_FFNOMINALMAX = 10000;
DI_SECONDS = 1000000;
DI_DEGREES = 100;
DI_FFNOMINALMAX = 10000;
DI_SECONDS = 1000000;
 
type
PDIConstantForce = ^TDIConstantForce;
TDIConstantForce = packed record
lMagnitude : LongInt;
TDIConstantForce = record
lMagnitude: Longint;
end;
 
DICONSTANTFORCE = TDIConstantForce;
LPDICONSTANTFORCE = PDIConstantForce;
 
PDIRampForce = ^TDIRampForce;
TDIRampForce = packed record
lStart : LongInt;
lEnd : LongInt;
TDIRampForce = record
lStart: Longint;
lEnd: Longint;
end;
 
DIRAMPFORCE = TDIRampForce;
LPDIRAMPFORCE = PDIRampForce;
 
PDIPeriodic = ^TDIPeriodic;
TDIPeriodic = packed record
dwMagnitude : DWORD;
lOffset : LongInt;
dwPhase : DWORD;
dwPeriod : DWORD;
TDIPeriodic = record
dwMagnitude: DWORD;
lOffset: Longint;
dwPhase: DWORD;
dwPeriod: DWORD;
end;
 
DIPERIODIC = TDIPeriodic;
LPDIPERIODIC = PDIPeriodic;
 
PDICondition = ^TDICondition;
TDICondition = packed record
lOffset : LongInt;
lPositiveCoefficient : LongInt;
lNegativeCoefficient : LongInt;
dwPositiveSaturation : DWORD;
dwNegativeSaturation : DWORD;
lDeadBand : LongInt;
TDICondition = record
lOffset: Longint;
lPositiveCoefficient: Longint;
lNegativeCoefficient: Longint;
dwPositiveSaturation: DWORD;
dwNegativeSaturation: DWORD;
lDeadBand: Longint;
end;
 
DICONDITION = TDICondition;
LPDICONDITION = PDICondition;
 
PDICustomForce = ^TDICustomForce;
TDICustomForce = packed record
cChannels : DWORD;
dwSamplePeriod : DWORD;
cSamples : DWORD;
rglForceData : PLongInt;
TDICustomForce = record
cChannels: DWORD;
dwSamplePeriod: DWORD;
cSamples: DWORD;
rglForceData: PLongint;
end;
 
DICUSTOMFORCE = TDICustomForce;
LPDICUSTOMFORCE = PDICustomForce;
 
PDIEnvelope = ^TDIEnvelope;
TDIEnvelope = packed record
dwSize : DWORD; (* sizeof(DIENVELOPE) *)
dwAttackLevel : DWORD;
dwAttackTime : DWORD; (* Microseconds *)
dwFadeLevel : DWORD;
dwFadeTime : DWORD; (* Microseconds *)
TDIEnvelope = record
dwSize: DWORD; // sizeof(DIENVELOPE)
dwAttackLevel: DWORD;
dwAttackTime: DWORD; // Microseconds
dwFadeLevel: DWORD;
dwFadeTime: DWORD; // Microseconds
end;
 
DIENVELOPE = TDIEnvelope;
LPDIENVELOPE = PDIEnvelope;
 
PDIEffect_DX5 = ^TDIEffect_DX5;
TDIEffect_DX5 = packed record
dwSize : DWORD; (* sizeof(DIEFFECT) *)
dwFlags : DWORD; (* DIEFF_* *)
dwDuration : DWORD; (* Microseconds *)
dwSamplePeriod : DWORD; (* Microseconds *)
dwGain : DWORD;
dwTriggerButton : DWORD; (* or DIEB_NOTRIGGER *)
dwTriggerRepeatInterval : DWORD; (* Microseconds *)
cAxes : DWORD; (* Number of axes *)
rgdwAxes : PDWORD; (* Array of axes *)
rglDirection : PLongInt; (* Array of directions *)
lpEnvelope : PDIEnvelope; (* Optional *)
cbTypeSpecificParams : DWORD; (* Size of params *)
lpvTypeSpecificParams : pointer; (* Pointer to params *)
TDIEffect_DX5 = record
dwSize: DWORD; // sizeof(DIEFFECT)
dwFlags: DWORD; // DIEFF_*
dwDuration: DWORD; // Microseconds
dwSamplePeriod: DWORD; // Microseconds
dwGain: DWORD;
dwTriggerButton: DWORD; // or DIEB_NOTRIGGER
dwTriggerRepeatInterval: DWORD; // Microseconds
cAxes: DWORD; // Number of axes
rgdwAxes: PDWORD; // arrayof axes
rglDirection: PLongint; // arrayof directions
lpEnvelope: PDIEnvelope; // Optional
cbTypeSpecificParams: DWORD; // Size of params
lpvTypeSpecificParams: Pointer; // Pointer to params
end;
 
PDIEffect_DX6 = ^TDIEffect_DX6;
TDIEffect_DX6 = packed record
dwSize : DWORD; (* sizeof(DIEFFECT) *)
dwFlags : DWORD; (* DIEFF_* *)
dwDuration : DWORD; (* Microseconds *)
dwSamplePeriod : DWORD; (* Microseconds *)
dwGain : DWORD;
dwTriggerButton : DWORD; (* or DIEB_NOTRIGGER *)
dwTriggerRepeatInterval : DWORD; (* Microseconds *)
cAxes : DWORD; (* Number of axes *)
rgdwAxes : PDWORD; (* Array of axes *)
rglDirection : PLongInt; (* Array of directions *)
lpEnvelope : PDIEnvelope; (* Optional *)
cbTypeSpecificParams : DWORD; (* Size of params *)
lpvTypeSpecificParams : pointer; (* Pointer to params *)
dwStartDelay: DWORD; (* Microseconds *)
TDIEffect_DX6 = record
dwSize: DWORD; // sizeof(DIEFFECT)
dwFlags: DWORD; // DIEFF_*
dwDuration: DWORD; // Microseconds
dwSamplePeriod: DWORD; // Microseconds
dwGain: DWORD;
dwTriggerButton: DWORD; // or DIEB_NOTRIGGER
dwTriggerRepeatInterval: DWORD; // Microseconds
cAxes: DWORD; // Number of axes
rgdwAxes: PDWORD; // arrayof axes
rglDirection: PLongint; // arrayof directions
lpEnvelope: PDIEnvelope; // Optional
cbTypeSpecificParams: DWORD; // Size of params
lpvTypeSpecificParams: Pointer; // Pointer to params
dwStartDelay: DWORD; // Microseconds
end;
 
PDIEffect = ^TDIEffect;
{$IFDEF DIRECTX5}
{$IFDEF SupportDirectX6}
PDIEffect = PDIEffect_DX6;
TDIEffect = TDIEffect_DX6;
{$ELSE}
PDIEffect = PDIEffect_DX5;
TDIEffect = TDIEffect_DX5;
{$ELSE}
TDIEffect = TDIEffect_DX6;
{$ENDIF}
 
DIEFFECT = TDIEFFECT;
LPDIEFFECT = PDIEFFECT;
 
PDIFileEffect = ^TDIFileEffect;
TDIFileEffect = packed record
dwSize : DWORD;
TDIFileEffect = record
dwSize: DWORD;
GuidEffect: TGUID;
lpDiEffect: PDIEffect;
szFriendlyName : array [0..MAX_PATH-1] of AnsiChar;
szFriendlyName: array[0..MAX_PATH-1] of Char;
end;
 
DIFILEEFFECT = TDIFileEffect;
LPDIFILEEFFECT = PDIFileEffect;
 
TDIEnumEffectsInFileCallback = function(const lpDiFileEf: TDIFileEffect; pvRef: Pointer): BOOL; far pascal;
LPDIENUMEFFECTSINFILECALLBACK = TDIEnumEffectsInFileCallback;
 
const
DIEFF_OBJECTIDS = $00000001;
DIEFF_OBJECTOFFSETS = $00000002;
12219,7 → 8563,7
 
DIEP_DURATION = $00000001;
DIEP_SAMPLEPERIOD = $00000002;
DIEP_GAIN = $00000004;
DIEP_GAIN = $00000004;
DIEP_TRIGGERBUTTON = $00000008;
DIEP_TRIGGERREPEATINTERVAL = $00000010;
DIEP_AXES = $00000020;
12226,12 → 8570,12
DIEP_DIRECTION = $00000040;
DIEP_ENVELOPE = $00000080;
DIEP_TYPESPECIFICPARAMS = $00000100;
{$IFDEF DIRECTX5}
DIEP_ALLPARAMS = $000001FF;
{$ELSE}
DIEP_STARTDELAY = $00000200;
DIEP_ALLPARAMS_DX5 = $000001FF;
{$IFDEF SupportDirectX6}
DIEP_ALLPARAMS = $000003FF;
{$ELSE}
DIEP_ALLPARAMS = $000001FF;
{$ENDIF}
DIEP_START = $20000000;
DIEP_NORESTART = $40000000;
12244,85 → 8588,78
DIEGES_PLAYING = $00000001;
DIEGES_EMULATED = $00000002;
 
 
type
PDIEffEscape = ^TDIEffEscape;
TDIEffEscape = packed record
dwSize : DWORD;
dwCommand : DWORD;
lpvInBuffer : pointer;
cbInBuffer : DWORD;
lpvOutBuffer : pointer;
cbOutBuffer : DWORD;
TDIEffEscape = record
dwSize: DWORD;
dwCommand: DWORD;
lpvInBuffer: Pointer;
cbInBuffer: DWORD;
lpvOutBuffer: Pointer;
cbOutBuffer: DWORD;
end;
 
DIEFFESCAPE = TDIEffEscape;
LPDIEFFESCAPE = PDIEffEscape;
 
//
// IDirectSoundCapture // as: ???
//
IDirectInputEffect = interface (IUnknown)
IDirectInputEffect = interface(IUnknown)
['{E7E1F7C0-88D2-11D0-9AD0-00A0C9A06E35}']
(** IDirectInputEffect methods ***)
function Initialize(hinst: THandle; dwVersion: DWORD;
const rguid: TGUID) : HResult; stdcall;
function GetEffectGuid(var pguid: TGUID) : HResult; stdcall;
function GetParameters(var peff: TDIEffect; dwFlags: DWORD) : HResult; stdcall;
function SetParameters(var peff: TDIEffect; dwFlags: DWORD) : HResult; stdcall;
function Start(dwIterations: DWORD; dwFlags: DWORD) : HResult; stdcall;
function Stop : HResult; stdcall;
function GetEffectStatus(var pdwFlags : DWORD) : HResult; stdcall;
function Download : HResult; stdcall;
function Unload : HResult; stdcall;
function Escape(var pesc: TDIEffEscape) : HResult; stdcall;
// IDirectInputEffect methods
function Initialize(hinst: THandle; dwVersion: DWORD; const rguid: TGUID): HResult; stdcall;
function GetEffectGuid(var pguid: TGUID): HResult; stdcall;
function GetParameters(var peff: TDIEffect; dwFlags: DWORD): HResult; stdcall;
function SetParameters(const peff: TDIEffect; dwFlags: DWORD): HResult; stdcall;
function Start(dwIterations: DWORD; dwFlags: DWORD): HResult; stdcall;
function Stop: HResult; stdcall;
function GetEffectStatus(var pdwFlags: DWORD): HResult; stdcall;
function DownLoad: HResult; stdcall;
function Unload: HResult; stdcall;
function Escape(const pesc: TDIEffEscape): HResult; stdcall;
end;
 
(****************************************************************************
*
* IDirectInputDevice
*
****************************************************************************)
{ IDirectInputDevice }
 
const
DIDEVTYPE_DEVICE = 1;
DIDEVTYPE_MOUSE = 2;
DIDEVTYPE_DEVICE = 1;
DIDEVTYPE_MOUSE = 2;
DIDEVTYPE_KEYBOARD = 3;
DIDEVTYPE_JOYSTICK = 4;
DIDEVTYPE_HID = $00010000;
DIDEVTYPE_HID = $00010000;
 
DIDEVTYPEMOUSE_UNKNOWN = 1;
DIDEVTYPEMOUSE_UNKNOWN = 1;
DIDEVTYPEMOUSE_TRADITIONAL = 2;
DIDEVTYPEMOUSE_FINGERSTICK = 3;
DIDEVTYPEMOUSE_TOUCHPAD = 4;
DIDEVTYPEMOUSE_TRACKBALL = 5;
DIDEVTYPEMOUSE_TOUCHPAD = 4;
DIDEVTYPEMOUSE_TRACKBALL = 5;
 
DIDEVTYPEKEYBOARD_UNKNOWN = 0;
DIDEVTYPEKEYBOARD_PCXT = 1;
DIDEVTYPEKEYBOARD_OLIVETTI = 2;
DIDEVTYPEKEYBOARD_PCAT = 3;
DIDEVTYPEKEYBOARD_PCENH = 4;
DIDEVTYPEKEYBOARD_NOKIA1050 = 5;
DIDEVTYPEKEYBOARD_NOKIA9140 = 6;
DIDEVTYPEKEYBOARD_NEC98 = 7;
DIDEVTYPEKEYBOARD_UNKNOWN = 0;
DIDEVTYPEKEYBOARD_PCXT = 1;
DIDEVTYPEKEYBOARD_OLIVETTI = 2;
DIDEVTYPEKEYBOARD_PCAT = 3;
DIDEVTYPEKEYBOARD_PCENH = 4;
DIDEVTYPEKEYBOARD_NOKIA1050 = 5;
DIDEVTYPEKEYBOARD_NOKIA9140 = 6;
DIDEVTYPEKEYBOARD_NEC98 = 7;
DIDEVTYPEKEYBOARD_NEC98LAPTOP = 8;
DIDEVTYPEKEYBOARD_NEC98106 = 9;
DIDEVTYPEKEYBOARD_JAPAN106 = 10;
DIDEVTYPEKEYBOARD_JAPANAX = 11;
DIDEVTYPEKEYBOARD_J3100 = 12;
DIDEVTYPEKEYBOARD_NEC98106 = 9;
DIDEVTYPEKEYBOARD_JAPAN106 = 10;
DIDEVTYPEKEYBOARD_JAPANAX = 11;
DIDEVTYPEKEYBOARD_J3100 = 12;
 
DIDEVTYPEJOYSTICK_UNKNOWN = 1;
DIDEVTYPEJOYSTICK_UNKNOWN = 1;
DIDEVTYPEJOYSTICK_TRADITIONAL = 2;
DIDEVTYPEJOYSTICK_FLIGHTSTICK = 3;
DIDEVTYPEJOYSTICK_GAMEPAD = 4;
DIDEVTYPEJOYSTICK_RUDDER = 5;
DIDEVTYPEJOYSTICK_WHEEL = 6;
DIDEVTYPEJOYSTICK_GAMEPAD = 4;
DIDEVTYPEJOYSTICK_RUDDER = 5;
DIDEVTYPEJOYSTICK_WHEEL = 6;
DIDEVTYPEJOYSTICK_HEADTRACKER = 7;
 
function GET_DIDEVICE_TYPE(dwDevType: variant) : byte;
function GET_DIDEVICE_SUBTYPE(dwDevType: variant) : byte;
function GET_DIDEVICE_TYPE(dwDevType: DWORD): DWORD;
function GET_DIDEVICE_SUBTYPE(dwDevType: DWORD): DWORD;
 
type
PDIDevCaps_DX3 = ^TDIDevCaps_DX3;
TDIDevCaps_DX3 = packed record
TDIDevCaps_DX3 = record
dwSize: DWORD;
dwFlags: DWORD;
dwDevType: DWORD;
12332,7 → 8669,7
end;
 
PDIDevCaps_DX5 = ^TDIDevCaps_DX5;
TDIDevCaps_DX5 = packed record
TDIDevCaps_DX5 = record
dwSize: DWORD;
dwFlags: DWORD;
dwDevType: DWORD;
12346,18 → 8683,29
dwFFDriverVersion: DWORD;
end;
 
PDIDevCaps = ^TDIDevCaps;
{$IFDEF DIRECTX3}
{$IFDEF DirectX3}
TDIDevCaps = TDIDevCaps_DX3;
{$ELSE}
PDIDevCaps = PDIDevCaps_DX3;
{$ENDIF}{$IFDEF DirectX5}
TDIDevCaps = TDIDevCaps_DX5;
PDIDevCaps = PDIDevCaps_DX5;
{$ENDIF}{$IFDEF DirectX6}
TDIDevCaps = TDIDevCaps_DX5;
PDIDevCaps = PDIDevCaps_DX5;
{$ENDIF}{$IFDEF DirectX7}
TDIDevCaps = TDIDevCaps_DX5;
PDIDevCaps = PDIDevCaps_DX5;
{$ENDIF}
 
DIDEVCAPS = TDIDevCaps;
LPDIDEVCAPS = PDIDevCaps;
 
const
DIDC_ATTACHED = $00000001;
DIDC_POLLEDDEVICE = $00000002;
DIDC_EMULATED = $00000004;
DIDC_POLLEDDATAFORMAT = $00000008;
 
DIDC_FORCEFEEDBACK = $00000100;
DIDC_FFATTACK = $00000200;
DIDC_FFFADE = $00000400;
12369,41 → 8717,38
DIDC_ALIAS = $00010000;
DIDC_PHANTOM = $00020000;
 
DIDFT_ALL = $00000000;
DIDFT_ALL = $00000000;
 
DIDFT_RELAXIS = $00000001;
DIDFT_ABSAXIS = $00000002;
DIDFT_AXIS = $00000003;
DIDFT_RELAXIS = $00000001;
DIDFT_ABSAXIS = $00000002;
DIDFT_AXIS = $00000003;
 
DIDFT_PSHBUTTON = $00000004;
DIDFT_TGLBUTTON = $00000008;
DIDFT_BUTTON = $0000000C;
DIDFT_PSHBUTTON = $00000004;
DIDFT_TGLBUTTON = $00000008;
DIDFT_BUTTON = $0000000C;
 
DIDFT_POV = $00000010;
DIDFT_COLLECTION = $00000040;
DIDFT_NODATA = $00000080;
 
DIDFT_ANYINSTANCE = $00FFFF00;
DIDFT_ANYINSTANCE = $00FFFF00;
DIDFT_INSTANCEMASK = DIDFT_ANYINSTANCE;
function DIDFT_MAKEINSTANCE(n: variant) : DWORD;
function DIDFT_GETTYPE(n: variant) : byte;
function DIDFT_GETINSTANCE(n: variant) : DWORD;
const
DIDFT_FFACTUATOR = $01000000;
DIDFT_FFEFFECTTRIGGER = $02000000;
DIDFT_OUTPUT = $10000000;
DIDFT_VENDORDEFINED = $04000000;
DIDFT_ALIAS = $08000000;
 
function DIDFT_ENUMCOLLECTION(n: variant) : DWORD;
const
DIDFT_NOCOLLECTION = $00FFFF00;
DIDFT_FFACTUATOR = $01000000;
DIDFT_FFEFFECTTRIGGER = $02000000;
DIDFT_OUTPUT = $10000000;
DIDFT_VENDORDEFINED = $04000000;
DIDFT_ALIAS = $08000000;
DIDFT_NOCOLLECTION = $00FFFF00;
 
function DIDFT_MAKEINSTANCE(n: WORD): DWORD;
function DIDFT_GETTYPE(n: DWORD): DWORD;
function DIDFT_GETINSTANCE(n: DWORD): WORD;
function DIDFT_ENUMCOLLECTION(n: WORD): DWORD;
 
 
type
PDIObjectDataFormat = ^TDIObjectDataFormat;
TDIObjectDataFormat = packed record
TDIObjectDataFormat = record
pguid: PGUID;
dwOfs: DWORD;
dwType: DWORD;
12410,56 → 8755,45
dwFlags: DWORD;
end;
 
DIOBJECTDATAFORMAT = TDIObjectDataFormat;
LPDIOBJECTDATAFORMAT = PDIObjectDataFormat;
 
PDIDataFormat = ^TDIDataFormat;
TDIDataFormat = packed record
dwSize: DWORD;
TDIDataFormat = record
dwSize: DWORD;
dwObjSize: DWORD;
dwFlags: DWORD;
dwDataSize: DWORD;
dwNumObjs: DWORD;
dwFlags: DWORD;
dwDataSize: DWORD;
dwNumObjs: DWORD;
rgodf: PDIObjectDataFormat;
end;
 
DIDATAFORMAT = TDIDataFormat;
LPDIDATAFORMAT = PDIDataFormat;
 
const
DIDF_ABSAXIS = $00000001;
DIDF_RELAXIS = $00000002;
 
type
PDIDeviceObjectInstance_DX3A = ^TDIDeviceObjectInstance_DX3A;
TDIDeviceObjectInstance_DX3A = packed record
PDIDeviceObjectInstanceA_DX3 = ^TDIDeviceObjectInstanceA_DX3;
TDIDeviceObjectInstanceA_DX3 = record
dwSize: DWORD;
guidType: TGUID;
dwOfs: DWORD;
dwType: DWORD;
dwFlags: DWORD;
tszName: Array [0..MAX_PATH-1] of CHAR;
tszName: array[0..MAX_PATH-1] of CHAR;
end;
 
PDIDeviceObjectInstance_DX3W = ^TDIDeviceObjectInstance_DX3W;
TDIDeviceObjectInstance_DX3W = packed record
PDIDeviceObjectInstanceA_DX5 = ^TDIDeviceObjectInstanceA_DX5;
TDIDeviceObjectInstanceA_DX5 = record
dwSize: DWORD;
guidType: TGUID;
dwOfs: DWORD;
dwType: DWORD;
dwFlags: DWORD;
tszName: Array [0..MAX_PATH-1] of WCHAR;
end;
 
PDIDeviceObjectInstance_DX3 = ^TDIDeviceObjectInstance_DX3;
{$IFDEF UNICODE}
TDIDeviceObjectInstance_DX3 = TDIDeviceObjectInstance_DX3W;
{$ELSE}
TDIDeviceObjectInstance_DX3 = TDIDeviceObjectInstance_DX3A;
{$ENDIF}
 
PDIDeviceObjectInstance_DX5A = ^TDIDeviceObjectInstance_DX5A;
TDIDeviceObjectInstance_DX5A = packed record
dwSize: DWORD;
guidType: TGUID;
dwOfs: DWORD;
dwType: DWORD;
dwFlags: DWORD;
tszName: Array [0..MAX_PATH-1] of CHAR;
tszName: array[0..MAX_PATH-1] of CHAR;
dwFFMaxForce: DWORD;
dwFFForceResolution: DWORD;
wCollectionNumber: WORD;
12471,14 → 8805,41
wReserved: WORD;
end;
 
PDIDeviceObjectInstance_DX5W = ^TDIDeviceObjectInstance_DX5W;
TDIDeviceObjectInstance_DX5W = packed record
{$IFDEF DirectX3}
TDIDeviceObjectInstanceA = TDIDeviceObjectInstanceA_DX3;
PDIDeviceObjectInstanceA = PDIDeviceObjectInstanceA_DX3;
{$ENDIF}{$IFDEF DirectX5}
TDIDeviceObjectInstanceA = TDIDeviceObjectInstanceA_DX5;
PDIDeviceObjectInstanceA = PDIDeviceObjectInstanceA_DX5;
{$ENDIF}{$IFDEF DirectX6}
TDIDeviceObjectInstanceA = TDIDeviceObjectInstanceA_DX5;
PDIDeviceObjectInstanceA = PDIDeviceObjectInstanceA_DX5;
{$ENDIF}{$IFDEF DirectX7}
TDIDeviceObjectInstanceA = TDIDeviceObjectInstanceA_DX5;
PDIDeviceObjectInstanceA = PDIDeviceObjectInstanceA_DX5;
{$ENDIF}
 
DIDEVICEOBJECTINSTANCEA = TDIDeviceObjectInstanceA;
LPDIDEVICEOBJECTINSTANCEA = PDIDeviceObjectInstanceA;
 
PDIDeviceObjectInstanceW_DX3 = ^TDIDeviceObjectInstanceW_DX3;
TDIDeviceObjectInstanceW_DX3 = record
dwSize: DWORD;
guidType: TGUID;
dwOfs: DWORD;
dwType: DWORD;
dwFlags: DWORD;
tszName: Array [0..MAX_PATH-1] of WCHAR;
tszName: array[0..MAX_PATH-1] of WCHAR;
end;
 
PDIDeviceObjectInstanceW_DX5 = ^TDIDeviceObjectInstanceW_DX5;
TDIDeviceObjectInstanceW_DX5 = record
dwSize: DWORD;
guidType: TGUID;
dwOfs: DWORD;
dwType: DWORD;
dwFlags: DWORD;
tszName: array[0..MAX_PATH-1] of WCHAR;
dwFFMaxForce: DWORD;
dwFFForceResolution: DWORD;
wCollectionNumber: WORD;
12490,53 → 8851,54
wReserved: WORD;
end;
 
PDIDeviceObjectInstance_DX5 = ^TDIDeviceObjectInstance_DX5;
{$IFDEF UNICODE}
TDIDeviceObjectInstance_DX5 = TDIDeviceObjectInstance_DX5W;
{$ELSE}
TDIDeviceObjectInstance_DX5 = TDIDeviceObjectInstance_DX5A;
{$IFDEF DirectX3}
TDIDeviceObjectInstanceW = TDIDeviceObjectInstanceW_DX3;
PDIDeviceObjectInstanceW = PDIDeviceObjectInstanceW_DX3;
{$ENDIF}{$IFDEF DirectX5}
TDIDeviceObjectInstanceW = TDIDeviceObjectInstanceW_DX5;
PDIDeviceObjectInstanceW = PDIDeviceObjectInstanceW_DX5;
{$ENDIF}{$IFDEF DirectX6}
TDIDeviceObjectInstanceW = TDIDeviceObjectInstanceW_DX5;
PDIDeviceObjectInstanceW = PDIDeviceObjectInstanceW_DX5;
{$ENDIF}{$IFDEF DirectX7}
TDIDeviceObjectInstanceW = TDIDeviceObjectInstanceW_DX5;
PDIDeviceObjectInstanceW = PDIDeviceObjectInstanceW_DX5;
{$ENDIF}
 
PDIDeviceObjectInstanceA = ^TDIDeviceObjectInstanceA;
PDIDeviceObjectInstanceW = ^TDIDeviceObjectInstanceA;
PDIDeviceObjectInstance = ^TDIDeviceObjectInstance;
{$IFDEF DIRECTX3}
TDIDeviceObjectInstanceA = TDIDeviceObjectInstance_DX3A;
TDIDeviceObjectInstanceW = TDIDeviceObjectInstance_DX3W;
TDIDeviceObjectInstance = TDIDeviceObjectInstance_DX3;
{$ELSE}
TDIDeviceObjectInstanceA = TDIDeviceObjectInstance_DX5A;
TDIDeviceObjectInstanceW = TDIDeviceObjectInstance_DX5W;
TDIDeviceObjectInstance = TDIDeviceObjectInstance_DX5;
{$ENDIF}
DIDEVICEOBJECTINSTANCEW = TDIDeviceObjectInstanceW;
LPDIDEVICEOBJECTINSTANCEW = PDIDeviceObjectInstanceW;
 
// Bug fix (and deviation from the SDK). Callback *must* return
// DIENUM_STOP (= 0) or DIENUM_CONTINUE (=1) in order to work
// with the debug version of DINPUT.DLL
TDIEnumDeviceObjectsCallbackA = function (
var lpddoi: TDIDeviceObjectInstanceA; pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumDeviceObjectsCallbackW = function (
var lpddoi: TDIDeviceObjectInstanceW; pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumDeviceObjectsCallback = function (
var lpddoi: TDIDeviceObjectInstance; pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
TDIDeviceObjectInstance = TDIDeviceObjectInstanceA;
PDIDeviceObjectInstance = PDIDeviceObjectInstanceA;
 
TDIEnumDeviceObjectsProc = function (
var lpddoi: TDIDeviceObjectInstance; pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
DIDEVICEOBJECTINSTANCE = TDIDeviceObjectInstance;
LPDIDEVICEOBJECTINSTANCE = PDIDeviceObjectInstance;
 
TDIEnumDeviceObjectsCallbackA = function(const peff: TDIDeviceObjectInstanceA;
pvRef: Pointer): HResult; stdcall;
LPDIENUMDEVICEOBJECTSCALLBACKA = TDIEnumDeviceObjectsCallbackA;
 
TDIEnumDeviceObjectsCallbackW = function(const peff: TDIDeviceObjectInstanceW;
pvRef: Pointer): HResult; stdcall;
LPDIENUMDEVICEOBJECTSCALLBACKW = TDIEnumDeviceObjectsCallbackW;
 
TDIEnumDeviceObjectsCallback = TDIEnumDeviceObjectsCallbackA;
LPDIENUMDEVICEOBJECTSCALLBACK = TDIEnumDeviceObjectsCallback;
 
const
DIDOI_FFACTUATOR = $00000001;
DIDOI_FFEFFECTTRIGGER = $00000002;
DIDOI_POLLED = $00008000;
DIDOI_ASPECTPOSITION = $00000100;
DIDOI_ASPECTVELOCITY = $00000200;
DIDOI_ASPECTACCEL = $00000300;
DIDOI_ASPECTFORCE = $00000400;
DIDOI_ASPECTMASK = $00000F00;
DIDOI_GUIDISUSAGE = $00010000;
DIDOI_FFACTUATOR = $00000001;
DIDOI_FFEFFECTTRIGGER = $00000002;
DIDOI_POLLED = $00008000;
DIDOI_ASPECTPOSITION = $00000100;
DIDOI_ASPECTVELOCITY = $00000200;
DIDOI_ASPECTACCEL = $00000300;
DIDOI_ASPECTFORCE = $00000400;
DIDOI_ASPECTMASK = $00000F00;
DIDOI_GUIDISUSAGE = $00010000;
 
type
PDIPropHeader = ^TDIPropHeader;
TDIPropHeader = packed record
TDIPropHeader = record
dwSize: DWORD;
dwHeaderSize: DWORD;
dwObj: DWORD;
12543,111 → 8905,106
dwHow: DWORD;
end;
 
DIPROPHEADER = TDIPropHeader;
LPDIPROPHEADER = PDIPropHeader;
 
const
DIPH_DEVICE = 0;
DIPH_DEVICE = 0;
DIPH_BYOFFSET = 1;
DIPH_BYID = 2;
DIPH_BYUSAGE = 3;
DIPH_BYID = 2;
DIPH_BYUSAGE = 3;
 
function DIMAKEUSAGEDWORD(UsagePage, Usage: WORD) : DWORD;
function DIMAKEUSAGEDWORD(UsagePage, Usage: Word): DWORD;
 
type
PDIPropDWord = ^TDIPropDWord;
TDIPropDWord = packed record
PDIPropDWORD = ^TDIPropDWORD;
TDIPropDWORD = record
diph: TDIPropHeader;
dwData: DWORD;
end;
 
DIPROPDWORD = TDIPropDWORD;
LPDIPROPDWORD = PDIPropDWORD;
 
PDIPropRange = ^TDIPropRange;
TDIPropRange = packed record
TDIPropRange = record
diph: TDIPropHeader;
lMin: Longint;
lMax: Longint;
end;
 
const
DIPROPRANGE_NOMIN = $80000000;
DIPROPRANGE_NOMAX = $7FFFFFFF;
DIPROPRANGE = TDIPropRange;
LPDIPROPRANGE = PDIPropRange;
 
type
PDIPropCal = ^TDIPropCal;
TDIPropCal = packed record
TDIPropCal = record
diph: TDIPropHeader;
lMin: LongInt;
lCenter: LongInt;
lMax: LongInt;
lMin: Longint;
lCenter: Longint;
lMax: Longint;
end;
 
DIPROPCAL = TDIPropCal;
LPDIPROPCAL = PDIPropCal;
 
PDIPropGUIDAndPath = ^TDIPropGUIDAndPath;
TDIPropGUIDAndPath = packed record
TDIPropGUIDAndPath = record
diph: TDIPropHeader;
guidClass: TGUID;
wszPath: array [0..MAX_PATH-1] of WideChar;
wszPath: array[0..MAX_PATH-1] of WCHAR;
end;
 
DIPROPGUIDANDPATH = TDIPropGUIDAndPath;
LPDIPROPGUIDANDPATH = PDIPropGUIDAndPath;
 
PDIPropString = ^TDIPropString;
TDIPropString = packed record
TDIPropString = record
diph: TDIPropHeader;
wsz: array [0..MAX_PATH-1] of WideChar;
wsz: array[0..MAX_PATH-1] of WCHAR;
end;
 
type
MAKEDIPROP = PGUID;
DIPROPSTRING = TDIPropString;
LPDIPROPSTRING = PDIPropString;
 
const
DIPROP_BUFFERSIZE = MAKEDIPROP(1);
const
DIPROPRANGE_NOMIN = $80000000;
DIPROPRANGE_NOMAX = $7FFFFFFF;
 
DIPROP_AXISMODE = MAKEDIPROP(2);
DIPROP_BUFFERSIZE = PGUID(1);
DIPROP_AXISMODE = PGUID(2);
 
DIPROPAXISMODE_ABS = 0;
DIPROPAXISMODE_REL = 1;
DIPROPAXISMODE_ABS = 0;
DIPROPAXISMODE_REL = 1;
 
DIPROP_GRANULARITY = MAKEDIPROP(3);
DIPROP_GRANULARITY = PGUID(3);
DIPROP_RANGE = PGUID(4);
DIPROP_DEADZONE = PGUID(5);
DIPROP_SATURATION = PGUID(6);
DIPROP_FFGAIN = PGUID(7);
DIPROP_FFLOAD = PGUID(8);
DIPROP_AUTOCENTER = PGUID(9);
 
DIPROP_RANGE = MAKEDIPROP(4);
 
DIPROP_DEADZONE = MAKEDIPROP(5);
 
DIPROP_SATURATION = MAKEDIPROP(6);
 
DIPROP_FFGAIN = MAKEDIPROP(7);
 
DIPROP_FFLOAD = MAKEDIPROP(8);
 
DIPROP_AUTOCENTER = MAKEDIPROP(9);
 
DIPROPAUTOCENTER_OFF = 0;
DIPROPAUTOCENTER_ON = 1;
DIPROPAUTOCENTER_ON = 1;
 
DIPROP_CALIBRATIONMODE = MAKEDIPROP(10);
DIPROP_CALIBRATIONMODE = PGUID(10);
 
DIPROPCALIBRATIONMODE_COOKED = 0;
DIPROPCALIBRATIONMODE_RAW = 1;
DIPROPCALIBRATIONMODE_RAW = 1;
 
DIPROP_CALIBRATION = MAKEDIPROP(11);
DIPROP_CALIBRATION = PGUID(11);
DIPROP_GUIDANDPATH = PGUID(12);
DIPROP_INSTANCENAME = PGUID(13);
DIPROP_PRODUCTNAME = PGUID(14);
DIPROP_JOYSTICKID = PGUID(15);
DIPROP_GETPORTDISPLAYNAME = PGUID(16);
DIPROP_ENABLEREPORTID = PGUID(17);
DIPROP_GETPHYSICALRANGE = PGUID(18);
DIPROP_GETLOGICALRANGE = PGUID(19);
 
DIPROP_GUIDANDPATH = MAKEDIPROP(12);
 
DIPROP_INSTANCENAME = MAKEDIPROP(13);
 
DIPROP_PRODUCTNAME = MAKEDIPROP(14);
 
DIPROP_JOYSTICKID = MAKEDIPROP(15);
 
DIPROP_GETPORTDISPLAYNAME = MAKEDIPROP(16);
 
 
DIPROP_ENABLEREPORTID = MAKEDIPROP(17);
 
 
DIPROP_GETPHYSICALRANGE = MAKEDIPROP(18);
 
DIPROP_GETLOGICALRANGE = MAKEDIPROP(19);
 
 
type
PDIDeviceObjectData = ^TDIDeviceObjectData;
TDIDeviceObjectData = packed record
TDIDeviceObjectData = record
dwOfs: DWORD;
dwData: DWORD;
dwTimeStamp: DWORD;
12654,441 → 9011,339
dwSequence: DWORD;
end;
 
DIDEVICEOBJECTDATA = TDIDeviceObjectData;
LPDIDEVICEOBJECTDATA = PDIDeviceObjectData;
 
const
DIGDD_PEEK = $00000001;
{
#define DISEQUENCE_COMPARE(dwSequence1, cmp, dwSequence2) \
(int) ((dwSequence1) - (dwSequence2)) cmp 0
}
 
DISCL_EXCLUSIVE = $00000001;
DISCL_EXCLUSIVE = $00000001;
DISCL_NONEXCLUSIVE = $00000002;
DISCL_FOREGROUND = $00000004;
DISCL_BACKGROUND = $00000008;
DISCL_NOWINKEY = $00000010;
DISCL_FOREGROUND = $00000004;
DISCL_BACKGROUND = $00000008;
DISCL_NOWINKEY = $00000010;
 
 
type
 
PDIDeviceInstance_DX3A = ^TDIDeviceInstance_DX3A;
TDIDeviceInstance_DX3A = packed record
PDIDeviceInstanceA_DX3 = ^TDIDeviceInstanceA_DX3;
TDIDeviceInstanceA_DX3 = record
dwSize: DWORD;
guidInstance: TGUID;
guidProduct: TGUID;
dwDevType: DWORD;
tszInstanceName: Array [0..MAX_PATH-1] of AnsiChar;
tszProductName: Array [0..MAX_PATH-1] of AnsiChar;
tszInstanceName: array[0..MAX_PATH-1] of CHAR;
tszProductName: array[0..MAX_PATH-1] of CHAR;
end;
 
PDIDeviceInstance_DX3W = ^TDIDeviceInstance_DX3W;
TDIDeviceInstance_DX3W = packed record
PDIDeviceInstanceA_DX5 = ^TDIDeviceInstanceA_DX5;
TDIDeviceInstanceA_DX5 = record
dwSize: DWORD;
guidInstance: TGUID;
guidProduct: TGUID;
dwDevType: DWORD;
tszInstanceName: Array [0..MAX_PATH-1] of WideChar;
tszProductName: Array [0..MAX_PATH-1] of WideChar;
tszInstanceName: array[0..MAX_PATH-1] of CHAR;
tszProductName: array[0..MAX_PATH-1] of CHAR;
guidFFDriver: TGUID;
wUsagePage: WORD;
wUsage: WORD;
end;
 
PDIDeviceInstance_DX3 = ^TDIDeviceInstance_DX3;
{$IFDEF UNICODE}
TDIDeviceInstance_DX3 = TDIDeviceInstance_DX3W;
{$ELSE}
TDIDeviceInstance_DX3 = TDIDeviceInstance_DX3A;
{$IFDEF DirectX3}
TDIDeviceInstanceA = TDIDeviceInstanceA_DX3;
PDIDeviceInstanceA = PDIDeviceInstanceA_DX3;
{$ENDIF}{$IFDEF DirectX5}
TDIDeviceInstanceA = TDIDeviceInstanceA_DX5;
PDIDeviceInstanceA = PDIDeviceInstanceA_DX5;
{$ENDIF}{$IFDEF DirectX6}
TDIDeviceInstanceA = TDIDeviceInstanceA_DX5;
PDIDeviceInstanceA = PDIDeviceInstanceA_DX5;
{$ENDIF}{$IFDEF DirectX7}
TDIDeviceInstanceA = TDIDeviceInstanceA_DX5;
PDIDeviceInstanceA = PDIDeviceInstanceA_DX5;
{$ENDIF}
 
PDIDeviceInstance_DX5A = ^TDIDeviceInstance_DX5A;
TDIDeviceInstance_DX5A = packed record
DIDEVICEINSTANCEA = TDIDeviceInstanceA;
LPDIDEVICEINSTANCEA = PDIDeviceInstanceA;
 
PDIDeviceInstanceW_DX3 = ^TDIDeviceInstanceW_DX3;
TDIDeviceInstanceW_DX3 = record
dwSize: DWORD;
guidInstance: TGUID;
guidProduct: TGUID;
dwDevType: DWORD;
tszInstanceName: Array [0..MAX_PATH-1] of AnsiChar;
tszProductName: Array [0..MAX_PATH-1] of AnsiChar;
guidFFDriver: TGUID;
wUsagePage: WORD;
wUsage: WORD;
tszInstanceName: array[0..MAX_PATH-1] of WCHAR;
tszProductName: array[0..MAX_PATH-1] of WCHAR;
end;
 
PDIDeviceInstance_DX5W = ^TDIDeviceInstance_DX5W;
TDIDeviceInstance_DX5W = packed record
PDIDeviceInstanceW_DX5 = ^TDIDeviceInstanceW_DX5;
TDIDeviceInstanceW_DX5 = record
dwSize: DWORD;
guidInstance: TGUID;
guidProduct: TGUID;
dwDevType: DWORD;
tszInstanceName: Array [0..MAX_PATH-1] of WideChar;
tszProductName: Array [0..MAX_PATH-1] of WideChar;
tszInstanceName: array[0..MAX_PATH-1] of WCHAR;
tszProductName: array[0..MAX_PATH-1] of WCHAR;
guidFFDriver: TGUID;
wUsagePage: WORD;
wUsage: WORD;
end;
 
PDIDeviceInstance_DX5 = ^TDIDeviceInstance_DX5;
{$IFDEF UNICODE}
TDIDeviceInstance_DX5 = TDIDeviceInstance_DX5W;
{$ELSE}
TDIDeviceInstance_DX5 = TDIDeviceInstance_DX5A;
{$IFDEF DirectX3}
TDIDeviceInstanceW = TDIDeviceInstanceW_DX3;
PDIDeviceInstanceW = PDIDeviceInstanceW_DX3;
{$ENDIF}{$IFDEF DirectX5}
TDIDeviceInstanceW = TDIDeviceInstanceW_DX5;
PDIDeviceInstanceW = PDIDeviceInstanceW_DX5;
{$ENDIF}{$IFDEF DirectX6}
TDIDeviceInstanceW = TDIDeviceInstanceW_DX5;
PDIDeviceInstanceW = PDIDeviceInstanceW_DX5;
{$ENDIF}{$IFDEF DirectX7}
TDIDeviceInstanceW = TDIDeviceInstanceW_DX5;
PDIDeviceInstanceW = PDIDeviceInstanceW_DX5;
{$ENDIF}
 
PDIDeviceInstanceA = ^TDIDeviceInstanceA;
PDIDeviceInstanceW = ^TDIDeviceInstanceW;
PDIDeviceInstance = ^TDIDeviceInstance;
{$IFDEF DIRECTX3}
TDIDeviceInstanceA = TDIDeviceInstance_DX3A;
TDIDeviceInstanceW = TDIDeviceInstance_DX3W;
TDIDeviceInstance = TDIDeviceInstance_DX3;
{$ELSE}
TDIDeviceInstanceA = TDIDeviceInstance_DX5A;
TDIDeviceInstanceW = TDIDeviceInstance_DX5W;
TDIDeviceInstance = TDIDeviceInstance_DX5;
{$ENDIF}
DIDEVICEINSTANCEW = TDIDeviceInstanceW;
LPDIDEVICEINSTANCEW = PDIDeviceInstanceW;
 
IDirectInputDeviceA = interface (IUnknown)
['{5944E680-C92E-11CF-BFC7-444553540000}']
(*** IDirectInputDeviceA methods ***)
function GetCapabilities(var lpDIDevCaps: TDIDevCaps) : HResult; stdcall;
function EnumObjects(lpCallback: TDIEnumDeviceObjectsCallbackA;
pvRef: Pointer; dwFlags: DWORD) : HResult; stdcall;
function GetProperty(rguidProp: PGUID; var pdiph: TDIPropHeader) :
HResult; stdcall;
function SetProperty(rguidProp: PGUID; const pdiph: TDIPropHeader) :
HResult; stdcall;
function Acquire : HResult; stdcall;
function Unacquire : HResult; stdcall;
function GetDeviceState(cbData: DWORD; lpvData: Pointer) : HResult; stdcall;
function GetDeviceData(cbObjectData: DWORD; rgdod: PDIDeviceObjectData;
var pdwInOut: DWORD; dwFlags: DWORD) : HResult; stdcall;
function SetDataFormat(var lpdf: TDIDataFormat) : HResult; stdcall;
function SetEventNotification(hEvent: THandle) : HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwFlags: DWORD) : HResult; stdcall;
function GetObjectInfo(var pdidoi: TDIDeviceObjectInstanceA; dwObj: DWORD;
dwHow: DWORD) : HResult; stdcall;
function GetDeviceInfo(var pdidi: TDIDeviceInstanceA) : HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD) : HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD; const rguid: TGUID) : HResult; stdcall;
end;
TDIDeviceInstance = TDIDeviceInstanceA;
PDIDeviceInstance = PDIDeviceInstanceA;
 
IDirectInputDeviceW = interface (IUnknown)
DIDEVICEINSTANCE = TDIDeviceInstance;
LPDIDEVICEINSTANCE = PDIDeviceInstance;
 
IDirectInputDeviceW = interface(IUnknown)
['{5944E681-C92E-11CF-BFC7-444553540000}']
(*** IDirectInputDeviceW methods ***)
function GetCapabilities(var lpDIDevCaps: TDIDevCaps) : HResult; stdcall;
// IDirectInputDeviceW methods
function GetCapabilities(var lpDIDevCaps: TDIDevCaps): HResult; stdcall;
function EnumObjects(lpCallback: TDIEnumDeviceObjectsCallbackW;
pvRef: Pointer; dwFlags: DWORD) : HResult; stdcall;
function GetProperty(rguidProp: PGUID; var pdiph: TDIPropHeader) :
HResult; stdcall;
function SetProperty(rguidProp: PGUID; var pdiph: TDIPropHeader) :
HResult; stdcall;
function Acquire : HResult; stdcall;
function Unacquire : HResult; stdcall;
function GetDeviceState(cbData: DWORD; lpvData: Pointer) : HResult; stdcall;
function GetDeviceData(cbObjectData: DWORD; rgdod: PDIDeviceObjectData;
var pdwInOut: DWORD; dwFlags: DWORD) : HResult; stdcall;
function SetDataFormat(var lpdf: TDIDataFormat) : HResult; stdcall;
function SetEventNotification(hEvent: THandle) : HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwFlags: DWORD) : HResult; stdcall;
pvRef: Pointer; dwFlags: DWORD): HResult; stdcall;
function GetProperty(rguidProp: PGUID; var pdiph: TDIPropHeader): HResult; stdcall;
function SetProperty(rguidProp: PGUID; const pdiph: TDIPropHeader): HResult; stdcall;
function Acquire: HResult; stdcall;
function Unacquire: HResult; stdcall;
function GetDeviceState(cbData: DWORD; var lpvData): HResult; stdcall;
function GetDeviceData(cbObjectData: DWORD; var rgdod: TDIDeviceObjectData;
var pdwInOut: DWORD; dwFlags: DWORD): HResult; stdcall;
function SetDataFormat(const lpdf: TDIDataFormat): HResult; stdcall;
function SetEventNotification(hEvent: THandle): HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwFlags: DWORD): HResult; stdcall;
function GetObjectInfo(var pdidoi: TDIDeviceObjectInstanceW; dwObj: DWORD;
dwHow: DWORD) : HResult; stdcall;
function GetDeviceInfo(var pdidi: TDIDeviceInstanceW) : HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD) : HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD; const rguid: TGUID) : HResult; stdcall;
dwHow: DWORD): HResult; stdcall;
function GetDeviceInfo(var pdidi: TDIDeviceInstanceW): HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD): HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD; const rguid: TGUID): HResult; stdcall;
end;
 
{$IFDEF UNICODE}
IDirectInputDevice = IDirectInputDeviceW;
{$ELSE}
IDirectInputDeviceA = interface(IUnknown)
['{5944E680-C92E-11CF-BFC7-444553540000}']
// IDirectInputDeviceA methods
function GetCapabilities(var lpDIDevCaps: TDIDevCaps): HResult; stdcall;
function EnumObjects(lpCallback: TDIEnumDeviceObjectsCallbackA;
pvRef: Pointer; dwFlags: DWORD): HResult; stdcall;
function GetProperty(rguidProp: PGUID; var pdiph: TDIPropHeader): HResult; stdcall;
function SetProperty(rguidProp: PGUID; const pdiph: TDIPropHeader): HResult; stdcall;
function Acquire: HResult; stdcall;
function Unacquire: HResult; stdcall;
function GetDeviceState(cbData: DWORD; var lpvData): HResult; stdcall;
function GetDeviceData(cbObjectData: DWORD; var rgdod: TDIDeviceObjectData;
var pdwInOut: DWORD; dwFlags: DWORD): HResult; stdcall;
function SetDataFormat(const lpdf: TDIDataFormat): HResult; stdcall;
function SetEventNotification(hEvent: THandle): HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwFlags: DWORD): HResult; stdcall;
function GetObjectInfo(var pdidoi: TDIDeviceObjectInstanceA; dwObj: DWORD;
dwHow: DWORD): HResult; stdcall;
function GetDeviceInfo(var pdidi: TDIDeviceInstanceA): HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD): HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD; const rguid: TGUID): HResult; stdcall;
end;
 
IDirectInputDevice = IDirectInputDeviceA;
{$ENDIF}
 
const
DISFFC_RESET = $00000001;
DISFFC_STOPALL = $00000002;
DISFFC_PAUSE = $00000004;
DISFFC_CONTINUE = $00000008;
DISFFC_SETACTUATORSON = $00000010;
DISFFC_SETACTUATORSOFF = $00000020;
DISFFC_RESET = $00000001;
DISFFC_STOPALL = $00000002;
DISFFC_PAUSE = $00000004;
DISFFC_CONTINUE = $00000008;
DISFFC_SETACTUATORSON = $00000010;
DISFFC_SETACTUATORSOFF = $00000020;
 
DIGFFS_EMPTY = $00000001;
DIGFFS_STOPPED = $00000002;
DIGFFS_PAUSED = $00000004;
DIGFFS_ACTUATORSON = $00000010;
DIGFFS_ACTUATORSOFF = $00000020;
DIGFFS_POWERON = $00000040;
DIGFFS_POWEROFF = $00000080;
DIGFFS_SAFETYSWITCHON = $00000100;
DIGFFS_SAFETYSWITCHOFF = $00000200;
DIGFFS_USERFFSWITCHON = $00000400;
DIGFFS_USERFFSWITCHOFF = $00000800;
DIGFFS_DEVICELOST = $80000000;
DIGFFS_EMPTY = $00000001;
DIGFFS_STOPPED = $00000002;
DIGFFS_PAUSED = $00000004;
DIGFFS_ACTUATORSON = $00000010;
DIGFFS_ACTUATORSOFF = $00000020;
DIGFFS_POWERON = $00000040;
DIGFFS_POWEROFF = $00000080;
DIGFFS_SAFETYSWITCHON = $00000100;
DIGFFS_SAFETYSWITCHOFF = $00000200;
DIGFFS_USERFFSWITCHON = $00000400;
DIGFFS_USERFFSWITCHOFF = $00000800;
DIGFFS_DEVICELOST = $80000000;
 
DISDD_CONTINUE = 1;
 
DIFEF_DEFAULT = $00000000;
DIFEF_INCLUDENONSTANDARD = $00000001;
DIFEF_MODIFYIFNEEDED = $00000010;
 
type
PDIEffectInfoA = ^TDIEffectInfoA;
TDIEffectInfoA = packed record
dwSize : DWORD;
guid : TGUID;
dwEffType : DWORD;
dwStaticParams : DWORD;
dwDynamicParams : DWORD;
tszName : array [0..MAX_PATH-1] of CHAR;
TDIEffectInfoA = record
dwSize: DWORD;
guid: TGUID;
dwEffType: DWORD;
dwStaticParams: DWORD;
dwDynamicParams: DWORD;
tszName: array[0..MAX_PATH-1] of CHAR;
end;
 
DIEFFECTINFOA = TDIEffectInfoA;
LPDIEFFECTINFOA = PDIEffectInfoA;
 
PDIEffectInfoW = ^TDIEffectInfoW;
TDIEffectInfoW = packed record
dwSize : DWORD;
guid : TGUID;
dwEffType : DWORD;
dwStaticParams : DWORD;
dwDynamicParams : DWORD;
tszName : array [0..MAX_PATH-1] of WCHAR;
TDIEffectInfoW = record
dwSize: DWORD;
guid: TGUID;
dwEffType: DWORD;
dwStaticParams: DWORD;
dwDynamicParams: DWORD;
tszName: array[0..MAX_PATH-1] of WCHAR;
end;
 
PDIEffectInfo = ^TDIEffectInfo;
{$IFDEF UNICODE}
TDIEffectInfo = TDIEffectInfoW;
{$ELSE}
TDIEffectInfo = TDIEffectInfoA;
{$ENDIF}
DIEFFECTINFOW = TDIEffectInfoW;
LPDIEFFECTINFOW = PDIEffectInfoW;
 
const
DISDD_CONTINUE = $00000001;
DIEFFECTINFO = TDIEffectInfoA;
LPDIEFFECTINFO = PDIEffectInfoA;
 
// Bug fix & deviation from the SDK: Must return DIENUM_STOP or
// DIENUM_CONTINUE (=1) in order to work with the debug version of DINPUT.DLL
type
TDIEnumEffectsCallbackA =
function(var pdei: TDIEffectInfoA; pvRef: pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumEffectsCallbackW =
function(var pdei: TDIEffectInfoW; pvRef: pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumEffectsCallback =
function(var pdei: TDIEffectInfo; pvRef: pointer) : Integer; stdcall; // BOOL; stdcall;
TDIEnumEffectsProc = TDIEnumEffectsCallback;
TDIEnumEffectsCallbackA = function(const pdei: TDIEffectInfoA;
pvRef: Pointer): HResult; stdcall;
LPDIENUMEFFECTSCALLBACKA = TDIEnumEffectsCallbackA;
 
TDIEnumCreatedEffectObjectsCallback =
function(peff: IDirectInputEffect; pvRev: pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumCreatedEffectObjectsProc = TDIEnumCreatedEffectObjectsCallback;
TDIEnumEffectsCallbackW = function(const pdei: TDIEffectInfoW;
pvRef: Pointer): HResult; stdcall;
LPDIENUMEFFECTSCALLBACKW = TDIEnumEffectsCallbackW;
 
IDirectInputDevice2A = interface (IDirectInputDeviceA)
['{5944E682-C92E-11CF-BFC7-444553540000}']
(*** IDirectInputDevice2A methods ***)
function CreateEffect(const rguid: TGUID; lpeff: PDIEffect;
var ppdeff: IDirectInputEffect; punkOuter: IUnknown) : HResult; stdcall;
function EnumEffects(lpCallback: TDIEnumEffectsCallbackA;
pvRef: pointer; dwEffType: DWORD) : HResult; stdcall;
function GetEffectInfo(pdei: TDIEffectInfoA; const rguid: TGUID) : HResult; stdcall;
function GetForceFeedbackState(var pdwOut: DWORD) : HResult; stdcall;
function SendForceFeedbackCommand(dwFlags: DWORD) : HResult; stdcall;
TDIEnumEffectsCallback = TDIEnumEffectsCallbackA;
LPDIENUMEFFECTSCALLBACK = TDIEnumEffectsCallback;
 
LPDIENUMCREATEDEFFECTOBJECTSCALLBACK = function(const peff:
IDirectInputEffect; pvRef: Pointer): HResult; stdcall;
 
IDirectInputDevice2W = interface(IDirectInputDeviceW)
['{5944E683-C92E-11CF-BFC7-444553540000}']
// IDirectInputDevice2W methods
function CreateEffect(const rguid: TGUID; const lpeff: TDIEffect;
out ppdeff: IDirectInputEffect; punkOuter: IUnknown): HResult; stdcall;
function EnumEffects(lpCallback: TDIEnumEffectsCallbackW; pvRef: Pointer;
dwEffType: DWORD): HResult; stdcall;
function GetEffectInfo(var pdei: TDIEffectInfoW; const rguid: TGUID): HResult; stdcall;
function GetForceFeedbackState(var pdwOut: DWORD): HResult; stdcall;
function SendForceFeedbackCommand(dwFlags: DWORD): HResult; stdcall;
function EnumCreatedEffectObjects(lpCallback:
TDIEnumCreatedEffectObjectsCallback;
pvRef: pointer; fl: DWORD) : HResult; stdcall;
function Escape(var pesc: TDIEffEscape) : HResult; stdcall;
function Poll : HResult; stdcall;
function SendDeviceData
(cbObjectData: DWORD; var rgdod: TDIDeviceObjectData;
var pdwInOut: DWORD; fl: DWORD) : HResult; stdcall;
LPDIENUMCREATEDEFFECTOBJECTSCALLBACK; pvRef: Pointer; fl: DWORD): HResult; stdcall;
function Escape(const pesc: TDIEffEscape): HResult; stdcall;
function Poll: HResult; stdcall;
function SendDeviceData(cbObjectData: DWORD; const rgdod: TDIDeviceObjectData;
var pdwInOut: DWORD; fl: DWORD): HResult; stdcall;
end;
 
IDirectInputDevice2W = interface (IDirectInputDeviceW)
['{5944E683-C92E-11CF-BFC7-444553540000}']
(*** IDirectInputDevice2W methods ***)
function CreateEffect(const rguid: TGUID; lpeff: PDIEffect;
var ppdeff: IDirectInputEffect; punkOuter: IUnknown) : HResult; stdcall;
function EnumEffects(lpCallback: TDIEnumEffectsCallbackW;
pvRef: pointer; dwEffType: DWORD) : HResult; stdcall;
function GetEffectInfo(pdei: TDIEffectInfoW; const rguid: TGUID) : HResult; stdcall;
function GetForceFeedbackState(var pdwOut: DWORD) : HResult; stdcall;
function SendForceFeedbackCommand(dwFlags: DWORD) : HResult; stdcall;
IDirectInputDevice2A = interface(IDirectInputDeviceA)
['{5944E682-C92E-11CF-BFC7-444553540000}']
// IDirectInputDevice2A methods
function CreateEffect(const rguid: TGUID; const lpeff: TDIEffect;
out ppdeff: IDirectInputEffect; punkOuter: IUnknown): HResult; stdcall;
function EnumEffects(lpCallback: TDIEnumEffectsCallbackA; pvRef: Pointer;
dwEffType: DWORD): HResult; stdcall;
function GetEffectInfo(var pdei: TDIEffectInfoA; const rguid: TGUID): HResult; stdcall;
function GetForceFeedbackState(var pdwOut: DWORD): HResult; stdcall;
function SendForceFeedbackCommand(dwFlags: DWORD): HResult; stdcall;
function EnumCreatedEffectObjects(lpCallback:
TDIEnumCreatedEffectObjectsCallback;
pvRef: pointer; fl: DWORD) : HResult; stdcall;
function Escape(var pesc: TDIEffEscape) : HResult; stdcall;
function Poll : HResult; stdcall;
function SendDeviceData
(cbObjectData: DWORD; var rgdod: TDIDeviceObjectData;
var pdwInOut: DWORD; fl: DWORD) : HResult; stdcall;
LPDIENUMCREATEDEFFECTOBJECTSCALLBACK; pvRef: Pointer; fl: DWORD): HResult; stdcall;
function Escape(const pesc: TDIEffEscape): HResult; stdcall;
function Poll: HResult; stdcall;
function SendDeviceData(cbObjectData: DWORD; const rgdod: TDIDeviceObjectData;
var pdwInOut: DWORD; fl: DWORD): HResult; stdcall;
end;
 
{$IFDEF UNICODE}
IDirectInputDevice2 = IDirectInputDevice2W;
{$ELSE}
IDirectInputDevice2 = IDirectInputDevice2A;
{$ENDIF}
 
const
DIFEF_DEFAULT = $00000000;
DIFEF_INCLUDENONSTANDARD = $00000001;
DIFEF_MODIFYIFNEEDED = $00000010;
IDirectInputDevice7W = interface(IDirectInputDevice2W)
['{57D7C6BC-2356-11D3-8E9D-00C04F6844AE}']
// IDirectInputDevice7W methods
function EnumEffectsInFile(lpszFileName: LPCWSTR; pec: TDIEnumEffectsInFileCallback;
pvRef: Pointer; dwFlags: DWORD): HResult; stdcall;
function WriteEffectToFile(lpszFileName: LPCWSTR; dwEntries: DWORD;
const rgDiFileEft: TDIFileEffect; dwFlags: DWORD): HResult; stdcall;
end;
 
///Weitermachen: (as: nur die Deklarationen eingefüllt, die ich zum Testen gebraucht habe)
 
type
TEnumEffectsInFileCallback = function(gaga, huhu: Integer): HResult;
 
type
IDirectInputDevice7W = interface (IDirectInputDevice2W)
IDirectInputDevice7A = interface(IDirectInputDevice2A)
['{57D7C6BD-2356-11D3-8E9D-00C04F6844AE}']
(*** IDirectInputDevice7A methods ***)
function EnumEffectsInFile(const lpszFileName: PChar;
pec: TEnumEffectsInFileCallback; pvRef: Pointer; dwFlags: DWord): HResult; stdcall;
function WriteEffectToFile(const lpszFileName: PChar;
dwEntries: DWord; const rgDIFileEft: PDIFileEffect; dwFlags: DWord): HResult; stdcall;
// IDirectInputDevice7A methods
function EnumEffectsInFile(lpszFileName: LPCSTR; pec: TDIEnumEffectsInFileCallback;
pvRef: Pointer; dwFlags: DWORD): HResult; stdcall;
function WriteEffectToFile(lpszFileName: LPCSTR; dwEntries: DWORD;
const rgDiFileEft: TDIFileEffect; dwFlags: DWORD): HResult; stdcall;
end;
 
IDirectInputDevice7A = interface (IDirectInputDevice2A)
['{57D7C6BC-2356-11D3-8E9D-00C04F6844AE}']
function EnumEffectsInFile(const lpszFileName: PChar;
pec: TEnumEffectsInFileCallback; pvRef: Pointer; dwFlags: DWord): HResult; stdcall;
function WriteEffectToFile(const lpszFileName: PChar;
dwEntries: DWord; const rgDIFileEft: PDIFileEffect; dwFlags: DWord): HResult; stdcall;
end;
 
{$IFDEF UNICODE}
IDirectInputDevice7 = IDirectInputDevice7W;
{$ELSE}
IDirectInputDevice7 = IDirectInputDevice7A;
{$ENDIF}
 
(****************************************************************************
*
* Mouse
*
****************************************************************************)
{ Mouse }
 
type
PDIMouseState = ^TDIMouseState;
TDIMouseState = packed record
TDIMouseState = record
lX: Longint;
lY: Longint;
lZ: Longint;
rgbButtons: Array [0..3] of BYTE; // up to 4 buttons
rgbButtons: array[0..3] of BYTE;
end;
 
PDIMouseState2 = ^TDIMouseState2;
TDIMouseState2 = packed record
DIMOUSESTATE = TDIMouseState;
 
TDIMouseState2 = record
lX: Longint;
lY: Longint;
lZ: Longint;
rgbButtons: Array [0..7] of BYTE; // up to 8 buttons
rgbButtons: array[0..7] of BYTE;
end;
 
const
DIMOFS_X = 0;
DIMOFS_Y = 4;
DIMOFS_Z = 8;
DIMOFS_BUTTON0 = 12;
DIMOFS_BUTTON1 = 13;
DIMOFS_BUTTON2 = 14;
DIMOFS_BUTTON3 = 15;
// DX7 supports up to 8 mouse buttons
DIMOFS_BUTTON4 = DIMOFS_BUTTON0+4;
DIMOFS_BUTTON5 = DIMOFS_BUTTON0+5;
DIMOFS_BUTTON6 = DIMOFS_BUTTON0+6;
DIMOFS_BUTTON7 = DIMOFS_BUTTON0+7;
DIMOUSESTATE2 = TDIMouseState2;
 
 
const
_c_dfDIMouse_Objects: array[0..6] of TDIObjectDataFormat = (
( pguid: @GUID_XAxis;
dwOfs: DIMOFS_X;
dwType: DIDFT_AXIS or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_YAxis;
dwOfs: DIMOFS_Y;
dwType: DIDFT_AXIS or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_ZAxis;
dwOfs: DIMOFS_Z;
dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON0;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON1;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON2;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON3;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0)
);
_c_dfDIMouse_Objects: array[0..1] of TDIObjectDataFormat = (
(pguid: nil; dwOfs: 0; dwType: DIDFT_RELAXIS or DIDFT_ANYINSTANCE; dwFlags: 0),
(pguid: @GUID_Button; dwOfs: 12; dwType: DIDFT_BUTTON or DIDFT_ANYINSTANCE; dwFlags: 0)
);
 
c_dfDIMouse: TDIDataFormat = (
dwSize: Sizeof(c_dfDIMouse); // $18
dwObjSize: Sizeof(TDIObjectDataFormat); // $10
dwFlags: DIDF_RELAXIS; //
dwDataSize: Sizeof(TDIMouseState); // $10
dwNumObjs: High(_c_dfDIMouse_Objects)+1; // 7
rgodf: @_c_dfDIMouse_Objects[Low(_c_dfDIMouse_Objects)]
dwSize: Sizeof(c_dfDIMouse);
dwObjSize: Sizeof(TDIObjectDataFormat);
dwFlags: DIDF_RELAXIS;
dwDataSize: Sizeof(TDIMouseState);
dwNumObjs: High(_c_dfDIMouse_Objects)+1;
rgodf: @_c_dfDIMouse_Objects
);
 
{ Keyboard }
 
_c_dfDIMouse2_Objects: array[0..10] of TDIObjectDataFormat = (
( pguid: @GUID_XAxis;
dwOfs: DIMOFS_X;
dwType: DIDFT_AXIS or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_YAxis;
dwOfs: DIMOFS_Y;
dwType: DIDFT_AXIS or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_ZAxis;
dwOfs: DIMOFS_Z;
dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON0;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON1;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON2;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON3;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// fields introduced with IDirectInputDevice7.GetDeviceState
( pguid: nil;
dwOfs: DIMOFS_BUTTON4;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON5;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON6;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: nil;
dwOfs: DIMOFS_BUTTON7;
dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0)
);
type
TDIKeyboardState = array[0..255] of Byte;
DIKEYBOARDSTATE = TDIKeyboardState;
 
c_dfDIMouse2: TDIDataFormat = (
dwSize: Sizeof(c_dfDIMouse); // $18
dwObjSize: Sizeof(TDIObjectDataFormat); // $10
dwFlags: DIDF_RELAXIS; //
dwDataSize: Sizeof(TDIMouseState2); // $14
dwNumObjs: High(_c_dfDIMouse_Objects)+1; // 11
rgodf: @_c_dfDIMouse2_Objects[Low(_c_dfDIMouse2_Objects)]
const
_c_dfDIKeyboard_Objects: array[0..0] of TDIObjectDataFormat = (
(pguid: @GUID_Key; dwOfs: 1; dwType: DIDFT_BUTTON or DIDFT_ANYINSTANCE; dwFlags: 0)
);
 
c_dfDIKeyboard: TDIDataFormat = (
dwSize: Sizeof(c_dfDIKeyboard);
dwObjSize: Sizeof(TDIObjectDataFormat);
dwFlags: 0;
dwDataSize: SizeOf(TDIKeyboardState);
dwNumObjs: High(_c_dfDIKeyboard_Objects)+1;
rgodf: @_c_dfDIKeyboard_Objects
);
 
(****************************************************************************
*
* DirectInput keyboard scan codes
*
****************************************************************************)
{ DirectInput keyboard scan codes }
 
const
DIK_ESCAPE = $01;
13102,9 → 9357,9
DIK_8 = $09;
DIK_9 = $0A;
DIK_0 = $0B;
DIK_MINUS = $0C; (* - on main keyboard *)
DIK_MINUS = $0C; // - on main keyboard
DIK_EQUALS = $0D;
DIK_BACK = $0E; (* backspace *)
DIK_BACK = $0E; // backspace
DIK_TAB = $0F;
DIK_Q = $10;
DIK_W = $11;
13118,7 → 9373,7
DIK_P = $19;
DIK_LBRACKET = $1A;
DIK_RBRACKET = $1B;
DIK_RETURN = $1C; (* Enter on main keyboard *)
DIK_RETURN = $1C; // Enter on main keyboard
DIK_LCONTROL = $1D;
DIK_A = $1E;
DIK_S = $1F;
13131,7 → 9386,7
DIK_L = $26;
DIK_SEMICOLON = $27;
DIK_APOSTROPHE = $28;
DIK_GRAVE = $29; (* accent grave *)
DIK_GRAVE = $29; // accent grave
DIK_LSHIFT = $2A;
DIK_BACKSLASH = $2B;
DIK_Z = $2C;
13142,11 → 9397,11
DIK_N = $31;
DIK_M = $32;
DIK_COMMA = $33;
DIK_PERIOD = $34; (* . on main keyboard *)
DIK_SLASH = $35; (* / on main keyboard *)
DIK_PERIOD = $34; // . on main keyboard
DIK_SLASH = $35; // / on main keyboard
DIK_RSHIFT = $36;
DIK_MULTIPLY = $37; (* * on numeric keypad *)
DIK_LMENU = $38; (* left Alt *)
DIK_MULTIPLY = $37; // * on numeric keypad
DIK_LMENU = $38; // left Alt
DIK_SPACE = $39;
DIK_CAPITAL = $3A;
DIK_F1 = $3B;
13160,1425 → 9415,367
DIK_F9 = $43;
DIK_F10 = $44;
DIK_NUMLOCK = $45;
DIK_SCROLL = $46; (* Scroll Lock *)
DIK_SCROLL = $46; // Scroll Lock
DIK_NUMPAD7 = $47;
DIK_NUMPAD8 = $48;
DIK_NUMPAD9 = $49;
DIK_SUBTRACT = $4A; (* - on numeric keypad *)
DIK_SUBTRACT = $4A; // - on numeric keypad
DIK_NUMPAD4 = $4B;
DIK_NUMPAD5 = $4C;
DIK_NUMPAD6 = $4D;
DIK_ADD = $4E; (* + on numeric keypad *)
DIK_ADD = $4E; // + on numeric keypad
DIK_NUMPAD1 = $4F;
DIK_NUMPAD2 = $50;
DIK_NUMPAD3 = $51;
DIK_NUMPAD0 = $52;
DIK_DECIMAL = $53; (* . on numeric keypad *)
// $54 to $56 unassigned
DIK_DECIMAL = $53; // . on numeric keypad
DIK_F11 = $57;
DIK_F12 = $58;
// $59 to $63 unassigned
DIK_F13 = $64; (* (NEC PC98) *)
DIK_F14 = $65; (* (NEC PC98) *)
DIK_F15 = $66; (* (NEC PC98) *)
// $67 to $6F unassigned
DIK_KANA = $70; (* (Japanese keyboard) *)
DIK_CONVERT = $79; (* (Japanese keyboard) *)
DIK_NOCONVERT = $7B; (* (Japanese keyboard) *)
DIK_YEN = $7D; (* (Japanese keyboard) *)
DIK_NUMPADEQUALS = $8D; (* = on numeric keypad (NEC PC98) *)
// $8E to $8F unassigned
DIK_CIRCUMFLEX = $90; (* (Japanese keyboard) *)
DIK_AT = $91; (* (NEC PC98) *)
DIK_COLON = $92; (* (NEC PC98) *)
DIK_UNDERLINE = $93; (* (NEC PC98) *)
DIK_KANJI = $94; (* (Japanese keyboard) *)
DIK_STOP = $95; (* (NEC PC98) *)
DIK_AX = $96; (* (Japan AX) *)
DIK_UNLABELED = $97; (* (J3100) *)
// $98 to $99 unassigned
DIK_NUMPADENTER = $9C; (* Enter on numeric keypad *)
 
DIK_F13 = $64; // (NEC PC98)
DIK_F14 = $65; // (NEC PC98)
DIK_F15 = $66; // (NEC PC98)
 
DIK_KANA = $70; // (Japanese keyboard)
DIK_CONVERT = $79; // (Japanese keyboard)
DIK_NOCONVERT = $7B; // (Japanese keyboard)
DIK_YEN = $7D; // (Japanese keyboard)
DIK_NUMPADEQUALS = $8D; // = on numeric keypad (NEC PC98)
DIK_CIRCUMFLEX = $90; // (Japanese keyboard)
DIK_AT = $91; // (NEC PC98)
DIK_COLON = $92; // (NEC PC98)
DIK_UNDERLINE = $93; // (NEC PC98)
DIK_KANJI = $94; // (Japanese keyboard)
DIK_STOP = $95; // (NEC PC98)
DIK_AX = $96; // (Japan AX)
DIK_UNLABELED = $97; // (J3100)
DIK_NUMPADENTER = $9C; // Enter on numeric keypad
DIK_RCONTROL = $9D;
// $9E to $B2 unassigned
DIK_NUMPADCOMMA = $B3; (* , on numeric keypad (NEC PC98) *)
// $B4 unassigned
DIK_DIVIDE = $B5; (* / on numeric keypad *)
// $B6 unassigned
DIK_NUMPADCOMMA = $B3; // , on numeric keypad (NEC PC98)
DIK_DIVIDE = $B5; // / on numeric keypad
DIK_SYSRQ = $B7;
DIK_RMENU = $B8; (* right Alt *)
// $B9 to $C4 unassigned
DIK_PAUSE = $C5; (* Pause (watch out - not realiable on some kbds) *)
// $C6 unassigned
DIK_HOME = $C7; (* Home on arrow keypad *)
DIK_UP = $C8; (* UpArrow on arrow keypad *)
DIK_PRIOR = $C9; (* PgUp on arrow keypad *)
// $CA unassigned
DIK_LEFT = $CB; (* LeftArrow on arrow keypad *)
DIK_RIGHT = $CD; (* RightArrow on arrow keypad *)
// $CF unassigned
DIK_END = $CF; (* End on arrow keypad *)
DIK_DOWN = $D0; (* DownArrow on arrow keypad *)
DIK_NEXT = $D1; (* PgDn on arrow keypad *)
DIK_INSERT = $D2; (* Insert on arrow keypad *)
DIK_DELETE = $D3; (* Delete on arrow keypad *)
DIK_LWIN = $DB; (* Left Windows key *)
DIK_RWIN = $DC; (* Right Windows key *)
DIK_APPS = $DD; (* AppMenu key *)
// New with DX 6.1 & Win98
DIK_POWER = $DE;
DIK_SLEEP = $DF;
// $E0 to $E2 unassigned
// $E3 = Wake up ("translated" in German DInput to "Kielwasser" (ship's wake) ;-)
DIK_RMENU = $B8; // right Alt
DIK_HOME = $C7; // Home on arrow keypad
DIK_UP = $C8; // UpArrow on arrow keypad
DIK_PRIOR = $C9; // PgUp on arrow keypad
DIK_LEFT = $CB; // LeftArrow on arrow keypad
DIK_RIGHT = $CD; // RightArrow on arrow keypad
DIK_END = $CF; // End on arrow keypad
DIK_DOWN = $D0; // DownArrow on arrow keypad
DIK_NEXT = $D1; // PgDn on arrow keypad
DIK_INSERT = $D2; // Insert on arrow keypad
DIK_DELETE = $D3; // Delete on arrow keypad
DIK_LWIN = $DB; // Left Windows key
DIK_RWIN = $DC; // Right Windows key
DIK_APPS = $DD; // AppMenu key
 
(*
* Alternate names for keys, to facilitate transition from DOS.
*)
DIK_BACKSPACE = DIK_BACK ; (* backspace *)
DIK_NUMPADSTAR = DIK_MULTIPLY; (* * on numeric keypad *)
DIK_LALT = DIK_LMENU ; (* left Alt *)
DIK_CAPSLOCK = DIK_CAPITAL ; (* CapsLock *)
DIK_NUMPADMINUS = DIK_SUBTRACT; (* - on numeric keypad *)
DIK_NUMPADPLUS = DIK_ADD ; (* + on numeric keypad *)
DIK_NUMPADPERIOD = DIK_DECIMAL ; (* . on numeric keypad *)
DIK_NUMPADSLASH = DIK_DIVIDE ; (* / on numeric keypad *)
DIK_RALT = DIK_RMENU ; (* right Alt *)
DIK_UPARROW = DIK_UP ; (* UpArrow on arrow keypad *)
DIK_PGUP = DIK_PRIOR ; (* PgUp on arrow keypad *)
DIK_LEFTARROW = DIK_LEFT ; (* LeftArrow on arrow keypad *)
DIK_RIGHTARROW = DIK_RIGHT ; (* RightArrow on arrow keypad *)
DIK_DOWNARROW = DIK_DOWN ; (* DownArrow on arrow keypad *)
DIK_PGDN = DIK_NEXT ; (* PgDn on arrow keypad *)
//
// Alternate names for keys, to facilitate transition from DOS.
//
DIK_BACKSPACE = DIK_BACK; // backspace
DIK_NUMPADSTAR = DIK_MULTIPLY; // * on numeric keypad
DIK_LALT = DIK_LMENU; // left Alt
DIK_CAPSLOCK = DIK_CAPITAL; // CapsLock
DIK_NUMPADMINUS = DIK_SUBTRACT; // - on numeric keypad
DIK_NUMPADPLUS = DIK_ADD; // + on numeric keypad
DIK_NUMPADPERIOD = DIK_DECIMAL; // . on numeric keypad
DIK_NUMPADSLASH = DIK_DIVIDE; // / on numeric keypad
DIK_RALT = DIK_RMENU; // right Alt
DIK_UPARROW = DIK_UP; // UpArrow on arrow keypad
DIK_PGUP = DIK_PRIOR; // PgUp on arrow keypad
DIK_LEFTARROW = DIK_LEFT; // LeftArrow on arrow keypad
DIK_RIGHTARROW = DIK_RIGHT; // RightArrow on arrow keypad
DIK_DOWNARROW = DIK_DOWN; // DownArrow on arrow keypad
DIK_PGDN = DIK_NEXT; // PgDn on arrow keypad
 
(****************************************************************************
*
* Keyboard
*
****************************************************************************)
{ Joystick }
 
 
type
TDIKeyboardState = array[0..255] of Byte;
(*
const
_c_dfDIKeyboard_Objects: array[0..255] of TDIObjectDataFormat = (
( pguid: @GUID_Key;
dwOfs: DIK_ESCAPE;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// -------- top row (except function keys) on main kbd ------------
( pguid: @GUID_Key;
dwOfs: DIK_1; // "1" on main kbd, Offset 2
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_2; // "2" on main kbd, Offset 3
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_3; // "3" on main kbd, etc.
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_4;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_5;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_6;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_7;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_8;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_9;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_0; // "0", main kbd
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_MINUS; // "-" on US kbds, "ß" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_EQUALS; // "=" for US, "´" for german
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_BACK; // backspace
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// ----------- 2nd row -----------------------
( pguid: @GUID_Key;
dwOfs: DIK_TAB;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_Q;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_W;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_E;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_R;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_T;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_Y; // "Z" on german & french keyboards
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_U;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_I;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_O;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_P;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_LBRACKET; // "Ü" on german keyboards
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RBRACKET; // "+" on german keyboards
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RETURN; // Enter on main kbd
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// next row should really start with caps lock but doesn't ;-)
// (DIK_CAPITAL is Offset $3A, i.e. after 4th row)
( pguid: @GUID_Key;
dwOfs: DIK_LCONTROL; // Left Ctrl (german kbds: "Strg")
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// ----------- 3rd row ------------------------------
( pguid: @GUID_Key;
dwOfs: DIK_A;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_S;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_D;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_G;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_H;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_J;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_K;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_L;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_SEMICOLON; // "Ö" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_APOSTROPHE; // "Ä" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_GRAVE; // accent grave, "'" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// ---------------- 4th row -----------------------
( pguid: @GUID_Key;
dwOfs: DIK_LSHIFT; // left shift
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_BACKSLASH; // "<" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_Z; // "Y" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_X;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_C;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_V;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_B;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_N;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_M;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_COMMA;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_PERIOD; // on main kbd
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_SLASH; // "-" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RSHIFT;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// --- misc keys (bye, bye, order) ----------------
( pguid: @GUID_Key;
dwOfs: DIK_MULTIPLY; // on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_LMENU; // left ALT
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_SPACE; // space bar
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_CAPITAL; // caps lock (on main kbd, above LSHIFT)
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// ---------- function keys -----------
( pguid: @GUID_Key;
dwOfs: DIK_F1;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F2;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F3;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F4;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F5;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F6;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F7;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F8;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F9;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F10;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// ------- F11, F12 after numeric keypad (for "historical reasons" -- XT kbd)
 
// --------- numeric keypad (mostly, that is) -----------
( pguid: @GUID_Key;
dwOfs: DIK_NUMLOCK; // numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_SCROLL; // scroll lock
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD7;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD8;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD9;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_SUBTRACT; // "-" on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD4;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD5;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD6;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_ADD; // "+" on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD1;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD2;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD3;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NUMPAD0; // "0" or "Insert" on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_DECIMAL; // "." or "Del" on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: $54;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// "extended" function keys; F13 to F15 only on NEC PC98
( pguid: @GUID_Key;
dwOfs: DIK_F11;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_F12;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// -------------------------------------------------
// a whole lot of keys for asian kbds only
// -------------------------------------------------
( pguid: @GUID_Key;
dwOfs: DIK_NUMPADENTER; // Enter on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RCONTROL; // right Ctrl on main kbd
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key; // "," on numeric keypad (NEC PC98 only)
dwOfs: DIK_NUMPADCOMMA;
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_DIVIDE; // "/" on numeric keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_SYSRQ; // "System request", "Druck/S-Abf" on german kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RMENU; // right ALT
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_PAUSE; // "Pause" - not reliable on some kbds
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
 
// ----------- arrow keypad -----------------
( pguid: @GUID_Key;
dwOfs: DIK_HOME; // Home on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_UP; // UpArrow on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_PRIOR; // PgUp on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_LEFT; // LeftArrow on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RIGHT; // RightArrow on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_END; // End on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_DOWN; // DownArrow on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_NEXT; // PgDn on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_INSERT; // Insert on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_DELETE; // Delete on arrow keypad
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_LWIN; // Left Windows key
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_RWIN; // Right Windows key
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: DIK_APPS; // AppMenu key
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
// -------- added with Win 98 / DirectX 6.1 ------------
( pguid: @GUID_Key;
dwOfs: 222; // Power on key
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: 223; // Sleep key
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0),
( pguid: @GUID_Key;
dwOfs: 227; // Wake (up) key. The german "translation"
// reads "Kielwasser" (ship's wake) ;-)
dwType: DIDFT_BUTTON or DIDFT_NOCOLLECTION;
dwFlags: 0)
);
*)
 
var // set by initialization - I was simply too lazy
_c_dfDIKeyboard_Objects: array[0..255] of TDIObjectDataFormat;
const
c_dfDIKeyboard: TDIDataFormat = (
dwSize: Sizeof(c_dfDIKeyboard);
dwObjSize: Sizeof(TDIObjectDataFormat);
dwFlags: DIDF_RELAXIS;
dwDataSize: Sizeof(TDIKeyboardState);
dwNumObjs: High(_c_dfDIKeyboard_Objects)+1;
rgodf: @_c_dfDIKeyboard_Objects[Low(_c_dfDIKeyboard_Objects)]
);
 
(****************************************************************************
*
* Joystick
*
****************************************************************************)
 
 
type
PDIJoyState = ^TDIJoyState;
TDIJoyState = packed record
lX: Longint; (* x-axis position *)
lY: Longint; (* y-axis position *)
lZ: Longint; (* z-axis position *)
lRx: Longint; (* x-axis rotation *)
lRy: Longint; (* y-axis rotation *)
lRz: Longint; (* z-axis rotation *)
rglSlider: Array [0..1] of Longint; (* extra axes positions *)
rgdwPOV: Array [0..3] of DWORD; (* POV directions *)
rgbButtons: Array [0..31] of BYTE; (* 32 buttons *)
TDIJoyState = record
lX: Longint; // x-axis position
lY: Longint; // y-axis position
lZ: Longint; // z-axis position
lRx: Longint; // x-axis rotation
lRy: Longint; // y-axis rotation
lRz: Longint; // z-axis rotation
rglSlider: array[0..1] of Longint; // extra axes positions
rgdwPOV: array[0..3] of DWORD; // POV directions
rgbButtons: array[0..31] of BYTE; // 32 buttons
end;
 
PDIJoyState2 = ^TDIJoyState2;
TDIJoyState2 = packed record
lX: Longint; (* x-axis position *)
lY: Longint; (* y-axis position *)
lZ: Longint; (* z-axis position *)
lRx: Longint; (* x-axis rotation *)
lRy: Longint; (* y-axis rotation *)
lRz: Longint; (* z-axis rotation *)
rglSlider: Array [0..1] of Longint; (* extra axes positions *)
rgdwPOV: Array [0..3] of DWORD; (* POV directions *)
rgbButtons: Array [0..127] of BYTE; (* 128 buttons *)
lVX: Longint; (* x-axis velocity *)
lVY: Longint; (* y-axis velocity *)
lVZ: Longint; (* z-axis velocity *)
lVRx: Longint; (* x-axis angular velocity *)
lVRy: Longint; (* y-axis angular velocity *)
lVRz: Longint; (* z-axis angular velocity *)
rglVSlider: Array [0..1] of Longint; (* extra axes velocities *)
lAX: Longint; (* x-axis acceleration *)
lAY: Longint; (* y-axis acceleration *)
lAZ: Longint; (* z-axis acceleration *)
lARx: Longint; (* x-axis angular acceleration *)
lARy: Longint; (* y-axis angular acceleration *)
lARz: Longint; (* z-axis angular acceleration *)
rglASlider: Array [0..1] of Longint; (* extra axes accelerations *)
lFX: Longint; (* x-axis force *)
lFY: Longint; (* y-axis force *)
lFZ: Longint; (* z-axis force *)
lFRx: Longint; (* x-axis torque *)
lFRy: Longint; (* y-axis torque *)
lFRz: Longint; (* z-axis torque *)
rglFSlider: Array [0..1] of Longint; (* extra axes forces *)
DIJOYSTATE = TDIJoyState;
 
PDIJOYSTATE2 = ^TDIJoyState2;
TDIJoyState2 = record
lX: Longint; // x-axis position
lY: Longint; // y-axis position
lZ: Longint; // z-axis position
lRx: Longint; // x-axis rotation
lRy: Longint; // y-axis rotation
lRz: Longint; // z-axis rotation
rglSlider: array[0..1] of Longint; // extra axes positions
rgdwPOV: array[0..3] of DWORD; // POV directions
rgbButtons: array[0..127] of BYTE; // 128 buttons
lVX: Longint; // x-axis velocity
lVY: Longint; // y-axis velocity
lVZ: Longint; // z-axis velocity
lVRx: Longint; // x-axis angular velocity
lVRy: Longint; // y-axis angular velocity
lVRz: Longint; // z-axis angular velocity
rglVSlider: array[0..1] of Longint; // extra axes velocities
lAX: Longint; // x-axis acceleration
lAY: Longint; // y-axis acceleration
lAZ: Longint; // z-axis acceleration
lARx: Longint; // x-axis angular acceleration
lARy: Longint; // y-axis angular acceleration
lARz: Longint; // z-axis angular acceleration
rglASlider: array[0..1] of Longint; // extra axes accelerations
lFX: Longint; // x-axis force
lFY: Longint; // y-axis force
lFZ: Longint; // z-axis force
lFRx: Longint; // x-axis torque
lFRy: Longint; // y-axis torque
lFRz: Longint; // z-axis torque
rglFSlider: array[0..1] of Longint; // extra axes forces
end;
 
DIJOYSTATE2 = TDIJoyState2;
 
function DIJOFS_SLIDER(n: variant) : variant;
 
function DIJOFS_POV(n: variant) : variant;
 
function DIJOFS_BUTTON(n: variant) : variant;
const
DIJOFS_BUTTON_ = 48;
 
const
DIJOFS_BUTTON0 = DIJOFS_BUTTON_ + 0;
DIJOFS_BUTTON1 = DIJOFS_BUTTON_ + 1;
DIJOFS_BUTTON2 = DIJOFS_BUTTON_ + 2;
DIJOFS_BUTTON3 = DIJOFS_BUTTON_ + 3;
DIJOFS_BUTTON4 = DIJOFS_BUTTON_ + 4;
DIJOFS_BUTTON5 = DIJOFS_BUTTON_ + 5;
DIJOFS_BUTTON6 = DIJOFS_BUTTON_ + 6;
DIJOFS_BUTTON7 = DIJOFS_BUTTON_ + 7;
DIJOFS_BUTTON8 = DIJOFS_BUTTON_ + 8;
DIJOFS_BUTTON9 = DIJOFS_BUTTON_ + 9;
DIJOFS_BUTTON10 = DIJOFS_BUTTON_ + 10;
DIJOFS_BUTTON11 = DIJOFS_BUTTON_ + 11;
DIJOFS_BUTTON12 = DIJOFS_BUTTON_ + 12;
DIJOFS_BUTTON13 = DIJOFS_BUTTON_ + 13;
DIJOFS_BUTTON14 = DIJOFS_BUTTON_ + 14;
DIJOFS_BUTTON15 = DIJOFS_BUTTON_ + 15;
DIJOFS_BUTTON16 = DIJOFS_BUTTON_ + 16;
DIJOFS_BUTTON17 = DIJOFS_BUTTON_ + 17;
DIJOFS_BUTTON18 = DIJOFS_BUTTON_ + 18;
DIJOFS_BUTTON19 = DIJOFS_BUTTON_ + 19;
DIJOFS_BUTTON20 = DIJOFS_BUTTON_ + 20;
DIJOFS_BUTTON21 = DIJOFS_BUTTON_ + 21;
DIJOFS_BUTTON22 = DIJOFS_BUTTON_ + 22;
DIJOFS_BUTTON23 = DIJOFS_BUTTON_ + 23;
DIJOFS_BUTTON24 = DIJOFS_BUTTON_ + 24;
DIJOFS_BUTTON25 = DIJOFS_BUTTON_ + 25;
DIJOFS_BUTTON26 = DIJOFS_BUTTON_ + 26;
DIJOFS_BUTTON27 = DIJOFS_BUTTON_ + 27;
DIJOFS_BUTTON28 = DIJOFS_BUTTON_ + 28;
DIJOFS_BUTTON29 = DIJOFS_BUTTON_ + 29;
DIJOFS_BUTTON30 = DIJOFS_BUTTON_ + 30;
DIJOFS_BUTTON31 = DIJOFS_BUTTON_ + 31;
 
 
const
DIJOFS_X =0;
DIJOFS_Y =4;
DIJOFS_Z =8;
DIJOFS_RX =12;
DIJOFS_RY =16;
DIJOFS_RZ =20;
 
_c_dfDIJoystick_Objects: array[0..43] of TDIObjectDataFormat = (
( pguid: @GUID_XAxis;
dwOfs: DIJOFS_X; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
( pguid: @GUID_YAxis;
dwOfs: DIJOFS_Y; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
( pguid: @GUID_ZAxis;
dwOfs: DIJOFS_Z; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
( pguid: @GUID_RxAxis;
dwOfs: DIJOFS_RX; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
( pguid: @GUID_RyAxis;
dwOfs: DIJOFS_RY; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
( pguid: @GUID_RzAxis;
dwOfs: DIJOFS_RZ; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
 
( pguid: @GUID_Slider; // 2 Sliders
dwOfs: 24; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
( pguid: @GUID_Slider;
dwOfs: 28; dwType: $80000000 or DIDFT_AXIS or DIDFT_NOCOLLECTION; dwFlags: $100),
 
( pguid: @GUID_POV; // 4 POVs (yes, really)
dwOfs: 32; dwType: $80000000 or DIDFT_POV or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: @GUID_POV;
dwOfs: 36; dwType: $80000000 or DIDFT_POV or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: @GUID_POV;
dwOfs: 40; dwType: $80000000 or DIDFT_POV or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: @GUID_POV;
dwOfs: 44; dwType: $80000000 or DIDFT_POV or DIDFT_NOCOLLECTION; dwFlags: 0),
 
( pguid: nil; // Buttons
dwOfs: DIJOFS_BUTTON0; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
{const
_c_dfDIJoystick_Objects: array[0..1] of TDIObjectDataFormat = (
( pguid: nil;
dwOfs: DIJOFS_BUTTON1; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
dwOfs: 0;
dwType: DIDFT_AXIS or DIDFT_ANYINSTANCE;
dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON2; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON3; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON4; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON5; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON6; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON7; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON8; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON9; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON10; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON11; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON12; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON13; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON14; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON15; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON16; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON17; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON18; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON19; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON20; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON21; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON22; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON23; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON24; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON25; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON26; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON27; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON28; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON29; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON30; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0),
( pguid: nil;
dwOfs: DIJOFS_BUTTON31; dwType: $80000000 or DIDFT_BUTTON or DIDFT_NOCOLLECTION; dwFlags: 0)
dwOfs: 48;
dwType: DIDFT_BUTTON or DIDFT_ANYINSTANCE;
dwFlags: 0)
);
 
c_dfDIJoystick: TDIDataFormat = (
dwSize: Sizeof(c_dfDIJoystick);
dwObjSize: Sizeof(TDIObjectDataFormat); // $10
dwFlags: DIDF_ABSAXIS;
dwDataSize: SizeOf(TDIJoyState); // $10
dwNumObjs: High(_c_dfDIJoystick_Objects)+1; // $2C
rgodf: @_c_dfDIJoystick_Objects[Low(_c_dfDIJoystick_Objects)]
);
 
var // Set by initialization part -- didn't want to type in another 656 consts...
_c_dfDIJoystick2_Objects: array[0..$A3] of TDIObjectDataFormat;
{ Elements $00..$2B: exact copy of _c_dfDIJoystick
Elements $2C..$8B: more "buttons" with nil GUIDs
remaining elements ($8B..$A2):
$8C,$8D,$8E: X axis, Y axis, Z axis with dwFlags = $0200
$8F,$90,$91: rX axis, rY axis, rZ axis with dwFlags = $0200
$92, $93: Slider with dwFlags = $0200
--------
$94,$95,$96: X axis, Y axis, Z axis with dwFlags = $0300
$97,$98,$99: rX axis, rY axis, rZ axis with dwFlags = $0300
$9A,$9B: Slider with dwFlags = $0300
--------
$9C,$9D,$9E: X axis, Y axis, Z axis with dwFlags = $0400
$9F, $A0, $A1: rX axis, rY axis, rZ axis with dwFlags = $0400
$A2, $A3: Slider with dwFlags = $0400
}
dwSize: Sizeof(c_dfDIJoystick);
dwObjSize: Sizeof(TDIObjectDataFormat);
dwFlags: DIDF_ABSAXIS;
dwDataSize: SizeOf(DIJOYSTATE);
dwNumObjs: High(_c_dfDIJoystick_Objects)+1;
rgodf: @_c_dfDIJoystick_Objects);
}
const
c_dfDIJoystick2: TDIDataFormat = (
dwSize: Sizeof(c_dfDIJoystick2);
dwObjSize: Sizeof(TDIObjectDataFormat);
dwFlags: DIDF_ABSAXIS;
dwDataSize: SizeOf(TDIJoyState2); // $110
dwNumObjs: High(_c_dfDIJoystick2_Objects)+1;
rgodf: @_c_dfDIJoystick2_Objects[Low(_c_dfDIJoystick2_Objects)]
);
DIJOFS_X = 0;
DIJOFS_Y = 4;
DIJOFS_Z = 8;
DIJOFS_RX = 12;
DIJOFS_RY = 16;
DIJOFS_RZ = 20;
DIJOFS_SLIDER = 24;
DIJOFS_POV = 32;
DIJOFS_BUTTON = 48;
 
(****************************************************************************
*
* IDirectInput
*
****************************************************************************)
{ IDirectInput }
 
 
DIENUM_STOP = 0;
const
DIENUM_STOP = 0;
DIENUM_CONTINUE = 1;
 
type
// as with the other enum functions: must rtn DIENUM_STOP or DIENUM_CONTINUE
TDIEnumDevicesCallbackA = function (var lpddi: TDIDeviceInstanceA;
pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumDevicesCallbackW = function (var lpddi: TDIDeviceInstanceW;
pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumDevicesCallback = function (var lpddi: TDIDeviceInstance;
pvRef: Pointer): Integer; stdcall; // BOOL; stdcall;
TDIEnumDevicesProc = TDIEnumDevicesCallback;
 
TDIEnumDevicesCallbackA = function(const lpddi: TDIDeviceInstanceA;
pvRef: Pointer): HResult; stdcall;
LPDIENUMDEVICESCALLBACKA = TDIEnumDevicesCallbackA;
 
TDIEnumDevicesCallbackW = function(const lpddi: TDIDeviceInstanceW;
pvRef: Pointer): HResult; stdcall;
LPDIENUMDEVICESCALLBACKW = TDIEnumDevicesCallbackW;
 
TDIEnumDevicesCallback = TDIEnumDevicesCallbackA;
LPDIENUMDEVICESCALLBACK = TDIEnumDevicesCallback;
 
const
DIEDFL_ALLDEVICES = $00000000;
DIEDFL_ATTACHEDONLY = $00000001;
DIEDFL_FORCEFEEDBACK = $00000100;
DIEDFL_ALLDEVICES = $00000000;
DIEDFL_ATTACHEDONLY = $00000001;
DIEDFL_FORCEFEEDBACK = $00000100;
DIEDFL_INCLUDEALIASES = $00010000;
DIEDFL_INCLUDEPHANTOMS = $00020000;
 
type
 
IDirectInputW = interface (IUnknown)
IDirectInputW = interface(IUnknown)
['{89521361-AA8A-11CF-BFC7-444553540000}']
(*** IDirectInputW methods ***)
function CreateDevice(const rguid: TGUID; var lplpDirectInputDevice:
IDirectInputDeviceW; pUnkOuter: IUnknown) : HResult; stdcall;
// IDirectInputW methods
function CreateDevice(const rguid: TGUID;
out lplpDirectInputDevice: IDirectInputDeviceW; pUnkOuter: IUnknown): HResult; stdcall;
function EnumDevices(dwDevType: DWORD; lpCallback: TDIEnumDevicesCallbackW;
pvRef: Pointer; dwFlags: DWORD) : HResult; stdcall;
function GetDeviceStatus(const rguidInstance: TGUID) : HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD) : HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD) : HResult; stdcall;
pvRef: Pointer; dwFlags: DWORD): HResult; stdcall;
function GetDeviceStatus(var rguidInstance: TGUID): HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD): HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD): HResult; stdcall;
end;
 
IDirectInputA = interface (IUnknown)
IDirectInputA = interface(IUnknown)
['{89521360-AA8A-11CF-BFC7-444553540000}']
(*** IDirectInputA methods ***)
function CreateDevice(const rguid: TGUID; var lplpDirectInputDevice:
IDirectInputDeviceA; pUnkOuter: IUnknown) : HResult; stdcall;
// IDirectInputA methods
function CreateDevice(const rguid: TGUID;
out lplpDirectInputDevice: IDirectInputDeviceA; pUnkOuter: IUnknown): HResult; stdcall;
function EnumDevices(dwDevType: DWORD; lpCallback: TDIEnumDevicesCallbackA;
pvRef: Pointer; dwFlags: DWORD) : HResult; stdcall;
function GetDeviceStatus(const rguidInstance: TGUID) : HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD) : HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD) : HResult; stdcall;
pvRef: Pointer; dwFlags: DWORD): HResult; stdcall;
function GetDeviceStatus(const rguidInstance: TGUID): HResult; stdcall;
function RunControlPanel(hwndOwner: HWND; dwFlags: DWORD): HResult; stdcall;
function Initialize(hinst: THandle; dwVersion: DWORD): HResult; stdcall;
end;
 
{$IFDEF UNICODE}
IDirectInput = IDirectInputW;
{$ELSE}
IDirectInput = IDirectInputA;
{$ENDIF}
 
 
IDirectInput2W = interface (IDirectInputW)
IDirectInput2W = interface(IDirectInputW)
['{5944E663-AA8A-11CF-BFC7-444553540000}']
(*** IDirectInput2W methods ***)
function FindDevice(const rguidClass: TGUID; ptszName: PWideChar; out pguidInstance: TGUID): HResult; stdcall;
// IDirectInput2W methods
function FindDevice(Arg1: PGUID; Arg2: PWideChar; Arg3: PGUID): HResult; stdcall;
end;
 
IDirectInput2A = interface (IDirectInputA)
IDirectInput2A = interface(IDirectInputA)
['{5944E662-AA8A-11CF-BFC7-444553540000}']
(*** IDirectInput2A methods ***)
function FindDevice(const rguidClass: TGUID; ptszName: PAnsiChar; out pguidInstance: TGUID): HResult; stdcall;
// IDirectInput2A methods
function FindDevice(Arg1: PGUID; Arg2: PAnsiChar; Arg3: PGUID): HResult; stdcall;
end;
 
{$IFDEF UNICODE}
IDirectInput2 = IDirectInput2W;
{$ELSE}
IDirectInput2 = IDirectInput2A;
{$ENDIF}
 
 
type
IDirectInput7W = interface (IDirectInput2W)
IDirectInput7W = interface(IDirectInput2W)
['{9A4CB685-236D-11D3-8E9D-00C04F6844AE}']
{*** IDirectInput7W methods ***}
function CreateDeviceEx(const rguid, riid: TGUID; out lplpDirectInputDevice;
pUnkOuter: IUnknown) : HResult; stdcall;
// IDirectInput7W methods
function CreateDeviceEx(const rguid: TGUID; const riid: TGUID;
out pvOut; pUnkOuter: IUnknown): HResult; stdcall;
end;
 
IDirectInput7A = interface (IDirectInput2A)
IDirectInput7A = interface(IDirectInput2A)
['{9A4CB684-236D-11D3-8E9D-00C04F6844AE}']
{*** IDirectInput7A methods ***}
function CreateDeviceEx(const rguid, riid: TGUID; out lplpDirectInputDevice;
pUnkOuter: IUnknown) : HResult; stdcall;
// IDirectInput7A methods
function CreateDeviceEx(const rguid: TGUID; const riid: TGUID;
out pvOut; pUnkOuter: IUnknown): HResult; stdcall;
end;
 
{$IFDEF UNICODE}
IDirectInput7 = IDirectInput7W;
{$ELSE}
IDirectInput7 = IDirectInput7A;
{$ENDIF}
 
{ Return Codes }
 
var
DirectInputCreateA : function (hinst: THandle; dwVersion: DWORD;
out ppDI: IDirectInputA;
punkOuter: IUnknown) : HResult; stdcall;
DirectInputCreateW : function (hinst: THandle; dwVersion: DWORD;
out ppDI: IDirectInputW;
punkOuter: IUnknown) : HResult; stdcall;
DirectInputCreate : function (hinst: THandle; dwVersion: DWORD;
out ppDI: IDirectInput;
punkOuter: IUnknown) : HResult; stdcall;
 
DirectInputCreateEx : function (
hinst: THandle;
dwVersion: DWORD;
const riidltf: TGUID;
out ppvOut;
punkOuter: IUnknown) : HResult; stdcall;
 
(****************************************************************************
*
* Interfaces
*
****************************************************************************)
type
IID_IDirectInputW = IDirectInputW;
IID_IDirectInputA = IDirectInputA;
IID_IDirectInput = IDirectInput;
 
IID_IDirectInput2W = IDirectInput2W;
IID_IDirectInput2A = IDirectInput2A;
IID_IDirectInput2 = IDirectInput2;
 
IID_IDirectInput7W = IDirectInput7W;
IID_IDirectInput7A = IDirectInput7A;
IID_IDirectInput7 = IDirectInput7;
 
IID_IDirectInputDeviceW = IDirectInputDeviceW;
IID_IDirectInputDeviceA = IDirectInputDeviceA;
IID_IDirectInputDevice = IDirectInputDevice;
 
IID_IDirectInputDevice2W = IDirectInputDevice2W;
IID_IDirectInputDevice2A = IDirectInputDevice2A;
IID_IDirectInputDevice2 = IDirectInputDevice2;
 
IID_IDirectInputEffect = IDirectInputEffect;
 
IID_IDirectInputDevice7W = IDirectInputDevice7W;
IID_IDirectInputDevice7A = IDirectInputDevice7A;
IID_IDirectInputDevice7 = IDirectInputDevice7;
 
(****************************************************************************
*
* Return Codes
*
****************************************************************************)
 
(*
* The operation completed successfully.
*)
const
DI_OK = S_OK;
DI_OK = HResult(S_OK);
DI_NOTATTACHED = HResult(S_FALSE);
DI_BUFFEROVERFLOW = HResult(S_FALSE);
DI_PROPNOEFFECT = HResult(S_FALSE);
DI_NOEFFECT = HResult(S_FALSE);
DI_POLLEDDEVICE = HResult($00000002);
DI_DOWNLOADSKIPPED = HResult($00000003);
DI_EFFECTRESTARTED = HResult($00000004);
DI_TRUNCATED = HResult($00000008);
DI_TRUNCATEDANDRESTARTED = HResult($0000000C);
 
(*
* The device exists but is not currently attached.
*)
DI_NOTATTACHED = S_FALSE;
DIERR_OLDDIRECTINPUTVERSION = HResult($8007047E);
DIERR_BETADIRECTINPUTVERSION = HResult($80070481);
DIERR_BADDRIVERVER = HResult($80070077);
DIERR_DEVICENOTREG = HResult(REGDB_E_CLASSNOTREG);
DIERR_NOTFOUND = HResult($80070002);
DIERR_OBJECTNOTFOUND = HResult($80070002);
DIERR_INVALIDPARAM = HResult(E_INVALIDARG);
DIERR_NOINTERFACE = HResult(E_NOINTERFACE);
DIERR_GENERIC = HResult(E_FAIL);
DIERR_OUTOFMEMORY = HResult(E_OUTOFMEMORY);
DIERR_UNSUPPORTED = HResult(E_NOTIMPL);
DIERR_NOTINITIALIZED = HResult($80070015);
DIERR_ALREADYINITIALIZED = HResult($800704DF);
DIERR_NOAGGREGATION = HResult(CLASS_E_NOAGGREGATION);
DIERR_OTHERAPPHASPRIO = HResult(E_ACCESSDENIED);
DIERR_INPUTLOST = HResult($8007001E);
DIERR_ACQUIRED = HResult($800700AA);
DIERR_NOTACQUIRED = HResult($8007000C);
DIERR_READONLY = HResult(E_ACCESSDENIED);
DIERR_HANDLEEXISTS = HResult(E_ACCESSDENIED);
DIERR_PENDING = HResult($80070007);
DIERR_INSUFFICIENTPRIVS = HResult($80040200);
DIERR_DEVICEFULL = HResult($80040201);
DIERR_MOREDATA = HResult($80040202);
DIERR_NOTDOWNLOADED = HResult($80040203);
DIERR_HASEFFECTS = HResult($80040204);
DIERR_NOTEXCLUSIVEACQUIRED = HResult($80040205);
DIERR_INCOMPLETEEFFECT = HResult($80040206);
DIERR_NOTBUFFERED = HResult($80040207);
DIERR_EFFECTPLAYING = HResult($80040208);
DIERR_UNPLUGGED = HResult($80040209);
DIERR_REPORTFULL = HResult($8004020A);
 
(*
* The device buffer overflowed. Some input was lost.
*)
DI_BUFFEROVERFLOW = S_FALSE;
 
(*
* The change in device properties had no effect.
*)
DI_PROPNOEFFECT = S_FALSE;
{ Definitions for non-IDirectInput (VJoyD) features defined more recently
than the current sdk files }
 
(*
* The operation had no effect.
*)
DI_NOEFFECT = S_FALSE;
JOY_PASSDRIVERDATA = $10000000;
JOY_HWS_ISHEADTRACKER = $02000000;
JOY_HWS_ISGAMEPORTDRIVER = $04000000;
JOY_HWS_ISANALOGPORTDRIVER = $08000000;
JOY_HWS_AUTOLOAD = $10000000;
JOY_HWS_NODEVNODE = $20000000;
JOY_HWS_ISGAMEPORTEMULATOR = $40000000;
JOY_US_VOLATILE = $00000008;
 
(*
* The device is a polled device. As a result, device buffering
* will not collect any data and event notifications will not be
* signalled until GetDeviceState is called.
*)
DI_POLLEDDEVICE = $00000002;
{ Definitions for non-IDirectInput (VJoyD) features defined more recently
than the current ddk files }
 
(*
* The parameters of the effect were successfully updated by
* IDirectInputEffect::SetParameters, but the effect was not
* downloaded because the device is not exclusively acquired
* or because the DIEP_NODOWNLOAD flag was passed.
*)
DI_DOWNLOADSKIPPED = $00000003;
JOY_OEMPOLL_PASSDRIVERDATA = 7;
 
(*
* The parameters of the effect were successfully updated by
* IDirectInputEffect::SetParameters, but in order to change
* the parameters, the effect needed to be restarted.
*)
DI_EFFECTRESTARTED = $00000004;
function DirectInputCreate(hinst: THandle; dwVersion: DWORD;
out ppDI: IDirectInputA; punkOuter: IUnknown): HResult; stdcall;
function DirectInputCreateEx(hinst: THandle; dwVersion: DWORD;
const riidltf: TGUID; out ppDI: IDirectInputA; punkOuter: IUnknown): HResult; stdcall;
 
(*
* The parameters of the effect were successfully updated by
* IDirectInputEffect::SetParameters, but some of them were
* beyond the capabilities of the device and were truncated.
*)
DI_TRUNCATED = $00000008;
 
(*
* Equal to DI_EFFECTRESTARTED | DI_TRUNCATED.
*)
DI_TRUNCATEDANDRESTARTED = $0000000C;
 
SEVERITY_ERROR_FACILITY_WIN32 =
HResult(SEVERITY_ERROR shl 31) or HResult(FACILITY_WIN32 shl 16);
 
(*
* The application requires a newer version of DirectInput.
*)
 
DIERR_OLDDIRECTINPUTVERSION = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_OLD_WIN_VERSION;
 
(*
* The application was written for an unsupported prerelease version
* of DirectInput.
*)
DIERR_BETADIRECTINPUTVERSION = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_RMODE_APP;
 
(*
* The object could not be created due to an incompatible driver version
* or mismatched or incomplete driver components.
*)
DIERR_BADDRIVERVER = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_BAD_DRIVER_LEVEL;
 
(*
* The device or device instance or effect is not registered with DirectInput.
*)
DIERR_DEVICENOTREG = REGDB_E_CLASSNOTREG;
 
(*
* The requested object does not exist.
*)
DIERR_NOTFOUND = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_FILE_NOT_FOUND;
 
(*
* The requested object does not exist.
*)
DIERR_OBJECTNOTFOUND = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_FILE_NOT_FOUND;
 
(*
* An invalid parameter was passed to the returning function,
* or the object was not in a state that admitted the function
* to be called.
*)
DIERR_INVALIDPARAM = E_INVALIDARG;
 
(*
* The specified interface is not supported by the object
*)
DIERR_NOINTERFACE = E_NOINTERFACE;
 
(*
* An undetermined error occured inside the DInput subsystem
*)
DIERR_GENERIC = E_FAIL;
 
(*
* The DInput subsystem couldn't allocate sufficient memory to complete the
* caller's request.
*)
DIERR_OUTOFMEMORY = E_OUTOFMEMORY;
 
(*
* The function called is not supported at this time
*)
DIERR_UNSUPPORTED = E_NOTIMPL;
 
(*
* This object has not been initialized
*)
DIERR_NOTINITIALIZED = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_NOT_READY;
 
(*
* This object is already initialized
*)
DIERR_ALREADYINITIALIZED = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_ALREADY_INITIALIZED;
 
(*
* This object does not support aggregation
*)
DIERR_NOAGGREGATION = CLASS_E_NOAGGREGATION;
 
(*
* Another app has a higher priority level, preventing this call from
* succeeding.
*)
DIERR_OTHERAPPHASPRIO = E_ACCESSDENIED;
 
(*
* Access to the device has been lost. It must be re-acquired.
*)
DIERR_INPUTLOST = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_READ_FAULT;
 
(*
* The operation cannot be performed while the device is acquired.
*)
DIERR_ACQUIRED = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_BUSY;
 
(*
* The operation cannot be performed unless the device is acquired.
*)
DIERR_NOTACQUIRED = SEVERITY_ERROR_FACILITY_WIN32
or ERROR_INVALID_ACCESS;
 
(*
* The specified property cannot be changed.
*)
DIERR_READONLY = E_ACCESSDENIED;
 
(*
* The device already has an event notification associated with it.
*)
DIERR_HANDLEEXISTS = E_ACCESSDENIED;
 
(*
* Data is not yet available.
*)
E_PENDING = HResult($80070007);
 
(*
* Unable to IDirectInputJoyConfig_Acquire because the user
* does not have sufficient privileges to change the joystick
* configuration.
*)
DIERR_INSUFFICIENTPRIVS = HResult($80040200);
 
(*
* The device is full.
*)
DIERR_DEVICEFULL = DIERR_INSUFFICIENTPRIVS + 1;
 
(*
* Not all the requested information fit into the buffer.
*)
DIERR_MOREDATA = DIERR_INSUFFICIENTPRIVS + 2;
 
(*
* The effect is not downloaded.
*)
DIERR_NOTDOWNLOADED = DIERR_INSUFFICIENTPRIVS + 3;
 
(*
* The device cannot be reinitialized because there are still effects
* attached to it.
*)
DIERR_HASEFFECTS = DIERR_INSUFFICIENTPRIVS + 4;
 
(*
* The operation cannot be performed unless the device is acquired
* in DISCL_EXCLUSIVE mode.
*)
DIERR_NOTEXCLUSIVEACQUIRED = DIERR_INSUFFICIENTPRIVS + 5;
 
(*
* The effect could not be downloaded because essential information
* is missing. For example, no axes have been associated with the
* effect, or no type-specific information has been created.
*)
DIERR_INCOMPLETEEFFECT = DIERR_INSUFFICIENTPRIVS + 6;
 
(*
* Attempted to read buffered device data from a device that is
* not buffered.
*)
DIERR_NOTBUFFERED = DIERR_INSUFFICIENTPRIVS + 7;
 
(*
* An attempt was made to modify parameters of an effect while it is
* playing. Not all hardware devices support altering the parameters
* of an effect while it is playing.
*)
DIERR_EFFECTPLAYING = DIERR_INSUFFICIENTPRIVS + 8;
 
(*
* The operation could not be completed because the device is not
* plugged in.
*)
DIERR_UNPLUGGED = $80040209;
 
(*
* SendDeviceData failed because more information was requested
* to be sent than can be sent to the device. Some devices have
* restrictions on how much data can be sent to them. (For example,
* there might be a limit on the number of buttons that can be
* pressed at once.)
*)
DIERR_REPORTFULL = $8004020A;
 
 
(****************************************************************************
*
* Definitions for non-IDirectInput (VJoyD) features defined more recently
* than the current sdk files
*
****************************************************************************)
 
(*
* Flag to indicate that the dwReserved2 field of the JOYINFOEX structure
* contains mini-driver specific data to be passed by VJoyD to the mini-
* driver instead of doing a poll.
*)
JOY_PASSDRIVERDATA = $10000000;
 
(*
* Informs the joystick driver that the configuration has been changed
* and should be reloaded from the registery.
* dwFlags is reserved and should be set to zero
*)
 
function joyConfigChanged(dwFlags: DWORD) : MMRESULT; stdcall;
 
const
(*
* Hardware Setting indicating that the device is a headtracker
*)
JOY_HWS_ISHEADTRACKER = $02000000;
 
(*
* Hardware Setting indicating that the VxD is used to replace
* the standard analog polling
*)
JOY_HWS_ISGAMEPORTDRIVER = $04000000;
 
(*
* Hardware Setting indicating that the driver needs a standard
* gameport in order to communicate with the device.
*)
JOY_HWS_ISANALOGPORTDRIVER = $08000000;
 
(*
* Hardware Setting indicating that VJoyD should not load this
* driver, it will be loaded externally and will register with
* VJoyD of it's own accord.
*)
JOY_HWS_AUTOLOAD = $10000000;
 
(*
* Hardware Setting indicating that the driver acquires any
* resources needed without needing a devnode through VJoyD.
*)
JOY_HWS_NODEVNODE = $20000000;
 
(*
* Hardware Setting indicating that the device is a gameport bus
*)
JOY_HWS_ISGAMEPORTBUS = $80000000;
JOY_HWS_GAMEPORTBUSBUSY = $00000001;
 
//from older Verion:
(*
* Hardware Setting indicating that the VxD can be used as
* a port 201h emulator.
*)
JOY_HWS_ISGAMEPORTEMULATOR = $40000000;
 
 
(*
* Usage Setting indicating that the settings are volatile and
* should be removed if still present on a reboot.
*)
JOY_US_VOLATILE = $00000008;
 
(****************************************************************************
*
* Definitions for non-IDirectInput (VJoyD) features defined more recently
* than the current ddk files
*
****************************************************************************)
 
(*
* Poll type in which the do_other field of the JOYOEMPOLLDATA
* structure contains mini-driver specific data passed from an app.
*)
JOY_OEMPOLL_PASSDRIVERDATA = 7;
 
{$IFDEF UseDirectPlay} // Daniel Marschall 12.04.2024 Added to avoid Windows showing "This app requires DirectPlay"
//DirectPlay file
 
(*==========================================================================;
*
* Copyright (C) Microsoft Corporation. All Rights Reserved.
*
* File: dplay.h dplobby.h
* Content: DirectPlay include files
*
* DirectX 7 Delphi adaptation by Erik Unger
*
* Modified: 4-Jun-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
***************************************************************************)
 
var
DPlayDLL : HMODULE = 0;
 
(*==========================================================================;
*
* Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dplay.h
* Content: DirectPlay include file
*
***************************************************************************)
 
function DPErrorString(Value: HResult) : string;
 
const
// {D1EB6D20-8923-11d0-9D97-00A0C90A43CB}
CLSID_DirectPlay: TGUID =
(D1:$d1eb6d20;D2:$8923;D3:$11d0;D4:($9d,$97,$00,$a0,$c9,$a,$43,$cb));
{ GUIDS used by DirectPlay objects }
 
(*
* GUIDS used by Service Providers shipped with DirectPlay
* Use these to identify Service Provider returned by EnumConnections
*)
CLSID_DirectPlay: TGUID = '{D1EB6D20-8923-11D0-9D97-00A0C90A43CB}';
 
// GUID for IPX service provider
// {685BC400-9D2C-11cf-A9CD-00AA006886E3}
DPSPGUID_IPX: TGUID =
(D1:$685bc400;D2:$9d2c;D3:$11cf;D4:($a9,$cd,$00,$aa,$00,$68,$86,$e3));
IID_IDirectPlay: TGUID = '{5454E9A0-DB65-11CE-921C-00AA006C4972}';
IID_IDirectPlay2: TGUID = '{2B74F7C0-9154-11CF-A9CD-00AA006886E3}';
IID_IDirectPlay2A: TGUID = '{9D460580-A822-11CF-960C-0080C7534E82}';
IID_IDirectPlay3: TGUID = '{133EFE40-32DC-11D0-9CFB-00A0C90A43CB}';
IID_IDirectPlay3A: TGUID = '{133EFE41-32DC-11D0-9CFB-00A0C90A43CB}';
IID_IDirectPlay4: TGUID = '{0AB1C530-4745-11D1-A7A1-0000F803ABFC}';
IID_IDirectPlay4A: TGUID = '{0AB1C531-4745-11D1-A7A1-0000F803ABFC}';
 
// GUID for TCP/IP service provider
// 36E95EE0-8577-11cf-960C-0080C7534E82
DPSPGUID_TCPIP: TGUID =
(D1:$36E95EE0;D2:$8577;D3:$11cf;D4:($96,$0c,$00,$80,$c7,$53,$4e,$82));
{ GUIDS used by Service Providers shipped with DirectPlay
Use these to identify Service Provider returned by EnumConnections }
 
// GUID for Serial service provider
// {0F1D6860-88D9-11cf-9C4E-00A0C905425E}
DPSPGUID_SERIAL: TGUID =
(D1:$f1d6860;D2:$88d9;D3:$11cf;D4:($9c,$4e,$00,$a0,$c9,$05,$42,$5e));
DPSPGUID_IPX: TGUID = '{685BC400-9D2C-11CF-A9CD-00AA006886E3}';
DPSPGUID_TCPIP: TGUID = '{36E95EE0-8577-11CF-960C-0080C7534E82}';
DPSPGUID_SERIAL: TGUID = '{0F1D6860-88D9-11CF-9C4E-00A0C905425E}';
DPSPGUID_MODEM: TGUID = '{44EAA760-CB68-11CF-9C4E-00A0C905425E}';
 
// GUID for Modem service provider
// {44EAA760-CB68-11cf-9C4E-00A0C905425E}
DPSPGUID_MODEM: TGUID =
(D1:$44eaa760;D2:$cb68;D3:$11cf;D4:($9c,$4e,$00,$a0,$c9,$05,$42,$5e));
{ DirectPlay Structures }
 
 
(****************************************************************************
*
* DirectPlay Structures
*
* Various structures used to invoke DirectPlay.
*
****************************************************************************)
 
type
(*
* TDPID
* DirectPlay player and group ID
*)
PDPID = ^TDPID;
TDPID = DWORD;
PDPID = ^TDPID;
 
DPID = TDPID;
LPDPID = PDPID;
 
const
(*
* DPID that system messages come from
*)
DPID_SYSMSG = 0;
DPID_SYSMSG = 0; // DPID that system messages come from
DPID_ALLPLAYERS = 0; // DPID representing all players in the session
DPID_SERVERPLAYER = 1; // DPID representing the server player
DPID_RESERVEDRANGE = 100; // DPID representing the maxiumum ID in the range of DPID's reserved for
// use by DirectPlay.
DPID_UNKNOWN = $FFFFFFFF; // The player ID is unknown (used with e.g. DPSESSION_NOMESSAGEID)
 
(*
* DPID representing all players in the session
*)
DPID_ALLPLAYERS = 0;
 
(*
* DPID representing the server player
*)
DPID_SERVERPLAYER = 1;
 
(*
* DPID representing the maximum ID in the range of DPID's reserved for
* use by DirectPlay.
*)
DPID_RESERVEDRANGE = 100;
 
(*
* The player ID is unknown (used with e.g. DPSESSION_NOMESSAGEID)
*)
DPID_UNKNOWN = $FFFFFFFF;
 
type
(*
* DPCAPS
* Used to obtain the capabilities of a DirectPlay object
*)
PDPCaps = ^TDPCaps;
TDPCaps = packed record
TDPCaps = record
dwSize: DWORD; // Size of structure, in bytes
dwFlags: DWORD; // DPCAPS_xxx flags
dwMaxBufferSize: DWORD; // Maximum message size, in bytes, for this service provider
14595,228 → 9792,90
// responses to system messages
end;
 
DPCAPS = TDPCaps;
LPDPCAPS = PDPCaps;
 
const
(*
* This DirectPlay object is the session host. If the host exits the
* session, another application will become the host and receive a
* DPSYS_HOST system message.
*)
DPCAPS_ISHOST = $00000002;
 
(*
* The service provider bound to this DirectPlay object can optimize
* group messaging.
*)
DPCAPS_GROUPOPTIMIZED = $00000008;
 
(*
* The service provider bound to this DirectPlay object can optimize
* keep alives (see DPSESSION_KEEPALIVE)
*)
DPCAPS_KEEPALIVEOPTIMIZED = $00000010;
 
(*
* The service provider bound to this DirectPlay object can optimize
* guaranteed message delivery.
*)
DPCAPS_GUARANTEEDOPTIMIZED = $00000020;
 
(*
* This DirectPlay object supports guaranteed message delivery.
*)
DPCAPS_GUARANTEEDSUPPORTED = $00000040;
 
(*
* This DirectPlay object supports digital signing of messages.
*)
DPCAPS_SIGNINGSUPPORTED = $00000080;
 
(*
* This DirectPlay object supports encryption of messages.
*)
DPCAPS_ENCRYPTIONSUPPORTED = $00000100;
 
(*
* This DirectPlay player was created on this machine
*)
DPPLAYERCAPS_LOCAL = $00000800;
 
(*
* Current Open settings supports all forms of Cancel
*)
DPCAPS_ASYNCCANCELSUPPORTED = $00001000;
 
(*
* Current Open settings supports CancelAll, but not Cancel
*)
DPCAPS_ISHOST = $00000002;
DPCAPS_GROUPOPTIMIZED = $00000008;
DPCAPS_KEEPALIVEOPTIMIZED = $00000010;
DPCAPS_GUARANTEEDOPTIMIZED = $00000020;
DPCAPS_GUARANTEEDSUPPORTED = $00000040;
DPCAPS_SIGNINGSUPPORTED = $00000080;
DPCAPS_ENCRYPTIONSUPPORTED = $00000100;
DPPLAYERCAPS_LOCAL = $00000800;
DPCAPS_ASYNCCANCELSUPPORTED = $00001000;
DPCAPS_ASYNCCANCELALLSUPPORTED = $00002000;
DPCAPS_SENDTIMEOUTSUPPORTED = $00004000;
DPCAPS_SENDPRIORITYSUPPORTED = $00008000;
DPCAPS_ASYNCSUPPORTED = $00010000;
 
(*
* Current Open settings supports Send Timeouts for sends
*)
DPCAPS_SENDTIMEOUTSUPPORTED = $00004000;
 
(*
* Current Open settings supports send priority
*)
DPCAPS_SENDPRIORITYSUPPORTED = $00008000;
 
(*
* Current Open settings supports DPSEND_ASYNC flag
*)
DPCAPS_ASYNCSUPPORTED = $00010000;
 
type
(*
* TDPSessionDesc2
* Used to describe the properties of a DirectPlay
* session instance
*)
PDPSessionDesc2 = ^TDPSessionDesc2;
TDPSessionDesc2 = packed record
dwSize: DWORD; // Size of structure
dwFlags: DWORD; // DPSESSION_xxx flags
guidInstance: TGUID; // ID for the session instance
guidApplication: TGUID; // GUID of the DirectPlay application.
// GUID_NULL for all applications.
dwMaxPlayers: DWORD; // Maximum # players allowed in session
dwCurrentPlayers: DWORD; // Current # players in session (read only)
case integer of
0 : (
lpszSessionName: PCharAW; // Name of the session
lpszPassword: PCharAW; // Password of the session (optional)
dwReserved1: DWORD; // Reserved for future MS use.
dwReserved2: DWORD;
dwUser1: DWORD; // For use by the application
dwUser2: DWORD;
dwUser3: DWORD;
dwUser4: DWORD;
);
1 : (
lpszSessionNameA: PAnsiChar; // Name of the session
lpszPasswordA: PAnsiChar // Password of the session (optional)
);
2 : (
lpszSessionNameW: PWideChar;
lpszPasswordW: PWideChar
);
TDPSessionDesc2 = record
dwSize: DWORD; // Size of structure
dwFlags: DWORD; // DPSESSION_xxx flags
guidInstance: TGUID; // ID for the session instance
guidApplication: TGUID; // GUID of the DirectPlay application.
// GUID_NULL for all applications.
dwMaxPlayers: DWORD; // Maximum # players allowed in session
dwCurrentPlayers: DWORD; // Current # players in session (read only)
 
case Integer of
0: (
lpszSessionName: LPWSTR; // Name of the session - Unicode
lpszPassword: LPWSTR; // Password of the session (optional) - Unicode
dwReserved1: DWORD; // Reserved for future MS use.
dwReserved2: DWORD;
dwUser1: DWORD; // For use by the application
dwUser2: DWORD;
dwUser3: DWORD;
dwUser4: DWORD;
);
1: (
lpszSessionNameA: LPSTR; // Name of the session - ANSI
lpszPasswordA: LPSTR; // Password of the session (optional) - ANSI
);
end;
 
DPSESSIONDESC2 = TDPSessionDesc2;
LPDPSESSIONDESC2 = PDPSessionDesc2;
 
const
(*
* Applications cannot create new players in this session.
*)
DPSESSION_NEWPLAYERSDISABLED = $00000001;
 
(*
* If the DirectPlay object that created the session, the host,
* quits, then the host will attempt to migrate to another
* DirectPlay object so that new players can continue to be created
* and new applications can join the session.
*)
DPSESSION_MIGRATEHOST = $00000004;
 
(*
* This flag tells DirectPlay not to set the idPlayerTo and idPlayerFrom
* fields in player messages. This cuts two DWORD's off the message
* overhead.
*)
DPSESSION_NOMESSAGEID = $00000008;
 
(*
* This flag tells DirectPlay to not allow any new applications to
* join the session. Applications already in the session can still
* create new players.
*)
DPSESSION_JOINDISABLED = $00000020;
 
(*
* This flag tells DirectPlay to detect when remote players
* exit abnormally (e.g. their computer or modem gets unplugged)
*)
DPSESSION_KEEPALIVE = $00000040;
 
(*
* This flag tells DirectPlay not to send a message to all players
* when a players remote data changes
*)
DPSESSION_NODATAMESSAGES = $00000080;
 
(*
* This flag indicates that the session belongs to a secure server
* and needs user authentication
*)
DPSESSION_SECURESERVER = $00000100;
 
(*
* This flag indicates that the session is private and requirs a password
* for EnumSessions as well as Open.
*)
DPSESSION_PRIVATE = $00000200;
 
(*
* This flag indicates that the session requires a password for joining.
*)
DPSESSION_PASSWORDREQUIRED = $00000400;
 
(*
* This flag tells DirectPlay to route all messages through the server
*)
DPSESSION_MULTICASTSERVER = $00000800;
 
(*
* This flag tells DirectPlay to only download information about the
* DPPLAYER_SERVERPLAYER.
*)
DPSESSION_CLIENTSERVER = $00001000;
 
(*
* This flag tells DirectPlay to use the protocol built into dplay
* for reliability and statistics all the time. When this bit is
* set, only other sessions with this bit set can join or be joined.
*)
DPSESSION_MIGRATEHOST = $00000004;
DPSESSION_NOMESSAGEID = $00000008;
DPSESSION_JOINDISABLED = $00000020;
DPSESSION_KEEPALIVE = $00000040;
DPSESSION_NODATAMESSAGES = $00000080;
DPSESSION_SECURESERVER = $00000100;
DPSESSION_PRIVATE = $00000200;
DPSESSION_PASSWORDREQUIRED = $00000400;
DPSESSION_MULTICASTSERVER = $00000800;
DPSESSION_CLIENTSERVER = $00001000;
DPSESSION_DIRECTPLAYPROTOCOL = $00002000;
DPSESSION_NOPRESERVEORDER = $00004000;
DPSESSION_OPTIMIZELATENCY = $00008000;
 
(*
* This flag tells DirectPlay that preserving order of received
* packets is not important, when using reliable delivery. This
* will allow messages to be indicated out of order if preceding
* messages have not yet arrived. Otherwise DPLAY will wait for
* earlier messages before delivering later reliable messages.
*)
DPSESSION_NOPRESERVEORDER = $00004000;
 
(*
* This flag tells DirectPlay to optimize communication for latency
*)
DPSESSION_OPTIMIZELATENCY = $00008000;
 
type
(*
* TDPName
* Used to hold the name of a DirectPlay entity
* like a player or a group
*)
PDPName = ^TDPName;
TDPName = packed record
TDPName = record
dwSize: DWORD; // Size of structure
dwFlags: DWORD; // Not used. Must be zero.
case Integer of
0 : (
lpszShortName : PCharAW; // The short or friendly name
lpszLongName : PCharAW; // The long or formal name
);
1 : (
lpszShortNameA : PAnsiChar;
lpszLongNameA : PAnsiChar;
);
2 : (
lpszShortNameW : PWideChar;
lpszLongNameW : PWideChar;
);
0: (
lpszShortName: LPWSTR; // The short or friendly name - Unicode
lpszLongName: LPWSTR // The long or formal name - Unicode
);
1: (
lpszShortNameA: LPSTR; // The short or friendly name - ANSI
lpszLongNameA: LPSTR // The long or formal name - ANSI
);
end;
 
DPNAME = TDPName;
LPDPNAME = PDPName;
 
(*
* TDPCredentials
* Used to hold the user name and password of a DirectPlay user
14823,75 → 9882,79
*)
 
PDPCredentials = ^TDPCredentials;
TDPCredentials = packed record
TDPCredentials = record
dwSize: DWORD; // Size of structure
dwFlags: DWORD; // Not used. Must be zero.
case Integer of
0 : (
lpszUsername: PCharAW; // User name of the account
lpszPassword: PCharAW; // Password of the account
lpszDomain: PCharAW; // Domain name of the account
);
1 : (
lpszUsernameA: PAnsiChar; // User name of the account
lpszPasswordA: PAnsiChar; // Password of the account
lpszDomainA: PAnsiChar; // Domain name of the account
);
2 : (
lpszUsernameW: PWideChar; // User name of the account
lpszPasswordW: PWideChar; // Password of the account
lpszDomainW: PWideChar; // Domain name of the account
);
0: (
lpszUsername: LPWSTR; // User name of the account - Unicode
lpszPassword: LPWSTR; // Password of the account - Unicode
lpszDomain: LPWSTR; // Domain name of the account - Unicode
);
1: (
lpszUsernameA: LPSTR; // User name of the account - ANSI
lpszPasswordA: LPSTR; // Password of the account - ANSI
lpszDomainA: LPSTR // Domain name of the account - ANSI
);
end;
 
DPCREDENTIALS = TDPCredentials;
LPDPCREDENTIALS = PDPCredentials;
 
(*
* TDPSecurityDesc
* DPSECURITYDESC
* Used to describe the security properties of a DirectPlay
* session instance
*)
 
PDPSecurityDesc = ^TDPSecurityDesc;
TDPSecurityDesc = packed record
TDPSecurityDesc = record
dwSize: DWORD; // Size of structure
dwFlags: DWORD; // Not used. Must be zero.
case Integer of
0 : (
lpszSSPIProvider : PCharAW; // SSPI provider name
lpszCAPIProvider : PCharAW; // CAPI provider name
dwCAPIProviderType: DWORD; // Crypto Service Provider type
dwEncryptionAlgorithm: DWORD; // Encryption Algorithm type
);
1 : (
lpszSSPIProviderA : PAnsiChar; // SSPI provider name
lpszCAPIProviderA : PAnsiChar; // CAPI provider name
);
2 : (
lpszSSPIProviderW : PWideChar; // SSPI provider name
lpszCAPIProviderW : PWideChar; // CAPI provider name
);
0: (
lpszSSPIProvider: LPWSTR; // SSPI provider name - Unicode
lpszCAPIProvider: LPWSTR; // CAPI provider name - Unicode
dwCAPIProviderType: DWORD; // Crypto Service Provider type
dwEncryptionAlgorithm: DWORD; // Encryption Algorithm type
);
1: (
lpszSSPIProviderA: LPSTR; // SSPI provider name - ANSI
lpszCAPIProviderA: LPSTR; // CAPI provider name - ANSI
);
end;
 
DPSECURITYDESC = TDPSecurityDesc;
LPDPSECURITYDESC = PDPSecurityDesc;
 
(*
* DPACCOUNTDESC
* TDPAccountDesc
* Used to describe a user membership account
*)
 
PDPAccountDesc = ^TDPAccountDesc;
TDPAccountDesc = packed record
TDPAccountDesc = record
dwSize: DWORD; // Size of structure
dwFlags: DWORD; // Not used. Must be zero.
case Integer of
0 : (lpszAccountID : PCharAW); // Account identifier
1 : (lpszAccountIDA : PAnsiChar);
2 : (lpszAccountIDW : PWideChar);
0: (
lpszAccountID: LPWSTR; // Account identifier - Unicode
);
1: (
lpszAccountIDA: LPSTR; // Account identifier - ANSI
);
end;
 
DPACCOUNTDESC = TDPAccountDesc;
LPDPACCOUNTDESC = PDPAccountDesc;
 
(*
* TDPLConnection
* Used to hold all in the informaion needed to connect
* an application to a session or create a session
*)
 
PDPLConnection = ^TDPLConnection;
TDPLConnection = packed record
TDPLConnection = record
dwSize: DWORD; // Size of this structure
dwFlags: DWORD; // Flags specific to this structure
lpSessionDesc: PDPSessionDesc2; // Pointer to session desc to use on connect
14901,796 → 9964,345
dwAddressSize: DWORD; // Size of address data
end;
 
DPLCONNECTION = TDPLConnection;
LPDPLCONNECTION = PDPLConnection;
 
(*
* TDPChat
* Used to hold the a DirectPlay chat message
*)
 
PDPChat = ^TDPChat;
TDPChat = packed record
TDPChat = record
dwSize: DWORD;
dwFlags: DWORD;
case Integer of
0 : (lpszMessage : PCharAW); // Message string
1 : (lpszMessageA : PAnsiChar);
2 : (lpszMessageW : PWideChar);
0: (
lpszMessage: LPWSTR; // Message string - Unicode
);
1: (
lpszMessageA: LPSTR; // Message string - ANSI
);
end;
 
DPCHAT = TDPChat;
LPDPCHAT = PDPChat;
 
(*
* TSGBuffer
* SGBUFFER
* Scatter Gather Buffer used for SendEx
*)
 
PSGBuffer = ^TSGBuffer;
TSGBuffer = packed record
len: UINT;
pData: PUCHAR;
TSGBuffer = record
len: UINT; // length of buffer data
pData: PUChar; // pointer to buffer data
end;
 
(****************************************************************************
*
* Prototypes for DirectPlay callback functions
*
****************************************************************************)
SGBUFFER = TSGBuffer;
LPSGBUFFER = PSGBuffer;
 
(*
* Callback for IDirectPlay2::EnumSessions
*)
TDPEnumSessionsCallback2 = function(lpThisSD: PDPSessionDesc2;
var lpdwTimeOut: DWORD; dwFlags: DWORD; lpContext: Pointer) : BOOL; stdcall;
{ Prototypes for DirectPlay callback functions }
 
{ Callback for IDirectPlay2::EnumSessions }
 
TDPEnumSessionsCallback2 = function(const lpThisSD: TDPSessionDesc2;
var lpdwTimeOut: DWORD; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall;
LPDPENUMSESSIONSCALLBACK2 = TDPEnumSessionsCallback2;
 
const
(*
* This flag is set on the EnumSessions callback dwFlags parameter when
* the time out has occurred. There will be no session data for this
* callback. If *lpdwTimeOut is set to a non-zero value and the
* EnumSessionsCallback function returns TRUE then EnumSessions will
* continue waiting until the next timeout occurs. Timeouts are in
* milliseconds.
*)
DPESC_TIMEDOUT = $00000001;
 
type
(*
* Callback for IDirectPlay2.EnumPlayers
* IDirectPlay2.EnumGroups
* IDirectPlay2.EnumGroupPlayers
*)
TDPEnumPlayersCallback2 = function(DPID: TDPID; dwPlayerType: DWORD;
const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer) : BOOL; stdcall;
TDPEnumPlayersCallback2 = function(dpId: TDPID; dwPlayerType: DWORD;
const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall;
LPDPENUMPLAYERSCALLBACK2 = TDPEnumPlayersCallback2;
 
TDPEnumDPCallback = function(const lpguidSP: TGUID; lpSPName: LPWSTR;
dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer): BOOL; stdcall;
LPDPENUMDPCALLBACK = TDPEnumDPCallback;
 
(*
* ANSI callback for DirectPlayEnumerate
* This callback prototype will be used if compiling
* for ANSI strings
*)
TDPEnumDPCallbackA = function(const lpguidSP: TGUID; lpSPName: PAnsiChar;
dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer) : BOOL; stdcall;
TDPEnumDPCallbackA = function(const lpguidSP: TGUID; lpSPName: LPSTR;
dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer): BOOL; stdcall;
LPDPENUMDPCALLBACKA = TDPEnumDPCallbackA;
 
(*
* Unicode callback for DirectPlayEnumerate
* This callback prototype will be used if compiling
* for Unicode strings
*)
TDPEnumDPCallbackW = function(const lpguidSP: TGUID; lpSPName: PWideChar;
dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer) : BOOL; stdcall;
 
(*
* Callback for DirectPlayEnumerate
*)
{$IFDEF UNICODE}
TDPEnumDPCallback = TDPEnumDPCallbackW;
{$ELSE}
TDPEnumDPCallback = TDPEnumDPCallbackA;
{$ENDIF}
 
(*
* Callback for IDirectPlay3(A/W).EnumConnections
*)
TDPEnumConnectionsCallback = function(const lpguidSP: TGUID;
lpConnection: Pointer; dwConnectionSize: DWORD; const lpName: TDPName;
dwFlags: DWORD; lpContext: Pointer) : BOOL; stdcall;
dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall;
LPDPENUMCONNECTIONSCALLBACK = TDPEnumConnectionsCallback;
 
(*
* API's
*)
{ API's }
 
var
DirectPlayEnumerate : function (lpEnumDPCallback: TDPEnumDPCallback;
lpContext: Pointer) : HResult; stdcall;
DirectPlayEnumerateA : function (lpEnumDPCallback: TDPEnumDPCallbackA;
lpContext: Pointer) : HResult; stdcall;
DirectPlayEnumerateW : function (lpEnumDPCallback: TDPEnumDPCallbackW;
lpContext: Pointer) : HResult; stdcall;
function DirectPlayEnumerateA(lpEnumDPCallback: TDPEnumDPCallbackA;
lpContext: Pointer): HResult; stdcall;
function DirectPlayEnumerateW(lpEnumDPCallback: TDPEnumDPCallback;
lpContext: Pointer): HResult; stdcall;
function DirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackA;
lpContext: Pointer): HResult; stdcall;
 
 
(****************************************************************************
*
* IDirectPlay2 (and IDirectPlay2A) Interface
*
****************************************************************************)
{ IDirectPlay2 (and IDirectPlay2A) Interface }
 
type
IDirectPlay2AW = interface (IUnknown)
(*** IDirectPlay2 methods ***)
function AddPlayerToGroup(idGroup: TDPID; idPlayer: TDPID) : HResult; stdcall;
IDirectPlay2 = interface(IUnknown)
['{2B74F7C0-9154-11CF-A9CD-00AA006886E3}']
// IDirectPlay2 methods
function AddPlayerToGroup(idGroup: TDPID; idPlayer: TDPID): HResult; stdcall;
function Close: HResult; stdcall;
function CreateGroup(out lpidGroup: TDPID; lpGroupName: PDPName;
lpData: Pointer; dwDataSize: DWORD; dwFlags: DWORD) : HResult; stdcall;
function CreatePlayer(out lpidPlayer: TDPID; pPlayerName: PDPName;
hEvent: THandle; lpData: Pointer; dwDataSize: DWORD; dwFlags: DWORD) : HResult; stdcall;
function DeletePlayerFromGroup(idGroup: TDPID; idPlayer: TDPID) : HResult; stdcall;
function DestroyGroup(idGroup: TDPID) : HResult; stdcall;
function DestroyPlayer(idPlayer: TDPID) : HResult; stdcall;
function EnumGroupPlayers(idGroup: TDPID; lpguidInstance: PGUID;
function CreateGroup(var lpidGroup: TDPID; const lpGroupName: TDPName;
const lpData; dwDataSize: DWORD; dwFlags: DWORD): HResult; stdcall;
function CreatePlayer(var lpidPlayer: TDPID; const pPlayerName: TDPName;
hEvent: THandle; const lpData; dwDataSize: DWORD; dwFliags: DWORD): HResult; stdcall;
function DeletePlayerFromGroup(idGroup: TDPID; idPlayer: TDPID): HResult; stdcall;
function DestroyGroup(idGroup: TDPID): HResult; stdcall;
function DestroyPlayer(idPlayer: TDPID): HResult; stdcall;
function EnumGroupPlayers(idGroup: TDPID; const lpguidInstance: TGUID;
lpEnumPlayersCallback2: TDPEnumPlayersCallback2; lpContext: Pointer;
dwFlags: DWORD) : HResult; stdcall;
function EnumGroups(lpguidInstance: PGUID; lpEnumPlayersCallback2:
TDPEnumPlayersCallback2; lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
function EnumPlayers(lpguidInstance: PGUID; lpEnumPlayersCallback2:
TDPEnumPlayersCallback2; lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function EnumGroups(const lpguidInstance: TGUID; lpEnumPlayersCallback2:
LPDPENUMPLAYERSCALLBACK2; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function EnumPlayers(const lpguidInstance: TGUID; lpEnumPlayersCallback2:
LPDPENUMPLAYERSCALLBACK2; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function EnumSessions(const lpsd: TDPSessionDesc2; dwTimeout: DWORD;
lpEnumSessionsCallback2: TDPEnumSessionsCallback2; lpContext: Pointer;
dwFlags: DWORD) : HResult; stdcall;
function GetCaps(var lpDPCaps: TDPCaps; dwFlags: DWORD) : HResult; stdcall;
function GetGroupData(idGroup: TDPID; lpData: Pointer; var lpdwDataSize: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function GetGroupName(idGroup: TDPID; lpData: Pointer; var lpdwDataSize: DWORD) :
HResult; stdcall;
function GetMessageCount(idPlayer: TDPID; var lpdwCount: DWORD) : HResult; stdcall;
function GetPlayerAddress(idPlayer: TDPID; lpAddress: Pointer;
var lpdwAddressSize: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function GetCaps(var lpDPCaps: TDPCaps; dwFlags: DWORD): HResult; stdcall;
function GetGroupData(idGroup: TDPID; var lpData; var lpdwDataSize: DWORD;
dwFlags: DWORD): HResult; stdcall;
function GetGroupName(idGroup: TDPID; var lpData; var lpdwDataSize: DWORD): HResult; stdcall;
function GetMessageCount(idPlayer: TDPID; var lpdwCount: DWORD): HResult; stdcall;
function GetPlayerAddress(idPlayer: TDPID; var lpAddress;
var lpdwAddressSize: DWORD): HResult; stdcall;
function GetPlayerCaps(idPlayer: TDPID; var lpPlayerCaps: TDPCaps;
dwFlags: DWORD) : HResult; stdcall;
function GetPlayerData(idPlayer: TDPID; lpData: Pointer; var lpdwDataSize: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function GetPlayerName(idPlayer: TDPID; lpData: Pointer; var lpdwDataSize: DWORD) : HResult; stdcall;
function GetSessionDesc(lpData: Pointer; var lpdwDataSize: DWORD) : HResult; stdcall;
function Initialize(const lpGUID: TGUID) : HResult; stdcall;
function Open(var lpsd: TDPSessionDesc2; dwFlags: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function GetPlayerData(idPlayer: TDPID; var lpData; var lpdwDataSize: DWORD;
dwFlags: DWORD): HResult; stdcall;
function GetPlayerName(idPlayer: TDPID; var lpData; var lpdwDataSize: DWORD): HResult; stdcall;
function GetSessionDesc(var lpData; var lpdwDataSize: DWORD): HResult; stdcall;
function Initialize(const lpGUID: TGUID): HResult; stdcall;
function Open(var lpsd: TDPSessionDesc2; dwFlags: DWORD): HResult; stdcall;
function Receive(var lpidFrom: TDPID; var lpidTo: TDPID; dwFlags: DWORD;
lpData: Pointer; var lpdwDataSize: DWORD) : HResult; stdcall;
function Send(idFrom: TDPID; lpidTo: TDPID; dwFlags: DWORD; var lpData;
lpdwDataSize: DWORD) : HResult; stdcall;
function SetGroupData(idGroup: TDPID; lpData: Pointer; dwDataSize: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function SetGroupName(idGroup: TDPID; lpGroupName: PDPName;
dwFlags: DWORD) : HResult; stdcall;
function SetPlayerData(idPlayer: TDPID; lpData: Pointer; dwDataSize: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function SetPlayerName(idPlayer: TDPID; lpPlayerName: PDPName;
dwFlags: DWORD) : HResult; stdcall;
function SetSessionDesc(var lpSessDesc: TDPSessionDesc2; dwFlags: DWORD) :
HResult; stdcall;
var lpData; var lpdwDataSize: DWORD): HResult; stdcall;
function Send(idFrom: TDPID; lpidTo: TDPID; dwFlags: DWORD; const lpData;
lpdwDataSize: DWORD): HResult; stdcall;
function SetGroupData(idGroup: TDPID; const lpData; dwDataSize: DWORD;
dwFlags: DWORD): HResult; stdcall;
function SetGroupName(idGroup: TDPID; const lpGroupName: TDPName;
dwFlags: DWORD): HResult; stdcall;
function SetPlayerData(idPlayer: TDPID; const lpData; dwDataSize: DWORD;
dwFlags: DWORD): HResult; stdcall;
function SetPlayerName(idPlayer: TDPID; const lpPlayerName: TDPName;
dwFlags: DWORD): HResult; stdcall;
function SetSessionDesc(const lpSessDesc: TDPSessionDesc2; dwFlags: DWORD): HResult; stdcall;
end;
 
IDirectPlay2W = interface (IDirectPlay2AW)
['{2B74F7C0-9154-11CF-A9CD-00AA006886E3}']
IDirectPlay2A = interface(IDirectPlay2)
['{9D460580-A822-11CF-960C-0080C7534E82}']
end;
IDirectPlay2A = interface (IDirectPlay2AW)
['{9d460580-a822-11cf-960c-0080c7534e82}']
end;
 
{$IFDEF UNICODE}
IDirectPlay2 = IDirectPlay2W;
{$ELSE}
IDirectPlay2 = IDirectPlay2A;
{$ENDIF}
{ IDirectPlay3 (and IDirectPlay3A) Interface }
 
(****************************************************************************
*
* IDirectPlay3 (and IDirectPlay3A) Interface
*
****************************************************************************)
 
IDirectPlay3AW = interface (IDirectPlay2AW)
(*** IDirectPlay3 methods ***)
function AddGroupToGroup(idParentGroup: TDPID; idGroup: TDPID) : HResult; stdcall;
IDirectPlay3 = interface(IDirectPlay2)
['{133EFE40-32DC-11D0-9CFB-00A0C90A43CB}']
// IDirectPlay3 methods
function AddGroupToGroup(idParentGroup: TDPID; idGroup: TDPID): HResult; stdcall;
function CreateGroupInGroup(idParentGroup: TDPID; var lpidGroup: TDPID;
lpGroupName: PDPName; lpData: Pointer; dwDataSize: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function DeleteGroupFromGroup(idParentGroup: TDPID; idGroup: TDPID) : HResult; stdcall;
function EnumConnections(lpguidApplication: PGUID;
var lpGroupName: TDPName; const lpData; dwDataSize: DWORD;
dwFlags: DWORD): HResult; stdcall;
function DeleteGroupFromGroup(idParentGroup: TDPID; idGroup: TDPID): HResult; stdcall;
function EnumConnections(const lpguidApplication: TGUID;
lpEnumCallback: TDPEnumConnectionsCallback; lpContext: Pointer;
dwFlags: DWORD) : HResult; stdcall;
function EnumGroupsInGroup(idGroup: TDPID; lpguidInstance: PGUID;
dwFlags: DWORD): HResult; stdcall;
function EnumGroupsInGroup(idGroup: TDPID; const lpguidInstance: TGUID;
lpEnumPlayersCallback2: TDPEnumPlayersCallback2; lpContext: Pointer;
dwFlags: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function GetGroupConnectionSettings(dwFlags: DWORD; idGroup: TDPID;
lpData: Pointer; var lpdwDataSize: DWORD) : HResult; stdcall;
function InitializeConnection(lpConnection: Pointer; dwFlags: DWORD) : HResult; stdcall;
function SecureOpen(var lpsd: TDPSessionDesc2; dwFlags: DWORD;
var lpSecurity: TDPSecurityDesc; var lpCredentials: TDPCredentials) : HResult; stdcall;
var lpData; var lpdwDataSize: DWORD): HResult; stdcall;
function InitializeConnection(lpConnection: Pointer; dwFlags: DWORD): HResult; stdcall;
function SecureOpen(const lpsd: TDPSessionDesc2; dwFlags: DWORD;
const lpSecurity: TDPSecurityDesc; const lpCredentials: TDPCredentials): HResult; stdcall;
function SendChatMessage(idFrom: TDPID; idTo: TDPID; dwFlags: DWORD;
var lpChatMessage: TDPChat) : HResult; stdcall;
const lpChatMessage: TDPChat): HResult; stdcall;
function SetGroupConnectionSettings(dwFlags: DWORD; idGroup: TDPID;
var lpConnection: TDPLConnection) : HResult; stdcall;
function StartSession(dwFlags: DWORD; idGroup: TDPID) : HResult; stdcall;
function GetGroupFlags(idGroup: TDPID; out lpdwFlags: DWORD) : HResult; stdcall;
function GetGroupParent(idGroup: TDPID; out lpidParent: TDPID) : HResult; stdcall;
const lpConnection: TDPLConnection): HResult; stdcall;
function StartSession(dwFlags: DWORD; idGroup: TDPID): HResult; stdcall;
function GetGroupFlags(idGroup: TDPID; var lpdwFlags: DWORD): HResult; stdcall;
function GetGroupParent(idGroup: TDPID; var lpidParent: TDPID): HResult; stdcall;
function GetPlayerAccount(idPlayer: TDPID; dwFlags: DWORD; var lpData;
var lpdwDataSize: DWORD) : HResult; stdcall;
function GetPlayerFlags(idPlayer: TDPID; out lpdwFlags: DWORD) : HResult; stdcall;
var lpdwDataSize: DWORD): HResult; stdcall;
function GetPlayerFlags(idPlayer: TDPID; var lpdwFlags: DWORD): HResult; stdcall;
end;
 
 
IDirectPlay3W = interface (IDirectPlay3AW)
['{133EFE40-32DC-11D0-9CFB-00A0C90A43CB}']
IDirectPlay3A = interface(IDirectPlay3)
['{133EFE41-32DC-11D0-9CFB-00A0C90A43CB}']
end;
IDirectPlay3A = interface (IDirectPlay3AW)
['{133efe41-32dc-11d0-9cfb-00a0c90a43cb}']
end;
 
{$IFDEF UNICODE}
IDirectPlay3 = IDirectPlay3W;
{$ELSE}
IDirectPlay3 = IDirectPlay3A;
{$ENDIF}
{ IDirectPlay4 (and IDirectPlay4A) Interface }
 
 
(****************************************************************************
*
* IDirectPlay4 (and IDirectPlay4A) Interface
*
****************************************************************************)
 
IDirectPlay4AW = interface (IDirectPlay3AW)
(*** IDirectPlay4 methods ***)
function GetGroupOwner(idGroup: TDPID; out idOwner: TDPID) : HResult; stdcall;
function SetGroupOwner(idGroup: TDPID; idOwner: TDPID) : HResult; stdcall;
function SendEx(idFrom: TDPID; idTo: TDPID; dwFlags: DWORD; lpData: Pointer;
IDirectPlay4 = interface(IDirectPlay3)
['{0AB1C530-4745-11D1-A7A1-0000F803ABFC}']
// IDirectPlay4 methods
function GetGroupOwner(idGroup: TDPID; var idOwner: TDPID): HResult; stdcall;
function SetGroupOwner(idGroup: TDPID; idOwner: TDPID): HResult; stdcall;
function SendEx(idFrom: TDPID; idTo: TDPID; dwFlags: DWORD; const pData;
dwDataSize: DWORD; dwPriority: DWORD; dwTimeout: DWORD;
lpContext: Pointer; lpdwMsgId: PDWORD) : HResult; stdcall;
lpContext: Pointer; lpdwMsgId: PDWORD): HResult; stdcall;
function GetMessageQueue(idFrom: TDPID; idTo: TDPID; dwFlags: DWORD;
lpdwNumMsgs: PDWORD; lpdwNumBytes: PDWORD) : HResult; stdcall;
function CancelMessage(dwMessageID: DWORD; dwFlags: DWORD) : HResult; stdcall;
function CancelPriority(dwMinPriority: DWORD; dwMaxPriority: DWORD; dwFlags: DWORD) : HResult; stdcall;
end;
var lpdwNumMsgs: DWORD; var lpdwNumBytes: DWORD): HResult; stdcall;
function CancelMessage(dwMessageID: DWORD; dwFlags: DWORD): HResult; stdcall;
function CancelPriority(dwMinPriority: DWORD; dwMaxPriority: DWORD; dwFlags: DWORD): HResult; stdcall;
end;
 
 
IDirectPlay4W = interface (IDirectPlay4AW)
['{0ab1c530-4745-11D1-a7a1-0000f803abfc}']
IDirectPlay4A = interface(IDirectPlay4)
['{0AB1C531-4745-11D1-A7A1-0000F803ABFC}']
end;
IDirectPlay4A = interface (IDirectPlay4AW)
['{0ab1c531-4745-11D1-a7a1-0000f803abfc}']
end;
 
{$IFDEF UNICODE}
IDirectPlay4 = IDirectPlay4W;
{$ELSE}
IDirectPlay4 = IDirectPlay4A;
{$ENDIF}
 
 
const
(****************************************************************************
*
* EnumConnections API flags
*
****************************************************************************)
{ EnumConnections API flags }
 
(*
* Enumerate Service Providers
*)
DPCONNECTION_DIRECTPLAY = $00000001;
 
(*
* Enumerate Lobby Providers
*)
DPCONNECTION_DIRECTPLAY = $00000001;
DPCONNECTION_DIRECTPLAYLOBBY = $00000002;
 
(****************************************************************************
*
* EnumPlayers API flags
*
****************************************************************************)
{ EnumPlayers API flags }
 
(*
* Enumerate all players in the current session
*)
DPENUMPLAYERS_ALL = $00000000;
DPENUMGROUPS_ALL = DPENUMPLAYERS_ALL;
 
(*
* Enumerate only local (created by this application) players
* or groups
*)
DPENUMPLAYERS_LOCAL = $00000008;
DPENUMGROUPS_LOCAL = DPENUMPLAYERS_LOCAL;
 
(*
* Enumerate only remote (non-local) players
* or groups
*)
DPENUMPLAYERS_REMOTE = $00000010;
DPENUMGROUPS_REMOTE = DPENUMPLAYERS_REMOTE;
 
(*
* Enumerate groups along with the players
*)
DPENUMPLAYERS_GROUP = $00000020;
 
(*
* Enumerate players or groups in another session
* (must supply lpguidInstance)
*)
DPENUMPLAYERS_SESSION = $00000080;
DPENUMGROUPS_SESSION = DPENUMPLAYERS_SESSION;
 
(*
* Enumerate server players
*)
DPENUMPLAYERS_ALL = $00000000;
DPENUMGROUPS_ALL = DPENUMPLAYERS_ALL;
DPENUMPLAYERS_LOCAL = $00000008;
DPENUMGROUPS_LOCAL = DPENUMPLAYERS_LOCAL;
DPENUMPLAYERS_REMOTE = $00000010;
DPENUMGROUPS_REMOTE = DPENUMPLAYERS_REMOTE;
DPENUMPLAYERS_GROUP = $00000020;
DPENUMPLAYERS_SESSION = $00000080;
DPENUMGROUPS_SESSION = DPENUMPLAYERS_SESSION;
DPENUMPLAYERS_SERVERPLAYER = $00000100;
DPENUMPLAYERS_SPECTATOR = $00000200;
DPENUMGROUPS_SHORTCUT = $00000400;
DPENUMGROUPS_STAGINGAREA = $00000800;
DPENUMGROUPS_HIDDEN = $00001000;
DPENUMPLAYERS_OWNER = $00002000;
 
(*
* Enumerate spectator players
*)
DPENUMPLAYERS_SPECTATOR = $00000200;
{ CreatePlayer API flags }
 
(*
* Enumerate shortcut groups
*)
DPENUMGROUPS_SHORTCUT = $00000400;
 
(*
* Enumerate staging area groups
*)
DPENUMGROUPS_STAGINGAREA = $00000800;
 
(*
* Enumerate hidden groups
*)
DPENUMGROUPS_HIDDEN = $00001000;
 
(*
* Enumerate the group's owner
*)
DPENUMPLAYERS_OWNER = $00002000;
 
(****************************************************************************
*
* CreatePlayer API flags
*
****************************************************************************)
 
(*
* This flag indicates that this player should be designated
* the server player. The app should specify this at CreatePlayer.
*)
DPPLAYER_SERVERPLAYER = DPENUMPLAYERS_SERVERPLAYER;
DPPLAYER_SPECTATOR = DPENUMPLAYERS_SPECTATOR;
DPPLAYER_LOCAL = DPENUMPLAYERS_LOCAL;
DPPLAYER_OWNER = DPENUMPLAYERS_OWNER;
 
(*
* This flag indicates that this player should be designated
* a spectator. The app should specify this at CreatePlayer.
*)
DPPLAYER_SPECTATOR = DPENUMPLAYERS_SPECTATOR;
{ CreateGroup API flags }
 
(*
* This flag indicates that this player was created locally.
* (returned from GetPlayerFlags)
*)
DPPLAYER_LOCAL = DPENUMPLAYERS_LOCAL;
 
(*
* This flag indicates that this player is the group's owner
* (Only returned in EnumGroupPlayers)
*)
DPPLAYER_OWNER = DPENUMPLAYERS_OWNER;
 
(****************************************************************************
*
* CreateGroup API flags
*
****************************************************************************)
 
(*
* This flag indicates that the StartSession can be called on the group.
* The app should specify this at CreateGroup, or CreateGroupInGroup.
*)
DPGROUP_STAGINGAREA = DPENUMGROUPS_STAGINGAREA;
DPGROUP_LOCAL = DPENUMGROUPS_LOCAL;
DPGROUP_HIDDEN = DPENUMGROUPS_HIDDEN;
 
(*
* This flag indicates that this group was created locally.
* (returned from GetGroupFlags)
*)
DPGROUP_LOCAL = DPENUMGROUPS_LOCAL;
{ EnumSessions API flags }
 
(*
* This flag indicates that this group was created hidden.
*)
DPGROUP_HIDDEN = DPENUMGROUPS_HIDDEN;
 
(****************************************************************************
*
* EnumSessions API flags
*
****************************************************************************)
 
(*
* Enumerate sessions which can be joined
*)
DPENUMSESSIONS_AVAILABLE = $00000001;
 
(*
* Enumerate all sessions even if they can't be joined.
*)
DPENUMSESSIONS_ALL = $00000002;
 
(*
* Start an asynchronous enum sessions
*)
DPENUMSESSIONS_ASYNC = $00000010;
 
(*
* Stop an asynchronous enum sessions
*)
DPENUMSESSIONS_STOPASYNC = $00000020;
 
(*
* Enumerate sessions even if they require a password
*)
DPENUMSESSIONS_AVAILABLE = $00000001;
DPENUMSESSIONS_ALL = $00000002;
DPENUMSESSIONS_ASYNC = $00000010;
DPENUMSESSIONS_STOPASYNC = $00000020;
DPENUMSESSIONS_PASSWORDREQUIRED = $00000040;
DPENUMSESSIONS_RETURNSTATUS = $00000080;
 
(*
* Return status about progress of enumeration instead of
* showing any status dialogs.
*)
DPENUMSESSIONS_RETURNSTATUS = $00000080;
{ GetCaps and GetPlayerCaps API flags }
 
(****************************************************************************
*
* GetCaps and GetPlayerCaps API flags
*
****************************************************************************)
 
(*
* The latency returned should be for guaranteed message sending.
* Default is non-guaranteed messaging.
*)
DPGETCAPS_GUARANTEED = $00000001;
 
(****************************************************************************
*
* GetGroupData, GetPlayerData API flags
* Remote and local Group/Player data is maintained separately.
* Default is DPGET_REMOTE.
*
****************************************************************************)
{ GetGroupData, GetPlayerData API flags }
 
(*
* Get the remote data (set by any DirectPlay object in
* the session using DPSET_REMOTE)
*)
DPGET_REMOTE = $00000000;
DPGET_LOCAL = $00000001;
 
(*
* Get the local data (set by this DirectPlay object
* using DPSET_LOCAL)
*)
DPGET_LOCAL = $00000001;
{ Open API flags }
 
(****************************************************************************
*
* Open API flags
*
****************************************************************************)
 
(*
* Join the session that is described by the DPSESSIONDESC2 structure
*)
DPOPEN_JOIN = $00000001;
 
(*
* Create a new session as described by the DPSESSIONDESC2 structure
*)
DPOPEN_CREATE = $00000002;
 
(*
* Return status about progress of open instead of showing
* any status dialogs.
*)
DPOPEN_JOIN = $00000001;
DPOPEN_CREATE = $00000002;
DPOPEN_RETURNSTATUS = DPENUMSESSIONS_RETURNSTATUS;
 
(****************************************************************************
*
* DPLCONNECTION flags
*
****************************************************************************)
{ TDPLConnection flags }
 
(*
* This application should create a new session as
* described by the DPSESIONDESC structure
*)
DPLCONNECTION_CREATESESSION = DPOPEN_CREATE;
DPLCONNECTION_JOINSESSION = DPOPEN_JOIN;
 
(*
* This application should join the session described by
* the DPSESIONDESC structure with the lpAddress data
*)
DPLCONNECTION_JOINSESSION = DPOPEN_JOIN;
{ Receive API flags }
 
(****************************************************************************
*
* Receive API flags
* Default is DPRECEIVE_ALL
*
****************************************************************************)
 
(*
* Get the first message in the queue
*)
DPRECEIVE_ALL = $00000001;
 
(*
* Get the first message in the queue directed to a specific player
*)
DPRECEIVE_TOPLAYER = $00000002;
 
(*
* Get the first message in the queue from a specific player
*)
DPRECEIVE_ALL = $00000001;
DPRECEIVE_TOPLAYER = $00000002;
DPRECEIVE_FROMPLAYER = $00000004;
DPRECEIVE_PEEK = $00000008;
 
(*
* Get the message but don't remove it from the queue
*)
DPRECEIVE_PEEK = $00000008;
{ Send API flags }
 
(****************************************************************************
*
* Send API flags
*
****************************************************************************)
 
(*
* Send the message using a guaranteed send method.
* Default is non-guaranteed.
*)
DPSEND_GUARANTEED = $00000001;
 
(*
* This flag is obsolete. It is ignored by DirectPlay
*)
DPSEND_HIGHPRIORITY = $00000002;
 
(*
* This flag is obsolete. It is ignored by DirectPlay
*)
DPSEND_OPENSTREAM = $00000008;
 
(*
* This flag is obsolete. It is ignored by DirectPlay
*)
DPSEND_CLOSESTREAM = $00000010;
 
(*
* Send the message digitally signed to ensure authenticity.
*)
DPSEND_SIGNED = $00000020;
 
(*
* Send the message with encryption to ensure privacy.
*)
DPSEND_ENCRYPTED = $00000040;
 
(*
* The message is a lobby system message
*)
DPSEND_GUARANTEED = $00000001;
DPSEND_HIGHPRIORITY = $00000002;
DPSEND_OPENSTREAM = $00000008;
DPSEND_CLOSESTREAM = $00000010;
DPSEND_SIGNED = $00000020;
DPSEND_ENCRYPTED = $00000040;
DPSEND_LOBBYSYSTEMMESSAGE = $00000080;
DPSEND_ASYNC = $00000200;
DPSEND_NOSENDCOMPLETEMSG = $00000400;
DPSEND_MAX_PRI = $0000FFFF;
DPSEND_MAX_PRIORITY = DPSEND_MAX_PRI;
 
(*
* andyco - added this so we can make addforward async.
* needs to be sanitized when we add / expose full async
* support. 8/3/97.
*)
DPSEND_ASYNC = $00000200;
{ SetGroupData, SetGroupName, SetPlayerData, SetPlayerName,
SetSessionDesc API flags. }
 
(*
* When a message is completed, don't tell me.
* by default the application is notified with a system message.
*)
DPSEND_NOSENDCOMPLETEMSG = $00000400;
 
 
(*
* Maximum priority for sends available to applications
*)
DPSEND_MAX_PRI = $0000FFFF;
DPSEND_MAX_PRIORITY = DPSEND_MAX_PRI;
 
(****************************************************************************
*
* SetGroupData, SetGroupName, SetPlayerData, SetPlayerName,
* SetSessionDesc API flags.
* Default is DPSET_REMOTE.
*
****************************************************************************)
 
(*
* Propagate the data to all players in the session
*)
DPSET_REMOTE = $00000000;
 
(*
* Do not propagate the data to other players
*)
DPSET_LOCAL = $00000001;
 
(*
* Used with DPSET_REMOTE, use guaranteed message send to
* propagate the data
*)
DPSET_REMOTE = $00000000;
DPSET_LOCAL = $00000001;
DPSET_GUARANTEED = $00000002;
 
(****************************************************************************
*
* GetMessageQueue API flags.
* Default is DPMESSAGEQUEUE_SEND
*
****************************************************************************)
{ GetMessageQueue API flags. }
 
(*
* Get Send Queue - requires Service Provider Support
*)
DPMESSAGEQUEUE_SEND = $00000001;
DPMESSAGEQUEUE_SEND = $00000001; // Default
DPMESSAGEQUEUE_RECEIVE = $00000002; // Default
 
(*
* Get Receive Queue
*)
DPMESSAGEQUEUE_RECEIVE = $00000002;
{ Connect API flags }
 
(****************************************************************************
*
* Connect API flags
*
****************************************************************************)
 
(*
* Start an asynchronous connect which returns status codes
*)
DPCONNECT_RETURNSTATUS = DPENUMSESSIONS_RETURNSTATUS;
 
(****************************************************************************
*
* DirectPlay system messages and message data structures
*
* All system message come 'From' player DPID_SYSMSG. To determine what type
* of message it is, cast the lpData from Receive to TDPMsg_Generic and check
* the dwType member against one of the following DPSYS_xxx constants. Once
* a match is found, cast the lpData to the corresponding of the DPMSG_xxx
* structures to access the data of the message.
*
****************************************************************************)
{ DirectPlay system messages and message data structures }
 
(*
* A new player or group has been created in the session
* Use TDPMsg_CreatePlayerOrGroup. Check dwPlayerType to see if it
* is a player or a group.
*)
DPSYS_CREATEPLAYERORGROUP = $0003;
 
(*
* A player has been deleted from the session
* Use TDPMsg_DestroyPlayerOrGroup
*)
DPSYS_DESTROYPLAYERORGROUP = $0005;
 
(*
* A player has been added to a group
* Use DPMSG_ADDPLAYERTOGROUP
*)
DPSYS_ADDPLAYERTOGROUP = $0007;
 
(*
* A player has been removed from a group
* Use DPMSG_DELETEPLAYERFROMGROUP
*)
DPSYS_CREATEPLAYERORGROUP = $0003;
DPSYS_DESTROYPLAYERORGROUP = $0005;
DPSYS_ADDPLAYERTOGROUP = $0007;
DPSYS_DELETEPLAYERFROMGROUP = $0021;
DPSYS_SESSIONLOST = $0031;
DPSYS_HOST = $0101;
DPSYS_SETPLAYERORGROUPDATA = $0102;
DPSYS_SETPLAYERORGROUPNAME = $0103;
DPSYS_SETSESSIONDESC = $0104;
DPSYS_ADDGROUPTOGROUP = $0105;
DPSYS_DELETEGROUPFROMGROUP = $0106;
DPSYS_SECUREMESSAGE = $0107;
DPSYS_STARTSESSION = $0108;
DPSYS_CHAT = $0109;
DPSYS_SETGROUPOWNER = $010A;
DPSYS_SENDCOMPLETE = $010d;
 
(*
* This DirectPlay object lost its connection with all the
* other players in the session.
* Use DPMSG_SESSIONLOST.
*)
DPSYS_SESSIONLOST = $0031;
 
(*
* The current host has left the session.
* This DirectPlay object is now the host.
* Use DPMSG_HOST.
*)
DPSYS_HOST = $0101;
{ Used in the dwPlayerType field to indicate if it applies to a group or a player}
 
(*
* The remote data associated with a player or
* group has changed. Check dwPlayerType to see
* if it is a player or a group
* Use DPMSG_SETPLAYERORGROUPDATA
*)
DPSYS_SETPLAYERORGROUPDATA = $0102;
DPPLAYERTYPE_GROUP = $00000000;
DPPLAYERTYPE_PLAYER = $00000001;
 
(*
* The name of a player or group has changed.
* Check dwPlayerType to see if it is a player
* or a group.
* Use TDPMsg_SetPlayerOrGroupName
*)
DPSYS_SETPLAYERORGROUPNAME = $0103;
{ TDPMsg_Generic }
 
(*
* The session description has changed.
* Use DPMSG_SETSESSIONDESC
*)
DPSYS_SETSESSIONDESC = $0104;
 
(*
* A group has been added to a group
* Use TDPMsg_AddGroupToGroup
*)
DPSYS_ADDGROUPTOGROUP = $0105;
 
(*
* A group has been removed from a group
* Use DPMsg_DeleteGroupFromGroup
*)
DPSYS_DELETEGROUPFROMGROUP = $0106;
 
(*
* A secure player-player message has arrived.
* Use DPMSG_SECUREMESSAGE
*)
DPSYS_SECUREMESSAGE = $0107;
 
(*
* Start a new session.
* Use DPMSG_STARTSESSION
*)
DPSYS_STARTSESSION = $0108;
 
(*
* A chat message has arrived
* Use DPMSG_CHAT
*)
DPSYS_CHAT = $0109;
 
(*
* The owner of a group has changed
* Use DPMSG_SETGROUPOWNER
*)
DPSYS_SETGROUPOWNER = $010A;
 
(*
* An async send has finished, failed or been cancelled
* Use DPMSG_SENDCOMPLETE
*)
DPSYS_SENDCOMPLETE = $010D;
 
(*
* Used in the dwPlayerType field to indicate if it applies to a group
* or a player
*)
DPPLAYERTYPE_GROUP = $00000000;
DPPLAYERTYPE_PLAYER = $00000001;
 
type
(*
* TDPMsg_Generic
* Generic message structure used to identify the message type.
*)
PDPMsg_Generic = ^TDPMsg_Generic;
TDPMsg_Generic = packed record
TDPMsg_Generic = record
dwType: DWORD; // Message type
end;
 
(*
* TDPMsg_CreatePlayerOrGroup
* System message generated when a new player or group
* created in the session with information about it.
*)
DPMSG_GENERIC = TDPMsg_Generic;
LPDPMSG_GENERIC = PDPMsg_Generic;
 
{ TDPMsg_CreatePlayerOrGroup }
 
PDPMsg_CreatePlayerOrGroup = ^TDPMsg_CreatePlayerOrGroup;
TDPMsg_CreatePlayerOrGroup = packed record
TDPMsg_CreatePlayerOrGroup = record
dwType: DWORD; // Message type
dwPlayerType: DWORD; // Is it a player or group
DPID: TDPID; // ID of the player or group
dpId: TDPID; // ID of the player or group
dwCurrentPlayers: DWORD; // current # players & groups in session
lpData: Pointer; // pointer to remote data
dwDataSize: DWORD; // size of remote data
15697,20 → 10309,20
dpnName: TDPName; // structure with name info
// the following fields are only available when using
// the IDirectPlay3 interface or greater
dpIdParent: TDPID; // id of parent group
dpIdParent: TDPID; // id of parent group
dwFlags: DWORD; // player or group flags
end;
 
(*
* TDPMsg_DestroyPlayerOrGroup
* System message generated when a player or group is being
* destroyed in the session with information about it.
*)
PDPMsg_DestroyPlayerOrGroup= ^TDPMsg_DestroyPlayerOrGroup;
TDPMsg_DestroyPlayerOrGroup = packed record
DPMSG_CREATEPLAYERORGROUP = TDPMsg_CreatePlayerOrGroup;
LPDPMSG_CREATEPLAYERORGROUP = PDPMsg_CreatePlayerOrGroup;
 
{ TDPMsg_DestroyPlayerOrGroup }
 
PDPMsg_DestroyPlayerOrGroup = ^TDPMsg_DestroyPlayerOrGroup;
TDPMsg_DestroyPlayerOrGroup = record
dwType: DWORD; // Message type
dwPlayerType: DWORD; // Is it a player or group
DPID: TDPID; // player ID being deleted
dpId: TDPID; // player ID being deleted
lpLocalData: Pointer; // copy of players local data
dwLocalDataSize: DWORD; // sizeof local data
lpRemoteData: Pointer; // copy of players remote data
15722,106 → 10334,107
dwFlags: DWORD; // player or group flags
end;
 
(*
* DPMSG_ADDPLAYERTOGROUP
* System message generated when a player is being added
* to a group.
*)
PDPMsg_AddPlayerToGroup = ^TDPMsg_AddPlayerToGroup;
TDPMsg_AddPlayerToGroup = packed record
DPMSG_DESTROYPLAYERORGROUP = TDPMsg_DestroyPlayerOrGroup;
LPDPMSG_DESTROYPLAYERORGROUP = PDPMsg_DestroyPlayerOrGroup;
 
{ TDPMsg_AddPlayerOrGroup }
 
PDPMsg_AddPlayerOrGroup = ^TDPMsg_AddPlayerOrGroup;
TDPMsg_AddPlayerOrGroup = record
dwType: DWORD; // Message type
dpIdGroup: TDPID; // group ID being added to
dpIdPlayer: TDPID; // player ID being added
end;
 
(*
* DPMSG_DELETEPLAYERFROMGROUP
* System message generated when a player is being
* removed from a group
*)
PDPMsg_DeletePlayerFromGroup = ^TDPMsg_DeletePlayerFromGroup;
TDPMsg_DeletePlayerFromGroup = TDPMsg_AddPlayerToGroup;
DPMSG_ADDPLAYERTOGROUP = TDPMsg_AddPlayerOrGroup;
LPDPMSG_ADDPLAYERTOGROUP = PDPMsg_AddPlayerOrGroup;
 
(*
* TDPMsg_AddGroupToGroup
* System message generated when a group is being added
* to a group.
*)
{ TDPMsg_DeletePlayerFromGroup }
 
TDPMsg_DeletePlayerFromGroup = TDPMsg_AddPlayerOrGroup;
PDPMsg_DeletePlayerFromGroup = PDPMsg_AddPlayerOrGroup;
 
DPMSG_DELETEPLAYERFROMGROUP = TDPMsg_DeletePlayerFromGroup;
LPDPMSG_DELETEPLAYERFROMGROUP = PDPMsg_DeletePlayerFromGroup;
 
{ TDPMsg_AddGroupToGroup }
 
PDPMsg_AddGroupToGroup = ^TDPMsg_AddGroupToGroup;
TDPMsg_AddGroupToGroup = packed record
TDPMsg_AddGroupToGroup = record
dwType: DWORD; // Message type
dpIdParentGroup: TDPID; // group ID being added to
dpIdGroup: TDPID; // group ID being added
end;
 
(*
* DPMsg_DeleteGroupFromGroup
* System message generated when a GROUP is being
* removed from a group
*)
PDPMsg_DeleteGroupFromGroup = ^TDPMsg_DeleteGroupFromGroup;
DPMSG_ADDGROUPTOGROUP = TDPMsg_AddGroupToGroup;
LPDPMSG_ADDGROUPTOGROUP = PDPMsg_AddGroupToGroup;
 
{ TDPMsg_DeleteGroupFromGroup }
 
TDPMsg_DeleteGroupFromGroup = TDPMsg_AddGroupToGroup;
PDPMsg_DeleteGroupFromGroup = PDPMsg_AddGroupToGroup;
 
(*
* DPMSG_SETPLAYERORGROUPDATA
* System message generated when remote data for a player or
* group has changed.
*)
DPMSG_DELETEGROUPFROMGROUP = TDPMsg_DeleteGroupFromGroup;
LPDPMSG_DELETEGROUPFROMGROUP = PDPMsg_DeleteGroupFromGroup;
 
{ TDPMsg_SetPlayerOrGroupData }
 
PDPMsg_SetPlayerOrGroupData = ^TDPMsg_SetPlayerOrGroupData;
TDPMsg_SetPlayerOrGroupData = packed record
TDPMsg_SetPlayerOrGroupData = record
dwType: DWORD; // Message type
dwPlayerType: DWORD; // Is it a player or group
DPID: TDPID; // ID of player or group
dpId: TDPID; // ID of player or group
lpData: Pointer; // pointer to remote data
dwDataSize: DWORD; // size of remote data
end;
 
(*
* DPMSG_SETPLAYERORGROUPNAME
* System message generated when the name of a player or
* group has changed.
*)
DPMSG_SETPLAYERORGROUPDATA = TDPMsg_SetPlayerOrGroupData;
LPDPMSG_SETPLAYERORGROUPDATA = PDPMsg_SetPlayerOrGroupData;
 
{ TDPMsg_SetPlayerOrGroupName }
 
PDPMsg_SetPlayerOrGroupName = ^TDPMsg_SetPlayerOrGroupName;
TDPMsg_SetPlayerOrGroupName = packed record
TDPMsg_SetPlayerOrGroupName = record
dwType: DWORD; // Message type
dwPlayerType: DWORD; // Is it a player or group
DPID: TDPID; // ID of player or group
dpnName: TDPName; // structure with new name info
dpId: TDPID; // ID of player or group
dpnName: TDPName; // structure with new name info
end;
 
(*
* DPMSG_SETSESSIONDESC
* System message generated when session desc has changed
*)
DPMSG_SETPLAYERORGROUPNAME = TDPMsg_SetPlayerOrGroupName;
LPDPMSG_SETPLAYERORGROUPNAME = PDPMsg_SetPlayerOrGroupName;
 
{ TDPMsg_SetSessionDesc }
 
PDPMsg_SetSessionDesc = ^TDPMsg_SetSessionDesc;
TDPMsg_SetSessionDesc = packed record
TDPMsg_SetSessionDesc = record
dwType: DWORD; // Message type
dpDesc: TDPSessionDesc2; // Session desc
end;
 
(*
* DPMSG_HOST
* System message generated when the host has migrated to this
* DirectPlay object.
*
*)
DPMSG_SETSESSIONDESC = TDPMsg_SetSessionDesc;
LPDPMSG_SETSESSIONDESC = PDPMsg_SetSessionDesc;
 
{ TDPMsg_Host }
 
PDPMsg_Host = ^TDPMsg_Host;
TDPMsg_Host = TDPMsg_Generic;
 
(*
* DPMSG_SESSIONLOST
* System message generated when the connection to the session is lost.
*
*)
DPMSG_HOST = TDPMsg_Host;
LPDPMSG_HOST = PDPMsg_Host;
 
{ TDPMsg_SessionLost }
 
PDPMsg_SessionLost = ^TDPMsg_SessionLost;
TDPMsg_SessionLost = TDPMsg_Generic;
 
(*
* DPMSG_SECUREMESSAGE
* System message generated when a player requests a secure send
*)
DPMSG_SESSIONLOST = TDPMsg_SessionLost;
LPDPMSG_SESSIONLOST = PDPMsg_SessionLost;
 
{ TDPMsg_SecureMessage }
 
PDPMsg_SecureMessage = ^TDPMsg_SecureMessage;
TDPMsg_SecureMessage = packed record
TDPMsg_SecureMessage = record
dwType: DWORD; // Message Type
dwFlags: DWORD; // Signed/Encrypted
dpIdFrom: TDPID; // ID of Sending Player
15829,23 → 10442,24
dwDataSize: DWORD; // Size of player message
end;
 
(*
* DPMSG_STARTSESSION
* System message containing all information required to
* start a new session
*)
DPMSG_SECUREMESSAGE = TDPMsg_SecureMessage;
LPDPMSG_SECUREMESSAGE = PDPMsg_SecureMessage;
 
{ TDPMsg_StartSession }
 
PDPMsg_StartSession = ^TDPMsg_StartSession;
TDPMsg_StartSession = packed record
TDPMsg_StartSession = record
dwType: DWORD; // Message type
lpConn: PDPLConnection; // TDPLConnection structure
lpConn: PDPLConnection; // TDPLConnection structure
end;
 
(*
* DPMSG_CHAT
* System message containing a chat message
*)
DPMSG_STARTSESSION = TDPMsg_StartSession;
LPDPMSG_STARTSESSION = PDPMsg_StartSession;
 
{ TDPMsg_Chat }
 
PDPMsg_Chat = ^TDPMsg_Chat;
TDPMsg_Chat = packed record
TDPMsg_Chat = record
dwType: DWORD; // Message type
dwFlags: DWORD; // Message flags
idFromPlayer: TDPID; // ID of the Sending Player
15854,12 → 10468,13
lpChat: PDPChat; // Pointer to a structure containing the chat message
end;
 
(*
* DPMSG_SETGROUPOWNER
* System message generated when the owner of a group has changed
*)
DPMSG_CHAT = TDPMsg_Chat;
LPDPMSG_CHAT = PDPMsg_Chat;
 
{ TDPMsg_SetGroupOwner }
 
PDPMsg_SetGroupOwner = ^TDPMsg_SetGroupOwner;
TDPMsg_SetGroupOwner = packed record
TDPMsg_SetGroupOwner = record
dwType: DWORD; // Message type
idGroup: TDPID; // ID of the group
idNewOwner: TDPID; // ID of the player that is the new owner
15866,15 → 10481,13
idOldOwner: TDPID; // ID of the player that used to be the owner
end;
 
(*
* DPMSG_SENDCOMPLETE
* System message generated when finished with an Async Send message
*
* NOTE SENDPARMS has an overlay for DPMSG_SENDCOMPLETE, don't
* change this message w/o changing SENDPARMS.
*)
PDPMsg_SendComplete = ^TDPMsg_SendComplete;
TDPMsg_SendComplete = packed record
DPMSG_SETGROUPOWNER = TDPMsg_SetGroupOwner;
LPDPMSG_SETGROUPOWNER = PDPMsg_SetGroupOwner;
 
{ TDPMsg_SendComplete }
 
PDPMsg_SendComplete= ^TDPMsg_SendComplete;
TDPMsg_SendComplete = record
dwType: DWORD; // Message type
idFrom: TDPID;
idTo: TDPID;
15887,99 → 10500,85
dwSendTime: DWORD;
end;
 
(****************************************************************************
*
* DIRECTPLAY ERRORS
*
* Errors are represented by negative values and cannot be combined.
*
****************************************************************************)
DPMSG_SENDCOMPLETE = TDPMsg_SendComplete;
LPDPMSG_SENDCOMPLETE = PDPMsg_SendComplete;
 
{ DIRECTPLAY ERRORS }
const
MAKE_DPHRESULT = HResult($88770000);
DP_OK = HResult(S_OK);
DPERR_ALREADYINITIALIZED = HResult($88770000 + 5);
DPERR_ACCESSDENIED = HResult($88770000 + 10);
DPERR_ACTIVEPLAYERS = HResult($88770000 + 20);
DPERR_BUFFERTOOSMALL = HResult($88770000 + 30);
DPERR_CANTADDPLAYER = HResult($88770000 + 40);
DPERR_CANTCREATEGROUP = HResult($88770000 + 50);
DPERR_CANTCREATEPLAYER = HResult($88770000 + 60);
DPERR_CANTCREATESESSION = HResult($88770000 + 70);
DPERR_CAPSNOTAVAILABLEYET = HResult($88770000 + 80);
DPERR_EXCEPTION = HResult($88770000 + 90);
DPERR_GENERIC = HResult(E_FAIL);
DPERR_INVALIDFLAGS = HResult($88770000 + 120);
DPERR_INVALIDOBJECT = HResult($88770000 + 130);
DPERR_INVALIDPARAM = HResult(E_INVALIDARG);
DPERR_INVALIDPARAMS = HResult(DPERR_INVALIDPARAM);
DPERR_INVALIDPLAYER = HResult($88770000 + 150);
DPERR_INVALIDGROUP = HResult($88770000 + 155);
DPERR_NOCAPS = HResult($88770000 + 160);
DPERR_NOCONNECTION = HResult($88770000 + 170);
DPERR_NOMEMORY = HResult(E_OUTOFMEMORY);
DPERR_OUTOFMEMORY = HResult(DPERR_NOMEMORY);
DPERR_NOMESSAGES = HResult($88770000 + 190);
DPERR_NONAMESERVERFOUND = HResult($88770000 + 200);
DPERR_NOPLAYERS = HResult($88770000 + 210);
DPERR_NOSESSIONS = HResult($88770000 + 220);
DPERR_PENDING = HResult(E_PENDING);
DPERR_SENDTOOBIG = HResult($88770000 + 230);
DPERR_TIMEOUT = HResult($88770000 + 240);
DPERR_UNAVAILABLE = HResult($88770000 + 250);
DPERR_UNSUPPORTED = HResult(E_NOTIMPL);
DPERR_BUSY = HResult($88770000 + 270);
DPERR_USERCANCEL = HResult($88770000 + 280);
DPERR_NOINTERFACE = HResult(E_NOINTERFACE);
DPERR_CANNOTCREATESERVER = HResult($88770000 + 290);
DPERR_PLAYERLOST = HResult($88770000 + 300);
DPERR_SESSIONLOST = HResult($88770000 + 310);
DPERR_UNINITIALIZED = HResult($88770000 + 320);
DPERR_NONEWPLAYERS = HResult($88770000 + 330);
DPERR_INVALIDPASSWORD = HResult($88770000 + 340);
DPERR_CONNECTING = HResult($88770000 + 350);
DPERR_CONNECTIONLOST = HResult($88770000 + 360);
DPERR_UNKNOWNMESSAGE = HResult($88770000 + 370);
DPERR_CANCELFAILED = HResult($88770000 + 380);
DPERR_INVALIDPRIORITY = HResult($88770000 + 390);
DPERR_NOTHANDLED = HResult($88770000 + 400);
DPERR_CANCELLED = HResult($88770000 + 410);
DPERR_ABORTED = HResult($88770000 + 420);
DPERR_BUFFERTOOLARGE = HResult($88770000 + 1000);
DPERR_CANTCREATEPROCESS = HResult($88770000 + 1010);
DPERR_APPNOTSTARTED = HResult($88770000 + 1020);
DPERR_INVALIDINTERFACE = HResult($88770000 + 1030);
DPERR_NOSERVICEPROVIDER = HResult($88770000 + 1040);
DPERR_UNKNOWNAPPLICATION = HResult($88770000 + 1050);
DPERR_NOTLOBBIED = HResult($88770000 + 1070);
DPERR_SERVICEPROVIDERLOADED = HResult($88770000 + 1080);
DPERR_ALREADYREGISTERED = HResult($88770000 + 1090);
DPERR_NOTREGISTERED = HResult($88770000 + 1100);
 
DP_OK = S_OK;
DPERR_ALREADYINITIALIZED = MAKE_DPHRESULT + 5;
DPERR_ACCESSDENIED = MAKE_DPHRESULT + 10;
DPERR_ACTIVEPLAYERS = MAKE_DPHRESULT + 20;
DPERR_BUFFERTOOSMALL = MAKE_DPHRESULT + 30;
DPERR_CANTADDPLAYER = MAKE_DPHRESULT + 40;
DPERR_CANTCREATEGROUP = MAKE_DPHRESULT + 50;
DPERR_CANTCREATEPLAYER = MAKE_DPHRESULT + 60;
DPERR_CANTCREATESESSION = MAKE_DPHRESULT + 70;
DPERR_CAPSNOTAVAILABLEYET = MAKE_DPHRESULT + 80;
DPERR_EXCEPTION = MAKE_DPHRESULT + 90;
DPERR_GENERIC = E_FAIL;
DPERR_INVALIDFLAGS = MAKE_DPHRESULT + 120;
DPERR_INVALIDOBJECT = MAKE_DPHRESULT + 130;
DPERR_INVALIDPARAM = E_INVALIDARG;
DPERR_INVALIDPARAMS = DPERR_INVALIDPARAM;
DPERR_INVALIDPLAYER = MAKE_DPHRESULT + 150;
DPERR_INVALIDGROUP = MAKE_DPHRESULT + 155;
DPERR_NOCAPS = MAKE_DPHRESULT + 160;
DPERR_NOCONNECTION = MAKE_DPHRESULT + 170;
DPERR_NOMEMORY = E_OUTOFMEMORY;
DPERR_OUTOFMEMORY = DPERR_NOMEMORY;
DPERR_NOMESSAGES = MAKE_DPHRESULT + 190;
DPERR_NONAMESERVERFOUND = MAKE_DPHRESULT + 200;
DPERR_NOPLAYERS = MAKE_DPHRESULT + 210;
DPERR_NOSESSIONS = MAKE_DPHRESULT + 220;
DPERR_PENDING = E_PENDING;
DPERR_SENDTOOBIG = MAKE_DPHRESULT + 230;
DPERR_TIMEOUT = MAKE_DPHRESULT + 240;
DPERR_UNAVAILABLE = MAKE_DPHRESULT + 250;
DPERR_UNSUPPORTED = E_NOTIMPL;
DPERR_BUSY = MAKE_DPHRESULT + 270;
DPERR_USERCANCEL = MAKE_DPHRESULT + 280;
DPERR_NOINTERFACE = E_NOINTERFACE;
DPERR_CANNOTCREATESERVER = MAKE_DPHRESULT + 290;
DPERR_PLAYERLOST = MAKE_DPHRESULT + 300;
DPERR_SESSIONLOST = MAKE_DPHRESULT + 310;
DPERR_UNINITIALIZED = MAKE_DPHRESULT + 320;
DPERR_NONEWPLAYERS = MAKE_DPHRESULT + 330;
DPERR_INVALIDPASSWORD = MAKE_DPHRESULT + 340;
DPERR_CONNECTING = MAKE_DPHRESULT + 350;
DPERR_CONNECTIONLOST = MAKE_DPHRESULT + 360;
DPERR_UNKNOWNMESSAGE = MAKE_DPHRESULT + 370;
DPERR_CANCELFAILED = MAKE_DPHRESULT + 380;
DPERR_INVALIDPRIORITY = MAKE_DPHRESULT + 390;
DPERR_NOTHANDLED = MAKE_DPHRESULT + 400;
DPERR_CANCELLED = MAKE_DPHRESULT + 410;
DPERR_ABORTED = MAKE_DPHRESULT + 420;
{ Security related errors }
 
DPERR_AUTHENTICATIONFAILED = HResult($88770000 + 2000);
DPERR_CANTLOADSSPI = HResult($88770000 + 2010);
DPERR_ENCRYPTIONFAILED = HResult($88770000 + 2020);
DPERR_SIGNFAILED = HResult($88770000 + 2030);
DPERR_CANTLOADSECURITYPACKAGE = HResult($88770000 + 2040);
DPERR_ENCRYPTIONNOTSUPPORTED = HResult($88770000 + 2050);
DPERR_CANTLOADCAPI = HResult($88770000 + 2060);
DPERR_NOTLOGGEDIN = HResult($88770000 + 2070);
DPERR_LOGONDENIED = HResult($88770000 + 2080);
 
DPERR_BUFFERTOOLARGE = MAKE_DPHRESULT + 1000;
DPERR_CANTCREATEPROCESS = MAKE_DPHRESULT + 1010;
DPERR_APPNOTSTARTED = MAKE_DPHRESULT + 1020;
DPERR_INVALIDINTERFACE = MAKE_DPHRESULT + 1030;
DPERR_NOSERVICEPROVIDER = MAKE_DPHRESULT + 1040;
DPERR_UNKNOWNAPPLICATION = MAKE_DPHRESULT + 1050;
DPERR_NOTLOBBIED = MAKE_DPHRESULT + 1070;
DPERR_SERVICEPROVIDERLOADED = MAKE_DPHRESULT + 1080;
DPERR_ALREADYREGISTERED = MAKE_DPHRESULT + 1090;
DPERR_NOTREGISTERED = MAKE_DPHRESULT + 1100;
// define this to ignore obsolete interfaces and constants
 
//
// Security related errors
//
DPERR_AUTHENTICATIONFAILED = MAKE_DPHRESULT + 2000;
DPERR_CANTLOADSSPI = MAKE_DPHRESULT + 2010;
DPERR_ENCRYPTIONFAILED = MAKE_DPHRESULT + 2020;
DPERR_SIGNFAILED = MAKE_DPHRESULT + 2030;
DPERR_CANTLOADSECURITYPACKAGE = MAKE_DPHRESULT + 2040;
DPERR_ENCRYPTIONNOTSUPPORTED = MAKE_DPHRESULT + 2050;
DPERR_CANTLOADCAPI = MAKE_DPHRESULT + 2060;
DPERR_NOTLOGGEDIN = MAKE_DPHRESULT + 2070;
DPERR_LOGONDENIED = MAKE_DPHRESULT + 2080;
 
(****************************************************************************
*
* dplay 1.0 obsolete structures + interfaces
* Included for compatibility only. New apps should
* use IDirectPlay2
*
****************************************************************************)
 
DPOPEN_OPENSESSION = DPOPEN_JOIN;
DPOPEN_OPENSESSION = DPOPEN_JOIN;
DPOPEN_CREATESESSION = DPOPEN_CREATE;
 
DPENUMSESSIONS_PREVIOUS = $00000004;
15987,60 → 10586,90
DPENUMPLAYERS_PREVIOUS = $00000004;
 
DPSEND_GUARANTEE = DPSEND_GUARANTEED;
DPSEND_TRYONCE = $00000004;
DPSEND_TRYONCE = $00000004;
 
DPCAPS_NAMESERVICE = $00000001;
DPCAPS_NAMESERVER = DPCAPS_ISHOST;
DPCAPS_GUARANTEED = $00000004;
DPCAPS_NAMESERVER = DPCAPS_ISHOST;
DPCAPS_GUARANTEED = $00000004;
 
DPLONGNAMELEN = 52;
DPSHORTNAMELEN = 20;
DPLONGNAMELEN = 52;
DPSHORTNAMELEN = 20;
DPSESSIONNAMELEN = 32;
DPPASSWORDLEN = 16;
DPUSERRESERVED = 16;
DPPASSWORDLEN = 16;
DPUSERRESERVED = 16;
 
DPSYS_ADDPLAYER = $0003;
DPSYS_ADDPLAYER = $0003;
DPSYS_DELETEPLAYER = $0005;
 
DPSYS_DELETEGROUP = $0020;
DPSYS_DELETEGROUP = $0020;
DPSYS_DELETEPLAYERFROMGRP = $0021;
DPSYS_CONNECT = $484b;
DPSYS_CONNECT = $484b;
 
{ TDPMsg_AddPlayer }
 
type
PDPMsg_AddPlayer = ^TDPMsg_AddPlayer;
TDPMsg_AddPlayer = packed record
TDPMsg_AddPlayer = record
dwType: DWORD;
dwPlayerType: DWORD;
DPID: TDPID;
dpId: TDPID;
szLongName: array[0..DPLONGNAMELEN-1] of Char;
szShortName: array[0..DPSHORTNAMELEN-1] of Char;
dwCurrentPlayers: DWORD;
end;
 
DPMSG_ADDPLAYER = TDPMsg_AddPlayer;
LPDPMSG_ADDPLAYER = PDPMsg_AddPlayer;
 
{ TDPMsg_AddGroup }
 
PDPMsg_AddGroup = ^TDPMsg_AddGroup;
TDPMsg_AddGroup = TDPMsg_AddPlayer;
 
DPMSG_ADDGROUP = TDPMsg_AddGroup;
LPDPMSG_ADDGROUP = PDPMsg_AddGroup;
 
{ TDPMsg_GroupAdd }
 
PDPMsg_GroupAdd = ^TDPMsg_GroupAdd;
TDPMsg_GroupAdd = packed record
TDPMsg_GroupAdd = record
dwType: DWORD;
dpIdGroup: TDPID;
dpIdPlayer: TDPID;
end;
 
DPMSG_GROUPADD = TDPMsg_GroupAdd;
LPDPMSG_GROUPADD = PDPMsg_GroupAdd;
 
{ TDPMsg_GroupDelete }
 
PDPMsg_GroupDelete = ^TDPMsg_GroupDelete;
TDPMsg_GroupDelete = TDPMsg_GroupAdd;
 
DPMSG_GROUPDELETE = TDPMsg_GroupDelete;
LPDPMSG_GROUPDELETE = PDPMsg_GroupDelete;
 
{ TDPMsg_DeletePlayer }
 
PDPMsg_DeletePlayer = ^TDPMsg_DeletePlayer;
TDPMsg_DeletePlayer = packed record
TDPMsg_DeletePlayer = record
dwType: DWORD;
DPID: TDPID;
dpId: TDPID;
end;
 
TDPEnumPlayersCallback = function(dpId: TDPID; lpFriendlyName: PChar;
lpFormalName: PChar; dwFlags: DWORD; lpContext: Pointer) : BOOL; stdcall;
DPMSG_DELETEPLAYER = TDPMsg_DeletePlayer;
LPDPMSG_DELETEPLAYER = PDPMsg_DeletePlayer;
 
{ TDPEnumPlayersCallback }
 
TDPEnumPlayersCallback = function(dpId: TDPID; lpFriendlyName: LPSTR;
lpFormalName: LPSTR; dwFlags: DWORD; lpContext: Pointer): BOOL; stdcall;
LPDPENUMPLAYERSCALLBACK = TDPEnumPlayersCallback;
 
{ TDPSessionDesc }
 
PDPSessionDesc = ^TDPSessionDesc;
TDPSessionDesc = packed record
TDPSessionDesc = record
dwSize: DWORD;
guidSession: TGUID;
dwSession: DWORD;
16047,10 → 10676,10
dwMaxPlayers: DWORD;
dwCurrentPlayers: DWORD;
dwFlags: DWORD;
szSessionName: Array [0..DPSESSIONNAMELEN-1] of char;
szUserField: Array [0..DPUSERRESERVED-1] of char;
szSessionName: array[0..DPSESSIONNAMELEN-1] of char;
szUserField: array[0..DPUSERRESERVED-1] of char;
dwReserved1: DWORD;
szPassword: Array [0..DPPASSWORDLEN-1] of char;
szPassword: array[0..DPPASSWORDLEN-1] of char;
dwReserved2: DWORD;
dwUser1: DWORD;
dwUser2: DWORD;
16058,70 → 10687,59
dwUser4: DWORD;
end;
 
TDPEnumSessionsCallback = function(const lpDPSessionDesc: TDPSessionDesc;
lpContext: Pointer; var lpdwTimeOut: DWORD; dwFlags: DWORD) : BOOL; stdcall;
DPSESSIONDESC = TDPSessionDesc;
LPDPSESSIONDESC = PDPSessionDesc;
 
{ TDPEnumSessionsCallback }
 
TDPEnumSessionsCallback = function(var lpDPSessionDesc: TDPSessionDesc;
lpContext: Pointer; var lpdwTimeOut: DWORD; dwFlags: DWORD): BOOL; stdcall;
LPDPENUMSESSIONSCALLBACK = TDPEnumSessionsCallback;
 
type
IDirectPlay = interface (IUnknown)
['{5454e9a0-db65-11ce-921c-00aa006c4972}']
(*** IDirectPlay methods ***)
function AddPlayerToGroup(pidGroup: TDPID; pidPlayer: TDPID) : HResult; stdcall;
IDirectPlay = interface(IUnknown)
// IDirectPlay methods
function AddPlayerToGroup(pidGroup: TDPID; pidPlayer: TDPID): HResult; stdcall;
function Close: HResult; stdcall;
function CreatePlayer(out lppidID: TDPID; lpPlayerFriendlyName: PChar;
lpPlayerFormalName: PChar; lpEvent: PHandle) : HResult; stdcall;
function CreateGroup(out lppidID: TDPID; lpGroupFriendlyName: PChar;
lpGroupFormalName: PChar) : HResult; stdcall;
function DeletePlayerFromGroup(pidGroup: TDPID; pidPlayer: TDPID) : HResult; stdcall;
function DestroyPlayer(pidID: TDPID) : HResult; stdcall;
function DestroyGroup(pidID: TDPID) : HResult; stdcall;
function EnableNewPlayers(bEnable: BOOL) : HResult; stdcall;
function CreatePlayer(var lppidID: TDPID; lpPlayerFriendlyName: LPSTR;
lpPlayerFormalName: LPSTR; lpEvent: PHandle): HResult; stdcall;
function CreateGroup(var lppidID: TDPID; lpGroupFriendlyName: LPSTR;
lpGroupFormalName: LPSTR): HResult; stdcall;
function DeletePlayerFromGroup(pidGroup: TDPID; pidPlayer: TDPID): HResult; stdcall;
function DestroyPlayer(pidID: TDPID): HResult; stdcall;
function DestroyGroup(pidID: TDPID): HResult; stdcall;
function EnableNewPlayers(bEnable: BOOL): HResult; stdcall;
function EnumGroupPlayers(pidGroupPID: TDPID; lpEnumPlayersCallback:
TDPEnumPlayersCallback; lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
LPDPENUMPLAYERSCALLBACK; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function EnumGroups(dwSessionID: DWORD; lpEnumPlayersCallback:
TDPEnumPlayersCallback; lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
LPDPENUMPLAYERSCALLBACK; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function EnumPlayers(dwSessionId: DWORD; lpEnumPlayersCallback:
TDPEnumPlayersCallback; lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
function EnumSessions(var lpSDesc: TDPSessionDesc; dwTimeout: DWORD;
lpEnumSessionsCallback: TDPEnumSessionsCallback; lpContext: Pointer;
dwFlags: DWORD) : HResult; stdcall;
function GetCaps(var lpDPCaps: TDPCaps) : HResult; stdcall;
function GetMessageCount(pidID: TDPID; var lpdwCount: DWORD) : HResult; stdcall;
function GetPlayerCaps(pidID: TDPID; var lpDPPlayerCaps: TDPCaps) : HResult; stdcall;
function GetPlayerName(pidID: TDPID; lpPlayerFriendlyName: PChar;
var lpdwFriendlyNameLength: DWORD; lpPlayerFormalName: PChar;
var lpdwFormalNameLength: DWORD) : HResult; stdcall;
function Initialize(const lpGUID: TGUID) : HResult; stdcall;
function Open(var lpSDesc: TDPSessionDesc) : HResult; stdcall;
LPDPENUMPLAYERSCALLBACK; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function EnumSessions(const lpSDesc: TDPSessionDesc; dwTimeout: DWORD;
lpEnumSessionsCallback: TDPEnumPlayersCallback; lpContext: Pointer;
dwFlags: DWORD): HResult; stdcall;
function GetCaps(const lpDPCaps: TDPCaps): HResult; stdcall;
function GetMessageCount(pidID: TDPID; var lpdwCount: DWORD): HResult; stdcall;
function GetPlayerCaps(pidID: TDPID; const lpDPPlayerCaps: TDPCaps): HResult; stdcall;
function GetPlayerName(pidID: TDPID; lpPlayerFriendlyName: LPSTR;
var lpdwFriendlyNameLength: DWORD; lpPlayerFormalName: LPSTR;
var lpdwFormalNameLength: DWORD): HResult; stdcall;
function Initialize(const lpGUID: TGUID): HResult; stdcall;
function Open(const lpSDesc: TDPSessionDesc): HResult; stdcall;
function Receive(var lppidFrom, lppidTo: TDPID; dwFlags: DWORD;
var lpvBuffer; var lpdwSize: DWORD) : HResult; stdcall;
function SaveSession(lpSessionName: PChar) : HResult; stdcall;
var lpvBuffer; var lpdwSize: DWORD): HResult; stdcall;
function SaveSession(lpSessionName: LPSTR): HResult; stdcall;
function Send(pidFrom: TDPID; pidTo: TDPID; dwFlags: DWORD;
var lpvBuffer; dwBuffSize: DWORD) : HResult; stdcall;
function SetPlayerName(pidID: TDPID; lpPlayerFriendlyName: PChar;
lpPlayerFormalName: PChar) : HResult; stdcall;
const lpvBuffer; dwBuffSize: DWORD): HResult; stdcall;
function SetPlayerName(pidID: TDPID; lpPlayerFriendlyName: LPSTR;
lpPlayerFormalName: LPSTR): HResult; stdcall;
end;
 
(*
* GUIDS used by DirectPlay objects
*)
IID_IDirectPlay2W = IDirectPlay2W;
IID_IDirectPlay2A = IDirectPlay2A;
IID_IDirectPlay2 = IDirectPlay2;
{ API's (cont.) }
 
IID_IDirectPlay3W = IDirectPlay3W;
IID_IDirectPlay3A = IDirectPlay3A;
IID_IDirectPlay3 = IDirectPlay3;
function DirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay;
pUnk: IUnknown): HResult; stdcall;
 
IID_IDirectPlay4W = IDirectPlay4W;
IID_IDirectPlay4A = IDirectPlay4A;
IID_IDirectPlay4 = IDirectPlay4;
 
IID_IDirectPlay = IDirectPlay;
 
var
DirectPlayCreate : function (lpGUID: PGUID; out lplpDP: IDirectPlay;
pUnk: IUnknown) : HResult; stdcall;
 
(*==========================================================================;
*
* Copyright (C) 1996-1997 Microsoft Corporation. All Rights Reserved.
16128,364 → 10746,257
*
* File: dplobby.h
* Content: DirectPlayLobby include file
*
***************************************************************************)
 
(*
* GUIDS used by DirectPlay objects
*)
{ GUIDS used by DirectPlay objects }
 
const
(* {2FE8F810-B2A5-11d0-A787-0000F803ABFC} *)
CLSID_DirectPlayLobby: TGUID =
(D1:$2fe8f810;D2:$b2a5;D3:$11d0;D4:($a7,$87,$00,$00,$f8,$3,$ab,$fc));
CLSID_DirectPlayLobby: TGUID = '{2FE8F810-B2A5-11D0-A787-0000F803ABFC}';
 
(****************************************************************************
*
* IDirectPlayLobby Structures
*
* Various structures used to invoke DirectPlayLobby.
*
****************************************************************************)
IID_IDirectPlayLobby: TGUID = '{AF465C71-9588-11cf-A020-00AA006157AC}';
IID_IDirectPlayLobbyA: TGUID = '{26C66A70-B367-11cf-A024-00AA006157AC}';
IID_IDirectPlayLobby2: TGUID = '{0194C220-A303-11d0-9C4F-00A0C905425E}';
IID_IDirectPlayLobby2A: TGUID = '{1BB4AF80-A303-11d0-9C4F-00A0C905425E}';
IID_IDirectPlayLobby3: TGUID = '{2DB72490-652C-11d1-A7A8-0000F803ABFC}';
IID_IDirectPlayLobby3A: TGUID = '{2DB72491-652C-11d1-A7A8-0000F803ABFC}';
 
{ IDirectPlayLobby Structures }
 
{ TDPLAppInfo }
 
type
(*
* TDPLAppInfo
* Used to hold information about a registered DirectPlay
* application
*)
PDPLAppInfo = ^TDPLAppInfo;
TDPLAppInfo = packed record
TDPLAppInfo = record
dwSize: DWORD; // Size of this structure
guidApplication: TGUID; // GUID of the Application
case Integer of // Pointer to the Application Name
0: (lpszAppName: PCharAW);
1: (lpszAppNameW: PWideChar);
3: (lpszAppNameA: PChar);
0: (lpszAppNameA: LPSTR);
1: (lpszAppName: LPWSTR);
end;
 
(*
* TDPCompoundAddressElement
*
* An array of these is passed to CreateCompoundAddresses()
*)
DPLAPPINFO = TDPLAppInfo;
LPDPLAPPINFO = PDPLAppInfo;
 
{ TDPCompoundAddressElement }
 
PDPCompoundAddressElement = ^TDPCompoundAddressElement;
TDPCompoundAddressElement = packed record
TDPCompoundAddressElement = record
guidDataType: TGUID;
dwDataSize: DWORD;
lpData: Pointer;
end;
end;
 
(*
* TDPApplicationDesc
* Used to register a DirectPlay application
*)
DPCOMPOUNDADDRESSELEMENT = TDPCompoundAddressElement;
LPDPCOMPOUNDADDRESSELEMENT = PDPCompoundAddressElement;
 
{ TDPApplicationDesc }
 
PDPApplicationDesc = ^TDPApplicationDesc;
TDPApplicationDesc = packed record
TDPApplicationDesc = record
dwSize: DWORD;
dwFlags: DWORD;
case integer of
0 : (lpszApplicationName: PCharAW;
guidApplication: TGUID;
lpszFilename: PCharAW;
lpszCommandLine: PCharAW;
lpszPath: PCharAW;
lpszCurrentDirectory: PCharAW;
lpszDescriptionA: PAnsiChar;
lpszDescriptionW: PWideChar);
1 : (lpszApplicationNameA: PAnsiChar;
filler1: TGUID;
lpszFilenameA: PAnsiChar;
lpszCommandLineA: PAnsiChar;
lpszPathA: PAnsiChar;
lpszCurrentDirectoryA: PAnsiChar);
2 : (lpszApplicationNameW: PWideChar;
filler2: TGUID;
lpszFilenameW: PWideChar;
lpszCommandLineW: PWideChar;
lpszPathW: PWideChar;
lpszCurrentDirectoryW: PWideChar);
case Integer of
0: (
lpszApplicationNameA: LPSTR; // ANSI
guidApplication: TGUID;
lpszFilenameA: LPSTR;
lpszCommandLineA: LPSTR;
lpszPathA: LPSTR;
lpszCurrentDirectoryA: LPSTR;
lpszDescriptionA: LPSTR;
lpszDescriptionW: LPWSTR;
);
1: (
lpszApplicationName: LPWSTR; // Unicode
_union1b: TGUID;
lpszFilename: LPWSTR;
lpszCommandLine: LPWSTR;
lpszPath: LPWSTR;
lpszCurrentDirectory: LPWSTR;
_union1g: LPWSTR;
);
end;
 
(*
* TDPApplicationDesc2
* Used to register a DirectPlay application
*)
DPAPPLICATIONDESC = TDPApplicationDesc;
LPDPAPPLICATIONDESC = PDPApplicationDesc;
 
{ TDPApplicationDesc2 }
 
PDPApplicationDesc2 = ^TDPApplicationDesc2;
TDPApplicationDesc2 = packed record
TDPApplicationDesc2 = record
dwSize: DWORD;
dwFlags: DWORD;
case integer of
0 : (lpszApplicationName: PCharAW;
guidApplication: TGUID;
lpszFilename: PCharAW;
lpszCommandLine: PCharAW;
lpszPath: PCharAW;
lpszCurrentDirectory: PCharAW;
lpszDescriptionA: PAnsiChar;
lpszDescriptionW: PWideChar;
lpszAppLauncherName: PCharAW);
1 : (lpszApplicationNameA: PAnsiChar;
filler1: TGUID;
lpszFilenameA: PAnsiChar;
lpszCommandLineA: PAnsiChar;
lpszPathA: PAnsiChar;
lpszCurrentDirectoryA: PAnsiChar;
filler3: PChar;
filler4: PChar;
lpszAppLauncherNameA: PAnsiChar);
2 : (lpszApplicationNameW: PWideChar;
filler2: TGUID;
lpszFilenameW: PWideChar;
lpszCommandLineW: PWideChar;
lpszPathW: PWideChar;
lpszCurrentDirectoryW: PWideChar;
filler5: PChar;
filler6: PChar;
lpszAppLauncherNameW: PWideChar);
case Integer of
0: (
lpszApplicationNameA: LPSTR; // ANSI
guidApplication: TGUID;
lpszFilenameA: LPSTR;
lpszCommandLineA: LPSTR;
lpszPathA: LPSTR;
lpszCurrentDirectoryA: LPSTR;
lpszDescriptionA: LPSTR;
lpszDescriptionW: LPWSTR;
lpszAppLauncherNameA: LPSTR;
);
1: (
lpszApplicationName: LPWSTR; // Unicode
_union1b: TGUID;
lpszFilename: LPWSTR;
lpszCommandLine: LPWSTR;
lpszPath: LPWSTR;
lpszCurrentDirectory: LPWSTR;
_union1g: LPWSTR;
lpszAppLauncherName: LPWSTR;
);
end;
 
DPAPPLICATIONDESC2 = TDPApplicationDesc2;
LPDPAPPLICATIONDESC2 = PDPApplicationDesc2;
 
(****************************************************************************
*
* Enumeration Method Callback Prototypes
*
****************************************************************************)
{ Enumeration Method Callback Prototypes }
 
(*
* Callback for EnumAddress()
*)
TDPEnumAdressCallback = function(const guidDataType: TGUID;
dwDataSize: DWORD; lpData: Pointer; lpContext: Pointer) : BOOL; stdcall;
TDPEnumAddressCallback = function(const guidDataType: TGUID;
dwDataSize: DWORD; lpData: Pointer; lpContext: Pointer): BOOL; stdcall;
LPDPENUMADDRESSCALLBACK = TDPEnumAddressCallback;
 
(*
* Callback for EnumAddressTypes()
*)
TDPLEnumAddressTypesCallback = function(const guidDataType: TGUID;
lpContext: Pointer; dwFlags: DWORD) : BOOL; stdcall;
lpContext: Pointer; dwFlags: DWORD): BOOL; stdcall;
LPDPLENUMADDRESSTYPESCALLBACK = TDPLEnumAddressTypesCallback;
 
(*
* Callback for EnumLocalApplications()
*)
TDPLEnumLocalApplicationsCallback = function(const lpAppInfo: TDPLAppInfo;
lpContext: Pointer; dwFlags: DWORD) : BOOL; stdcall;
lpContext: Pointer; dwFlags: DWORD): BOOL; stdcall;
LPDPLENUMLOCALAPPLICATIONSCALLBACK = TDPLEnumLocalApplicationsCallback;
 
(****************************************************************************
*
* IDirectPlayLobby (and IDirectPlayLobbyA) Interface
*
****************************************************************************)
{ IDirectPlayLobby (and IDirectPlayLobbyA) Interface }
 
type
IDirectPlayLobbyAW = interface (IUnknown)
(*** IDirectPlayLobby methods ***)
IDirectPlayLobby = interface(IUnknown)
['{AF465C71-9588-11CF-A020-00AA006157AC}']
// IDirectPlayLobby methods
function Connect(dwFlags: DWORD; out lplpDP: IDirectPlay2;
pUnk: IUnknown) : HResult; stdcall;
function CreateAddress(const guidSP, guidDataType: TGUID; var lpData;
dwDataSize: DWORD; var lpAddress; var lpdwAddressSize: DWORD) : HResult; stdcall;
function EnumAddress(lpEnumAddressCallback: TDPEnumAdressCallback;
var lpAddress; dwAddressSize: DWORD; lpContext : Pointer) : HResult; stdcall;
pUnk: IUnknown): HResult; stdcall;
function CreateAddress(const guidSP, guidDataType: TGUID; const lpData;
dwDataSize: DWORD; var lpAddress; var lpdwAddressSize: DWORD): HResult; stdcall;
function EnumAddress(lpEnumAddressCallback: TDPEnumAddressCallback;
const lpAddress; dwAddressSize: DWORD; lpContext : Pointer): HResult; stdcall;
function EnumAddressTypes(lpEnumAddressTypeCallback:
TDPLEnumAddressTypesCallback; const guidSP: TGUID; lpContext: Pointer;
dwFlags: DWORD) : HResult; stdcall;
function EnumLocalApplications(lpEnumLocalAppCallback: TDPLEnumLocalApplicationsCallback;
lpContext: Pointer; dwFlags: DWORD) : HResult; stdcall;
function GetConnectionSettings(dwAppID: DWORD; lpData: PDPLConnection;
var lpdwDataSize: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function EnumLocalApplications(lpEnumLocalAppCallback:
TDPLEnumLocalApplicationsCallback; lpContext: Pointer; dwFlags: DWORD): HResult; stdcall;
function GetConnectionSettings(dwAppID: DWORD; var lpData: TDPLConnection;
var lpdwDataSize: DWORD): HResult; stdcall;
function ReceiveLobbyMessage(dwFlags: DWORD; dwAppID: DWORD;
var lpdwMessageFlags: DWORD; lpData: Pointer; var lpdwDataSize: DWORD) : HResult; stdcall;
var lpdwMessageFlags: DWORD; var lpData; var lpdwDataSize: DWORD): HResult; stdcall;
function RunApplication(dwFlags: DWORD; var lpdwAppId: DWORD;
const lpConn: TDPLConnection; hReceiveEvent: THandle) : HResult; stdcall;
const lpConn: TDPLConnection; hReceiveEvent: THandle): HResult; stdcall;
function SendLobbyMessage(dwFlags: DWORD; dwAppID: DWORD; const lpData;
dwDataSize: DWORD) : HResult; stdcall;
dwDataSize: DWORD): HResult; stdcall;
function SetConnectionSettings(dwFlags: DWORD; dwAppID: DWORD;
var lpConn: TDPLConnection) : HResult; stdcall;
const lpConn: TDPLConnection): HResult; stdcall;
function SetLobbyMessageEvent(dwFlags: DWORD; dwAppID: DWORD;
hReceiveEvent: THandle) : HResult; stdcall;
hReceiveEvent: THandle): HResult; stdcall;
end;
 
IDirectPlayLobbyW = interface (IDirectPlayLobbyAW)
['{AF465C71-9588-11CF-A020-00AA006157AC}']
IDirectPlayLobbyA = interface(IDirectPlayLobby)
['{26C66A70-B367-11CF-A024-00AA006157AC}']
end;
IDirectPlayLobbyA = interface (IDirectPlayLobbyAW)
['{26C66A70-B367-11cf-A024-00AA006157AC}']
end;
 
{$IFDEF UNICODE}
IDirectPlayLobby = IDirectPlayLobbyW;
{$ELSE}
IDirectPlayLobby = IDirectPlayLobbyA;
{$ENDIF}
{ IDirectPlayLobby2 (and IDirectPlayLobby2A) Interface }
 
 
(****************************************************************************
*
* IDirectPlayLobby2 (and IDirectPlayLobby2A) Interface
*
****************************************************************************)
 
IDirectPlayLobby2AW = interface(IDirectPlayLobbyAW)
(*** IDirectPlayLobby2 methods ***)
IDirectPlayLobby2 = interface(IDirectPlayLobby)
['{0194C220-A303-11D0-9C4F-00A0C905425E}']
// IDirectPlayLobby2 methods
function CreateCompoundAddress(const lpElements: TDPCompoundAddressElement;
dwElementCount: DWORD; lpAddress: Pointer; var lpdwAddressSize: DWORD) : HResult; stdcall;
dwElementCount: DWORD; var lpAddress; var lpdwAddressSize: DWORD): HResult; stdcall;
end;
 
IDirectPlayLobby2W = interface (IDirectPlayLobby2AW)
['{0194C220-A303-11D0-9C4F-00A0C905425E}']
IDirectPlayLobby2A = interface(IDirectPlayLobby2)
['{1BB4AF80-A303-11D0-9C4F-00A0C905425E}']
end;
IDirectPlayLobby2A = interface (IDirectPlayLobby2AW)
['{1BB4AF80-A303-11d0-9C4F-00A0C905425E}']
end;
 
{$IFDEF UNICODE}
IDirectPlayLobby2 = IDirectPlayLobby2W;
{$ELSE}
IDirectPlayLobby2 = IDirectPlayLobby2A;
{$ENDIF}
{ IDirectPlayLobby3 (and IDirectPlayLobby3A) Interface }
 
(****************************************************************************
*
* IDirectPlayLobby3 (and IDirectPlayLobby3A) Interface
*
****************************************************************************)
 
IDirectPlayLobby3AW = interface(IDirectPlayLobby2AW)
(*** IDirectPlayLobby3 methods ***)
function ConnectEx(dwFlags: DWORD; const riid: TGUID;
out lplpDP; pUnk: IUnknown) : HResult; stdcall;
function RegisterApplication(dwFlags: DWORD;
var lpAppDesc: TDPApplicationDesc) : HResult; stdcall;
function UnregisterApplication(dwFlags: DWORD;
const guidApplication: TGUID) : HResult; stdcall;
function WaitForConnectionSettings(dwFlags: DWORD) : HResult; stdcall;
end;
 
IDirectPlayLobby3W = interface (IDirectPlayLobby3AW)
IDirectPlayLobby3 = interface(IDirectPlayLobby2)
['{2DB72490-652C-11d1-A7A8-0000F803ABFC}']
// IDirectPlayLobby3 Methods
function ConnectEx(dwFlags: DWORD; const riid: TGUID; var lplpDP: Pointer;
pUnk: IUnknown): HResult; stdcall;
function RegisterApplication(dwFlags: DWORD; const lpAppDesc: TDPApplicationDesc): HResult; stdcall;
function UnRegisterApplication(dwFlags: DWORD; const guidApplication: TGUID): HResult; stdcall;
function WaitForConnectionSettings(dwFlags: DWORD): HResult; stdcall;
end;
IDirectPlayLobby3A = interface (IDirectPlayLobby3AW)
 
IDirectPlayLobby3A = interface(IDirectPlayLobby3)
['{2DB72491-652C-11d1-A7A8-0000F803ABFC}']
end;
 
{$IFDEF UNICODE}
IDirectPlayLobby3 = IDirectPlayLobby3W;
{$ELSE}
IDirectPlayLobby3 = IDirectPlayLobby3A;
{$ENDIF}
{ DirectPlayLobby API Prototypes }
 
IID_IDirectPlayLobbyW = IDirectPlayLobbyW;
IID_IDirectPlayLobbyA = IDirectPlayLobbyA;
IID_IDirectPlayLobby = IDirectPlayLobby;
function DirectPlayLobbyCreateW(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobby;
lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HResult; stdcall;
function DirectPlayLobbyCreateA(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HResult; stdcall;
function DirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HResult; stdcall;
 
IID_IDirectPlayLobby2W = IDirectPlayLobby2W;
IID_IDirectPlayLobby2A = IDirectPlayLobby2A;
IID_IDirectPlayLobby2 = IDirectPlayLobby2;
{ DirectPlayLobby Flags }
 
IID_IDirectPlayLobby3W = IDirectPlayLobby3W;
IID_IDirectPlayLobby3A = IDirectPlayLobby3A;
IID_IDirectPlayLobby3 = IDirectPlayLobby3;
const
DPLWAIT_CANCEL = $00000001;
 
(****************************************************************************
*
* DirectPlayLobby API Prototypes
*
****************************************************************************)
DPLMSG_SYSTEM = $00000001;
DPLMSG_STANDARD = $00000002;
 
var
DirectPlayLobbyCreateW : function (lpguidSP: PGUID; out lplpDPL:
IDirectPlayLobbyW; lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD) : HResult; stdcall;
DirectPlayLobbyCreateA : function (lpguidSP: PGUID; out lplpDPL:
IDirectPlayLobbyA; lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD) : HResult; stdcall;
DirectPlayLobbyCreate : function (lpguidSP: PGUID; out lplpDPL:
IDirectPlayLobby; lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD) : HResult; stdcall;
 
const
(****************************************************************************
*
* DirectPlayLobby Flags
*
****************************************************************************)
{ DirectPlayLobby messages and message data structures }
 
(*
* This flag is used by IDirectPlayLobby.WaitForConnectionSettings to
* cancel a current wait that is in progress.
*)
DPLWAIT_CANCEL = $00000001;
{ TDPLMsg_Generic }
 
(*
* This is a message flag used by ReceiveLobbyMessage. It can be
* returned in the dwMessageFlags parameter to indicate a message from
* the system.
*)
DPLMSG_SYSTEM = $00000001;
 
(*
* This is a message flag used by ReceiveLobbyMessage and SendLobbyMessage.
* It is used to indicate that the message is a standard lobby message.
* TDPLMsg_SetProperty, TDPLMsg_SetPropertyResponse, TDPLMsg_GetProperty,
* TDPLMsg_GetPropertyResponse
*)
DPLMSG_STANDARD = $00000002;
 
type
(****************************************************************************
*
* DirectPlayLobby messages and message data structures
*
* All system messages have a dwMessageFlags value of DPLMSG_SYSTEM returned
* from a call to ReceiveLobbyMessage.
*
* All standard messages have a dwMessageFlags value of DPLMSG_STANDARD returned
* from a call to ReceiveLobbyMessage.
*
****************************************************************************)
 
(*
* TDPLMsg_Generic
* Generic message structure used to identify the message type.
*)
PDPLMsg_Generic = ^TDPLMsg_Generic;
TDPLMsg_Generic = packed record
TDPLMsg_Generic = record
dwType: DWORD; // Message type
end;
 
(*
* TDPLMsg_SystemMessage
* Generic message format for all system messages --
* DPLSYS_CONNECTIONSETTINGSREAD, DPLSYS_DPLYCONNECTSUCCEEDED,
* DPLSYS_DPLAYCONNECTFAILED, DPLSYS_APPTERMINATED, DPLSYS_NEWCONNECTIONSETTINGS
*)
DPLMSG_GENERIC = TDPLMsg_Generic;
LPDPLMSG_GENERIC = PDPLMsg_Generic;
 
{ TDPLMsg_SystemMessage }
 
PDPLMsg_SystemMessage = ^TDPLMsg_SystemMessage;
TDPLMsg_SystemMessage = packed record
dwType: DWORD; // Message type
guidInstance: TGUID; // Instance GUID of the dplay session the message corresponds to
TDPLMsg_SystemMessage = record
dwType: DWORD; // Message type
guidInstance: TGUID; // Instance GUID of the dplay session the message corresponds to
end;
 
(*
* TDPLMsg_SetProperty
* Standard message sent by an application to a lobby to set a
* property
*)
DPLMSG_SYSTEMMESSAGE = TDPLMsg_SystemMessage;
LPDPLMSG_SYSTEMMESSAGE = PDPLMsg_SystemMessage;
 
{ TDPLMsg_SetProperty }
 
PDPLMsg_SetProperty = ^TDPLMsg_SetProperty;
TDPLMsg_SetProperty = packed record
TDPLMsg_SetProperty = record
dwType: DWORD; // Message type
dwRequestID: DWORD; // Request ID (DPL_NOCONFIRMATION if no confirmation desired)
guidPlayer: TGUID; // Player GUID
guidPropertyTag: TGUID; // Property GUID
dwDataSize: DWORD; // Size of data
dwPropertyData: array[0..0] of DWORD; // Buffer containing data
dwPropertyData: array[0..0] of DWORD; // Buffer containing data
end;
 
DPLMSG_SETPROPERTY = TDPLMsg_SetProperty;
LPDPLMSG_SETPROPERTY = PDPLMsg_SetProperty;
 
const
DPL_NOCONFIRMATION = 0;
 
{ TDPLMsg_SetPropertyResponse }
 
type
(*
* TDPLMsg_SetPropertyResponse
* Standard message returned by a lobby to confirm a
* TDPLMsg_SetProperty message.
*)
PDPLMsg_SetPropertyResponse = ^TDPLMsg_SetPropertyResponse;
TDPLMsg_SetPropertyResponse = packed record
TDPLMsg_SetPropertyResponse = record
dwType: DWORD; // Message type
dwRequestID: DWORD; // Request ID
guidPlayer: TGUID; // Player GUID
16493,27 → 11004,26
hr: HResult; // Return Code
end;
 
(*
* TDPLMsg_GetProperty
* Standard message sent by an application to a lobby to request
* the current value of a property
*)
DPLMSG_SETPROPERTYRESPONSE = TDPLMsg_SetPropertyResponse;
LPDPLMSG_SETPROPERTYRESPONSE = PDPLMsg_SetPropertyResponse;
 
{ TDPLMsg_GetProperty }
 
PDPLMsg_GetProperty = ^TDPLMsg_GetProperty;
TDPLMsg_GetProperty = packed record
TDPLMsg_GetProperty = record
dwType: DWORD; // Message type
dwRequestID: DWORD; // Request ID
guidPlayer: TGUID; // Player GUID
guidPropertyTag: TGUID; // Property GUID
end;
LPDPLMSG_GETPROPERTY = ^TDPLMsg_GetProperty;
 
(*
* TDPLMsg_GetPropertyResponse
* Standard message returned by a lobby in response to a
* TDPLMsg_GetProperty message.
*)
DPLMSG_GETPROPERTY = TDPLMsg_GetProperty;
LPDPLMSG_GETPROPERTY = PDPLMsg_GetProperty;
 
{ TDPLMsg_GetPropertyResponse }
 
PDPLMsg_GetPropertyResponse = ^TDPLMsg_GetPropertyResponse;
TDPLMsg_GetPropertyResponse = packed record
TDPLMsg_GetPropertyResponse = record
dwType: DWORD; // Message type
dwRequestID: DWORD; // Request ID
guidPlayer: TGUID; // Player GUID
16523,306 → 11033,106
dwPropertyData: array[0..0] of DWORD; // Buffer containing data
end;
 
(*
* TDPLMsg_NewSessionHost
* Standard message returned by a lobby in response to a
* the session host migrating to a new client
*)
DPLMSG_GETPROPERTYRESPONSE = TDPLMsg_GetPropertyResponse;
LPDPLMSG_GETPROPERTYRESPONSE = PDPLMsg_GetPropertyResponse;
 
{ TDPLMsg_NewSessionHost }
 
PDPLMsg_NewSessionHost = ^TDPLMsg_NewSessionHost;
TDPLMsg_NewSessionHost = packed record
TDPLMsg_NewSessionHost = record
dwType: DWORD; // Message type
guidInstance: TGUID; // Property GUID
guidInstance: TGUID; // GUID Instance of the session
end;
 
DPLMSG_NEWSESSIONHOST = TDPLMsg_NewSessionHost;
LPDPLMSG_NEWSESSIONHOST = PDPLMsg_NewSessionHost;
 
{ DirectPlay Lobby message dwType values }
 
const
(******************************************
*
* DirectPlay Lobby message dwType values
*
*****************************************)
 
(*
* The application has read the connection settings.
* It is now O.K. for the lobby client to release
* its IDirectPlayLobby interface.
*)
DPLSYS_CONNECTIONSETTINGSREAD = $00000001;
DPLSYS_DPLAYCONNECTFAILED = $00000002;
DPLSYS_DPLAYCONNECTSUCCEEDED = $00000003;
DPLSYS_APPTERMINATED = $00000004;
DPLSYS_SETPROPERTY = $00000005;
DPLSYS_SETPROPERTYRESPONSE = $00000006;
DPLSYS_GETPROPERTY = $00000007;
DPLSYS_GETPROPERTYRESPONSE = $00000008;
DPLSYS_NEWSESSIONHOST = $00000009;
DPLSYS_NEWCONNECTIONSETTINGS = $0000000A;
 
(*
* The application's call to DirectPlayConnect failed
*)
DPLSYS_DPLAYCONNECTFAILED = $00000002;
{ DirectPlay defined property GUIDs and associated data structures }
 
(*
* The application has created a DirectPlay session.
*)
DPLSYS_DPLAYCONNECTSUCCEEDED = $00000003;
DPLPROPERTY_MessagesSupported: TGUID = '{762CCDA1-D916-11d0-BA39-00C04FD7ED67}';
DPLPROPERTY_LobbyGuid: TGUID = '{F56920A0-D218-11d0-BA39-00C04FD7ED67}';
DPLPROPERTY_PlayerGuid: TGUID = '{B4319322-D20D-11d0-BA39-00C04FD7ED67}';
 
(*
* The application has terminated.
*)
DPLSYS_APPTERMINATED = $00000004;
{ TDPLData_PlayerGUID }
 
(*
* The message is a TDPLMsg_SetProperty message.
*)
DPLSYS_SETPROPERTY = $00000005;
 
(*
* The message is a TDPLMsg_SetPropertyResponse message.
*)
DPLSYS_SETPROPERTYRESPONSE = $00000006;
 
(*
* The message is a TDPLMsg_GetProperty message.
*)
DPLSYS_GETPROPERTY = $00000007;
 
(*
* The message is a TDPLMsg_GetPropertyResponse message.
*)
DPLSYS_GETPROPERTYRESPONSE = $00000008;
 
(*
* The message is a TDPLMsg_NewSessionHost message.
*)
DPLSYS_NEWSESSIONHOST = $00000009;
 
(*
* New connection settings are available.
*)
DPLSYS_NEWCONNECTIONSETTINGS = $0000000A;
 
(****************************************************************************
*
* DirectPlay defined property GUIDs and associated data structures
*
****************************************************************************)
 
(*
* DPLPROPERTY_MessagesSupported
*
* Request whether the lobby supports standard. Lobby with respond with either
* TRUE or FALSE or may not respond at all.
*
* Property data is a single BOOL with TRUE or FALSE
*)
// {762CCDA1-D916-11d0-BA39-00C04FD7ED67}
DPLPROPERTY_MessagesSupported: TGUID =
(D1:$762ccda1;D2:$d916;D3:$11d0;D4:($ba,$39,$00,$c0,$4f,$d7,$ed,$67));
 
(*
* DPLPROPERTY_LobbyGuid
*
* Request the GUID that identifies the lobby software that the application
* is communicating with.
*
* Property data is a single GUID.
*)
// {F56920A0-D218-11d0-BA39-00C04FD7ED67}
DPLPROPERTY_LobbyGuid: TGUID =
(D1:$F56920A0;D2:$D218;D3:$11d0;D4:($ba,$39,$00,$c0,$4f,$d7,$ed,$67));
 
(*
* DPLPROPERTY_PlayerGuid
*
* Request the GUID that identifies the player on this machine for sending
* property data back to the lobby.
*
* Property data is the DPLDATA_PLAYERDATA structure
*)
// {B4319322-D20D-11d0-BA39-00C04FD7ED67}
DPLPROPERTY_PlayerGuid: TGUID =
(D1:$b4319322;D2:$d20d;D3:$11d0;D4:($ba,$39,$00,$c0,$4f,$d7,$ed,$67));
 
type
(*
* TDPLData_PlayerGUID
*
* Data structure to hold the GUID of the player and player creation flags
* from the lobby.
*)
PDPLData_PlayerGUID = ^TDPLData_PlayerGUID;
TDPLData_PlayerGUID = packed record
TDPLData_PlayerGUID = record
guidPlayer: TGUID;
dwPlayerFlags: DWORD;
end;
 
DPLDATA_PLAYERGUID = TDPLData_PlayerGUID;
LPDPLDATA_PLAYERGUID = PDPLData_PlayerGUID;
 
{ DPLPROPERTY_PlayerScore }
 
const
(*
* DPLPROPERTY_PlayerScore
*
* Used to send an array of long integers to the lobby indicating the
* score of a player.
*
* Property data is the TDPLData_PlayerScore structure.
*)
// {48784000-D219-11d0-BA39-00C04FD7ED67}
DPLPROPERTY_PlayerScore: TGUID =
(D1:$48784000;D2:$d219;D3:$11d0;D4:($ba,$39,$00,$c0,$4f,$d7,$ed,$67));
DPLPROPERTY_PlayerScore: TGUID = '{48784000-D219-11d0-BA39-00C04FD7ED67}';
 
{ TDPLData_PlayerScore }
 
type
(*
* TDPLData_PlayerScore
*
* Data structure to hold an array of long integers representing a player score.
* Application must allocate enough memory to hold all the scores.
*)
PDPLData_PlayerScore = ^TDPLData_PlayerScore;
TDPLData_PlayerScore = packed record
TDPLData_PlayerScore = record
dwScoreCount: DWORD;
Score: array[0..0] of LongInt;
Score: array[0..0] of Longint;
end;
 
(****************************************************************************
*
* DirectPlay Address ID's
*
****************************************************************************)
DPLDATA_PLAYERSCORE = TDPLData_PlayerScore;
LPDPLDATA_PLAYERSCORE = PDPLData_PlayerScore;
 
(* DirectPlay Address
*
* A DirectPlay address consists of multiple chunks of data, each tagged
* with a GUID signifying the type of data in the chunk. The chunk also
* has a length so that unknown chunk types can be skipped.
*
* The EnumAddress() function is used to parse these address data chunks.
*)
{ DirectPlay Address ID's }
 
(*
* TDPAddress
*
* Header for block of address data elements
*)
type
PDPAddress = ^TDPAddress;
TDPAddress = packed record
TDPAddress = record
guidDataType: TGUID;
dwDataSize: DWORD;
end;
 
DPADDRESS = TDPAddress;
LPDPADDRESS = PDPAddress;
 
const
(*
* DPAID_TotalSize
*
* Chunk is a DWORD containing size of entire TDPAddress structure
*)
DPAID_TotalSize: TGUID = '{1318F560-912C-11d0-9DAA-00A0C90A43CB}';
DPAID_ServiceProvider: TGUID = '{07D916C0-E0AF-11cf-9C4E-00A0C905425E}';
DPAID_LobbyProvider: TGUID = '{59B95640-9667-11d0-A77D-0000F803ABFC}';
DPAID_Phone: TGUID = '{78EC89A0-E0AF-11cf-9C4E-00A0C905425E}';
DPAID_PhoneW: TGUID = '{BA5A7A70-9DBF-11d0-9CC1-00A0C905425E}';
DPAID_Modem: TGUID = '{F6DCC200-A2FE-11d0-9C4F-00A0C905425E}';
DPAID_ModemW: TGUID = '{01FD92E0-A2FF-11d0-9C4F-00A0C905425E}';
DPAID_INet: TGUID = '{C4A54DA0-E0AF-11cf-9C4E-00A0C905425E}';
DPAID_INetW: TGUID = '{E63232A0-9DBF-11d0-9CC1-00A0C905425E}';
DPAID_INetPort: TGUID = '{E4524541-8EA5-11d1-8A96-006097B01411}';
DPAID_MaxMessageSize: TGUID = '{F5D09980-F0C4-11d1-8326-006097B01411}';
 
// {1318F560-912C-11d0-9DAA-00A0C90A43CB}
DPAID_TotalSize: TGUID =
(D1:$1318f560;D2:$912c;D3:$11d0;D4:($9d,$aa,$00,$a0,$c9,$a,$43,$cb));
{ TDPComPortAddress }
 
(*
* DPAID_ServiceProvider
*
* Chunk is a GUID describing the service provider that created the chunk.
* All addresses must contain this chunk.
*)
const
DPCPA_NOFLOW = 0; // no flow control
DPCPA_XONXOFFFLOW = 1; // software flow control
DPCPA_RTSFLOW = 2; // hardware flow control with RTS
DPCPA_DTRFLOW = 3; // hardware flow control with DTR
DPCPA_RTSDTRFLOW = 4; // hardware flow control with RTS and DTR
 
// {07D916C0-E0AF-11cf-9C4E-00A0C905425E}
DPAID_ServiceProvider: TGUID =
(D1:$7d916c0;D2:$e0af;D3:$11cf;D4:($9c,$4e,$00,$a0,$c9,$5,$42,$5e));
 
(*
* DPAID_LobbyProvider
*
* Chunk is a GUID describing the lobby provider that created the chunk.
* All addresses must contain this chunk.
*)
 
// {59B95640-9667-11d0-A77D-0000F803ABFC}
DPAID_LobbyProvider: TGUID =
(D1:$59b95640;D2:$9667;D3:$11d0;D4:($a7,$7d,$00,$00,$f8,$3,$ab,$fc));
 
(*
* DPAID_Phone and DPAID_PhoneW
*
* Chunk is a string containing a phone number (i.e. "1-800-555-1212")
* in ANSI or UNICODE format
*)
 
// {78EC89A0-E0AF-11cf-9C4E-00A0C905425E}
DPAID_Phone: TGUID =
(D1:$78ec89a0;D2:$e0af;D3:$11cf;D4:($9c,$4e,$00,$a0,$c9,$5,$42,$5e));
 
// {BA5A7A70-9DBF-11d0-9CC1-00A0C905425E}
DPAID_PhoneW: TGUID =
(D1:$ba5a7a70;D2:$9dbf;D3:$11d0;D4:($9c,$c1,$00,$a0,$c9,$5,$42,$5e));
 
(*
* DPAID_Modem and DPAID_ModemW
*
* Chunk is a string containing a modem name registered with TAPI
* in ANSI or UNICODE format
*)
 
// {F6DCC200-A2FE-11d0-9C4F-00A0C905425E}
DPAID_Modem: TGUID =
(D1:$f6dcc200;D2:$a2fe;D3:$11d0;D4:($9c,$4f,$00,$a0,$c9,$5,$42,$5e));
 
// {01FD92E0-A2FF-11d0-9C4F-00A0C905425E}
DPAID_ModemW: TGUID =
(D1:$1fd92e0;D2:$a2ff;D3:$11d0;D4:($9c,$4f,$00,$a0,$c9,$5,$42,$5e));
 
(*
* DPAID_Inet and DPAID_InetW
*
* Chunk is a string containing a TCP/IP host name or an IP address
* (i.e. "dplay.microsoft.com" or "137.55.100.173") in ANSI or UNICODE format
*)
 
// {C4A54DA0-E0AF-11cf-9C4E-00A0C905425E}
DPAID_INet: TGUID =
(D1:$c4a54da0;D2:$e0af;D3:$11cf;D4:($9c,$4e,$00,$a0,$c9,$5,$42,$5e));
 
// {E63232A0-9DBF-11d0-9CC1-00A0C905425E}
DPAID_INetW: TGUID =
(D1:$e63232a0;D2:$9dbf;D3:$11d0;D4:($9c,$c1,$00,$a0,$c9,$5,$42,$5e));
 
(*
* DPAID_InetPort
*
* Chunk is the port number used for creating the apps TCP and UDP sockets.
* WORD value (i.e. 47624)
*)
 
// {E4524541-8EA5-11d1-8A96-006097B01411}
DPAID_INetPort: TGUID =
(D1:$e4524541;D2:$8ea5;D3:$11d1;D4:($8a,$96,$00,$60,$97,$b0,$14,$11));
 
//@@BEGIN_MSINTERNAL
(*
* DPAID_MaxMessageSize
*
* Tells DPLAY what the maximum allowed message size is. Enables SPs to
* combat Denial of Service attacks
*)
 
// this terrible hack is needed so the SP can work with the Elmer build.
// it can be removed when the MSINTERNAL stuff is removed
{$DEFINE MAXMSGSIZEGUIDDEFINED}
 
// {F5D09980-F0C4-11d1-8326-006097B01411}
DPAID_MaxMessageSize: TGUID =
(D1:$f5d09980;D2:$f0c4;D3:$11d1;D4:($83,$26,$00,$60,$97,$b0,$14,$11));
//@@END_MSINTERNAL
 
(*
* TDPComPortAddress
*
* Used to specify com port settings. The constants that define baud rate,
* stop bits and parity are defined in WINBASE.H. The constants for flow
* control are given below.
*)
 
DPCPA_NOFLOW = 0; // no flow control
DPCPA_XONXOFFFLOW = 1; // software flow control
DPCPA_RTSFLOW = 2; // hardware flow control with RTS
DPCPA_DTRFLOW = 3; // hardware flow control with DTR
DPCPA_RTSDTRFLOW = 4; // hardware flow control with RTS and DTR
 
type
PDPComPortAddress = ^TDPComPortAddress;
TDPComPortAddress = packed record
TDPComPortAddress = record
dwComPort: DWORD; // COM port to use (1-4)
dwBaudRate: DWORD; // baud rate (100-256k)
dwStopBits: DWORD; // no. stop bits (1-2)
16830,28 → 11140,16
dwFlowControl: DWORD; // flow control (none, xon/xoff, rts, dtr)
end;
 
DPCOMPORTADDRESS = TDPComPortAddress;
LPDPCOMPORTADDRESS = PDPComPortAddress;
 
const
(*
* DPAID_ComPort
*
* Chunk contains a TDPComPortAddress structure defining the serial port.
*)
DPAID_ComPort: TGUID = '{F2F0CE00-E0AF-11cf-9C4E-00A0C905425E}';
 
// {F2F0CE00-E0AF-11cf-9C4E-00A0C905425E}
DPAID_ComPort: TGUID =
(D1:$f2f0ce00;D2:$e0af;D3:$11cf;D4:($9c,$4e,$00,$a0,$c9,$5,$42,$5e));
{ dplobby 1.0 obsolete definitions }
 
(****************************************************************************
*
* dplobby 1.0 obsolete definitions
* Included for compatibility only.
*
****************************************************************************)
 
DPLAD_SYSTEM = DPLMSG_SYSTEM;
{$ENDIF} // UseDirectPlay
 
//DirectSetup file
(*==========================================================================
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
16859,28 → 11157,10
* File: dsetup.h
* Content: DirectXSetup, error codes and flags
*
* DirectX 7.0 Delphi adaptation by Erik Unger
*
* Modyfied: 05-Oct-99
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
***************************************************************************)
 
var
DSetupDLL : HModule;
 
type
PDLSVersion = ^TDLSVersion;
TDLSVersion = packed record
dwVersionMS: DWORD;
dwVersionLS: DWORD;
end;
 
 
const
FOURCC_VERS : array[0..3] of Char = ('v','e','r','s');
FOURCC_VERS = Ord('v') + Ord('e')*$100 + Ord('r')*$10000 + Ord('s')*$1000000;
 
// DSETUP Error Codes, must remain compatible with previous setup.
DSETUPERR_SUCCESS_RESTART = HResult(1);
16894,11 → 11174,10
DSETUPERR_CANTFINDINF = HResult(-7);
DSETUPERR_CANTFINDDIR = HResult(-8);
DSETUPERR_INTERNAL = HResult(-9);
DSETUPERR_NTWITHNO3D = HResult(-10); // REM: obsolete, you'll never see this
DSETUPERR_UNKNOWNOS = HResult(-11);
DSETUPERR_USERHITCANCEL = HResult(-12);
DSETUPERR_NOTPREINSTALLEDONNT = HResult(-13);
DSETUPERR_NEWERVERSION = HResult(-14);
DSETUPERR_NEWERVERSION = HResult(-14);
 
// DSETUP flags. DirectX 5.0 apps should use these flags only.
DSETUP_DDRAWDRV = $00000008; (* install DirectDraw Drivers *)
16906,13 → 11185,12
DSETUP_DXCORE = $00010000; (* install DirectX runtime *)
DSETUP_DIRECTX = DSETUP_DXCORE or DSETUP_DDRAWDRV or DSETUP_DSOUNDDRV;
DSETUP_TESTINSTALL = $00020000; (* just test install, don't do anything *)
DSETUP_USEROLDERFLAG= $02000000; (* enable return DSETUPERR_NEWERVERSION *)
// Bug #22730
DSETUP_NTINSTALL = $00080000; (* install on Win2K platform *)
DSETUP_USEROLDERFLAG = $02000000; (* enable return DSETUPERR_NEWERVERSION *)
 
// These OBSOLETE flags are here for compatibility with pre-DX5 apps only.
// They are present to allow DX3 apps to be recompiled with DX5 and still work.
// DO NOT USE THEM for DX5. They will go away in future DX releases.
 
DSETUP_DDRAW = $00000001; (* OBSOLETE. install DirectDraw *)
DSETUP_DSOUND = $00000002; (* OBSOLETE. install DirectSound *)
DSETUP_DPLAY = $00000004; (* OBSOLETE. install DirectPlay *)
16964,21 → 11242,45
DSETUP_CB_UPGRADE_DEVICE_DISPLAY = $1000;
DSETUP_CB_UPGRADE_DEVICE_MEDIA = $2000;
 
type
 
type
{ TDLSVersion }
 
PDLSVersion = ^TDLSVersion;
TDLSVersion = record
dwVersionMS: DWORD;
dwVersionLS: WORD;
end;
 
DLSVERSION = TDLSVersion;
LPDLSVERSION = PDLSVersion;
 
{ TDSetup_CB_UpgradeInfo }
 
PDSetup_CB_UpgradeInfo = ^TDSetup_CB_UpgradeInfo;
TDSetup_CB_UpgradeInfo = record
UpgradeFlags: DWORD;
end;
 
DSETUP_CB_UPGRADEINFO = TDSetup_CB_UpgradeInfo;
LPDSETUP_CB_UPGRADEINFO = PDSetup_CB_UpgradeInfo;
 
{ TDSetup_CB_FileCopyError }
 
PDSetup_CB_FileCopyError = ^TDSetup_CB_FileCopyError;
TDSetup_CB_FileCopyError = record
dwError: DWORD;
end;
 
DSETUP_CB_FILECOPYERROR = TDSetup_CB_FileCopyError;
LPDSETUP_CB_FILECOPYERROR = PDSetup_CB_FileCopyError;
 
//
// Data Structures
//
 
{ TDirectXRegisterAppA }
 
PDirectXRegisterAppA = ^TDirectXRegisterAppA;
TDirectXRegisterAppA = record
dwSize: DWORD;
16991,6 → 11293,11
lpszCurrentDirectory: PAnsiChar;
end;
 
DIRECTXREGISTERAPPA = TDirectXRegisterAppA;
LPDIRECTXREGISTERAPPA = PDirectXRegisterAppA;
 
{ TDirectXRegisterApp2A }
 
PDirectXRegisterApp2A = ^TDirectXRegisterApp2A;
TDirectXRegisterApp2A = record
dwSize: DWORD;
17004,6 → 11311,11
lpszLauncherName: PAnsiChar;
end;
 
DIRECTXREGISTERAPP2A = TDirectXRegisterApp2A;
LPDIRECTXREGISTERAPP2A = PDirectXRegisterApp2A;
 
{ TDirectXRegisterAppW }
 
PDirectXRegisterAppW = ^TDirectXRegisterAppW;
TDirectXRegisterAppW = record
dwSize: DWORD;
17016,6 → 11328,11
lpszCurrentDirectory: PWideChar;
end;
 
DIRECTXREGISTERAPPW = TDirectXRegisterAppW;
LPDIRECTXREGISTERAPPW = PDirectXRegisterAppW;
 
{ TDirectXRegisterApp2W }
 
PDirectXRegisterApp2W = ^TDirectXRegisterApp2W;
TDirectXRegisterApp2W = record
dwSize: DWORD;
17029,102 → 11346,75
lpszLauncherName: PWideChar;
end;
 
PDirectXRegisterApp = ^TDirectXRegisterApp;
PDirectXRegisterApp2 = ^TDirectXRegisterApp2;
{$IFDEF UNICODE}
TDirectXRegisterApp = TDirectXRegisterAppW;
TDirectXRegisterApp2 = TDirectXRegisterApp2W;
{$ELSE}
DIRECTXREGISTERAPP2W = TDirectXRegisterApp2W;
LPDIRECTXREGISTERAPP2W = PDirectXRegisterApp2W;
 
{ TDirectXRegisterApp }
 
PDirectXRegisterApp = PDirectXRegisterAppA;
TDirectXRegisterApp = TDirectXRegisterAppA;
 
PDirectXRegisterApp2 = PDirectXRegisterApp2A;
TDirectXRegisterApp2 = TDirectXRegisterApp2A;
{$ENDIF}
 
//
// API
//
var
DirectXSetupW : function (hWnd: HWND; lpszRootPath: PWideChar; dwFlags: DWORD) : Integer; stdcall;
DirectXSetupA : function (hWnd: HWND; lpszRootPath: PAnsiChar; dwFlags: DWORD) : Integer; stdcall;
DirectXSetup : function (hWnd: HWND; lpszRootPath: PCharAW; dwFlags: DWORD) : Integer; stdcall;
DIRECTXREGISTERAPP = TDirectXRegisterApp;
LPDIRECTXREGISTERAPP = PDirectXRegisterApp;
 
DirectXDeviceDriverSetupW : function (hWnd: HWND; lpszDriverClass: PWideChar;
lpszDriverPath: PWideChar; dwFlags: DWORD) : Integer; stdcall;
DirectXDeviceDriverSetupA : function (hWnd: HWND; lpszDriverClass: PAnsiChar;
lpszDriverPath: PAnsiChar; dwFlags: DWORD) : Integer; stdcall;
DirectXDeviceDriverSetup : function (hWnd: HWND; lpszDriverClass: PCharAW;
lpszDriverPath: PCharAW; dwFlags: DWORD) : Integer; stdcall;
DIRECTXREGISTERAPP2 = TDirectXRegisterApp2;
LPDIRECTXREGISTERAPP2 = PDirectXRegisterApp2;
 
DirectXRegisterApplicationW : function
(hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppW) : Integer; stdcall;
DirectXRegisterApplicationA : function
(hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppA) : Integer; stdcall;
DirectXRegisterApplication : function
(hWnd: HWND; const lpDXRegApp: TDirectXRegisterApp) : Integer; stdcall;
{ API }
 
DirectXUnRegisterApplication : function
(hWnd: HWND; const lpGUID: TGUID) : Integer; stdcall;
function DirectXSetupA(hWnd: HWND; lpszRootPath: PAnsiChar; dwFlags: DWORD): Longint; stdcall;
function DirectXSetupW(hWnd: HWND; lpszRootPath: PWideChar; dwFlags: DWORD): Longint; stdcall;
function DirectXSetup(hWnd: HWND; lpszRootPath: PAnsiChar; dwFlags: DWORD): Longint; stdcall;
 
function DirectXDeviceDriverSetupA(hWnd: HWND; lpszDriverClass: PAnsiChar;
lpszDriverPath: PAnsiChar; dwFlags: DWORD): Longint; stdcall;
function DirectXDeviceDriverSetupW(hWnd: HWND; lpszDriverClass: PWideChar;
lpszDriverPath: PWideChar; dwFlags: DWORD): Longint; stdcall;
function DirectXDeviceDriverSetup(hWnd: HWND; lpszDriverClass: PAnsiChar;
lpszDriverPath: PAnsiChar; dwFlags: DWORD): Longint; stdcall;
 
function DirectXRegisterApplicationA(hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppA): Longint; stdcall;
function DirectXRegisterApplicationW(hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppW): Longint; stdcall;
function DirectXRegisterApplication(hWnd: HWND; const lpDXRegApp: TDirectXRegisterAppA): Longint; stdcall;
function DirectXUnRegisterApplication(hWnd: HWND; const lpGUID: TGUID): Longint; stdcall;
 
type
TDSetup_Callback = function (Reason: DWORD; MsgType: DWORD; // Same as flags to MessageBox
szMessage: PChar; szName: PChar; pInfo: Pointer) : DWORD; stdcall;
TDSetup_Callback = function (Reason: DWORD; MsgType: DWORD;
szMessage: PAnsiChar; szName: PAnsiChar; pInfo: Pointer): DWORD; stdcall;
DSETUP_CALLBACK = TDSetup_Callback;
 
var
DirectXSetupSetCallback : function (Callback: TDSetup_Callback) : Integer; stdcall;
function DirectXSetupSetCallback(Callback: TDSetup_Callback): Longint; stdcall;
function DirectXSetupGetVersion(var lpdwVersion, lpdwMinorVersion: DWORD): Longint; stdcall;
 
DirectXSetupGetVersion : function (out lpdwVersion, lpdwMinorVersion: DWORD) : Integer; stdcall;
 
//DirectSound file
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
* Copyright (C) 1995,1996 Microsoft Corporation. All Rights Reserved.
*
* File: dsound.h
* Content: DirectSound include file
*
* DirectX 7.0 Delphi adaptation by Erik Unger
*
* Modified: 10-Sep-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
***************************************************************************)
**************************************************************************)
 
{
Windows 98 and debug versions DInput and DSound
{ GUIDS used by DirectDraw objects }
 
Under Windows 98, the "debug" setup of the DirectX SDK 6.x skips DInput.DLL
and DSound.DLL, i.e. makes you end up with the retail version of these two
files without any notice.
The debug versions of DInput.DLL and DSound.DLL can be found in the
\extras\Win98\Win98Dbg folder of the SDK CD; they need to be installed
"manually".
}
const
CLSID_DirectSound: TGUID = '{47D4D946-62E8-11cf-93BC-444553540000}';
CLSID_DirectSoundCapture: TGUID = '{B0210780-89CD-11d0-AF08-00A0C925CD16}';
 
IID_IDirectSound: TGUID = '{279AFA83-4981-11CE-A521-0020AF0BE560}';
IID_IDirectSoundBuffer: TGUID = '{279AFA85-4981-11CE-A521-0020AF0BE560}';
IID_IDirectSound3DListener: TGUID = '{279AFA84-4981-11CE-A521-0020AF0BE560}';
IID_IDirectSound3DBuffer: TGUID = '{279AFA86-4981-11CE-A521-0020AF0BE560}';
IID_IDirectSoundCapture: TGUID = '{B0210781-89CD-11D0-AF08-00A0C925CD16}';
IID_IDirectSoundCaptureBuffer: TGUID = '{B0210782-89CD-11D0-AF08-00A0C925CD16}';
 
var
DSoundDLL : HMODULE;
function DSErrorString(Value: HResult) : string;
IID_IDirectSoundNotify: TGUID = '{B0210783-89CD-11D0-AF08-00A0C925CD16}';
 
const
_FACDS = $878;
function MAKE_DSHResult(code: DWORD) : HResult;
{ DirectSound Structures }
 
const
FLT_MIN = 1.175494351E-38;
FLT_MAX = 3.402823466E+38;
const
// Direct Sound Component GUID {47D4D946-62E8-11cf-93BC-444553540000}
CLSID_DirectSound: TGUID = '{47D4D946-62E8-11cf-93BC-444553540000}';
 
// DirectSound Capture Component GUID {B0210780-89CD-11d0-AF08-00A0C925CD16}
CLSID_DirectSoundCapture: TGUID = '{47D4D946-62E8-11cf-93BC-444553540000}';
 
//
// Structures
//
type
IDirectSound = interface;
IDirectSoundBuffer = interface;
17133,10 → 11423,11
IDirectSoundCapture = interface;
IDirectSoundCaptureBuffer = interface;
IDirectSoundNotify = interface;
IKsPropertySet = interface;
 
{ TDSCaps }
 
PDSCaps = ^TDSCaps;
TDSCaps = packed record
TDSCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwMinSecondarySampleRate: DWORD;
17162,10 → 11453,14
dwReserved1: DWORD;
dwReserved2: DWORD;
end;
PCDSCaps = ^TDSCaps;
 
DSCAPS = TDSCaps;
LPDSCAPS = PDSCaps;
 
{ TDSBCaps }
 
PDSBCaps = ^TDSBCaps;
TDSBCaps = packed record
TDSBCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
17172,61 → 11467,45
dwUnlockTransferRate: DWORD;
dwPlayCpuOverhead: DWORD;
end;
PCDSBCaps = ^TDSBCaps;
 
TDSBufferDesc_DX6 = packed record
DSBCAPS = TDSBCaps;
LPDSBCAPS = DSBCAPS;
 
{ TDSBufferDesc }
 
PDSBufferDesc = ^TDSBufferDesc;
TDSBufferDesc = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
lpwfxFormat: PWaveFormatEx;
{$IFDEF SupportDirectX7}
guid3DAlgorithm: TGUID;
{$ENDIF}
end;
 
TDSBufferDesc1 = TDSBufferDesc_DX6;
DSBUFFERDESC = TDSBufferDesc;
LPDSBUFFERDESC = PDSBufferDesc;
 
{ TDSBufferDesc1 }
 
PDSBufferDesc1 = ^TDSBufferDesc1;
PCDSBufferDesc1 = PDSBufferDesc1;
 
TDSBufferDesc_DX7 = packed record
TDSBufferDesc1 = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
lpwfxFormat: PWaveFormatEx;
guid3DAlgorithm: TGUID;
end;
 
{$IFDEF DIRECTX6}
TDSBufferDesc = TDSBufferDesc_DX6;
{$ELSE}
TDSBufferDesc = TDSBufferDesc_DX7;
{$ENDIF}
DSBUFFERDESC1 = TDSBufferDesc1;
LPDSBUFFERDESC1 = PDSBufferDesc1;
 
PDSBufferDesc = ^TDSBufferDesc;
PCDSBufferDesc = PDSBufferDesc;
{ TDS3DBuffer }
 
(***
// Snipped from D3DTypes.pas:
 
TD3DValue = Single;
 
PD3DVector = ^TD3DVector;
TD3DVector = packed record
case Integer of
0: (
x: TD3DValue;
y: TD3DValue;
z: TD3DValue;
);
1: (
dvX: TD3DValue;
dvY: TD3DValue;
dvZ: TD3DValue;
);
end;
*)
 
PDS3DBuffer = ^TDS3DBuffer;
TDS3DBuffer = packed record
TDS3DBuffer = record
dwSize: DWORD;
vPosition: TD3DVector;
vVelocity: TD3DVector;
17233,15 → 11512,19
dwInsideConeAngle: DWORD;
dwOutsideConeAngle: DWORD;
vConeOrientation: TD3DVector;
lConeOutsideVolume: LongInt;
lConeOutsideVolume: Longint;
flMinDistance: TD3DValue;
flMaxDistance: TD3DValue;
dwMode: DWORD;
end;
TCDS3DBuffer = ^TDS3DBuffer;
 
DS3DBUFFER = TDS3DBuffer;
LPDS3DBUFFER = PDS3DBuffer;
 
{ TDS3DListener }
 
PDS3DListener = ^TDS3DListener;
TDS3DListener = packed record
TDS3DListener = record
dwSize: DWORD;
vPosition: TD3DVector;
vVelocity: TD3DVector;
17251,19 → 11534,27
flRolloffFactor: TD3DValue;
flDopplerFactor: TD3DValue;
end;
PCDS3DListener = ^TDS3DListener;
 
DS3DLISTENER = TDS3DListener;
LPDS3DLISTENER = PDS3DListener;
 
{ TDSCCaps }
 
PDSCCaps = ^TDSCCaps;
TDSCCaps = packed record
TDSCCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwFormats: DWORD;
dwChannels: DWORD;
end;
PCDSCCaps = ^TDSCCaps;
 
DSCCAPS = TDSCCaps;
LPDSCCAPS = PDSCCaps;
 
{ TDSCBufferDesc }
 
PDSCBufferDesc = ^TDSCBufferDesc;
TDSCBufferDesc = packed record
TDSCBufferDesc = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
17270,499 → 11561,381
dwReserved: DWORD;
lpwfxFormat: PWaveFormatEx;
end;
PCDSCBufferDesc = ^TDSCBufferDesc;
 
DSCBUFFERDESC = TDSCBufferDesc;
LPDSCBUFFERDESC = PDSCBufferDesc;
 
{ TDSCBCaps }
 
PDSCBCaps = ^TDSCBCaps;
TDSCBCaps = packed record
TDSCBCaps = record
dwSize: DWORD;
dwFlags: DWORD;
dwBufferBytes: DWORD;
dwReserved: DWORD;
end;
PCDSCBCaps = ^TDSCBCaps;
 
DSCBCAPS = TDSCBCaps;
LPDSCBCAPS = PDSCBCaps;
 
{ TDSBPositionNotify }
 
PDSBPositionNotify = ^TDSBPositionNotify;
TDSBPositionNotify = packed record
TDSBPositionNotify = record
dwOffset: DWORD;
hEventNotify: THandle;
end;
PCDSBPositionNotify = ^TDSBPositionNotify;
 
//
// DirectSound API
//
TDSEnumCallbackW = function (lpGuid: PGUID; lpstrDescription: PWideChar;
lpstrModule: PWideChar; lpContext: Pointer) : BOOL; stdcall;
TDSEnumCallbackA = function (lpGuid: PGUID; lpstrDescription: PAnsiChar;
lpstrModule: PAnsiChar; lpContext: Pointer) : BOOL; stdcall;
{$IFDEF UNICODE}
TDSEnumCallback = TDSEnumCallbackW;
{$ELSE}
TDSEnumCallback = TDSEnumCallbackA;
{$ENDIF}
DSBPOSITIONNOTIFY = TDSBPositionNotify;
LPDSBPOSITIONNOTIFY = PDSBPositionNotify;
 
//
// IDirectSound
//
IDirectSound = interface (IUnknown)
{ IDirectSound }
 
IDirectSound = interface(IUnknown)
['{279AFA83-4981-11CE-A521-0020AF0BE560}']
// IDirectSound methods
function CreateSoundBuffer(const lpDSBufferDesc: TDSBufferDesc;
out lpIDirectSoundBuffer: IDirectSoundBuffer;
pUnkOuter: IUnknown) : HResult; stdcall;
function GetCaps(var lpDSCaps: TDSCaps) : HResult; stdcall;
out lplpDirectSoundBuffer: IDirectSoundBuffer;
pUnkOuter: IUnknown): HResult; stdcall;
function GetCaps(var lpDSCaps: TDSCaps): HResult; stdcall;
function DuplicateSoundBuffer(lpDsbOriginal: IDirectSoundBuffer;
out lpDsbDuplicate: IDirectSoundBuffer) : HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwLevel: DWORD) : HResult; stdcall;
out lpDsbDuplicate: IDirectSoundBuffer): HResult; stdcall;
function SetCooperativeLevel(hwnd: HWND; dwLevel: DWORD): HResult; stdcall;
function Compact: HResult; stdcall;
function GetSpeakerConfig(var lpdwSpeakerConfig: DWORD) : HResult; stdcall;
function SetSpeakerConfig(dwSpeakerConfig: DWORD) : HResult; stdcall;
function Initialize(lpGuid: PGUID) : HResult; stdcall;
function GetSpeakerConfig(var lpdwSpeakerConfig: DWORD): HResult; stdcall;
function SetSpeakerConfig(dwSpeakerConfig: DWORD): HResult; stdcall;
function Initialize(lpGuid: PGUID): HResult; stdcall;
end;
 
//
// IDirectSoundBuffer
//
IDirectSoundBuffer = interface (IUnknown)
{ IDirectSoundBuffer }
 
IDirectSoundBuffer = interface(IUnknown)
['{279AFA85-4981-11CE-A521-0020AF0BE560}']
// IDirectSoundBuffer methods
function GetCaps(var lpDSCaps: TDSBCaps) : HResult; stdcall;
function GetCurrentPosition
(lpdwCapturePosition, lpdwReadPosition : PDWORD) : HResult; stdcall;
function GetFormat(lpwfxFormat: PWaveFormatEx; dwSizeAllocated: DWORD;
lpdwSizeWritten: PWORD) : HResult; stdcall;
function GetVolume(var lplVolume: integer) : HResult; stdcall;
function GetPan(var lplPan: integer) : HResult; stdcall;
function GetFrequency(var lpdwFrequency: DWORD) : HResult; stdcall;
function GetStatus(var lpdwStatus: DWORD) : HResult; stdcall;
function Initialize(lpDirectSound: IDirectSound;
const lpcDSBufferDesc: TDSBufferDesc) : HResult; stdcall;
function Lock(dwWriteCursor, dwWriteBytes: DWORD;
function GetCaps(var lpDSBufferCaps: TDSBCaps): HResult; stdcall;
function GetCurrentPosition(var lpdwCurrentPlayCursor,
lpdwCurrentWriteCursor: DWORD): HResult; stdcall;
function GetFormat(var lpwfxFormat: TWaveFormatEx; dwSizeAllocated: DWORD;
var lpdwSizeWritten: DWORD): HResult; stdcall;
function GetVolume(var lplVolume: Longint): HResult; stdcall;
function GetPan(var lplPan: Longint): HResult; stdcall;
function GetFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
function GetStatus(var lpdwStatus: DWORD): HResult; stdcall;
function Initialize(lpDirectSound: IDirectSound; const
lpDSBufferDesc: TDSBufferDesc): HResult; stdcall;
function Lock(dwWriteCursor: DWORD; dwWriteBytes: DWORD;
var lplpvAudioPtr1: Pointer; var lpdwAudioBytes1: DWORD;
var lplpvAudioPtr2: Pointer; var lpdwAudioBytes2: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function Play(dwReserved1,dwReserved2,dwFlags: DWORD) : HResult; stdcall;
function SetCurrentPosition(dwPosition: DWORD) : HResult; stdcall;
function SetFormat(const lpcfxFormat: TWaveFormatEx) : HResult; stdcall;
function SetVolume(lVolume: integer) : HResult; stdcall;
function SetPan(lPan: integer) : HResult; stdcall;
function SetFrequency(dwFrequency: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function Play(dwReserved1, dwReserved2: DWORD; dwFlags: DWORD): HResult; stdcall;
function SetCurrentPosition(dwNewPosition: DWORD): HResult; stdcall;
function SetFormat(const lpfxFormat: TWaveFormatEx): HResult; stdcall;
function SetVolume(lVolume: Longint): HResult; stdcall;
function SetPan(lPan: Longint): HResult; stdcall;
function SetFrequency(dwFrequency: DWORD): HResult; stdcall;
function Stop: HResult; stdcall;
function Unlock(lpvAudioPtr1: Pointer; dwAudioBytes1: DWORD;
lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD) : HResult; stdcall;
lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD): HResult; stdcall;
function Restore: HResult; stdcall;
end;
 
//
// IDirectSound3DListener
//
IDirectSound3DListener = interface (IUnknown)
{ IDirectSound3DListener }
 
IDirectSound3DListener = interface(IUnknown)
['{279AFA84-4981-11CE-A521-0020AF0BE560}']
// IDirectSound3D methods
function GetAllParameters(var lpListener: TDS3DListener) : HResult; stdcall;
function GetDistanceFactor(var lpflDistanceFactor: TD3DValue) : HResult; stdcall;
function GetDopplerFactor(var lpflDopplerFactor: TD3DValue) : HResult; stdcall;
function GetOrientation
(var lpvOrientFront, lpvOrientTop: TD3DVector) : HResult; stdcall;
function GetPosition(var lpvPosition: TD3DVector) : HResult; stdcall;
function GetRolloffFactor(var lpflRolloffFactor: TD3DValue) : HResult; stdcall;
function GetVelocity(var lpvVelocity: TD3DVector) : HResult; stdcall;
function SetAllParameters
(const lpcListener: TDS3DListener; dwApply: DWORD) : HResult; stdcall;
function SetDistanceFactor
(flDistanceFactor: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetDopplerFactor
(flDopplerFactor: TD3DValue; dwApply: DWORD) : HResult; stdcall;
// IDirectSound3DListener methods
function GetAllParameters(var lpListener: TDS3DListener): HResult; stdcall;
function GetDistanceFactor(var lpflDistanceFactor: TD3DValue): HResult; stdcall;
function GetDopplerFactor(var lpflDopplerFactor: TD3DValue): HResult; stdcall;
function GetOrientation(var lpvOrientFront, lpvOrientTop: TD3DVector): HResult; stdcall;
function GetPosition(var lpvPosition: TD3DVector): HResult; stdcall;
function GetRolloffFactor(var lpflRolloffFactor: TD3DValue): HResult; stdcall;
function GetVelocity(var lpvVelocity: TD3DVector): HResult; stdcall;
function SetAllParameters(const lpListener: TDS3DListener; dwApply: DWORD): HResult; stdcall;
function SetDistanceFactor(flDistanceFactor: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetDopplerFactor(flDopplerFactor: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetOrientation(xFront, yFront, zFront, xTop, yTop, zTop: TD3DValue;
dwApply: DWORD) : HResult; stdcall;
function SetPosition(x, y, z: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetRolloffFactor
(flRolloffFactor: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetVelocity(x, y, z: TD3DValue; dwApply: DWORD) : HResult; stdcall;
dwApply: DWORD): HResult; stdcall;
function SetPosition(x, y, z: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetRolloffFactor(flRolloffFactor: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetVelocity(x, y, z: TD3DValue; dwApply: DWORD): HResult; stdcall;
function CommitDeferredSettings: HResult; stdcall;
end;
 
{ IDirectSound3DBuffer }
 
//
// IDirectSound3DBuffer
//
IDirectSound3DBuffer = interface (IUnknown)
IDirectSound3DBuffer = interface(IUnknown)
['{279AFA86-4981-11CE-A521-0020AF0BE560}']
// IDirectSoundBuffer3D methods
function GetAllParameters(var lpDs3dBuffer: TDS3DBuffer) : HResult; stdcall;
function GetConeAngles
(var lpdwInsideConeAngle, lpdwOutsideConeAngle: DWORD) : HResult; stdcall;
function GetConeOrientation(var lpvOrientation: TD3DVector) : HResult; stdcall;
function GetConeOutsideVolume(var lplConeOutsideVolume: integer) : HResult; stdcall;
function GetMaxDistance(var lpflMaxDistance: TD3DValue) : HResult; stdcall;
function GetMinDistance(var lpflMinDistance: TD3DValue) : HResult; stdcall;
function GetMode(var lpdwMode: DWORD) : HResult; stdcall;
function GetPosition(var lpvPosition: TD3DVector) : HResult; stdcall;
function GetVelocity(var lpvVelocity: TD3DVector) : HResult; stdcall;
function SetAllParameters
(const lpcDs3dBuffer: TDS3DBuffer; dwApply: DWORD) : HResult; stdcall;
function SetConeAngles
(dwInsideConeAngle, dwOutsideConeAngle, dwApply: DWORD) : HResult; stdcall;
function SetConeOrientation(x, y, z: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetConeOutsideVolume
(lConeOutsideVolume: LongInt; dwApply: DWORD) : HResult; stdcall;
function SetMaxDistance(flMaxDistance: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetMinDistance(flMinDistance: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetMode(dwMode: DWORD; dwApply: DWORD) : HResult; stdcall;
function SetPosition(x, y, z: TD3DValue; dwApply: DWORD) : HResult; stdcall;
function SetVelocity(x, y, z: TD3DValue; dwApply: DWORD) : HResult; stdcall;
// IDirectSound3DBuffer methods
function GetAllParameters(var lpDs3dBuffer: TDS3DBuffer): HResult; stdcall;
function GetConeAngles(var lpdwInsideConeAngle: DWORD;
var lpdwOutsideConeAngle: DWORD): HResult; stdcall;
function GetConeOrientation(var lpvOrientation: TD3DVector): HResult; stdcall;
function GetConeOutsideVolume(var lplConeOutsideVolume: Longint): HResult; stdcall;
function GetMaxDistance(var lpflMaxDistance: TD3DValue): HResult; stdcall;
function GetMinDistance(var lpflMinDistance: TD3DValue): HResult; stdcall;
function GetMode(var lpdwMod: DWORD): HResult; stdcall;
function GetPosition(var lpvPosition: TD3DVector): HResult; stdcall;
function GetVelocity(var lpvVelocity: TD3DVector): HResult; stdcall;
function SetAllParameters(const lpDs3dBuffer: TDS3DBuffer; dwApply: DWORD): HResult; stdcall;
function SetConeAngles(dwInsideConeAngle: DWORD; dwOutsideConeAngle: DWORD;
dwApply: DWORD): HResult; stdcall;
function SetConeOrientation(x, y, z: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetConeOutsideVolume(lConeOutsideVolume: Longint; dwApply: DWORD): HResult; stdcall;
function SetMaxDistance(flMaxDistance: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetMinDistance(flMinDistance: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetMode(dwMode: DWORD; dwApply: DWORD): HResult; stdcall;
function SetPosition(x, y, z: TD3DValue; dwApply: DWORD): HResult; stdcall;
function SetVelocity(x, y, z: TD3DValue; dwApply: DWORD): HResult; stdcall;
end;
 
{ IDirectSoundCapture }
 
//
// IDirectSoundCapture
//
IDirectSoundCapture = interface (IUnknown)
['{b0210781-89cd-11d0-af08-00a0c925cd16}']
IDirectSoundCapture = interface(IUnknown)
['{B0210781-89CD-11D0-AF08-00A0C925CD16}']
// IDirectSoundCapture methods
function CreateCaptureBuffer(const lpDSCBufferDesc: TDSCBufferDesc;
var lplpDirectSoundCaptureBuffer: IDirectSoundCaptureBuffer;
pUnkOuter: IUnknown) : HResult; stdcall;
function GetCaps(var lpdwCaps: TDSCCaps) : HResult; stdcall;
function Initialize(lpGuid: PGUID) : HResult; stdcall;
out lplpDirectSoundCaptureBuffer: IDirectSoundCaptureBuffer;
pUnkOuter: IUnknown): HResult; stdcall;
function GetCaps(var lpDSCCaps: TDSCCaps): HResult; stdcall;
function Initialize(lpGuid: PGUID): HResult; stdcall;
end;
 
{ IDirectSoundCaptureBuffer }
 
//
// IDirectSoundCaptureBuffer
//
IDirectSoundCaptureBuffer = interface (IUnknown)
['{b0210782-89cd-11d0-af08-00a0c925cd16}']
IDirectSoundCaptureBuffer = interface(IUnknown)
['{B0210782-89CD-11D0-AF08-00A0C925CD16}']
// IDirectSoundCaptureBuffer methods
function GetCaps(var lpdwCaps: TDSCBCaps) : HResult; stdcall;
function GetCurrentPosition
(lpdwCapturePosition, lpdwReadPosition: PDWORD) : HResult; stdcall;
function GetFormat(lpwfxFormat: PWaveFormatEx; dwSizeAllocated: DWORD;
lpdwSizeWritten : PDWORD) : HResult; stdcall;
function GetStatus(var lpdwStatus: DWORD) : HResult; stdcall;
function GetCaps(var lpDSCBCaps: TDSCBCaps): HResult; stdcall;
function GetCurrentPosition(var lpdwCapturePosition,
lpdwReadPosition: DWORD): HResult; stdcall;
function GetFormat(var lpwfxFormat: TWaveFormatEx; dwSizeAllocated: DWORD;
var lpdwSizeWritten: DWORD): HResult; stdcall;
function GetStatus(var lpdwStatus: DWORD): HResult; stdcall;
function Initialize(lpDirectSoundCapture: IDirectSoundCapture;
const lpcDSBufferDesc: TDSCBufferDesc) : HResult; stdcall;
function Lock(dwReadCursor, dwReadBytes: DWORD;
const lpcDSBufferDesc: TDSCBufferDesc): HResult; stdcall;
function Lock(dwReadCursor: DWORD; dwReadBytes: DWORD;
var lplpvAudioPtr1: Pointer; var lpdwAudioBytes1: DWORD;
var lplpvAudioPtr2: Pointer; var lpdwAudioBytes2: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function Start(dwFlags: DWORD) : HResult; stdcall;
dwFlags: DWORD): HResult; stdcall;
function Start(dwFlags: DWORD): HResult; stdcall;
function Stop: HResult; stdcall;
function Unlock(lpvAudioPtr1: Pointer; dwAudioBytes1: DWORD;
lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD) : HResult; stdcall;
lpvAudioPtr2: Pointer; dwAudioBytes2: DWORD): HResult; stdcall;
end;
 
//
// IDirectSoundNotify
//
IDirectSoundNotify = interface (IUnknown)
['{b0210783-89cd-11d0-af08-00a0c925cd16}']
{ IDirectSoundNotify }
 
IDirectSoundNotify = interface(IUnknown)
['{B0210783-89CD-11D0-AF08-00A0C925CD16}']
// IDirectSoundNotify methods
function SetNotificationPositions(cPositionNotifies: DWORD;
const lpcPositionNotifies: TDSBPositionNotify) : HResult; stdcall;
const lpcPositionNotifies): HResult; stdcall;
end;
 
//
// IKsPropertySet
//
IKsPropertySet = interface (IUnknown)
['{31efac30-515c-11d0-a9aa-00aa0061be93}']
// IKsPropertySet methods
function Get(const rguidPropSet: TGUID; ulId: DWORD; var pInstanceData;
ulInstanceLength: DWORD; var pPropertyData; ulDataLength: DWORD;
var pulBytesReturned: DWORD) : HResult; stdcall;
// Warning: The following method is defined as Set() in DirectX
// which is a reserved word in Delphi!
function SetProperty(const rguidPropSet: TGUID; ulId: DWORD;
var pInstanceData; ulInstanceLength: DWORD;
var pPropertyData; pulDataLength: DWORD) : HResult; stdcall;
function QuerySupport(const rguidPropSet: TGUID; ulId: DWORD;
var pulTypeSupport: DWORD) : HResult; stdcall;
end;
{ IKsPropertySet }
 
 
const
KSPROPERTY_SUPPORT_GET = $00000001;
KSPROPERTY_SUPPORT_SET = $00000002;
 
//
// GUID's for all the objects
//
IID_IKsPropertySet: TGUID = (D1:$31efac30;D2:$515c;D3:$11d0;D4:($a9,$aa,$00,$aa,$00,$61,$be,$93));
 
type
IID_IDirectSound = IDirectSound;
IID_IDirectSoundBuffer = IDirectSoundBuffer;
IID_IDirectSound3DListener = IDirectSound3DListener;
IID_IDirectSound3DBuffer = IDirectSound3DBuffer;
IID_IDirectSoundCapture = IDirectSoundCapture;
IID_IDirectSoundCaptureBuffer = IDirectSoundCaptureBuffer;
IID_IDirectSoundNotify = IDirectSoundNotify;
IID_IKsPropertySet = IKsPropertySet;
IKsPropertySet = interface;
 
//
// Creation Routines
//
var
DirectSoundCreate : function ( lpGuid: PGUID; out ppDS: IDirectSound;
pUnkOuter: IUnknown) : HResult; stdcall;
IKsPropertySet = interface(IUnknown)
['{31EFAC30-515C-11D0-A9AA-00AA0061BE93}']
// IKsPropertySet methods
function GetProperty(const PropertySetId: TGUID; PropertyId: DWORD;
var pPropertyParams; cbPropertyParams: DWORD;
var pPropertyData; cbPropertyData: DWORD;
var pcbReturnedData: ULONG): HResult; stdcall;
function SetProperty(const PropertySetId: TGUID; PropertyId: DWORD;
const pPropertyParams; cbPropertyParams: DWORD;
const pPropertyData; cbPropertyData: DWORD): HResult; stdcall;
function QuerySupport(const PropertySetId: TGUID; PropertyId: DWORD;
var pSupport: ULONG): HResult; stdcall;
end;
 
DirectSoundEnumerateW : function (lpDSEnumCallback: TDSEnumCallbackW;
lpContext: Pointer) : HResult; stdcall;
DirectSoundEnumerateA : function (lpDSEnumCallback: TDSEnumCallbackA;
lpContext: Pointer) : HResult; stdcall;
DirectSoundEnumerate : function (lpDSEnumCallback: TDSEnumCallback;
lpContext: Pointer) : HResult; stdcall;
{ Return Codes }
 
DirectSoundCaptureCreate : function (lpGUID: PGUID;
out lplpDSC: IDirectSoundCapture;
pUnkOuter: IUnknown) : HResult; stdcall;
 
DirectSoundCaptureEnumerateW : function (lpDSEnumCallback: TDSEnumCallbackW;
lpContext: Pointer) : HResult; stdcall;
DirectSoundCaptureEnumerateA : function (lpDSEnumCallback: TDSEnumCallbackA;
lpContext: Pointer) : HResult; stdcall;
DirectSoundCaptureEnumerate : function(lpDSEnumCallback: TDSEnumCallback;
lpContext: Pointer) : HResult; stdcall;
 
 
//
// Return Codes
//
 
const
MAKE_DSHRESULT_ = HResult($88780000);
DS_OK = HResult(S_OK);
DS_NO_VIRTUALIZATION = HResult($878000A);
DSERR_ALLOCATED = HResult($88780000 + 10);
DSERR_CONTROLUNAVAIL = HResult($88780000 + 30);
DSERR_INVALIDPARAM = HResult(E_INVALIDARG);
DSERR_INVALIDCALL = HResult($88780000 + 50);
DSERR_GENERIC = HResult(E_FAIL);
DSERR_PRIOLEVELNEEDED = HResult($88780000 + 70);
DSERR_OUTOFMEMORY = HResult(E_OUTOFMEMORY);
DSERR_BADFORMAT = HResult($88780000 + 100);
DSERR_UNSUPPORTED = HResult(E_NOTIMPL);
DSERR_NODRIVER = HResult($88780000 + 120);
DSERR_ALREADYINITIALIZED = HResult($88780000 + 130);
DSERR_NOAGGREGATION = HResult(CLASS_E_NOAGGREGATION);
DSERR_BUFFERLOST = HResult($88780000 + 150);
DSERR_OTHERAPPHASPRIO = HResult($88780000 + 160);
DSERR_UNINITIALIZED = HResult($88780000 + 170);
DSERR_NOINTERFACE = HResult(E_NOINTERFACE);
DSERR_ACCESSDENIED = HResult(E_ACCESSDENIED);
 
DS_OK = 0;
{ Flags }
 
// The function completed successfully, but we had to substitute the 3D algorithm
DS_NO_VIRTUALIZATION = MAKE_DSHRESULT_ + 10;
DSCAPS_PRIMARYMONO = $00000001;
DSCAPS_PRIMARYSTEREO = $00000002;
DSCAPS_PRIMARY8BIT = $00000004;
DSCAPS_PRIMARY16BIT = $00000008;
DSCAPS_CONTINUOUSRATE = $00000010;
DSCAPS_EMULDRIVER = $00000020;
DSCAPS_CERTIFIED = $00000040;
DSCAPS_SECONDARYMONO = $00000100;
DSCAPS_SECONDARYSTEREO = $00000200;
DSCAPS_SECONDARY8BIT = $00000400;
DSCAPS_SECONDARY16BIT = $00000800;
 
// The call failed because resources (such as a priority level)
// were already being used by another caller.
DSERR_ALLOCATED = MAKE_DSHRESULT_ + 10;
DSSCL_NORMAL = $00000001;
DSSCL_PRIORITY = $00000002;
DSSCL_EXCLUSIVE = $00000003;
DSSCL_WRITEPRIMARY = $00000004;
 
// The control (vol,pan,etc.) requested by the caller is not available.
DSERR_CONTROLUNAVAIL = MAKE_DSHRESULT_ + 30;
 
// An invalid parameter was passed to the returning function
DSERR_INVALIDPARAM = E_INVALIDARG;
 
// This call is not valid for the current state of this object
DSERR_INVALIDCALL = MAKE_DSHRESULT_ + 50;
 
// An undetermined error occured inside the DirectSound subsystem
DSERR_GENERIC = E_FAIL;
 
// The caller does not have the priority level required for the function to
// succeed.
DSERR_PRIOLEVELNEEDED = MAKE_DSHRESULT_ + 70;
 
// Not enough free memory is available to complete the operation
DSERR_OUTOFMEMORY = E_OUTOFMEMORY;
 
// The specified WAVE format is not supported
DSERR_BADFORMAT = MAKE_DSHRESULT_ + 100;
 
// The function called is not supported at this time
DSERR_UNSUPPORTED = E_NOTIMPL;
 
// No sound driver is available for use
DSERR_NODRIVER = MAKE_DSHRESULT_ + 120;
 
// This object is already initialized
DSERR_ALREADYINITIALIZED = MAKE_DSHRESULT_ + 130;
 
// This object does not support aggregation
DSERR_NOAGGREGATION = CLASS_E_NOAGGREGATION;
 
// The buffer memory has been lost, and must be restored.
DSERR_BUFFERLOST = MAKE_DSHRESULT_ + 150;
 
// Another app has a higher priority level, preventing this call from
// succeeding.
DSERR_OTHERAPPHASPRIO = MAKE_DSHRESULT_ + 160;
 
// This object has not been initialized
DSERR_UNINITIALIZED = MAKE_DSHRESULT_ + 170;
 
// The requested COM interface is not available
DSERR_NOINTERFACE = E_NOINTERFACE;
 
// Access is denied
DSERR_ACCESSDENIED = E_ACCESSDENIED;
 
//
// Flags
//
 
DSCAPS_PRIMARYMONO = $00000001;
DSCAPS_PRIMARYSTEREO = $00000002;
DSCAPS_PRIMARY8BIT = $00000004;
DSCAPS_PRIMARY16BIT = $00000008;
DSCAPS_CONTINUOUSRATE = $00000010;
DSCAPS_EMULDRIVER = $00000020;
DSCAPS_CERTIFIED = $00000040;
DSCAPS_SECONDARYMONO = $00000100;
DSCAPS_SECONDARYSTEREO = $00000200;
DSCAPS_SECONDARY8BIT = $00000400;
DSCAPS_SECONDARY16BIT = $00000800;
 
DSSCL_NORMAL = $00000001;
DSSCL_PRIORITY = $00000002;
DSSCL_EXCLUSIVE = $00000003;
DSSCL_WRITEPRIMARY = $00000004;
 
DSSPEAKER_HEADPHONE = $00000001;
DSSPEAKER_MONO = $00000002;
DSSPEAKER_QUAD = $00000003;
DSSPEAKER_STEREO = $00000004;
DSSPEAKER_SURROUND = $00000005;
DSSPEAKER_5POINT1 = $00000006;
DSSPEAKER_MONO = $00000002;
DSSPEAKER_QUAD = $00000003;
DSSPEAKER_STEREO = $00000004;
DSSPEAKER_SURROUND = $00000005;
DSSPEAKER_5POINT1 = $00000006;
 
DSSPEAKER_GEOMETRY_MIN = $00000005; // 5 degrees
DSSPEAKER_GEOMETRY_NARROW = $0000000A; // 10 degrees
DSSPEAKER_GEOMETRY_WIDE = $00000014; // 20 degrees
DSSPEAKER_GEOMETRY_MAX = $000000B4; // 180 degrees
DSSPEAKER_GEOMETRY_MIN = $00000005;
DSSPEAKER_GEOMETRY_NARROW = $0000000A;
DSSPEAKER_GEOMETRY_WIDE = $00000014;
DSSPEAKER_GEOMETRY_MAX = $000000B4;
 
function DSSPEAKER_COMBINED(c, g: variant) : DWORD;
function DSSPEAKER_CONFIG(a: variant) : byte;
function DSSPEAKER_GEOMETRY(a: variant) : byte;
 
const
DSBCAPS_PRIMARYBUFFER = $00000001;
DSBCAPS_STATIC = $00000002;
DSBCAPS_LOCHARDWARE = $00000004;
DSBCAPS_LOCSOFTWARE = $00000008;
DSBCAPS_CTRL3D = $00000010;
DSBCAPS_CTRLFREQUENCY = $00000020;
DSBCAPS_CTRLPAN = $00000040;
DSBCAPS_CTRLVOLUME = $00000080;
DSBCAPS_CTRLPOSITIONNOTIFY = $00000100;
DSBCAPS_STICKYFOCUS = $00004000;
DSBCAPS_GLOBALFOCUS = $00008000;
DSBCAPS_PRIMARYBUFFER = $00000001;
DSBCAPS_STATIC = $00000002;
DSBCAPS_LOCHARDWARE = $00000004;
DSBCAPS_LOCSOFTWARE = $00000008;
DSBCAPS_CTRL3D = $00000010;
DSBCAPS_CTRLFREQUENCY = $00000020;
DSBCAPS_CTRLPAN = $00000040;
DSBCAPS_CTRLVOLUME = $00000080;
DSBCAPS_CTRLPOSITIONNOTIFY = $00000100;
DSBCAPS_CTRLDEFAULT = $000000E0;
DSBCAPS_CTRLALL = $000001F0;
DSBCAPS_STICKYFOCUS = $00004000;
DSBCAPS_GLOBALFOCUS = $00008000;
DSBCAPS_GETCURRENTPOSITION2 = $00010000;
DSBCAPS_MUTE3DATMAXDISTANCE = $00020000;
DSBCAPS_LOCDEFER = $00040000;
 
DSBPLAY_LOOPING = $00000001;
DSBPLAY_LOCHARDWARE = $00000002;
DSBPLAY_LOCSOFTWARE = $00000004;
DSBPLAY_TERMINATEBY_TIME = $00000008;
DSBPLAY_TERMINATEBY_DISTANCE = $000000010;
DSBPLAY_TERMINATEBY_PRIORITY = $000000020;
DSBPLAY_LOOPING = $00000001;
DSBPLAY_LOCHARDWARE = $00000002;
DSBPLAY_LOCSOFTWARE = $00000004;
DSBPLAY_TERMINATEBY_TIME = $00000008;
DSBPLAY_TERMINATEBY_DISTANCE = $00000010;
DSBPLAY_TERMINATEBY_PRIORITY = $00000020;
 
DSBSTATUS_PLAYING = $00000001;
DSBSTATUS_BUFFERLOST = $00000002;
DSBSTATUS_LOOPING = $00000004;
DSBSTATUS_LOCHARDWARE = $00000008;
DSBSTATUS_LOCSOFTWARE = $00000010;
DSBSTATUS_TERMINATED = $00000020;
DSBSTATUS_PLAYING = $00000001;
DSBSTATUS_BUFFERLOST = $00000002;
DSBSTATUS_LOOPING = $00000004;
DSBSTATUS_LOCHARDWARE = $00000008;
DSBSTATUS_LOCSOFTWARE = $00000010;
DSBSTATUS_TERMINATED = $00000020;
 
DSBLOCK_FROMWRITECURSOR = $00000001;
DSBLOCK_ENTIREBUFFER = $00000002;
DSBLOCK_ENTIREBUFFER = $00000002;
 
DSBFREQUENCY_MIN = 100;
DSBFREQUENCY_MAX = 100000;
DSBFREQUENCY_ORIGINAL = 0;
DSBFREQUENCY_MIN = 100;
DSBFREQUENCY_MAX = 100000;
DSBFREQUENCY_ORIGINAL = 0;
 
DSBPAN_LEFT = -10000;
DSBPAN_CENTER = 0;
DSBPAN_RIGHT = 10000;
DSBPAN_LEFT = -10000;
DSBPAN_CENTER = 0;
DSBPAN_RIGHT = 10000;
 
DSBVOLUME_MIN = -10000;
DSBVOLUME_MAX = 0;
DSBVOLUME_MIN = -10000;
DSBVOLUME_MAX = 0;
 
DSBSIZE_MIN = 4;
DSBSIZE_MAX = $0FFFFFFF;
DSBSIZE_MIN = 4;
DSBSIZE_MAX = $0FFFFFFF;
 
DS3DMODE_NORMAL = $00000000;
DS3DMODE_HEADRELATIVE = $00000001;
DS3DMODE_DISABLE = $00000002;
DS3DMODE_NORMAL = $00000000;
DS3DMODE_HEADRELATIVE = $00000001;
DS3DMODE_DISABLE = $00000002;
 
DS3D_IMMEDIATE = $00000000;
DS3D_DEFERRED = $00000001;
 
DS3D_MINDISTANCEFACTOR = FLT_MIN;
DS3D_MAXDISTANCEFACTOR = FLT_MAX;
DS3D_IMMEDIATE = $00000000;
DS3D_DEFERRED = $00000001;
DS3D_MINDISTANCEFACTOR = 0.0;
DS3D_MAXDISTANCEFACTOR = 10.0;
DS3D_DEFAULTDISTANCEFACTOR = 1.0;
 
DS3D_MINROLLOFFFACTOR = 0.0;
DS3D_MAXROLLOFFFACTOR = 10.0;
DS3D_DEFAULTROLLOFFFACTOR = 1.0;
DS3D_MINROLLOFFFACTOR = 0.0;
DS3D_MAXROLLOFFFACTOR = 10.0;
DS3D_DEFAULTROLLOFFFACTOR = 1.0;
 
DS3D_MINDOPPLERFACTOR = 0.0;
DS3D_MAXDOPPLERFACTOR = 10.0;
DS3D_DEFAULTDOPPLERFACTOR = 1.0;
DS3D_MINDOPPLERFACTOR = 0.0;
DS3D_MAXDOPPLERFACTOR = 10.0;
DS3D_DEFAULTDOPPLERFACTOR = 1.0;
 
DS3D_DEFAULTMINDISTANCE = 1.0;
DS3D_DEFAULTMAXDISTANCE = 1000000000.0;
DS3D_DEFAULTMINDISTANCE = 1.0;
DS3D_DEFAULTMAXDISTANCE = 1000000000.0;
 
DS3D_MINCONEANGLE = 0;
DS3D_MAXCONEANGLE = 360;
DS3D_DEFAULTCONEANGLE = 360;
DS3D_MINCONEANGLE = 0;
DS3D_MAXCONEANGLE = 360;
DS3D_DEFAULTCONEANGLE = 360;
 
DS3D_DEFAULTCONEOUTSIDEVOLUME = DSBVOLUME_MAX;
 
DSCCAPS_EMULDRIVER = $00000020;
DSCCAPS_CERTIFIED = DSCAPS_CERTIFIED;
DSCCAPS_EMULDRIVER = DSCAPS_EMULDRIVER;
DSCCAPS_CERTIFIED = DSCAPS_CERTIFIED;
 
DSCBCAPS_WAVEMAPPED = $80000000;
DSCBCAPS_WAVEMAPPED = $80000000;
 
DSCBLOCK_ENTIREBUFFER = $00000001;
 
DSCBSTATUS_CAPTURING = $00000001;
DSCBSTATUS_LOOPING = $00000002;
 
DSBCAPS_CTRLDEFAULT = $000000E0;
DSBCAPS_CTRLALL = $000001F0;
DSCBSTART_LOOPING = $00000001;
 
DSCBLOCK_ENTIREBUFFER = $00000001;
DSBPN_OFFSETSTOP = $FFFFFFFF;
 
DSCBSTATUS_CAPTURING = $00000001;
DSCBSTATUS_LOOPING = $00000002;
 
DSCBSTART_LOOPING = $00000001;
 
DSBPN_OFFSETSTOP = DWORD(-1);
 
//
// DirectSound3D Algorithms
//
 
// Default DirectSound3D algorithm {00000000-0000-0000-0000-000000000000}
DS3DALG_DEFAULT: TGUID = '{00000000-0000-0000-0000-000000000000}';
DS3DALG_NO_VIRTUALIZATION: TGUID = '{C241333F-1C1B-11D2-94F5-00C04FC28ACA}';
DS3DALG_HRTF_FULL: TGUID = '{C2413340-1C1B-11D2-94F5-00C04FC28ACA}';
DS3DALG_HRTF_LIGHT: TGUID = '{C2413342-1C1B-11D2-94F5-00C04FC28ACA}';
 
// No virtualization {C241333F-1C1B-11d2-94F5-00C04FC28ACA}
DS3DALG_NO_VIRTUALIZATION: TGUID = '';
function DSSPEAKER_COMBINED(c, g: Byte): DWORD;
function DSSPEAKER_CONFIG(a: DWORD): Byte;
function DSSPEAKER_GEOMETRY(a: DWORD): Byte;
 
// High-quality HRTF algorithm {C2413340-1C1B-11d2-94F5-00C04FC28ACA}
DS3DALG_HRTF_FULL: TGUID = '{C2413340-1C1B-11d2-94F5-00C04FC28ACA}';
{ DirectSound API }
 
// Lower-quality HRTF algorithm {C2413342-1C1B-11d2-94F5-00C04FC28ACA}
DS3DALG_HRTF_LIGHT: TGUID = '{C2413342-1C1B-11d2-94F5-00C04FC28ACA}';
type
TDSEnumCallbackW = function(lpGuid: PGUID; lpstrDescription: LPCWSTR;
lpstrModule: LPCWSTR; lpContext: Pointer): BOOL; stdcall;
LPDSENUMCALLBACKW = TDSEnumCallbackW;
 
//DirectMusic file
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* Files: dls1.h dls2.h dmdls.h dmerror.h dmksctrl.h
dmusicc.h dmusici.h dmusicf.h dmusbuff.h
* Content: DirectMusic, DirectSetup
*
* DirectX 7.0 Delphi adaptation by Erik Unger
*
* Modyfied: 10-Sep-2000
*
* Download: http://www.delphi-jedi.org/DelphiGraphics/
* E-Mail: DelphiDirectX@next-reality.com
*
***************************************************************************)
TDSEnumCallbackA = function(lpGuid: PGUID; lpstrDescription: LPCSTR;
lpstrModule: LPCSTR; lpContext: Pointer): BOOL; stdcall;
LPDSENUMCALLBACKA = TDSEnumCallbackA;
 
TDSEnumCallback = TDSEnumCallbackA;
LPDSENUMCALLBACK = TDSEnumCallback;
 
function MAKE_HRESULT(sev,fac,code: DWORD) : HResult;
function DirectSoundCreate(lpGUID: PGUID; out lpDS: IDirectSound; pUnkOuter: IUnknown): HResult; stdcall;
function DirectSoundEnumerateA(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function DirectSoundEnumerateW(lpDSEnumCallback: TDSEnumCallbackW; lpContext: Pointer): HResult; stdcall;
function DirectSoundEnumerate(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
 
type
mmioFOURCC = array [0..3] of Char;
function DirectSoundCaptureCreate(lpGUID: PGUID; out lplpDSC: IDirectSoundCapture; pUnkOuter: IUnknown): HResult; stdcall;
function DirectSoundCaptureEnumerateA(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
function DirectSoundCaptureEnumerateW(lpDSEnumCallback: TDSEnumCallbackW; lpContext: Pointer): HResult; stdcall;
function DirectSoundCaptureEnumerate(lpDSEnumCallback: TDSEnumCallbackA; lpContext: Pointer): HResult; stdcall;
 
 
(*==========================================================================;
//==========================================================================;
//
// dls1.h
//
17775,9 → 11948,9
//
// Written by Sonic Foundry 1996. Released for public use.
//
//=========================================================================*)
//=========================================================================
 
(*//////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
//
//
// Layout of an instrument collection:
17792,7 → 11965,7
// LIST [] 'ins ' [dlid,insh,RGNLIST,ARTLIST,INFOLIST]
//
// RGNLIST
// LIST [] 'lrgn'
// LIST [] 'lrgn'
// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST]
// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST]
// LIST [] 'rgn ' [rgnh,wsmp,wlnk,ARTLIST]
17820,232 → 11993,243
// 'icmt' 'One of those crazy comments.'
// 'icop' 'Copyright (C) 1996 Sonic Foundry'
//
////////////////////////////////////////////////////////////////////////(*)
//////////////////////////////////////////////////////////////////////////
 
(*/////////////////////////////////////////////////////////////////////////
 
///////////////////////////////////////////////////////////////////////////
// FOURCC's used in the DLS file
////////////////////////////////////////////////////////////////////////(*)
 
//////////////////////////////////////////////////////////////////////////
const
FOURCC_DLS : mmioFOURCC = ('D','L','S',' ');
FOURCC_DLID : mmioFOURCC = ('d','l','i','d');
FOURCC_COLH : mmioFOURCC = ('c','o','l','h');
FOURCC_WVPL : mmioFOURCC = ('w','v','p','l');
FOURCC_PTBL : mmioFOURCC = ('p','t','b','l');
FOURCC_PATH : mmioFOURCC = ('p','a','t','h');
FOURCC_wave : mmioFOURCC = ('w','a','v','e');
FOURCC_LINS : mmioFOURCC = ('l','i','n','s');
FOURCC_INS : mmioFOURCC = ('i','n','s',' ');
FOURCC_INSH : mmioFOURCC = ('i','n','s','h');
FOURCC_LRGN : mmioFOURCC = ('l','r','g','n');
FOURCC_RGN : mmioFOURCC = ('r','g','n',' ');
FOURCC_RGNH : mmioFOURCC = ('r','g','n','h');
FOURCC_LART : mmioFOURCC = ('l','a','r','t');
FOURCC_ART1 : mmioFOURCC = ('a','r','t','1');
FOURCC_WLNK : mmioFOURCC = ('w','l','n','k');
FOURCC_WSMP : mmioFOURCC = ('w','s','m','p');
//FOURCC_VERS : mmioFOURCC = ('v','e','r','s');
FOURCC_DLS = Ord('D') + Ord('L') shl 8 + Ord('S') shl 16 + Ord(' ') shl 24;
FOURCC_DLID = Ord('d') + Ord('l') shl 8 + Ord('i') shl 16 + Ord('d') shl 24;
FOURCC_COLH = Ord('c') + Ord('o') shl 8 + Ord('l') shl 16 + Ord('h') shl 24;
FOURCC_WVPL = Ord('w') + Ord('v') shl 8 + Ord('p') shl 16 + Ord('l') shl 24;
FOURCC_PTBL = Ord('p') + Ord('t') shl 8 + Ord('b') shl 16 + Ord('l') shl 24;
FOURCC_PATH = Ord('p') + Ord('a') shl 8 + Ord('t') shl 16 + Ord('h') shl 24;
FOURCC_wave = Ord('w') + Ord('a') shl 8 + Ord('v') shl 16 + Ord('e') shl 24;
FOURCC_LINS = Ord('l') + Ord('i') shl 8 + Ord('n') shl 16 + Ord('s') shl 24;
FOURCC_INS = Ord('i') + Ord('n') shl 8 + Ord('s') shl 16 + Ord(' ') shl 24;
FOURCC_INSH = Ord('i') + Ord('n') shl 8 + Ord('s') shl 16 + Ord('h') shl 24;
FOURCC_LRGN = Ord('l') + Ord('r') shl 8 + Ord('g') shl 16 + Ord('n') shl 24;
FOURCC_RGN = Ord('r') + Ord('g') shl 8 + Ord('n') shl 16 + Ord(' ') shl 24;
FOURCC_RGNH = Ord('r') + Ord('g') shl 8 + Ord('n') shl 16 + Ord('h') shl 24;
FOURCC_LART = Ord('l') + Ord('a') shl 8 + Ord('r') shl 16 + Ord('t') shl 24;
FOURCC_ART1 = Ord('a') + Ord('r') shl 8 + Ord('t') shl 16 + Ord('1') shl 24;
FOURCC_WLNK = Ord('w') + Ord('l') shl 8 + Ord('n') shl 16 + Ord('k') shl 24;
FOURCC_WSMP = Ord('w') + Ord('s') shl 8 + Ord('m') shl 16 + Ord('p') shl 24;
//FOURCC_VERS = Ord('v') + Ord('e') shl 8 + Ord('r') shl 16 + Ord('s') shl 24;
 
(*/////////////////////////////////////////////////////////////////////////
// Articulation connection graph definitions
////////////////////////////////////////////////////////////////////////(*)
///////////////////////////////////////////////////////////////////////////
// Articulation connection graph definitions
//////////////////////////////////////////////////////////////////////////
 
(* Generic Sources *)
CONN_SRC_NONE = $0000;
CONN_SRC_LFO = $0001;
CONN_SRC_KEYONVELOCITY = $0002;
CONN_SRC_KEYNUMBER = $0003;
CONN_SRC_EG1 = $0004;
CONN_SRC_EG2 = $0005;
CONN_SRC_PITCHWHEEL = $0006;
// Generic Sources
CONN_SRC_NONE = $0000;
CONN_SRC_LFO = $0001;
CONN_SRC_KEYONVELOCITY = $0002;
CONN_SRC_KEYNUMBER = $0003;
CONN_SRC_EG1 = $0004;
CONN_SRC_EG2 = $0005;
CONN_SRC_PITCHWHEEL = $0006;
 
(* Midi Controllers 0-127 *)
CONN_SRC_CC1 = $0081;
CONN_SRC_CC7 = $0087;
CONN_SRC_CC10 = $008a;
CONN_SRC_CC11 = $008b;
// Midi Controllers 0-127
CONN_SRC_CC1 = $0081;
CONN_SRC_CC7 = $0087;
CONN_SRC_CC10 = $008A;
CONN_SRC_CC11 = $008B;
 
(* Generic Destinations *)
CONN_DST_NONE = $0000;
CONN_DST_ATTENUATION = $0001;
CONN_DST_PITCH = $0003;
CONN_DST_PAN = $0004;
// Generic Destinations
CONN_DST_NONE = $0000;
CONN_DST_ATTENUATION = $0001;
CONN_DST_PITCH = $0003;
CONN_DST_PAN = $0004;
 
(* LFO Destinations *)
CONN_DST_LFO_FREQUENCY = $0104;
CONN_DST_LFO_STARTDELAY = $0105;
// LFO Destinations
CONN_DST_LFO_FREQUENCY = $0104;
CONN_DST_LFO_STARTDELAY = $0105;
 
(* EG1 Destinations *)
CONN_DST_EG1_ATTACKTIME = $0206;
CONN_DST_EG1_DECAYTIME = $0207;
CONN_DST_EG1_RELEASETIME = $0209;
CONN_DST_EG1_SUSTAINLEVEL = $020a;
// EG1 Destinations
CONN_DST_EG1_ATTACKTIME = $0206;
CONN_DST_EG1_DECAYTIME = $0207;
CONN_DST_EG1_RELEASETIME = $0209;
CONN_DST_EG1_SUSTAINLEVEL = $020A;
 
(* EG2 Destinations *)
CONN_DST_EG2_ATTACKTIME = $030a;
CONN_DST_EG2_DECAYTIME = $030b;
CONN_DST_EG2_RELEASETIME = $030d;
CONN_DST_EG2_SUSTAINLEVEL = $030e;
// EG2 Destinations
CONN_DST_EG2_ATTACKTIME = $030A;
CONN_DST_EG2_DECAYTIME = $030B;
CONN_DST_EG2_RELEASETIME = $030D;
CONN_DST_EG2_SUSTAINLEVEL = $030E;
 
CONN_TRN_NONE = $0000;
CONN_TRN_CONCAVE = $0001;
CONN_TRN_NONE = $0000;
CONN_TRN_CONCAVE = $0001;
 
type
PDLSId = ^TDLSId;
TDLSId = packed record
ulData1 : ULONG;
TDLSID = record
ulData1 : Cardinal;
usData2 : Word;
usData3 : Word;
abData4 : array [0..7] of BYTE;
abData4 : array[0..7] of Byte;
end;
DLSID = TDLSID;
LPDLSID = ^DLSID;
 
// PDLSVersion = ^TDLSVersion;
// TDLSVersion = packed record
// dwVersionMS,
// dwVersionLS : DWORD;
// end;
 
PConnection = ^TConnection;
TConnection = packed record
usSource : Word;
usControl : Word;
SuDestination : Word;
usTransform : Word;
lScale : LongInt;
{TDLSVERSION = record
dwVersionMS : DWORD;
dwVersionLS : DWORD;
end;
DLSVERSION = TDLSVERSION;
LPDLSVERSION = ^DLSVERSION;
}
TCONNECTION = record
usSource : Word;
usControl : Word;
usDestination : Word;
usTransform : Word;
lScale : Cardinal;
end;
CONNECTION = TCONNECTION;
LPCONNECTION = ^CONNECTION;
 
(* Level 1 Articulation Data *)
// Level 1 Articulation Data
 
PConnectionList = ^TConnectionList;
TConnectionList = packed record
cbSize : ULONG; (* size of the connection list structure *)
cConnections : ULONG; (* count of connections in the list *)
TCONNECTIONLIST = record
cbSize : Cardinal; // size of the connection list structure
cConnections : Cardinal; // count of connections in the list
end;
CONNECTIONLIST = TCONNECTIONLIST;
LPCONNECTIONLIST = ^CONNECTIONLIST;
 
(*/////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Generic type defines for regions and instruments
////////////////////////////////////////////////////////////////////////(*)
 
PRGNRange = ^TRGNRange;
TRGNRange = packed record
usLow : Word;
//////////////////////////////////////////////////////////////////////////
type
TRGNRANGE = record
usLow : Word;
usHigh : Word;
end;
RGNRANGE = TRGNRANGE;
LPRGNRANGE = ^RGNRANGE;
 
const
F_INSTRUMENT_DRUMS = $80000000;
FTINSTRUMENTTDRUMS = $80000000;
 
type
PMIDILocale = ^TMIDILocale;
TMIDILocale = packed record
ulBank : ULONG;
ulInstrument : ULONG;
TMIDILOCALE = record
ulBank : Cardinal;
ulInstrument : Cardinal;
end;
MIDILOCALE = TMIDILOCALE;
LPMIDILOCALE = ^MIDILOCALE;
 
(*/////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// Header structures found in an DLS file for collection, instruments, and
// regions.
////////////////////////////////////////////////////////////////////////(*)
 
//////////////////////////////////////////////////////////////////////////
const
F_RGN_OPTION_SELFNONEXCLUSIVE = $0001;
F_RGN_OPTION_SELFNONEXCLUSIVE = $0001;
 
type
PRGNHeader = ^TRGNHeader;
TRGNHeader = packed record
RangeKey : TRGNRange; (* Key range *)
RangeVelocity : TRGNRange; (* Velocity Range *)
fusOptions : Word ; (* Synthesis options for this range *)
usKeyGroup : Word ; (* Key grouping for non simultaneous play *)
(* 0 = no group, 1 up is group *)
(* for Level 1 only groups 1-15 are allowed *)
end;
TRGNHEADER = record
RangeKey : RGNRANGE; // Key range
RangeVelocity : RGNRANGE; // Velocity Range
fusOptions : Word; // Synthesis options for this range
usKeyGroup : Word; // Key grouping for non simultaneous play
end; // 0 = no group, 1 up is group
// for Level 1 only groups 1-15 are allowed
RGNHEADER = TRGNHEADER;
LPRGNHEADER = ^RGNHEADER;
 
PInstHeader = ^TInstHeader;
TInstHeader = packed record
cRegions : ULONG; (* Count of regions in this instrument *)
Locale : TMIDILocale; (* Intended MIDI locale of this instrument *)
TINSTHEADER = record
cRegions : Cardinal; // Count of regions in this instrument
Locale : MIDILOCALE; // Intended MIDI locale of this instrument
end;
INSTHEADER = TINSTHEADER;
LPINSTHEADER = ^INSTHEADER;
 
PDLSHeader = ^TDLSHeader;
TDLSHeader = packed record
cInstruments : ULONG;
TDLSHEADER = record
cInstruments : Cardinal; // Count of instruments in the collection
end;
DLSHEADER = TDLSHEADER;
LPDLSHEADER = ^DLSHEADER;
 
(*////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// definitions for the Wave link structure
///////////////////////////////////////////////////////////////////////////(*)
/////////////////////////////////////////////////////////////////////////////
 
(* **** For level 1 only WAVELINK_CHANNEL_MONO is valid **** *)
(* ulChannel allows for up to 32 channels of audio with each bit position *)
(* specifiying a channel of playback *)
// **** For level 1 only WAVELINK_CHANNEL_MONO is valid ****
// ulChannel allows for up to 32 channels of audio with each bit position
// specifiying a channel of playback
 
const
WAVELINK_CHANNEL_LEFT = $0001;
WAVELINK_CHANNEL_RIGHT = $0002;
WAVELINK_CHANNEL_LEFT = $0001;
WAVELINK_CHANNEL_RIGHT = $0002;
 
F_WAVELINK_PHASE_MASTER = $0001;
F_WAVELINK_PHASE_MASTER = $0001;
 
type
PWaveLink = ^TWaveLink;
TWaveLink = packed record (* any paths or links are stored right after struct *)
fusOptions : Word; (* options flags for this wave *)
usPhaseGroup : Word; (* Phase grouping for locking channels *)
ulChannel : ULONG; (* channel placement *)
ulTableIndex : ULONG; (* index into the wave pool table, 0 based *)
TWAVELINK = record // any paths or links are stored right after struct
fusOptions : Word; // options flags for this wave
usPhaseGroup : Word; // Phase grouping for locking channels
ulChannel : Cardinal; // channel placement
ulTableIndex : Cardinal; // index into the wave pool table, 0 based
end;
WAVELINK = TWAVELINK;
LPWAVELINK = ^WAVELINK;
 
const
POOL_CUE_NULL = $ffffffff;
POOL_CUE_NULL = $FFFFFFFF;
 
type
PPoolCUE = ^TPoolCUE;
TPoolCUE = packed record
ulOffset : ULONG;
TPOOLCUE = record
ulOffset : Cardinal; // Offset to the entry in the list
end;
POOLCUE = TPOOLCUE;
LPPOOLCUE = ^POOLCUE;
 
PPoolTable = ^TPoolTable;
TPoolTable = packed record
cbSize : ULONG; (* size of the pool table structure *)
cCues : ULONG; (* count of cues in the list *)
TPOOLTABLE = record
cbSize : Cardinal; // size of the pool table structure
cCues : Cardinal; // count of cues in the list
end;
POOLTABLE = TPOOLTABLE;
LPPOOLTABLE = ^POOLTABLE;
 
(*////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// Structures for the "wsmp" chunk
///////////////////////////////////////////////////////////////////////////(*)
 
/////////////////////////////////////////////////////////////////////////////
const
F_WSMP_NO_TRUNCATION = $0001;
F_WSMP_NO_COMPRESSION = $0002;
F_WSMP_NO_TRUNCATION = $0001;
F_WSMP_NO_COMPRESSION = $0002;
 
type
PWSMPL = ^TWSMPL;
TWSMPL = packed record
cbSize : ULONG;
usUnityNote : Word; (* MIDI Unity Playback Note *)
sFineTune : SmallInt; (* Fine Tune in log tuning *)
lAttenuation : Integer; (* Overall Attenuation to be applied to data *)
fulOptions : ULONG; (* Flag options *)
cSampleLoops : ULONG; (* Count of Sample loops, 0 loops is one shot *)
Trwsmp = record
cbSize : Cardinal;
usUnityNote : Word; // MIDI Unity Playback Note
sFineTune : Smallint; // Fine Tune in log tuning
lAttenuation : Longint; // Overall Attenuation to be applied to data
fulOptions : Cardinal; // Flag options
cSampleLoops : Cardinal; // Count of Sample loops, 0 loops is one shot
end;
WSMPL = Trwsmp;
LPWSMPL = ^WSMPL;
 
 
(* This loop type is a normal forward playing loop which is continually *)
(* played until the envelope reaches an off threshold in the release *)
(* portion of the volume envelope *)
 
// This loop type is a normal forward playing loop which is continually
// played until the envelope reaches an off threshold in the release
// portion of the volume envelope
const
WLOOP_TYPE_FORWARD = 0;
WLOOP_TYPE_FORWARD = 0;
 
type
TWLoop = packed record
cbSize : ULONG;
ulType : ULONG; (* Loop Type *)
ulStart : ULONG; (* Start of loop in samples *)
ulLength : ULONG; (* Length of loop in samples *)
Trloop = record
cbSize : Cardinal;
ulType : Cardinal; // Loop Type
ulStart : Cardinal; // Start of loop in samples
ulLength : Cardinal; // Length of loop in samples
end;
WLOOP = Trloop;
LPWLOOP = ^WLOOP;
 
(*******************************************************************************
{/*
 
dls2.h
 
18056,1515 → 12240,1585
 
Written by Microsoft 1998. Released for public use.
 
*******************************************************************************)
}
 
(*
FOURCC's used in the DLS2 file, in addition to DLS1 chunks
*)
const
FOURCC_RGN2 : mmioFOURCC = ('r','g','n','2');
FOURCC_LAR2 : mmioFOURCC = ('l','a','r','2');
FOURCC_ART2 : mmioFOURCC = ('a','r','t','2');
FOURCC_CDL : mmioFOURCC = ('c','d','l',' ');
// FOURCC_DLID : mmioFOURCC = ('d','l','i','d');
//
// FOURCC's used in the DLS2 file, in addition to DLS1 chunks
///
 
(*
Articulation connection graph definitions. These are in addition to
the definitions in the DLS1 header.
*)
FOURCC_RGN2 = Ord('r') + Ord('g') shl 8 + Ord('n') shl 16 + Ord('2') shl 24;
FOURCC_LAR2 = Ord('l') + Ord('a') shl 8 + Ord('r') shl 16 + Ord('2') shl 24;
FOURCC_ART2 = Ord('a') + Ord('r') shl 8 + Ord('t') shl 16 + Ord('2') shl 24;
FOURCC_CDL = Ord('c') + Ord('d') shl 8 + Ord('l') shl 16 + Ord(' ') shl 24;
//FOURCC_DLID = Ord('d') + Ord('l') shl 8 + Ord('i') shl 16 + Ord('d') shl 24;
 
const
(* Generic Sources (in addition to DLS1 sources. *)
CONN_SRC_POLYPRESSURE = $0007; (* Polyphonic Pressure *)
CONN_SRC_CHANNELPRESSURE = $0008; (* Channel Pressure *)
CONN_SRC_VIBRATO = $0009; (* Vibrato LFO *)
CONN_SRC_MONOPRESSURE = $000a; (* MIDI Mono pressure *)
//
// Articulation connection graph definitions. These are in addition to
// the definitions in the DLS1 header.
///
 
// Generic Sources (in addition to DLS1 sources.
CONN_SRC_POLYPRESSURE = $0007; // Polyphonic Pressure
CONN_SRC_CHANNELPRESSURE = $0008; // Channel Pressure
CONN_SRC_VIBRATO = $0009; // Vibrato LFO
CONN_SRC_MONOPRESSURE = $000a; // MIDI Mono pressure
 
(* Midi Controllers *)
CONN_SRC_CC91 = $00db; (* Reverb Send *)
CONN_SRC_CC93 = $00dd; (* Chorus Send *)
 
// Midi Controllers
CONN_SRC_CC91 = $00db; // Reverb Send
CONN_SRC_CC93 = $00dd; // Chorus Send
 
(* Generic Destinations *)
CONN_DST_GAIN = $0001; (* Same as CONN_DST_ ATTENUATION *)
CONN_DST_KEYNUMBER = $0005; (* Key Number Generator *)
 
(* Audio Channel Output Destinations *)
CONN_DST_LEFT = $0010; (* Left Channel Send *)
CONN_DST_RIGHT = $0011; (* Right Channel Send *)
CONN_DST_CENTER = $0012; (* Center Channel Send *)
CONN_DST_LEFTREAR = $0013; (* Left Rear Channel Send *)
CONN_DST_RIGHTREAR = $0014; (* Right Rear Channel Send *)
CONN_DST_LFE_CHANNEL = $0015; (* LFE Channel Send *)
CONN_DST_CHORUS = $0080; (* Chorus Send *)
CONN_DST_REVERB = $0081; (* Reverb Send *)
// Generic Destinations
CONN_DST_GAIN = $0001; // Same as CONN_DST_ ATTENUATION
CONN_DST_KEYNUMBER = $0005; // Key Number Generator
 
(* Vibrato LFO Destinations *)
CONN_DST_VIB_FREQUENCY = $0114; (* Vibrato Frequency *)
CONN_DST_VIB_STARTDELAY = $0115; (* Vibrato Start Delay *)
// Audio Channel Output Destinations
CONN_DST_LEFT = $0010; // Left Channel Send
CONN_DST_RIGHT = $0011; // Right Channel Send
CONN_DST_CENTER = $0012; // Center Channel Send
CONN_DST_LEFTREAR = $0013; // Left Rear Channel Send
CONN_DST_RIGHTREAR = $0014; // Right Rear Channel Send
CONN_DST_LFE_CHANNEL = $0015; // LFE Channel Send
CONN_DST_CHORUS = $0080; // Chorus Send
CONN_DST_REVERB = $0081; // Reverb Send
 
(* EG1 Destinations *)
CONN_DST_EG1_DELAYTIME = $020B; (* EG1 Delay Time *)
CONN_DST_EG1_HOLDTIME = $020C; (* EG1 Hold Time *)
// Vibrato LFO Destinations
CONN_DST_VIB_FREQUENCY = $0114; // Vibrato Frequency
CONN_DST_VIB_STARTDELAY = $0115; // Vibrato Start Delay
 
// EG1 Destinations
CONN_DST_EG1_DELAYTIME = $020B; // EG1 Delay Time
CONN_DST_EG1_HOLDTIME = $020C; // EG1 Hold Time
 
(* EG2 Destinations *)
CONN_DST_EG2_DELAYTIME = $030F; (* EG2 Delay Time *)
CONN_DST_EG2_HOLDTIME = $0310; (* EG2 Hold Time *)
 
// EG2 Destinations
CONN_DST_EG2_DELAYTIME = $030F; // EG2 Delay Time
CONN_DST_EG2_HOLDTIME = $0310; // EG2 Hold Time
 
(* Filter Destinations *)
CONN_DST_FILTER_CUTOFF = $0500; (* Filter Cutoff Frequency *)
CONN_DST_FILTER_Q = $0501; (* Filter Resonance *)
 
// Filter Destinations
CONN_DST_FILTER_CUTOFF = $0500; // Filter Cutoff Frequency
CONN_DST_FILTER_Q = $0501; // Filter Resonance
 
(* Transforms *)
CONN_TRN_CONVEX = $0002; (* Convex Transform *)
CONN_TRN_SWITCH = $0003; (* Switch Transform *)
 
// Transforms
CONN_TRN_CONVEX = $0002; // Convex Transform
CONN_TRN_SWITCH = $0003; // Switch Transform
 
(* Conditional chunk operators *)
DLS_CDL_AND = $0001; (* X = X & Y *)
DLS_CDL_OR = $0002; (* X = X | Y *)
DLS_CDL_XOR = $0003; (* X = X ^ Y *)
DLS_CDL_ADD = $0004; (* X = X + Y *)
DLS_CDL_SUBTRACT = $0005; (* X = X - Y *)
DLS_CDL_MULTIPLY = $0006; (* X = X * Y *)
DLS_CDL_DIVIDE = $0007; (* X = X / Y *)
DLS_CDL_LOGICAL_AND = $0008; (* X = X && Y *)
DLS_CDL_LOGICAL_OR = $0009; (* X = X || Y *)
DLS_CDL_LT = $000A; (* X = (X < Y) *)
DLS_CDL_LE = $000B; (* X = (X <= Y) *)
DLS_CDL_GT = $000C; (* X = (X > Y) *)
DLS_CDL_GE = $000D; (* X = (X >= Y) *)
DLS_CDL_EQ = $000E; (* X = (X == Y) *)
DLS_CDL_NOT = $000F; (* X = !X *)
DLS_CDL_CONST = $0010; (* 32-bit constant *)
DLS_CDL_QUERY = $0011; (* 32-bit value returned from query *)
DLS_CDL_QUERYSUPPORTED = $0012; (* Test to see if DLSID Query is supported *)
 
(*
Loop and release
*)
// Conditional chunk operators
DLS_CDL_AND = $0001; // X = X & Y
DLS_CDL_OR = $0002; // X = X | Y
DLS_CDL_XOR = $0003; // X = X ^ Y
DLS_CDL_ADD = $0004; // X = X + Y
DLS_CDL_SUBTRACT = $0005; // X = X - Y
DLS_CDL_MULTIPLY = $0006; // X = X * Y
DLS_CDL_DIVIDE = $0007; // X = X / Y
DLS_CDL_LOGICAL_AND = $0008; // X = X && Y
DLS_CDL_LOGICAL_OR = $0009; // X = X || Y
DLS_CDL_LT = $000A; // X = (X < Y)
DLS_CDL_LE = $000B; // X = (X <= Y)
DLS_CDL_GT = $000C; // X = (X > Y)
DLS_CDL_GE = $000D; // X = (X >= Y)
DLS_CDL_EQ = $000E; // X = (X == Y)
DLS_CDL_NOT = $000F; // X = !X
DLS_CDL_CONST = $0010; // 32-bit constant
DLS_CDL_QUERY = $0011; // 32-bit value returned from query
DLS_CDL_QUERYSUPPORTED = $0012; // Test to see if DLSID Query is supported
 
WLOOP_TYPE_RELEASE = 2;
//Loop and release
 
(*
DLSID queries for <cdl-ck>
*)
WLOOP_TYPE_RELEASE = 2;
 
DLSID_GMInHardware : TGUID = '{178f2f24-c364-11d1-a760-0000f875ac12}';
DLSID_GSInHardware : TGUID = '{178f2f25-c364-11d1-a760-0000f875ac12}';
DLSID_XGInHardware : TGUID = '{178f2f26-c364-11d1-a760-0000f875ac12}';
DLSID_SupportsDLS1 : TGUID = '{178f2f27-c364-11d1-a760-0000f875ac12}';
DLSID_SupportsDLS2 : TGUID = '{f14599e5-4689-11d2-afa6-00aa0024d8b6}';
DLSID_SampleMemorySize : TGUID = '{178f2f28-c364-11d1-a760-0000f875ac12}';
DLSID_ManufacturersID : TGUID = '{b03e1181-8095-11d2-a1ef-00600833dbd8}';
DLSID_ProductID : TGUID = '{b03e1182-8095-11d2-a1ef-00600833dbd8}';
DLSID_SamplePlaybackRate : TGUID = '{2a91f713-a4bf-11d2-bbdf-00600833dbd8}';
//DLSID queries for <cdl-ck>
 
(************************************************************************
* *
* dmdls.h -- DLS download definitions for DirectMusic API's *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
************************************************************************)
DLSID_GMInHardware : TGUID = '{178F2F24-C364-11D1-A760-0000F875AC12}';
DLSID_GSInHardware : TGUID = '{178F2F25-C364-11D1-A760-0000F875AC12}';
DLSID_XGInHardware : TGUID = '{178F2F26-C364-11D1-A760-0000F875AC12}';
DLSID_SupportsDLS1 : TGUID = '{178F2F27-C364-11D1-A760-0000F875AC12}';
DLSID_SupportsDLS2 : TGUID = '{F14599E5-4689-11D2-AFA6-00AA0024D8B6}';
DLSID_SampleMemorySize : TGUID = '{178F2F28-C364-11D1-A760-0000F875AC12}';
DLSID_ManufacturersID : TGUID = '{B03E1181-8095-11D2-A1EF-00600833DBD8}';
DLSID_ProductID : TGUID = '{B03E1182-8095-11D2-A1EF-00600833DBD8}';
DLSID_SamplePlaybackRate : TGUID = '{2A91F713-A4BF-11D2-BBDF-00600833DBD8}';
 
//***********************************************************************
// *
// dmdls.h -- DLS download definitions for DirectMusic API's *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
//**********************************************************************
 
type
TPCent = LongInt; (* Pitch cents *)
TGCent = LongInt; (* Gain cents *)
TTCent = LongInt; (* Time cents *)
TPercent = LongInt; (* Per.. cent! *)
PCENT = Longint; // Pitch cents
GCENT = Longint; // Gain cents
TCENT = Longint; // Time cents
PERCENT = Longint; // Per.. cent!
 
PReference_Time = ^TReference_Time;
TReference_Time = LongLong;
TReference_Time = LONGLONG;
 
TFourCC = DWORD; (* a four character code *)
Reference_Time = TReference_Time;
LPREFERENCE_TIME = PReference_Time;
 
//function MAKEFOURCC (ch0, ch1, ch2, ch3: Char) : TFourCC;
function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
 
type
TDMus_DownloadInfor = packed record
dwDLType: DWORD; (* Instrument or Wave *)
dwDLId: DWORD; (* Unique identifier to tag this download. *)
dwNumOffsetTableEntries: DWORD; (* Number of index in the offset address table. *)
cbSize: DWORD; (* Total size of this memory chunk. *)
FOURCC = DWORD; // a four character code
 
TDMUS_DOWNLOADINFO = record
dwDLType : DWORD; // Instrument or Wave
dwDLId : DWORD; // Unique identifier to tag this download.
dwNumOffsetTableEntries : DWORD; // Number of index in the offset address table.
cbSize : DWORD; // Total size of this memory chunk.
end;
DMUS_DOWNLOADINFO = TDMUS_DOWNLOADINFO;
 
const
DMUS_DOWNLOADINFO_INSTRUMENT = 1;
DMUS_DOWNLOADINFO_WAVE = 2;
DMUS_DOWNLOADINFO_INSTRUMENT2 = 3; (* New version for better DLS2 support. *)
DMUS_DOWNLOADINFO_INSTRUMENT = 1;
DMUS_DOWNLOADINFO_WAVE = 2;
 
DMUS_DEFAULT_SIZE_OFFSETTABLE = 1;
DMUS_DEFAULT_SIZE_OFFSETTABLE = 1;
 
(* Flags for DMUS_INSTRUMENT's ulFlags member *)
// Flags for DMUS_INSTRUMENT's ulFlags member
 
DMUS_INSTRUMENT_GM_INSTRUMENT = 1 shl 0;
DMUS_INSTRUMENT_GM_INSTRUMENT = 1; // (1 << 0) ????
 
type
TDMus_OffsetTable = packed record
ulOffsetTable : array [0..DMUS_DEFAULT_SIZE_OFFSETTABLE-1] of ULONG;
TDMUS_OFFSETTABLE = record
ulOffsetTable : array [0..DMUS_DEFAULT_SIZE_OFFSETTABLE] of Cardinal;
end;
DMUS_OFFSETTABLE = TDMUS_OFFSETTABLE;
 
TDMus_Instrument = packed record
ulPatch: ULONG;
ulFirstRegionIdx: ULONG;
ulGlobalArtIdx: ULONG; (* If zero the instrument does not have an articulation *)
ulFirstExtCkIdx: ULONG; (* If zero no 3rd party entenstion chunks associated with the instrument *)
ulCopyrightIdx: ULONG; (* If zero no Copyright information associated with the instrument *)
ulFlags: ULONG;
TDMUS_INSTRUMENT = record
ulPatch : Cardinal;
ulFirstRegionIdx : Cardinal;
ulGlobalArtIdx : Cardinal; // If zero the instrument does not have an articulation
ulFirstExtCkIdx : Cardinal; // If zero no 3rd party entenstion chunks associated with the instrument
ulCopyrightIdx : Cardinal; // If zero no Copyright information associated with the instrument
ulFlags : Cardinal;
end;
DMUS_INSTRUMENT = TDMUS_INSTRUMENT;
 
TDMus_Region = packed record
RangeKey: TRGNRange;
RangeVelocity: TRGNRange;
fusOptions: Word;
usKeyGroup: Word;
ulRegionArtIdx: ULONG; (* If zero the region does not have an articulation *)
ulNextRegionIdx: ULONG; (* If zero no more regions *)
ulFirstExtCkIdx: ULONG; (* If zero no 3rd party entenstion chunks associated with the region *)
WaveLink: TWaveLink;
WSMP: TWSMPL; (* If WSMP.cSampleLoops > 1 then a WLOOP is included *)
WLOOP: array [0..0] of TWLoop;
TDMUS_REGION = record
RangeKey : RGNRANGE;
RangeVelocity : RGNRANGE;
fusOptions : Word;
usKeyGroup : Word;
ulRegionArtIdx : Cardinal; // If zero the region does not have an articulation
ulNextRegionIdx : Cardinal; // If zero no more regions
ulFirstExtCkIdx : Cardinal; // If zero no 3rd party entenstion chunks associated with the region
WaveLink : WAVELINK;
WSMP : WSMPL; // If WSMP.cSampleLoops > 1 then a WLOOP is included
WLOOP : array[0..0] of WLOOP;
end;
DMUS_REGION = TDMUS_REGION;
 
TDMus_LFOParams = packed record
pcFrequency: TPCent;
tcDelay: TTCent;
gcVolumeScale: TGCent;
pcPitchScale: TPCent;
gcMWToVolume: TGCent;
pcMWToPitch: TPCent;
TDMUS_LFOPARAMS = record
pcFrequency : PCENT;
tcDelay : TCENT;
gcVolumeScale : GCENT;
pcPitchScale : PCENT;
gcMWToVolume : GCENT;
pcMWToPitch : PCENT;
end;
DMUS_LFOPARAMS = TDMUS_LFOPARAMS;
 
TDMus_VEGParams = packed record
tcAttack: TTCent;
tcDecay: TTCent;
ptSustain: TPercent;
tcRelease: TTCent;
tcVel2Attack: TTCent;
tcKey2Decay: TTCent;
TDMUS_VEGPARAMS = record
tcAttack : TCENT;
tcDecay : TCENT;
ptSustain : PERCENT;
tcRelease : TCENT;
tcVel2Attack : TCENT;
tcKey2Decay : TCENT;
end;
DMUS_VEGPARAMS = TDMUS_VEGPARAMS;
 
TDMus_PEGParams = packed record
tcAttack: TTCent;
tcDecay: TTCent;
ptSustain: TPercent;
tcRelease: TTCent;
tcVel2Attack: TTCent;
tcKey2Decay: TTCent;
pcRange: TPCent;
TDMUS_PEGPARAMS = record
tcAttack : TCENT;
tcDecay : TCENT;
ptSustain : PERCENT;
tcRelease : TCENT;
tcVel2Attack : TCENT;
tcKey2Decay : TCENT;
pcRange : PCENT;
end;
DMUS_PEGPARAMS = TDMUS_PEGPARAMS;
 
TDMus_MSCParams = packed record
ptDefaultPan: TPercent;
TDMUS_MSCPARAMS = record
ptDefaultPan : PERCENT;
end;
DMUS_MSCPARAMS = TDMUS_MSCPARAMS;
 
TDMus_ArticParams = packed record
LFO: TDMus_LFOParams;
VolEG: TDMus_VEGParams;
PitchEG: TDMus_PEGParams;
Misc: TDMus_MSCParams;
TDMUS_ARTICPARAMS = record
LFO : DMUS_LFOPARAMS;
VolEG : DMUS_VEGPARAMS;
PitchEG : DMUS_PEGPARAMS;
Misc : DMUS_MSCPARAMS;
end;
DMUS_ARTICPARAMS = TDMUS_ARTICPARAMS;
 
TDMus_Articulation = packed record
ulArt1Idx: ULONG; (* If zero no DLS Level 1 articulation chunk *)
ulFirstExtCkIdx: ULONG; (* If zero no 3rd party entenstion chunks associated with the articulation *)
TDMUS_ARTICULATION = record
ulArt1Idx : Cardinal; // If zero no DLS Level 1 articulation chunk
ulFirstExtCkIdx : Cardinal; // If zero no 3rd party entenstion chunks associated with the articulation
ulNextArtIdx : Cardinal; // Additional articulation chunks
end;
DMUS_ARTICULATION = TDMUS_ARTICULATION;
 
TDMUS_ARTICULATION2 = record
ulArt1Idx : Cardinal; // If zero no DLS Level 1 articulation chunk
ulFirstExtCkIdx : Cardinal; // If zero no 3rd party entenstion chunks associated with the articulation
end;
DMUS_ARTICULATION2 = TDMUS_ARTICULATION2;
 
const
DMUS_MIN_DATA_SIZE = 4;
// The actual number is determined by cbSize of struct _DMUS_EXTENSIONCHUNK
 
(* The actual number is determined by cbSize of struct _DMUS_EXTENSIONCHUNK *)
 
type
DMus_ExtensionChunk = packed record
cbSize: ULONG; (* Size of extension chunk *)
ulNextExtCkIdx: ULONG; (* If zero no more 3rd party entenstion chunks *)
ExtCkID: TFourCC;
byExtCk: array [0..DMUS_MIN_DATA_SIZE-1] of BYTE; (* The actual number that follows is determined by cbSize *)
TDMUS_EXTENSIONCHUNK = record
cbSize : Cardinal; // Size of extension chunk
ulNextExtCkIdx : Cardinal; // If zero no more 3rd party entenstion chunks
ExtCkID : FOURCC;
byExtCk : array[0..DMUS_MIN_DATA_SIZE - 1] of Byte; // The actual number that follows is determined by cbSize
end;
DMUS_EXTENSIONCHUNK = TDMUS_EXTENSIONCHUNK;
 
(* The actual number is determined by cbSize of struct _DMUS_COPYRIGHT *)
// The actual number is determined by cbSize of struct TDMUS_COPYRIGHT
 
TDmus_Copyright = packed record
cbSize: ULONG; (* Size of copyright information *)
byCopyright: array [0..DMUS_MIN_DATA_SIZE-1] of BYTE; (* The actual number that follows is determined by cbSize *)
TDMUS_COPYRIGHT = record
cbSize : Cardinal; // Size of copyright information
byCopyright : array[0..DMUS_MIN_DATA_SIZE - 1] of Byte; // The actual number that follows is determined by cbSize
end;
DMUS_COPYRIGHT = TDMUS_COPYRIGHT;
 
TDMus_WaveData = packed record
cbSize: ULONG;
byData: array [0..DMUS_MIN_DATA_SIZE-1] of BYTE;
TDMUS_WAVEDATA = record
cbSize : Cardinal;
byData : array[0..DMUS_MIN_DATA_SIZE - 1] of Byte;
end;
DMUS_WAVEDATA = TDMUS_WAVEDATA;
 
TDMus_Wave = packed record
ulFirstExtCkIdx: ULONG; (* If zero no 3rd party entenstion chunks associated with the wave *)
ulCopyrightIdx: ULONG; (* If zero no Copyright information associated with the wave *)
ulWaveDataIdx: ULONG; (* Location of actual wave data. *)
/// WaveformatEx: TWaveFormatEx;
TDMUS_WAVE = record
ulFirstExtCkIdx : Cardinal; // If zero no 3rd party entenstion chunks associated with the wave
ulCopyrightIdx : Cardinal; // If zero no Copyright information associated with the wave
ulWaveDataIdx : Cardinal; // Location of actual wave data.
WaveformatEx : TWAVEFORMATEX;
end;
DMUS_WAVE = TDMUS_WAVE;
 
PDMus_NoteRange = ^TDMus_NoteRange;
TDMus_NoteRange = packed record
dwLowNote: DWORD; (* Sets the low note for the range of MIDI note events to which the instrument responds.*)
dwHighNote: DWORD; (* Sets the high note for the range of MIDI note events to which the instrument responds.*)
LPDMUS_NOTERANGE = ^TDMUS_NOTERANGE;
TDMUS_NOTERANGE = record
dwLowNote : DWORD; // Sets the low note for the range of MIDI note events to which the instrument responds.
dwHighNote : DWORD; // Sets the high note for the range of MIDI note events to which the instrument responds.
end;
DMUS_NOTERANGE = TDMUS_NOTERANGE;
 
(************************************************************************
* *
* dmerror.h -- Error code returned by DirectMusic API's *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
************************************************************************)
 
const
FACILITY_DIRECTMUSIC = $878; (* Shared with DirectSound *)
DMUS_ERRBASE = $1000; (* Make error codes human readable in hex *)
 
MAKE_DMHRESULTSUCCESS = (0 shl 31) or (FACILITY_DIRECTMUSIC shl 16) or DMUS_ERRBASE;
MAKE_DMHRESULTERROR = (1 shl 31) or (FACILITY_DIRECTMUSIC shl 16) or DMUS_ERRBASE;
 
 
(* DMUS_S_PARTIALLOAD
*
* The object could only load partially. This can happen if some components are
* not registered properly, such as embedded tracks and tools.
*)
DMUS_S_PARTIALLOAD = MAKE_DMHRESULTSUCCESS + $091;
//***********************************************************************
// *
// dmerror.h -- Error code returned by DirectMusic API's *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
//**********************************************************************
 
(* DMUS_S_PARTIALDOWNLOAD
*
* This code indicates that a band download was only successful in reaching
* some, but not all, of the referenced ports. Some samples may not play
* correctly.
*)
DMUS_S_PARTIALDOWNLOAD = MAKE_DMHRESULTSUCCESS + $092;
const
FACILITY_DIRECTMUSIC = $878; // Shared with DirectSound
DMUS_ERRBASE = $1000; // Make error codes human readable in hex
 
(* DMUS_S_REQUEUE
*
* Return value from IDirectMusicTool::ProcessPMsg() which indicates to the
* performance that it should cue the PMsg again automatically.
*)
DMUS_S_REQUEUE = MAKE_DMHRESULTSUCCESS + $200;
function MAKE_DMHRESULTSUCCESS(code: Cardinal) : HResult;
function MAKE_DMHRESULTERROR(code: Cardinal) : HResult;
 
(* DMUS_S_FREE
*
* Return value from IDirectMusicTool::ProcessPMsg() which indicates to the
* performance that it should free the PMsg automatically.
*)
DMUS_S_FREE = MAKE_DMHRESULTSUCCESS + $201;
// DMUS_S_PARTIALLOAD
//
// The object could only load partially. This can happen if some components are
// not registered properly, such as embedded tracks and tools.
///
const
DMUS_S_PARTIALLOAD = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $091;// MAKE_DMHRESULTSUCCESS($091);
 
(* DMUS_S_END
*
* Return value from IDirectMusicTrack::Play() which indicates to the
* segment that the track has no more data after mtEnd.
*)
DMUS_S_END = MAKE_DMHRESULTSUCCESS + $202;
// DMUS_S_REQUEUE
//
// Return value from IDirectMusicTool::ProcessPMsg() which indicates to the
// performance that it should cue the PMsg again automatically.
///
DMUS_S_REQUEUE = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $200;//MAKE_DMHRESULTSUCCESS(0x200)
 
(* DMUS_S_STRING_TRUNCATED
*
* Returned string has been truncated to fit the buffer size.
*)
DMUS_S_STRING_TRUNCATED = MAKE_DMHRESULTSUCCESS + $210;
// DMUS_S_FREE
//
// Return value from IDirectMusicTool::ProcessPMsg() which indicates to the
// performance that it should free the PMsg automatically.
///
DMUS_S_FREE = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $201;//MAKE_DMHRESULTSUCCESS(0x201)
 
(* DMUS_S_LAST_TOOL
*
* Returned from IDirectMusicGraph::StampPMsg(), this indicates that the PMsg
* is already stamped with the last tool in the graph. The returned PMsg's
* tool pointer is now NULL.
*)
DMUS_S_LAST_TOOL = MAKE_DMHRESULTSUCCESS + $211;
// DMUS_S_END
//
// Return value from IDirectMusicTrack::Play() which indicates to the
// segment that the track has no more data after mtEnd.
///
DMUS_S_END = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $202;//MAKE_DMHRESULTSUCCESS(0x202)
 
(* DMUS_S_OVER_CHORD
*
* Returned from IDirectMusicPerformance::MusicToMIDI(), this indicates
* that no note has been calculated because the music value has the note
* at a position higher than the top note of the chord. This applies only
* to DMUS_PLAYMODE_NORMALCHORD play mode. This success code indicates
* that the caller should not do anything with the note. It is not meant
* to be played against this chord.
*)
DMUS_S_OVER_CHORD = MAKE_DMHRESULTSUCCESS + $212;
// DMUS_S_STRING_TRUNCATED
//
// Returned string has been truncated to fit the buffer size.
///
DMUS_S_STRING_TRUNCATED = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $210;//MAKE_DMHRESULTSUCCESS(0x210)
 
(* DMUS_S_UP_OCTAVE
*
* Returned from IDirectMusicPerformance::MIDIToMusic(), and
* IDirectMusicPerformance::MusicToMIDI(), this indicates
* that the note conversion generated a note value that is below 0,
* so it has been bumped up one or more octaves to be in the proper
* MIDI range of 0 through 127.
* Note that this is valid for MIDIToMusic() when using play modes
* DMUS_PLAYMODE_FIXEDTOCHORD and DMUS_PLAYMODE_FIXEDTOKEY, both of
* which store MIDI values in wMusicValue. With MusicToMIDI(), it is
* valid for all play modes.
* Ofcourse, DMUS_PLAYMODE_FIXED will never return this success code.
*)
DMUS_S_UP_OCTAVE = MAKE_DMHRESULTSUCCESS + $213;
// DMUS_S_LAST_TOOL
//
// Returned from IDirectMusicGraph::StampPMsg(), this indicates that the PMsg
// is already stamped with the last tool in the graph. The returned PMsg's
// tool pointer is now NULL.
///
DMUS_S_LAST_TOOL = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $211;//MAKE_DMHRESULTSUCCESS(0x211)
 
(* DMUS_S_DOWN_OCTAVE
*
* Returned from IDirectMusicPerformance::MIDIToMusic(), and
* IDirectMusicPerformance::MusicToMIDI(), this indicates
* that the note conversion generated a note value that is above 127,
* so it has been bumped down one or more octaves to be in the proper
* MIDI range of 0 through 127.
* Note that this is valid for MIDIToMusic() when using play modes
* DMUS_PLAYMODE_FIXEDTOCHORD and DMUS_PLAYMODE_FIXEDTOKEY, both of
* which store MIDI values in wMusicValue. With MusicToMIDI(), it is
* valid for all play modes.
* Ofcourse, DMUS_PLAYMODE_FIXED will never return this success code.
*)
DMUS_S_DOWN_OCTAVE = MAKE_DMHRESULTSUCCESS + $214;
// DMUS_S_OVER_CHORD
//
// Returned from IDirectMusicPerformance::MusicToMIDI(), this indicates
// that no note has been calculated because the music value has the note
// at a position higher than the top note of the chord. This applies only
// to DMUS_PLAYMODE_NORMALCHORD play mode. This success code indicates
// that the caller should not do anything with the note. It is not meant
// to be played against this chord.
///
DMUS_S_OVER_CHORD = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $212;//MAKE_DMHRESULTSUCCESS(0x212)
 
(* DMUS_S_NOBUFFERCONTROL
*
* Although the audio output from the port will be routed to the
* same device as the given DirectSound buffer, buffer controls
* such as pan and volume will not affect the output.
*
*)
DMUS_S_NOBUFFERCONTROL = MAKE_DMHRESULTSUCCESS + $215;
// DMUS_S_UP_OCTAVE
//
// Returned from IDirectMusicPerformance::MIDIToMusic(), and
// IDirectMusicPerformance::MusicToMIDI(), this indicates
// that the note conversion generated a note value that is below 0,
// so it has been bumped up one or more octaves to be in the proper
// MIDI range of 0 through 127.
// Note that this is valid for MIDIToMusic() when using play modes
// DMUS_PLAYMODE_FIXEDTOCHORD and DMUS_PLAYMODE_FIXEDTOKEY, both of
// which store MIDI values in wMusicValue. With MusicToMIDI(), it is
// valid for all play modes.
// Ofcourse, DMUS_PLAYMODE_FIXED will never return this success code.
///
DMUS_S_UP_OCTAVE = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $213;//MAKE_DMHRESULTSUCCESS(0x213)
 
(* DMUS_E_DRIVER_FAILED
*
* An unexpected error was returned from a device driver, indicating
* possible failure of the driver or hardware.
*)
DMUS_E_DRIVER_FAILED = MAKE_DMHRESULTERROR + $0101;
// DMUS_S_DOWN_OCTAVE
//
// Returned from IDirectMusicPerformance::MIDIToMusic(), and
// IDirectMusicPerformance::MusicToMIDI(), this indicates
// that the note conversion generated a note value that is above 127,
// so it has been bumped down one or more octaves to be in the proper
// MIDI range of 0 through 127.
// Note that this is valid for MIDIToMusic() when using play modes
// DMUS_PLAYMODE_FIXEDTOCHORD and DMUS_PLAYMODE_FIXEDTOKEY, both of
// which store MIDI values in wMusicValue. With MusicToMIDI(), it is
// valid for all play modes.
// Ofcourse, DMUS_PLAYMODE_FIXED will never return this success code.
///
DMUS_S_DOWN_OCTAVE = (0 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $214;//MAKE_DMHRESULTSUCCESS(0x214)
 
(* DMUS_E_PORTS_OPEN
*
* The requested operation cannot be performed while there are
* instantiated ports in any process in the system.
*)
DMUS_E_PORTS_OPEN = MAKE_DMHRESULTERROR + $0102;
// DMUS_E_DRIVER_FAILED
//
// An unexpected error was returned from a device driver, indicating
// possible failure of the driver or hardware.
///
DMUS_E_DRIVER_FAILED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0101;//MAKE_DMHRESULTERROR(0x0101)
 
(* DMUS_E_DEVICE_IN_USE
*
* The requested device is already in use (possibly by a non-DirectMusic
* client) and cannot be opened again.
*)
DMUS_E_DEVICE_IN_USE = MAKE_DMHRESULTERROR + $0103;
// DMUS_E_PORTS_OPEN
//
// The requested operation cannot be performed while there are
// instantiated ports in any process in the system.
///
DMUS_E_PORTS_OPEN = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0102;//MAKE_DMHRESULTERROR(0x0102)
 
(* DMUS_E_INSUFFICIENTBUFFER
*
* Buffer is not large enough for requested operation.
*)
DMUS_E_INSUFFICIENTBUFFER = MAKE_DMHRESULTERROR + $0104;
// DMUS_E_DEVICE_IN_USE
//
// The requested device is already in use (possibly by a non-DirectMusic
// client) and cannot be opened again.
///
DMUS_E_DEVICE_IN_USE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0103;//MAKE_DMHRESULTERROR(0x0103)
 
(* DMUS_E_BUFFERNOTSET
*
* No buffer was prepared for the download data.
*)
DMUS_E_BUFFERNOTSET = MAKE_DMHRESULTERROR + $0105;
// DMUS_E_INSUFFICIENTBUFFER
//
// Buffer is not large enough for requested operation.
///
DMUS_E_INSUFFICIENTBUFFER = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0104;//MAKE_DMHRESULTERROR(0x0104)
 
(* DMUS_E_BUFFERNOTAVAILABLE
*
* Download failed due to inability to access or create download buffer.
*)
DMUS_E_BUFFERNOTAVAILABLE = MAKE_DMHRESULTERROR + $0106;
// DMUS_E_BUFFERNOTSET
//
// No buffer was prepared for the download data.
///
DMUS_E_BUFFERNOTSET = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0105;//MAKE_DMHRESULTERROR(0x0105)
 
(* DMUS_E_NOTADLSCOL
*
* Error parsing DLS collection. File is corrupt.
*)
DMUS_E_NOTADLSCOL = MAKE_DMHRESULTERROR + $0108;
// DMUS_E_BUFFERNOTAVAILABLE
//
// Download failed due to inability to access or create download buffer.
///
DMUS_E_BUFFERNOTAVAILABLE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0106;//MAKE_DMHRESULTERROR(0x0106)
 
(* DMUS_E_INVALIDOFFSET
*
* Wave chunks in DLS collection file are at incorrect offsets.
*)
DMUS_E_INVALIDOFFSET = MAKE_DMHRESULTERROR + $0109;
// DMUS_E_NOTADLSCOL
//
// Error parsing DLS collection. File is corrupt.
///
DMUS_E_NOTADLSCOL = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0108;//MAKE_DMHRESULTERROR(0x0108)
 
(* DMUS_E_ALREADY_LOADED
*
* Second attempt to load a DLS collection that is currently open.
*)
DMUS_E_ALREADY_LOADED = MAKE_DMHRESULTERROR + $0111;
// DMUS_E_INVALIDOFFSET
//
// Wave chunks in DLS collection file are at incorrect offsets.
///
DMUS_E_INVALIDOFFSET = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0109;//MAKE_DMHRESULTERROR(0x0109)
 
(* DMUS_E_INVALIDPOS
*
* Error reading wave data from DLS collection. Indicates bad file.
*)
DMUS_E_INVALIDPOS = MAKE_DMHRESULTERROR + $0113;
// DMUS_E_ALREADY_LOADED
//
// Second attempt to load a DLS collection that is currently open.
///
DMUS_E_ALREADY_LOADED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0111;//MAKE_DMHRESULTERROR(0x0111)
 
(* DMUS_E_INVALIDPATCH
*
* There is no instrument in the collection that matches patch number.
*)
DMUS_E_INVALIDPATCH = MAKE_DMHRESULTERROR + $0114;
// DMUS_E_INVALIDPOS
//
// Error reading wave data from DLS collection. Indicates bad file.
///
DMUS_E_INVALIDPOS = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0113;//MAKE_DMHRESULTERROR(0x0113)
 
(* DMUS_E_CANNOTSEEK
*
* The IStream* doesn't support Seek().
*)
DMUS_E_CANNOTSEEK = MAKE_DMHRESULTERROR + $0115;
// DMUS_E_INVALIDPATCH
//
// There is no instrument in the collection that matches patch number.
///
DMUS_E_INVALIDPATCH = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0114;//MAKE_DMHRESULTERROR(0x0114)
 
(* DMUS_E_CANNOTWRITE
*
* The IStream* doesn't support Write().
*)
DMUS_E_CANNOTWRITE = MAKE_DMHRESULTERROR + $0116;
// DMUS_E_CANNOTSEEK
//
// The IStream* doesn't support Seek().
///
DMUS_E_CANNOTSEEK = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0115;//MAKE_DMHRESULTERROR(0x0115)
 
(* DMUS_E_CHUNKNOTFOUND
*
* The RIFF parser doesn't contain a required chunk while parsing file.
*)
DMUS_E_CHUNKNOTFOUND = MAKE_DMHRESULTERROR + $0117;
// DMUS_E_CANNOTWRITE
//
// The IStream* doesn't support Write().
///
DMUS_E_CANNOTWRITE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0116;//MAKE_DMHRESULTERROR(0x0116)
 
(* DMUS_E_INVALID_DOWNLOADID
*
* Invalid download id was used in the process of creating a download buffer.
*)
DMUS_E_INVALID_DOWNLOADID = MAKE_DMHRESULTERROR + $0119;
// DMUS_E_CHUNKNOTFOUND
//
// The RIFF parser doesn't contain a required chunk while parsing file.
///
DMUS_E_CHUNKNOTFOUND = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0117;//MAKE_DMHRESULTERROR(0x0117)
 
(* DMUS_E_NOT_DOWNLOADED_TO_PORT
*
* Tried to unload an object that was not downloaded or previously unloaded.
*)
DMUS_E_NOT_DOWNLOADED_TO_PORT = MAKE_DMHRESULTERROR + $0120;
// DMUS_E_INVALID_DOWNLOADID
//
// Invalid download id was used in the process of creating a download buffer.
///
DMUS_E_INVALID_DOWNLOADID = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0119;//MAKE_DMHRESULTERROR(0x0119)
 
(* DMUS_E_ALREADY_DOWNLOADED
*
* Buffer was already downloaded to synth.
*)
DMUS_E_ALREADY_DOWNLOADED = MAKE_DMHRESULTERROR + $0121;
// DMUS_E_NOT_DOWNLOADED_TO_PORT
//
// Tried to unload an object that was not downloaded or previously unloaded.
///
DMUS_E_NOT_DOWNLOADED_TO_PORT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0120;//MAKE_DMHRESULTERROR(0x0120)
 
(* DMUS_E_UNKNOWN_PROPERTY
*
* The specified property item was not recognized by the target object.
*)
DMUS_E_UNKNOWN_PROPERTY = MAKE_DMHRESULTERROR + $0122;
// DMUS_E_ALREADY_DOWNLOADED
//
// Buffer was already downloaded to synth.
///
DMUS_E_ALREADY_DOWNLOADED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0121;//MAKE_DMHRESULTERROR(0x0121)
 
(* DMUS_E_SET_UNSUPPORTED
*
* The specified property item may not be set on the target object.
*)
DMUS_E_SET_UNSUPPORTED = MAKE_DMHRESULTERROR + $0123;
// DMUS_E_UNKNOWN_PROPERTY
//
// The specified property item was not recognized by the target object.
///
DMUS_E_UNKNOWN_PROPERTY = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0122;//MAKE_DMHRESULTERROR(0x0122)
 
(* DMUS_E_GET_UNSUPPORTED
*
* The specified property item may not be retrieved from the target object.
*)
DMUS_E_GET_UNSUPPORTED = MAKE_DMHRESULTERROR + $0124;
// DMUS_E_SET_UNSUPPORTED
//
// The specified property item may not be set on the target object.
///
DMUS_E_SET_UNSUPPORTED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0123;//MAKE_DMHRESULTERROR(0x0123)
 
(* DMUS_E_NOTMONO
*
* Wave chunk has more than one interleaved channel. DLS format requires MONO.
*)
DMUS_E_NOTMONO = MAKE_DMHRESULTERROR + $0125;
// DMUS_E_GET_UNSUPPORTED
//
// The specified property item may not be retrieved from the target object.
///
DMUS_E_GET_UNSUPPORTED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0124;//MAKE_DMHRESULTERROR(0x0124)
 
(* DMUS_E_BADARTICULATION
*
* Invalid articulation chunk in DLS collection.
*)
DMUS_E_BADARTICULATION = MAKE_DMHRESULTERROR + $0126;
// DMUS_E_NOTMONO
//
// Wave chunk has more than one interleaved channel. DLS format requires MONO.
///
DMUS_E_NOTMONO = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0125;//MAKE_DMHRESULTERROR(0x0125)
 
(* DMUS_E_BADINSTRUMENT
*
* Invalid instrument chunk in DLS collection.
*)
DMUS_E_BADINSTRUMENT = MAKE_DMHRESULTERROR + $0127;
// DMUS_E_BADARTICULATION
//
// Invalid articulation chunk in DLS collection.
///
DMUS_E_BADARTICULATION = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0126;//MAKE_DMHRESULTERROR(0x0126)
 
(* DMUS_E_BADWAVELINK
*
* Wavelink chunk in DLS collection points to invalid wave.
*)
DMUS_E_BADWAVELINK = MAKE_DMHRESULTERROR + $0128;
// DMUS_E_BADINSTRUMENT
//
// Invalid instrument chunk in DLS collection.
///
DMUS_E_BADINSTRUMENT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0127;//MAKE_DMHRESULTERROR(0x0127)
 
(* DMUS_E_NOARTICULATION
*
* Articulation missing from instrument in DLS collection.
*)
DMUS_E_NOARTICULATION = MAKE_DMHRESULTERROR + $0129;
// DMUS_E_BADWAVELINK
//
// Wavelink chunk in DLS collection points to invalid wave.
///
DMUS_E_BADWAVELINK = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0128;//MAKE_DMHRESULTERROR(0x0128)
 
(* DMUS_E_NOTPCM
*
* Downoaded DLS wave is not in PCM format.
*)
DMUS_E_NOTPCM = MAKE_DMHRESULTERROR + $012A;
// DMUS_E_NOARTICULATION
//
// Articulation missing from instrument in DLS collection.
///
DMUS_E_NOARTICULATION = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0129;//MAKE_DMHRESULTERROR(0x0129)
 
(* DMUS_E_BADWAVE
*
* Bad wave chunk in DLS collection
*)
DMUS_E_BADWAVE = MAKE_DMHRESULTERROR + $012B;
// DMUS_E_NOTPCM
//
// Downoaded DLS wave is not in PCM format.
///
DMUS_E_NOTPCM = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $012A;//MAKE_DMHRESULTERROR(0x012A)
 
(* DMUS_E_BADOFFSETTABLE
*
* Offset Table for download buffer has errors.
*)
DMUS_E_BADOFFSETTABLE = MAKE_DMHRESULTERROR + $012C;
// DMUS_E_BADWAVE
//
// Bad wave chunk in DLS collection
///
DMUS_E_BADWAVE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $012B;//MAKE_DMHRESULTERROR(0x012B)
 
(* DMUS_E_UNKNOWNDOWNLOAD
*
* Attempted to download unknown data type.
*)
DMUS_E_UNKNOWNDOWNLOAD = MAKE_DMHRESULTERROR + $012D;
// DMUS_E_BADOFFSETTABLE
//
// Offset Table for download buffer has errors.
///
DMUS_E_BADOFFSETTABLE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $012C;//MAKE_DMHRESULTERROR(0x012C)
 
(* DMUS_E_NOSYNTHSINK
*
* The operation could not be completed because no sink was connected to
* the synthesizer.
*)
DMUS_E_NOSYNTHSINK = MAKE_DMHRESULTERROR + $012E;
// DMUS_E_UNKNOWNDOWNLOAD
//
// Attempted to download unknown data type.
///
DMUS_E_UNKNOWNDOWNLOAD = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $012D;//MAKE_DMHRESULTERROR(0x012D)
 
(* DMUS_E_ALREADYOPEN
*
* An attempt was made to open the software synthesizer while it was already
* open.
* ASSERT?
*)
DMUS_E_ALREADYOPEN = MAKE_DMHRESULTERROR + $012F;
// DMUS_E_NOSYNTHSINK
//
// The operation could not be completed because no sink was connected to
// the synthesizer.
///
DMUS_E_NOSYNTHSINK = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $012E;//MAKE_DMHRESULTERROR(0x012E)
 
(* DMUS_E_ALREADYCLOSE
*
* An attempt was made to close the software synthesizer while it was already
* open.
* ASSERT?
*)
DMUS_E_ALREADYCLOSED = MAKE_DMHRESULTERROR + $0130;
// DMUS_E_ALREADYOPEN
//
// An attempt was made to open the software synthesizer while it was already
// open.
// ASSERT?
///
DMUS_E_ALREADYOPEN = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $012F;//MAKE_DMHRESULTERROR(0x012F)
 
(* DMUS_E_SYNTHNOTCONFIGURED
*
* The operation could not be completed because the software synth has not
* yet been fully configured.
* ASSERT?
*)
DMUS_E_SYNTHNOTCONFIGURED = MAKE_DMHRESULTERROR + $0131;
// DMUS_E_ALREADYCLOSE
//
// An attempt was made to close the software synthesizer while it was already
// open.
// ASSERT?
///
DMUS_E_ALREADYCLOSED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0130;//MAKE_DMHRESULTERROR(0x0130)
 
(* DMUS_E_SYNTHACTIVE
*
* The operation cannot be carried out while the synthesizer is active.
*)
DMUS_E_SYNTHACTIVE = MAKE_DMHRESULTERROR + $0132;
// DMUS_E_SYNTHNOTCONFIGURED
//
// The operation could not be completed because the software synth has not
// yet been fully configured.
// ASSERT?
///
DMUS_E_SYNTHNOTCONFIGURED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0131;//MAKE_DMHRESULTERROR(0x0131)
 
(* DMUS_E_CANNOTREAD
*
* An error occurred while attempting to read from the IStream* object.
*)
DMUS_E_CANNOTREAD = MAKE_DMHRESULTERROR + $0133;
// DMUS_E_SYNTHACTIVE
//
// The operation cannot be carried out while the synthesizer is active.
///
DMUS_E_SYNTHACTIVE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0132;//MAKE_DMHRESULTERROR(0x0132)
 
(* DMUS_E_DMUSIC_RELEASED
*
* The operation cannot be performed because the final instance of the
* DirectMusic object was released. Ports cannot be used after final
* release of the DirectMusic object.
*)
DMUS_E_DMUSIC_RELEASED = MAKE_DMHRESULTERROR + $0134;
// DMUS_E_CANNOTREAD
//
// An error occurred while attempting to read from the IStream* object.
///
DMUS_E_CANNOTREAD = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0133;//MAKE_DMHRESULTERROR(0x0133)
 
(* DMUS_E_BUFFER_EMPTY
*
* There was no data in the referenced buffer.
*)
DMUS_E_BUFFER_EMPTY = MAKE_DMHRESULTERROR + $0135;
// DMUS_E_DMUSIC_RELEASED
//
// The operation cannot be performed because the final instance of the
// DirectMusic object was released. Ports cannot be used after final
// release of the DirectMusic object.
///
DMUS_E_DMUSIC_RELEASED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0134;//MAKE_DMHRESULTERROR(0x0134)
 
(* DMUS_E_BUFFER_FULL
*
* There is insufficient space to insert the given event into the buffer.
*)
DMUS_E_BUFFER_FULL = MAKE_DMHRESULTERROR + $0136;
// DMUS_E_BUFFER_EMPTY
//
// There was no data in the referenced buffer.
///
DMUS_E_BUFFER_EMPTY = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0135;//MAKE_DMHRESULTERROR(0x0135)
 
(* DMUS_E_PORT_NOT_CAPTURE
*
* The given operation could not be carried out because the port is a
* capture port.
*)
DMUS_E_PORT_NOT_CAPTURE = MAKE_DMHRESULTERROR + $0137;
// DMUS_E_BUFFER_FULL
//
// There is insufficient space to insert the given event into the buffer.
///
DMUS_E_BUFFER_FULL = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0136;//MAKE_DMHRESULTERROR(0x0136)
 
(* DMUS_E_PORT_NOT_RENDER
*
* The given operation could not be carried out because the port is a
* render port.
*)
DMUS_E_PORT_NOT_RENDER = MAKE_DMHRESULTERROR + $0138;
// DMUS_E_PORT_NOT_CAPTURE
//
// The given operation could not be carried out because the port is a
// capture port.
///
DMUS_E_PORT_NOT_CAPTURE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0137;//MAKE_DMHRESULTERROR(0x0137)
 
(* DMUS_E_DSOUND_NOT_SET
*
* The port could not be created because no DirectSound has been specified.
* Specify a DirectSound interface via the IDirectMusic::SetDirectSound
* method; pass NULL to have DirectMusic manage usage of DirectSound.
*)
DMUS_E_DSOUND_NOT_SET = MAKE_DMHRESULTERROR + $0139;
// DMUS_E_PORT_NOT_RENDER
//
// The given operation could not be carried out because the port is a
// render port.
///
DMUS_E_PORT_NOT_RENDER = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0138;//MAKE_DMHRESULTERROR(0x0138)
 
(* DMUS_E_ALREADY_ACTIVATED
*
* The operation cannot be carried out while the port is active.
*)
DMUS_E_ALREADY_ACTIVATED = MAKE_DMHRESULTERROR + $013A;
// DMUS_E_DSOUND_NOT_SET
//
// The port could not be created because no DirectSound has been specified.
// Specify a DirectSound interface via the IDirectMusic::SetDirectSound
// method; pass NULL to have DirectMusic manage usage of DirectSound.
///
DMUS_E_DSOUND_NOT_SET = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0139;//MAKE_DMHRESULTERROR(0x0139)
 
(* DMUS_E_INVALIDBUFFER
*
* Invalid DirectSound buffer was handed to port.
*)
DMUS_E_INVALIDBUFFER = MAKE_DMHRESULTERROR + $013B;
// DMUS_E_ALREADY_ACTIVATED
//
// The operation cannot be carried out while the port is active.
///
DMUS_E_ALREADY_ACTIVATED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $013A;//MAKE_DMHRESULTERROR(0x013A)
 
(* DMUS_E_WAVEFORMATNOTSUPPORTED
*
* Invalid buffer format was handed to the synth sink.
*)
DMUS_E_WAVEFORMATNOTSUPPORTED = MAKE_DMHRESULTERROR + $013C;
// DMUS_E_INVALIDBUFFER
//
// Invalid DirectSound buffer was handed to port.
///
DMUS_E_INVALIDBUFFER = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $013B;//MAKE_DMHRESULTERROR(0x013B)
 
(* DMUS_E_SYNTHINACTIVE
*
* The operation cannot be carried out while the synthesizer is inactive.
*)
DMUS_E_SYNTHINACTIVE = MAKE_DMHRESULTERROR + $013D;
// DMUS_E_WAVEFORMATNOTSUPPORTED
//
// Invalid buffer format was handed to the synth sink.
///
DMUS_E_WAVEFORMATNOTSUPPORTED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $013C;//MAKE_DMHRESULTERROR(0x013C)
 
(* DMUS_E_DSOUND_ALREADY_SET
*
* IDirectMusic::SetDirectSound has already been called. It may not be
* changed while in use.
*)
DMUS_E_DSOUND_ALREADY_SET = MAKE_DMHRESULTERROR + $013E;
// DMUS_E_SYNTHINACTIVE
//
// The operation cannot be carried out while the synthesizer is inactive.
///
DMUS_E_SYNTHINACTIVE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $013D;//MAKE_DMHRESULTERROR(0x013D)
 
(* DMUS_E_INVALID_EVENT
*
* The given event is invalid (either it is not a valid MIDI message
* or it makes use of running status). The event cannot be packed
* into the buffer.
*)
DMUS_E_INVALID_EVENT = MAKE_DMHRESULTERROR + $013F;
// DMUS_E_DSOUND_ALREADY_SET
//
// IDirectMusic::SetDirectSound has already been called. It may not be
// changed while in use.
///
DMUS_E_DSOUND_ALREADY_SET = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $013E;//MAKE_DMHRESULTERROR(0x013E)
 
(* DMUS_E_UNSUPPORTED_STREAM
*
* The IStream* object does not contain data supported by the loading object.
*)
DMUS_E_UNSUPPORTED_STREAM = MAKE_DMHRESULTERROR + $0150;
// DMUS_E_INVALID_EVENT
//
// The given event is invalid (either it is not a valid MIDI message
// or it makes use of running status). The event cannot be packed
// into the buffer.
///
DMUS_E_INVALID_EVENT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $013F;//MAKE_DMHRESULTERROR(0x013F)
 
(* DMUS_E_ALREADY_INITED
*
* The object has already been initialized.
*)
DMUS_E_ALREADY_INITED = MAKE_DMHRESULTERROR + $0151;
// DMUS_E_UNSUPPORTED_STREAM
//
// The IStream* object does not contain data supported by the loading object.
///
DMUS_E_UNSUPPORTED_STREAM = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0150;//MAKE_DMHRESULTERROR(0x0150)
 
(* DMUS_E_INVALID_BAND
*
* The file does not contain a valid band.
*)
DMUS_E_INVALID_BAND = MAKE_DMHRESULTERROR + $0152;
// DMUS_E_ALREADY_INITED
//
// The object has already been initialized.
///
DMUS_E_ALREADY_INITED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0151;//MAKE_DMHRESULTERROR(0x0151)
 
(* DMUS_E_TRACK_HDR_NOT_FIRST_CK
*
* The IStream* object's data does not have a track header as the first chunk,
* and therefore can not be read by the segment object.
*)
DMUS_E_TRACK_HDR_NOT_FIRST_CK = MAKE_DMHRESULTERROR + $0155;
// DMUS_E_INVALID_BAND
//
// The file does not contain a valid band.
///
DMUS_E_INVALID_BAND = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0152;//MAKE_DMHRESULTERROR(0x0152)
 
(* DMUS_E_TOOL_HDR_NOT_FIRST_CK
*
* The IStream* object's data does not have a tool header as the first chunk,
* and therefore can not be read by the graph object.
*)
DMUS_E_TOOL_HDR_NOT_FIRST_CK = MAKE_DMHRESULTERROR + $0156;
// DMUS_E_TRACK_HDR_NOT_FIRST_CK
//
// The IStream* object's data does not have a track header as the first chunk,
// and therefore can not be read by the segment object.
///
DMUS_E_TRACK_HDR_NOT_FIRST_CK = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0155;//MAKE_DMHRESULTERROR(0x0155)
 
(* DMUS_E_INVALID_TRACK_HDR
*
* The IStream* object's data contains an invalid track header (ckid is 0 and
* fccType is NULL,) and therefore can not be read by the segment object.
*)
DMUS_E_INVALID_TRACK_HDR = MAKE_DMHRESULTERROR + $0157;
// DMUS_E_TOOL_HDR_NOT_FIRST_CK
//
// The IStream* object's data does not have a tool header as the first chunk,
// and therefore can not be read by the graph object.
///
DMUS_E_TOOL_HDR_NOT_FIRST_CK = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0156;//MAKE_DMHRESULTERROR(0x0156)
 
(* DMUS_E_INVALID_TOOL_HDR
*
* The IStream* object's data contains an invalid tool header (ckid is 0 and
* fccType is NULL,) and therefore can not be read by the graph object.
*)
DMUS_E_INVALID_TOOL_HDR = MAKE_DMHRESULTERROR + $0158;
// DMUS_E_INVALID_TRACK_HDR
//
// The IStream* object's data contains an invalid track header (ckid is 0 and
// fccType is NULL,) and therefore can not be read by the segment object.
///
DMUS_E_INVALID_TRACK_HDR = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0157;//MAKE_DMHRESULTERROR(0x0157)
 
(* DMUS_E_ALL_TOOLS_FAILED
*
* The graph object was unable to load all tools from the IStream* object data.
* This may be due to errors in the stream, or the tools being incorrectly
* registered on the client.
*)
DMUS_E_ALL_TOOLS_FAILED = MAKE_DMHRESULTERROR + $0159;
// DMUS_E_INVALID_TOOL_HDR
//
// The IStream* object's data contains an invalid tool header (ckid is 0 and
// fccType is NULL,) and therefore can not be read by the graph object.
///
DMUS_E_INVALID_TOOL_HDR = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0158;//MAKE_DMHRESULTERROR(0x0158)
 
(* DMUS_E_ALL_TRACKS_FAILED
*
* The segment object was unable to load all tracks from the IStream* object data.
* This may be due to errors in the stream, or the tracks being incorrectly
* registered on the client.
*)
DMUS_E_ALL_TRACKS_FAILED = MAKE_DMHRESULTERROR + $0160;
// DMUS_E_ALL_TOOLS_FAILED
//
// The graph object was unable to load all tools from the IStream* object data.
// This may be due to errors in the stream, or the tools being incorrectly
// registered on the client.
///
DMUS_E_ALL_TOOLS_FAILED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0159;//MAKE_DMHRESULTERROR(0x0159)
 
(* DMUS_E_NOT_FOUND
*
* The requested item was not contained by the object.
*)
DMUS_E_NOT_FOUND = MAKE_DMHRESULTERROR + $0161;
// DMUS_E_ALL_TRACKS_FAILED
//
// The segment object was unable to load all tracks from the IStream* object data.
// This may be due to errors in the stream, or the tracks being incorrectly
// registered on the client.
///
DMUS_E_ALL_TRACKS_FAILED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0160;//MAKE_DMHRESULTERROR(0x0160)
 
(* DMUS_E_NOT_INIT
*
* A required object is not initialized or failed to initialize.
*)
DMUS_E_NOT_INIT = MAKE_DMHRESULTERROR + $0162;
// DMUS_E_NOT_FOUND
//
// The requested item was not contained by the object.
///
DMUS_E_NOT_FOUND = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0161;//MAKE_DMHRESULTERROR(0x0161)
 
(* DMUS_E_TYPE_DISABLED
*
* The requested parameter type is currently disabled. Parameter types may
* be enabled and disabled by certain calls to SetParam().
*)
DMUS_E_TYPE_DISABLED = MAKE_DMHRESULTERROR + $0163;
// DMUS_E_NOT_INIT
//
// A required object is not initialized or failed to initialize.
///
DMUS_E_NOT_INIT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0162;//MAKE_DMHRESULTERROR(0x0162)
 
(* DMUS_E_TYPE_UNSUPPORTED
*
* The requested parameter type is not supported on the object.
*)
DMUS_E_TYPE_UNSUPPORTED = MAKE_DMHRESULTERROR + $0164;
// DMUS_E_TYPE_DISABLED
//
// The requested parameter type is currently disabled. Parameter types may
// be enabled and disabled by certain calls to SetParam().
///
DMUS_E_TYPE_DISABLED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0163;//MAKE_DMHRESULTERROR(0x0163)
 
(* DMUS_E_TIME_PAST
*
* The time is in the past, and the operation can not succeed.
*)
DMUS_E_TIME_PAST = MAKE_DMHRESULTERROR + $0165;
// DMUS_E_TYPE_UNSUPPORTED
//
// The requested parameter type is not supported on the object.
///
DMUS_E_TYPE_UNSUPPORTED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0164;//MAKE_DMHRESULTERROR(0x0164)
 
(* DMUS_E_TRACK_NOT_FOUND
*
* The requested track is not contained by the segment.
*)
DMUS_E_TRACK_NOT_FOUND = MAKE_DMHRESULTERROR + $0166;
// DMUS_E_TIME_PAST
//
// The time is in the past, and the operation can not succeed.
///
DMUS_E_TIME_PAST = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0165;//MAKE_DMHRESULTERROR(0x0165)
 
(* DMUS_E_NO_MASTER_CLOCK
*
* There is no master clock in the performance. Be sure to call
* IDirectMusicPerformance::Init().
*)
DMUS_E_NO_MASTER_CLOCK = MAKE_DMHRESULTERROR + $0170;
// DMUS_E_TRACK_NOT_FOUND
//
// The requested track is not contained by the segment.
///
DMUS_E_TRACK_NOT_FOUND = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0166;//MAKE_DMHRESULTERROR(0x0166)
 
(* DMUS_E_LOADER_NOCLASSID
*
* The class id field is required and missing in the DMUS_OBJECTDESC.
*)
DMUS_E_LOADER_NOCLASSID = MAKE_DMHRESULTERROR + $0180;
// DMUS_E_NO_MASTER_CLOCK
//
// There is no master clock in the performance. Be sure to call
// IDirectMusicPerformance::Init().
///
DMUS_E_NO_MASTER_CLOCK = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0170;//MAKE_DMHRESULTERROR(0x0170)
 
(* DMUS_E_LOADER_BADPATH
*
* The requested file path is invalid.
*)
DMUS_E_LOADER_BADPATH = MAKE_DMHRESULTERROR + $0181;
// DMUS_E_LOADER_NOCLASSID
//
// The class id field is required and missing in the DMUS_OBJECTDESC.
///
DMUS_E_LOADER_NOCLASSID = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0180;//MAKE_DMHRESULTERROR(0x0180)
 
(* DMUS_E_LOADER_FAILEDOPEN
*
* File open failed - either file doesn't exist or is locked.
*)
DMUS_E_LOADER_FAILEDOPEN = MAKE_DMHRESULTERROR + $0182;
// DMUS_E_LOADER_BADPATH
//
// The requested file path is invalid.
///
DMUS_E_LOADER_BADPATH = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0181;//MAKE_DMHRESULTERROR(0x0181)
 
(* DMUS_E_LOADER_FORMATNOTSUPPORTED
*
* Search data type is not supported.
*)
DMUS_E_LOADER_FORMATNOTSUPPORTED = MAKE_DMHRESULTERROR + $0183;
// DMUS_E_LOADER_FAILEDOPEN
//
// File open failed - either file doesn't exist or is locked.
///
DMUS_E_LOADER_FAILEDOPEN = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0182;//MAKE_DMHRESULTERROR(0x0182)
 
(* DMUS_E_LOADER_FAILEDCREATE
*
* Unable to find or create object.
*)
DMUS_E_LOADER_FAILEDCREATE = MAKE_DMHRESULTERROR + $0184;
// DMUS_E_LOADER_FORMATNOTSUPPORTED
//
// Search data type is not supported.
///
DMUS_E_LOADER_FORMATNOTSUPPORTED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0183;//MAKE_DMHRESULTERROR(0x0183)
 
(* DMUS_E_LOADER_OBJECTNOTFOUND
*
* Object was not found.
*)
DMUS_E_LOADER_OBJECTNOTFOUND = MAKE_DMHRESULTERROR + $0185;
// DMUS_E_LOADER_FAILEDCREATE
//
// Unable to find or create object.
///
DMUS_E_LOADER_FAILEDCREATE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0184;//MAKE_DMHRESULTERROR(0x0184)
 
(* DMUS_E_LOADER_NOFILENAME
*
* The file name is missing from the DMUS_OBJECTDESC.
*)
DMUS_E_LOADER_NOFILENAME = MAKE_DMHRESULTERROR + $0186;
// DMUS_E_LOADER_OBJECTNOTFOUND
//
// Object was not found.
///
DMUS_E_LOADER_OBJECTNOTFOUND = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0185;//MAKE_DMHRESULTERROR(0x0185)
 
(* DMUS_E_INVALIDFILE
*
* The file requested is not a valid file.
*)
DMUS_E_INVALIDFILE = MAKE_DMHRESULTERROR + $0200;
// DMUS_E_LOADER_NOFILENAME
//
// The file name is missing from the DMUS_OBJECTDESC.
///
DMUS_E_LOADER_NOFILENAME = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0186;//MAKE_DMHRESULTERROR(0x0186)
 
(* DMUS_E_ALREADY_EXISTS
*
* The tool is already contained in the graph. Create a new instance.
*)
DMUS_E_ALREADY_EXISTS = MAKE_DMHRESULTERROR + $0201;
// DMUS_E_INVALIDFILE
//
// The file requested is not a valid file.
///
DMUS_E_INVALIDFILE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0200;//MAKE_DMHRESULTERROR(0x0200)
 
(* DMUS_E_OUT_OF_RANGE
*
* Value is out of range, for instance the requested length is longer than
* the segment.
*)
DMUS_E_OUT_OF_RANGE = MAKE_DMHRESULTERROR + $0202;
// DMUS_E_ALREADY_EXISTS
//
// The tool is already contained in the graph. Create a new instance.
///
DMUS_E_ALREADY_EXISTS = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0201;//MAKE_DMHRESULTERROR(0x0201)
 
(* DMUS_E_SEGMENT_INIT_FAILED
*
* Segment initialization failed, most likely due to a critical memory situation.
*)
DMUS_E_SEGMENT_INIT_FAILED = MAKE_DMHRESULTERROR + $0203;
// DMUS_E_OUT_OF_RANGE
//
// Value is out of range, for instance the requested length is longer than
// the segment.
///
DMUS_E_OUT_OF_RANGE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0202;//MAKE_DMHRESULTERROR(0x0202)
 
(* DMUS_E_ALREADY_SENT
*
* The DMUS_PMSG has already been sent to the performance object via
* IDirectMusicPerformance::SendPMsg().
*)
DMUS_E_ALREADY_SENT = MAKE_DMHRESULTERROR + $0204;
// DMUS_E_SEGMENT_INIT_FAILED
//
// Segment initialization failed, most likely due to a critical memory situation.
///
DMUS_E_SEGMENT_INIT_FAILED = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0203;//MAKE_DMHRESULTERROR(0x0203)
 
(* DMUS_E_CANNOT_FREE
*
* The DMUS_PMSG was either not allocated by the performance via
* IDirectMusicPerformance::AllocPMsg(), or it was already freed via
* IDirectMusicPerformance::FreePMsg().
*)
DMUS_E_CANNOT_FREE = MAKE_DMHRESULTERROR + $0205;
// DMUS_E_ALREADY_SENT
//
// The DMUS_PMSG has already been sent to the performance object via
// IDirectMusicPerformance::SendPMsg().
///
DMUS_E_ALREADY_SENT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0204;//MAKE_DMHRESULTERROR(0x0204)
 
(* DMUS_E_CANNOT_OPEN_PORT
*
* The default system port could not be opened.
*)
DMUS_E_CANNOT_OPEN_PORT = MAKE_DMHRESULTERROR + $0206;
// DMUS_E_CANNOT_FREE
//
// The DMUS_PMSG was either not allocated by the performance via
// IDirectMusicPerformance::AllocPMsg(), or it was already freed via
// IDirectMusicPerformance::FreePMsg().
///
DMUS_E_CANNOT_FREE = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0205;//MAKE_DMHRESULTERROR(0x0205)
 
(* DMUS_E_CONNOT_CONVERT
*
* A call to MIDIToMusic() or MusicToMIDI() resulted in an error because
* the requested conversion could not happen. This usually occurs when the
* provided DMUS_CHORD_KEY structure has an invalid chord or scale pattern.
*)
DMUS_E_CONNOT_CONVERT = MAKE_DMHRESULTERROR + $0207;
// DMUS_E_CANNOT_OPEN_PORT
//
// The default system port could not be opened.
///
DMUS_E_CANNOT_OPEN_PORT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0206;//MAKE_DMHRESULTERROR(0x0206)
 
(* DMUS_E_DESCEND_CHUNK_FAIL
*
* DMUS_E_DESCEND_CHUNK_FAIL is returned when the end of the file
* was reached before the desired chunk was found.
*)
DMUS_E_DESCEND_CHUNK_FAIL = MAKE_DMHRESULTERROR + $0210;
// DMUS_E_CONNOT_CONVERT
//
// A call to MIDIToMusic() or MusicToMIDI() resulted in an error because
// the requested conversion could not happen. This usually occurs when the
// provided DMUS_CHORD_KEY structure has an invalid chord or scale pattern.
///
DMUS_E_CONNOT_CONVERT = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0207;//MAKE_DMHRESULTERROR(0x0207)
 
(************************************************************************
* *
* dmksctrl.h -- Definition of IKsControl *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
* *
* This header file contains the definition of IKsControl, which *
* duplicates definitions from ks.h and ksproxy.h. Your code should *
* include ks.h and ksproxy.h directly if you have them (they are *
* provided in the Windows 98 DDK and will be in the Windows NT 5 *
* SDK). *
* *
************************************************************************)
// DMUS_E_DESCEND_CHUNK_FAIL
//
// DMUS_E_DESCEND_CHUNK_FAIL is returned when the end of the file
// was reached before the desired chunk was found.
///
DMUS_E_DESCEND_CHUNK_FAIL = (1 shl 31) + (FACILITY_DIRECTMUSIC shl 16) + DMUS_ERRBASE + $0210;//MAKE_DMHRESULTERROR(0x0210)
 
(*
* Warning: This will prevent the rest of ks.h from being pulled in if ks.h is
* included after dmksctrl.h. Make sure you do not include both headers in
* the same source file.
*)
 
//************************************************************************
// *
// dmksctrl.h -- Definition of IKsControl *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
// *
// This header file contains the definition of IKsControl, which *
// duplicates definitions from ks.h and ksproxy.h. Your code should *
// include ks.h and ksproxy.h directly if you have them (they are *
// provided in the Windows 98 DDK and will be in the Windows NT 5 *
// SDK). *
// *
//**********************************************************************
 
//
// Warning: This will prevent the rest of ks.h from being pulled in if ks.h is
// included after dmksctrl.h. Make sure you do not include both headers in
// the same source file.
///
type
PKsIdentifier = ^TKsIdentifier;
TKsIdentifier = packed record
case integer of
1 : (
Set_: TGUID;
Id : ULONG;
Flags: ULONG
);
2 : (Alignment: LONGLONG);
TData = record
_Set : TGUID;
Id : Cardinal;
Flags : Cardinal;
end;
 
PKsProperty = ^TKsProperty;
TKsProperty = TKsIdentifier;
TKSIDENTIFIER = record
Data : TData;
Alignment : LONGLONG;
end;
 
PKsMethod = ^TKsMethod;
TKsMethod = TKsIdentifier;
KSIDENTIFIER = TKSIDENTIFIER;
PKSIDENTIFIER = ^KSIDENTIFIER;
 
PKsEvent = ^TKsEvent;
TKsEvent = TKsIdentifier;
TKSPROPERTY = KSIDENTIFIER;
KSPROPERTY = KSIDENTIFIER;
PKSPROPERTY = ^KSIDENTIFIER;
TKSMETHOD = KSIDENTIFIER;
KSMETHOD = KSIDENTIFIER;
PKSMETHOD = ^KSIDENTIFIER;
TKSEVENT = KSIDENTIFIER;
KSEVENT = KSIDENTIFIER;
PKSEVENT = ^KSIDENTIFIER;
 
const
KSMETHOD_TYPE_NONE = $00000000;
KSMETHOD_TYPE_READ = $00000001;
KSMETHOD_TYPE_WRITE = $00000002;
KSMETHOD_TYPE_MODIFY = $00000003;
KSMETHOD_TYPE_SOURCE = $00000004;
KSMETHOD_TYPE_NONE = $00000000;
KSMETHOD_TYPE_READ = $00000001;
KSMETHOD_TYPE_WRITE = $00000002;
KSMETHOD_TYPE_MODIFY = $00000003;
KSMETHOD_TYPE_SOURCE = $00000004;
 
KSMETHOD_TYPE_SEND = $00000001;
KSMETHOD_TYPE_SETSUPPORT = $00000100;
KSMETHOD_TYPE_BASICSUPPORT = $00000200;
KSMETHOD_TYPE_SEND = $00000001;
KSMETHOD_TYPE_SETSUPPORT = $00000100;
KSMETHOD_TYPE_BASICSUPPORT = $00000200;
 
KSPROPERTY_TYPE_GET = $00000001;
KSPROPERTY_TYPE_SET = $00000002;
KSPROPERTY_TYPE_SETSUPPORT = $00000100;
KSPROPERTY_TYPE_BASICSUPPORT = $00000200;
KSPROPERTY_TYPE_RELATIONS = $00000400;
KSPROPERTY_TYPE_SERIALIZESET = $00000800;
KSPROPERTY_TYPE_UNSERIALIZESET = $00001000;
KSPROPERTY_TYPE_SERIALIZERAW = $00002000;
KSPROPERTY_TYPE_UNSERIALIZERAW = $00004000;
KSPROPERTY_TYPE_SERIALIZESIZE = $00008000;
KSPROPERTY_TYPE_DEFAULTVALUES = $00010000;
KSPROPERTY_TYPE_GET = $00000001;
KSPROPERTY_TYPE_SET = $00000002;
KSPROPERTY_TYPE_SETSUPPORT = $00000100;
KSPROPERTY_TYPE_BASICSUPPORT = $00000200;
KSPROPERTY_TYPE_RELATIONS = $00000400;
KSPROPERTY_TYPE_SERIALIZESET = $00000800;
KSPROPERTY_TYPE_UNSERIALIZESET = $00001000;
KSPROPERTY_TYPE_SERIALIZERAW = $00002000;
KSPROPERTY_TYPE_UNSERIALIZERAW = $00004000;
KSPROPERTY_TYPE_SERIALIZESIZE = $00008000;
KSPROPERTY_TYPE_DEFAULTVALUES = $00010000;
 
KSPROPERTY_TYPE_TOPOLOGY = $10000000;
KSPROPERTY_TYPE_TOPOLOGY = $10000000;
 
type
IKsControl = interface (IUnknown)
['{28F54685-06FD-11D2-B27A-00A0C9223196}']
function KsProperty (const pProperty: TKsProperty; PropertyLength: ULONG;
var PropertyData; DataLength: ULONG; out BytesReturned: ULONG) : HResult; stdcall;
function KsMethod(const Method: TKsMethod; MethodLength: ULONG;
var MethodData; DataLength: ULONG; out BytesReturned: ULONG) : HResult; stdcall;
function KsEvent (const Event: TKsEvent; EventLength: ULONG;
var EventData; DataLength: ULONG; out BytesReturned: ULONG) : HResult; stdcall;
IKsControl = interface(IUnknown)
['{28F54685-06FD-11D2-B27A-00A0C9223196}']
//IKsControl
function KsProperty(const _Property: TKSPROPERTY; PropertyLength: Cardinal; var PropertyData;
DataLength: Cardinal; var BytesReturned: Cardinal) : HResult; stdcall;
function KsMethod(const Method: TKSMETHOD; MethodLength: Cardinal; var PropertyData;
DataLength: Cardinal; var BytesReturned: Cardinal) : HResult; stdcall;
function KsEvent(const Event: TKSEVENT; EventLength: Cardinal; var EventData;
DataLength: Cardinal; var BytesReturned: Cardinal) : HResult; stdcall;
end;
 
const
IID_IKsControl : TGUID = '{28F54685-06FD-11D2-B27A-00A0C9223196}';
 
// These formats are in ksmedia.h
KSDATAFORMAT_SUBTYPE_MIDI : TGUID = '{1D262760-E957-11CF-A5D6-28DB04C10000}';
KSDATAFORMAT_SUBTYPE_DIRECTMUSIC : TGUID = '{1A82F8BC-3F8B-11D2-B774-0060083316C1}';
 
//**************************************************************************
// *
// DMusBuff.h -- This module defines the buffer format for DirectMusic *
// Shared file between user mode and kernel mode components *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
//*************************************************************************
 
// Format of DirectMusic events in a buffer
//
// A buffer contains 1 or more events, each with the following header.
// Immediately following the header is the event data. The header+data
// size is rounded to the nearest quadword (8 bytes).
///
// Do not pad at end - that's where the data is
type
IID_IKsControl = IKsControl;
STATIC_IID_IKsControl = IID_IKsControl;
TDMUS_EVENTHEADER = record
cbEvent : DWORD; // Unrounded bytes in event
dwChannelGroup : DWORD; // Channel group of event
rtDelta : REFERENCE_TIME; // Delta from start time of entire buffer
dwFlags : DWORD; // Flags DMUS_EVENT_xxx
end;
DMUS_EVENTHEADER = TDMUS_EVENTHEADER;
LPDMUS_EVENTHEADER = ^TDMUS_EVENTHEADER;
 
 
const
(* These formats are in ksmedia.h
*)
KSDATAFORMAT_SUBTYPE_MIDI : TGUID = '{1D262760-E957-11CF-A5D6-28DB04C10000}';
DMUS_EVENT_STRUCTURED = $00000001; // Unstructured data (SysEx, etc.)
 
KSDATAFORMAT_SUBTYPE_DIRECTMUSIC : TGUID = '{1a82f8bc-3f8b-11d2-b774-0060083316c1}';
(************************************************************************
* *
* dmusicc.h -- This module defines the DirectMusic core API's *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
************************************************************************)
// The number of bytes to allocate for an event with 'cb' data bytes.
//
function QWORD_ALIGN(x: LONGLONG) : LONGLONG; //(((x) + 7) & ~7)
function DMUS_EVENT_SIZE(cb: LONGLONG) : LONGLONG; //QWORD_ALIGN(sizeof(DMUS_EVENTHEADER) + cb)
 
//***********************************************************************
// *
// dmusicc.h -- This module defines the DirectMusic core API's *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
//**********************************************************************
 
const
DMUS_MAX_DESCRIPTION = 128;
DMUS_MAX_DRIVER = 128;
DMUS_MAX_DRIVER = 128;
 
type
PDMus_BufferDesc = ^TDMus_BufferDesc;
TDMus_BufferDesc = packed record
dwSize,
dwFlags : DWORD;
TDMUS_BUFFERDESC = record
dwSize : DWORD;
dwFlags : DWORD;
guidBufferFormat : TGUID;
cbBuffer : DWORD;
cbBuffer : DWORD;
end;
DMUS_BUFFERDESC = TDMUS_BUFFERDESC;
LPDMUS_BUFFERDESC = ^TDMUS_BUFFERDESC;
 
// DMUS_EFFECT_ flags are used in the dwEffectFlags fields of both DMUS_PORTCAPS
// and DMUS_PORTPARAMS.
///
const
(* DMUS_EFFECT_ flags are used in the dwEffectFlags fields of both DMUS_PORTCAPS
* and DMUS_PORTPARAMS.
*)
DMUS_EFFECT_NONE = $00000000;
DMUS_EFFECT_REVERB = $00000001;
DMUS_EFFECT_CHORUS = $00000002;
DMUS_EFFECT_NONE = $00000000;
DMUS_EFFECT_REVERB = $00000001;
DMUS_EFFECT_CHORUS = $00000002;
 
(* For DMUS_PORTCAPS dwClass
*)
DMUS_PC_INPUTCLASS = 0;
DMUS_PC_OUTPUTCLASS = 1;
// For DMUS_PORTCAPS dwClass
//
DMUS_PC_INPUTCLASS = (0);
DMUS_PC_OUTPUTCLASS = (1);
 
(* For DMUS_PORTCAPS dwFlags
*)
DMUS_PC_DLS = $00000001;
DMUS_PC_EXTERNAL = $00000002;
DMUS_PC_SOFTWARESYNTH = $00000004;
DMUS_PC_MEMORYSIZEFIXED = $00000008;
DMUS_PC_GMINHARDWARE = $00000010;
DMUS_PC_GSINHARDWARE = $00000020;
DMUS_PC_XGINHARDWARE = $00000040;
DMUS_PC_DIRECTSOUND = $00000080;
DMUS_PC_SHAREABLE = $00000100;
DMUS_PC_DLS2 = $00000200;
DMUS_PC_SYSTEMMEMORY = $7FFFFFFF;
// For DMUS_PORTCAPS dwFlags
//
DMUS_PC_DLS = ($00000001);
DMUS_PC_EXTERNAL = ($00000002);
DMUS_PC_SOFTWARESYNTH = ($00000004);
DMUS_PC_MEMORYSIZEFIXED = ($00000008);
DMUS_PC_GMINHARDWARE = ($00000010);
DMUS_PC_GSINHARDWARE = ($00000020);
DMUS_PC_XGINHARDWARE = ($00000040);
DMUS_PC_DIRECTSOUND = ($00000080);
DMUS_PC_SHAREABLE = ($00000100);
DMUS_PC_SYSTEMMEMORY = ($7FFFFFFF);
 
type
PDMus_PortCaps = ^TDMus_PortCaps;
TDMus_PortCaps = packed record
dwSize: DWORD;
dwFlags: DWORD;
guidPort: TGUID;
dwClass: DWORD;
dwType: DWORD;
dwMemorySize: DWORD;
dwMaxChannelGroups: DWORD;
dwMaxVoices: DWORD;
dwMaxAudioChannels: DWORD;
dwEffectFlags: DWORD;
wszDescription: array [0..DMUS_MAX_DESCRIPTION-1] of WideChar;
 
TDMUS_PORTCAPS = record
dwSize : DWORD;
dwFlags : DWORD;
guidPort : TGUID;
dwClass : DWORD;
dwType : DWORD;
dwMemorySize : DWORD;
dwMaxChannelGroups : DWORD;
dwMaxVoices : DWORD;
dwMaxAudioChannels : DWORD;
dwEffectFlags : DWORD;
wszDescription : array[0..DMUS_MAX_DESCRIPTION - 1] of WCHAR;
end;
DMUS_PORTCAPS = TDMUS_PORTCAPS;
LPDMUS_PORTCAPS = ^TDMUS_PORTCAPS;
 
// Values for DMUS_PORTCAPS dwType. This field indicates the underlying
// driver type of the port.
///
const
(* Values for DMUS_PORTCAPS dwType. This field indicates the underlying
* driver type of the port.
*)
DMUS_PORT_WINMM_DRIVER = 0;
DMUS_PORT_USER_MODE_SYNTH = 1;
DMUS_PORT_KERNEL_MODE = 2;
DMUS_PORT_WINMM_DRIVER = (0);
DMUS_PORT_USER_MODE_SYNTH = (1);
DMUS_PORT_KERNEL_MODE = (2);
 
(* These flags (set in dwValidParams) indicate which other members of the *)
(* DMUS_PORTPARAMS are valid. *)
(* *)
DMUS_PORTPARAMS_VOICES = $00000001;
DMUS_PORTPARAMS_CHANNELGROUPS = $00000002;
DMUS_PORTPARAMS_AUDIOCHANNELS = $00000004;
DMUS_PORTPARAMS_SAMPLERATE = $00000008;
DMUS_PORTPARAMS_EFFECTS = $00000020;
DMUS_PORTPARAMS_SHARE = $00000040;
// These flags (set in dwValidParams) indicate which other members of the
// DMUS_PORTPARAMS are valid.
//
DMUS_PORTPARAMS_VOICES = $00000001;
DMUS_PORTPARAMS_CHANNELGROUPS = $00000002;
DMUS_PORTPARAMS_AUDIOCHANNELS = $00000004;
DMUS_PORTPARAMS_SAMPLERATE = $00000008;
DMUS_PORTPARAMS_EFFECTS = $00000020;
DMUS_PORTPARAMS_SHARE = $00000040;
 
type
PDMus_PortParams = ^TDMus_PortParams;
TDMus_PortParams = packed record
dwSize: DWORD;
dwValidParams: DWORD;
dwVoices: DWORD;
dwChannelGroups: DWORD;
dwAudioChannels: DWORD;
dwSampleRate: DWORD;
dwEffectFlags: DWORD;
fShare: BOOL;
TDMUS_PORTPARAMS = record
dwSize : DWORD;
dwValidParams : DWORD;
dwVoices : DWORD;
dwChannelGroups : DWORD;
dwAudioChannels : DWORD;
dwSampleRate : DWORD;
dwEffectFlags : DWORD;
fShare : BOOL;
end;
DMUS_PORTPARAMS = TDMUS_PORTPARAMS;
LPDMUS_PORTPARAMS = ^TDMUS_PORTPARAMS;
 
PDMus_SynthStats = ^TDMus_SynthStats;
TDMus_SynthStats = packed record
dwSize: DWORD; (* Size in bytes of the structure *)
dwValidStats: DWORD; (* Flags indicating which fields below are valid. *)
dwVoices: DWORD; (* Average number of voices playing. *)
dwTotalCPU: DWORD; (* Total CPU usage as percent * 100. *)
dwCPUPerVoice: DWORD; (* CPU per voice as percent * 100. *)
dwLostNotes: DWORD; (* Number of notes lost in 1 second. *)
dwFreeMemory: DWORD; (* Free memory in bytes *)
lPeakVolume: LongInt; (* Decibel level * 100. *)
TDMUS_SYNTHSTATS = record
dwSize : DWORD; // Size in bytes of the structure
dwValidStats : DWORD; // Flags indicating which fields below are valid.
dwVoices : DWORD; // Average number of voices playing.
dwTotalCPU : DWORD; // Total CPU usage as percent * 100.
dwCPUPerVoice : DWORD; // CPU per voice as percent * 100.
dwLostNotes : DWORD; // Number of notes lost in 1 second.
dwFreeMemory : DWORD; // Free memory in bytes
lPeakVolume : Longint; // Decibel level * 100.
end;
DMUS_SYNTHSTATS = TDMUS_SYNTHSTATS;
LPDMUS_SYNTHSTATS = ^TDMUS_SYNTHSTATS;
 
const
DMUS_SYNTHSTATS_VOICES = 1 shl 0;
DMUS_SYNTHSTATS_TOTAL_CPU = 1 shl 1;
DMUS_SYNTHSTATS_CPU_PER_VOICE = 1 shl 2;
DMUS_SYNTHSTATS_LOST_NOTES = 1 shl 3;
DMUS_SYNTHSTATS_PEAK_VOLUME = 1 shl 4;
DMUS_SYNTHSTATS_FREE_MEMORY = 1 shl 5;
DMUS_SYNTHSTATS_VOICES = 1;
DMUS_SYNTHSTATS_TOTAL_CPU = 2;
DMUS_SYNTHSTATS_CPU_PER_VOICE = 4;
DMUS_SYNTHSTATS_LOST_NOTES = 8;
DMUS_SYNTHSTATS_PEAK_VOLUME = 16;
DMUS_SYNTHSTATS_FREE_MEMORY = 32;
 
DMUS_SYNTHSTATS_SYSTEMMEMORY = DMUS_PC_SYSTEMMEMORY;
DMUS_SYNTHSTATS_SYSTEMMEMORY = DMUS_PC_SYSTEMMEMORY;
 
type
TDMus_Waves_Reverb_Params = packed record
fInGain, (* Input gain in dB (to avoid output overflows) *)
fReverbMix, (* Reverb mix in dB. 0dB means 100% wet reverb (no direct signal)
Negative values gives less wet signal.
The coeficients are calculated so that the overall output level stays
(approximately) constant regardless of the ammount of reverb mix. *)
fReverbTime, (* The reverb decay time, in milliseconds. *)
fHighFreqRTRatio : Single; (* The ratio of the high frequencies to the global reverb time.
Unless very 'splashy-bright' reverbs are wanted, this should be set to
a value < 1.0.
For example if dRevTime==1000ms and dHighFreqRTRatio=0.1 than the
decay time for high frequencies will be 100ms.*)
 
TDMUS_WAVES_REVERB_PARAMS = record
fInGain : Single; // Input gain in dB (to avoid output overflows)
fReverbMix : Single; // Reverb mix in dB. 0dB means 100% wet reverb (no direct signal)
//Negative values gives less wet signal.
//The coeficients are calculated so that the overall output level stays
//(approximately) constant regardless of the ammount of reverb mix.
fReverbTime : Single; // The reverb decay time, in milliseconds.
fHighFreqRTRatio : Single; // The ratio of the high frequencies to the global reverb time.
//Unless very 'splashy-bright' reverbs are wanted, this should be set to
//a value < 1.0.
//For example if dRevTime==1000ms and dHighFreqRTRatio=0.1 than the
//decay time for high frequencies will be 100ms.
end;
DMUS_WAVES_REVERB_PARAMS = TDMUS_WAVES_REVERB_PARAMS;
 
// Note: Default values for Reverb are:
// fInGain = 0.0dB (no change in level)
// fReverbMix = -10.0dB (a reasonable reverb mix)
// fReverbTime = 1000.0ms (one second global reverb time)
// fHighFreqRTRatio = 0.001 (the ratio of the high frequencies to the global reverb time)
///
 
(* Note: Default values for Reverb are:
fInGain = 0.0dB (no change in level)
fReverbMix = -10.0dB (a reasonable reverb mix)
fReverbTime = 1000.0ms (one second global reverb time)
fHighFreqRTRatio = 0.001 (the ratio of the high frequencies to the global reverb time)
*)
DMUS_CLOCKTYPE = (DMUS_CLOCK_SYSTEM, DMUS_CLOCK_WAVE); //DMUS_CLOCK_SYSTEM = 0,
//DMUS_CLOCK_WAVE = 1
 
TDMus_ClockType = (
DMUS_CLOCK_SYSTEM,
DMUS_CLOCK_WAVE
);
 
PDMus_ClockInfo = ^TDMus_ClockInfo;
TDMus_ClockInfo = packed record
dwSize : WORD;
ctType : TDMus_ClockType;
guidClock : TGUID; (* Identifies this time source *)
wszDescription : array [0..DMUS_MAX_DESCRIPTION-1] of WideChar;
TDMUS_CLOCKINFO = record
dwSize : DWORD;
ctType : DMUS_CLOCKTYPE;
guidClock : TGUID; // Identifies this time source
wszDescription : array[0..DMUS_MAX_DESCRIPTION - 1] of WCHAR;
end;
DMUS_CLOCKINFO = TDMUS_CLOCKINFO;
LPDMUS_CLOCKINFO = ^TDMUS_CLOCKINFO;
 
const
DMUS_EVENT_STRUCTURED = $00000001; (* Unstructured data (SysEx, etc.) *)
 
(* Standard values for voice priorities. Numerically higher priorities are higher in priority.
* These priorities are used to set the voice priority for all voices on a channel. They are
* used in the dwPriority parameter of IDirectMusicPort::GetPriority and returned in the
* lpwPriority parameter of pdwPriority.
*
* These priorities are shared with DirectSound.
*)
 
const
DAUD_CRITICAL_VOICE_PRIORITY = $F0000000;
DAUD_HIGH_VOICE_PRIORITY = $C0000000;
DAUD_STANDARD_VOICE_PRIORITY = $80000000;
DAUD_LOW_VOICE_PRIORITY = $40000000;
DAUD_PERSIST_VOICE_PRIORITY = $10000000;
 
(* These are the default priorities assigned if not overridden. By default priorities are
* equal across channel groups (e.g. channel 5 on channel group 1 has the same priority as
* channel 5 on channel group 2;.
*
* In accordance with DLS level 1, channel 10 has the highest priority, followed by 1 through 16
* except for 10.
*)
DAUD_CHAN1_VOICE_PRIORITY_OFFSET = $0000000E;
DAUD_CHAN2_VOICE_PRIORITY_OFFSET = $0000000D;
DAUD_CHAN3_VOICE_PRIORITY_OFFSET = $0000000C;
DAUD_CHAN4_VOICE_PRIORITY_OFFSET = $0000000B;
DAUD_CHAN5_VOICE_PRIORITY_OFFSET = $0000000A;
DAUD_CHAN6_VOICE_PRIORITY_OFFSET = $00000009;
DAUD_CHAN7_VOICE_PRIORITY_OFFSET = $00000008;
DAUD_CHAN8_VOICE_PRIORITY_OFFSET = $00000007;
DAUD_CHAN9_VOICE_PRIORITY_OFFSET = $00000006;
DAUD_CHAN10_VOICE_PRIORITY_OFFSET = $0000000F;
DAUD_CHAN11_VOICE_PRIORITY_OFFSET = $00000005;
DAUD_CHAN12_VOICE_PRIORITY_OFFSET = $00000004;
DAUD_CHAN13_VOICE_PRIORITY_OFFSET = $00000003;
DAUD_CHAN14_VOICE_PRIORITY_OFFSET = $00000002;
DAUD_CHAN15_VOICE_PRIORITY_OFFSET = $00000001;
DAUD_CHAN16_VOICE_PRIORITY_OFFSET = $00000000;
 
 
DAUD_CHAN1_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN1_VOICE_PRIORITY_OFFSET);
DAUD_CHAN2_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN2_VOICE_PRIORITY_OFFSET);
DAUD_CHAN3_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN3_VOICE_PRIORITY_OFFSET);
DAUD_CHAN4_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN4_VOICE_PRIORITY_OFFSET);
DAUD_CHAN5_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN5_VOICE_PRIORITY_OFFSET);
DAUD_CHAN6_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN6_VOICE_PRIORITY_OFFSET);
DAUD_CHAN7_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN7_VOICE_PRIORITY_OFFSET);
DAUD_CHAN8_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN8_VOICE_PRIORITY_OFFSET);
DAUD_CHAN9_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN9_VOICE_PRIORITY_OFFSET);
DAUD_CHAN10_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN10_VOICE_PRIORITY_OFFSET);
DAUD_CHAN11_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN11_VOICE_PRIORITY_OFFSET);
DAUD_CHAN12_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN12_VOICE_PRIORITY_OFFSET);
DAUD_CHAN13_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN13_VOICE_PRIORITY_OFFSET);
DAUD_CHAN14_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN14_VOICE_PRIORITY_OFFSET);
DAUD_CHAN15_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN15_VOICE_PRIORITY_OFFSET);
DAUD_CHAN16_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN16_VOICE_PRIORITY_OFFSET);
 
type
IDirectMusicBuffer = interface;
IDirectMusicPort = interface;
IDirectMusicThru = interface;
IReferenceClock = interface;
PIReferenceClock = IReferenceClock;
IDirectMusicPort = interface;
IDirectMusicThru = interface;
IReferenceClock = interface;
 
IDirectMusic = interface (IUnknown)
['{6536115a-7b2d-11d2-ba18-0000f875ac12}']
function EnumPort (dwIndex: DWORD;
var pPortCaps: TDMus_PortCaps) : HResult; stdcall;
function CreateMusicBuffer (var pBufferDesc: TDMus_BufferDesc;
out ppBuffer: IDirectMusicBuffer;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreatePort (const rclsidPort: TGUID;
const pPortParams: TDMus_PortParams;
out ppPort: IDirectMusicPort;
pUnkOuter: IUnknown) : HResult; stdcall;
function EnumMasterClock (dwIndex: DWORD;
var lpClockInfo: TDMus_ClockInfo) : HResult; stdcall;
function GetMasterClock (pguidClock: PGUID;
ppReferenceClock : PIReferenceClock) : HResult; stdcall;
function SetMasterClock (const rguidClock: TGUID) : HResult; stdcall;
function Activate (fEnable: BOOL) : HResult; stdcall;
function GetDefaultPort (out pguidPort: TGUID) : HResult; stdcall;
function SetDirectSound (pDirectSound: IDirectSound;
hWnd: HWND) : HResult; stdcall;
LPDIRECTMUSICBUFFER = IDirectMusicBuffer;
LPDIRECTMUSICPORT = IDirectMusicPort;
 
IDirectMusic = interface(IUnknown)
['{6536115A-7B2D-11D2-BA18-0000F875AC12}']
// IDirectMusic
function EnumPort(dwIndex: DWORD; var pPortCaps: TDMUS_PORTCAPS) : HResult; stdcall;
function CreateMusicBuffer(const pBufferDesc: TDMUS_BUFFERDESC; out ppBuffer: IDirectMusicBuffer;
pUnkOuter: IUnknown) : HResult; stdcall;
function CreatePort(const rclsidPort: TGUID; const pPortParams: TDMUS_PORTPARAMS;
out ppPort: IDirectMusicPort; pUnkOuter: IUnknown) : HResult; stdcall;
function EnumMasterClock(dwIndex: DWORD; var lpClockInfo: TDMUS_CLOCKINFO) : HResult; stdcall;
function GetMasterClock(pguidClock: PGUID; out ppReferenceClock: IReferenceClock) : HResult; stdcall;
function SetMasterClock(const rguidClock: TGUID) : HResult; stdcall;
function Activate(fEnable: BOOL) : HResult; stdcall;
function GetDefaultPort(var pguidPort: TGUID) : HResult; stdcall;
function SetDirectSound(pDirectSound: IDirectSound; hWnd: HWND) : HResult; stdcall;
end;
 
IDirectMusicBuffer = interface (IUnknown)
['{d2ac2878-b39b-11d1-8704-00600893b1bd}']
IDirectMusicBuffer = interface(IUnknown)
['{D2AC2878-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicBuffer
function Flush : HResult; stdcall;
function TotalTime (out prtTime: TReference_Time) : HResult; stdcall;
function PackStructured (const rt: TReference_Time;
dwChannelGroup: DWORD;
dwChannelMessage: DWORD ) : HResult; stdcall;
function PackUnstructured (const rt: TReference_Time;
dwChannelGroup: DWORD;
cb: DWORD;
const lpb) : HResult; stdcall;
function TotalTime(var prtTime: TREFERENCE_TIME) : HResult; stdcall;
function PackStructured(rt: TREFERENCE_TIME; dwChannelGroup: DWORD;
dwChannelMessage: DWORD) : HResult; stdcall;
function PackUnstructured(rt: TREFERENCE_TIME; dwChannelGroup: DWORD;
cb: DWORD; const lpb) : HResult; stdcall;
function ResetReadPtr : HResult; stdcall;
function GetNextEvent (out prt: TReference_Time;
out pdwChannelGroup: DWORD;
out pdwLength: DWORD;
out ppData: Pointer) : HResult; stdcall;
 
function GetRawBufferPtr (out ppData: Pointer) : HResult; stdcall;
function GetStartTime (out prt: TReference_Time) : HResult; stdcall;
function GetUsedBytes (out pcb: DWORD) : HResult; stdcall;
function GetMaxBytes (out pcb: DWORD) : HResult; stdcall;
function GetBufferFormat (out pGuidFormat: TGUID) : HResult; stdcall;
function SetStartTime (const rt: TReference_Time) : HResult; stdcall;
function SetUsedBytes (cb: DWORD) : HResult; stdcall;
function GetNextEvent(var prt: TREFERENCE_TIME; var pdwChannelGroup: DWORD;
var pdwLength: DWORD; var ppData: Pointer) : HResult; stdcall;
function GetRawBufferPtr(var ppData: Pointer) : HResult; stdcall;
function GetStartTime(var prt: TREFERENCE_TIME) : HResult; stdcall;
function GetUsedBytes(var pcb: DWORD) : HResult; stdcall;
function GetMaxBytes(var pcb: DWORD) : HResult; stdcall;
function GetBufferFormat(var pGuidFormat: TGUID) : HResult; stdcall;
function SetStartTime(rt: TREFERENCE_TIME) : HResult; stdcall;
function SetUsedBytes(cb: DWORD) : HResult; stdcall;
end;
 
 
(* Format of DirectMusic events in a buffer
*
* A buffer contains 1 or more events, each with the following header.
* Immediately following the header is the event data. The header+data
* size is rounded to the nearest quadword (8 bytes).
*)
 
TDMus_EventHeader = packed record
cbEvent: DWORD; (* Unrounded bytes in event *)
dwChannelGroup: DWORD; (* Channel group of event *)
rtDelta: TReference_Time; (* Delta from start time of entire buffer *)
dwFlags: DWORD; (* Flags DMUS_EVENT_xxx *)
// Format of DirectMusic events in a buffer
//
// A buffer contains 1 or more events, each with the following header.
// Immediately following the header is the event data. The header+data
// size is rounded to the nearest quadword (8 bytes).
///
{TDMUS_EVENTHEADER = record
cbEvent : DWORD; // Unrounded bytes in event
dwChannelGroup : DWORD; // Channel group of event
rtDelta : REFERENCE_TIME; // Delta from start time of entire buffer
dwFlags : DWORD; // Flags DMUS_EVENT_xxx
end;
DMUS_EVENTHEADER = TDMUS_EVENTHEADER;
LPDMUS_EVENTHEADER = ^TDMUS_EVENTHEADER;}
 
IDirectMusicInstrument = interface (IUnknown)
['{d2ac287d-b39b-11d1-8704-00600893b1bd}']
function GetPatch (out pdwPatch: DWORD ) : HResult; stdcall;
function SetPatch (dwPatch: DWORD) : HResult; stdcall;
IDirectMusicInstrument = interface(IUnknown)
['{D2AC287D-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicInstrument
function GetPatch(var pdwPatch: DWORD) : HResult; stdcall;
function SetPatch(dwPatch: DWORD) : HResult; stdcall;
end;
 
IDirectMusicDownloadedInstrument = interface (IUnknown)
['{d2ac287e-b39b-11d1-8704-00600893b1bd}']
(* None at this time *)
 
IDirectMusicDownloadedInstrument = interface(IUnknown)
['{D2AC287E-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicDownloadedInstrument
// None at this time
end;
 
IDirectMusicCollection = interface (IUnknown)
['{d2ac287c-b39b-11d1-8704-00600893b1bd}']
function GetInstrument (dwPatch: DWORD;
out ppInstrument: IDirectMusicInstrument) : HResult; stdcall;
function EnumInstrument (dwIndex: DWORD;
out pdwPatch: DWORD;
pwszName: LPWSTR;
dwNameLen: DWORD) : HResult; stdcall;
IDirectMusicCollection = interface(IUnknown)
['{D2AC287C-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicCollection
function GetInstrument(dwPatch: DWORD; out ppInstrument: IDirectMusicInstrument) : HResult; stdcall;
function EnumInstrument(dwIndex: DWORD; var pdwPatch: DWORD;
pwszName: LPWSTR; dwNameLen: DWORD) : HResult; stdcall;
end;
 
 
IDirectMusicDownload = interface (IUnknown)
['{d2ac287b-b39b-11d1-8704-00600893b1bd}']
function GetBuffer (out ppvBuffer: Pointer;
out pdwSize: DWORD) : HResult; stdcall;
IDirectMusicDownload = interface(IUnknown)
['{D2AC287B-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicDownload
function GetBuffer(var ppvBuffer: Pointer; var pdwSize: DWORD) : HResult; stdcall;
end;
 
IDirectMusicPortDownload = interface (IUnknown)
['{d2ac287a-b39b-11d1-8704-00600893b1bd}']
function GetBuffer (dwDLId: DWORD;
out ppIDMDownload: IDirectMusicDownload) : HResult; stdcall;
function AllocateBuffer (dwSize: DWORD;
out ppIDMDownload: IDirectMusicDownload) : HResult; stdcall;
function GetDLId (out pdwStartDLId: DWORD;
dwCount: DWORD) : HResult; stdcall;
function GetAppend (out pdwAppend: DWORD) : HResult; stdcall;
function Download (pIDMDownload: IDirectMusicDownload) : HResult; stdcall;
IDirectMusicPortDownload = interface(IUnknown)
['{D2AC287A-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicPortDownload
function GetBuffer(dwDLId: DWORD; out ppIDMDownload: IDirectMusicDownload) : HResult; stdcall;
function AllocateBuffer(dwSize: DWORD; out ppIDMDownload: IDirectMusicDownload) : HResult; stdcall;
function GetDLId(var pdwStartDLId; dwCount: DWORD) : HResult; stdcall;
function GetAppend(var pdwAppend: DWORD) : HResult; stdcall;
function Download(pIDMDownload: IDirectMusicDownload) : HResult; stdcall;
function Unload(pIDMDownload: IDirectMusicDownload) : HResult; stdcall;
end;
 
IDirectMusicPort = interface (IUnknown)
['{08f2d8c9-37c2-11d2-b9f9-0000f875ac12}']
function PlayBuffer (pBuffer: IDirectMusicBuffer) : HResult; stdcall;
function SetReadNotificationHandle (hEvent: THANDLE) : HResult; stdcall;
function Read (pBuffer: IDirectMusicBuffer) : HResult; stdcall;
function DownloadInstrument (pInstrument: IDirectMusicInstrument;
out ppDownloadedInstrument: IDirectMusicDownloadedInstrument;
pNoteRanges: PDMus_NoteRange;
dwNumNoteRanges: DWORD) : HResult; stdcall;
function UnloadInstrument (pDownloadedInstrument: IDirectMusicDownloadedInstrument) : HResult; stdcall;
function GetLatencyClock (out ppClock: IReferenceClock) : HResult; stdcall;
function GetRunningStats (var pStats: TDMus_SynthStats) : HResult; stdcall;
// These are the default priorities assigned if not overridden. By default priorities are
// equal across channel groups (e.g. channel 5 on channel group 1 has the same priority as
// channel 5 on channel group 2).
//
// In accordance with DLS level 1, channel 10 has the highest priority, followed by 1 through 16
// except for 10.
///
 
IDirectMusicPort = interface(IUnknown)
['{08F2D8C9-37C2-11D2-B9F9-0000F875AC12}']
// IDirectMusicPort
//
function PlayBuffer(pBuffer: IDirectMusicBuffer) : HResult; stdcall;
function SetReadNotificationHandle(hEvent: THandle) : HResult; stdcall;
function Read(pBuffer: IDirectMusicBuffer) : HResult; stdcall;
function DownloadInstrument(pInstrument: IDirectMusicInstrument;
out ppDownloadedInstrument: IDirectMusicDownloadedInstrument;
const pNoteRanges;
dwNumNoteRanges: DWORD) : HResult; stdcall;
function UnloadInstrument(pDownloadedInstrument: IDirectMusicDownloadedInstrument) : HResult; stdcall;
function GetLatencyClock(out ppClock: IReferenceClock) : HResult; stdcall;
function GetRunningStats(var pStats: TDMUS_SYNTHSTATS) : HResult stdcall;
function Compact : HResult; stdcall;
function GetCaps (var pPortCaps: TDMus_PortCaps) : HResult; stdcall;
function DeviceIoControl (dwIoControlCode: DWORD;
const lpInBuffer;
nInBufferSize: DWORD;
out lpOutBuffer;
nOutBufferSize: DWORD;
out lpBytesReturned: DWORD;
var lpOverlapped: TOVERLAPPED) : HResult; stdcall;
function SetNumChannelGroups (dwChannelGroups: DWORD) : HResult; stdcall;
function GetNumChannelGroups (out pdwChannelGroups: DWORD) : HResult; stdcall;
function Activate (fActive: BOOL) : HResult; stdcall;
function SetChannelPriority (dwChannelGroup, dwChannel,
dwPriority: DWORD) : HResult; stdcall;
function GetChannelPriority (dwChannelGroup, dwChannel: DWORD;
out pdwPriority: DWORD) : HResult; stdcall;
function SetDirectSound (pDirectSound: IDirectSound;
pDirectSoundBuffer: IDirectSoundBuffer) : HResult; stdcall;
function GetFormat (pWaveFormatEx: PWaveFormatEx;
var pdwWaveFormatExSize: DWORD;
out pdwBufferSize: DWORD) : HResult; stdcall;
end;
function GetCaps(var pPortCaps: TDMUS_PORTCAPS) : HResult; stdcall;
function DeviceIoControl(dwIoControlCode: DWORD;
const lpInBuffer;
nInBufferSize: DWORD;
var lpOutBuffer;
nOutBufferSize: DWORD;
var lpBytesReturned: DWORD;
var lpOverlapped: TOVERLAPPED) : HResult; stdcall;
function SetNumChannelGroups(dwChannelGroups: DWORD) : HResult; stdcall;
function GetNumChannelGroups(var pdwChannelGroups: DWORD) : HResult; stdcall;
function Activate(fActive: BOOL) : HResult; stdcall;
function SetChannelPriority(dwChannelGroup: DWORD; dwChannel: DWORD; dwPriority: DWORD) : HResult; stdcall;
function GetChannelPriority(dwChannelGroup: DWORD; dwChannel: DWORD; var pdwPriority: DWORD) : HResult; stdcall;
function SetDirectSound(pDirectSound: IDirectSound; pDirectSoundBuffer: IDirectSoundBuffer) : HResult; stdcall;
function GetFormat(var pWaveFormatEx: TWAVEFORMATEX; var pdwWaveFormatExSize: DWORD; var pdwBufferSize: DWORD) : HResult; stdcall;
end;
 
IDirectMusicThru = interface (IUnknown)
['{ced153e7-3606-11d2-b9f9-0000f875ac12}']
function ThruChannel (dwSourceChannelGroup,
dwSourceChannel,
dwDestinationChannelGroup,
dwDestinationChannel: DWORD;
pDestinationPort: IDirectMusicPort) : HResult; stdcall;
IDirectMusicThru = interface(IUnknown)
['{CED153E7-3606-11D2-B9F9-0000F875AC12}']
// IDirectMusicThru
///
function ThruChannel(dwSourceChannelGroup: DWORD;
dwSourceChannel: DWORD;
dwDestinationChannelGroup: DWORD;
dwDestinationChannel: DWORD;
pDestinationPort: IDirectMusicPort) : HResult; stdcall;
end;
 
IReferenceClock = interface(IUnknown)
['{56A86897-0AD4-11CE-B03A-0020AF0BA770}']
// IReferenceClock
//
 
IReferenceClock = interface (IUnknown)
['{56a86897-0ad4-11ce-b03a-0020af0ba770}']
(* get the time now *)
function GetTime (out pTime: TReference_Time) : HResult; stdcall;
// get the time now
function GetTime(var pTime: TREFERENCE_TIME) : HResult; stdcall;
 
(* ask for an async notification that a time has elapsed *)
function AdviseTime (const baseTime, (* base time *)
streamTime: TReference_Time; (* stream offset time *)
hEvent: THANDLE; (* advise via this event *)
var pdwAdviseCookie: DWORD) : HResult; stdcall; (* where your cookie goes *)
// ask for an async notification that a time has elapsed
function AdviseTime(baseTime: TREFERENCE_TIME; // base time
streamTime: TREFERENCE_TIME; // stream offset time
hEvent: THandle; // advise via this event
var pdwAdviseCookie: DWORD) : HResult; stdcall; // where your cookie goes
 
(* ask for an async periodic notification that a time has elapsed *)
function AdvisePeriodic (const startTime, (* starting at this time *)
periodTime: TReference_Time; (* time between notifications *)
hSemaphore: THANDLE; (* advise via a semaphore *)
var pdwAdviseCookie: DWORD) : HResult; stdcall; (* where your cookie goes *)
// ask for an async periodic notification that a time has elapsed
function AdvisePeriodic(startTime: REFERENCE_TIME; // starting at this time
periodTime: REFERENCE_TIME; // time between notifications
hSemaphore: THandle; // advise via a semaphore
var pdwAdviseCookie: DWORD) : HResult; stdcall; // where your cookie goes
 
(* cancel a request for notification *)
function Unadvise (dwAdviseCookie: DWORD) : HResult; stdcall;
// cancel a request for notification
function Unadvise(dwAdviseCookie: DWORD) : HResult; stdcall;
end;
 
type
IID_IDirectMusic = IDirectMusic;
IID_IDirectMusicBuffer = IDirectMusicBuffer;
IID_IDirectMusicPort = IDirectMusicPort;
IID_IDirectMusicThru = IDirectMusicThru;
IID_IDirectMusicPortDownload = IDirectMusicPortDownload;
IID_IDirectMusicDownload = IDirectMusicDownload;
IID_IDirectMusicCollection = IDirectMusicCollection;
IID_IDirectMusicInstrument = IDirectMusicInstrument;
IID_IDirectMusicDownloadedInstrument = IDirectMusicDownloadedInstrument;
IID_IReferenceClock = IReferenceClock;
// Delphi‚̐«ŠiãAéŒ¾‚ðˆÚ“®‚³‚¹‚½‚à‚́BinterfaceAclassŒ^‚ÌforwardéŒ¾‚Í“¯‚¶typeƒ†ƒjƒbƒg“à‚ōĐ錾‚³‚ê‚È‚­‚Ä‚Í‚È‚ç‚È‚¢I
//const
// Format of DirectMusic events in a buffer
//
// A buffer contains 1 or more events, each with the following header.
// Immediately following the header is the event data. The header+data
// size is rounded to the nearest quadword (8 bytes).
///
 
//DMUS_EVENT_STRUCTURED = $00000001; // Unstructured data (SysEx, etc.)
 
// The number of bytes to allocate for an event with 'cb' data bytes.
///
//function QWORD_ALIGN(x: Cardinal) : Cardinal;
//function DMUS_EVENT_SIZE(cb: Cardinal) : Cardinal;
 
// Standard values for voice priorities. Numerically higher priorities are higher in priority.
// These priorities are used to set the voice priority for all voices on a channel. They are
// used in the dwPriority parameter of IDirectMusicPort::GetPriority and returned in the
// lpwPriority parameter of pdwPriority.
//
// These priorities are shared with DirectSound.
///
 
const
CLSID_DirectMusic: TGUID = '{636b9f10-0c7d-11d1-95b2-0020afdc7421}';
DAUD_CRITICAL_VOICE_PRIORITY = $F0000000;
DAUD_HIGH_VOICE_PRIORITY = $C0000000;
DAUD_STANDARD_VOICE_PRIORITY = $80000000;
DAUD_LOW_VOICE_PRIORITY = $40000000;
DAUD_PERSIST_VOICE_PRIORITY = $10000000;
 
CLSID_DirectMusicCollection: TGUID = '{480ff4b0-28b2-11d1-bef7-00c04fbf8fef}';
CLSID_DirectMusicSynth: TGUID = '{58C2B4D0-46E7-11D1-89AC-00A0C9054129}';
// These are the default priorities assigned if not overridden. By default priorities are
// equal across channel groups (e.g. channel 5 on channel group 1 has the same priority as
// channel 5 on channel group 2).
//
// In accordance with DLS level 1, channel 10 has the highest priority, followed by 1 through 16
// except for 10.
///
 
(* Property Query GUID_DMUS_PROP_GM_Hardware - Local GM set, no need to download
* Property Query GUID_DMUS_PROP_GS_Hardware - Local GS set, no need to download
* Property Query GUID_DMUS_PROP_XG_Hardware - Local XG set, no need to download
* Property Query GUID_DMUS_PROP_DLS1 - Support DLS level 1
* Property Query GUID_DMUS_PROP_XG_Capable - Support minimum requirements of XG
* Property Query GUID_DMUS_PROP_GS_Capable - Support minimum requirements of GS
* Property Query GUID_DMUS_PROP_SynthSink_DSOUND - Synthsink talks to DSound
* Property Query GUID_DMUS_PROP_SynthSink_WAVE - Synthsink talks to Wave device
*
* Item 0: Supported
* Returns a DWORD which is non-zero if the feature is supported
*)
GUID_DMUS_PROP_GM_Hardware: TGUID = '{178f2f24-c364-11d1-a760-0000f875ac12}';
GUID_DMUS_PROP_GS_Hardware: TGUID = '{178f2f25-c364-11d1-a760-0000f875ac12}';
GUID_DMUS_PROP_XG_Hardware: TGUID = '{178f2f26-c364-11d1-a760-0000f875ac12}';
GUID_DMUS_PROP_XG_Capable: TGUID = '{6496aba1-61b0-11d2-afa6-00aa0024d8b6}';
GUID_DMUS_PROP_GS_Capable: TGUID = '{6496aba2-61b0-11d2-afa6-00aa0024d8b6}';
GUID_DMUS_PROP_DLS1: TGUID = '{178f2f27-c364-11d1-a760-0000f875ac12}';
GUID_DMUS_PROP_DLS2: TGUID = '{f14599e5-4689-11d2-afa6-00aa0024d8b6}';
GUID_DMUS_PROP_INSTRUMENT2: TGUID = '{865fd372-9f67-11d2-872a-00600893b1bd}';
GUID_DMUS_PROP_SynthSink_DSOUND: TGUID = '{0aa97844-c877-11d1-870c-00600893b1bd}';
GUID_DMUS_PROP_SynthSink_WAVE: TGUID = '{0aa97845-c877-11d1-870c-00600893b1bd}';
GUID_DMUS_PROP_SampleMemorySize: TGUID = '{178f2f28-c364-11d1-a760-0000f875ac12}';
GUID_DMUS_PROP_SamplePlaybackRate: TGUID = '{2a91f713-a4bf-11d2-bbdf-00600833dbd8}';
DAUD_CHAN1_VOICE_PRIORITY_OFFSET = $0000000E;
DAUD_CHAN2_VOICE_PRIORITY_OFFSET = $0000000D;
DAUD_CHAN3_VOICE_PRIORITY_OFFSET = $0000000C;
DAUD_CHAN4_VOICE_PRIORITY_OFFSET = $0000000B;
DAUD_CHAN5_VOICE_PRIORITY_OFFSET = $0000000A;
DAUD_CHAN6_VOICE_PRIORITY_OFFSET = $00000009;
DAUD_CHAN7_VOICE_PRIORITY_OFFSET = $00000008;
DAUD_CHAN8_VOICE_PRIORITY_OFFSET = $00000007;
DAUD_CHAN9_VOICE_PRIORITY_OFFSET = $00000006;
DAUD_CHAN10_VOICE_PRIORITY_OFFSET = $0000000F;
DAUD_CHAN11_VOICE_PRIORITY_OFFSET = $00000005;
DAUD_CHAN12_VOICE_PRIORITY_OFFSET = $00000004;
DAUD_CHAN13_VOICE_PRIORITY_OFFSET = $00000003;
DAUD_CHAN14_VOICE_PRIORITY_OFFSET = $00000002;
DAUD_CHAN15_VOICE_PRIORITY_OFFSET = $00000001;
DAUD_CHAN16_VOICE_PRIORITY_OFFSET = $00000000;
DAUD_CHAN1_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN1_VOICE_PRIORITY_OFFSET);
DAUD_CHAN2_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN2_VOICE_PRIORITY_OFFSET);
DAUD_CHAN3_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN3_VOICE_PRIORITY_OFFSET);
DAUD_CHAN4_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN4_VOICE_PRIORITY_OFFSET);
DAUD_CHAN5_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN5_VOICE_PRIORITY_OFFSET);
DAUD_CHAN6_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN6_VOICE_PRIORITY_OFFSET);
DAUD_CHAN7_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN7_VOICE_PRIORITY_OFFSET);
DAUD_CHAN8_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN8_VOICE_PRIORITY_OFFSET);
DAUD_CHAN9_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN9_VOICE_PRIORITY_OFFSET);
DAUD_CHAN10_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN10_VOICE_PRIORITY_OFFSET);
DAUD_CHAN11_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN11_VOICE_PRIORITY_OFFSET);
DAUD_CHAN12_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN12_VOICE_PRIORITY_OFFSET);
DAUD_CHAN13_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN13_VOICE_PRIORITY_OFFSET);
DAUD_CHAN14_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN14_VOICE_PRIORITY_OFFSET);
DAUD_CHAN15_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN15_VOICE_PRIORITY_OFFSET);
DAUD_CHAN16_DEF_VOICE_PRIORITY = (DAUD_STANDARD_VOICE_PRIORITY or DAUD_CHAN16_VOICE_PRIORITY_OFFSET);
 
(* Property Get/Set GUID_DMUS_PROP_WriteLatency
*
* Item 0: Synth buffer write latency, in milliseconds
* Get/Set SynthSink latency, the average time after the play head that the next buffer gets written.
*)
GUID_DMUS_PROP_WriteLatency: TGUID = '{268a0fa0-60f2-11d2-afa6-00aa0024d8b6}';
 
(* Property Get/Set GUID_DMUS_PROP_WritePeriod
*
* Item 0: Synth buffer write period, in milliseconds
* Get/Set SynthSink buffer write period, time span between successive writes.
*)
GUID_DMUS_PROP_WritePeriod: TGUID = '{268a0fa1-60f2-11d2-afa6-00aa0024d8b6}';
//GUID definition
IID_IReferenceClock : TGUID = '{56A86897-0AD4-11CE-B03A-0020AF0BA770}';
 
(* Property Get GUID_DMUS_PROP_MemorySize
*
* Item 0: Memory size
* Returns a DWORD containing the total number of bytes of sample RAM
*)
GUID_DMUS_PROP_MemorySize: TGUID = '{178f2f28-c364-11d1-a760-0000f875ac12}';
CLSID_DirectMusic : TGUID = '{636B9F10-0C7D-11D1-95B2-0020AFDC7421}';
CLSID_DirectMusicCollection : TGUID = '{480FF4B0-28B2-11D1-BEF7-00C04FBF8FEF}';
CLSID_DirectMusicSynth : TGUID = '{58C2B4D0-46E7-11D1-89AC-00A0C9054129}';
 
(* Property Set GUID_DMUS_PROP_WavesReverb
*
* Item 0: DMUS_WAVES_REVERB structure
* Sets reverb parameters
*)
GUID_DMUS_PROP_WavesReverb: TGUID = '{04cb5622-32e5-11d2-afa6-00aa0024d8b6}';
IID_IDirectMusic : TGUID = '{6536115A-7B2D-11D2-BA18-0000F875AC12}';
IID_IDirectMusicBuffer : TGUID = '{D2AC2878-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicPort : TGUID = '{08F2D8C9-37C2-11D2-B9F9-0000F875AC12}';
IID_IDirectMusicThru : TGUID = '{CED153E7-3606-11D2-B9F9-0000F875AC12}';
IID_IDirectMusicPortDownload: TGUID = '{D2AC287A-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicDownload : TGUID = '{D2AC287B-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicCollection : TGUID = '{D2AC287C-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicInstrument : TGUID = '{D2AC287D-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicDownloadedInstrument: TGUID = '{D2AC287E-B39B-11D1-8704-00600893B1BD}';
 
(* Property Set GUID_DMUS_PROP_Effects
*
* Item 0: DWORD with effects flags.
* Get/Set effects bits, same as dwEffectFlags in DMUS_PORTPARAMS and DMUS_PORTCAPS:
* DMUS_EFFECT_NONE
* DMUS_EFFECT_REVERB
* DMUS_EFFECT_CHORUS
*)
GUID_DMUS_PROP_Effects: TGUID = '{cda8d611-684a-11d2-871e-00600893b1bd}';
// Alternate interface ID for IID_IDirectMusic, available in DX7 release and after.
IID_IDirectMusic2 : TGUID = '{6FC2CAE1-BC78-11D2-AFA6-00AA0024D8B6}';
 
(* Property Set GUID_DMUS_PROP_LegacyCaps
*
* Item 0: The MIDINCAPS or MIDIOUTCAPS which describes the port's underlying WinMM device. This property is only supported
* by ports which wrap WinMM devices.
*)
// Property Query GUID_DMUS_PROP_GM_Hardware - Local GM set, no need to download
// Property Query GUID_DMUS_PROP_GS_Hardware - Local GS set, no need to download
// Property Query GUID_DMUS_PROP_XG_Hardware - Local XG set, no need to download
// Property Query GUID_DMUS_PROP_DLS1 - Support DLS level 1
// Property Query GUID_DMUS_PROP_XG_Capable - Support minimum requirements of XG
// Property Query GUID_DMUS_PROP_GS_Capable - Support minimum requirements of GS
// Property Query GUID_DMUS_PROP_SynthSink_DSOUND - Synthsink talks to DSound
// Property Query GUID_DMUS_PROP_SynthSink_WAVE - Synthsink talks to Wave device
//
// Item 0: Supported
// Returns a DWORD which is non-zero if the feature is supported
///
GUID_DMUS_PROP_GM_Hardware : TGUID = '{178F2F24-C364-11D1-A760-0000F875AC12}';
GUID_DMUS_PROP_GS_Hardware : TGUID = '{178F2F25-C364-11D1-A760-0000F875AC12}';
GUID_DMUS_PROP_XG_Hardware : TGUID = '{178F2F26-C364-11D1-A760-0000F875AC12}';
GUID_DMUS_PROP_XG_Capable : TGUID = '{6496ABA1-61B0-11D2-AFA6-00AA0024D8B6}';
GUID_DMUS_PROP_GS_Capable : TGUID = '{6496ABA2-61B0-11D2-AFA6-00AA0024D8B6}';
GUID_DMUS_PROP_DLS1 : TGUID = '{178F2F27-C364-11D1-A760-0000F875AC12}';
GUID_DMUS_PROP_SynthSink_DSOUND: TGUID = '{0AA97844-C877-11D1-870C-00600893B1BD}';
GUID_DMUS_PROP_SynthSink_WAVE : TGUID = '{0AA97845-C877-11D1-870C-00600893B1BD}';
 
GUID_DMUS_PROP_LegacyCaps: TGUID = '{cfa7cdc2-00a1-11d2-aad5-0000f875ac12}';
// Property Get/Set GUID_DMUS_PROP_WriteLatency
//
// Item 0: Synth buffer write latency, in milliseconds
// Get/Set SynthSink latency, the average time after the play head that the next buffer gets written.
///
GUID_DMUS_PROP_WriteLatency : TGUID = '{268A0FA0-60F2-11D2-AFA6-00AA0024D8B6}';
 
(* Property Set GUID_DMUS_Volume
*
* Item 0: A long which contains an offset, in 1/100 dB, to be added to the final volume
*
*)
GUID_DMUS_PROP_Volume: TGUID = '{fedfae25-e46e-11d1-aace-0000f875ac12}';
// Property Get/Set GUID_DMUS_PROP_WritePeriod
//
// Item 0: Synth buffer write period, in milliseconds
// Get/Set SynthSink buffer write period, time span between successive writes.
///
GUID_DMUS_PROP_WritePeriod : TGUID = '{268A0FA1-60F2-11D2-AFA6-00AA0024D8B6}';
 
(* Min and Max values for setting volume with GUID_DMUS_PROP_Volume *)
// Property Get GUID_DMUS_PROP_MemorySize
//
// Item 0: Memory size
// Returns a DWORD containing the total number of bytes of sample RAM
///
GUID_DMUS_PROP_MemorySize : TGUID = '{178F2F28-C364-11D1-A760-0000F875AC12}';
 
DMUS_VOLUME_MAX = 2000; (* +20 dB *)
DMUS_VOLUME_MIN = -20000; (* -200 dB *)
// Property Set GUID_DMUS_PROP_WavesReverb
//
// Item 0: DMUS_WAVES_REVERB structure
// Sets reverb parameters
///
GUID_DMUS_PROP_WavesReverb : TGUID = '{04CB5622-32E5-11D2-AFA6-00AA0024D8B6}';
 
(************************************************************************
* *
* dmusici.h -- This module contains the API for the *
* DirectMusic performance layer *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
************************************************************************)
// Property Set GUID_DMUS_PROP_Effects
//
// Item 0: DWORD with effects flags.
// Get/Set effects bits, same as dwEffectFlags in DMUS_PORTPARAMS and DMUS_PORTCAPS:
// DMUS_EFFECT_NONE
// DMUS_EFFECT_REVERB
// DMUS_EFFECT_CHORUS
///
GUID_DMUS_PROP_Effects : TGUID = '{CDA8D611-684A-11D2-871E-00600893B1BD}';
 
// Property Set GUID_DMUS_PROP_LegacyCaps
//
// Item 0: The MIDINCAPS or MIDIOUTCAPS which describes the port's underlying WinMM device. This property is only supported
// by ports which wrap WinMM devices.
///
 
GUID_DMUS_PROP_LegacyCaps : TGUID = '{CFA7CDC2-00A1-11D2-AAD5-0000F875AC12}';
 
// Property Set GUID_DMUS_Volume
//
// Item 0: A long which contains an offset, in 1/100 dB, to be added to the final volume
//
///
GUID_DMUS_PROP_Volume : TGUID = '{FEDFAE25-E46E-11D1-AACE-0000F875AC12}';
 
 
 
 
 
//***********************************************************************
// *
// dmusici.h -- This module contains the API for the *
// DirectMusic performance layer *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
//**********************************************************************
type
TTransition_Type = WORD;
PMusic_Time = ^TMusic_Time;
TMusic_Time = LongInt;
TRANSITION_TYPE = Word;
MUSIC_TIME = Longint;
 
const
DMUS_PPQ = 768; (* parts per quarter note *)
DMUS_PPQ = 768; // parts per quarter note
 
type
TDMus_CommandT_Types = (
DMUS_COMMANDT_GROOVE,
DMUS_COMMANDT_FILL ,
DMUS_COMMANDT_INTRO ,
DMUS_COMMANDT_BREAK ,
DMUS_COMMANDT_END ,
DMUS_COMMANDT_ENDANDINTRO
);
const
DMUS_MAX_NAME = 64; // Maximum object name length.
DMUS_MAX_CATEGORY = 64; // Maximum object category name length.
DMUS_MAX_FILENAME = MAX_PATH;
 
TDMus_ShapeT_Types = (
DMUS_SHAPET_FALLING ,
DMUS_SHAPET_LEVEL ,
DMUS_SHAPET_LOOPABLE,
DMUS_SHAPET_LOUD ,
DMUS_SHAPET_QUIET ,
DMUS_SHAPET_PEAKING ,
DMUS_SHAPET_RANDOM ,
DMUS_SHAPET_RISING ,
DMUS_SHAPET_SONG
);
 
type
TDMus_ComposeF_Flags = DWORD;
 
const
DMUS_COMMANDT_GROOVE = 0;
DMUS_COMMANDT_FILL = 1;
DMUS_COMMANDT_INTRO = 2;
DMUS_COMMANDT_BREAK = 3;
DMUS_COMMANDT_END = 4;
DMUS_COMMANDT_ENDANDINTRO = 5;
{typedef enum enumDMUS_COMMANDT_TYPES
{
DMUS_COMMANDT_GROOVE = 0,
DMUS_COMMANDT_FILL = 1,
DMUS_COMMANDT_INTRO = 2,
DMUS_COMMANDT_BREAK = 3,
DMUS_COMMANDT_END = 4,
DMUS_COMMANDT_ENDANDINTRO = 5
DMUS_COMMANDT_TYPES;}
 
DMUS_SHAPET_FALLING = 0;
DMUS_SHAPET_LEVEL = 1;
DMUS_SHAPET_LOOPABLE = 2;
DMUS_SHAPET_LOUD = 3;
DMUS_SHAPET_QUIET = 4;
DMUS_SHAPET_PEAKING = 5;
DMUS_SHAPET_RANDOM = 6;
DMUS_SHAPET_RISING = 7;
DMUS_SHAPET_SONG = 8;
{typedef enum enumDMUS_SHAPET_TYPES
{
DMUS_SHAPET_FALLING = 0,
DMUS_SHAPET_LEVEL = 1,
DMUS_SHAPET_LOOPABLE = 2,
DMUS_SHAPET_LOUD = 3,
DMUS_SHAPET_QUIET = 4,
DMUS_SHAPET_PEAKING = 5,
DMUS_SHAPET_RANDOM = 6,
DMUS_SHAPET_RISING = 7,
DMUS_SHAPET_SONG = 8
DMUS_SHAPET_TYPES;}
 
DMUS_COMPOSEF_NONE = 0;
DMUS_COMPOSEF_ALIGN = $1;
DMUS_COMPOSEF_OVERLAP = $2;
19575,1909 → 13829,1534
DMUS_COMPOSEF_AFTERPREPARETIME = $40;
DMUS_COMPOSEF_MODULATE = $1000;
DMUS_COMPOSEF_LONG = $2000;
{typedef enum enumDMUS_COMPOSEF_FLAGS
{
DMUS_COMPOSEF_NONE = 0,
DMUS_COMPOSEF_ALIGN = 0x1,
DMUS_COMPOSEF_OVERLAP = 0x2,
DMUS_COMPOSEF_IMMEDIATE = 0x4,
DMUS_COMPOSEF_GRID = 0x8,
DMUS_COMPOSEF_BEAT = 0x10,
DMUS_COMPOSEF_MEASURE = 0x20,
DMUS_COMPOSEF_AFTERPREPARETIME = 0x40,
DMUS_COMPOSEF_MODULATE = 0x1000,
DMUS_COMPOSEF_LONG = 0x2000
DMUS_COMPOSEF_FLAGS;}
 
 
type
(* DMUS_PMsgF_FLAGS fill the TDMus_PMsg's dwFlags member *)
TDMus_PMsgF_Flags = DWORD;
const
DMUS_PMsgF_REFTIME = 1; (* if rtTime is valid *)
DMUS_PMsgF_MUSICTIME = 2; (* if mtTime is valid *)
DMUS_PMsgF_TOOL_IMMEDIATE = 4; (* if PMSG should be processed immediately *)
DMUS_PMsgF_TOOL_QUEUE = 8; (* if PMSG should be processed a little early, at Queue time *)
DMUS_PMsgF_TOOL_ATTIME = 16; (* if PMSG should be processed at the time stamp *)
DMUS_PMsgF_TOOL_FLUSH = 32; (* if PMSG is being flushed *)
(* The values of DMUS_TIME_RESOLVE_FLAGS may also be used inside the *)
(* TDMus_PMsg's dwFlags member. *)
// DMUS_PMSGF_FLAGS fill the DMUS_PMSG's dwFlags member
DMUS_PMSGF_REFTIME = 1; // if rtTime is valid
DMUS_PMSGF_MUSICTIME = 2; // if mtTime is valid
DMUS_PMSGF_TOOL_IMMEDIATE = 4; // if PMSG should be processed immediately
DMUS_PMSGF_TOOL_QUEUE = 8; // if PMSG should be processed a little early, at Queue time
DMUS_PMSGF_TOOL_ATTIME = 16; // if PMSG should be processed at the time stamp
DMUS_PMSGF_TOOL_FLUSH = 32; // if PMSG is being flushed
// The values of DMUS_TIME_RESOLVE_FLAGS may also be used inside the
// DMUS_PMSG's dwFlags member.
 
type
(* DMUS_PMsgT_TYPES fill the TDMus_PMsg's dwType member *)
TDMus_PMsgT_Types = (
DMUS_PMsgT_MIDI , (* MIDI short message *)
DMUS_PMsgT_NOTE , (* Interactive Music Note *)
DMUS_PMsgT_SYSEX , (* MIDI long message (system exclusive message) *)
DMUS_PMsgT_NOTIFICATION , (* Notification message *)
DMUS_PMsgT_TEMPO , (* Tempo message *)
DMUS_PMsgT_CURVE , (* Control change / pitch bend, etc. curve *)
DMUS_PMsgT_TIMESIG , (* Time signature *)
DMUS_PMsgT_PATCH , (* Patch changes *)
DMUS_PMsgT_TRANSPOSE , (* Transposition messages *)
DMUS_PMsgT_CHANNEL_PRIORITY, (* Channel priority *)
DMUS_PMsgT_STOP , (* Stop message *)
DMUS_PMsgT_DIRTY (* Tells Tools that cache GetParam() info to refresh *)
);
const
DMUS_PMsgT_USER = TDMus_PMsgT_Types(255); (* User message *)
TDMUS_PMSGF_FLAGS = Cardinal;
DMUS_PMSGF_FLAGS = TDMUS_PMSGF_FLAGS;
{typedef enum enumDMUS_PMSGF_FLAGS
{
DMUS_PMSGF_REFTIME = 1, /* if rtTime is valid
DMUS_PMSGF_MUSICTIME = 2, /* if mtTime is valid
DMUS_PMSGF_TOOL_IMMEDIATE = 4, /* if PMSG should be processed immediately
DMUS_PMSGF_TOOL_QUEUE = 8, /* if PMSG should be processed a little early, at Queue time
DMUS_PMSGF_TOOL_ATTIME = 16, /* if PMSG should be processed at the time stamp
DMUS_PMSGF_TOOL_FLUSH = 32 /* if PMSG is being flushed
/* The values of DMUS_TIME_RESOLVE_FLAGS may also be used inside the
/* DMUS_PMSG's dwFlags member.
DMUS_PMSGF_FLAGS;}
 
type
(* DMUS_SEGF_FLAGS correspond to IDirectMusicPerformance::PlaySegment, and other API *)
TDMus_SegF_Flags = DWORD;
const
DMUS_SEGF_REFTIME = 64; (* time parameter is in reference time *)
DMUS_SEGF_SECONDARY = 128; (* secondary segment *)
DMUS_SEGF_QUEUE = 256; (* queue at the end of the primary segment queue (primary only) *)
DMUS_SEGF_CONTROL = 512; (* play as a control track (secondary segments only) *)
DMUS_SEGF_AFTERPREPARETIME = 1 shl 10; (* play after the prepare time (See IDirectMusicPerformance::GetPrepareTime) *)
DMUS_SEGF_GRID = 1 shl 11; (* play on grid boundary *)
DMUS_SEGF_BEAT = 1 shl 12; (* play on beat boundary *)
DMUS_SEGF_MEASURE = 1 shl 13; (* play on measure boundary *)
DMUS_SEGF_DEFAULT = 1 shl 14; (* use segment's default boundary *)
DMUS_SEGF_NOINVALIDATE = 1 shl 15; (* play without invalidating the currently playing segment(s) *)
// DMUS_PMSGT_TYPES fill the DMUS_PMSG's dwType member
DMUS_PMSGT_MIDI = 0; // MIDI short message
DMUS_PMSGT_NOTE = 1; // Interactive Music Note
DMUS_PMSGT_SYSEX = 2; // MIDI long message (system exclusive message)
DMUS_PMSGT_NOTIFICATION = 3; // Notification message
DMUS_PMSGT_TEMPO = 4; // Tempo message
DMUS_PMSGT_CURVE = 5; // Control change / pitch bend, etc. curve
DMUS_PMSGT_TIMESIG = 6; // Time signature
DMUS_PMSGT_PATCH = 7; // Patch changes
DMUS_PMSGT_TRANSPOSE = 8; // Transposition messages
DMUS_PMSGT_CHANNEL_PRIORITY = 9; // Channel priority
DMUS_PMSGT_STOP = 10; // Stop message
DMUS_PMSGT_DIRTY = 11; // Tells Tools that cache GetParam() info to refresh
DMUS_PMSGT_USER = 255; // User message
 
(* DMUS_TIME_RESOLVE_FLAGS correspond to IDirectMusicPerformance::GetResolvedTime, and can *)
(* also be used interchangeably with the corresponding DMUS_SEGF_FLAGS, since their values *)
(* are intentionally the same *)
type
TDMus_Time_Resolve_Flags = DWORD;
const
DMUS_TIME_RESOLVE_AFTERPREPARETIME = 1 shl 10; (* resolve to a time after the prepare time *)
DMUS_TIME_RESOLVE_GRID = 1 shl 11; (* resolve to a time on a grid boundary *)
DMUS_TIME_RESOLVE_BEAT = 1 shl 12; (* resolve to a time on a beat boundary *)
DMUS_TIME_RESOLVE_MEASURE = 1 shl 13; (* resolve to a time on a measure boundary *)
TDMUS_PMSGT_TYPES = Cardinal;
DMUS_PMSGT_TYPES = TDMUS_PMSGT_TYPES;
 
(* The following flags are sent in the IDirectMusicTrack::Play() method *)
(* inside the dwFlags parameter *)
type
TDMus_TrackF_Flags = DWORD;
{typedef enum enumDMUS_PMSGT_TYPES
{
DMUS_PMSGT_MIDI = 0, /* MIDI short message
DMUS_PMSGT_NOTE = 1, /* Interactive Music Note
DMUS_PMSGT_SYSEX = 2, /* MIDI long message (system exclusive message)
DMUS_PMSGT_NOTIFICATION = 3, /* Notification message
DMUS_PMSGT_TEMPO = 4, /* Tempo message
DMUS_PMSGT_CURVE = 5, /* Control change / pitch bend, etc. curve
DMUS_PMSGT_TIMESIG = 6, /* Time signature
DMUS_PMSGT_PATCH = 7, /* Patch changes
DMUS_PMSGT_TRANSPOSE = 8, /* Transposition messages
DMUS_PMSGT_CHANNEL_PRIORITY = 9, /* Channel priority
DMUS_PMSGT_STOP = 10, /* Stop message
DMUS_PMSGT_DIRTY = 11, /* Tells Tools that cache GetParam() info to refresh
DMUS_PMSGT_USER = 255 /* User message
DMUS_PMSGT_TYPES;}
 
const
DMUS_TRACKF_SEEK = 1; (* set on a seek *)
DMUS_TRACKF_LOOP = 2; (* set on a loop (repeat) *)
DMUS_TRACKF_START = 4; (* set on first call to Play *)
DMUS_TRACKF_FLUSH = 8; (* set when this call is in response to a flush on the perfomance *)
DMUS_TRACKF_DIRTY = 16; (* set when the track should consider any cached values from a previous call to GetParam to be invalidated *)
// DMUS_SEGF_FLAGS correspond to IDirectMusicPerformance::PlaySegment, and other API
DMUS_SEGF_REFTIME = 64; // time parameter is in reference time
DMUS_SEGF_SECONDARY = 128; // secondary segment
DMUS_SEGF_QUEUE = 256; // queue at the end of the primary segment queue (primary only)
DMUS_SEGF_CONTROL = 512; // play as a control track (secondary segments only)
DMUS_SEGF_AFTERPREPARETIME = 1 shl 10; // play after the prepare time (See IDirectMusicPerformance::GetPrepareTime)
DMUS_SEGF_GRID = 1 shl 11; // play on grid boundary
DMUS_SEGF_BEAT = 1 shl 12; // play on beat boundary
DMUS_SEGF_MEASURE = 1 shl 13; // play on measure boundary
DMUS_SEGF_DEFAULT = 1 shl 14; // use segment's default boundary
DMUS_SEGF_NOINVALIDATE = 1 shl 15; // play without invalidating the currently playing segment(s)
 
DMUS_MAXSUBCHORD = 8;
 
type
IDirectMusicTrack = interface;
IDirectMusicPerformance = interface;
IDirectMusicSegment = interface;
IDirectMusicSegmentState = interface;
IDirectMusicTool = interface;
IDirectMusicGraph = interface;
TDMUS_SEGF_FLAGS = Cardinal;
DMUS_SEGF_FLAGS = TDMUS_SEGF_FLAGS;
 
{typedef enum enumDMUS_SEGF_FLAGS
{
DMUS_SEGF_REFTIME = 64, /* time parameter is in reference time
DMUS_SEGF_SECONDARY = 128, /* secondary segment
DMUS_SEGF_QUEUE = 256, /* queue at the end of the primary segment queue (primary only)
DMUS_SEGF_CONTROL = 512, /* play as a control track (secondary segments only)
DMUS_SEGF_AFTERPREPARETIME = 1<<10, /* play after the prepare time (See IDirectMusicPerformance::GetPrepareTime)
DMUS_SEGF_GRID = 1<<11, /* play on grid boundary
DMUS_SEGF_BEAT = 1<<12, /* play on beat boundary
DMUS_SEGF_MEASURE = 1<<13, /* play on measure boundary
DMUS_SEGF_DEFAULT = 1<<14, /* use segment's default boundary
DMUS_SEGF_NOINVALIDATE = 1<<15 /* play without invalidating the currently playing segment(s)
DMUS_SEGF_FLAGS;}
 
PIDirectMusicSegmentState = ^IDirectMusicSegmentState;
const
// DMUS_TIME_RESOLVE_FLAGS correspond to IDirectMusicPerformance::GetResolvedTime, and can
// also be used interchangeably with the corresponding DMUS_SEGF_FLAGS, since their values
// are intentionally the same
DMUS_TIME_RESOLVE_AFTERPREPARETIME = 1 shl 10; // resolve to a time after the prepare time
DMUS_TIME_RESOLVE_GRID = 1 shl 11; // resolve to a time on a grid boundary
DMUS_TIME_RESOLVE_BEAT = 1 shl 12; // resolve to a time on a beat boundary
DMUS_TIME_RESOLVE_MEASURE = 1 shl 13; // resolve to a time on a measure boundary
 
TDMus_PMsg_Part = record
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
end;
type
TDMUS_TIME_RESOLVE_FLAGS = Cardinal;
DMUS_TIME_RESOLVE_FLAGS = TDMUS_TIME_RESOLVE_FLAGS;
 
(* every TDMus_PMsg is based off of this structure. The Performance needs
to access these members consistently in every PMSG that goes through it. *)
{typedef enum enumDMUS_TIME_RESOLVE_FLAGS
{
DMUS_TIME_RESOLVE_AFTERPREPARETIME = 1<<10, /* resolve to a time after the prepare time
DMUS_TIME_RESOLVE_GRID = 1<<11, /* resolve to a time on a grid boundary
DMUS_TIME_RESOLVE_BEAT = 1<<12, /* resolve to a time on a beat boundary
DMUS_TIME_RESOLVE_MEASURE = 1<<13 /* resolve to a time on a measure boundary
DMUS_TIME_RESOLVE_FLAGS;}
 
(* begin DMUS_PMsg_PART *)
PDMus_PMsg = ^TDMus_PMsg;
TDMus_PMsg = TDMus_PMsg_Part;
(* end DMUS_PMsg_PART *)
const
// The following flags are sent in the IDirectMusicTrack::Play() method
// inside the dwFlags parameter
DMUS_TRACKF_SEEK = 1; // set on a seek
DMUS_TRACKF_LOOP = 2; // set on a loop (repeat)
DMUS_TRACKF_START = 4; // set on first call to Play
DMUS_TRACKF_FLUSH = 8; // set when this call is in response to a flush on the perfomance
DMUS_TRACKF_DIRTY = 16; // set when the track should consider any cached values from a previous call to GetParam to be invalidated
 
(* DMUS_NOTIFICATION_PMsg *)
PDMus_Notification_PMsg = ^TDMus_Notification_PMsg;
TDMus_Notification_PMsg = record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
type
TDMUS_TRACKF_FLAGS = Cardinal;
DMUS_TRACKF_FLAGS = TDMUS_TRACKF_FLAGS;
 
guidNotificationType: TGUID;
dwNotificationOption: DWORD;
dwField1: DWORD;
dwField2: DWORD;
end;
{typedef enum enumDMUS_TRACKF_FLAGS
{
DMUS_TRACKF_SEEK = 1, /* set on a seek
DMUS_TRACKF_LOOP = 2, /* set on a loop (repeat)
DMUS_TRACKF_START = 4, /* set on first call to Play
DMUS_TRACKF_FLUSH = 8, /* set when this call is in response to a flush on the perfomance
DMUS_TRACKF_DIRTY = 16, /* set when the track should consider any cached values from a previous call to GetParam to be invalidated
DMUS_TRACKF_FLAGS;}
 
TDMus_SubChord = packed record
dwChordPattern: DWORD; (* Notes in the subchord *)
dwScalePattern: DWORD; (* Notes in the scale *)
dwInversionPoints: DWORD; (* Where inversions can occur *)
dwLevels: DWORD; (* Which levels are supported by this subchord *)
bChordRoot: BYTE; (* Root of the subchord *)
bScaleRoot: BYTE; (* Root of the scale *)
end;
const
DMUS_MAXSUBCHORD = 8;
 
TDMus_Chord_Key = packed record
wszName: array [0..15] of WideChar; (* Name of the chord *)
wMeasure: WORD; (* Measure this falls on *)
bBeat: BYTE; (* Beat this falls on *)
bSubChordCount: BYTE; (* Number of chords in the list of subchords *)
SubChordList: array [0..DMUS_MAXSUBCHORD-1] of TDMus_SubChord; (* List of sub chords *)
dwScale: DWORD; (* Scale underlying the entire chord *)
bKey: BYTE; (* Key underlying the entire chord *)
type
TDMUS_SUBCHORD = record
dwChordPattern : DWORD; // Notes in the subchord
dwScalePattern : DWORD; // Notes in the scale
dwInversionPoints : DWORD; // Where inversions can occur
dwLevels : DWORD; // Which levels are supported by this subchord
bChordRoot : Byte; // Root of the subchord
bScaleRoot : Byte; // Root of the scale
end;
DMUS_SUBCHORD = TDMUS_SUBCHORD;
 
(* Time Signature structure, used by IDirectMusicStyle *)
(* Also used as a parameter for GetParam() and SetParam *)
TDMus_TimeSignature = packed record
mtTime: TMusic_Time;
bBeatsPerMeasure: BYTE; (* beats per measure (top of time sig) *)
bBeat: BYTE; (* what note receives the beat (bottom of time sig.) *)
(* we can assume that 0 means 256th note *)
wGridsPerBeat: WORD; (* grids per beat *)
TDMUS_CHORD_KEY = record
wszName : array[0..15] of WideChar; // Name of the chord
wMeasure : Word; // Measure this falls on
bBeat : Byte; // Beat this falls on
bSubChordCount : Byte; // Number of chords in the list of subchords
SubChordList : array[0..DMUS_MAXSUBCHORD - 1] of TDMUS_SUBCHORD;// List of sub chords
dwScale : DWORD; // Scale underlying the entire chord
bKey : Byte; // Key underlying the entire chord
end;
(*/////////////////////////////////////////////////////////////////////
// IDirectMusicSegmentState *)
IDirectMusicSegmentState = interface (IUnknown)
['{a3afdcc7-d3ee-11d1-bc8d-00a0c922e6eb}']
function GetRepeats (out pdwRepeats: DWORD) : HResult; stdcall;
function GetSegment (out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function GetStartTime (out pmtStart: TMusic_Time) : HResult; stdcall;
function GetSeek (out pmtSeek: TMusic_Time) : HResult; stdcall;
function GetStartPoint (out pmtStart: TMusic_Time) : HResult; stdcall;
end;
DMUS_CHORD_KEY = TDMUS_CHORD_KEY;
 
(*////////////////////////////////////////////////////////////////////
// IDirectMusicSegment *)
IDirectMusicSegment = interface (IUnknown)
['{f96029a2-4282-11d2-8717-00600893b1bd}']
function GetLength (out pmtLength: TMusic_Time) : HResult; stdcall;
function SetLength (mtLength: TMusic_Time) : HResult; stdcall;
function GetRepeats (out pdwRepeats: DWORD) : HResult; stdcall;
function SetRepeats (dwRepeats: DWORD) : HResult; stdcall;
function GetDefaultResolution (out pdwResolution: DWORD) : HResult; stdcall;
function SetDefaultResolution (dwResolution: DWORD) : HResult; stdcall;
function GetTrack (const rguidType: TGUID;
dwGroupBits, dwIndex: DWORD;
out ppTrack: IDirectMusicTrack) : HResult; stdcall;
function GetTrackGroup (pTrack: IDirectMusicTrack;
out pdwGroupBits: DWORD) : HResult; stdcall;
function InsertTrack (pTrack: IDirectMusicTrack;
dwGroupBits: DWORD) : HResult; stdcall;
function RemoveTrack (pTrack: IDirectMusicTrack) : HResult; stdcall;
function InitPlay (out ppSegState: IDirectMusicSegmentState;
pPerformance: IDirectMusicPerformance;
dwFlags: DWORD) : HResult; stdcall;
function GetGraph (out ppGraph: IDirectMusicGraph) : HResult; stdcall;
function SetGraph (pGraph: IDirectMusicGraph) : HResult; stdcall;
function AddNotificationType (const rguidNotificationType: TGUID) : HResult; stdcall;
function RemoveNotificationType (const rguidNotificationType: TGUID) : HResult; stdcall;
function GetParam (const rguidType: TGUID;
dwGroupBits, dwIndex: DWORD;
mtTime: TMusic_Time;
out pmtNext: TMusic_Time;
pParam: Pointer) : HResult; stdcall;
function SetParam (const rguidType: TGUID;
dwGroupBits, dwIndex: DWORD;
mtTime: TMusic_Time;
pParam: Pointer) : HResult; stdcall;
function Clone (mtStart: TMusic_Time;
mtEnd: TMusic_Time;
out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function SetStartPoint (mtStart: TMusic_Time) : HResult; stdcall;
function GetStartPoint (out pmtStart: TMusic_Time) : HResult; stdcall;
function SetLoopPoints (mtStart: TMusic_Time;
mtEnd: TMusic_Time) : HResult; stdcall;
function GetLoopPoints (out pmtStart, pmtEnd: TMusic_Time) : HResult; stdcall;
function SetPChannelsUsed (dwNumPChannels: DWORD;
var paPChannels: DWORD) : HResult; stdcall;
end;
const
//typedef enum enumDMUS_NOTEF_FLAGS
DMUS_NOTEF_NOTEON = 1; // Set if this is a MIDI Note On. Otherwise, it is MIDI Note Off
 
type
TDMUS_NOTEF_FLAGS = Cardinal;
DMUS_NOTEF_FLAGS = TDMUS_NOTEF_FLAGS;
 
(*////////////////////////////////////////////////////////////////////
// IDirectMusicTrack *)
IDirectMusicTrack = interface (IUnknown)
['{f96029a1-4282-11d2-8717-00600893b1bd}']
function Init (pSegment: IDirectMusicSegment) : HResult; stdcall;
function InitPlay (pSegmentState: IDirectMusicSegmentState;
pPerformance: IDirectMusicPerformance;
out ppStateData: Pointer;
dwVirtualTrackID, dwFlags: DWORD) : HResult; stdcall;
function EndPlay (pStateData: Pointer) : HResult; stdcall;
function Play (pStateData: Pointer;
mtStart: TMusic_Time;
mtEnd: TMusic_Time;
mtOffset: TMusic_Time;
dwFlags: DWORD;
pPerf: IDirectMusicPerformance;
pSegSt: IDirectMusicSegmentState;
dwVirtualID:DWORD) : HResult; stdcall;
function GetParam (const rguidType: TGUID;
mtTime: TMusic_Time;
out pmtNext: TMusic_Time;
pParam: Pointer) : HResult; stdcall;
function SetParam (const rguidType: TGUID;
mtTime: TMusic_Time;
pParam: Pointer) : HResult; stdcall;
function IsParamSupported (const rguidType: TGUID) : HResult; stdcall;
function AddNotificationType (const rguidNotificationType: TGUID) : HResult; stdcall;
function RemoveNotificationType (const rguidNotificationType: TGUID) : HResult; stdcall;
function Clone (mtStart: TMusic_Time;
mtEnd: TMusic_Time;
out ppTrack: IDirectMusicTrack) : HResult; stdcall;
end;
 
PIDirectMusic = ^IDirectMusic;
 
(*////////////////////////////////////////////////////////////////////
// IDirectMusicPerformance *)
IDirectMusicPerformance = interface (IUnknown)
['{07d43d03-6523-11d2-871d-00600893b1bd}']
function Init (ppDirectMusic: PIDirectMusic;
pDirectSound: IDirectSound;
hWnd: HWND ) : HResult; stdcall;
function PlaySegment (pSegment: IDirectMusicSegment;
dwFlags: DWORD;
i64StartTime: LongLong;
ppSegmentState: PIDirectMusicSegmentState) : HResult; stdcall;
function Stop (pSegment: IDirectMusicSegment;
pSegmentState: IDirectMusicSegmentState;
mtTime: TMusic_Time;
dwFlags: DWORD) : HResult; stdcall;
function GetSegmentState (out ppSegmentState: IDirectMusicSegmentState;
mtTime: TMusic_Time) : HResult; stdcall;
function SetPrepareTime (dwMilliSeconds: DWORD) : HResult; stdcall;
function GetPrepareTime (out pdwMilliSeconds: DWORD) : HResult; stdcall;
function SetBumperLength (dwMilliSeconds: DWORD) : HResult; stdcall;
function GetBumperLength (out pdwMilliSeconds: DWORD) : HResult; stdcall;
function SendPMsg (out pPMSG: TDMus_PMsg) : HResult; stdcall;
function MusicToReferenceTime (mtTime: TMusic_Time;
out prtTime: TReference_Time) : HResult; stdcall;
function ReferenceToMusicTime (rtTime: TReference_Time;
out pmtTime: TMusic_Time) : HResult; stdcall;
function IsPlaying (pSegment: IDirectMusicSegment;
pSegState: IDirectMusicSegmentState) : HResult; stdcall;
function GetTime (prtNow: PReference_Time;
pmtNow: PMusic_Time) : HResult; stdcall;
function AllocPMsg (cb: ULONG;
out ppPMSG: PDMus_PMsg) : HResult; stdcall;
function FreePMsg (pPMSG: PDMus_PMsg) : HResult; stdcall;
function GetGraph (out ppGraph: IDirectMusicGraph) : HResult; stdcall;
function SetGraph (pGraph: IDirectMusicGraph) : HResult; stdcall;
function SetNotificationHandle (hNotification: THANDLE;
rtMinimum: TReference_Time) : HResult; stdcall;
function GetNotificationPMsg (out ppNotificationPMsg: PDMus_Notification_PMsg) : HResult; stdcall;
function AddNotificationType (const rguidNotificationType: TGUID) : HResult; stdcall;
function RemoveNotificationType (const rguidNotificationType: TGUID) : HResult; stdcall;
function AddPort (pPort: IDirectMusicPort) : HResult; stdcall;
function RemovePort (pPort: IDirectMusicPort) : HResult; stdcall;
function AssignPChannelBlock (dwBlockNum: DWORD;
pPort: IDirectMusicPort;
dwGroup: DWORD) : HResult; stdcall;
function AssignPChannel (dwPChannel: DWORD;
pPort: IDirectMusicPort;
dwGroup, dwMChannel: DWORD) : HResult; stdcall;
function PChannelInfo (dwPChannel: DWORD;
out ppPort: IDirectMusicPort;
out pdwGroup, pdwMChannel: DWORD ) : HResult; stdcall;
function DownloadInstrument (pInst: IDirectMusicInstrument;
dwPChannel: DWORD;
out ppDownInst: IDirectMusicDownloadedInstrument;
var pNoteRanges: TDMus_NoteRange;
dwNumNoteRanges: DWORD;
out ppPort: IDirectMusicPort;
out pdwGroup, pdwMChannel: DWORD) : HResult; stdcall;
function Invalidate (mtTime: TMusic_Time;
dwFlags: DWORD) : HResult; stdcall;
function GetParam (const rguidType: TGUID;
dwGroupBits, dwIndex: DWORD;
mtTime: TMusic_Time;
out pmtNext: TMusic_Time;
pParam: Pointer) : HResult; stdcall;
function SetParam (const rguidType: TGUID;
dwGroupBits, dwIndex: DWORD;
mtTime: TMusic_Time;
pParam: Pointer) : HResult; stdcall;
function GetGlobalParam (const rguidType: TGUID;
pParam: Pointer;
dwSize: DWORD) : HResult; stdcall;
function SetGlobalParam (const rguidType: TGUID;
pParam: Pointer;
dwSize: DWORD) : HResult; stdcall;
function GetLatencyTime (out prtTime: TReference_Time) : HResult; stdcall;
function GetQueueTime (out prtTime: TReference_Time) : HResult; stdcall;
function AdjustTime (rtAmount: TReference_Time) : HResult; stdcall;
function CloseDown : HResult; stdcall;
function GetResolvedTime (rtTime: TReference_Time;
out prtResolved: TReference_Time;
dwTimeResolveFlags: DWORD) : HResult; stdcall;
function MIDIToMusic (bMIDIValue: BYTE;
const pChord: TDMus_Chord_Key;
bPlayMode, bChordLevel: Byte;
out pwMusicValue: WORD) : HResult; stdcall;
function MusicToMIDI (wMusicValue: WORD;
const pChord: TDMus_Chord_Key;
bPlayMode, bChordLevel: BYTE;
out pbMIDIValue: BYTE) : HResult; stdcall;
function TimeToRhythm (mtTime: TMusic_Time;
const pTimeSig: TDMus_TimeSignature;
out pwMeasure: WORD;
out pbBeat, pbGrid: BYTE;
out pnOffset: SmallInt) : HResult; stdcall;
function RhythmToTime (wMeasure: WORD;
bBeat, bGrid: BYTE;
nOffset: SmallInt;
const pTimeSig: TDMus_TimeSignature;
out pmtTime: TMusic_Time) : HResult; stdcall;
end;
 
(*////////////////////////////////////////////////////////////////////
// IDirectMusicTool *)
IDirectMusicTool = interface (IUnknown)
['{d2ac28ba-b39b-11d1-8704-00600893b1bd}']
function Init (pGraph: IDirectMusicGraph) : HResult; stdcall;
function GetMsgDeliveryType (out pdwDeliveryType: DWORD) : HResult; stdcall;
function GetMediaTypeArraySize (out pdwNumElements: DWORD) : HResult; stdcall;
function GetMediaTypes (out padwMediaTypes: PDWORD;
dwNumElements: DWORD) : HResult; stdcall;
function ProcessPMsg (pPerf: IDirectMusicPerformance;
var pPMSG: TDMus_PMsg) : HResult; stdcall;
function Flush (pPerf: IDirectMusicPerformance;
const pPMSG: TDMus_PMsg;
rtTime: TReference_Time) : HResult; stdcall;
end;
 
(*////////////////////////////////////////////////////////////////////
// IDirectMusicGraph *)
IDirectMusicGraph = interface (IUnknown)
['{2befc277-5497-11d2-bccb-00a0c922e6eb}']
function StampPMsg (var pPMSG: TDMus_PMsg ) : HResult; stdcall;
function InsertTool (pTool: IDirectMusicTool;
var pdwPChannels: DWORD;
cPChannels: DWORD;
lIndex: LongInt) : HResult; stdcall;
function GetTool (dwIndex: DWORD;
out ppTool: IDirectMusicTool) : HResult; stdcall;
function RemoveTool (pTool: IDirectMusicTool) : HResult; stdcall;
end;
 
 
(* DMUS_NOTE_PMsg *)
TDMus_Note_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
mtDuration: TMusic_Time; (* duration *)
wMusicValue: WORD; (* Description of note in chord and key. *)
wMeasure: WORD; (* Measure in which this note occurs *)
nOffset: SmallInt; (* Offset from grid at which this note occurs *)
bBeat: BYTE; (* Beat (in measure) at which this note occurs *)
bGrid: BYTE; (* Grid offset from beat at which this note occurs *)
bVelocity: BYTE; (* Note velocity *)
bFlags: BYTE; (* see DMUS_NOTE_FLAGS *)
bTimeRange: BYTE; (* Range to randomize time. *)
bDurRange: BYTE; (* Range to randomize duration. *)
bVelRange: BYTE; (* Range to randomize velocity. *)
bPlayModeFlags: BYTE; (* Play mode *)
bSubChordLevel: BYTE; (* Which subchord level this note uses. *)
bMidiValue: BYTE; (* The MIDI note value, converted from wMusicValue *)
cTranspose: char; (* Transposition to add to midi note value after converted from wMusicValue. *)
end;
 
TDMus_NoteF_Flags = DWORD;
// The DMUS_PLAYMODE_FLAGS are used to determine how to convert wMusicValue
// into the appropriate bMidiValue.
///
const
DMUS_NOTEF_NOTEON = 1; (* Set if this is a MIDI Note On. Otherwise, it is MIDI Note Off *)
//typedef enum enumDMUS_PLAYMODE_FLAGS
DMUS_PLAYMODE_KEY_ROOT = 1; // Transpose on top of the key root.
DMUS_PLAYMODE_CHORD_ROOT = 2; // Transpose on top of the chord root.
DMUS_PLAYMODE_SCALE_INTERVALS = 4; // Use scale intervals from scale pattern.
DMUS_PLAYMODE_CHORD_INTERVALS = 8; // Use chord intervals from chord pattern.
DMUS_PLAYMODE_NONE = 16; // No mode. Indicates the parent part's mode should be used.
 
(* The DMUS_PLAYMODE_FLAGS are used to determine how to convert wMusicValue
into the appropriate bMidiValue.
*)
type
TDMus_PlayMode_Flags = DWORD;
const
DMUS_PLAYMODE_KEY_ROOT = 1; (* Transpose on top of the key root. *)
DMUS_PLAYMODE_CHORD_ROOT = 2; (* Transpose on top of the chord root. *)
DMUS_PLAYMODE_SCALE_INTERVALS = 4; (* Use scale intervals from scale pattern. *)
DMUS_PLAYMODE_CHORD_INTERVALS = 8; (* Use chord intervals from chord pattern. *)
DMUS_PLAYMODE_NONE = 16; (* No mode. Indicates the parent part's mode should be used. *)
TDMUS_PLAYMODE_FLAGS = Cardinal;
DMUS_PLAYMODE_FLAGS = TDMUS_PLAYMODE_FLAGS;
 
(* The following are playback modes that can be created by combining the DMUS_PLAYMODE_FLAGS
in various ways:
*)
// The following are playback modes that can be created by combining the DMUS_PLAYMODE_FLAGS
// in various ways:
///
 
(* Fixed. wMusicValue holds final MIDI note value. This is used for drums, sound effects, and sequenced
notes that should not be transposed by the chord or scale.
*)
// Fixed. wMusicValue holds final MIDI note value. This is used for drums, sound effects, and sequenced
// notes that should not be transposed by the chord or scale.
///
const
DMUS_PLAYMODE_FIXED = 0;
(* In fixed to key, the musicvalue is again a fixed MIDI value, but it
is transposed on top of the key root.
*)
// In fixed to key, the musicvalue is again a fixed MIDI value, but it
// is transposed on top of the key root.
///
DMUS_PLAYMODE_FIXEDTOKEY = DMUS_PLAYMODE_KEY_ROOT;
(* In fixed to chord, the musicvalue is also a fixed MIDI value, but it
is transposed on top of the chord root.
*)
// In fixed to chord, the musicvalue is also a fixed MIDI value, but it
// is transposed on top of the chord root.
///
DMUS_PLAYMODE_FIXEDTOCHORD = DMUS_PLAYMODE_CHORD_ROOT;
(* In Pedalpoint, the key root is used and the notes only track the intervals in
the scale. The chord root and intervals are completely ignored. This is useful
for melodic lines that play relative to the key root.
*)
// In Pedalpoint, the key root is used and the notes only track the intervals in
// the scale. The chord root and intervals are completely ignored. This is useful
// for melodic lines that play relative to the key root.
///
DMUS_PLAYMODE_PEDALPOINT = (DMUS_PLAYMODE_KEY_ROOT or DMUS_PLAYMODE_SCALE_INTERVALS);
(* In the Melodic mode, the chord root is used but the notes only track the intervals in
the scale. The key root and chord intervals are completely ignored. This is useful
for melodic lines that play relative to the chord root.
*)
// In the Melodic mode, the chord root is used but the notes only track the intervals in
// the scale. The key root and chord intervals are completely ignored. This is useful
// for melodic lines that play relative to the chord root.
///
DMUS_PLAYMODE_MELODIC = (DMUS_PLAYMODE_CHORD_ROOT or DMUS_PLAYMODE_SCALE_INTERVALS);
(* Normal chord mode is the prevalent playback mode.
The notes track the intervals in the chord, which is based on the chord root.
If there is a scale component to the MusicValue, the additional intervals
are pulled from the scale and added.
If the chord does not have an interval to match the chord component of
the MusicValue, the note is silent.
*)
// Normal chord mode is the prevalent playback mode.
// The notes track the intervals in the chord, which is based on the chord root.
// If there is a scale component to the MusicValue, the additional intervals
// are pulled from the scale and added.
// If the chord does not have an interval to match the chord component of
// the MusicValue, the note is silent.
///
DMUS_PLAYMODE_NORMALCHORD = (DMUS_PLAYMODE_CHORD_ROOT or DMUS_PLAYMODE_CHORD_INTERVALS);
(* If it is desirable to play a note that is above the top of the chord, the
always play mode (known as "purpleized" in a former life) finds a position
for the note by using intervals from the scale. Essentially, this mode is
a combination of the Normal and Melodic playback modes, where a failure
in Normal causes a second try in Melodic mode.
*)
// If it is desirable to play a note that is above the top of the chord, the
// always play mode (known as "purpleized" in a former life) finds a position
// for the note by using intervals from the scale. Essentially, this mode is
// a combination of the Normal and Melodic playback modes, where a failure
// in Normal causes a second try in Melodic mode.
///
DMUS_PLAYMODE_ALWAYSPLAY = (DMUS_PLAYMODE_MELODIC or DMUS_PLAYMODE_NORMALCHORD);
 
(* Legacy names for modes... *)
// Legacy names for modes...
DMUS_PLAYMODE_PURPLEIZED = DMUS_PLAYMODE_ALWAYSPLAY;
DMUS_PLAYMODE_SCALE_ROOT = DMUS_PLAYMODE_KEY_ROOT;
DMUS_PLAYMODE_FIXEDTOSCALE = DMUS_PLAYMODE_FIXEDTOKEY;
 
type
(* DMUS_MIDI_PMsg *)
TDMus_Midi_PMsg = record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
const
DMUS_TEMPO_MAX = 350;
DMUS_TEMPO_MIN = 10;
 
bStatus: BYTE;
bByte1: BYTE;
bByte2: BYTE;
bPad: array [0..0] of BYTE;
end;
DMUS_MASTERTEMPO_MAX = 2.0;
DMUS_MASTERTEMPO_MIN = 0.25;
 
(* DMUS_PATCH_PMsg *)
TDMus_Patch_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
byInstrument: BYTE;
byMSB: BYTE;
byLSB: BYTE;
byPad: array [0..0] of BYTE;
end;
 
(* DMUS_TRANSPOSE_PMsg *)
TDMus_Transpose_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
nTranspose: SmallInt;
end;
 
(* DMUS_CHANNEL_PRIORITY_PMsg *)
TDMus_Channel_Priority_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
dwChannelPriority: DWORD;
end;
 
(* DMUS_TEMPO_PMsg *)
TDMus_Tempo_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
dblTempo: double; (* the tempo *)
end;
 
const
DMUS_TEMPO_MAX = 1000;
DMUS_TEMPO_MIN = 1;
DMUS_CURVE_RESET = 1; // Set if the curve needs to be reset.
 
DMUS_MASTERTEMPO_MAX = 100.0;
DMUS_MASTERTEMPO_MIN = 0.01;
 
type
(* DMUS_SYSEX_PMsg *)
TDMus_SysEx_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
TDMUS_CURVE_FLAGS = Cardinal;
DMUS_CURVE_FLAGS = TDMUS_CURVE_FLAGS;
{
DMUS_CURVE_RESET = 1, /* Set if the curve needs to be reset.
DMUS_CURVE_FLAGS; }
 
dwLen: DWORD; (* length of the data *)
abData: array [0..0] of BYTE; (* array of data, length equal to dwLen *)
end;
 
(* DMUS_CURVE_PMsg *)
TDMus_Curve_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
mtDuration: TMusic_Time; (* how long this curve lasts *)
mtOriginalStart: TMusic_Time; (* must be set to either zero when this PMSG is created or to the original mtTime of the curve *)
mtResetDuration: TMusic_Time; (* how long after the curve is finished to reset to the
reset value, nResetValue *)
nStartValue: SmallInt; (* curve's start value *)
nEndValue: SmallInt; (* curve's end value *)
nResetValue: SmallInt; (* curve's reset value, sent after mtResetDuration or
upon a flush or invalidation *)
wMeasure: WORD; (* Measure in which this curve occurs *)
nOffset: SmallInt; (* Offset from grid at which this curve occurs *)
bBeat: BYTE; (* Beat (in measure) at which this curve occurs *)
bGrid: BYTE; (* Grid offset from beat at which this curve occurs *)
bType: BYTE; (* type of curve *)
bCurveShape: BYTE; (* shape of curve *)
bCCData: BYTE; (* CC# if this is a control change type *)
bFlags: BYTE; (* set to 1 if the nResetValue must be sent when the
time is reached or an invalidate occurs because
of a transition. If 0, the curve stays
permanently stuck at the new value. All bits besides
1 are reserved. *)
end;
 
TDMus_Curve_Flags = DWORD;
const
DMUS_CURVE_RESET = 1; (* Set if the curve needs to be reset. *)
//DMUS_CURVE_RESET = 1;
 
(* Curve shapes *)
type
TDMus_Curve_Shapes = (
DMUS_CURVES_LINEAR ,
DMUS_CURVES_INSTANT,
DMUS_CURVES_EXP ,
DMUS_CURVES_LOG ,
DMUS_CURVES_SINE
);
// Curve shapes
DMUS_CURVES_LINEAR = 0;
DMUS_CURVES_INSTANT = 1;
DMUS_CURVES_EXP = 2;
DMUS_CURVES_LOG = 3;
DMUS_CURVES_SINE = 4;
 
const
(* curve types *)
DMUS_CURVET_PBCURVE = $03;
DMUS_CURVET_CCCURVE = $04;
DMUS_CURVET_MATCURVE = $05;
DMUS_CURVET_PATCURVE = $06;
// curve types
DMUS_CURVET_PBCURVE = $03;
DMUS_CURVET_CCCURVE = $04;
DMUS_CURVET_MATCURVE = $05;
DMUS_CURVET_PATCURVE = $06;
 
type
(* DMUS_TIMESIG_PMsg *)
TDMus_TimeSig_PMsg = packed record
(* begin DMUS_PMsg_PART *)
dwSize: DWORD;
rtTime: TReference_Time; (* real time (in 100 nanosecond increments) *)
mtTime: TMusic_Time; (* music time *)
dwFlags: DWORD; (* various bits (see DMUS_PMsg_FLAGS enumeration) *)
dwPChannel: DWORD; (* Performance Channel. The Performance can *)
(* use this to determine the port/channel. *)
dwVirtualTrackID:DWORD; (* virtual track ID *)
pTool: IDirectMusicTool; (* tool interface pointer *)
pGraph: IDirectMusicGraph; (* tool graph interface pointer *)
dwType: DWORD; (* PMSG type (see DMUS_PMsgT_TYPES defines) *)
dwVoiceID: DWORD; (* unique voice id which allows synthesizers to *)
(* identify a specific event. For DirectX 6.0, *)
(* this field should always be 0. *)
dwGroupID: DWORD; (* Track group id *)
punkUser: IUnknown; (* user com pointer, auto released upon PMSG free *)
(* end DMUS_PMsg_PART *)
 
(* Time signatures define how many beats per measure, which note receives *)
(* the beat, and the grid resolution. *)
bBeatsPerMeasure: BYTE; (* beats per measure (top of time sig) *)
bBeat: BYTE; (* what note receives the beat (bottom of time sig.) *)
(* we can assume that 0 means 256th note *)
wGridsPerBeat: WORD; (* grids per beat *)
end;
 
// notification type values
// The following correspond to GUID_NOTIFICATION_SEGMENT
const
(* notification type values *)
(* The following correspond to GUID_NOTIFICATION_SEGMENT *)
DMUS_NOTIFICATION_SEGSTART = 0;
DMUS_NOTIFICATION_SEGEND = 1;
DMUS_NOTIFICATION_SEGALMOSTEND = 2;
DMUS_NOTIFICATION_SEGLOOP = 3;
DMUS_NOTIFICATION_SEGABORT = 4;
(* The following correspond to GUID_NOTIFICATION_PERFORMANCE *)
// The following correspond to GUID_NOTIFICATION_PERFORMANCE
DMUS_NOTIFICATION_MUSICSTARTED = 0;
DMUS_NOTIFICATION_MUSICSTOPPED = 1;
(* The following corresponds to GUID_NOTIFICATION_MEASUREANDBEAT *)
// The following corresponds to GUID_NOTIFICATION_MEASUREANDBEAT
DMUS_NOTIFICATION_MEASUREBEAT = 0;
(* The following corresponds to GUID_NOTIFICATION_CHORD *)
// The following corresponds to GUID_NOTIFICATION_CHORD
DMUS_NOTIFICATION_CHORD = 0;
(* The following correspond to GUID_NOTIFICATION_COMMAND *)
DMUS_NOTIFICATION_GROOVE = 0;
DMUS_NOTIFICATION_EMBELLISHMENT = 1;
// The following correspond to GUID_NOTIFICATION_COMMAND
DMUS_NOTIFICATION_GROOVE = 0;
DMUS_NOTIFICATION_EMBELLISHMENT= 1;
 
const
DMUS_MAX_NAME = 64; (* Maximum object name length. *)
DMUS_MAX_CATEGORY = 64; (* Maximum object category name length. *)
DMUS_MAX_FILENAME = MAX_PATH;
 
type
PDMus_Version = ^TDMus_Version;
TDMus_Version = packed record
dwVersionMS: DWORD;
dwVersionLS: DWORD;
// Time Signature structure, used by IDirectMusicStyle
// Also used as a parameter for GetParam() and SetParam
TDMUS_TIMESIGNATURE = record
mtTime : MUSIC_TIME;
bBeatsPerMeasure : Byte; // beats per measure (top of time sig)
bBeat : Byte; // what note receives the beat (bottom of time sig.)
// we can assume that 0 means 256th note
wGridsPerBeat : Word; // grids per beat
end;
DMUS_TIMESIGNATURE = TDMUS_TIMESIGNATURE;
 
(* The DMUSOBJECTDESC structure is used to communicate everything you could *)
(* possibly use to describe a DirectMusic object. *)
PDMus_ObjectDesc = ^TDMus_ObjectDesc;
TDMus_ObjectDesc = packed record
dwSize: DWORD; (* Size of this structure. *)
dwValidData: DWORD; (* Flags indicating which fields below are valid. *)
guidObject: TGUID; (* Unique ID for this object. *)
guidClass: TGUID; (* GUID for the class of object. *)
ftDate: TFileTime; (* Last edited date of object. *)
vVersion: TDMus_Version; (* Version. *)
wszName: array [0..DMUS_MAX_NAME-1] of WCHAR; (* Name of object. *)
wszCategory: array [0..DMUS_MAX_CATEGORY-1] of WCHAR; (* Category for object (optional). *)
wszFileName: array [0..DMUS_MAX_FILENAME-1] of WCHAR; (* File path. *)
llMemLength: LongLong; (* Size of Memory data. *)
pbMemData: Pointer; (* Memory pointer for data. *)
dwDummy: DWORD; ///?
end;
// Flags for dwValidData. When set, a flag indicates that the
// corresponding field in DMUSOBJECTDESC holds valid data.
const
DMUS_OBJ_OBJECT = 1 shl 0; // Object GUID is valid.
DMUS_OBJ_CLASS = 1 shl 1; // Class GUID is valid.
DMUS_OBJ_NAME = 1 shl 2; // Name is valid.
DMUS_OBJ_CATEGORY = 1 shl 3; // Category is valid.
DMUS_OBJ_FILENAME = 1 shl 4; // File path is valid.
DMUS_OBJ_FULLPATH = 1 shl 5; // Path is full path.
DMUS_OBJ_URL = 1 shl 6; // Path is URL.
DMUS_OBJ_VERSION = 1 shl 7; // Version is valid.
DMUS_OBJ_DATE = 1 shl 8; // Date is valid.
DMUS_OBJ_LOADED = 1 shl 9; // Object is currently loaded in memory.
DMUS_OBJ_MEMORY = 1 shl 10; // Object is pointed to by pbMemData.
 
(* Flags for dwValidData. When set, a flag indicates that the *)
(* corresponding field in DMUSOBJECTDESC holds valid data. *)
const
DMUS_OBJ_OBJECT = (1 shl 0); (* Object GUID is valid. *)
DMUS_OBJ_CLASS = (1 shl 1); (* Class GUID is valid. *)
DMUS_OBJ_NAME = (1 shl 2); (* Name is valid. *)
DMUS_OBJ_CATEGORY = (1 shl 3); (* Category is valid. *)
DMUS_OBJ_FILENAME = (1 shl 4); (* File path is valid. *)
DMUS_OBJ_FULLPATH = (1 shl 5); (* Path is full path. *)
DMUS_OBJ_URL = (1 shl 6); (* Path is URL. *)
DMUS_OBJ_VERSION = (1 shl 7); (* Version is valid. *)
DMUS_OBJ_DATE = (1 shl 8); (* Date is valid. *)
DMUS_OBJ_LOADED = (1 shl 9); (* Object is currently loaded in memory. *)
DMUS_OBJ_MEMORY = (1 shl 10); (* Object is pointed to by pbMemData. *)
DMUSB_LOADED = 1 shl 0; // Set when band has been loaded
DMUSB_DEFAULT = 1 shl 1; // Set when band is default band for a style
 
DMUSB_LOADED = (1 shl 0); (* Set when band has been loaded *)
DMUSB_DEFAULT = (1 shl 1); (* Set when band is default band for a style *)
 
type
IDirectMusicBand = interface;
IDirectMusicChordMap = interface;
IDirectMusicLoader = interface;
IDirectMusicObject = interface;
IDirectMusicTrack = interface;
IDirectMusicPerformance = interface;
IDirectMusicTool = interface;
IDirectMusicSegment = interface;
IDirectMusicSegmentState = interface;
IDirectMusicGraph = interface;
//IDirectMusicPort = interface;
//IDirectMusicBuffer = interface;
//IDirectMusicInstrument = interface;
//IDirectMusicDownloadedInstrument = interface;
IDirectMusicBand = interface;
IDirectMusicChordMap = interface;
IDirectMusicLoader = interface;
IDirectMusicObject = interface;
{#ifndef __cplusplus
typedef interface IDirectMusic IDirectMusic;
typedef interface IDirectMusicTrack IDirectMusicTrack;
typedef interface IDirectMusicPerformance IDirectMusicPerformance;
typedef interface IDirectMusicTool IDirectMusicTool;
typedef interface IDirectMusicSegment IDirectMusicSegment;
typedef interface IDirectMusicSegmentState IDirectMusicSegmentState;
typedef interface IDirectMusicGraph IDirectMusicGraph;
typedef interface IDirectMusicPort IDirectMusicPort;
typedef interface IDirectMusicBuffer IDirectMusicBuffer;
typedef interface IDirectMusicInstrument IDirectMusicInstrument;
typedef interface IDirectMusicDownloadedInstrument IDirectMusicDownloadedInstrument;
typedef interface IDirectMusicBand IDirectMusicBand;
typedef interface IDirectMusicChordMap IDirectMusicChordMap;
typedef interface IDirectMusicObject IDirectMusicObject;
typedef interface IDirectMusicLoader IDirectMusicLoader;
#endif}
 
LPDMUS_OBJECT = IDirectMusicObject;
LPDMUS_LOADER = IDirectMusicLoader;
LPDMUS_BAND = IDirectMusicBand;
 
IDirectMusicBand = interface (IUnknown)
['{d2ac28c0-b39b-11d1-8704-00600893b1bd}']
function CreateSegment (out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function Download (pPerformance: IDirectMusicPerformance) : HResult; stdcall;
function Unload (pPerformance: IDirectMusicPerformance) : HResult; stdcall;
TDMUS_PMSG_PART = record
dwSize : DWORD;
rtTime : REFERENCE_TIME; // real time (in 100 nanosecond increments) \
mtTime : MUSIC_TIME; // music time \
dwFlags : DWORD; // various bits (see DMUS_PMSG_FLAGS enumeration) \
dwPChannel : DWORD; // Performance Channel. The Performance can \
// use this to determine the port/channel. \
dwVirtualTrackID : DWORD; // virtual track ID \
pTool : IDirectMusicTool; // tool interface pointer \
pGraph : IDirectMusicGraph; // tool graph interface pointer \
dwType : DWORD; // PMSG type (see DMUS_PMSGT_TYPES defines) \
dwVoiceID : DWORD; // unique voice id which allows synthesizers to \
// identify a specific event. For DirectX 6.0, \
// this field should always be 0. \
dwGroupID : DWORD; // Track group id \
punkUser : IUnknown; // user com pointer, auto released upon PMSG free
end;
// every DMUS_PMSG is based off of this structure. The Performance needs
// to access these members consistently in every PMSG that goes through it.
{typedef struct _DMUS_PMSG
{
/* begin DMUS_PMSG_PART
DMUS_PMSG_PART
/* end DMUS_PMSG_PART
 
IDirectMusicObject = interface (IUnknown)
['{d2ac28b5-b39b-11d1-8704-00600893b1bd}']
function GetDescriptor (out pDesc: TDMus_ObjectDesc) : HResult; stdcall;
function SetDescriptor (const pDesc: TDMus_ObjectDesc) : HResult; stdcall;
function ParseDescriptor (var pStream;
out pDesc: TDMus_ObjectDesc) : HResult; stdcall;
end;
DMUS_PMSG;}
TDMUS_PMSG = TDMUS_PMSG_PART;
DMUS_PMSG = TDMUS_PMSG;
 
IDirectMusicLoader = interface (IUnknown)
['{2ffaaca2-5dca-11d2-afa6-00aa0024d8b6}']
function GetObject (const pDesc: TDMus_ObjectDesc;
const riid : TGUID;
out ppv) : HResult; stdcall;
function SetObject (const pDesc: TDMus_ObjectDesc) : HResult; stdcall;
function SetSearchDirectory (const rguidClass: TGUID;
pwzPath: PWideChar;
fClear: BOOL) : HResult; stdcall;
function ScanDirectory (const rguidClass: TGUID;
pwzFileExtension,
pwzScanFileName: PWideChar) : HResult; stdcall;
function CacheObject (pObject: IDirectMusicObject) : HResult; stdcall;
function ReleaseObject (pObject: IDirectMusicObject) : HResult; stdcall;
function ClearCache (const rguidClass: TGUID) : HResult; stdcall;
function EnableCache (const rguidClass: TGUID;
fEnable: BOOL) : HResult; stdcall;
function EnumObject (const rguidClass: TGUID;
dwIndex: DWORD;
const pDesc: TDMus_ObjectDesc) : HResult; stdcall;
// DMUS_NOTE_PMSG
TDMUS_NOTE_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
mtDuration : MUSIC_TIME; // duration
wMusicValue : Word; // Description of note in chord and key.
wMeasure : Word; // Measure in which this note occurs
nOffset : Smallint; // Offset from grid at which this note occurs
bBeat : Byte; // Beat (in measure) at which this note occurs
bGrid : Byte; // Grid offset from beat at which this note occurs
bVelocity : Byte; // Note velocity
bFlags : Byte; // see DMUS_NOTE_FLAGS
bTimeRange : Byte; // Range to randomize time.
bDurRange : Byte; // Range to randomize duration.
bVelRange : Byte; // Range to randomize velocity.
bPlayModeFlags : Byte; // Play mode
bSubChordLevel : Byte; // Which subchord level this note uses.
bMidiValue : Byte; // The MIDI note value, converted from wMusicValue
cTranspose : Shortint; // Transposition to add to midi note value after converted from wMusicValue.
end;
DMUS_NOTE_PMSG = TDMUS_NOTE_PMSG;
 
(* Stream object supports IDirectMusicGetLoader interface to access loader while file parsing. *)
// DMUS_MIDI_PMSG
TDMUS_MIDI_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
IDirectMusicGetLoader = interface (IUnknown)
['{68a04844-d13d-11d1-afa6-00aa0024d8b6}']
function GetLoader (out ppLoader: IDirectMusicLoader) : HResult; stdcall;
bStatus : Byte;
bByte1 : Byte;
bByte2 : Byte;
bPad : array[0..0] of Byte;
end;
DMUS_MIDI_PMSG = TDMUS_MIDI_PMSG;
 
(*/////////////////////////////////////////////////////////////////////
// IDirectMusicStyle *)
IDirectMusicStyle = interface (IUnknown)
['{d2ac28bd-b39b-11d1-8704-00600893b1bd}']
function GetBand (pwszName: PWideChar;
out ppBand: IDirectMusicBand) : HResult; stdcall;
function EnumBand (dwIndex: DWORD;
pwszName: PWideChar) : HResult; stdcall;
function GetDefaultBand (out ppBand: IDirectMusicBand) : HResult; stdcall;
function EnumMotif (dwIndex: DWORD;
pwszName: PWideChar) : HResult; stdcall;
function GetMotif (pwszName: PWideChar;
out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function GetDefaultChordMap (out ppChordMap: IDirectMusicChordMap) : HResult; stdcall;
function EnumChordMap (dwIndex: DWORD;
pwszName: PWideChar) : HResult; stdcall;
function GetChordMap (pwszName: PWideChar;
out ppChordMap: IDirectMusicChordMap) : HResult; stdcall;
function GetTimeSignature (out pTimeSig: TDMus_TimeSignature) : HResult; stdcall;
function GetEmbellishmentLength (dwType, dwLevel: DWORD;
out pdwMin, pdwMax: DWORD) : HResult; stdcall;
function GetTempo (out pTempo: double) : HResult; stdcall;
end;
// DMUS_PATCH_PMSG
TDMUS_PATCH_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(*/////////////////////////////////////////////////////////////////////
// IDirectMusicChordMap *)
IDirectMusicChordMap = interface (IUnknown)
['{d2ac28be-b39b-11d1-8704-00600893b1bd}']
function GetScale (out pdwScale: DWORD) : HResult; stdcall;
byInstrument : Byte;
byMSB : Byte;
byLSB : Byte;
byPad : array[0..0] of Byte;
end;
DMUS_PATCH_PMSG = TDMUS_PATCH_PMSG;
 
(*/////////////////////////////////////////////////////////////////////
// IDirectMusicComposer *)
IDirectMusicComposer = interface (IUnknown)
['{d2ac28bf-b39b-11d1-8704-00600893b1bd}']
function ComposeSegmentFromTemplate (pStyle: IDirectMusicStyle;
pTempSeg: IDirectMusicSegment;
wActivity: WORD;
pChordMap: IDirectMusicChordMap;
out ppSectionSeg: IDirectMusicSegment) : HResult; stdcall;
function ComposeSegmentFromShape (pStyle: IDirectMusicStyle;
wNumMeasures,
wShape,
wActivity: WORD;
fIntro: BOOL;
fEnd: BOOL;
pChordMap: IDirectMusicChordMap;
out ppSectionSeg: IDirectMusicSegment) : HResult; stdcall;
function ComposeTransition (pFromSeg: IDirectMusicSegment;
pToSeg: IDirectMusicSegment;
mtTime: TMusic_Time;
wCommand: WORD;
dwFlags: DWORD;
pChordMap:IDirectMusicChordMap;
out ppSectionSeg: IDirectMusicSegment) : HResult; stdcall;
function AutoTransition (pPerformance: IDirectMusicPerformance;
pToSeg: IDirectMusicSegment;
wCommand: WORD;
dwFlags: DWORD;
pChordMap: IDirectMusicChordMap;
out ppTransSeg: IDirectMusicSegment;
out ppToSegState: IDirectMusicSegmentState;
out ppTransSegState: IDirectMusicSegmentState) : HResult; stdcall;
function ComposeTemplateFromShape (wNumMeasures: WORD;
wShape: WORD;
fIntro: BOOL;
fEnd: BOOL;
wEndLength: WORD;
out ppTempSeg:IDirectMusicSegment) : HResult; stdcall;
function ChangeChordMap (pSectionSeg: IDirectMusicSegment;
fTrackScale: BOOL;
pChordMap: IDirectMusicChordMap) : HResult; stdcall;
// DMUS_TRANSPOSE_PMSG
TDMUS_TRANSPOSE_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
nTranspose : Smallint;
end;
DMUS_TRANSPOSE_PMSG = TDMUS_TRANSPOSE_PMSG;
 
const
(* CLSID's *)
CLSID_DirectMusicPerformance : TGUID = '{d2ac2881-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicSegment : TGUID = '{d2ac2882-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicSegmentState : TGUID = '{d2ac2883-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicGraph : TGUID = '{d2ac2884-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicTempoTrack : TGUID = '{d2ac2885-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicSeqTrack : TGUID = '{d2ac2886-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicSysExTrack : TGUID = '{d2ac2887-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicTimeSigTrack : TGUID = '{d2ac2888-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicStyle : TGUID = '{d2ac288a-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicChordTrack : TGUID = '{d2ac288b-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicCommandTrack : TGUID = '{d2ac288c-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicStyleTrack : TGUID = '{d2ac288d-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicMotifTrack : TGUID = '{d2ac288e-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicChordMap : TGUID = '{d2ac288f-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicComposer : TGUID = '{d2ac2890-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicSignPostTrack : TGUID = '{f17e8672-c3b4-11d1-870b-00600893b1bd}';
CLSID_DirectMusicLoader : TGUID = '{d2ac2892-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicBandTrack : TGUID = '{d2ac2894-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicBand : TGUID = '{79ba9e00-b6ee-11d1-86be-00c04fbf8fef}';
CLSID_DirectMusicChordMapTrack : TGUID = '{d2ac2896-b39b-11d1-8704-00600893b1bd}';
CLSID_DirectMusicMuteTrack : TGUID = '{d2ac2898-b39b-11d1-8704-00600893b1bd}';
// DMUS_CHANNEL_PRIORITY_PMSG
TDMUS_CHANNEL_PRIORITY_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(* Special GUID for all object types. This is used by the loader. *)
GUID_DirectMusicAllTypes : TGUID = '{d2ac2893-b39b-11d1-8704-00600893b1bd}';
dwChannelPriority : DWORD;
end;
DMUS_CHANNEL_PRIORITY_PMSG = TDMUS_CHANNEL_PRIORITY_PMSG;
 
(* Notification guids *)
GUID_NOTIFICATION_SEGMENT : TGUID = '{d2ac2899-b39b-11d1-8704-00600893b1bd}';
GUID_NOTIFICATION_PERFORMANCE : TGUID = '{81f75bc5-4e5d-11d2-bcc7-00a0c922e6eb}';
GUID_NOTIFICATION_MEASUREANDBEAT : TGUID = '{d2ac289a-b39b-11d1-8704-00600893b1bd}';
GUID_NOTIFICATION_CHORD : TGUID = '{d2ac289b-b39b-11d1-8704-00600893b1bd}';
GUID_NOTIFICATION_COMMAND : TGUID = '{d2ac289c-b39b-11d1-8704-00600893b1bd}';
// DMUS_TEMPO_PMSG
TDMUS_TEMPO_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(* Track param type guids *)
(* Use to get/set a DMUS_COMMAND_PARAM param in the Command track *)
GUID_CommandParam : TGUID = '{d2ac289d-b39b-11d1-8704-00600893b1bd}';
dblTempo : Double; // the tempo
end;
DMUS_TEMPO_PMSG = TDMUS_TEMPO_PMSG;
 
(* Use to get a DMUS_COMMAND_PARAM_2 param in the Command track *)
GUID_CommandParam2 : TGUID = '{28f97ef7-9538-11d2-97a9-00c04fa36e58}';
// DMUS_SYSEX_PMSG
TDMUS_SYSEX_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(* Use to get/set a DMUS_CHORD_PARAM param in the Chord track *)
GUID_ChordParam : TGUID = '{d2ac289e-b39b-11d1-8704-00600893b1bd}';
dwLen : DWORD; // length of the data
abData : array[0..0] of Byte; // array of data, length equal to dwLen
end;
DMUS_SYSEX_PMSG = TDMUS_SYSEX_PMSG;
 
(* Use to get a DMUS_RHYTHM_PARAM param in the Chord track *)
GUID_RhythmParam : TGUID = '{d2ac289f-b39b-11d1-8704-00600893b1bd}';
// DMUS_CURVE_PMSG
TDMUS_CURVE_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(* Use to get/set an IDirectMusicStyle param in the Style track *)
GUID_IDirectMusicStyle : TGUID = '{d2ac28a1-b39b-11d1-8704-00600893b1bd}';
mtDuration : MUSIC_TIME; // how long this curve lasts
mtOriginalStart : MUSIC_TIME; // must be set to either zero when this PMSG is created or to the original mtTime of the curve
mtResetDuration : MUSIC_TIME; // how long after the curve is finished to reset to the
// reset value, nResetValue
nStartValue : Smallint; // curve's start value
nEndValue : Smallint; // curve's end value
nResetValue : Smallint; // curve's reset value, sent after mtResetDuration or
// upon a flush or invalidation
wMeasure : Word; // Measure in which this curve occurs
nOffset : Smallint; // Offset from grid at which this curve occurs
bBeat : Byte; // Beat (in measure) at which this curve occurs
bGrid : Byte; // Grid offset from beat at which this curve occurs
bType : Byte; // type of curve
bCurveShape : Byte; // shape of curve
bCCData : Byte; // CC# if this is a control change type
bFlags : Byte; // set to 1 if the nResetValue must be sent when the
// time is reached or an invalidate occurs because
// of a transition. If 0, the curve stays
// permanently stuck at the new value. All bits besides
// 1 are reserved.
 
(* Use to get a DMUS_TIMESIGNATURE param in the Style and TimeSig tracks *)
GUID_TimeSignature : TGUID = '{d2ac28a4-b39b-11d1-8704-00600893b1bd}';
end;
DMUS_CURVE_PMSG = TDMUS_CURVE_PMSG;
 
(* Use to get/set a DMUS_TEMPO_PARAM param in the Tempo track *)
GUID_TempoParam : TGUID = '{d2ac28a5-b39b-11d1-8704-00600893b1bd}';
// DMUS_TIMESIG_PMSG
TDMUS_TIMESIG_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(* Use to set an IDirectMusicBand param in the Band track *)
GUID_IDirectMusicBand : TGUID = '{d2ac28ac-b39b-11d1-8704-00600893b1bd}';
// Time signatures define how many beats per measure, which note receives
// the beat, and the grid resolution.
bBeatsPerMeasure : Byte; // beats per measure (top of time sig)
bBeat : Byte; // what note receives the beat (bottom of time sig.)
// we can assume that 0 means 256th note
wGridsPerBeat : Word; // grids per beat
end;
DMUS_TIMESIG_PMSG = TDMUS_TIMESIG_PMSG;
 
(* Use to get/set an IDirectMusicChordMap param in the ChordMap track *)
GUID_IDirectMusicChordMap : TGUID = '{d2ac28ad-b39b-11d1-8704-00600893b1bd}';
// DMUS_NOTIFICATION_PMSG
PDMUS_NOTIFICATION_PMSG = ^TDMUS_NOTIFICATION_PMSG;
TDMUS_NOTIFICATION_PMSG = record
// begin DMUS_PMSG_PART
DMUS_PMSG_PART : TDMUS_PMSG_PART;
// end DMUS_PMSG_PART
 
(* Use to get/set a DMUS_MUTE_PARAM param in the Mute track *)
GUID_MuteParam : TGUID = '{d2ac28af-b39b-11d1-8704-00600893b1bd}';
guidNotificationType : TGUID;
dwNotificationOption : DWORD;
dwField1 : DWORD;
dwField2 : DWORD;
end;
DMUS_NOTIFICATION_PMSG = TDMUS_NOTIFICATION_PMSG;
 
(* These guids are used in IDirectMusicSegment::SetParam to tell the band track to perform various actions.
*)
(* Download bands for the IDirectMusicSegment *)
GUID_Download : TGUID = '{d2ac28a7-b39b-11d1-8704-00600893b1bd}';
TDMUS_VERSION = record
dwVersionMS : DWORD;
dwVersionLS : DWORD;
end;
DMUS_VERSION = TDMUS_VERSION;
LPDMUS_VERSION = ^TDMUS_VERSION;
 
(* Unload bands for the IDirectMusicSegment *)
GUID_Unload : TGUID = '{d2ac28a8-b39b-11d1-8704-00600893b1bd}';
// The DMUSOBJECTDESC structure is used to communicate everything you could
// possibly use to describe a DirectMusic object.
 
(* Connect segment's bands to an IDirectMusicCollection *)
GUID_ConnectToDLSCollection : TGUID = '{1db1ae6b-e92e-11d1-a8c5-00c04fa3726e}';
TDMUS_OBJECTDESC = record
dwSize : DWORD; // Size of this structure.
dwValidData : DWORD; // Flags indicating which fields below are valid.
guidObject : TGUID; // Unique ID for this object.
guidClass : TGUID; // GUID for the class of object.
ftDate : TFILETIME; // Last edited date of object.
vVersion : TDMUS_VERSION; // Version.
wszName : array[0..DMUS_MAX_NAME - 1] of WCHAR; // Name of object.
wszCategory : array[0..DMUS_MAX_CATEGORY - 1] of WCHAR; // Category for object (optional).
wszFileName : array[0..DMUS_MAX_FILENAME - 1] of WCHAR; // File path.
llMemLength : LONGLONG; // Size of Memory data.
pbMemData : Pointer; // Memory pointer for data.
end;
DMUS_OBJECTDESC = TDMUS_OBJECTDESC;
LPDMUS_OBJECTDESC = ^TDMUS_OBJECTDESC;
 
(* Enable/disable autodownloading of bands *)
GUID_Enable_Auto_Download : TGUID = '{d2ac28a9-b39b-11d1-8704-00600893b1bd}';
GUID_Disable_Auto_Download : TGUID = '{d2ac28aa-b39b-11d1-8704-00600893b1bd}';
IDirectMusicBand = interface(IUnknown)
['{D2AC28C0-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicBand
function CreateSegment(out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function Download(pPerformance: IDirectMusicPerformance) : HResult; stdcall;
function Unload(pPerformance: IDirectMusicPerformance) : HResult; stdcall;
end;
 
(* Clear all bands *)
GUID_Clear_All_Bands : TGUID = '{d2ac28ab-b39b-11d1-8704-00600893b1bd}';
IDirectMusicObject = interface(IUnknown)
['{D2AC28B5-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicObject
function GetDescriptor(var pDesc: TDMUS_OBJECTDESC) : HResult; stdcall;
function SetDescriptor(const pDesc: TDMUS_OBJECTDESC) : HResult; stdcall;
function ParseDescriptor(pStream: IStream;
var pDesc: TDMUS_OBJECTDESC) : HResult; stdcall;
end;
 
(* Set segment to manage all program changes, bank selects, etc. for simple playback of a standard MIDI file *)
_GUID_StandardMIDIFile = '{06621075-e92e-11d1-a8c5-00c04fa3726e}';
GUID_StandardMIDIFile : TGUID = _GUID_StandardMIDIFile;
(* For compatibility with beta releases... *)
GUID_IgnoreBankSelectForGM : TGUID = _GUID_StandardMIDIFile;
IDirectMusicLoader = interface(IUnknown)
['{2FFAACA2-5DCA-11D2-AFA6-00AA0024D8B6}']
// IDirectMusicLoader
function GetObject(const pDesc: TDMUS_OBJECTDESC;
const riid: TGUID;
out ppv) : HResult; stdcall;
function SetObject(const pDesc: TDMUS_OBJECTDESC) : HResult; stdcall;
function SetSearchDirectory(const rguidClass: TGUID;
pwzPath: PWCHAR;
fClear: BOOL) : HResult; stdcall;
function ScanDirectory(const rguidClass: TGUID;
pwzFileExtension: PWCHAR;
var pwzScanFileName: PWCHAR) : HResult; stdcall;
function CacheObject(pObject: IDirectMusicObject) : HResult; stdcall;
function ReleaseObject(pObject: IDirectMusicObject) : HResult; stdcall;
function ClearCache(const rguidClass: TGUID) : HResult; stdcall;
function EnableCache(const rguidClass: TGUID;
fEnable: BOOL) : HResult; stdcall;
function EnumObject(const rguidClass: TGUID;
dwIndex: DWORD;
var pDesc: TDMUS_OBJECTDESC) : HResult; stdcall;
end;
 
(* Disable/enable param guids. Use these in SetParam calls to disable or enable sending
* specific PMsg types.
*)
GUID_DisableTimeSig : TGUID = '{45fc707b-1db4-11d2-bcac-00a0c922e6eb}';
GUID_EnableTimeSig : TGUID = '{45fc707c-1db4-11d2-bcac-00a0c922e6eb}';
GUID_DisableTempo : TGUID = '{45fc707d-1db4-11d2-bcac-00a0c922e6eb}';
GUID_EnableTempo : TGUID = '{45fc707e-1db4-11d2-bcac-00a0c922e6eb}';
// Stream object supports IDirectMusicGetLoader interface to access loader while file parsing.
IDirectMusicGetLoader = interface(IUnknown)
['{68A04844-D13D-11D1-AFA6-00AA0024D8B6}']
// IDirectMusicGetLoader
function GetLoader(out ppLoader: IDirectMusicLoader) : HResult; stdcall;
end;
 
(* Used in SetParam calls for pattern-based tracks. A nonzero value seeds the random number
generator for variation selection; a value of zero reverts to the default behavior of
getting the seed from the system clock.
*)
GUID_SeedVariations : TGUID = '{65b76fa5-ff37-11d2-814e-00c04fa36e58}';
(* Global data guids *)
GUID_PerfMasterTempo : TGUID = '{d2ac28b0-b39b-11d1-8704-00600893b1bd}';
GUID_PerfMasterVolume : TGUID = '{d2ac28b1-b39b-11d1-8704-00600893b1bd}';
GUID_PerfMasterGrooveLevel : TGUID = '{d2ac28b2-b39b-11d1-8704-00600893b1bd}';
GUID_PerfAutoDownload : TGUID = '{fb09565b-3631-11d2-bcb8-00a0c922e6eb}';
{ IDirectMusicSegment }
 
(* GUID for default GM/GS dls collection. *)
GUID_DefaultGMCollection : TGUID = '{f17e8673-c3b4-11d1-870b-00600893b1bd}';
IDirectMusicSegment = interface(IUnknown)
['{F96029A2-4282-11D2-8717-00600893B1BD}']
// IDirectMusicSegment
function GetLength(var pmtLength: MUSIC_TIME) : HResult; stdcall;
function SetLength(mtLength: MUSIC_TIME) : HResult; stdcall;
function GetRepeats(var pdwRepeats: DWORD) : HResult; stdcall;
function SetRepeats(dwRepeats: DWORD) : HResult; stdcall;
function GetDefaultResolution(var pdwResolution: DWORD) : HResult; stdcall;
function SetDefaultResolution(dwResolution: DWORD) : HResult; stdcall;
function GetTrack(const rguidType: TGUID;
dwGroupBits: DWORD;
dwIndex: DWORD;
out ppTrack: IDirectMusicTrack) : HResult; stdcall;
function GetTrackGroup(pTrack: IDirectMusicTrack;
var pdwGroupBits: DWORD) : HResult; stdcall;
function InsertTrack(pTrack: IDirectMusicTrack;
dwGroupBits: DWORD) : HResult; stdcall;
function RemoveTrack(pTrack: IDirectMusicTrack) : HResult; stdcall;
function InitPlay(out ppSegState: IDirectMusicSegmentState;
pPerformance: IDirectMusicPerformance;
dwFlags: DWORD) : HResult; stdcall;
function GetGraph(out ppGraph: IDirectMusicGraph) : HResult; stdcall;
function SetGraph(pGraph: IDirectMusicGraph) : HResult; stdcall;
function AddNotificationType(const rguidNotificationType: TGUID) : HResult; stdcall;
function RemoveNotificationType(const rguidNotificationType: TGUID) : HResult; stdcall;
function GetParam(const rguidType: TGUID;
dwGroupBits: DWORD;
dwIndex: DWORD;
mtTime: MUSIC_TIME;
var pmtNext: MUSIC_TIME;
pParam: Pointer) : HResult; stdcall;
function SetParam(const rguidType: TGUID;
dwGroupBits: DWORD;
dwIndex: DWORD;
mtTime: MUSIC_TIME;
pParam: Pointer) : HResult; stdcall;
function Clone(mtStart: MUSIC_TIME;
mtEnd: MUSIC_TIME;
out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function SetStartPoint(mtStart: MUSIC_TIME) : HResult; stdcall;
function GetStartPoint(var pmtStart: MUSIC_TIME) : HResult; stdcall;
function SetLoopPoints(mtStart: MUSIC_TIME;
mtEnd: MUSIC_TIME) : HResult; stdcall;
function GetLoopPoints(var pmtStart: MUSIC_TIME;
var pmtEnd: MUSIC_TIME) : HResult; stdcall;
function SetPChannelsUsed(dwNumPChannels: DWORD;
const paPChannels) : HResult; stdcall;
end;
 
type
(* IID's *)
IID_IDirectMusicLoader = IDirectMusicLoader;
IID_IDirectMusicGetLoader = IDirectMusicGetLoader;
IID_IDirectMusicObject = IDirectMusicObject;
IID_IDirectMusicSegment = IDirectMusicSegment;
IID_IDirectMusicSegmentState = IDirectMusicSegmentState;
IID_IDirectMusicTrack = IDirectMusicTrack;
IID_IDirectMusicPerformance = IDirectMusicPerformance;
IID_IDirectMusicTool = IDirectMusicTool;
IID_IDirectMusicGraph = IDirectMusicGraph;
IID_IDirectMusicStyle = IDirectMusicStyle;
IID_IDirectMusicChordMap = IDirectMusicChordMap;
IID_IDirectMusicComposer = IDirectMusicComposer;
IID_IDirectMusicBand = IDirectMusicBand;
{ IDirectMusicSegmentState }
 
const
(* Alternate interface IDs, available in DX7 release and after. *)
IID_IDirectMusicPerformance2 : TGUID = '{6fc2cae0-bc78-11d2-afa6-00aa0024d8b6}';
IID_IDirectMusicSegment2 : TGUID = '{d38894d1-c052-11d2-872f-00600893b1bd}';
IDirectMusicSegmentState = interface(IUnknown)
['{A3AFDCC7-D3EE-11D1-BC8D-00A0C922E6EB}']
// IDirectMusicSegmentState
function GetRepeats(var pdwRepeats: DWORD) : HResult; stdcall;
function GetSegment(out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function GetStartTime(var pmtStart: MUSIC_TIME) : HResult; stdcall;
function GetSeek(var pmtSeek: MUSIC_TIME) : HResult; stdcall;
function GetStartPoint(var pmtStart: MUSIC_TIME) : HResult; stdcall;
end;
 
(************************************************************************
* *
* dmusicf.h -- This module defines the DirectMusic file formats *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
************************************************************************)
{ IDirectMusicTrack }
 
//type IDirectMusicCollection = interface;
IDirectMusicTrack = interface(IUnknown)
['{F96029A1-4282-11D2-8717-00600893B1BD}']
// IDirectMusicTrack
function Init(pSegment: IDirectMusicSegment) : HResult; stdcall;
function InitPlay(pSegmentState: IDirectMusicSegmentState;
pPerformance: IDirectMusicPerformance;
var ppStateData: Pointer;
dwVirtualTrackID: DWORD;
dwFlags: DWORD) : HResult; stdcall;
function EndPlay(const pStateData) : HResult; stdcall;
function Play(const pStateData;
mtStart: MUSIC_TIME;
mtEnd: MUSIC_TIME;
mtOffset: MUSIC_TIME;
dwFlags: DWORD;
pPerf: IDirectMusicPerformance;
pSegSt: IDirectMusicSegmentState;
dwVirtualID: DWORD) : HResult; stdcall;
function GetParam(const rguidType: TGUID;
mtTime: MUSIC_TIME;
var pmtNext: MUSIC_TIME;
var pParam) : HResult; stdcall;
function SetParam(const rguidType: TGUID;
mtTime: MUSIC_TIME;
const pParam) : HResult; stdcall;
function IsParamSupported(const rguidType: TGUID) : HResult; stdcall;
function AddNotificationType(const rguidNotificationType: TGUID) : HResult; stdcall;
function RemoveNotificationType(const rguidNotificationType: TGUID) : HResult; stdcall;
function Clone(mtStart: MUSIC_TIME;
mtEnd: MUSIC_TIME;
out ppTrack: IDirectMusicTrack) : HResult; stdcall;
end;
 
const
(* Common chunks *)
{ IDirectMusicPerformance }
 
DMUS_FOURCC_GUID_CHUNK : mmioFOURCC = ('g','u','i','d');
DMUS_FOURCC_INFO_LIST : mmioFOURCC = ('I','N','F','O');
DMUS_FOURCC_UNFO_LIST : mmioFOURCC = ('U','N','F','O');
DMUS_FOURCC_UNAM_CHUNK : mmioFOURCC = ('U','N','A','M');
DMUS_FOURCC_UART_CHUNK : mmioFOURCC = ('U','A','R','T');
DMUS_FOURCC_UCOP_CHUNK : mmioFOURCC = ('U','C','O','P');
DMUS_FOURCC_USBJ_CHUNK : mmioFOURCC = ('U','S','B','J');
DMUS_FOURCC_UCMT_CHUNK : mmioFOURCC = ('U','C','M','T');
DMUS_FOURCC_CATEGORY_CHUNK : mmioFOURCC = ('c','a','t','g');
DMUS_FOURCC_VERSION_CHUNK : mmioFOURCC = ('v','e','r','s');
 
(* The following structures are used by the Tracks, and are the packed structures *)
(* that are passed to the Tracks inside the IStream. *)
 
type
TDMus_IO_Seq_Item = packed record
mtTime: TMusic_Time;
mtDuration: TMusic_Time;
dwPChannel: DWORD;
nOffset: SmallInt;
bStatus: BYTE;
bByte1: BYTE;
bByte2: BYTE;
IDirectMusicPerformance = interface(IUnknown)
['{07D43D03-6523-11D2-871D-00600893B1BD}']
// IDirectMusicPerformance
function Init(out ppDirectMusic: IDirectMusic;
pDirectSound: IDirectSound;
hWnd: HWND) : HResult; stdcall;
function PlaySegment(pSegment: IDirectMusicSegment;
dwFlags: DWORD;
i64StartTime: LONGLONG;
out ppSegmentState: IDirectMusicSegmentState) : HResult; stdcall;
function Stop(pSegment: IDirectMusicSegment;
pSegmentState: IDirectMusicSegmentState;
mtTime: MUSIC_TIME;
dwFlags: DWORD) : HResult; stdcall;
function GetSegmentState(out ppSegmentState: IDirectMusicSegmentState;
mtTime: MUSIC_TIME) : HResult; stdcall;
function SetPrepareTime(dwMilliSeconds: DWORD) : HResult; stdcall;
function GetPrepareTime(var pdwMilliSeconds: DWORD) : HResult; stdcall;
function SetBumperLength(dwMilliSeconds: DWORD) : HResult; stdcall;
function GetBumperLength(var pdwMilliSeconds: DWORD) : HResult; stdcall;
function SendPMsg(const pPMSG: TDMUS_PMSG) : HResult; stdcall;
function MusicToReferenceTime(mtTime: MUSIC_TIME;
var prtTime: TREFERENCE_TIME) : HResult; stdcall;
function ReferenceToMusicTime(rtTime: TREFERENCE_TIME;
var pmtTime: MUSIC_TIME) : HResult; stdcall;
function IsPlaying(pSegment: IDirectMusicSegment;
pSegState: IDirectMusicSegmentState) : HResult; stdcall;
function GetTime(var prtNow: TREFERENCE_TIME;
var pmtNow: MUSIC_TIME) : HResult; stdcall;
function AllocPMsg(cb: Cardinal;
var ppPMSG: TDMUS_PMSG) : HResult; stdcall;
function FreePMsg(const pPMSG: TDMUS_PMSG) : HResult; stdcall;
function GetGraph(out ppGraph: IDirectMusicGraph) : HResult; stdcall;
function SetGraph(pGraph: IDirectMusicGraph) : HResult; stdcall;
function SetNotificationHandle(hNotification: THandle;
rtMinimum: TREFERENCE_TIME) : HResult; stdcall;
function GetNotificationPMsg(var ppNotificationPMsg: PDMUS_NOTIFICATION_PMSG) : HResult; stdcall;
function AddNotificationType(const rguidNotificationType: TGUID) : HResult; stdcall;
function RemoveNotificationType(const rguidNotificationType: TGUID) : HResult; stdcall;
function AddPort(pPort: IDirectMusicPort) : HResult; stdcall;
function RemovePort(pPort: IDirectMusicPort) : HResult; stdcall;
function AssignPChannelBlock(dwBlockNum: DWORD;
pPort: IDirectMusicPort;
dwGroup: DWORD) : HResult; stdcall;
function AssignPChannel(dwPChannel: DWORD;
pPort: IDirectMusicPort;
dwGroup: DWORD;
dwMChannel: DWORD) : HResult; stdcall;
function PChannelInfo(dwPChannel: DWORD;
out ppPort: IDirectMusicPort;
var pdwGroup: DWORD;
var pdwMChannel: DWORD) : HResult; stdcall;
function DownloadInstrument(pInst: IDirectMusicInstrument;
dwPChannel: DWORD;
out ppDownInst: IDirectMusicDownloadedInstrument;
const pNoteRanges;
dwNumNoteRanges: DWORD;
out ppPort: IDirectMusicPort;
var pdwGroup: DWORD;
var pdwMChannel: DWORD) : HResult; stdcall;
function Invalidate(mtTime: MUSIC_TIME;
dwFlags: DWORD) : HResult; stdcall;
function GetParam(const rguidType: TGUID;
dwGroupBits: DWORD;
dwIndex: DWORD;
mtTime: MUSIC_TIME;
var pmtNext: MUSIC_TIME;
var pParam) : HResult; stdcall;
function SetParam(const rguidType: TGUID;
dwGroupBits: DWORD;
dwIndex: DWORD;
mtTime: MUSIC_TIME;
pParam: Pointer) : HResult; stdcall;
function GetGlobalParam(const rguidType: TGUID;
var pParam;
dwSize: DWORD) : HResult; stdcall;
function SetGlobalParam(const rguidType: TGUID;
const pParam;
dwSize: DWORD) : HResult; stdcall;
function GetLatencyTime(var prtTime: TREFERENCE_TIME) : HResult; stdcall;
function GetQueueTime(var prtTime: TREFERENCE_TIME) : HResult; stdcall;
function AdjustTime(rtAmount: TREFERENCE_TIME) : HResult; stdcall;
function CloseDown : HResult; stdcall;
function GetResolvedTime(rtTime: TREFERENCE_TIME;
var prtResolved: TREFERENCE_TIME;
dwTimeResolveFlags: DWORD) : HResult; stdcall;
function MIDIToMusic(bMIDIValue: Byte;
const pChord: TDMUS_CHORD_KEY;
bPlayMode: Byte;
bChordLevel: Byte;
var pwMusicValue: Word) : HResult; stdcall;
function MusicToMIDI(wMusicValue: Word;
const pChord: TDMUS_CHORD_KEY;
bPlayMode: Byte;
bChordLevel: Byte;
var pbMIDIValue: Byte) : HResult; stdcall;
function TimeToRhythm(mtTime: MUSIC_TIME;
const pTimeSig: TDMUS_TIMESIGNATURE;
var pwMeasure: Word;
var pbBeat: Byte;
var pbGrid: Byte;
var pnOffset: Smallint) : HResult; stdcall;
function RhythmToTime(wMeasure: Word;
bBeat: Byte;
bGrid: Byte;
nOffset: Smallint;
const pTimeSig: TDMUS_TIMESIGNATURE;
var pmtTime: MUSIC_TIME) : HResult; stdcall;
end;
 
TDMus_IO_Curve_Item = packed record
mtStart: TMusic_Time;
mtDuration: TMusic_Time;
mtResetDuration: TMusic_Time;
dwPChannel: DWORD;
nOffset: SmallInt;
nStartValue: SmallInt;
nEndValue: SmallInt;
nResetValue: SmallInt;
bType: BYTE;
bCurveShape: BYTE;
bCCData: BYTE;
bFlags: BYTE;
end;
{ IDirectMusicTool }
 
TDMus_IO_Tempo_Item = packed record
lTime: TMusic_Time;
dblTempo: double;
IDirectMusicTool = interface(IUnknown)
['{D2AC28BA-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicTool
function Init(pGraph: IDirectMusicGraph) : HResult; stdcall;
function GetMsgDeliveryType(var pdwDeliveryType: DWORD) : HResult; stdcall;
function GetMediaTypeArraySize(var pdwNumElements: DWORD) : HResult; stdcall;
function GetMediaTypes(var padwMediaTypes;
dwNumElements: DWORD) : HResult; stdcall;
function ProcessPMsg(pPerf: IDirectMusicPerformance;
const pPMSG: TDMUS_PMSG) : HResult; stdcall;
function Flush(pPerf: IDirectMusicPerformance;
const pPMSG: TDMUS_PMSG;
rtTime: TREFERENCE_TIME) : HResult; stdcall;
end;
 
TDMus_IO_SysEx_Item = packed record
mtTime: TMusic_Time;
dwPChannel: DWORD;
dwSysExLength: DWORD;
end;
{ IDirectMusicGraph }
 
TDMus_IO_TimeSignature_Item = packed record
lTime: TMusic_Time;
bBeatsPerMeasure: BYTE; (* beats per measure (top of time sig) *)
bBeat: BYTE; (* what note receives the beat (bottom of time sig.) *)
(* we can assume that 0 means 256th note *)
wGridsPerBeat: WORD; (* grids per beat *)
IDirectMusicGraph = interface(IUnknown)
['{2BEFC277-5497-11D2-BCCB-00A0C922E6EB}']
// IDirectMusicGraph
function StampPMsg(const pPMSG: TDMUS_PMSG) : HResult; stdcall;
function InsertTool(pTool: IDirectMusicTool;
const pdwPChannels;
cPChannels: DWORD;
lIndex: Longint) : HResult; stdcall;
function GetTool(dwIndex: DWORD;
out ppTool: IDirectMusicTool) : HResult; stdcall;
function RemoveTool(pTool: IDirectMusicTool) : HResult; stdcall;
end;
 
(* PARAM structures, used by GetParam() and SetParam() *)
TDMus_Command_Param = packed record
bCommand: BYTE;
bGrooveLevel: BYTE;
bGrooveRange: BYTE;
end;
{ IDirectMusicStyle }
 
TDMus_Command_Param_2 = packed record
mtTime : TMusic_Time;
bCommand: BYTE;
bGrooveLevel: BYTE;
bGrooveRange: BYTE;
IDirectMusicStyle = interface(IUnknown)
['{D2AC28BD-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicStyle
function GetBand(pwszName: PWCHAR;
out ppBand: IDirectMusicBand) : HResult; stdcall;
function EnumBand(dwIndex: DWORD;
pwszName: PWCHAR) : HResult; stdcall;
function GetDefaultBand(out ppBand: IDirectMusicBand) : HResult; stdcall;
function EnumMotif(dwIndex: DWORD;
pwszName: PWCHAR) : HResult; stdcall;
function GetMotif(pwszName: PWCHAR;
out ppSegment: IDirectMusicSegment) : HResult; stdcall;
function GetDefaultChordMap(out ppChordMap: IDirectMusicChordMap) : HResult; stdcall;
function EnumChordMap(dwIndex: DWORD;
pwszName: PWCHAR) : HResult; stdcall;
function GetChordMap(pwszName: PWCHAR;
out ppChordMap: IDirectMusicChordMap) : HResult; stdcall;
function GetTimeSignature(var pTimeSig: TDMUS_TIMESIGNATURE) : HResult; stdcall;
function GetEmbellishmentLength(dwType: DWORD;
dwLevel: DWORD;
var pdwMin: DWORD;
var pdwMax: DWORD) : HResult; stdcall;
function GetTempo(var pTempo: Double) : HResult; stdcall;
end;
 
TDMus_Chord_Param = TDMus_Chord_Key; (* DMUS_CHORD_KEY defined in dmusici.h *)
{ IDirectMusicChordMap }
 
TDMus_Rhythm_Param = packed record
TimeSig: TDMus_TimeSignature;
dwRhythmPattern: DWORD;
IDirectMusicChordMap = interface(IUnknown)
['{D2AC28BE-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicChordMap
function GetScale(var pdwScale: DWORD) : HResult; stdcall;
end;
 
TDMus_Tempo_Param = packed record
mtTime: TMusic_Time;
dblTempo: double;
end;
{ IDirectMusicComposer }
 
TDMus_Mute_Param = packed record
dwPChannel: DWORD;
dwPChannelMap: DWORD;
fMute: BOOL;
IDirectMusicComposer = interface(IUnknown)
['{D2AC28BF-B39B-11D1-8704-00600893B1BD}']
// IDirectMusicComposer
function ComposeSegmentFromTemplate(pStyle: IDirectMusicStyle;
pTempSeg: IDirectMusicSegment;
wActivity: Word;
pChordMap: IDirectMusicChordMap;
out ppSectionSeg: IDirectMusicSegment) : HResult; stdcall;
function ComposeSegmentFromShape(pStyle: IDirectMusicStyle;
wNumMeasures: Word;
wShape: Word;
wActivity: Word;
fIntro: BOOL;
fEnd: BOOL;
pChordMap: IDirectMusicChordMap;
out ppSectionSeg: IDirectMusicSegment) : HResult; stdcall;
function ComposeTransition(pFromSeg: IDirectMusicSegment;
pToSeg: IDirectMusicSegment;
mtTime: MUSIC_TIME;
wCommand: Word;
dwFlags: DWORD;
pChordMap: IDirectMusicChordMap;
out ppSectionSeg: IDirectMusicSegment) : HResult; stdcall;
function AutoTransition(pPerformance: IDirectMusicPerformance;
pToSeg: IDirectMusicSegment;
wCommand: Word;
dwFlags: DWORD;
pChordMap: IDirectMusicChordMap;
out ppTransSeg: IDirectMusicSegment;
out ppToSegState: IDirectMusicSegmentState;
out ppTransSegState: IDirectMusicSegmentState) : HResult; stdcall;
function ComposeTemplateFromShape(wNumMeasures: Word;
wShape: Word;
fIntro: BOOL;
fEnd: BOOL;
wEndLength: Word;
out ppTempSeg: IDirectMusicSegment) : HResult; stdcall;
function ChangeChordMap(pSectionSeg: IDirectMusicSegment;
fTrackScale: BOOL;
pChordMap: IDirectMusicChordMap) : HResult; stdcall;
end;
 
const
(* Style chunks *)
// CLSID's
CLSID_DirectMusicPerformance : TGUID = '{D2AC2881-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicSegment : TGUID = '{D2AC2882-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicSegmentState : TGUID = '{D2AC2883-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicGraph : TGUID = '{D2AC2884-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicTempoTrack : TGUID = '{D2AC2885-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicSeqTrack : TGUID = '{D2AC2886-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicSysExTrack : TGUID = '{D2AC2887-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicTimeSigTrack : TGUID = '{D2AC2888-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicStyle : TGUID = '{D2AC288A-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicChordTrack : TGUID = '{D2AC288B-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicCommandTrack : TGUID = '{D2AC288C-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicStyleTrack : TGUID = '{D2AC288D-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicMotifTrack : TGUID = '{D2AC288E-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicChordMap : TGUID = '{D2AC288F-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicComposer : TGUID = '{D2AC2890-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicSignPostTrack: TGUID = '{F17E8672-C3B4-11D1-870B-00600893B1BD}';
CLSID_DirectMusicLoader : TGUID = '{D2AC2892-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicBandTrack : TGUID = '{D2AC2894-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicBand : TGUID = '{79BA9E00-B6EE-11D1-86BE-00C04FBF8FEF}';
CLSID_DirectMusicChordMapTrack: TGUID = '{D2AC2896-B39B-11D1-8704-00600893B1BD}';
CLSID_DirectMusicMuteTrack : TGUID = '{D2AC2898-B39B-11D1-8704-00600893B1BD}';
 
DMUS_FOURCC_STYLE_FORM : mmioFOURCC = ('D','M','S','T');
DMUS_FOURCC_STYLE_CHUNK : mmioFOURCC = ('s','t','y','h');
DMUS_FOURCC_PART_LIST : mmioFOURCC = ('p','a','r','t');
DMUS_FOURCC_PART_CHUNK : mmioFOURCC = ('p','r','t','h');
DMUS_FOURCC_NOTE_CHUNK : mmioFOURCC = ('n','o','t','e');
DMUS_FOURCC_CURVE_CHUNK : mmioFOURCC = ('c','r','v','e');
DMUS_FOURCC_PATTERN_LIST : mmioFOURCC = ('p','t','t','n');
DMUS_FOURCC_PATTERN_CHUNK : mmioFOURCC = ('p','t','n','h');
DMUS_FOURCC_RHYTHM_CHUNK : mmioFOURCC = ('r','h','t','m');
DMUS_FOURCC_PARTREF_LIST : mmioFOURCC = ('p','r','e','f');
DMUS_FOURCC_PARTREF_CHUNK : mmioFOURCC = ('p','r','f','c');
DMUS_FOURCC_STYLE_PERS_REF_LIST : mmioFOURCC = ('p', 'r', 'r', 'f');
DMUS_FOURCC_MOTIFSETTINGS_CHUNK : mmioFOURCC = ('m', 't', 'f', 's');
// Special GUID for all object types. This is used by the loader.
GUID_DirectMusicAllTypes : TGUID = '{D2AC2893-B39B-11D1-8704-00600893B1BD}';
 
(* Flags used by variations: these make up the DWORDs in dwVariationChoices. *)
// Notification guids
GUID_NOTIFICATION_SEGMENT : TGUID = '{D2AC2899-B39B-11D1-8704-00600893B1BD}';
GUID_NOTIFICATION_PERFORMANCE : TGUID = '{81F75BC5-4E5D-11D2-BCC7-00A0C922E6EB}';
GUID_NOTIFICATION_MEASUREANDBEAT: TGUID = '{D2AC289A-B39B-11D1-8704-00600893B1BD}';
GUID_NOTIFICATION_CHORD : TGUID = '{D2AC289B-B39B-11D1-8704-00600893B1BD}';
GUID_NOTIFICATION_COMMAND : TGUID = '{D2AC289C-B39B-11D1-8704-00600893B1BD}';
 
(* These flags determine the types of chords supported by a given variation in DirectMusic *)
(* mode. The first seven flags (bits 1-7) are set if the variation supports major chords *)
(* rooted in scale positions, so, e.g., if bits 1, 2, and 4 are set, the variation *)
(* supports major chords rooted in the tonic, second, and fourth scale positions. The *)
(* next seven flags serve the same purpose, but for minor chords, and the following seven *)
(* flags serve the same purpose for chords that are not major or minor (e.g., SUS 4 *)
(* chords). Bits 22, 23, and 24 are set if the variation supports chords rooted in the *)
(* scale, chords rooted sharp of scale tones, and chords rooted flat of scale tones, *)
(* respectively. For example, to support a C# minor chord in the scale of C Major, *)
(* bits 8 (for tonic minor) and 24 (for sharp) need to be set. Bits 25, 26, an 27 handle *)
(* chords that are triads, 6th or 7th chords, and chords with extensions, respectively. *)
(* bits 28 and 29 handle chords that are followed by tonic and dominant chords, *)
(* respectively. *)
DMUS_VARIATIONF_MAJOR = $0000007F; (* Seven positions in the scale - major chords. *)
DMUS_VARIATIONF_MINOR = $00003F80; (* Seven positions in the scale - minor chords. *)
DMUS_VARIATIONF_OTHER = $001FC000; (* Seven positions in the scale - other chords. *)
DMUS_VARIATIONF_ROOT_SCALE = $00200000; (* Handles chord roots in the scale. *)
DMUS_VARIATIONF_ROOT_FLAT = $00400000; (* Handles flat chord roots (based on scale notes). *)
DMUS_VARIATIONF_ROOT_SHARP = $00800000; (* Handles sharp chord roots (based on scale notes). *)
DMUS_VARIATIONF_TYPE_TRIAD = $01000000; (* Handles simple chords - triads. *)
DMUS_VARIATIONF_TYPE_6AND7 = $02000000; (* Handles simple chords - 6 and 7. *)
DMUS_VARIATIONF_TYPE_COMPLEX = $04000000; (* Handles complex chords. *)
DMUS_VARIATIONF_DEST_TO1 = $08000000; (* Handles transitions to 1 chord. *)
DMUS_VARIATIONF_DEST_TO5 = $10000000; (* Handles transitions to 5 chord. *)
// Track param type guids
// Use to get/set a DMUS_COMMAND_PARAM param in the Command track
GUID_CommandParam : TGUID = '{D2AC289D-B39B-11D1-8704-00600893B1BD}';
 
(* The top three bits of the variation flags are the Mode bits. If all are 0, it's IMA. *)
(* If the smallest is 1, it's Direct Music. *)
DMUS_VARIATIONF_MODES = $E0000000;
DMUS_VARIATIONF_IMA25_MODE = $00000000;
DMUS_VARIATIONF_DMUS_MODE = $20000000;
// Use to get/set a DMUS_CHORD_PARAM param in the Chord track
GUID_ChordParam : TGUID = '{D2AC289E-B39B-11D1-8704-00600893B1BD}';
 
//#pragma pack(2)
// Use to get a DMUS_RHYTHM_PARAM param in the Chord track
GUID_RhythmParam : TGUID = '{D2AC289F-B39B-11D1-8704-00600893B1BD}';
 
type BYTE2 = Word;
// Use to get/set an IDirectMusicStyle param in the Style track
GUID_IDirectMusicStyle : TGUID = '{D2AC28A1-B39B-11D1-8704-00600893B1BD}';
 
type
TDMus_IO_TimeSig = packed record
(* Time signatures define how many beats per measure, which note receives *)
(* the beat, and the grid resolution. *)
bBeatsPerMeasure: BYTE2; (* beats per measure (top of time sig) *)
bBeat: BYTE2; (* what note receives the beat (bottom of time sig.) *)
(* we can assume that 0 means 256th note *)
wGridsPerBeat: WORD; (* grids per beat *)
end;
// Use to get a DMUS_TIMESIGNATURE param in the Style and TimeSig tracks
GUID_TimeSignature : TGUID = '{D2AC28A4-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_Style = packed record
timeSig: TDMus_IO_TimeSig; (* Styles have a default Time Signature *)
dblTempo: double;
end;
// Use to get/set a DMUS_TEMPO_PARAM param in the Tempo track
GUID_TempoParam : TGUID = '{D2AC28A5-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_Version = packed record
dwVersionMS: DWORD; (* Version # high-order 32 bits *)
dwVersionLS: DWORD; (* Version # low-order 32 bits *)
end;
// Use to set an IDirectMusicBand param in the Band track
GUID_IDirectMusicBand : TGUID = '{D2AC28AC-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_Pattern = packed record
timeSig: TDMus_IO_TimeSig; (* Patterns can override the Style's Time sig. *)
bGrooveBottom: BYTE2; (* bottom of groove range *)
bGrooveTop: BYTE2; (* top of groove range *)
wEmbellishment: WORD; (* Fill, Break, Intro, End, Normal, Motif *)
wNbrMeasures: WORD; (* length in measures *)
end;
// Use to get/set an IDirectMusicChordMap param in the ChordMap track
GUID_IDirectMusicChordMap : TGUID = '{D2AC28AD-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_StylePart = packed record
timeSig: TDMus_IO_TimeSig; (* can override pattern's *)
dwVariationChoices: array [0..31] of DWORD; (* MOAW choice bitfield *)
guidPartID: TGUID; (* identifies the part *)
wNbrMeasures: WORD; (* length of the Part *)
bPlayModeFlags: BYTE2; (* see PLAYMODE flags *)
bInvertUpper: BYTE2; (* inversion upper limit *)
bInvertLower: BYTE2; (* inversion lower limit *)
end;
// Use to get/set a DMUS_MUTE_PARAM param in the Mute track
GUID_MuteParam : TGUID = '{D2AC28AF-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_PartRef = packed record
guidPartID: TGUID; (* unique ID for matching up with parts *)
wLogicalPartID: WORD; (* corresponds to port/device/midi channel *)
bVariationLockID: BYTE2; (* parts with the same ID lock variations. *)
(* high bit is used to identify master Part *)
bSubChordLevel: BYTE2; (* tells which sub chord level this part wants *)
bPriority: BYTE2; (* 256 priority levels. Parts with lower priority *)
(* aren't played first when a device runs out of *)
(* notes *)
bRandomVariation: BYTE2; (* when set, matching variations play in random order *)
(* when clear, matching variations play sequentially *)
end;
// These guids are used in IDirectMusicSegment::SetParam to tell the band track to perform various actions.
///
/// Download bands for the IDirectMusicSegment
GUID_Download : TGUID = '{D2AC28A7-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_StyleNote = packed record
mtGridStart: TMusic_Time ;(* when this note occurs *)
dwVariation: DWORD; (* variation bits *)
mtDuration: TMusic_Time; (* how long this note lasts *)
nTimeOffset: SmallInt; (* offset from mtGridStart *)
wMusicValue: WORD; (* Position in scale. *)
bVelocity: BYTE2; (* Note velocity. *)
bTimeRange: BYTE2; (* Range to randomize start time. *)
bDurRange: BYTE2; (* Range to randomize duration. *)
bVelRange: BYTE2; (* Range to randomize velocity. *)
bInversionID: BYTE2; (* Identifies inversion group to which this note belongs *)
bPlayModeFlags: BYTE2; (* Can override part *)
end;
// Unload bands for the IDirectMusicSegment
GUID_Unload : TGUID = '{D2AC28A8-B39B-11D1-8704-00600893B1BD}';
 
TDMus_IO_StyleCurve = packed record
mtGridStart: TMusic_Time; (* when this curve occurs *)
dwVariation: DWORD; (* variation bits *)
mtDuration: TMusic_Time; (* how long this curve lasts *)
mtResetDuration: TMusic_Time; (* how long after the end of the curve to reset the curve *)
nTimeOffset: SmallInt; (* offset from mtGridStart *)
nStartValue: SmallInt; (* curve's start value *)
nEndValue: SmallInt; (* curve's end value *)
nResetValue: SmallInt; (* the value to which to reset the curve *)
bEventType: BYTE2; (* type of curve *)
bCurveShape: BYTE2; (* shape of curve *)
bCCData: BYTE2; (* CC# *)
bFlags: BYTE2; (* Bit 1=TRUE means to send nResetValue. Otherwise, don't.
Other bits are reserved. *)
end;
// Connect segment's bands to an IDirectMusicCollection
GUID_ConnectToDLSCollection : TGUID = '{1DB1AE6B-E92E-11D1-A8C5-00C04FA3726E}';
 
TDMus_IO_MotifSettings = packed record
dwRepeats: DWORD; (* Number of repeats. By default, 0. *)
mtPlayStart: TMusic_Time; (* Start of playback. By default, 0. *)
mtLoopStart: TMusic_Time; (* Start of looping portion. By default, 0. *)
mtLoopEnd: TMusic_Time; (* End of loop. Must be greater than mtLoopStart. By default equal to length of motif. *)
dwResolution: DWORD; (* Default resolution. *)
end;
// Enable/disable autodownloading of bands
GUID_Enable_Auto_Download : TGUID = '{D2AC28A9-B39B-11D1-8704-00600893B1BD}';
GUID_Disable_Auto_Download : TGUID = '{D2AC28AA-B39B-11D1-8704-00600893B1BD}';
 
//#pragma pack()
// Clear all bands
GUID_Clear_All_Bands : TGUID = '{D2AC28AB-B39B-11D1-8704-00600893B1BD}';
 
(*
RIFF
(
'DMST' // Style
<styh-ck> // Style header chunk
<guid-ck> // Every Style has a GUID
[<UNFO-list>] // Name, author, copyright info., comments
[<vers-ck>] // version chunk
<part-list>... // List of parts in the Style, used by patterns
<pttn-list>... // List of patterns in the Style
<DMBD-form>... // List of bands in the Style
[<motf-list>] // List of motifs in the Style
[<prrf-list>] // List of chord map references in the Style
)
// Set segment to manage all program changes, bank selects, etc. for simple playback of a standard MIDI file
GUID_StandardMIDIFile : TGUID = '{06621075-E92E-11D1-A8C5-00C04FA3726E}';
// For compatibility with beta releases...
GUID_IgnoreBankSelectForGM : TGUID = '{06621075-E92E-11D1-A8C5-00C04FA3726E}'; //same as GUID_StandardMIDIFile;
 
// <styh-ck>
styh
(
<DMUS_IO_STYLE>
)
// Disable/enable param guids. Use these in SetParam calls to disable or enable sending
// specific PMsg types.
///
GUID_DisableTimeSig : TGUID = '{45FC707B-1DB4-11D2-BCAC-00A0C922E6EB}';
GUID_EnableTimeSig : TGUID = '{45FC707C-1DB4-11D2-BCAC-00A0C922E6EB}';
GUID_DisableTempo : TGUID = '{45FC707D-1DB4-11D2-BCAC-00A0C922E6EB}';
GUID_EnableTempo : TGUID = '{45FC707E-1DB4-11D2-BCAC-00A0C922E6EB}';
 
// <guid-ck>
guid
(
<GUID>
)
// Global data guids
GUID_PerfMasterTempo : TGUID = '{D2AC28B0-B39B-11D1-8704-00600893B1BD}';
GUID_PerfMasterVolume : TGUID = '{D2AC28B1-B39B-11D1-8704-00600893B1BD}';
GUID_PerfMasterGrooveLevel : TGUID = '{D2AC28B2-B39B-11D1-8704-00600893B1BD}';
GUID_PerfAutoDownload : TGUID = '{FB09565B-3631-11D2-BCB8-00A0C922E6EB}';
 
// <vers-ck>
vers
(
<DMUS_IO_VERSION>
)
// GUID for default GM/GS dls collection.
GUID_DefaultGMCollection : TGUID = '{F17E8673-C3B4-11D1-870B-00600893B1BD}';
 
// <part-list>
LIST
(
'part'
<prth-ck> // Part header chunk
[<UNFO-list>]
[<note-ck>] // List of notes in Part
[<crve-ck>] // List of curves in Part
)
// IID's
IID_IDirectMusicLoader : TGUID = '{2FFAACA2-5DCA-11D2-AFA6-00AA0024D8B6}';
IID_IDirectMusicGetLoader : TGUID = '{68A04844-D13D-11D1-AFA6-00AA0024D8B6}';
IID_IDirectMusicObject : TGUID = '{D2AC28B5-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicSegment : TGUID = '{F96029A2-4282-11D2-8717-00600893B1BD}';
IID_IDirectMusicSegmentState : TGUID = '{A3AFDCC7-D3EE-11D1-BC8D-00A0C922E6EB}';
IID_IDirectMusicTrack : TGUID = '{F96029A1-4282-11D2-8717-00600893B1BD}';
IID_IDirectMusicPerformance : TGUID = '{07D43D03-6523-11D2-871D-00600893B1BD}';
IID_IDirectMusicTool : TGUID = '{D2AC28BA-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicGraph : TGUID = '{2BEFC277-5497-11D2-BCCB-00A0C922E6EB}';
IID_IDirectMusicStyle : TGUID = '{D2AC28BD-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicChordMap : TGUID = '{D2AC28BE-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicComposer : TGUID = '{D2AC28BF-B39B-11D1-8704-00600893B1BD}';
IID_IDirectMusicBand : TGUID = '{D2AC28C0-B39B-11D1-8704-00600893B1BD}';
 
// <orth-ck>
prth
(
<DMUS_IO_STYLEPART>
)
// Alternate interface IDs, available in DX7 release and after.
IID_IDirectMusicPerformance2 : TGUID = '{6FC2CAE0-BC78-11D2-AFA6-00AA0024D8B6}';
IID_IDirectMusicSegment2 : TGUID = '{D38894D1-C052-11D2-872F-00600893B1BD}';
 
// <note-ck>
'note'
(
// sizeof DMUS_IO_STYLENOTE:DWORD
<DMUS_IO_STYLENOTE>...
)
 
// <crve-ck>
'crve'
(
// sizeof DMUS_IO_STYLECURVE:DWORD
<DMUS_IO_STYLECURVE>...
)
//***********************************************************************
// *
// dmusicf.h -- This module defines the DirectMusic file formats *
// *
// Copyright (c) 1998, Microsoft Corp. All rights reserved. *
// *
//**********************************************************************
// Common chunks
const
DMUS_FOURCC_GUID_CHUNK = Ord('g') + Ord('u') shl 8 + Ord('i') shl 16 + Ord('d') shl 24;
DMUS_FOURCC_INFO_LIST = Ord('I') + Ord('N') shl 8 + Ord('F') shl 16 + Ord('O') shl 24;
DMUS_FOURCC_UNFO_LIST = Ord('U') + Ord('N') shl 8 + Ord('F') shl 16 + Ord('O') shl 24;
DMUS_FOURCC_UNAM_CHUNK = Ord('U') + Ord('N') shl 8 + Ord('A') shl 16 + Ord('M') shl 24;
DMUS_FOURCC_UART_CHUNK = Ord('U') + Ord('A') shl 8 + Ord('R') shl 16 + Ord('T') shl 24;
DMUS_FOURCC_UCOP_CHUNK = Ord('U') + Ord('C') shl 8 + Ord('O') shl 16 + Ord('P') shl 24;
DMUS_FOURCC_USBJ_CHUNK = Ord('U') + Ord('S') shl 8 + Ord('B') shl 16 + Ord('J') shl 24;
DMUS_FOURCC_UCMT_CHUNK = Ord('U') + Ord('C') shl 8 + Ord('M') shl 16 + Ord('T') shl 24;
DMUS_FOURCC_CATEGORY_CHUNK = Ord('c') + Ord('a') shl 8 + Ord('t') shl 16 + Ord('g') shl 24;
DMUS_FOURCC_VERSION_CHUNK = Ord('v') + Ord('e') shl 8 + Ord('r') shl 16 + Ord('s') shl 24;
 
// <pttn-list>
LIST
(
'pttn'
<ptnh-ck> // Pattern header chunk
<rhtm-ck> // List of rhythms for chord matching
[<UNFO-list>]
[<mtfs-ck>] // Motif settings chunk
<pref-list>... // List of part reference id's
)
// The following structures are used by the Tracks, and are the packed structures
// that are passed to the Tracks inside the IStream.
 
// <ptnh-ck>
ptnh
(
<DMUS_IO_PATTERN>
)
type
TDMUS_IO_SEQ_ITEM = record
mtTime : MUSIC_TIME;
mtDuration : MUSIC_TIME;
dwPChannel : DWORD;
nOffset : Smallint;
bStatus : Byte;
bByte1 : Byte;
bByte2 : Byte;
end;
DMUS_IO_SEQ_ITEM = TDMUS_IO_SEQ_ITEM;
 
// <rhtm-ck>
'rhtm'
(
// DWORD's representing rhythms for chord matching based on number
// of measures in the pattern
)
 
// pref-list
LIST
(
'pref'
<prfc-ck> // part ref chunk
)
TDMUS_IO_CURVE_ITEM = record
mtStart : MUSIC_TIME;
mtDuration : MUSIC_TIME;
mtResetDuration : MUSIC_TIME;
dwPChannel : DWORD;
nOffset : Smallint;
nStartValue : Smallint;
nEndValue : Smallint;
nResetValue : Smallint;
bType : Byte;
bCurveShape : Byte;
bCCData : Byte;
bFlags : Byte;
end;
DMUS_IO_CURVE_ITEM = TDMUS_IO_CURVE_ITEM;
 
// <prfc-ck>
prfc
(
<DMUS_IO_PARTREF>
)
 
// <mtfs-ck>
mtfs
(
<DMUS_IO_MOTIFSETTINGS>
)
TDMUS_IO_TEMPO_ITEM = record
lTime : MUSIC_TIME;
dblTempo : Double;
end;
DMUS_IO_TEMPO_ITEM = TDMUS_IO_TEMPO_ITEM;
 
// <prrf-list>
LIST
(
'prrf'
// some number of <DMRF>
)
*)
 
(* Chord and command file formats *)
const
DMUS_FOURCC_CHORDTRACK_LIST : mmioFOURCC = ('c','o','r','d');
DMUS_FOURCC_CHORDTRACKHEADER_CHUNK : mmioFOURCC = ('c','r','d','h');
DMUS_FOURCC_CHORDTRACKBODY_CHUNK : mmioFOURCC = ('c','r','d','b');
TDMUS_IO_SYSEX_ITEM = record
mtTime : MUSIC_TIME;
dwPChannel : DWORD;
dwSysExLength : DWORD;
end;
DMUS_IO_SYSEX_ITEM = TDMUS_IO_SYSEX_ITEM;
 
DMUS_FOURCC_COMMANDTRACK_CHUNK : mmioFOURCC = ('c','m','n','d');
 
type
TDMus_IO_Chord = packed record
wszName: array [0..15] of WCHAR; (* Name of the chord *)
mtTime: TMusic_Time; (* Time of this chord *)
wMeasure: WORD; (* Measure this falls on *)
bBeat: BYTE; (* Beat this falls on *)
TDMUS_IO_TIMESIGNATURE_ITEM = record
lTime : MUSIC_TIME;
bBeatsPerMeasure : Byte; // beats per measure (top of time sig)
bBeat : Byte; // what note receives the beat (bottom of time sig.)
// we can assume that 0 means 256th note
wGridsPerBeat : Word; // grids per beat
end;
DMUS_IO_TIMESIGNATURE_ITEM = TDMUS_IO_TIMESIGNATURE_ITEM;
 
TDMus_IO_SubChord = packed record
dwChordPattern: DWORD; (* Notes in the subchord *)
dwScalePattern: DWORD; (* Notes in the scale *)
dwInversionPoints: DWORD; (* Where inversions can occur *)
dwLevels: DWORD; (* Which levels are supported by this subchord *)
bChordRoot: BYTE; (* Root of the subchord *)
bScaleRoot: BYTE; (* Root of the scale *)
// PARAM structures, used by GetParam() and SetParam()
TDMUS_COMMAND_PARAM = record
bCommand : Byte;
bGrooveLevel : Byte;
bGrooveRange : Byte;
end;
DMUS_COMMAND_PARAM = TDMUS_COMMAND_PARAM;
 
TDMus_IO_Command = packed record
mtTime: TMusic_Time; (* Time of this command *)
wMeasure: WORD; (* Measure this falls on *)
bBeat: BYTE; (* Beat this falls on *)
bCommand: BYTE; (* Command type (see #defines below) *)
bGrooveLevel: BYTE; (* Groove level (0 if command is not a groove) *)
bGrooveRange: BYTE; (* Groove range *)
//DMUS_CHORD_KEY = DMUS_CHORD_PARAM; // DMUS_CHORD_KEY defined in dmusici.h
 
TDMUS_RHYTHM_PARAM = record
TimeSig : TDMUS_TIMESIGNATURE;
dwRhythmPattern : DWORD;
end;
DMUS_RHYTHM_PARAM = TDMUS_RHYTHM_PARAM;
 
(*
TDMUS_TEMPO_PARAM = record
mtTime : MUSIC_TIME;
dblTempo : Double;
end;
DMUS_TEMPO_PARAM = TDMUS_TEMPO_PARAM;
 
// <cord-list>
LIST
(
'cord'
<crdh-ck>
<crdb-ck> // Chord body chunk
)
 
// <crdh-ck>
crdh
(
// Scale: dword (upper 8 bits for root, lower 24 for scale)
)
TDMUS_MUTE_PARAM = record
dwPChannel : DWORD;
dwPChannelMap : DWORD;
fMute : BOOL;
end;
DMUS_MUTE_PARAM = TDMUS_MUTE_PARAM;
 
// <crdb-ck>
crdb
(
// sizeof DMUS_IO_CHORD:dword
<DMUS_IO_CHORD>
// # of DMUS_IO_SUBCHORDS:dword
// sizeof DMUS_IO_SUBCHORDS:dword
// a number of <DMUS_IO_SUBCHORD>
)
const
// Style chunks
 
DMUS_FOURCC_STYLE_FORM = Ord('D') + Ord('M') shl 8 + Ord('S') shl 16 + Ord('T') shl 24;
DMUS_FOURCC_STYLE_CHUNK = Ord('s') + Ord('t') shl 8 + Ord('y') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_PART_LIST = Ord('p') + Ord('a') shl 8 + Ord('r') shl 16 + Ord('t') shl 24;
DMUS_FOURCC_PART_CHUNK = Ord('p') + Ord('r') shl 8 + Ord('t') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_NOTE_CHUNK = Ord('n') + Ord('o') shl 8 + Ord('t') shl 16 + Ord('e') shl 24;
DMUS_FOURCC_CURVE_CHUNK = Ord('c') + Ord('r') shl 8 + Ord('v') shl 16 + Ord('e') shl 24;
DMUS_FOURCC_PATTERN_LIST = Ord('p') + Ord('t') shl 8 + Ord('t') shl 16 + Ord('n') shl 24;
DMUS_FOURCC_PATTERN_CHUNK = Ord('p') + Ord('t') shl 8 + Ord('n') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_RHYTHM_CHUNK = Ord('r') + Ord('h') shl 8 + Ord('t') shl 16 + Ord('m') shl 24;
DMUS_FOURCC_PARTREF_LIST = Ord('p') + Ord('r') shl 8 + Ord('e') shl 16 + Ord('f') shl 24;
DMUS_FOURCC_PARTREF_CHUNK = Ord('p') + Ord('r') shl 8 + Ord('f') shl 16 + Ord('c') shl 24;
DMUS_FOURCC_STYLE_PERS_REF_LIST = Ord('p') + Ord('r') shl 8 + Ord('r') shl 16 + Ord('f') shl 24;
DMUS_FOURCC_MOTIFSETTINGS_CHUNK = Ord('m') + Ord('t') shl 8 + Ord('f') shl 16 + Ord('s') shl 24;
 
// <cmnd-list>
'cmnd'
(
//sizeof DMUS_IO_COMMAND: DWORD
<DMUS_IO_COMMAND>...
)
// Flags used by variations: these make up the DWORDs in dwVariationChoices.
 
*)
// These flags determine the types of chords supported by a given variation in DirectMusic
// mode. The first seven flags (bits 1-7) are set if the variation supports major chords
// rooted in scale positions, so, e.g., if bits 1, 2, and 4 are set, the variation
// supports major chords rooted in the tonic, second, and fourth scale positions. The
// next seven flags serve the same purpose, but for minor chords, and the following seven
// flags serve the same purpose for chords that are not major or minor (e.g., SUS 4
// chords). Bits 22, 23, and 24 are set if the variation supports chords rooted in the
// scale, chords rooted sharp of scale tones, and chords rooted flat of scale tones,
// respectively. For example, to support a C# minor chord in the scale of C Major,
// bits 8 (for tonic minor) and 24 (for sharp) need to be set. Bits 25, 26, an 27 handle
// chords that are triads, 6th or 7th chords, and chords with extensions, respectively.
// bits 28 and 29 handle chords that are followed by tonic and dominant chords,
// respectively.
DMUS_VARIATIONF_MAJOR = $0000007F; // Seven positions in the scale - major chords.
DMUS_VARIATIONF_MINOR = $00003F80; // Seven positions in the scale - minor chords.
DMUS_VARIATIONF_OTHER = $001FC000; // Seven positions in the scale - other chords.
DMUS_VARIATIONF_ROOT_SCALE = $00200000; // Handles chord roots in the scale.
DMUS_VARIATIONF_ROOT_FLAT = $00400000; // Handles flat chord roots (based on scale notes).
DMUS_VARIATIONF_ROOT_SHARP = $00800000; // Handles sharp chord roots (based on scale notes).
DMUS_VARIATIONF_TYPE_TRIAD = $01000000; // Handles simple chords - triads.
DMUS_VARIATIONF_TYPE_6AND7 = $02000000; // Handles simple chords - 6 and 7.
DMUS_VARIATIONF_TYPE_COMPLEX= $04000000; // Handles complex chords.
DMUS_VARIATIONF_DEST_TO1 = $08000000; // Handles transitions to 1 chord.
DMUS_VARIATIONF_DEST_TO5 = $10000000; // Handles transitions to 5 chord.
 
(* File io for DirectMusic Tool and ToolGraph objects
*)
// The top three bits of the variation flags are the Mode bits. If all are 0, it's IMA.
// If the smallest is 1, it's Direct Music.
DMUS_VARIATIONF_MODES = $E0000000;
DMUS_VARIATIONF_IMA25_MODE = $00000000;
DMUS_VARIATIONF_DMUS_MODE = $20000000;
 
(* RIFF ids: *)
const
DMUS_FOURCC_TOOLGRAPH_FORM : mmioFOURCC = ('D','M','T','G');
DMUS_FOURCC_TOOL_LIST : mmioFOURCC = ('t','o','l','l');
DMUS_FOURCC_TOOL_FORM : mmioFOURCC = ('D','M','T','L');
DMUS_FOURCC_TOOL_CHUNK : mmioFOURCC = ('t','o','l','h');
 
(* io structures: *)
type
TDMus_IO_Tool_Header = packed record
guidClassID: TGUID; (* Class id of tool. *)
lIndex: LongInt; (* Position in graph. *)
cPChannels: DWORD; (* Number of items in channels array. *)
ckid: TFourCC; (* chunk ID of tool's data chunk if 0 fccType valid. *)
fccType: TFourCC; (* list type if NULL ckid valid. *)
dwPChannels: array [0..0] of DWORD; (* Array of PChannels, size determined by cPChannels. *)
TDMUS_IO_TIMESIG = record
// Time signatures define how many beats per measure, which note receives
// the beat, and the grid resolution.
bBeatsPerMeasure : Byte; // beats per measure (top of time sig)
bBeat : Byte; // what note receives the beat (bottom of time sig.)
// we can assume that 0 means 256th note
wGridsPerBeat : Word; // grids per beat
end;
DMUS_IO_TIMESIG = TDMUS_IO_TIMESIG;
 
(*
RIFF
(
'DMTG' // DirectMusic ToolGraph chunk
[<guid-ck>] // GUID for ToolGraph
[<vers-ck>] // Optional version info
[<UNFO-list>] // Name, author, copyright info., comments
<toll-list> // List of Tools
)
TDMUS_IO_STYLE = record
timeSig : TDMUS_IO_TIMESIG; // Styles have a default Time Signature
dblTempo: Double;
end;
DMUS_IO_STYLE = TDMUS_IO_STYLE;
 
// <guid-ck>
'guid'
(
<GUID>
)
TDMUS_IO_VERSION = record
dwVersionMS : DWORD; // Version # high-order 32 bits
dwVersionLS : DWORD; // Version # low-order 32 bits
end;
DMUS_IO_VERSION = TDMUS_IO_VERSION;
 
// <vers-ck>
vers
(
<DMUS_IO_VERSION>
)
TDMUS_IO_PATTERN = record
timeSig : TDMUS_IO_TIMESIG; // Patterns can override the Style's Time sig.
bGrooveBottom : Byte; // bottom of groove range
bGrooveTop : Byte; // top of groove range
wEmbellishment : Word; // Fill, Break, Intro, End, Normal, Motif
wNbrMeasures : Word; // length in measures
end;
DMUS_IO_PATTERN = TDMUS_IO_PATTERN;
 
// <toll-list>
LIST
(
'toll' // List of tools
<DMTL-form>... // Each tool is encapsulated in a RIFF chunk
)
TDMUS_IO_STYLEPART = record
timeSig : TDMUS_IO_TIMESIG; // can override pattern's
dwVariationChoices : array[0..31] of DWORD; // MOAW choice bitfield
guidPartID : TGUID; // identifies the part
wNbrMeasures : Word; // length of the Part
bPlayModeFlags : Byte; // see PLAYMODE flags
bInvertUpper : Byte; // inversion upper limit
bInvertLower : Byte; // inversion lower limit
end;
DMUS_IO_STYLEPART = TDMUS_IO_STYLEPART;
 
// <DMTL-form> // Tools can be embedded in a graph or stored as separate files.
RIFF
(
'DMTL'
<tolh-ck>
[<guid-ck>] // Optional GUID for tool object instance (not to be confused with Class id in track header)
[<vers-ck>] // Optional version info
[<UNFO-list>] // Optional name, author, copyright info., comments
[<data>] // Tool data. Must be a RIFF readable chunk.
)
TDMUS_IO_PARTREF = record
guidPartID : TGUID; // unique ID for matching up with parts
wLogicalPartID : Word; // corresponds to port/device/midi channel
bVariationLockID : Byte; // parts with the same ID lock variations.
// high bit is used to identify master Part
bSubChordLevel : Byte; // tells which sub chord level this part wants
bPriority : Byte; // 256 priority levels. Parts with lower priority
// aren't played first when a device runs out of
// notes
bRandomVariation : Byte; // when set, matching variations play in random order
// when clear, matching variations play sequentially
end;
DMUS_IO_PARTREF = TDMUS_IO_PARTREF;
 
// <tolh-ck> // Tool header chunk
(
'tolh'
<DMUS_IO_TOOL_HEADER> // Tool header
)
*)
TDMUS_IO_STYLENOTE = record
mtGridStart : MUSIC_TIME; // when this note occurs
dwVariation : DWORD; // variation bits
mtDuration : MUSIC_TIME; // how long this note lasts
nTimeOffset : Smallint; // offset from mtGridStart
wMusicValue : Word; // Position in scale.
bVelocity : Byte; // Note velocity.
bTimeRange : Byte; // Range to randomize start time.
bDurRange : Byte; // Range to randomize duration.
bVelRange : Byte; // Range to randomize velocity.
bInversionID : Byte; // Identifies inversion group to which this note belongs
bPlayModeFlags : Byte; // Can override part
end;
DMUS_IO_STYLENOTE = TDMUS_IO_STYLENOTE;
 
(* File io for DirectMusic Band Track object *)
TDMUS_IO_STYLECURVE = record
mtGridStart : MUSIC_TIME;// when this curve occurs
dwVariation : DWORD; // variation bits
mtDuration : MUSIC_TIME;// how long this curve lasts
mtResetDuration : MUSIC_TIME;// how long after the end of the curve to reset the curve
nTimeOffset : Smallint; // offset from mtGridStart
nStartValue : Smallint; // curve's start value
nEndValue : Smallint; // curve's end value
nResetValue : Smallint; // the value to which to reset the curve
bEventType : Byte; // type of curve
bCurveShape : Byte; // shape of curve
bCCData : Byte; // CC#
bFlags : Byte; // Bit 1=TRUE means to send nResetValue. Otherwise, don't.
// Other bits are reserved.
end;
DMUS_IO_STYLECURVE = TDMUS_IO_STYLECURVE;
 
TDMUS_IO_MOTIFSETTINGS = record
dwRepeats : DWORD; // Number of repeats. By default, 0.
mtPlayStart : MUSIC_TIME; // Start of playback. By default, 0.
mtLoopStart : MUSIC_TIME; // Start of looping portion. By default, 0.
mtLoopEnd : MUSIC_TIME; // End of loop. Must be greater than mtLoopStart. By default equal to length of motif.
dwResolution : DWORD; // Default resolution.
end;
DMUS_IO_MOTIFSETTINGS = TDMUS_IO_MOTIFSETTINGS;
 
(* RIFF ids: *)
 
const
DMUS_FOURCC_BANDTRACK_FORM : mmioFOURCC = ('D','M','B','T');
DMUS_FOURCC_BANDTRACK_CHUNK : mmioFOURCC = ('b','d','t','h');
DMUS_FOURCC_BANDS_LIST : mmioFOURCC = ('l','b','d','l');
DMUS_FOURCC_BAND_LIST : mmioFOURCC = ('l','b','n','d');
DMUS_FOURCC_BANDITEM_CHUNK : mmioFOURCC = ('b','d','i','h');
// Chord and command file formats
 
DMUS_FOURCC_CHORDTRACK_LIST = Ord('c') + Ord('o') shl 8 + Ord('r') shl 16 + Ord('d') shl 24;
DMUS_FOURCC_CHORDTRACKHEADER_CHUNK = Ord('c') + Ord('r') shl 8 + Ord('d') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_CHORDTRACKBODY_CHUNK = Ord('c') + Ord('r') shl 8 + Ord('d') shl 16 + Ord('b') shl 24;
 
DMUS_FOURCC_COMMANDTRACK_CHUNK = Ord('c') + Ord('m') shl 8 + Ord('n') shl 16 + Ord('d') shl 24;
 
type
(* io structures *)
TDMus_IO_Band_Track_Header = packed record
bAutoDownload: BOOL; (* Determines if Auto-Download is enabled. *)
TDMUS_IO_CHORD = record
wszName : array[0..15] of WCHAR; // Name of the chord
mtTime : MUSIC_TIME; // Time of this chord
wMeasure : Word; // Measure this falls on
bBeat : Byte; // Beat this falls on
end;
DMUS_IO_CHORD = TDMUS_IO_CHORD;
 
TDMus_IO_Band_Item_Header = packed record
lBandTime: TMusic_Time; (* Position in track list. *)
TDMUS_IO_SUBCHORD = record
dwChordPattern : DWORD; // Notes in the subchord
dwScalePattern : DWORD; // Notes in the scale
dwInversionPoints : DWORD; // Where inversions can occur
dwLevels : DWORD; // Which levels are supported by this subchord
bChordRoot : Byte; // Root of the subchord
bScaleRoot : Byte; // Root of the scale
end;
DMUS_IO_SUBCHORD = TDMUS_IO_SUBCHORD;
 
(*
RIFF
(
'DMBT' // DirectMusic Band Track form-type
[<bdth-ck>] // Band track header
[<guid-ck>] // GUID for band track
[<vers-ck>] // Optional version info
[<UNFO-list>] // Name, author, copyright info., comments
<lbdl-list> // List of Band Lists
)
TDMUS_IO_COMMAND = record
mtTime : MUSIC_TIME; // Time of this command
wMeasure : Word; // Measure this falls on
bBeat : Byte; // Beat this falls on
bCommand : Byte; // Command type (see #defines below)
bGrooveLevel : Byte; // Groove level (0 if command is not a groove)
bGrooveRange : Byte; // Groove range
end;
DMUS_IO_COMMAND = TDMUS_IO_COMMAND;
 
// <bnth-ck>
'bdth'
(
<DMUS_IO_BAND_TRACK_HEADER>
)
 
// <guid-ck>
'guid'
(
<GUID>
)
// File io for DirectMusic Tool and ToolGraph objects
///
 
// <vers-ck>
vers
(
<DMUS_IO_VERSION>
)
const
// RIFF ids:
 
// <lbdl-list>
LIST
(
'lbdl' // List of bands
<lbnd-list> // Each band is encapsulated in a list
)
DMUS_FOURCC_TOOLGRAPH_FORM = Ord('D') + Ord('M') shl 8 + Ord('T') shl 16 + Ord('G') shl 24;
DMUS_FOURCC_TOOL_LIST = Ord('t') + Ord('o') shl 8 + Ord('l') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_TOOL_FORM = Ord('D') + Ord('M') shl 8 + Ord('T') shl 16 + Ord('L') shl 24;
DMUS_FOURCC_TOOL_CHUNK = Ord('t') + Ord('o') shl 8 + Ord('l') shl 16 + Ord('h') shl 24;
 
// <lbnd-list>
LIST
(
'lbnd'
<bdih-ck>
<DMBD-form> // Band
)
type
// io structures:
 
// <bdih-ck> // band item header
(
<DMUS_IO_BAND_ITEM_HEADER> // Band item header
)
*)
TDMUS_IO_TOOL_HEADER = record
guidClassID : TGUID; // Class id of tool.
lIndex : Longint; // Position in graph.
cPChannels : DWORD; // Number of items in channels array.
ckid : FOURCC; // chunk ID of tool's data chunk if 0 fccType valid.
fccType : FOURCC; // list type if NULL ckid valid.
dwPChannels : array[0..0] of DWORD; // Array of PChannels, size determined by cPChannels.
end;
DMUS_IO_TOOL_HEADER = TDMUS_IO_TOOL_HEADER;
 
 
(* File io for DirectMusic Band object
*)
// File io for DirectMusic Band Track object
 
(* RIFF ids: *)
const
DMUS_FOURCC_BAND_FORM : mmioFOURCC = ('D','M','B','D');
DMUS_FOURCC_INSTRUMENTS_LIST : mmioFOURCC = ('l','b','i','l');
DMUS_FOURCC_INSTRUMENT_LIST : mmioFOURCC = ('l','b','i','n');
DMUS_FOURCC_INSTRUMENT_CHUNK : mmioFOURCC = ('b','i','n','s');
// RIFF ids:
DMUS_FOURCC_BANDTRACK_FORM = Ord('D') + Ord('M') shl 8 + Ord('B') shl 16 + Ord('T') shl 24;
DMUS_FOURCC_BANDTRACK_CHUNK = Ord('b') + Ord('d') shl 8 + Ord('t') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_BANDS_LIST = Ord('l') + Ord('b') shl 8 + Ord('d') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_BAND_LIST = Ord('l') + Ord('b') shl 8 + Ord('n') shl 16 + Ord('d') shl 24;
DMUS_FOURCC_BANDITEM_CHUNK = Ord('b') + Ord('d') shl 8 + Ord('i') shl 16 + Ord('h') shl 24;
 
(* Flags for DMUS_IO_INSTRUMENT
*)
DMUS_IO_INST_PATCH = (1 shl 0); (* dwPatch is valid. *)
DMUS_IO_INST_BANKSELECT = (1 shl 1); (* dwPatch contains a valid Bank Select MSB and LSB part *)
DMUS_IO_INST_ASSIGN_PATCH = (1 shl 3); (* dwAssignPatch is valid *)
DMUS_IO_INST_NOTERANGES = (1 shl 4); (* dwNoteRanges is valid *)
DMUS_IO_INST_PAN = (1 shl 5); (* bPan is valid *)
DMUS_IO_INST_VOLUME = (1 shl 6); (* bVolume is valid *)
DMUS_IO_INST_TRANSPOSE = (1 shl 7); (* nTranspose is valid *)
DMUS_IO_INST_GM = (1 shl 8); (* Instrument is from GM collection *)
DMUS_IO_INST_GS = (1 shl 9); (* Instrument is from GS collection *)
DMUS_IO_INST_XG = (1 shl 10); (* Instrument is from XG collection *)
DMUS_IO_INST_CHANNEL_PRIORITY = (1 shl 11); (* dwChannelPriority is valid *)
DMUS_IO_INST_USE_DEFAULT_GM_SET = (1 shl 12); (* Always use the default GM set for this patch, *)
(* don't rely on the synth caps stating GM or GS in hardware. *)
type
(* io structures *)
TDMus_IO_Instruments = packed record
dwPatch: DWORD; (* MSB, LSB and Program change to define instrument *)
dwAssignPatch: DWORD; (* MSB, LSB and Program change to assign to instrument when downloading *)
dwNoteRanges: array [0..3] of DWORD;(* 128 bits: one for each MIDI note instrument needs to able to play *)
dwPChannel: DWORD; (* PChannel instrument plays on *)
dwFlags: DWORD; (* DMUS_IO_INST_ flags *)
bPan: BYTE; (* Pan for instrument *)
bVolume: BYTE; (* Volume for instrument *)
nTranspose: SmallInt; (* Number of semitones to transpose notes *)
dwChannelPriority: DWORD; (* Channel priority *)
// io structures
TDMUS_IO_BAND_TRACK_HEADER = record
bAutoDownload : BOOL; // Determines if Auto-Download is enabled.
end;
DMUS_IO_BAND_TRACK_HEADER = TDMUS_IO_BAND_TRACK_HEADER;
 
(*
// <DMBD-form> bands can be embedded in other forms
RIFF
(
'DMBD' // DirectMusic Band chunk
[<guid-ck>] // GUID for band
[<vers-ck>] // Optional version info
[<UNFO-list>] // Name, author, copyright info., comments
<lbil-list> // List of Instruments
)
TDMUS_IO_BAND_ITEM_HEADER = record
lBandTime : MUSIC_TIME; // Position in track list.
end;
DMUS_IO_BAND_ITEM_HEADER = TDMUS_IO_BAND_ITEM_HEADER;
 
// <guid-ck>
'guid'
(
<GUID>
)
 
// <vers-ck>
vers
(
<DMUS_IO_VERSION>
)
// File io for DirectMusic Band object
///
 
// <lbil-list>
LIST
(
'lbil' // List of instruments
<lbin-list> // Each instrument is encapsulated in a list
)
const
// RIFF ids:
 
// <lbin-list>
LIST
(
'lbin'
<bins-ck>
[<DMRF-list>] // Optional reference to DLS Collection file.
)
DMUS_FOURCC_BAND_FORM = Ord('D') + Ord('M') shl 8 + Ord('B') shl 16 + Ord('D') shl 24;
DMUS_FOURCC_INSTRUMENTS_LIST = Ord('l') + Ord('b') shl 8 + Ord('i') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_INSTRUMENT_LIST = Ord('l') + Ord('b') shl 8 + Ord('i') shl 16 + Ord('n') shl 24;
DMUS_FOURCC_INSTRUMENT_CHUNK = Ord('b') + Ord('i') shl 8 + Ord('n') shl 16 + Ord('s') shl 24;
 
// <bins-ck> // Instrument chunk
(
'bins'
<DMUS_IO_INSTRUMENT> // Instrument header
)
*)
// Flags for DMUS_IO_INSTRUMENT
///
DMUS_IO_INST_PATCH = (1 shl 0); // dwPatch is valid.
DMUS_IO_INST_BANKSELECT = (1 shl 1); // dwPatch contains a valid Bank Select MSB and LSB part
DMUS_IO_INST_ASSIGN_PATCH = (1 shl 3); // dwAssignPatch is valid
DMUS_IO_INST_NOTERANGES = (1 shl 4); // dwNoteRanges is valid
DMUS_IO_INST_PAN = (1 shl 5); // bPan is valid
DMUS_IO_INST_VOLUME = (1 shl 6); // bVolume is valid
DMUS_IO_INST_TRANSPOSE = (1 shl 7); // nTranspose is valid
DMUS_IO_INST_GM = (1 shl 8); // Instrument is from GM collection
DMUS_IO_INST_GS = (1 shl 9); // Instrument is from GS collection
DMUS_IO_INST_XG = (1 shl 10); // Instrument is from XG collection
DMUS_IO_INST_CHANNEL_PRIORITY = (1 shl 11); // dwChannelPriority is valid
DMUS_IO_INST_USE_DEFAULT_GM_SET = (1 shl 12); // Always use the default GM set for this patch,
// don't rely on the synth caps stating GM or GS in hardware.
 
(* File io for DirectMusic Segment object *)
 
(* RIFF ids: *)
const
DMUS_FOURCC_SEGMENT_FORM : mmioFOURCC = ('D','M','S','G');
DMUS_FOURCC_SEGMENT_CHUNK : mmioFOURCC = ('s','e','g','h');
DMUS_FOURCC_TRACK_LIST : mmioFOURCC = ('t','r','k','l');
DMUS_FOURCC_TRACK_FORM : mmioFOURCC = ('D','M','T','K');
DMUS_FOURCC_TRACK_CHUNK : mmioFOURCC = ('t','r','k','h');
 
(* io structures:*)
type
TDMus_IO_Segment_Header = packed record
dwRepeats: DWORD; (* Number of repeats. By default, 0. *)
mtLength: TMusic_Time; (* Length, in music time. *)
mtPlayStart: TMusic_Time; (* Start of playback. By default, 0. *)
mtLoopStart: TMusic_Time; (* Start of looping portion. By default, 0. *)
mtLoopEnd: TMusic_Time; (* End of loop. Must be greater than dwPlayStart. By default equal to length. *)
dwResolution: DWORD; (* Default resolution. *)
// io structures
TDMUS_IO_INSTRUMENT = record
dwPatch : DWORD; // MSB, LSB and Program change to define instrument
dwAssignPatch : DWORD; // MSB, LSB and Program change to assign to instrument when downloading
dwNoteRanges : array[0..3] of DWORD; // 128 bits; one for each MIDI note instrument needs to able to play
dwPChannel : DWORD; // PChannel instrument plays on
dwFlags : DWORD; // DMUS_IO_INST_ flags
bPan : Byte; // Pan for instrument
bVolume : Byte; // Volume for instrument
nTranspose : Smallint; // Number of semitones to transpose notes
dwChannelPriority : DWORD; // Channel priority
end;
DMUS_IO_INSTRUMENT = TDMUS_IO_INSTRUMENT;
 
TDMus_IO_Track_Header = packed record
guidClassID: TGUID; (* Class id of track. *)
dwPosition: DWORD; (* Position in track list. *)
dwGroup: DWORD; (* Group bits for track. *)
ckid: TFourCC; (* chunk ID of track's data chunk if 0 fccType valid. *)
fccType: TFourCC; (* list type if NULL ckid valid *)
end;
 
(*
RIFF
(
'DMSG' // DirectMusic Segment chunk
<segh-ck> // Segment header chunk
[<guid-ck>] // GUID for segment
[<vers-ck>] // Optional version info
[<UNFO-list>] // Name, author, copyright info., comments
<trkl-list> // List of Tracks
[<DMTG-form>] // Optional ToolGraph
)
// File io for DirectMusic Segment object
 
// <segh-ck>
'segh'
(
<DMUS_IO_SEGMENT_HEADER>
)
// <guid-ck>
'guid'
(
<GUID>
)
const
// RIFF ids:
 
// <vers-ck>
vers
(
<DMUS_IO_VERSION>
)
DMUS_FOURCC_SEGMENT_FORM = Ord('D') + Ord('M') shl 8 + Ord('S') shl 16 + Ord('G') shl 24;
DMUS_FOURCC_SEGMENT_CHUNK = Ord('s') + Ord('e') shl 8 + Ord('g') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_TRACK_LIST = Ord('t') + Ord('r') shl 8 + Ord('k') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_TRACK_FORM = Ord('D') + Ord('M') shl 8 + Ord('T') shl 16 + Ord('K') shl 24;
DMUS_FOURCC_TRACK_CHUNK = Ord('t') + Ord('r') shl 8 + Ord('k') shl 16 + Ord('h') shl 24;
 
// <trkl-list>
LIST
(
'trkl' // List of tracks
<DMTK-form>... // Each track is encapsulated in a RIFF chunk
)
type
// io structures:
 
// <DMTK-form> // Tracks can be embedded in a segment or stored as separate files.
RIFF
(
'DMTK'
<trkh-ck>
[<guid-ck>] // Optional GUID for track object instance (not to be confused with Class id in track header)
[<vers-ck>] // Optional version info
[<UNFO-list>] // Optional name, author, copyright info., comments
[<data>] // Track data. Must be a RIFF readable chunk.
)
TDMUS_IO_SEGMENT_HEADER = record
dwRepeats : DWORD; // Number of repeats. By default, 0.
mtLength : MUSIC_TIME; // Length, in music time.
mtPlayStart : MUSIC_TIME; // Start of playback. By default, 0.
mtLoopStart : MUSIC_TIME; // Start of looping portion. By default, 0.
mtLoopEnd : MUSIC_TIME; // End of loop. Must be greater than dwPlayStart. By default equal to length.
dwResolution : DWORD; // Default resolution.
end;
DMUS_IO_SEGMENT_HEADER = TDMUS_IO_SEGMENT_HEADER;
 
// <trkh-ck> // Track header chunk
(
'trkh'
<DMUS_IO_TRACK_HEADER> // Track header
)
*)
TDMUS_IO_TRACK_HEADER = record
guidClassID : TGUID; // Class id of track.
dwPosition : DWORD; // Position in track list.
dwGroup : DWORD; // Group bits for track.
ckid : FOURCC; // chunk ID of track's data chunk if 0 fccType valid.
fccType : FOURCC; // list type if NULL ckid valid
end;
DMUS_IO_TRACK_HEADER = TDMUS_IO_TRACK_HEADER;
 
(* File io for DirectMusic reference chunk.
This is used to embed a reference to an object.
*)
// File io for DirectMusic reference chunk.
// This is used to embed a reference to an object.
 
(* RIFF ids: *)
const
DMUS_FOURCC_REF_LIST : mmioFOURCC = ('D','M','R','F');
DMUS_FOURCC_REF_CHUNK : mmioFOURCC = ('r','e','f','h');
DMUS_FOURCC_DATE_CHUNK : mmioFOURCC = ('d','a','t','e');
DMUS_FOURCC_NAME_CHUNK : mmioFOURCC = ('n','a','m','e');
DMUS_FOURCC_FILE_CHUNK : mmioFOURCC = ('f','i','l','e');
// RIFF ids:
 
DMUS_FOURCC_REF_LIST = Ord('D') + Ord('M') shl 8 + Ord('R') shl 16 + Ord('F') shl 24;
DMUS_FOURCC_REF_CHUNK = Ord('r') + Ord('e') shl 8 + Ord('f') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_DATE_CHUNK = Ord('d') + Ord('a') shl 8 + Ord('t') shl 16 + Ord('e') shl 24;
DMUS_FOURCC_NAME_CHUNK = Ord('n') + Ord('a') shl 8 + Ord('m') shl 16 + Ord('e') shl 24;
DMUS_FOURCC_FILE_CHUNK = Ord('f') + Ord('i') shl 8 + Ord('l') shl 16 + Ord('e') shl 24;
 
type
TDMus_IO_Reference = packed record
guidClassID: TGUID; (* Class id is always required. *)
dwValidData: DWORD; (* Flags. *)
TDMUS_IO_REFERENCE = record
guidClassID : TGUID; // Class id is always required.
dwValidData : DWORD; // Flags.
end;
DMUS_IO_REFERENCE = TDMUS_IO_REFERENCE;
 
(*
LIST
(
'DMRF' // DirectMusic Reference chunk
<refh-ck> // Reference header chunk
[<guid-ck>] // Optional object GUID.
[<date-ck>] // Optional file date.
[<name-ck>] // Optional name.
[<file-ck>] // Optional file name.
[<catg-ck>] // Optional category name.
[<vers-ck>] // Optional version info.
)
 
// <refh-ck>
'refh'
(
<DMUS_IO_REFERENCE>
)
// Chord Maps
 
// <guid-ck>
'guid'
(
<GUID>
)
 
// <date-ck>
date
(
<FILETIME>
)
 
// <name-ck>
name
(
// Name, stored as NULL terminated string of WCHARs
)
 
// <file-ck>
file
(
// File name, stored as NULL terminated string of WCHARs
)
 
// <catg-ck>
catg
(
// Category name, stored as NULL terminated string of WCHARs
)
 
// <vers-ck>
vers
(
<DMUS_IO_VERSION>
)
*)
 
(* Chord Maps *)
const
(* runtime chunks *)
DMUS_FOURCC_CHORDMAP_FORM : mmioFOURCC = ('D','M','P','R');
DMUS_FOURCC_IOCHORDMAP_CHUNK : mmioFOURCC = ('p','e','r','h');
DMUS_FOURCC_SUBCHORD_CHUNK : mmioFOURCC = ('c','h','d','t');
DMUS_FOURCC_CHORDENTRY_CHUNK : mmioFOURCC = ('c','h','e','h');
DMUS_FOURCC_SUBCHORDID_CHUNK : mmioFOURCC = ('s','b','c','n');
DMUS_FOURCC_IONEXTCHORD_CHUNK : mmioFOURCC = ('n','c','r','d');
DMUS_FOURCC_NEXTCHORDSEQ_CHUNK : mmioFOURCC = ('n','c','s','q');
DMUS_FOURCC_IOSIGNPOST_CHUNK : mmioFOURCC = ('s','p','s','h');
DMUS_FOURCC_CHORDNAME_CHUNK : mmioFOURCC = ('I','N','A','M');
// runtime chunks
DMUS_FOURCC_CHORDMAP_FORM = Ord('D') + Ord('M') shl 8 + Ord('P') shl 16 + Ord('R') shl 24;
DMUS_FOURCC_IOCHORDMAP_CHUNK = Ord('p') + Ord('e') shl 8 + Ord('r') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_SUBCHORD_CHUNK = Ord('c') + Ord('h') shl 8 + Ord('d') shl 16 + Ord('t') shl 24;
DMUS_FOURCC_CHORDENTRY_CHUNK = Ord('c') + Ord('h') shl 8 + Ord('e') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_SUBCHORDID_CHUNK = Ord('s') + Ord('b') shl 8 + Ord('c') shl 16 + Ord('n') shl 24;
DMUS_FOURCC_IONEXTCHORD_CHUNK = Ord('n') + Ord('c') shl 8 + Ord('r') shl 16 + Ord('d') shl 24;
DMUS_FOURCC_NEXTCHORDSEQ_CHUNK = Ord('n') + Ord('c') shl 8 + Ord('s') shl 16 + Ord('q') shl 24;
DMUS_FOURCC_IOSIGNPOST_CHUNK = Ord('s') + Ord('p') shl 8 + Ord('s') shl 16 + Ord('h') shl 24;
DMUS_FOURCC_CHORDNAME_CHUNK = Ord('I') + Ord('N') shl 8 + Ord('A') shl 16 + Ord('M') shl 24;
 
(* runtime list chunks *)
DMUS_FOURCC_CHORDENTRY_LIST : mmioFOURCC = ('c','h','o','e');
DMUS_FOURCC_CHORDMAP_LIST : mmioFOURCC = ('c','m','a','p');
DMUS_FOURCC_CHORD_LIST : mmioFOURCC = ('c','h','r','d');
DMUS_FOURCC_CHORDPALETTE_LIST : mmioFOURCC = ('c','h','p','l');
DMUS_FOURCC_CADENCE_LIST : mmioFOURCC = ('c','a','d','e');
DMUS_FOURCC_SIGNPOSTITEM_LIST : mmioFOURCC = ('s','p','s','t');
// runtime list chunks
DMUS_FOURCC_CHORDENTRY_LIST = Ord('c') + Ord('h') shl 8 + Ord('o') shl 16 + Ord('e') shl 24;
DMUS_FOURCC_CHORDMAP_LIST = Ord('c') + Ord('m') shl 8 + Ord('a') shl 16 + Ord('p') shl 24;
DMUS_FOURCC_CHORD_LIST = Ord('c') + Ord('h') shl 8 + Ord('r') shl 16 + Ord('d') shl 24;
DMUS_FOURCC_CHORDPALETTE_LIST = Ord('c') + Ord('h') shl 8 + Ord('p') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_CADENCE_LIST = Ord('c') + Ord('a') shl 8 + Ord('d') shl 16 + Ord('e') shl 24;
DMUS_FOURCC_SIGNPOSTITEM_LIST = Ord('s') + Ord('p') shl 8 + Ord('s') shl 16 + Ord('t') shl 24;
 
DMUS_FOURCC_SIGNPOST_LIST : mmioFOURCC = ('s','p','s','q');
DMUS_FOURCC_SIGNPOST_LIST = Ord('s') + Ord('p') shl 8 + Ord('s') shl 16 + Ord('q') shl 24;
 
(* values for dwChord field of DMUS_IO_PERS_SIGNPOST *)
(* DMUS_SIGNPOSTF_ flags are also used in templates (DMUS_IO_SIGNPOST) *)
// values for dwChord field of DMUS_IO_PERS_SIGNPOST
// DMUS_SIGNPOSTF_ flags are also used in templates (DMUS_IO_SIGNPOST)
DMUS_SIGNPOSTF_A = 1;
DMUS_SIGNPOSTF_B = 2;
DMUS_SIGNPOSTF_C = 4;
21495,663 → 15374,271
DMUS_SIGNPOSTF_ROOT = (DMUS_SIGNPOSTF_1 or DMUS_SIGNPOSTF_2 or DMUS_SIGNPOSTF_3 or DMUS_SIGNPOSTF_4 or DMUS_SIGNPOSTF_5 or DMUS_SIGNPOSTF_6 or DMUS_SIGNPOSTF_7);
DMUS_SIGNPOSTF_CADENCE = $8000;
 
(* values for dwChord field of DMUS_IO_PERS_SIGNPOST *)
DMUS_SPOSTCADENCEF_1 = 2; (* Use the first cadence chord. *)
DMUS_SPOSTCADENCEF_2 = 4; (* Use the second cadence chord. *)
// values for dwChord field of DMUS_IO_PERS_SIGNPOST
DMUS_SPOSTCADENCEF_1 = 2; // Use the first cadence chord.
DMUS_SPOSTCADENCEF_2 = 4; // Use the second cadence chord.
 
type
(* run time data structs *)
TDMus_IO_ChordMap = packed record
wszLoadName: array [0..19] of WCHAR;
dwScalePattern: DWORD;
dwFlags: DWORD;
// run time data structs
TDMUS_IO_CHORDMAP = record
wszLoadName : array[0..19] of WCHAR;
dwScalePattern : DWORD;
dwFlags : DWORD;
end;
DMUS_IO_CHORDMAP = TDMUS_IO_CHORDMAP;
 
TDMus_IO_ChordMap_SubChord = packed record
dwChordPattern: DWORD;
dwScalePattern: DWORD;
TDMUS_IO_CHORDMAP_SUBCHORD = record
dwChordPattern : DWORD;
dwScalePattern : DWORD;
dwInvertPattern: DWORD;
bChordRoot: BYTE;
bScaleRoot: BYTE;
wCFlags: WORD;
dwLevels: DWORD; (* parts or which subchord levels this chord supports *)
bChordRoot : Byte;
bScaleRoot : Byte;
wCFlags : Word;
dwLevels : DWORD; // parts or which subchord levels this chord supports
end;
DMUS_IO_CHORDMAP_SUBCHORD = TDMUS_IO_CHORDMAP_SUBCHORD;
 
(* Legacy name... *)
TDMus_IO_Pers_SubChord = TDMus_IO_ChordMap_SubChord;
// Legacy name...
DMUS_IO_PERS_SUBCHORD = TDMUS_IO_CHORDMAP_SUBCHORD;
 
TDMus_IO_ChordEntry = packed record
dwFlags: DWORD;
wConnectionID: WORD; (* replaces runtime "pointer to this" *)
TDMUS_IO_CHORDENTRY = record
dwFlags : DWORD;
wConnectionID : Word; // replaces runtime "pointer to this"
end;
DMUS_IO_CHORDENTRY = TDMUS_IO_CHORDENTRY;
 
TDMus_IO_NextChord = packed record
dwFlags: DWORD;
nWeight: WORD;
wMinBeats: WORD;
wMaxBeats: WORD;
wConnectionID: WORD; (* points to an ioChordEntry *)
TDMUS_IO_NEXTCHORD = record
dwFlags : DWORD;
nWeight : Word;
wMinBeats : Word;
wMaxBeats : Word;
wConnectionID : Word; // points to an ioChordEntry
end;
DMUS_IO_NEXTCHORD = TDMUS_IO_NEXTCHORD;
 
TDMus_IO_ChordMap_SignPost = packed record
dwChords: DWORD; (* 1bit per group *)
dwFlags: DWORD;
TDMUS_IO_CHORDMAP_SIGNPOST = record
dwChords : DWORD; // 1bit per group
dwFlags : DWORD;
end;
DMUS_IO_CHORDMAP_SIGNPOST = TDMUS_IO_CHORDMAP_SIGNPOST;
 
(* Legacy name... *)
TDMus_IO_Pers_SignPost = TDMus_IO_ChordMap_SignPost;
// Legacy name...
DMUS_IO_PERS_SIGNPOST = TDMUS_IO_CHORDMAP_SIGNPOST;
 
(*
RIFF
(
'DMPR'
<perh-ck> // Chord map header chunk
[<guid-ck>] // guid chunk
[<vers-ck>] // version chunk (two DWORDS)
[<UNFO-list>] // Unfo chunk
<chdt-ck> // subchord database
<chpl-list> // chord palette
<cmap-list> // chord map
<spsq-list> // signpost list
)
 
<cmap-list> ::= LIST('cmap' <choe-list> )
 
<choe-list> ::= LIST('choe'
<cheh-ck> // chord entry data
<chrd-list> // chord definition
<ncsq-ck> // connecting(next) chords
)
 
<chrd-list> ::= LIST('chrd'
<INAM-ck> // name of chord in wide char format
<sbcn-ck> // list of subchords composing chord
)
 
<chpl-list> ::= LIST('chpl'
<chrd-list> ... // chord definition
)
 
<spsq-list> ::== LIST('spsq' <spst-list> ... )
 
<spst-list> ::= LIST('spst'
<spsh-ck>
<chrd-list>
[<cade-list>]
)
 
<cade-list> ::= LIST('cade' <chrd-list> ...)
 
<perh-ck> ::= perh(<DMUS_IO_CHORDMAP>)
 
<chdt-ck> ::= chdt(<cbChordSize::WORD>
<DMUS_IO_PERS_SUBCHORD> ... )
 
<cheh-ck> ::= cheh(<DMUS_IO_CHORDENTRY>)
 
<sbcn-ck> ::= sbcn(<cSubChordID:WORD> ...)
 
<ncsq-ck> ::= ncsq(<wNextChordSize:WORD>
<DMUS_IO_NEXTCHORD>...)
 
<spsh-ck> ::= spsh(<DMUS_IO_PERS_SIGNPOST>)
 
*)
 
(* Signpost tracks *)
const
DMUS_FOURCC_SIGNPOST_TRACK_CHUNK : mmioFOURCC = ( 's', 'g', 'n', 'p' );
// Signpost tracks
DMUS_FOURCC_SIGNPOST_TRACK_CHUNK = Ord('s') + Ord('g') shl 8 + Ord('n') shl 16 + Ord('p') shl 24;
 
type
TDMus_IO_SignPost = packed record
mtTime: TMusic_Time;
dwChords: DWORD;
wMeasure: WORD;
TDMUS_IO_SIGNPOST = record
mtTime : MUSIC_TIME;
dwChords : DWORD;
wMeasure : Word;
end;
DMUS_IO_SIGNPOST = TDMUS_IO_SIGNPOST;
 
(*
 
// <sgnp-list>
'sgnp'
(
//sizeof DMUS_IO_SIGNPOST: DWORD
<DMUS_IO_SIGNPOST>...
)
 
*)
 
const
DMUS_FOURCC_MUTE_CHUNK : mmioFOURCC = ('m','u','t','e');
DMUS_FOURCC_MUTE_CHUNK = Ord('m') + Ord('u') shl 8 + Ord('t') shl 16 + Ord('e') shl 24;
 
type
TDMus_IO_Mute = packed record
mtTime: TMusic_Time;
dwPChannel: DWORD;
dwPChannelMap: DWORD;
TDMUS_IO_MUTE = record
mtTime : MUSIC_TIME;
dwPChannel : DWORD;
dwPChannelMap : DWORD;
end;
DMUS_IO_MUTE = TDMUS_IO_MUTE;
 
(*
// Used for both style and chord map tracks
const
DMUS_FOURCC_TIME_STAMP_CHUNK = Ord('s') + Ord('t') shl 8 + Ord('m') shl 16 + Ord('p') shl 24;
 
// <mute-list>
'mute'
(
//sizeof DMUS_IO_MUTE:DWORD
<DMUS_IO_MUTE>...
)
// Style tracks
DMUS_FOURCC_STYLE_TRACK_LIST = Ord('s') + Ord('t') shl 8 + Ord('t') shl 16 + Ord('r') shl 24;
DMUS_FOURCC_STYLE_REF_LIST = Ord('s') + Ord('t') shl 8 + Ord('r') shl 16 + Ord('f') shl 24;
 
// Chord map tracks
DMUS_FOURCC_PERS_TRACK_LIST = Ord('p') + Ord('f') shl 8 + Ord('t') shl 16 + Ord('r') shl 24;
DMUS_FOURCC_PERS_REF_LIST = Ord('p') + Ord('f') shl 8 + Ord('r') shl 16 + Ord('f') shl 24;
DMUS_FOURCC_TEMPO_TRACK = Ord('t') + Ord('e') shl 8 + Ord('t') shl 16 + Ord('r') shl 24;
DMUS_FOURCC_SEQ_TRACK = Ord('s') + Ord('e') shl 8 + Ord('q') shl 16 + Ord('t') shl 24;
DMUS_FOURCC_SEQ_LIST = Ord('e') + Ord('v') shl 8 + Ord('t') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_CURVE_LIST = Ord('c') + Ord('u') shl 8 + Ord('r') shl 16 + Ord('l') shl 24;
DMUS_FOURCC_SYSEX_TRACK = Ord('s') + Ord('y') shl 8 + Ord('e') shl 16 + Ord('x') shl 24;
DMUS_FOURCC_TIMESIGNATURE_TRACK = Ord('t') + Ord('i') shl 8 + Ord('m') shl 16 + Ord('s') shl 24;
 
*)
implementation
 
const
(* Used for both style and chord map tracks *)
DDrawLib = 'DDraw.dll';
D3DRMLib = 'D3DRM.dll';
D3DXofLib = 'd3dxof.dll';
DInputLib = 'DInput.dll';
DPlayXLib = 'DPlayX.dll';
DSetupLib = 'DSetup.dll';
DSoundLib = 'DSound.dll';
 
DMUS_FOURCC_TIME_STAMP_CHUNK : mmioFOURCC = ('s', 't', 'm', 'p');
 
(* Style tracks *)
{ DirectDraw }
 
DMUS_FOURCC_STYLE_TRACK_LIST : mmioFOURCC = ('s', 't', 't', 'r');
DMUS_FOURCC_STYLE_REF_LIST : mmioFOURCC = ('s', 't', 'r', 'f');
 
(*
 
// <sttr-list>
LIST('sttr'
(
// some number of <strf-list>
)
 
// <strf-list>
LIST('strf'
(
<stmp-ck>
<DMRF>
)
 
// <stmp-ck> defined in ..\dmcompos\dmcompp.h
 
*)
 
(* Chord map tracks *)
 
DMUS_FOURCC_PERS_TRACK_LIST : mmioFOURCC = ('p', 'f', 't', 'r');
DMUS_FOURCC_PERS_REF_LIST : mmioFOURCC = ('p', 'f', 'r', 'f');
 
(*
 
// <pftr-list>
LIST('pftr'
(
// some number of <pfrf-list>
)
 
// <pfrf-list>
LIST('pfrf'
(
<stmp-ck>
<DMRF>
)
 
// <stmp-ck>
'stmp'
(
// time:DWORD
)
 
 
 
*)
 
DMUS_FOURCC_TEMPO_TRACK : mmioFOURCC = ('t','e','t','r');
 
(*
// tempo list
'tetr'
(
// sizeof DMUS_IO_TEMPO_ITEM: DWORD
<DMUS_IO_TEMPO_ITEM>...
)
*)
 
DMUS_FOURCC_SEQ_TRACK : mmioFOURCC = ('s','e','q','t');
DMUS_FOURCC_SEQ_LIST : mmioFOURCC = ('e','v','t','l');
DMUS_FOURCC_CURVE_LIST : mmioFOURCC = ('c','u','r','l');
 
(*
// sequence track
'seqt'
(
// sequence list
'evtl'
(
// sizeof DMUS_IO_SEQ_ITEM: DWORD
<DMUS_IO_SEQ_ITEM>...
)
// curve list
'curl'
(
// sizeof DMUS_IO_CURVE_ITEM: DWORD
<DMUS_IO_CURVE_ITEM>...
)
)
*)
 
DMUS_FOURCC_SYSEX_TRACK : mmioFOURCC = ('s','y','e','x');
 
(*
// sysex track
'syex'
(
// list of:
// {
// <DMUS_IO_SYSEX_ITEM>
// sys-ex: data
// }...
)
*)
 
DMUS_FOURCC_TIMESIGNATURE_TRACK : mmioFOURCC = ('t','i','m','s');
 
(*
// time signature track
'tims'
(
// size of DMUS_IO_TIMESIGNATURE_ITEM : DWORD
<DMUS_IO_TIMESIGNATURE_ITEM>...
)
*)
 
(***************************************************************************
* *
* DMusBuff.h -- This module defines the buffer format for DirectMusic *
* Shared file between user mode and kernel mode components *
* *
* Copyright (c) 1998, Microsoft Corp. All rights reserved. *
* *
***************************************************************************)
 
(* The number of bytes to allocate for an event with 'cb' data bytes.
*)
function QWORD_ALIGN(x: DWORD) : DWORD;
 
function DMUS_EVENT_SIZE(cb: DWORD) : DWORD;
 
 
 
Implementation
 
//DirectDraw file
 
 
{
#define GET_WHQL_YEAR( dwWHQLLevel ) \
( (dwWHQLLevel) / 0x10000 )
#define GET_WHQL_MONTH( dwWHQLLevel ) \
( ( (dwWHQLLevel) / 0x100 ) & 0x00ff )
#define GET_WHQL_DAY( dwWHQLLevel ) \
( (dwWHQLLevel) & 0xff )
}
function GET_WHQL_YEAR(dwWHQLLevel: DWORD) : DWORD;
function GET_WHQL_YEAR(dwWHQLLevel: DWORD): DWORD;
begin
Result := (dwWHQLLevel) div $10000;
Result := dwWHQLLevel div $10000;
end;
 
function GET_WHQL_MONTH(dwWHQLLevel: DWORD) : DWORD;
function GET_WHQL_MONTH(dwWHQLLevel: DWORD): DWORD;
begin
Result := ( (dwWHQLLevel) div $100 ) and $00ff;
Result := (dwWHQLLevel div $100) and $FF;
end;
 
function GET_WHQL_DAY(dwWHQLLevel: DWORD) : DWORD;
function GET_WHQL_DAY(dwWHQLLevel: DWORD): DWORD;
begin
Result := (dwWHQLLevel) and $ff;
Result := dwWHQLLevel and $FF;
end;
 
function DirectDrawEnumerateA; external DDrawLib;
function DirectDrawEnumerateW; external DDrawLib;
function DirectDrawEnumerate; external DDrawLib name 'DirectDrawEnumerateA';
 
function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
begin
Result := DWORD(byte(ch0) shl 0) or
DWORD(byte(ch1) shl 8) or
DWORD(byte(ch2) shl 16) or
DWORD(byte(ch3) shl 24);
end;
function DirectDrawEnumerateExA; external DDrawLib;
function DirectDrawEnumerateExW; external DDrawLib;
function DirectDrawEnumerateEx; external DDrawLib name 'DirectDrawEnumerateExA';
 
function DDErrorString(Value: HResult) : string;
begin
case Value of
DD_OK: Result := 'The request completed successfully.';
DDERR_ALREADYINITIALIZED: Result := 'This object is already initialized.';
DDERR_BLTFASTCANTCLIP: Result := ' if a clipper object is attached to the source surface passed into a BltFast call.';
DDERR_CANNOTATTACHSURFACE: Result := 'This surface can not be attached to the requested surface.';
DDERR_CANNOTDETACHSURFACE: Result := 'This surface can not be detached from the requested surface.';
DDERR_CANTCREATEDC: Result := 'Windows can not create any more DCs.';
DDERR_CANTDUPLICATE: Result := 'Cannot duplicate primary & 3D surfaces, or surfaces that are implicitly created.';
DDERR_CLIPPERISUSINGHWND: Result := 'An attempt was made to set a cliplist for a clipper object that is already monitoring an hwnd.';
DDERR_COLORKEYNOTSET: Result := 'No src color key specified for this operation.';
DDERR_CURRENTLYNOTAVAIL: Result := 'Support is currently not available.';
DDERR_DIRECTDRAWALREADYCREATED: Result := 'A DirectDraw object representing this driver has already been created for this process.';
DDERR_EXCEPTION: Result := 'An exception was encountered while performing the requested operation.';
DDERR_EXCLUSIVEMODEALREADYSET: Result := 'An attempt was made to set the cooperative level when it was already set to exclusive.';
DDERR_GENERIC: Result := 'Generic failure.';
DDERR_HEIGHTALIGN: Result := 'Height of rectangle provided is not a multiple of reqd alignment.';
DDERR_HWNDALREADYSET: Result := 'The CooperativeLevel HWND has already been set. It can not be reset while the process has surfaces or palettes created.';
DDERR_HWNDSUBCLASSED: Result := 'HWND used by DirectDraw CooperativeLevel has been subclassed, this prevents DirectDraw from restoring state.';
DDERR_IMPLICITLYCREATED: Result := 'This surface can not be restored because it is an implicitly created surface.';
DDERR_INCOMPATIBLEPRIMARY: Result := 'Unable to match primary surface creation request with existing primary surface.';
DDERR_INVALIDCAPS: Result := 'One or more of the caps bits passed to the callback are incorrect.';
DDERR_INVALIDCLIPLIST: Result := 'DirectDraw does not support the provided cliplist.';
DDERR_INVALIDDIRECTDRAWGUID: Result := 'The GUID passed to DirectDrawCreate is not a valid DirectDraw driver identifier.';
DDERR_INVALIDMODE: Result := 'DirectDraw does not support the requested mode.';
DDERR_INVALIDOBJECT: Result := 'DirectDraw received a pointer that was an invalid DIRECTDRAW object.';
DDERR_INVALIDPARAMS: Result := 'One or more of the parameters passed to the function are incorrect.';
DDERR_INVALIDPIXELFORMAT: Result := 'The pixel format was invalid as specified.';
DDERR_INVALIDPOSITION: Result := 'Returned when the position of the overlay on the destination is no longer legal for that destination.';
DDERR_INVALIDRECT: Result := 'Rectangle provided was invalid.';
DDERR_LOCKEDSURFACES: Result := 'Operation could not be carried out because one or more surfaces are locked.';
DDERR_NO3D: Result := 'There is no 3D present.';
DDERR_NOALPHAHW: Result := 'Operation could not be carried out because there is no alpha accleration hardware present or available.';
DDERR_NOBLTHW: Result := 'No blitter hardware present.';
DDERR_NOCLIPLIST: Result := 'No cliplist available.';
DDERR_NOCLIPPERATTACHED: Result := 'No clipper object attached to surface object.';
DDERR_NOCOLORCONVHW: Result := 'Operation could not be carried out because there is no color conversion hardware present or available.';
DDERR_NOCOLORKEY: Result := 'Surface does not currently have a color key';
DDERR_NOCOLORKEYHW: Result := 'Operation could not be carried out because there is no hardware support of the destination color key.';
DDERR_NOCOOPERATIVELEVELSET: Result := 'Create function called without DirectDraw object method SetCooperativeLevel being called.';
DDERR_NODC: Result := 'No DC was ever created for this surface.';
DDERR_NODDROPSHW: Result := 'No DirectDraw ROP hardware.';
DDERR_NODIRECTDRAWHW: Result := 'A hardware-only DirectDraw object creation was attempted but the driver did not support any hardware.';
DDERR_NOEMULATION: Result := 'Software emulation not available.';
DDERR_NOEXCLUSIVEMODE: Result := 'Operation requires the application to have exclusive mode but the application does not have exclusive mode.';
DDERR_NOFLIPHW: Result := 'Flipping visible surfaces is not supported.';
DDERR_NOGDI: Result := 'There is no GDI present.';
DDERR_NOHWND: Result := 'Clipper notification requires an HWND or no HWND has previously been set as the CooperativeLevel HWND.';
DDERR_NOMIRRORHW: Result := 'Operation could not be carried out because there is no hardware present or available.';
DDERR_NOOVERLAYDEST: Result := 'Returned when GetOverlayPosition is called on an overlay that UpdateOverlay has never been called on to establish a destination.';
DDERR_NOOVERLAYHW: Result := 'Operation could not be carried out because there is no overlay hardware present or available.';
DDERR_NOPALETTEATTACHED: Result := 'No palette object attached to this surface.';
DDERR_NOPALETTEHW: Result := 'No hardware support for 16 or 256 color palettes.';
DDERR_NORASTEROPHW: Result := 'Operation could not be carried out because there is no appropriate raster op hardware present or available.';
DDERR_NOROTATIONHW: Result := 'Operation could not be carried out because there is no rotation hardware present or available.';
DDERR_NOSTRETCHHW: Result := 'Operation could not be carried out because there is no hardware support for stretching.';
DDERR_NOT4BITCOLOR: Result := 'DirectDrawSurface is not in 4 bit color palette and the requested operation requires 4 bit color palette.';
DDERR_NOT4BITCOLORINDEX: Result := 'DirectDrawSurface is not in 4 bit color index palette and the requested operation requires 4 bit color index palette.';
DDERR_NOT8BITCOLOR: Result := 'DirectDrawSurface is not in 8 bit color mode and the requested operation requires 8 bit color.';
DDERR_NOTAOVERLAYSURFACE: Result := 'Returned when an overlay member is called for a non-overlay surface.';
DDERR_NOTEXTUREHW: Result := 'Operation could not be carried out because there is no texture mapping hardware present or available.';
DDERR_NOTFLIPPABLE: Result := 'An attempt has been made to flip a surface that is not flippable.';
DDERR_NOTFOUND: Result := 'Requested item was not found.';
DDERR_NOTLOCKED: Result := 'Surface was not locked. An attempt to unlock a surface that was not locked at all, or by this process, has been attempted.';
DDERR_NOTPALETTIZED: Result := 'The surface being used is not a palette-based surface.';
DDERR_NOVSYNCHW: Result := 'Operation could not be carried out because there is no hardware support for vertical blank synchronized operations.';
DDERR_NOZBUFFERHW: Result := 'Operation could not be carried out because there is no hardware support for zbuffer blitting.';
DDERR_NOZOVERLAYHW: Result := 'Overlay surfaces could not be z layered based on their BltOrder because the hardware does not support z layering of overlays.';
DDERR_OUTOFCAPS: Result := 'The hardware needed for the requested operation has already been allocated.';
DDERR_OUTOFMEMORY: Result := 'DirectDraw does not have enough memory to perform the operation.';
DDERR_OUTOFVIDEOMEMORY: Result := 'DirectDraw does not have enough memory to perform the operation.';
DDERR_OVERLAYCANTCLIP: Result := 'The hardware does not support clipped overlays.';
DDERR_OVERLAYCOLORKEYONLYONEACTIVE: Result := 'Can only have ony color key active at one time for overlays.';
DDERR_OVERLAYNOTVISIBLE: Result := 'Returned when GetOverlayPosition is called on a hidden overlay.';
DDERR_PALETTEBUSY: Result := 'Access to this palette is being refused because the palette is already locked by another thread.';
DDERR_PRIMARYSURFACEALREADYEXISTS: Result := 'This process already has created a primary surface.';
DDERR_REGIONTOOSMALL: Result := 'Region passed to Clipper::GetClipList is too small.';
DDERR_SURFACEALREADYATTACHED: Result := 'This surface is already attached to the surface it is being attached to.';
DDERR_SURFACEALREADYDEPENDENT: Result := 'This surface is already a dependency of the surface it is being made a dependency of.';
DDERR_SURFACEBUSY: Result := 'Access to this surface is being refused because the surface is already locked by another thread.';
DDERR_SURFACEISOBSCURED: Result := 'Access to surface refused because the surface is obscured.';
DDERR_SURFACELOST: Result := 'Access to this surface is being refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have Restore called on it.';
DDERR_SURFACENOTATTACHED: Result := 'The requested surface is not attached.';
DDERR_TOOBIGHEIGHT: Result := 'Height requested by DirectDraw is too large.';
DDERR_TOOBIGSIZE: Result := 'Size requested by DirectDraw is too large, but the individual height and width are OK.';
DDERR_TOOBIGWIDTH: Result := 'Width requested by DirectDraw is too large.';
DDERR_UNSUPPORTED: Result := 'Action not supported.';
DDERR_UNSUPPORTEDFORMAT: Result := 'FOURCC format requested is unsupported by DirectDraw.';
DDERR_UNSUPPORTEDMASK: Result := 'Bitmask in the pixel format requested is unsupported by DirectDraw.';
DDERR_VERTICALBLANKINPROGRESS: Result := 'Vertical blank is in progress.';
DDERR_WASSTILLDRAWING: Result := 'Informs DirectDraw that the previous Blt which is transfering information to or from this Surface is incomplete.';
DDERR_WRONGMODE: Result := 'This surface can not be restored because it was created in a different mode.';
DDERR_XALIGN: Result := 'Rectangle provided was not horizontally aligned on required boundary.';
// new:
DDERR_OVERLAPPINGRECTS: Result := 'Operation could not be carried out because the source and destination rectangles are on the same surface and overlap each other.';
DDERR_INVALIDSTREAM: Result := 'The specified stream contains invalid data';
DDERR_UNSUPPORTEDMODE: Result := 'The display is currently in an unsupported mode';
DDERR_NOMIPMAPHW: Result := 'Operation could not be carried out because there is no mip-map texture mapping hardware present or available.';
DDERR_INVALIDSURFACETYPE: Result := 'The requested action could not be performed because the surface was of the wrong type.';
DDERR_NOOPTIMIZEHW: Result := 'Device does not support optimized surfaces, therefore no video memory optimized surfaces';
DDERR_NOTLOADED: Result := 'Surface is an optimized surface, but has not yet been allocated any memory';
DDERR_NOFOCUSWINDOW: Result := 'Attempt was made to create or set a device window without first setting the focus window';
DDERR_DCALREADYCREATED: Result := 'A DC has already been returned for this surface. Only one DC can be retrieved per surface.';
DDERR_NONONLOCALVIDMEM: Result := 'An attempt was made to allocate non-local video memory from a device that does not support non-local video memory.';
DDERR_CANTPAGELOCK: Result := 'The attempt to page lock a surface failed.';
DDERR_CANTPAGEUNLOCK: Result := 'The attempt to page unlock a surface failed.';
DDERR_NOTPAGELOCKED: Result := 'An attempt was made to page unlock a surface with no outstanding page locks.';
DDERR_MOREDATA: Result := 'There is more data available than the specified buffer size could hold';
DDERR_EXPIRED: Result := 'The data has expired and is therefore no longer valid.';
DDERR_VIDEONOTACTIVE: Result := 'The video port is not active';
DDERR_DEVICEDOESNTOWNSURFACE: Result := 'Surfaces created by one direct draw device cannot be used directly by another direct draw device.';
DDERR_NOTINITIALIZED: Result := 'An attempt was made to invoke an interface member of a DirectDraw object created by CoCreateInstance() before it was initialized.';
else Result := 'Unrecognized Error';
end;
end;
function DirectDrawCreate; external DDrawLib;
function DirectDrawCreateEx; external DDrawLib;
function DirectDrawCreateClipper; external DDrawLib;
 
//Direct3D file
{ Direct3D }
 
function DXFileErrorString(Value: HResult) : string;
function D3DVALP(val: TD3DValue; prec: Integer): TD3DValue;
begin
case Value of
DXFILE_OK: Result := 'Command completed successfully. Equivalent to DD_OK.';
DXFILEERR_BADVALUE: Result := 'Parameter is invalid.';
DXFILEERR_BADTYPE: Result := 'Object type is invalid.';
DXFILEERR_BADALLOC: Result := 'Memory allocation failed.';
DXFILEERR_NOTFOUND: Result := 'Object could not be found.';
DXFILEERR_FILENOTFOUND: Result := 'File could not be found.';
DXFILEERR_RESOURCENOTFOUND: Result := 'Resource could not be found.';
DXFILEERR_URLNOTFOUND: Result := 'URL could not be found.';
DXFILEERR_BADRESOURCE: Result := 'Resource is invalid.';
DXFILEERR_BADFILETYPE: Result := 'File is not a DirectX file.';
DXFILEERR_BADFILEVERSION: Result := 'File version is not valid.';
DXFILEERR_BADFILEFLOATSIZE: Result := 'Floating-point size is invalid.';
DXFILEERR_BADFILE: Result := 'File is invalid.';
DXFILEERR_PARSEERROR: Result := 'File could not be parsed.';
DXFILEERR_BADARRAYSIZE: Result := 'Array size is invalid.';
DXFILEERR_BADDATAREFERENCE: Result := 'Data reference is invalid.';
DXFILEERR_NOMOREOBJECTS: Result := 'All objects have been enumerated.';
DXFILEERR_NOMOREDATA: Result := 'No further data is available.';
else Result := 'Unrecognized Error';
end;
Result := val;
end;
 
function D3DFVF_TEXCOORDSIZE3(CoordIndex: DWORD) : DWORD;
function D3DVAL(val: TD3DValue): TD3DValue;
begin
Result := (D3DFVF_TEXTUREFORMAT3 shl (CoordIndex*2 + 16));
end;
 
function D3DFVF_TEXCOORDSIZE2(CoordIndex: DWORD) : DWORD;
begin
Result := (D3DFVF_TEXTUREFORMAT2);
end;
 
function D3DFVF_TEXCOORDSIZE4(CoordIndex: DWORD) : DWORD;
begin
Result := (D3DFVF_TEXTUREFORMAT4 shl (CoordIndex*2 + 16));
end;
 
function D3DFVF_TEXCOORDSIZE1(CoordIndex: DWORD) : DWORD;
begin
Result := (D3DFVF_TEXTUREFORMAT1 shl (CoordIndex*2 + 16));
end;
 
 
function D3DVal(val: variant) : float;
begin
Result := val;
end;
 
function D3DDivide(a,b: double) : float;
function D3DDivide(a, b: TD3DValue): TD3DValue;
begin
Result := a / b;
end;
 
function D3DMultiply(a,b: double) : float;
function D3DMultiply(a, b: TD3DValue): TD3DValue;
begin
Result := a * b;
end;
 
// #define CI_GETALPHA(ci) ((ci) >> 24)
function CI_GETALPHA(ci: DWORD) : DWORD;
function CI_GETALPHA(ci: Integer): Byte;
begin
Result := ci shr 24;
end;
 
// #define CI_GETINDEX(ci) (((ci) >> 8) & 0xffff)
function CI_GETINDEX(ci: DWORD) : DWORD;
function CI_GETINDEX(ci: Integer): Word;
begin
Result := (ci shr 8) and $ffff;
Result := ci shr 8;
end;
 
// #define CI_GETFRACTION(ci) ((ci) & 0xff)
function CI_GETFRACTION(ci: DWORD) : DWORD;
function CI_GETFRACTION(ci: Integer): Byte;
begin
Result := ci and $ff;
Result := ci;
end;
 
// #define CI_ROUNDINDEX(ci) CI_GETINDEX((ci) + 0x80)
function CI_ROUNDINDEX(ci: DWORD) : DWORD;
function CI_ROUNDINDEX(ci: Integer): Integer;
begin
Result := CI_GETINDEX(ci + $80);
Result := CI_GETINDEX(ci)+$80;
end;
 
// #define CI_MASKALPHA(ci) ((ci) & 0xffffff)
function CI_MASKALPHA(ci: DWORD) : DWORD;
function CI_MASKALPHA(ci: Integer): Integer;
begin
Result := ci and $ffffff;
Result := ci and $FFFFFF;
end;
 
// #define CI_MAKE(a, i, f) (((a) << 24) | ((i) << 8) | (f))
function CI_MAKE(a,i,f: DWORD) : DWORD;
function CI_MAKE(a: Byte; i: Word; f: Byte): Integer;
begin
Result := (a shl 24) or (i shl 8) or f;
end;
 
// #define RGBA_GETALPHA(rgb) ((rgb) >> 24)
function RGBA_GETALPHA(rgb: TD3DColor) : DWORD;
function RGBA_GETALPHA(rgb: TD3DColor): Byte;
begin
Result := rgb shr 24;
end;
 
// #define RGBA_GETRED(rgb) (((rgb) >> 16) & 0xff)
function RGBA_GETRED(rgb: TD3DColor) : DWORD;
function RGBA_GETRED(rgb: TD3DColor): Byte;
begin
Result := (rgb shr 16) and $ff;
Result := rgb shr 16;
end;
 
// #define RGBA_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
function RGBA_GETGREEN(rgb: TD3DColor) : DWORD;
function RGBA_GETGREEN(rgb: TD3DColor): Byte;
begin
Result := (rgb shr 8) and $ff;
Result := rgb shr 8;
end;
 
// #define RGBA_GETBLUE(rgb) ((rgb) & 0xff)
function RGBA_GETBLUE(rgb: TD3DColor) : DWORD;
function RGBA_GETBLUE(rgb: TD3DColor): Byte;
begin
Result := rgb and $ff;
Result := rgb;
end;
 
// #define RGBA_MAKE(r, g, b, a) ((TD3DColor) (((a) << 24) | ((r) << 16) | ((g) << 8) | (b)))
function RGBA_MAKE(r, g, b, a: DWORD) : TD3DColor;
function RGBA_MAKE(r, g, b, a: Byte): TD3DColor;
begin
Result := (a shl 24) or (r shl 16) or (g shl 8) or b;
end;
 
// #define D3DRGB(r, g, b) \
// (0xff000000L | (((long)((r) * 255)) << 16) | (((long)((g) * 255)) << 8) | (long)((b) * 255))
function D3DRGB(r, g, b: float) : TD3DColor;
function D3DRGB(r, g, b: TD3DValue): TD3DColor;
begin
Result := $ff000000 or (round(r * 255) shl 16)
or (round(g * 255) shl 8)
or round(b * 255);
Result := $FF000000 or (Trunc(r*255) shl 16) or (Trunc(g*255) shl 8) or
(Trunc(b*255));
end;
 
// #define D3DRGBA(r, g, b, a) \
// ( (((long)((a) * 255)) << 24) | (((long)((r) * 255)) << 16) \
// | (((long)((g) * 255)) << 8) | (long)((b) * 255) \
// )
function D3DRGBA(r, g, b, a: float) : TD3DColor;
function D3DRGBA(r, g, b, a: TD3DValue): TD3DColor;
begin
Result := (round(a * 255) shl 24) or (round(r * 255) shl 16)
or (round(g * 255) shl 8)
or round(b * 255);
Result := (Trunc(a*255) shl 24) or (Trunc(r*255) shl 16) or (Trunc(g*255) shl 8) or
(Trunc(b*255));
end;
 
// #define RGB_GETRED(rgb) (((rgb) >> 16) & 0xff)
function RGB_GETRED(rgb: TD3DColor) : DWORD;
function RGB_GETRED(rgb: TD3DColor): Byte;
begin
Result := (rgb shr 16) and $ff;
Result := rgb shr 16;
end;
 
// #define RGB_GETGREEN(rgb) (((rgb) >> 8) & 0xff)
function RGB_GETGREEN(rgb: TD3DColor) : DWORD;
function RGB_GETGREEN(rgb: TD3DColor): Byte;
begin
Result := (rgb shr 8) and $ff;
Result := rgb shr 8;
end;
 
// #define RGB_GETBLUE(rgb) ((rgb) & 0xff)
function RGB_GETBLUE(rgb: TD3DColor) : DWORD;
function RGB_GETBLUE(rgb: TD3DColor): Byte;
begin
Result := rgb and $ff;
Result := rgb;
end;
 
// #define RGBA_SETALPHA(rgba, x) (((x) << 24) | ((rgba) & 0x00ffffff))
function RGBA_SETALPHA(rgba: TD3DColor; x: DWORD) : TD3DColor;
function RGBA_SETALPHA(rgba: TD3DColor; x: Byte): TD3DColor;
begin
Result := (x shl 24) or (rgba and $00ffffff);
Result := (x shl 24) or (rgba and $00FFFFFF);
end;
 
// #define RGB_MAKE(r, g, b) ((TD3DColor) (((r) << 16) | ((g) << 8) | (b)))
function RGB_MAKE(r, g, b: DWORD) : TD3DColor;
function RGB_MAKE(r, g, b: Byte): TD3DColor;
begin
Result := (r shl 16) or (g shl 8) or b;
end;
 
// #define RGBA_TORGB(rgba) ((TD3DColor) ((rgba) & 0xffffff))
function RGBA_TORGB(rgba: TD3DColor) : TD3DColor;
function RGBA_TORGB(rgba: TD3DColor): TD3DColor;
begin
Result := rgba and $00ffffff;
Result := rgba and $00FFFFFF;
end;
 
// #define RGB_TORGBA(rgb) ((TD3DColor) ((rgb) | 0xff000000))
function RGB_TORGBA(rgb: TD3DColor) : TD3DColor;
function RGB_TORGBA(rgb: TD3DColor): TD3DColor;
begin
Result := rgb or $ff000000;
Result := rgb or $FF000000;
end;
 
 
function D3DSTATE_OVERRIDE(StateType: DWORD) : DWORD;
function VectorAdd(v1, v2: TD3DVector) : TD3DVector;
begin
Result := StateType + D3DSTATE_OVERRIDE_BIAS;
end;
 
function D3DTRIFLAG_STARTFLAT(len: DWORD) : DWORD;
begin
if not (len in [1..29]) then len := 0;
result := len;
end;
 
// #define D3DRENDERSTATE_STIPPLEPATTERN(y) (D3DRENDERSTATE_STIPPLEPATTERN00 + (y))
function D3DRENDERSTATE_STIPPLEPATTERN(y: integer) : TD3DRenderStateType;
begin
Result := TD3DRenderStateType(Ord(D3DRENDERSTATE_STIPPLEPATTERN00) + y);
end;
 
 
 
 
// Addition and subtraction
function VectorAdd(const v1, v2: TD3DVector) : TD3DVector;
begin
result.x := v1.x+v2.x;
result.y := v1.y+v2.y;
result.z := v1.z+v2.z;
end;
 
function VectorSub(const v1, v2: TD3DVector) : TD3DVector;
function VectorSub(v1, v2: TD3DVector) : TD3DVector;
begin
result.x := v1.x-v2.x;
result.y := v1.y-v2.y;
22158,8 → 15645,7
result.z := v1.z-v2.z;
end;
 
// Scalar multiplication and division
function VectorMulS(const v: TD3DVector; s: TD3DValue) : TD3DVector;
function VectorMulS(v: TD3DVector; s: TD3DValue) : TD3DVector;
begin
result.x := v.x*s;
result.y := v.y*s;
22166,7 → 15652,7
result.z := v.z*s;
end;
 
function VectorDivS(const v: TD3DVector; s: TD3DValue) : TD3DVector;
function VectorDivS(v: TD3DVector; s: TD3DValue) : TD3DVector;
begin
result.x := v.x/s;
result.y := v.y/s;
22173,8 → 15659,7
result.z := v.z/s;
end;
 
// Memberwise multiplication and division
function VectorMul(const v1, v2: TD3DVector) : TD3DVector;
function VectorMul(v1, v2: TD3DVector) : TD3DVector;
begin
result.x := v1.x*v2.x;
result.y := v1.y*v2.y;
22181,7 → 15666,7
result.z := v1.z*v2.z;
end;
 
function VectorDiv(const v1, v2: TD3DVector) : TD3DVector;
function VectorDiv(v1, v2: TD3DVector) : TD3DVector;
begin
result.x := v1.x/v2.x;
result.y := v1.y/v2.y;
22188,7 → 15673,6
result.z := v1.z/v2.z;
end;
 
// Vector dominance
function VectorSmaller(v1, v2: TD3DVector) : boolean;
begin
result := (v1.x < v2.x) and (v1.y < v2.y) and (v1.z < v2.z);
22199,13 → 15683,11
result := (v1.x <= v2.x) and (v1.y <= v2.y) and (v1.z <= v2.z);
end;
 
// Bitwise equality
function VectorEquel(v1, v2: TD3DVector) : boolean;
begin
result := (v1.x = v2.x) and (v1.y = v2.y) and (v1.z = v2.z);
end;
 
// Length-related functions
function VectorSquareMagnitude(v: TD3DVector) : TD3DValue;
begin
result := (v.x*v.x) + (v.y*v.y) + (v.z*v.z);
22213,16 → 15695,14
 
function VectorMagnitude(v: TD3DVector) : TD3DValue;
begin
result := sqrt((v.x*v.x) + (v.y*v.y) + (v.z*v.z));
result := sqrt( (v.x*v.x) + (v.y*v.y) + (v.z*v.z) );
end;
 
// Returns vector with same direction and unit length
function VectorNormalize(const v: TD3DVector) : TD3DVector;
function VectorNormalize(v: TD3DVector) : TD3DVector;
begin
result := VectorDivS(v,VectorMagnitude(v));
end;
 
// Return min/max component of the input vector
function VectorMin(v: TD3DVector) : TD3DValue;
var
ret : TD3DValue;
22243,8 → 15723,7
result := ret;
end;
 
// Return memberwise min/max of input vectors
function VectorMinimize(const v1, v2: TD3DVector) : TD3DVector;
function VectorMinimize(v1, v2: TD3DVector) : TD3DVector;
begin
if v1.x < v2.x then result.x := v1.x else result.x := v2.x;
if v1.y < v2.y then result.y := v1.y else result.y := v2.y;
22251,7 → 15730,7
if v1.z < v2.z then result.z := v1.z else result.z := v2.z;
end;
 
function VectorMaximize(const v1, v2: TD3DVector) : TD3DVector;
function VectorMaximize(v1, v2: TD3DVector) : TD3DVector;
begin
if v1.x > v2.x then result.x := v1.x else result.x := v2.x;
if v1.y > v2.y then result.y := v1.y else result.y := v2.y;
22258,13 → 15737,12
if v1.z > v2.z then result.z := v1.z else result.z := v2.z;
end;
 
// Dot and cross product
function VectorDotProduct(v1, v2: TD3DVector) : TD3DValue;
begin
result := (v1.x*v2.x) + (v1.y * v2.y) + (v1.z*v2.z);
end;
 
function VectorCrossProduct(const v1, v2: TD3DVector) : TD3DVector;
function VectorCrossProduct(v1, v2: TD3DVector) : TD3DVector;
begin
result.x := (v1.y*v2.z) - (v1.z*v2.y);
result.y := (v1.z*v2.x) - (v1.x*v2.z);
22271,819 → 15749,245
result.z := (v1.x*v2.y) - (v1.y*v2.x);
end;
 
procedure DisableFPUExceptions;
var
FPUControlWord: WORD;
asm
FSTCW FPUControlWord;
OR FPUControlWord, $4 + $1; { Divide by zero + invalid operation }
FLDCW FPUControlWord;
end;
 
procedure EnableFPUExceptions;
var
FPUControlWord: WORD;
asm
FSTCW FPUControlWord;
AND FPUControlWord, $FFFF - $4 - $1; { Divide by zero + invalid operation }
FLDCW FPUControlWord;
end;
 
function D3DErrorString(Value: HResult) : string; //Full description not available yet
function D3DSTATE_OVERRIDE(typ: DWORD): DWORD;
begin
case Value of
D3D_OK: Result := 'No error';
 
D3DERR_BADMAJORVERSION: Result := 'D3DERR_BADMAJORVERSION';
D3DERR_BADMINORVERSION: Result := 'D3DERR_BADMINORVERSION';
 
D3DERR_INVALID_DEVICE: Result := 'D3DERR_INITFAILED';
D3DERR_INITFAILED: Result := 'D3DERR_INITFAILED';
 
D3DERR_DEVICEAGGREGATED: Result := 'D3DERR_DEVICEAGGREGATED';
 
D3DERR_EXECUTE_CREATE_FAILED: Result := 'D3DERR_EXECUTE_CREATE_FAILED';
D3DERR_EXECUTE_DESTROY_FAILED: Result := 'D3DERR_EXECUTE_DESTROY_FAILED';
D3DERR_EXECUTE_LOCK_FAILED: Result := 'D3DERR_EXECUTE_LOCK_FAILED';
D3DERR_EXECUTE_UNLOCK_FAILED: Result := 'D3DERR_EXECUTE_UNLOCK_FAILED';
D3DERR_EXECUTE_LOCKED: Result := 'D3DERR_EXECUTE_LOCKED';
D3DERR_EXECUTE_NOT_LOCKED: Result := 'D3DERR_EXECUTE_NOT_LOCKED';
 
D3DERR_EXECUTE_FAILED: Result := 'D3DERR_EXECUTE_FAILED';
D3DERR_EXECUTE_CLIPPED_FAILED: Result := 'D3DERR_EXECUTE_CLIPPED_FAILED';
 
D3DERR_TEXTURE_NO_SUPPORT: Result := 'D3DERR_TEXTURE_NO_SUPPORT';
D3DERR_TEXTURE_CREATE_FAILED: Result := 'D3DERR_TEXTURE_CREATE_FAILED';
D3DERR_TEXTURE_DESTROY_FAILED: Result := 'D3DERR_TEXTURE_DESTROY_FAILED';
D3DERR_TEXTURE_LOCK_FAILED: Result := 'D3DERR_TEXTURE_LOCK_FAILED';
D3DERR_TEXTURE_UNLOCK_FAILED: Result := 'D3DERR_TEXTURE_UNLOCK_FAILED';
D3DERR_TEXTURE_LOAD_FAILED: Result := 'D3DERR_TEXTURE_LOAD_FAILED';
D3DERR_TEXTURE_SWAP_FAILED: Result := 'D3DERR_TEXTURE_SWAP_FAILED';
D3DERR_TEXTURE_LOCKED: Result := 'D3DERR_TEXTURELOCKED';
D3DERR_TEXTURE_NOT_LOCKED: Result := 'D3DERR_TEXTURE_NOT_LOCKED';
D3DERR_TEXTURE_GETSURF_FAILED: Result := 'D3DERR_TEXTURE_GETSURF_FAILED';
 
D3DERR_MATRIX_CREATE_FAILED: Result := 'D3DERR_MATRIX_CREATE_FAILED';
D3DERR_MATRIX_DESTROY_FAILED: Result := 'D3DERR_MATRIX_DESTROY_FAILED';
D3DERR_MATRIX_SETDATA_FAILED: Result := 'D3DERR_MATRIX_SETDATA_FAILED';
D3DERR_MATRIX_GETDATA_FAILED: Result := 'D3DERR_MATRIX_GETDATA_FAILED';
D3DERR_SETVIEWPORTDATA_FAILED: Result := 'D3DERR_SETVIEWPORTDATA_FAILED';
 
D3DERR_INVALIDCURRENTVIEWPORT: Result := 'D3DERR_INVALIDCURRENTVIEWPORT';
D3DERR_INVALIDPRIMITIVETYPE: Result := 'D3DERR_INVALIDPRIMITIVETYPE';
D3DERR_INVALIDVERTEXTYPE: Result := 'D3DERR_INVALIDVERTEXTYPE';
D3DERR_TEXTURE_BADSIZE: Result := 'D3DERR_TEXTURE_BADSIZE';
D3DERR_INVALIDRAMPTEXTURE: Result := 'D3DERR_INVALIDRAMPTEXTURE';
 
D3DERR_MATERIAL_CREATE_FAILED: Result := 'D3DERR_MATERIAL_CREATE_FAILED';
D3DERR_MATERIAL_DESTROY_FAILED: Result := 'D3DERR_MATERIAL_DESTROY_FAILED';
D3DERR_MATERIAL_SETDATA_FAILED: Result := 'D3DERR_MATERIAL_SETDATA_FAILED';
D3DERR_MATERIAL_GETDATA_FAILED: Result := 'D3DERR_MATERIAL_GETDATA_FAILED';
 
D3DERR_INVALIDPALETTE: Result := 'D3DERR_INVALIDPALETTE';
 
D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY: Result := 'D3DERR_ZBUFF_NEEDS_SYSTEMMEMORY';
D3DERR_ZBUFF_NEEDS_VIDEOMEMORY: Result := 'D3DERR_ZBUFF_NEEDS_VIDEOMEMORY';
D3DERR_SURFACENOTINVIDMEM: Result := 'D3DERR_SURFACENOTINVIDMEM';
 
D3DERR_LIGHT_SET_FAILED: Result := 'D3DERR_LIGHT_SET_FAILED';
D3DERR_LIGHTHASVIEWPORT: Result := 'D3DERR_LIGHTHASVIEWPORT';
D3DERR_LIGHTNOTINTHISVIEWPORT: Result := 'D3DERR_LIGHTNOTINTHISVIEWPORT';
 
D3DERR_SCENE_IN_SCENE: Result := 'D3DERR_SCENE_IN_SCENE';
D3DERR_SCENE_NOT_IN_SCENE: Result := 'D3DERR_SCENE_NOT_IN_SCENE';
D3DERR_SCENE_BEGIN_FAILED: Result := 'D3DERR_SCENE_BEGIN_FAILED';
D3DERR_SCENE_END_FAILED: Result := 'D3DERR_SCENE_END_FAILED';
 
D3DERR_INBEGIN: Result := 'D3DERR_INBEGIN';
D3DERR_NOTINBEGIN: Result := 'D3DERR_NOTINBEGIN';
D3DERR_NOVIEWPORTS: Result := 'D3DERR_NOVIEWPORTS';
D3DERR_VIEWPORTDATANOTSET: Result := 'D3DERR_VIEWPORTDATANOTSET';
D3DERR_VIEWPORTHASNODEVICE: Result := 'D3DERR_VIEWPORTHASNODEVICE';
D3DERR_NOCURRENTVIEWPORT: Result := 'D3DERR_NOCURRENTVIEWPORT';
 
D3DERR_INVALIDVERTEXFORMAT: Result := 'D3DERR_INVALIDVERTEXFORMAT';
 
D3DERR_COLORKEYATTACHED: Result := 'D3DERR_COLORKEYATTACHED';
 
D3DERR_VERTEXBUFFEROPTIMIZED: Result := 'D3DERR_VERTEXBUFFEROPTIMIZED';
D3DERR_VBUF_CREATE_FAILED: Result := 'D3DERR_VBUF_CREATE_FAILED';
D3DERR_VERTEXBUFFERLOCKED: Result := 'D3DERR_VERTEXBUFFERLOCKED';
 
D3DERR_ZBUFFER_NOTPRESENT: Result := 'D3DERR_ZBUFFER_NOTPRESENT';
D3DERR_STENCILBUFFER_NOTPRESENT: Result := 'D3DERR_STENCILBUFFER_NOTPRESENT';
 
D3DERR_WRONGTEXTUREFORMAT: Result := 'D3DERR_WRONGTEXTUREFORMAT';
D3DERR_UNSUPPORTEDCOLOROPERATION: Result := 'D3DERR_UNSUPPORTEDCOLOROPERATION';
D3DERR_UNSUPPORTEDCOLORARG: Result := 'D3DERR_UNSUPPORTEDCOLORARG';
D3DERR_UNSUPPORTEDALPHAOPERATION: Result := 'D3DERR_UNSUPPORTEDALPHAOPERATION';
D3DERR_UNSUPPORTEDALPHAARG: Result := 'D3DERR_UNSUPPORTEDALPHAARG';
D3DERR_TOOMANYOPERATIONS: Result := 'D3DERR_TOOMANYOPERATIONS';
D3DERR_CONFLICTINGTEXTUREFILTER: Result := 'D3DERR_CONFLICTINGTEXTUREFILTER';
D3DERR_UNSUPPORTEDFACTORVALUE: Result := 'D3DERR_UNSUPPORTEDFACTORVALUE';
 
D3DERR_CONFLICTINGRENDERSTATE: Result := 'D3DERR_CONFLICTINGRENDERSTATE';
D3DERR_UNSUPPORTEDTEXTUREFILTER: Result := 'D3DERR_UNSUPPORTEDTEXTUREFILTER';
D3DERR_TOOMANYPRIMITIVES: Result := 'D3DERR_TOOMANYPRIMITIVES';
D3DERR_INVALIDMATRIX: Result := 'D3DERR_INVALIDMATRIX';
D3DERR_TOOMANYVERTICES: Result := 'D3DERR_TOOMANYVERTICES';
D3DERR_CONFLICTINGTEXTUREPALETTE: Result := 'D3DERR_CONFLICTINGTEXTUREPALETTE';
 
else Result := 'Unrecognized Error';
end;
Result := typ + D3DSTATE_OVERRIDE_BIAS;
end;
{$IFDEF D3DRM}
//Direct3DRM file
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3drmdef.h
* Content: Direct3DRM include file
*
***************************************************************************)
 
procedure D3DRMAnimationGetRotateKey
(var rmKey: TD3DRMAnimationKey; var rmQuat: TD3DRMQuaternion);
function D3DRENDERSTATE_STIPPLEPATTERN(y: DWORD): TD3DRenderStateType;
begin
rmQuat := rmKey.dqRotateKey;
Result := TD3DRenderStateType(Ord(D3DRENDERSTATE_STIPPLEPATTERN00)+y);
end;
 
procedure D3DRMAnimationGetScaleKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
function D3DTRIFLAG_STARTFLAT(len: DWORD) : DWORD;
begin
dvVec := rmKey.dvScaleKey;
if not (len in [1..29]) then len := 0;
result := len;
end;
 
procedure D3DRMAnimationGetPositionKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
function D3DFVF_TEXCOORDSIZE3(CoordIndex: DWORD): DWORD;
begin
dvVec := rmKey.dvPositionKey;
Result := D3DFVF_TEXTUREFORMAT3 shl (CoordIndex*2 + 16);
end;
 
procedure D3DRMAnimatioSetRotateKey
(var rmKey: TD3DRMAnimationKey; var rmQuat: TD3DRMQuaternion);
function D3DFVF_TEXCOORDSIZE2(CoordIndex: DWORD): DWORD;
begin
rmKey.dqRotateKey := rmQuat;
Result := D3DFVF_TEXTUREFORMAT2;
end;
 
procedure D3DRMAnimationSetScaleKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
function D3DFVF_TEXCOORDSIZE4(CoordIndex: DWORD): DWORD;
begin
rmKey.dvScaleKey := dvVec;
Result := D3DFVF_TEXTUREFORMAT4 shl (CoordIndex*2 + 16);
end;
 
procedure D3DRMAnimationSetPositionKey
(var rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
function D3DFVF_TEXCOORDSIZE1(CoordIndex: DWORD): DWORD;
begin
rmKey.dvPositionKey := dvVec;
Result := D3DFVF_TEXTUREFORMAT1 shl (CoordIndex*2 + 16);
end;
 
(*==========================================================================;
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: d3drm.h
* Content: Direct3DRM include file
*
***************************************************************************)
{ Direct3DRM }
 
function D3DRMErrorString(Value: HResult) : string;
procedure D3DRMAnimationGetRotateKey(const rmKey: TD3DRMAnimationKey; var rmQuat: TD3DRMQuaternion);
begin
case Value of
D3DRM_OK: Result := 'No error. Equivalent to DD_OK.';
D3DRMERR_BADALLOC: Result := 'Out of memory.';
D3DRMERR_BADDEVICE: Result := 'Device is not compatible with renderer.';
D3DRMERR_BADFILE: Result := 'Data file is corrupt.';
D3DRMERR_BADMAJORVERSION: Result := 'Bad DLL major version.';
D3DRMERR_BADMINORVERSION: Result := 'Bad DLL minor version.';
D3DRMERR_BADOBJECT: Result := 'Object expected in argument.';
D3DRMERR_BADPMDATA: Result := 'The data in the .x file is corrupted. The conversion to a progressive mesh succeeded but produced an invalid progressive mesh in the .x file.';
D3DRMERR_BADTYPE: Result := 'Bad argument type passed.';
D3DRMERR_BADVALUE: Result := 'Bad argument value passed.';
D3DRMERR_BOXNOTSET: Result := 'An attempt was made to access a bounding box (for example, with IDirect3DRMFrame3::GetBox) when no bounding box was set on the frame.';
D3DRMERR_CLIENTNOTREGISTERED: Result := 'Client has not been registered. Call IDirect3DRM3::RegisterClient.';
D3DRMERR_CONNECTIONLOST: Result := 'Data connection was lost during a load, clone, or duplicate.';
D3DRMERR_ELEMENTINUSE: Result := 'Element can´t be modified or deleted while in use. To empty a submesh, call Empty() against its parent.';
// D3DRMERR_ENTRYINUSE: Result := 'Vertex or normal entries are currently in use by a face and cannot be deleted.';
D3DRMERR_FACEUSED: Result := 'Face already used in a mesh.';
D3DRMERR_FILENOTFOUND: Result := 'File cannot be opened.';
// D3DRMERR_INCOMPATIBLEKEY: Result := 'Specified animation key is incompatible. The key cannot be modified.';
D3DRMERR_INVALIDLIBRARY: Result := 'Specified libary is invalid.';
// D3DRMERR_INVALIDOBJECT: Result := 'Method received a pointer to an object that is invalid.';
// D3DRMERR_INVALIDPARAMS: Result := 'One of the parameters passed to the method is invalid.';
D3DRMERR_LIBRARYNOTFOUND: Result := 'Specified libary not found.';
D3DRMERR_LOADABORTED: Result := 'Load aborted by user.';
D3DRMERR_NOSUCHKEY: Result := 'Specified animation key does not exist.';
D3DRMERR_NOTCREATEDFROMDDS: Result := 'Specified texture was not created from a DirectDraw Surface.';
D3DRMERR_NOTDONEYET: Result := 'Unimplemented.';
D3DRMERR_NOTENOUGHDATA: Result := 'Not enough data has been loaded to perform the requested operation.';
D3DRMERR_NOTFOUND: Result := 'Object not found in specified place.';
// D3DRMERR_OUTOFRANGE: Result := 'Specified value is out of range.';
D3DRMERR_PENDING: Result := 'Data required to supply the requested information has not finished loading.';
D3DRMERR_REQUESTTOOLARGE: Result := 'Attempt was made to set a level of detail in a progressive mesh greater than the maximum available.';
D3DRMERR_REQUESTTOOSMALL: Result := 'Attempt was made to set the minimum rendering detail of a progressive mesh smaller than the detail in the base mesh (the minimum for rendering).';
D3DRMERR_TEXTUREFORMATNOTFOUND: Result := 'Texture format could not be found that meets the specified criteria and that the underlying Immediate Mode device supports.';
D3DRMERR_UNABLETOEXECUTE: Result := 'Unable to carry out procedure.';
DDERR_INVALIDOBJECT: Result := 'Received pointer that was an invalid object.';
DDERR_INVALIDPARAMS: Result := 'One or more of the parameters passed to the method are incorrect.';
DDERR_NOTFOUND: Result := 'The requested item was not found.';
DDERR_NOTINITIALIZED: Result := 'An attempt was made to call an interface method of an object created by CoCreateInstance before the object was initialized.';
DDERR_OUTOFMEMORY: Result := 'DirectDraw does not have enough memory to perform the operation.';
else Result := 'Unrecognized Error';
end;
rmQuat.s := rmKey.dvK[0];
rmQuat.v.x := rmKey.dvK[1];
rmQuat.v.y := rmKey.dvK[2];
rmQuat.v.z := rmKey.dvK[3];
end;
{$ENDIF}
//DirectInput file
 
 
function DIMAKEUSAGEDWORD(UsagePage, Usage: WORD) : DWORD;
procedure D3DRMAnimationGetScaleKey(const rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
begin
Result := Usage or (UsagePage shl 16);
dvVec.x := rmKey.dvK[0];
dvVec.y := rmKey.dvK[1];
dvVec.z := rmKey.dvK[2];
end;
 
 
function DIEFT_GETTYPE(n: variant) : byte;
procedure D3DRMAnimationGetPositionKey(const rmKey: TD3DRMAnimationKey; var dvVec: TD3DVector);
begin
Result := byte(n);
dvVec.x := rmKey.dvK[0];
dvVec.y := rmKey.dvK[1];
dvVec.z := rmKey.dvK[2];
end;
 
function GET_DIDEVICE_TYPE(dwDevType: variant) : byte;
procedure D3DRMAnimationSetRotateKey(var rmKey: TD3DRMAnimationKey; const rmQuat: TD3DRMQuaternion);
begin
Result := byte(dwDevType);
rmKey.dvK[0] := rmQuat.s;
rmKey.dvK[1] := rmQuat.v.x;
rmKey.dvK[2] := rmQuat.v.y;
rmKey.dvK[3] := rmQuat.v.z;
end;
 
function GET_DIDEVICE_SUBTYPE(dwDevType: variant) : byte;
procedure D3DRMAnimationSetScaleKey(var rmKey: TD3DRMAnimationKey; const dvVec: TD3DVector);
begin
Result := hi(word(dwDevType));
rmKey.dvK[0] := dvVec.x;
rmKey.dvK[1] := dvVec.y;
rmKey.dvK[2] := dvVec.z;
end;
 
function DIDFT_MAKEINSTANCE(n: variant) : DWORD;
procedure D3DRMAnimationSetPositionKey(var rmKey: TD3DRMAnimationKey; const dvVec: TD3DVector);
begin
Result := word(n) shl 8;
rmKey.dvK[0] := dvVec.x;
rmKey.dvK[1] := dvVec.y;
rmKey.dvK[2] := dvVec.z;
end;
 
function DIDFT_GETTYPE(n: variant) : byte;
begin
Result := byte(n);
end;
function Direct3DRMCreate; external D3DRMLib;
 
function DIDFT_GETINSTANCE(n: variant) : DWORD;
begin
Result := word(n) shr 8;
end;
function D3DRMCreateColorRGB; external D3DRMLib;
function D3DRMCreateColorRGBA; external D3DRMLib;
function D3DRMColorGetRed; external D3DRMLib;
function D3DRMColorGetGreen; external D3DRMLib;
function D3DRMColorGetBlue; external D3DRMLib;
function D3DRMColorGetAlpha; external D3DRMLib;
function D3DRMVectorAdd; external D3DRMLib;
function D3DRMVectorSubtract; external D3DRMLib;
function D3DRMVectorReflect; external D3DRMLib;
function D3DRMVectorCrossProduct; external D3DRMLib;
function D3DRMVectorDotProduct; external D3DRMLib;
function D3DRMVectorNormalize; external D3DRMLib;
function D3DRMVectorModulus; external D3DRMLib;
function D3DRMVectorRotate; external D3DRMLib;
function D3DRMVectorScale; external D3DRMLib;
function D3DRMVectorRandom; external D3DRMLib;
function D3DRMQuaternionFromRotation; external D3DRMLib;
function D3DRMQuaternionMultiply; external D3DRMLib;
function D3DRMQuaternionSlerp; external D3DRMLib;
procedure D3DRMMatrixFromQuaternion; external D3DRMLib;
function D3DRMQuaternionFromMatrix; external D3DRMLib;
 
function DIDFT_ENUMCOLLECTION(n: variant) : DWORD;
function DirectXFileCreate; external D3DXofLib;
 
{ DirectInput }
 
function GET_DIDEVICE_TYPE(dwDevType: DWORD): DWORD;
begin
Result := word(n) shl 8;
Result := LOBYTE(dwDevType);
end;
 
function DIJOFS_SLIDER(n: variant) : variant;
function GET_DIDEVICE_SUBTYPE(dwDevType: DWORD): DWORD;
begin
Result := n * 4 + 24;
Result := HIBYTE(dwDevType);
end;
 
function DIJOFS_POV(n: variant) : variant;
function DIEFT_GETTYPE(n: DWORD): DWORD;
begin
Result := n * 4 + 32;
Result := LOBYTE(n);
end;
 
function DIJOFS_BUTTON(n: variant) : variant;
function DIDFT_MAKEINSTANCE(n: WORD): DWORD;
begin
Result := 48 + n;
Result := n shl 8;
end;
 
function DIErrorString(Value: HResult) : string;
var
sValue: array[0..255] of char;
function DIDFT_GETTYPE(n: DWORD): DWORD;
begin
case Value of
DI_OK: Result := 'The operation completed successfully.';
S_FALSE: Result := '"The operation had no effect." or "The device buffer overflowed and some input was lost." or "The device exists but is not currently attached." or "The change in device properties had no effect."';
// DI_BUFFEROVERFLOW: Result := 'The device buffer overflowed and some input was lost. This value is equal to the S_FALSE standard COM return value.';
DI_DOWNLOADSKIPPED: Result := 'The parameters of the effect were successfully updated, but the effect could not be downloaded because the associated device was not acquired in exclusive mode.';
DI_EFFECTRESTARTED: Result := 'The effect was stopped, the parameters were updated, and the effect was restarted.';
// DI_NOEFFECT: Result := 'The operation had no effect. This value is equal to the S_FALSE standard COM return value.';
// DI_NOTATTACHED: Result := 'The device exists but is not currently attached. This value is equal to the S_FALSE standard COM return value.';
DI_POLLEDDEVICE: Result := 'The device is a polled device. As a result, device buffering will not collect any data and event notifications will not be signaled until the IDirectInputDevice2::Poll method is called.';
// DI_PROPNOEFFECT: Result := 'The change in device properties had no effect. This value is equal to the S_FALSE standard COM return value.';
DI_TRUNCATED: Result := 'The parameters of the effect were successfully updated, but some of them were beyond the capabilities of the device and were truncated to the nearest supported value.';
DI_TRUNCATEDANDRESTARTED: Result := 'Equal to DI_EFFECTRESTARTED | DI_TRUNCATED.';
DIERR_ACQUIRED: Result := 'The operation cannot be performed while the device is acquired.';
DIERR_ALREADYINITIALIZED: Result := 'This object is already initialized';
DIERR_BADDRIVERVER: Result := 'The object could not be created due to an incompatible driver version or mismatched or incomplete driver components.';
DIERR_BETADIRECTINPUTVERSION: Result := 'The application was written for an unsupported prerelease version of DirectInput.';
DIERR_DEVICEFULL: Result := 'The device is full.';
DIERR_DEVICENOTREG: Result := 'The device or device instance is not registered with DirectInput. This value is equal to the REGDB_E_CLASSNOTREG standard COM return value.';
DIERR_EFFECTPLAYING: Result := 'The parameters were updated in memory but were not downloaded to the device because the device does not support updating an effect while it is still playing.';
DIERR_HASEFFECTS: Result := 'The device cannot be reinitialized because there are still effects attached to it.';
DIERR_GENERIC: Result := 'An undetermined error occurred inside the DirectInput subsystem. This value is equal to the E_FAIL standard COM return value.';
// DIERR_HANDLEEXISTS: Result := 'The device already has an event notification associated with it. This value is equal to the E_ACCESSDENIED standard COM return value.';
DIERR_INCOMPLETEEFFECT: Result := 'The effect could not be downloaded because essential information is missing. For example, no axes have been associated with the effect, or no type-specific information has been supplied.';
DIERR_INPUTLOST: Result := 'Access to the input device has been lost. It must be reacquired.';
DIERR_INVALIDPARAM: Result := 'An invalid parameter was passed to the returning function, or the object was not in a state that permitted the function to be called. This value is equal to the E_INVALIDARG standard COM return value.';
DIERR_MOREDATA: Result := 'Not all the requested information fitted into the buffer.';
DIERR_NOAGGREGATION: Result := 'This object does not support aggregation.';
DIERR_NOINTERFACE: Result := 'The specified interface is not supported by the object. This value is equal to the E_NOINTERFACE standard COM return value.';
DIERR_NOTACQUIRED: Result := 'The operation cannot be performed unless the device is acquired.';
DIERR_NOTBUFFERED: Result := 'The device is not buffered. Set the DIPROP_BUFFERSIZE property to enable buffering.';
DIERR_NOTDOWNLOADED: Result := 'The effect is not downloaded.';
DIERR_NOTEXCLUSIVEACQUIRED: Result := 'The operation cannot be performed unless the device is acquired in DISCL_EXCLUSIVE mode.';
DIERR_NOTFOUND: Result := 'The requested object does not exist.';
DIERR_NOTINITIALIZED: Result := 'This object has not been initialized.';
// DIERR_OBJECTNOTFOUND: Result := 'The requested object does not exist.';
DIERR_OLDDIRECTINPUTVERSION: Result := 'The application requires a newer version of DirectInput.';
DIERR_OTHERAPPHASPRIO: Result := '"The device already has an event notification associated with it." or "The specified property cannot be changed." or "Another application has a higher priority level, preventing this call from succeeding. "';
DIERR_OUTOFMEMORY: Result := 'The DirectInput subsystem could not allocate sufficient memory to complete the call. This value is equal to the E_OUTOFMEMORY standard COM return value.';
// DIERR_READONLY: Result := 'The specified property cannot be changed. This value is equal to the E_ACCESSDENIED standard COM return value.';
DIERR_UNSUPPORTED: Result := 'The function called is not supported at this time. This value is equal to the E_NOTIMPL standard COM return value.';
E_PENDING: Result := 'Data is not yet available.';
HResult($800405CC): Result := 'No more memory for effects of this kind (not documented)';
else Result := 'Unrecognized Error: $' + sValue;
end;
Result := LOBYTE(n);
end;
 
function joyConfigChanged(dwFlags: DWORD) : MMRESULT; external 'WinMM.dll';
 
procedure Init_c_dfDIKeyboard_Objects; // XRef: Initialization
var x: Cardinal;
function DIDFT_GETINSTANCE(n: DWORD): WORD;
begin
for x := 0 to 255 do
with _c_dfDIKeyboard_Objects[x] do
begin
pGuid := @GUID_Key; dwOfs := x; dwFlags := 0;
dwType := $80000000 or DIDFT_BUTTON or x shl 8;
end;
Result := n shr 8;
end;
 
procedure Init_c_dfDIJoystick2_Objects; // XRef: Initialization
var x,y, OfVal: Cardinal;
function DIDFT_ENUMCOLLECTION(n: WORD): DWORD;
begin
Move(_c_dfDIJoystick_Objects,_c_dfDIJoystick2_Objects,SizeOf(_c_dfDIJoystick_Objects));
// all those empty "buttons"
for x := $2C to $8B do
Move(_c_dfDIJoystick_Objects[$2B],_c_dfDIJoystick2_Objects[x],SizeOf(TDIObjectDataFormat));
for x := 0 to 2 do
begin // 3 more blocks of X axis..Sliders
Move(_c_dfDIJoystick_Objects,_c_dfDIJoystick2_Objects[$8C+8*x],8*SizeOf(TDIObjectDataFormat));
for y := 0 to 7 do _c_dfDIJoystick2_Objects[$8C+8*x+y].dwFlags := (x+1) shl 8;
end;
OfVal := _c_dfDIJoystick2_Objects[$2B].dwOfs+1;
for x := $2C to $A3 do
begin
_c_dfDIJoystick2_Objects[x].dwOfs := OfVal;
if x < $8C then Inc(OfVal) else Inc(OfVal,4);
end;
Result := n shl 8;
end;
 
//DirectPlay file
{$IFDEF UseDirectPlay} // Daniel Marschall 12.04.2024 Added to avoid Windows showing "This app requires DirectPlay"
 
(*==========================================================================;
*
* Copyright (C) 1994-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dplay.h
* Content: DirectPlay include file
*
***************************************************************************)
 
function DPErrorString(Value: HResult) : string;
function DIMAKEUSAGEDWORD(UsagePage, Usage: Word): DWORD;
begin
case Value of
CLASS_E_NOAGGREGATION: Result := 'A non-NULL value was passed for the pUnkOuter parameter in DirectPlayCreate, DirectPlayLobbyCreate, or IDirectPlayLobby2::Connect.';
DPERR_ACCESSDENIED: Result := 'The session is full or an incorrect password was supplied.';
DPERR_ACTIVEPLAYERS: Result := 'The requested operation cannot be performed because there are existing active players.';
DPERR_ALREADYINITIALIZED: Result := 'This object is already initialized.';
DPERR_APPNOTSTARTED: Result := 'The application has not been started yet.';
DPERR_AUTHENTICATIONFAILED: Result := 'The password or credentials supplied could not be authenticated.';
DPERR_BUFFERTOOLARGE: Result := 'The data buffer is too large to store.';
DPERR_BUSY: Result := 'A message cannot be sent because the transmission medium is busy.';
DPERR_BUFFERTOOSMALL: Result := 'The supplied buffer is not large enough to contain the requested data.';
DPERR_CANTADDPLAYER: Result := 'The player cannot be added to the session.';
DPERR_CANTCREATEGROUP: Result := 'A new group cannot be created.';
DPERR_CANTCREATEPLAYER: Result := 'A new player cannot be created.';
DPERR_CANTCREATEPROCESS: Result := 'Cannot start the application.';
DPERR_CANTCREATESESSION: Result := 'A new session cannot be created.';
DPERR_CANTLOADCAPI: Result := 'No credentials were supplied and the CryptoAPI package (CAPI) to use for cryptography services cannot be loaded.';
DPERR_CANTLOADSECURITYPACKAGE: Result := 'The software security package cannot be loaded.';
DPERR_CANTLOADSSPI: Result := 'No credentials were supplied and the software security package (SSPI) that will prompt for credentials cannot be loaded.';
DPERR_CAPSNOTAVAILABLEYET: Result := 'The capabilities of the DirectPlay object have not been determined yet. This error will occur if the DirectPlay object is implemented on a connectivity solution that requires polling to determine available bandwidth and latency.';
DPERR_CONNECTING: Result := 'The method is in the process of connecting to the network. The application should keep calling the method until it returns DP_OK, indicating successful completion, or it returns a different error.';
DPERR_ENCRYPTIONFAILED: Result := 'The requested information could not be digitally encrypted. Encryption is used for message privacy. This error is only relevant in a secure session.';
DPERR_EXCEPTION: Result := 'An exception occurred when processing the request.';
DPERR_GENERIC: Result := 'An undefined error condition occurred.';
// DPERR_INVALIDCREDENTIALS: Result := 'The credentials supplied (as to IDirectPlay3::SecureOpen) were not valid.';
DPERR_INVALIDFLAGS: Result := 'The flags passed to this method are invalid.';
DPERR_INVALIDGROUP: Result := 'The group ID is not recognized as a valid group ID for this game session.';
DPERR_INVALIDINTERFACE: Result := 'The interface parameter is invalid.';
DPERR_INVALIDOBJECT: Result := 'The DirectPlay object pointer is invalid.';
DPERR_INVALIDPARAMS: Result := 'One or more of the parameters passed to the method are invalid.';
DPERR_INVALIDPASSWORD: Result := 'An invalid password was supplied when attempting to join a session that requires a password.';
DPERR_INVALIDPLAYER: Result := 'The player ID is not recognized as a valid player ID for this game session.';
DPERR_LOGONDENIED: Result := 'The session could not be opened because credentials are required and either no credentials were supplied or the credentials were invalid.';
DPERR_NOCAPS: Result := 'The communication link that DirectPlay is attempting to use is not capable of this function.';
DPERR_NOCONNECTION: Result := 'No communication link was established.';
DPERR_NOINTERFACE: Result := 'The interface is not supported.';
DPERR_NOMESSAGES: Result := 'There are no messages in the receive queue.';
DPERR_NONAMESERVERFOUND: Result := 'No name server (host) could be found or created. A host must exist to create a player.';
DPERR_NONEWPLAYERS: Result := 'The session is not accepting any new players.';
DPERR_NOPLAYERS: Result := 'There are no active players in the session.';
DPERR_NOSESSIONS: Result := 'There are no existing sessions for this game.';
DPERR_NOTLOBBIED: Result := 'Returned by the IDirectPlayLobby2::Connect method if the application was not started by using the IDirectPlayLobby2::RunApplication method or if there is no DPLCONNECTION structure currently initialized for this DirectPlayLobby object.';
DPERR_NOTLOGGEDIN: Result := 'An action cannot be performed because a player or client application is not logged in. Returned by the IDirectPlay3::Send method when the client application tries to send a secure message without being logged in.';
DPERR_OUTOFMEMORY: Result := 'There is insufficient memory to perform the requested operation.';
DPERR_PLAYERLOST: Result := 'A player has lost the connection to the session.';
DPERR_SENDTOOBIG: Result := 'The message being sent by the IDirectPlay3::Send method is too large.';
DPERR_SESSIONLOST: Result := 'The connection to the session has been lost.';
DPERR_SIGNFAILED: Result := 'The requested information could not be digitally signed. Digital signatures are used to establish the authenticity of messages.';
DPERR_TIMEOUT: Result := 'The operation could not be completed in the specified time.';
DPERR_UNAVAILABLE: Result := 'The requested function is not available at this time.';
DPERR_UNINITIALIZED: Result := 'The requested object has not been initialized.';
DPERR_UNKNOWNAPPLICATION: Result := 'An unknown application was specified.';
DPERR_UNSUPPORTED: Result := 'The function is not available in this implementation. Returned from IDirectPlay3::GetGroupConnectionSettings and IDirectPlay3::SetGroupConnectionSettings if they are called from a session that is not a lobby session.';
DPERR_USERCANCEL: Result := 'Can be returned in two ways. 1) The user canceled the connection process during a call to the IDirectPlay3::Open method. 2) The user clicked Cancel in one of the DirectPlay service provider dialog boxes during a call to IDirectPlay3::EnumSessions.';
else Result := 'Unrecognized Error';
end;
Result := MAKELONG(Usage, UsagePage);
end;
{$ENDIF} // UseDirectPlay
 
//DirectSetup file
function DirectInputCreate; external DInputLib name 'DirectInputCreateA';
function DirectInputCreateEx; external DInputLib name 'DirectInputCreateEx';
 
(*==========================================================================
*
* Copyright (C) 1995-1997 Microsoft Corporation. All Rights Reserved.
*
* File: dsetup.h
* Content: DirectXSetup, error codes and flags
***************************************************************************)
{ DirectPlay }
 
procedure LoadDSetup;
function DirectPlayEnumerateA; external DPlayXLib;
function DirectPlayEnumerateW; external DPlayXLib;
function DirectPlayEnumerate; external DPlayXLib name 'DirectPlayEnumerateA';
 
function RegGetStringValue(Hive: HKEY; const KeyName, ValueName: string): string;
var EnvKey : HKEY;
Buf : array[0..255] of char;
BufSize : DWord;
RegType : DWord;
rc : DWord;
begin
Result := '';
BufSize := Sizeof(Buf);
ZeroMemory(@Buf, BufSize);
RegType := REG_SZ;
try
if (RegOpenKeyEx(Hive, PChar(KeyName), 0, KEY_READ, EnvKey) = ERROR_SUCCESS) then
begin
try
if (ValueName = '') then rc := RegQueryValueEx(EnvKey, nil, nil, @RegType, @Buf, @BufSize)
else rc := RegQueryValueEx(EnvKey, PChar(ValueName), nil, @RegType, @Buf, @BufSize);
if rc = ERROR_SUCCESS then Result := string(Buf);
finally
RegCloseKey(EnvKey);
end;
end;
finally
RegCloseKey(Hive);
end;
end;
function DirectPlayCreate; external DPlayXLib;
 
function DirectPlayLobbyCreateW; external DPlayXLib;
function DirectPlayLobbyCreateA; external DPlayXLib;
function DirectPlayLobbyCreate; external DPlayXLib name 'DirectPlayLobbyCreateA';
 
function ExistFile(const FileName: string): Boolean;
var hFile: THandle;
begin
hFile := CreateFile(PChar(FileName), 0, 0, nil, OPEN_EXISTING, 0, 0);
Result := hFile <> INVALID_HANDLE_VALUE;
if hFile = INVALID_HANDLE_VALUE then CloseHandle(hFile);
end;
{ DirectSetup }
 
function GetDSetupDLLPath : string;
begin
Result := RegGetStringValue(HKEY_LOCAL_MACHINE,
'Software\Microsoft\Windows\CurrentVersion\Uninstall\DirectXDrivers',
'UninstallString');
if Result <> '' then
Result := Copy(Result,1,Length(Result)-Length('dxsetup.exe')) + 'DSetup.dll';
end;
function DirectXSetupA; external DSetupLib;
function DirectXSetupW; external DSetupLib;
function DirectXSetup; external DSetupLib name 'DirectXSetupA';
 
begin
DSetupDLL := LoadLibrary(PChar(GetDSetupDLLPath));
function DirectXDeviceDriverSetupA; external DSetupLib;
function DirectXDeviceDriverSetupW; external DSetupLib;
function DirectXDeviceDriverSetup; external DSetupLib name 'DirectXDeviceDriverSetupA';
 
DirectXSetupA := GetProcAddress(DSetupDLL,'DirectXSetupA');
DirectXSetupW := GetProcAddress(DSetupDLL,'DirectXSetupW');
{$IFDEF UNICODE}
DirectXSetup := DirectXSetupW;
{$ELSE}
DirectXSetup := DirectXSetupA;
{$ENDIF}
function DirectXRegisterApplicationA; external DSetupLib;
function DirectXRegisterApplicationW; external DSetupLib;
function DirectXRegisterApplication; external DSetupLib name 'DirectXRegisterApplicationA';
 
DirectXDeviceDriverSetupA :=
GetProcAddress(DSetupDLL,'DirectXDeviceDriverSetupA');
DirectXDeviceDriverSetupW :=
GetProcAddress(DSetupDLL,'DirectXDeviceDriverSetupW');
{$IFDEF UNICODE}
DirectXDeviceDriverSetup := DirectXDeviceDriverSetupW;
{$ELSE}
DirectXDeviceDriverSetup := DirectXDeviceDriverSetupA;
{$ENDIF}
function DirectXUnRegisterApplication; external DSetupLib;
 
DirectXRegisterApplicationA :=
GetProcAddress(DSetupDLL,'DirectXRegisterApplicationA');
DirectXRegisterApplicationW :=
GetProcAddress(DSetupDLL,'DirectXRegisterApplicationW');
{$IFDEF UNICODE}
DirectXRegisterApplication := DirectXRegisterApplicationW;
{$ELSE}
DirectXRegisterApplication := DirectXRegisterApplicationA;
{$ENDIF}
function DirectXSetupSetCallback; external DSetupLib;
 
DirectXUnRegisterApplication :=
GetProcAddress(DSetupDLL,'DirectXUnRegisterApplication');
function DirectXSetupGetVersion; external DSetupLib;
 
DirectXSetupSetCallback :=
GetProcAddress(DSetupDLL,'DirectXSetupSetCallback');
{ DirectSound }
 
DirectXSetupGetVersion := GetProcAddress(DSetupDLL,'DirectXSetupGetVersion');
 
end;
 
//DirectSound file
 
function MAKE_DSHRESULT(code: DWORD) : HResult;
function DSSPEAKER_COMBINED(c, g: Byte): DWORD;
begin
Result := HResult(1 shl 31) or HResult(_FACDS shl 16)
or HResult(code);
Result := c or (g shl 16);
end;
 
function DSSPEAKER_COMBINED(c, g: variant) : DWORD;
function DSSPEAKER_CONFIG(a: DWORD): Byte;
begin
Result := byte(c) or (byte(g) shl 16)
Result := a;
end;
 
function DSSPEAKER_CONFIG(a: variant) : byte;
function DSSPEAKER_GEOMETRY(a: DWORD): Byte;
begin
Result := byte(a);
Result := a shr 16;
end;
 
function DSSPEAKER_GEOMETRY(a: variant) : byte;
begin
Result := byte(a shr 16 and $FF);
end;
function DirectSoundCreate; external DSoundLib;
function DirectSoundEnumerateA; external DSoundLib;
function DirectSoundEnumerateW; external DSoundLib;
function DirectSoundEnumerate; external DSoundLib name 'DirectSoundEnumerateA';
 
function DirectSoundCaptureCreate; external DSoundLib;
function DirectSoundCaptureEnumerateA; external DSoundLib;
function DirectSoundCaptureEnumerateW; external DSoundLib;
function DirectSoundCaptureEnumerate; external DSoundLib name 'DirectSoundCaptureEnumerateA';
 
function DSErrorString(Value: HResult) : string;
function MAKEFOURCC(ch0, ch1, ch2, ch3: Char) : DWORD;
begin
case Value of
DS_OK: Result := 'The request completed successfully.';
DSERR_ALLOCATED: Result := 'The request failed because resources, such as a priority level, were already in use by another caller.';
DSERR_ALREADYINITIALIZED: Result := 'The object is already initialized.';
DSERR_BADFORMAT: Result := 'The specified wave format is not supported.';
DSERR_BUFFERLOST: Result := 'The buffer memory has been lost and must be restored.';
DSERR_CONTROLUNAVAIL: Result := 'The control (volume, pan, and so forth) requested by the caller is not available.';
DSERR_GENERIC: Result := 'An undetermined error occurred inside the DirectSound subsystem.';
DSERR_INVALIDCALL: Result := 'This function is not valid for the current state of this object.';
DSERR_INVALIDPARAM: Result := 'An invalid parameter was passed to the returning function.';
DSERR_NOAGGREGATION: Result := 'The object does not support aggregation.';
DSERR_NODRIVER: Result := 'No sound driver is available for use.';
DSERR_NOINTERFACE: Result := 'The requested COM interface is not available.';
DSERR_OTHERAPPHASPRIO: Result := 'Another application has a higher priority level, preventing this call from succeeding.';
DSERR_OUTOFMEMORY: Result := 'The DirectSound subsystem could not allocate sufficient memory to complete the caller´s request.';
DSERR_PRIOLEVELNEEDED: Result := 'The caller does not have the priority level required for the function to succeed.';
DSERR_UNINITIALIZED: Result := 'The IDirectSound::Initialize method has not been called or has not been called successfully before other methods were called.';
DSERR_UNSUPPORTED: Result := 'The function called is not supported at this time.';
else Result := 'Unrecognized Error';
end;
Result := Ord(ch0) + (Ord(ch1) shl 8) + (Ord(ch2) shl 16) + (Ord(ch3) shl 24);
end;
 
//DirectMusic file
 
function MAKE_HRESULT(sev,fac,code: DWORD) : HResult;
function MAKE_DMHRESULTSUCCESS(code: Cardinal) : HResult;
begin
Result := (sev shl 31) or (fac shl 16) or code;
Result := MakeResult(0, FACILITY_DIRECTMUSIC, (DMUS_ERRBASE + (code)));
end;
 
//function MAKEFOURCC (ch0, ch1, ch2, ch3: Char) : TFourCC;
//type
// tfcc = array [0..3] of Char;
//begin
// tfcc(Result)[0] := ch0;
// tfcc(Result)[1] := ch1;
// tfcc(Result)[2] := ch2;
// tfcc(Result)[3] := ch3;
//end;
 
function QWORD_ALIGN(x: DWORD) : DWORD;
function MAKE_DMHRESULTERROR(code: Cardinal) : HResult;
begin
Result := (x + 7) and (not 7); // (((x) + 7) & ~7)
Result := MakeResult(1, FACILITY_DIRECTMUSIC, (DMUS_ERRBASE + (code)));
end;
 
function DMUS_EVENT_SIZE(cb: DWORD) : DWORD;
// The number of bytes to allocate for an event with 'cb' data bytes.
//
function QWORD_ALIGN(x: LONGLONG): LONGLONG;
begin
Result := QWORD_ALIGN(SizeOf(TDMus_EventHeader) + cb); // QWORD_ALIGN(sizeof(DMUS_EVENTHEADER) + cb)
Result := x + 7;
PDWORD(@Result)^ := PDWORD(@Result)^ and (not 7);
end;
 
function IsNTandDelphiRunning : boolean;
var
OSVersion : TOSVersionInfo;
AppName : array[0..255] of char;
function DMUS_EVENT_SIZE(cb: LONGLONG): LONGLONG;
begin
OSVersion.dwOsVersionInfoSize := sizeof(OSVersion);
GetVersionEx(OSVersion);
// Not running in NT or program is not Delphi itself ?
AppName[0] := #0;
lstrcat(AppName, PChar(ParamStr(0))); // ParamStr(0) = Application.ExeName
{$IFDEF VER12UP}
CharUpperBuff(AppName, High(AppName) + 1);
{$ELSE}
CharUpperBuff(AppName, SizeOf(AppName));
{$ENDIF}
result := ( (OSVersion.dwPlatformID = VER_PLATFORM_WIN32_NT) and
(Pos('DELPHI32.EXE', AppName) = Length(AppName) - Length('DELPHI32.EXE') + 1) );
Result := QWORD_ALIGN(SizeOf(DMUS_EVENTHEADER) + cb);
end;
 
initialization
begin
{DirectDraw}
end.
 
if not IsNTandDelphiRunning then
begin
DDrawDLL := LoadLibrary('DDraw.dll');
DirectDrawEnumerateA := GetProcAddress(DDrawDLL,'DirectDrawEnumerateA');
DirectDrawEnumerateW := GetProcAddress(DDrawDLL,'DirectDrawEnumerateW');
{$IFDEF UNICODE}
DirectDrawEnumerate := DirectDrawEnumerateW;
{$ELSE}
DirectDrawEnumerate := DirectDrawEnumerateA;
{$ENDIF}
 
DirectDrawEnumerateExA := GetProcAddress(DDrawDLL,'DirectDrawEnumerateExA');
DirectDrawEnumerateExW := GetProcAddress(DDrawDLL,'DirectDrawEnumerateExW');
{$IFDEF UNICODE}
DirectDrawEnumerateEx := DirectDrawEnumerateExW;
{$ELSE}
DirectDrawEnumerateEx := DirectDrawEnumerateExA;
{$ENDIF}
 
DirectDrawCreate := GetProcAddress(DDrawDLL,'DirectDrawCreate');
DirectDrawCreateEx := GetProcAddress(DDrawDLL,'DirectDrawCreateEx');
DirectDrawCreateClipper := GetProcAddress(DDrawDLL,'DirectDrawCreateClipper');
{$IFDEF WINNT}
NtDirectDrawCreate := GetProcAddress(DDrawDLL,'NtDirectDrawCreate');
{$ENDIF}
end;
{DirectDraw}
{Direct3D}
DisableFPUExceptions;
{$IFDEF D3DRM}
if not IsNTandDelphiRunning then
begin
DXFileDLL := LoadLibrary('D3DXOF.DLL');
DirectXFileCreate := GetProcAddress(DXFileDLL,'DirectXFileCreate');
end;
{Direct3D}
{Direct3DRM}
if not IsNTandDelphiRunning then
begin
D3DRMDLL := LoadLibrary('D3DRM.dll');
//d3drmdef:
D3DRMCreateColorRGB := GetProcAddress(D3DRMDLL,'D3DRMCreateColorRGB');
D3DRMCreateColorRGBA := GetProcAddress(D3DRMDLL,'D3DRMCreateColorRGBA');
D3DRMColorGetRed := GetProcAddress(D3DRMDLL,'D3DRMColorGetRed');
D3DRMColorGetGreen := GetProcAddress(D3DRMDLL,'D3DRMColorGetGreen');
D3DRMColorGetBlue := GetProcAddress(D3DRMDLL,'D3DRMColorGetBlue');
D3DRMColorGetAlpha := GetProcAddress(D3DRMDLL,'D3DRMColorGetAlpha');
D3DRMVectorAdd := GetProcAddress(D3DRMDLL,'D3DRMVectorAdd');
D3DRMVectorSubtract := GetProcAddress(D3DRMDLL,'D3DRMVectorSubtract');
D3DRMVectorReflect := GetProcAddress(D3DRMDLL,'D3DRMVectorReflect');
D3DRMVectorCrossProduct := GetProcAddress(D3DRMDLL,'D3DRMVectorCrossProduct');
D3DRMVectorDotProduct := GetProcAddress(D3DRMDLL,'D3DRMVectorDotProduct');
D3DRMVectorNormalize := GetProcAddress(D3DRMDLL,'D3DRMVectorNormalize');
D3DRMVectorModulus := GetProcAddress(D3DRMDLL,'D3DRMVectorModulus');
D3DRMVectorRotate := GetProcAddress(D3DRMDLL,'D3DRMVectorRotate');
D3DRMVectorScale := GetProcAddress(D3DRMDLL,'D3DRMVectorScale');
D3DRMVectorRandom := GetProcAddress(D3DRMDLL,'D3DRMVectorRandom');
D3DRMQuaternionFromRotation := GetProcAddress(D3DRMDLL,'D3DRMQuaternionFromRotation');
D3DRMQuaternionMultiply := GetProcAddress(D3DRMDLL,'D3DRMQuaternionMultiply');
D3DRMQuaternionSlerp := GetProcAddress(D3DRMDLL,'D3DRMQuaternionSlerp');
D3DRMMatrixFromQuaternion := GetProcAddress(D3DRMDLL,'D3DRMMatrixFromQuaternion');
D3DRMQuaternionFromMatrix := GetProcAddress(D3DRMDLL,'D3DRMQuaternionFromMatrix');
//d3drm:
Direct3DRMCreate := GetProcAddress(D3DRMDLL,'Direct3DRMCreate');
end;
{$ENDIF}
{Direct3DRM}
{DirectInput}
Init_c_dfDIKeyboard_Objects; // set kbd GUIDs & flags
Init_c_dfDIJoystick2_Objects; // construct Joystick2 from Joystick fmt
 
if not IsNTandDelphiRunning then
begin
DInputDLL := LoadLibrary('DInput.dll');
 
DirectInputCreateA := GetProcAddress(DInputDLL,'DirectInputCreateA');
DirectInputCreateW := GetProcAddress(DInputDLL,'DirectInputCreateW');
// no A/W version
DirectInputCreateEx := GetProcAddress(DInputDLL,'DirectInputCreateEx');
{$IFDEF UNICODE}
DirectInputCreate := DirectInputCreateW;
{$ELSE}
DirectInputCreate := DirectInputCreateA;
{$ENDIF}
end;
{DirectInput}
{DirectPlay}
{$IFDEF UseDirectPlay} // Daniel Marschall 12.04.2024 Added to avoid Windows showing "This app requires DirectPlay"
if not IsNTandDelphiRunning then
begin
DPlayDLL := LoadLibrary('DPlayX.dll');
 
DirectPlayEnumerateA := GetProcAddress(DPlayDLL,'DirectPlayEnumerateA');
DirectPlayEnumerateW := GetProcAddress(DPlayDLL,'DirectPlayEnumerateW');
{$IFDEF UNICODE}
DirectPlayEnumerate := DirectPlayEnumerateW;
{$ELSE}
DirectPlayEnumerate := DirectPlayEnumerateA;
{$ENDIF}
 
DirectPlayCreate := GetProcAddress(DPlayDLL,'DirectPlayCreate');
 
// File: dplay.h
 
DirectPlayLobbyCreateW := GetProcAddress(DPlayDLL,'DirectPlayLobbyCreateW');
DirectPlayLobbyCreateA := GetProcAddress(DPlayDLL,'DirectPlayLobbyCreateA');
{$IFDEF UNICODE}
DirectPlayLobbyCreate := DirectPlayLobbyCreateW;
{$ELSE}
DirectPlayLobbyCreate := DirectPlayLobbyCreateA;
{$ENDIF}
 
end;
{$ENDIF} // UseDirectPlay
{DirectPlay}
{DirectSetup}
if not IsNTandDelphiRunning then
begin
LoadDSetup;
end;
{DirectSetup}
{DirectSound}
if not IsNTandDelphiRunning then
begin
DSoundDLL := LoadLibrary('DSound.dll');
DirectSoundCreate := GetProcAddress(DSoundDLL,'DirectSoundCreate');
 
DirectSoundEnumerateW := GetProcAddress(DSoundDLL,'DirectSoundEnumerateW');
DirectSoundEnumerateA := GetProcAddress(DSoundDLL,'DirectSoundEnumerateA');
{$IFDEF UNICODE}
DirectSoundEnumerate := DirectSoundEnumerateW;
{$ELSE}
DirectSoundEnumerate := DirectSoundEnumerateA;
{$ENDIF}
 
DirectSoundCaptureCreate :=
GetProcAddress(DSoundDLL,'DirectSoundCaptureCreate');
 
DirectSoundCaptureEnumerateW :=
GetProcAddress(DSoundDLL,'DirectSoundCaptureEnumerateW');
DirectSoundCaptureEnumerateA :=
GetProcAddress(DSoundDLL,'DirectSoundCaptureEnumerateA');
{$IFDEF UNICODE}
DirectSoundCaptureEnumerate := DirectSoundCaptureEnumerateW;
{$ELSE}
DirectSoundCaptureEnumerate := DirectSoundCaptureEnumerateA;
{$ENDIF}
end;
{DirectSound}
end;
 
finalization
begin
{DirectDraw}
if DDrawDLL <> 0 then FreeLibrary(DDrawDLL);
{DirectDraw}
{Direct3D}
FreeLibrary(DXFileDLL);
{Direct3D}
{Direct3DRM}
{$IFDEF D3DRM}
if D3DRMDLL <> 0 then FreeLibrary(D3DRMDLL);
{$ENDIF}
{Direct3DRM}
{DirectInput}
FreeLibrary(DInputDLL);
{DirectInput}
{DirectPlay}
{$IFDEF UseDirectPlay} // Daniel Marschall 12.04.2024 Added to avoid Windows showing "This app requires DirectPlay"
if DPlayDLL <> 0 then FreeLibrary(DPlayDLL);
{$ENDIF} // UseDirectPlay
{DirectPlay}
{DirectSetup}
FreeLibrary(DSetupDLL);
{DirectSetup}
{DirectSound}
FreeLibrary(DSoundDLL);
{DirectSound}
end;
 
 
End.
/VCL_DELPHIX_D6/DXSprite.pas
1,17 → 1,11
unit DXSprite;
 
interface
 
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, SysUtils, Classes, Graphics, DXClass, DXDraws,
{$IFDEF VER9UP} Types,{$ENDIF}
{$IFDEF StandardDX}
DirectDraw;
{$ELSE}
DirectX;
{$ENDIF}
Windows, SysUtils, Classes, DXClass, DXDraws, DirectX;
 
type
 
23,13 → 17,7
 
TSpriteEngine = class;
 
TSprite = class;
TCollisionEvent = procedure(Sender: TObject; var Done: Boolean) of object;
TMoveEvent = procedure(Sender: TObject; var MoveCount: Integer) of object;
TDrawEvent = procedure(Sender: TObject) of object;
TGetImage = procedure(Sender: TObject; var Image: TPictureCollectionItem) of object;
 
TSprite = class(TPersistent)
TSprite = class
private
FEngine: TSpriteEngine;
FParent: TSprite;
44,31 → 32,16
FZ: Integer;
FWidth: Integer;
FHeight: Integer;
{$IFDEF Ver4Up}
FSelected: Boolean;
FGroupNumber: Integer;
{$ENDIF}
FCaption: string;
FTag: Integer;
 
FDXImageList: TCustomDXImageList;
FDXImage: TPictureCollectionItem;
FDXImageName: string;
 
FOnDraw: TDrawEvent;
FOnMove: TMoveEvent;
FOnCollision: TCollisionEvent;
FOnGetImage: TGetImage;
procedure Add(Sprite: TSprite);
procedure Remove(Sprite: TSprite);
procedure AddDrawList(Sprite: TSprite);
procedure Collision2;
procedure Draw; {$IFDEF VER9UP}inline;{$ENDIF}
procedure Draw;
function GetClientRect: TRect;
function GetCount: Integer;
function GetItem(Index: Integer): TSprite;
function GetWorldX: Double; {$IFDEF VER9UP}inline;{$ENDIF}
function GetWorldY: Double; {$IFDEF VER9UP}inline;{$ENDIF}
function GetWorldX: Double;
function GetWorldY: Double;
procedure SetZ(Value: Integer);
protected
procedure DoCollision(Sprite: TSprite; var Done: Boolean); virtual;
76,10 → 49,6
procedure DoMove(MoveCount: Integer); virtual;
function GetBoundsRect: TRect; virtual;
function TestCollision(Sprite: TSprite): Boolean; virtual;
{$IFDEF Ver4Up}
procedure SetGroupNumber(AGroupNumber: Integer); virtual;
procedure SetSelected(ASelected: Boolean); virtual;
{$ENDIF}
public
constructor Create(AParent: TSprite); virtual;
destructor Destroy; override;
87,46 → 56,25
function Collision: Integer;
procedure Dead;
procedure Move(MoveCount: Integer);
procedure ReAnimate(MoveCount: Integer); virtual;
function GetSpriteAt(X, Y: Integer): TSprite;
function GetSpriteAt(X, Y: Integer): TSprite;
property BoundsRect: TRect read GetBoundsRect;
property ClientRect: TRect read GetClientRect;
property Collisioned: Boolean read FCollisioned write FCollisioned;
property Count: Integer read GetCount;
property Engine: TSpriteEngine read FEngine;
property Items[Index: Integer]: TSprite read GetItem; default;
property Deaded: Boolean read FDeaded;
property Moved: Boolean read FMoved write FMoved;
property Parent: TSprite read FParent;
property Visible: Boolean read FVisible write FVisible;
property Width: Integer read FWidth write FWidth;
property WorldX: Double read GetWorldX;
property WorldY: Double read GetWorldY;
// Group handling support
{$IFDEF Ver4Up} // if GroupNumber < 0 then no group is assigned
property GroupNumber: Integer read FGroupNumber write SetGroupNumber;
property Selected: Boolean read FSelected write SetSelected;
{$ENDIF}
procedure Assign(Source: TPersistent); override;
published
property Height: Integer read FHeight write FHeight;
property Moved: Boolean read FMoved write FMoved;
property Visible: Boolean read FVisible write FVisible;
property Width: Integer read FWidth write FWidth;
property X: Double read FX write FX;
property Y: Double read FY write FY;
property Z: Integer read FZ write SetZ;
property Collisioned: Boolean read FCollisioned write FCollisioned;
property Tag: Integer read FTag write FTag;
property Caption: string read FCaption write FCaption;
 
property DXImageList: TCustomDXImageList read FDXImageList write FDXImageList;
property DXImageName: string read FDXImageName write FDXImageName;
 
property OnDraw: TDrawEvent read FOnDraw write FOnDraw;
property OnMove: TMoveEvent read FOnMove write FOnMove;
property OnCollision: TCollisionEvent read FOnCollision write FOnCollision;
property OnGetImage: TGetImage read FOnGetImage write FOnGetImage;
end;
 
TSpriteClass = class of TSprite;
 
{ TImageSprite }
 
TImageSprite = class(TSprite)
136,136 → 84,55
FAnimPos: Double;
FAnimSpeed: Double;
FAnimStart: Integer;
FImage: TPictureCollectionItem;
FPixelCheck: Boolean;
FTile: Boolean;
FTransparent: Boolean;
FAngle: Single;
FAlpha: Integer;
FBlendMode: TRenderType;
FCenterX: Double;
FCenterY: Double;
FBlurImageArr: TBlurImageArr;
FBlurImage: Boolean;
FMirrorFlip: TRenderMirrorFlipSet;
FTextureFilter: TD2DTextureFilter;
function GetDrawImageIndex: Integer;
function GetDrawRect: TRect;
function ImageCollisionTest(suf1, suf2: TDirectDrawSurface;
const rect1, rect2: TRect; x1, y1, x2, y2: Integer;
DoPixelCheck: Boolean): Boolean;
function StoreCenterX: Boolean;
function StoreCenterY: Boolean;
function StoreAlpha: Boolean;
procedure SetBlurImage(const Value: Boolean);
procedure SetBlurImageArr(const Value: TBlurImageArr);
function GetImage: TPictureCollectionItem;
procedure SetMirrorFlip(const Value: TRenderMirrorFlipSet);
procedure ReadMirrorFlip(Reader: TReader);
procedure WriteMirrorFlip(Writer: TWriter);
protected
{accessed methods}
procedure ReadAlpha(Reader: TReader);
procedure ReadAngle(Reader: TReader);
procedure ReadAnimCount(Reader: TReader);
procedure ReadAnimLooped(Reader: TReader);
procedure ReadAnimPos(Reader: TReader);
procedure ReadAnimSpeed(Reader: TReader);
procedure ReadAnimStart(Reader: TReader);
procedure ReadBlendMode(Reader: TReader);
procedure ReadCenterX(Reader: TReader);
procedure ReadCenterY(Reader: TReader);
procedure ReadPixelCheck(Reader: TReader);
procedure ReadTile(Reader: TReader);
procedure ReadBlurImage(Reader: TReader);
procedure ReadTextureFilter(Reader: TReader);
procedure WriteAlpha(Writer: TWriter);
procedure WriteAngle(Writer: TWriter);
procedure WriteAnimCount(Writer: TWriter);
procedure WriteAnimLooped(Writer: TWriter);
procedure WriteAnimPos(Writer: TWriter);
procedure WriteAnimSpeed(Writer: TWriter);
procedure WriteAnimStart(Writer: TWriter);
procedure WriteBlendMode(Writer: TWriter);
procedure WriteCenterX(Writer: TWriter);
procedure WriteCenterY(Writer: TWriter);
procedure WritePixelCheck(Writer: TWriter);
procedure WriteTile(Writer: TWriter);
procedure WriteBlurImage(Writer: TWriter);
procedure WriteTextureFilter(Writer: TWriter);
{own store of properties}
procedure DefineProperties(Filer: TFiler); override;
procedure LoadImage; virtual;
procedure DoDraw; override;
procedure DoMove(MoveCount: Integer); override;
function GetBoundsRect: TRect; override;
function TestCollision(Sprite: TSprite): Boolean; override;
procedure SetImage(AImage: TPictureCollectionItem); virtual;
public
constructor Create(AParent: TSprite); override;
procedure Assign(Source: TPersistent); override;
procedure ReAnimate(MoveCount: Integer); override;
property Image: TPictureCollectionItem read GetImage write SetImage;
property BlurImageArr: TBlurImageArr read FBlurImageArr write SetBlurImageArr;
{un-published property}
property BlendMode: TRenderType read FBlendMode write FBlendMode default rtDraw;
property Angle: Single read FAngle write FAngle stored StoreAlpha;
property Alpha: Integer read FAlpha write FAlpha default $FF;
property CenterX: Double read FCenterX write FCenterX stored StoreCenterX;
property CenterY: Double read FCenterY write FCenterY stored StoreCenterY;
property AnimCount: Integer read FAnimCount write FAnimCount default 0;
property AnimLooped: Boolean read FAnimLooped write FAnimLooped default False;
property AnimCount: Integer read FAnimCount write FAnimCount;
property AnimLooped: Boolean read FAnimLooped write FAnimLooped;
property AnimPos: Double read FAnimPos write FAnimPos;
property AnimSpeed: Double read FAnimSpeed write FAnimSpeed;
property AnimStart: Integer read FAnimStart write FAnimStart default 0;
property PixelCheck: Boolean read FPixelCheck write FPixelCheck default False;
property Tile: Boolean read FTile write FTile default False;
property BlurImage: Boolean read FBlurImage write SetBlurImage default False;
property MirrorFlip: TRenderMirrorFlipSet read FMirrorFlip write SetMirrorFlip default [];
property TextureFilter: TD2DTextureFilter read FTextureFilter write FTextureFilter default D2D_POINT;
published
property DXImageList;
property DXImageName;
 
property OnDraw;
property OnMove;
property OnCollision;
property OnGetImage;
property AnimStart: Integer read FAnimStart write FAnimStart;
property PixelCheck: Boolean read FPixelCheck write FPixelCheck;
property Image: TPictureCollectionItem read FImage write FImage;
property Tile: Boolean read FTile write FTile;
end;
 
{ TImageSpriteEx }
 
TImageSpriteEx = class(TImageSprite)
end{$IFDEF VER9UP}deprecated{$IFDEF VER14UP} 'Use for backward compatibility only or replace by TImageSprite instead...'{$ENDIF}{$ENDIF};
 
private
FAngle: Integer;
FAlpha: Integer;
protected
procedure DoDraw; override;
function GetBoundsRect: TRect; override;
function TestCollision(Sprite: TSprite): Boolean; override;
public
constructor Create(AParent: TSprite); override;
property Angle: Integer read FAngle write FAngle;
property Alpha: Integer read FAlpha write FAlpha;
end;
{ TBackgroundSprite }
 
PMapType = ^TMapType;
TMapType = packed record
MapChip: Integer; {image chip as number}
//ImageName: string[127];
CollisionChip: Boolean; {is collision brick}
CollisionRect: TRect; {dirty vollision area, can be smaller or bigger than silhouette}
Overlap: Integer; {for pulse image, like zoom etc.}
AnimLooped: Boolean; {chip can be live}
AnimStart, AnimCount: Integer;
AnimSpeed, AnimPos: Double; {phase of picture by one map chip}
Rendered: TRenderType; {can be blended}
Alpha: Byte; {and blend level}
Angle: Single;
CenterX, CenterY: Double;
MirrorFlip: TRenderMirrorFlipSet;
TextureFilter: TD2DTextureFilter;
Tag: Integer; {for application use}
end;
 
TBackgroundSprite = class(TImageSprite)
TBackgroundSprite = class(TSprite)
private
FImage: TPictureCollectionItem;
FCollisionMap: Pointer;
FMap: Pointer;
FMapWidth: Integer;
FMapHeight: Integer;
 
FChipsRect: TRect;
FChipsPatternIndex: Integer;
FTile: Boolean;
function GetCollisionMapItem(X, Y: Integer): Boolean;
function GetChip(X, Y: Integer): Integer;
procedure SetChip(X, Y: Integer; Value: Integer);
272,60 → 139,26
procedure SetCollisionMapItem(X, Y: Integer; Value: Boolean);
procedure SetMapHeight(Value: Integer);
procedure SetMapWidth(Value: Integer);
 
function GetCollisionRectItem(X, Y: Integer): TRect;
function GetMap(X, Y: Integer): TMapType;
function GetTagMap(X, Y: Integer): Integer;
procedure SetCollisionRectItem(X, Y: Integer; Value: TRect);
procedure SetMap(X, Y: Integer; Value: TMapType);
procedure SetTagMap(X, Y, Value: Integer);
function GetOverlap(X, Y: Integer): Integer;
procedure SetOverlap(X, Y: Integer; const Value: Integer);
protected
procedure ReadMapData(Stream: TStream);
procedure WriteMapData(Stream: TStream);
procedure DoDraw; override;
function GetBoundsRect: TRect; override;
function TestCollision(Sprite: TSprite): Boolean; override;
procedure SetImage(Img: TPictureCollectionItem); override;
procedure DefineProperties(Filer: TFiler); override;
public
constructor Create(AParent: TSprite); override;
destructor Destroy; override;
procedure ChipsDraw(Image: TPictureCollectionItem; X, Y, PatternIndex: Integer);
procedure SetMapSize(AMapWidth, AMapHeight: Integer);
function IsMapEmpty: Boolean;
property Chips[X, Y: Integer]: Integer read GetChip write SetChip;
property CollisionMap[X, Y: Integer]: Boolean read GetCollisionMapItem write SetCollisionMapItem;
property CollisionRect[X, Y: Integer]: TRect read GetCollisionRectItem write SetCollisionRectItem;
property Overlap[X, Y: Integer]: Integer read GetOverlap write SetOverlap;
property TagMap[X, Y: Integer]: Integer read GetTagMap write SetTagMap;
property Map[X, Y: Integer]: TMapType read GetMap write SetMap;
procedure Assign(Source: TPersistent); override;
property ChipsRect: TRect read FChipsRect write FChipsRect;
property ChipsPatternIndex: Integer read FChipsPatternIndex write FChipsPatternIndex default 0;
{un-published property}
property Image: TPictureCollectionItem read FImage write FImage;
property MapHeight: Integer read FMapHeight write SetMapHeight;
property MapWidth: Integer read FMapWidth write SetMapWidth;
published
property DXImageList;
property DXImageName;
 
property OnDraw;
property OnMove;
property OnCollision;
property OnGetImage;
property Tile: Boolean read FTile write FTile;
end;
 
{ forward class }
 
TCustomDXSpriteEngine = class;
 
{ TSpriteEngine }
 
TSpriteEngine = class(TSprite)
private
FOwner: TCustomDXSpriteEngine;
FAllCount: Integer;
FCollisionCount: Integer;
FCollisionDone: Boolean;
335,18 → 168,7
FDrawCount: Integer;
FSurface: TDirectDrawSurface;
FSurfaceRect: TRect;
{$IFDEF Ver4Up}
FObjectsSelected: Boolean;
FGroupCount: Integer;
FGroups: array of Tlist;
FCurrentSelected: Tlist;
{$ENDIF}
protected
procedure SetSurface(Value: TDirectDrawSurface); virtual;
{$IFDEF Ver4Up}
procedure SetGroupCount(AGroupCount: Integer); virtual;
function GetGroup(Index: Integer): Tlist; virtual;
{$ENDIF}
procedure SetSurface(Value: TDirectDrawSurface);
public
constructor Create(AParent: TSprite); override;
destructor Destroy; override;
356,26 → 178,6
property DrawCount: Integer read FDrawCount;
property Surface: TDirectDrawSurface read FSurface write SetSurface;
property SurfaceRect: TRect read FSurfaceRect;
 
// Extended Sprite Engine
procedure Collisions;
 
// Group handling support
{$IFDEF Ver4Up}
procedure ClearCurrent;
procedure ClearGroup(GroupNumber: Integer);
procedure GroupToCurrent(GroupNumber: Integer; Add: Boolean = False);
procedure CurrentToGroup(GroupNumber: Integer; Add: Boolean = False);
procedure GroupSelect(const Area: TRect; Filter: array of TSpriteClass; Add: Boolean = False); overload;
procedure GroupSelect(const Area: TRect; Add: Boolean = False); overload;
function Select(Point: TPoint; Filter: array of TSpriteClass; Add: Boolean = False): Tsprite; overload;
function Select(Point: TPoint; Add: Boolean = False): Tsprite; overload;
 
property CurrentSelected: TList read fCurrentSelected;
property ObjectsSelected: Boolean read fObjectsSelected;
property Groups[Index: Integer]: Tlist read GetGroup;
property GroupCount: Integer read fGroupCount write SetGroupCount;
{$ENDIF}
end;
 
{ EDXSpriteEngineError }
382,90 → 184,6
 
EDXSpriteEngineError = class(Exception);
 
TSpriteCollection = class;
 
{ TSpriteType }
 
TSpriteType = (stSprite, stImageSprite, stImageSpriteEx, stBackgroundSprite);
 
{ TSpriteCollectionItem }
 
TSpriteCollectionItem = class(THashCollectionItem)
private
FOwner: TPersistent;
FOwnerItem: TSpriteEngine;
FSpriteType: TSpriteType;
FSprite: TSprite;
procedure Finalize;
procedure Initialize;
function GetSpriteCollection: TSpriteCollection;
procedure SetSprite(const Value: TSprite);
procedure SetOnCollision(const Value: TCollisionEvent);
procedure SetOnDraw(const Value: TDrawEvent);
procedure SetOnMove(const Value: TMoveEvent);
function GetSpriteType: TSpriteType;
procedure SetSpriteType(const Value: TSpriteType);
function GetOnCollision: TCollisionEvent;
function GetOnDraw: TDrawEvent;
function GetOnMove: TMoveEvent;
function GetOnGetImage: TGetImage;
procedure SetOnGetImage(const Value: TGetImage);
function GetImageList: TCustomDXImageList;
procedure SetImageList(const Value: TCustomDXImageList);
protected
function GetDisplayName: string; override;
procedure SetDisplayName(const Value: string); override;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property SpriteCollection: TSpriteCollection read GetSpriteCollection;
function Clone(NewName: string): TSprite;
published
{published property of sprite}
property KindSprite: TSpriteType read GetSpriteType write SetSpriteType;
property ImageList: TCustomDXImageList read GetImageList write SetImageList;
property Sprite: TSprite read FSprite write SetSprite;
{published events of sprite}
property OnDraw: TDrawEvent read GetOnDraw write SetOnDraw;
property OnMove: TMoveEvent read GetOnMove write SetOnMove;
property OnCollision: TCollisionEvent read GetOnCollision write SetOnCollision;
property OnGetImage: TGetImage read GetOnGetImage write SetOnGetImage;
end;
 
{ ESpriteCollectionError }
 
ESpriteCollectionError = class(Exception);
 
{ TSpriteCollection }
 
TSCInitialize = procedure(Owner: TSpriteEngine) of object;
TSCFinalize = procedure(Owner: TSpriteEngine) of object;
 
TSpriteCollection = class(THashCollection)
private
FInitializeFlag: Boolean;
FOwner: TPersistent;
FOwnerItem: TSpriteEngine;
FOnInitialize: TSCInitialize;
FOnFinalize: TSCFinalize;
function GetItem(Index: Integer): TSpriteCollectionItem;
protected
function GetOwner: TPersistent; override;
public
constructor Create(AOwner: TPersistent);
destructor Destroy; override;
function Initialized: Boolean;
function Find(const Name: string): TSpriteCollectionItem;
function Add: TSpriteCollectionItem;
procedure Finalize;
function Initialize(DXSpriteEngine: TSpriteEngine): Boolean;
property Items[Index: Integer]: TSpriteCollectionItem read GetItem; default;
published
property OnInitialize: TSCInitialize read FOnInitialize write FOnInitialize;
property OnFinalize: TSCFinalize read FOnFinalize write FOnFinalize;
end;
 
{ TCustomDXSpriteEngine }
 
TCustomDXSpriteEngine = class(TComponent)
472,83 → 190,47
private
FDXDraw: TCustomDXDraw;
FEngine: TSpriteEngine;
FItems: TSpriteCollection;
procedure DXDrawNotifyEvent(Sender: TCustomDXDraw; NotifyType: TDXDrawNotifyType);
procedure SetDXDraw(Value: TCustomDXDraw);
procedure SetItems(const Value: TSpriteCollection);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
constructor Create(AOnwer: TComponent); override;
destructor Destroy; override;
procedure Dead;
procedure Draw;
procedure Move(MoveCount: Integer);
procedure Clone(const Amount: Word; const BaseNameOfSprite: string);
function ForEach(PrefixNameOdSprite: string; var Names: TStringList): Boolean;
property DXDraw: TCustomDXDraw read FDXDraw write SetDXDraw;
property Engine: TSpriteEngine read FEngine;
property Items: TSpriteCollection read FItems write SetItems;
property Engine: TSpriteEngine read FEngine;
end;
 
{ TDXSpriteEngine }
 
TDXSpriteEngine = class(TCustomDXSpriteEngine)
property Items;
published
property DXDraw;
end;
 
function Mod2(i, i2: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function Mod2f(i: Double; i2: Integer): Double; {$IFDEF VER9UP}inline;{$ENDIF}
function DefaultMapChip(iMapChip: Integer = -1; iCollisionChip: Boolean = False): TMapType; {$IFDEF VER9UP}inline;{$ENDIF}
 
implementation
 
uses DXConsts, TypInfo;
uses DXConsts;
 
const
SSpriteNotFound = 'Sprite not found';
SSpriteDuplicateName = 'Item duplicate name "%s" error';
 
function DefaultMapChip(iMapChip: Integer = -1; iCollisionChip: Boolean = False): TMapType;
begin
FillChar(Result, SizeOf(Result), 0);
with Result do
begin
MapChip := iMapChip; {image chip as number}
CollisionChip := iCollisionChip; {is collision brick}
// CollisionRect: TRect; {dirty vollision area, can be smaller or bigger than silhouette}
// Overlap: Integer; {for pulse image, like zoom etc.}
// AnimLooped: Boolean; {chip can be live}
// AnimStart, AnimCount: Integer;
// AnimSpeed, AnimPos: Double; {phase of picture by one map chip}
Rendered := rtDraw; {can be blended}
Alpha := $FF; {and blend level}
Angle := 0;
CenterX := 0.5;
CenterY := 0.5;
TextureFilter := D2D_POINT;
// Tag: Integer; {for application use}
end;
end;
 
function Mod2(i, i2: Integer): Integer;
begin
Result := i mod i2;
if Result < 0 then
Result := i2 + Result;
if Result<0 then
Result := i2+Result;
end;
 
function Mod2f(i: Double; i2: Integer): Double;
begin
if i2 = 0 then
if i2=0 then
Result := i
else
begin
Result := i - Round(i / i2) * i2;
if Result < 0 then
Result := i2 + Result;
Result := i-Trunc(i/i2)*i2;
if Result<0 then
Result := i2+Result;
end;
end;
 
557,11 → 239,8
constructor TSprite.Create(AParent: TSprite);
begin
inherited Create;
{$IFDEF Ver4Up}
fGroupnumber := -1;
{$ENDIF}
FParent := AParent;
if FParent <> nil then
if FParent<>nil then
begin
FParent.Add(Self);
if FParent is TSpriteEngine then
578,12 → 257,8
 
destructor TSprite.Destroy;
begin
{$IFDEF Ver4Up}
GroupNumber := -1;
Selected := False;
{$ENDIF}
Clear;
if FParent <> nil then
if FParent<>nil then
begin
Dec(FEngine.FAllCount);
FParent.Remove(Self);
594,36 → 269,9
inherited Destroy;
end;
 
{$IFDEF Ver4Up}
 
procedure TSprite.SetGroupNumber(AGroupNumber: Integer);
begin
if (AGroupNumber <> GroupNumber) and (Engine <> nil) then
begin
if Groupnumber >= 0 then
Engine.Groups[GroupNumber].Remove(self);
if AGroupNumber >= 0 then
Engine.Groups[AGroupNumber].Add(self);
end;
end; {SetGroupNumber}
 
procedure TSprite.SetSelected(ASelected: Boolean);
begin
if (ASelected <> fSelected) and (Engine <> nil) then
begin
fSelected := ASelected;
if Selected then
Engine.CurrentSelected.Add(self)
else
Engine.CurrentSelected.Remove(self);
Engine.fObjectsSelected := Engine.CurrentSelected.count <> 0;
end;
end;
{$ENDIF}
 
procedure TSprite.Add(Sprite: TSprite);
begin
if FList = nil then
if FList=nil then
begin
FList := TList.Create;
FDrawList := TList.Create;
636,7 → 284,7
begin
FList.Remove(Sprite);
FDrawList.Remove(Sprite);
if FList.Count = 0 then
if FList.Count=0 then
begin
FList.Free;
FList := nil;
654,10 → 302,8
while L <= H do
begin
I := (L + H) div 2;
C := TSprite(FDrawList[I]).Z - Sprite.Z;
if C < 0 then
L := I + 1
else
C := TSprite(FDrawList[I]).Z-Sprite.Z;
if C < 0 then L := I + 1 else
H := I - 1;
end;
FDrawList.Insert(L, Sprite);
665,8 → 311,8
 
procedure TSprite.Clear;
begin
while Count > 0 do
Items[Count - 1].Free;
while Count>0 do
Items[Count-1].Free;
end;
 
function TSprite.Collision: Integer;
674,7 → 320,7
i: Integer;
begin
Result := 0;
if (FEngine <> nil) and (not FDeaded) and (Collisioned) then
if (FEngine<>nil) and (not FDeaded) and (Collisioned) then
begin
with FEngine do
begin
683,7 → 329,7
FCollisionRect := Self.BoundsRect;
FCollisionSprite := Self;
 
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Collision2;
 
Result := FCollisionCount;
697,21 → 343,18
begin
if Collisioned then
begin
if (Self <> FEngine.FCollisionSprite) and OverlapRect(BoundsRect,
FEngine.FCollisionRect) and FEngine.FCollisionSprite.TestCollision(Self) and
TestCollision(FEngine.FCollisionSprite) then
if (Self<>FEngine.FCollisionSprite) and OverlapRect(BoundsRect, FEngine.FCollisionRect) and
FEngine.FCollisionSprite.TestCollision(Self) and TestCollision(FEngine.FCollisionSprite) then
begin
Inc(FEngine.FCollisionCount);
FEngine.FCollisionSprite.DoCollision(Self, FEngine.FCollisionDone);
if (not FEngine.FCollisionSprite.Collisioned) or
(FEngine.FCollisionSprite.FDeaded) then
if (not FEngine.FCollisionSprite.Collisioned) or (FEngine.FCollisionSprite.FDeaded) then
begin
FEngine.FCollisionDone := True;
end;
end;
if FEngine.FCollisionDone then
Exit;
for i := 0 to Count - 1 do
if FEngine.FCollisionDone then Exit;
for i:=0 to Count-1 do
Items[i].Collision2;
end;
end;
718,7 → 361,7
 
procedure TSprite.Dead;
begin
if (FEngine <> nil) and (not FDeaded) then
if (FEngine<>nil) and (not FDeaded) then
begin
FDeaded := True;
FEngine.FDeadList.Add(Self);
725,22 → 368,16
end;
end;
 
procedure TSprite.DoMove(MoveCount: Integer);
procedure TSprite.DoMove;
begin
if AsSigned(FOnMove) then
FOnMove(Self, MoveCount);
end;
 
procedure TSprite.DoDraw;
begin
if AsSigned(FOnDraw) then
FOnDraw(Self);
end;
 
procedure TSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
begin
if AsSigned(FOnCollision) then
FOnCollision(Sprite, Done);
end;
 
function TSprite.TestCollision(Sprite: TSprite): Boolean;
754,8 → 391,8
begin
if FMoved then
begin
DoMove(MoveCount); ReAnimate(MoveCount);
for i := 0 to Count - 1 do
DoMove(MoveCount);
for i:=0 to Count-1 do
Items[i].Move(MoveCount);
end;
end;
766,7 → 403,7
begin
if FVisible then
begin
if FEngine <> nil then
if FEngine<>nil then
begin
if OverlapRect(FEngine.FSurfaceRect, BoundsRect) then
begin
775,12 → 412,10
end;
end;
 
if FDrawList <> nil then
if FDrawList<>nil then
begin
for i := 0 to FDrawList.Count - 1 do
begin
TSprite(FDrawList[i]).Draw;
end;
for i:=0 to FDrawList.Count-1 do
TSprite(FDrawList[i]).Draw;
end;
end;
end;
792,16 → 427,15
i: Integer;
X2, Y2: Double;
begin
if Sprite.Visible and PointInRect(Point(Round(X), Round(Y)),
Bounds(Round(Sprite.X), Round(Sprite.Y), Sprite.Width, Sprite.Height)) then //corrected by Sergey
if Sprite.Visible and PointInRect(Point(Round(X), Round(Y)), Bounds(Round(Sprite.X), Round(Sprite.Y), Sprite.Width, Sprite.Width)) then
begin
if (Result = nil) or (Sprite.Z > Result.Z) then
if (Result=nil) or (Sprite.Z>Result.Z) then
Result := Sprite;
end;
 
X2 := X - Sprite.X;
Y2 := Y - Sprite.Y;
for i := 0 to Sprite.Count - 1 do
X2 := X-Sprite.X;
Y2 := Y-Sprite.Y;
for i:=0 to Sprite.Count-1 do
Collision_GetSpriteAt(X2, Y2, Sprite.Items[i]);
end;
 
811,15 → 445,15
begin
Result := nil;
 
X2 := X - Self.X;
Y2 := Y - Self.Y;
for i := 0 to Count - 1 do
X2 := X-Self.X;
Y2 := Y-Self.Y;
for i:=0 to Count-1 do
Collision_GetSpriteAt(X2, Y2, Items[i]);
end;
end;
 
function TSprite.GetBoundsRect: TRect;
begin
Result := Bounds(Round(WorldX), Round(WorldY), Width, Height);
Result := Bounds(Trunc(WorldX), Trunc(WorldY), Width, Height);
end;
 
function TSprite.GetClientRect: TRect;
829,7 → 463,7
 
function TSprite.GetCount: Integer;
begin
if FList <> nil then
if FList<>nil then
Result := FList.Count
else
Result := 0;
837,16 → 471,16
 
function TSprite.GetItem(Index: Integer): TSprite;
begin
if FList <> nil then
if FList<>nil then
Result := FList[Index]
else
raise ESpriteError.CreateFmt(SListIndexError, [Index]);
end;
end;
 
function TSprite.GetWorldX: Double;
begin
if Parent <> nil then
Result := Parent.WorldX + FX
if Parent<>nil then
Result := Parent.WorldX+FX
else
Result := FX;
end;
853,8 → 487,8
 
function TSprite.GetWorldY: Double;
begin
if Parent <> nil then
Result := Parent.WorldY + FY
if Parent<>nil then
Result := Parent.WorldY+FY
else
Result := FY;
end;
861,10 → 495,10
 
procedure TSprite.SetZ(Value: Integer);
begin
if FZ <> Value then
if FZ<>Value then
begin
FZ := Value;
if Parent <> nil then
if Parent<>nil then
begin
Parent.FDrawList.Remove(Self);
Parent.AddDrawList(Self);
872,41 → 506,6
end;
end;
 
procedure TSprite.Assign(Source: TPersistent);
begin
if Source is TSprite then
begin
FCollisioned := TSprite(Source).FCollisioned;
FMoved := TSprite(Source).FMoved;
FVisible := TSprite(Source).FVisible;
FHeight := TSprite(Source).FHeight;
FWidth := TSprite(Source).FWidth;
FX := TSprite(Source).FX;
FY := TSprite(Source).FY;
FZ := TSprite(Source).FZ;
{$IFDEF Ver4Up}
FSelected := TSprite(Source).FSelected;
FGroupNumber := TSprite(Source).FGroupNumber;
{$ENDIF}
{copy image base - when exists}
FDXImage := TSprite(Source).FDXImage;
FDXImageName := TSprite(Source).FDXImageName;
FDXImageList := TSprite(Source).FDXImageList;
{events}
FOnDraw := TSprite(Source).FOnDraw;
FOnMove := TSprite(Source).FOnMove;
FOnCollision := TSprite(Source).FOnCollision;
FOnGetImage := TSprite(Source).FOnGetImage;
end
else
inherited;
end;
 
procedure TSprite.ReAnimate(MoveCount: Integer);
begin
 
end;
 
{ TImageSprite }
 
constructor TImageSprite.Create(AParent: TSprite);
913,49 → 512,24
begin
inherited Create(AParent);
FTransparent := True;
FAlpha := 255;
FAngle := 0;
FBlendMode := rtDraw;
FCenterX := 0.5;
FCenterY := 0.5;
FBlurImage := False;
FillChar(FBlurImageArr, SizeOf(FBlurImageArr), 0);
FTextureFilter := D2D_POINT;
end;
 
procedure TImageSprite.SetImage(AImage: TPictureCollectionItem);
begin
FDXImage := AImage;
FDXImageName := '';
if AImage <> nil then
begin
Width := AImage.Width;
Height := AImage.Height;
FDXImageName := FDXImage.Name;
end
else
begin
Width := 0;
Height := 0;
end;
end; {SetImage}
 
function TImageSprite.GetBoundsRect: TRect;
var
dx, dy: Integer;
begin
dx := Round(WorldX);
dy := Round(WorldY);
dx := Trunc(WorldX);
dy := Trunc(WorldY);
if FTile then
begin
dx := Mod2(dx, FEngine.SurfaceRect.Right + Width);
dy := Mod2(dy, FEngine.SurfaceRect.Bottom + Height);
dx := Mod2(dx, FEngine.SurfaceRect.Right+Width);
dy := Mod2(dy, FEngine.SurfaceRect.Bottom+Height);
 
if dx > FEngine.SurfaceRect.Right then
dx := (dx - FEngine.SurfaceRect.Right) - Width;
if dx>FEngine.SurfaceRect.Right then
dx := (dx-FEngine.SurfaceRect.Right)-Width;
 
if dy > FEngine.SurfaceRect.Bottom then
dy := (dy - FEngine.SurfaceRect.Bottom) - Height;
if dy>FEngine.SurfaceRect.Bottom then
dy := (dy-FEngine.SurfaceRect.Bottom)-Height;
end;
 
Result := Bounds(dx, dy, Width, Height);
963,71 → 537,53
 
procedure TImageSprite.DoMove(MoveCount: Integer);
begin
if AsSigned(FOnMove) then
FOnMove(Self, MoveCount)
else
FAnimPos := FAnimPos + FAnimSpeed*MoveCount;
 
if FAnimLooped then
begin
ReAnimate(MoveCount);
if FAnimCount>0 then
FAnimPos := Mod2f(FAnimPos, FAnimCount)
else
FAnimPos := 0;
end else
begin
if FAnimPos>=FAnimCount then
begin
FAnimPos := FAnimCount-1;
FAnimSpeed := 0;
end;
if FAnimPos<0 then
begin
FAnimPos := 0;
FAnimSpeed := 0;
end;
end;
end;
 
function TImageSprite.GetDrawImageIndex: Integer;
begin
Result := FAnimStart + Trunc(FAnimPos); //solve 1.07f to Round()
Result := FAnimStart+Trunc(FAnimPos);
end;
 
function TImageSprite.GetDrawRect: TRect;
begin
Result := BoundsRect;
OffsetRect(Result, (Width - Image.Width) div 2, (Height - Image.Height) div 2);
OffsetRect(Result, (Width-Image.Width) div 2, (Height-Image.Height) div 2);
end;
 
procedure TImageSprite.LoadImage;
var
vImage: TPictureCollectionItem;
begin
if Image = nil then
if AsSigned(FOnGetImage) then
begin
vImage := nil;
FOnGetImage(Self, vImage);
if vImage <> Image then
Image := vImage;
end
else
if FDXImageName <> '' then
if Assigned(FDXImageList) then
begin
Image := FDXImageList.Items.Find(FDXImageName);
end;
end;
 
procedure TImageSprite.DoDraw;
var
ImageIndex: Integer;
r: TRect;
begin
LoadImage;
if Image = nil then
Exit;
if AsSigned(FOnDraw) then {owner draw called here}
FOnDraw(Self)
else {when is not owner draw then go here}
begin
r := Bounds(Round(WorldX), Round(WorldY), Width, Height);
{New function implemented}
if Assigned(FEngine.FOwner) then
DXDraws.DXDraw_Paint(FEngine.FOwner.FDXDraw, Image, r, GetDrawImageIndex,
FBlurImageArr, FBlurImage, FTextureFilter, FMirrorFlip, FBlendMode, FAngle,
FAlpha, FCenterX, FCenterY);
end;
ImageIndex := GetDrawImageIndex;
r := GetDrawRect;
Image.Draw(FEngine.Surface, r.Left, r.Top, ImageIndex);
end;
 
{$WARNINGS OFF}
{$HINTS OFF}
function ImageCollisionTest(suf1, suf2: TDirectDrawSurface; const rect1, rect2: TRect;
x1,y1,x2,y2: Integer; DoPixelCheck: Boolean): Boolean;
 
function TImageSprite.ImageCollisionTest(suf1, suf2: TDirectDrawSurface;
const rect1, rect2: TRect; x1, y1, x2, y2: Integer; DoPixelCheck: Boolean): Boolean;
 
function ClipRect(var DestRect: TRect; const DestRect2: TRect): Boolean;
begin
with DestRect do
1043,148 → 599,111
 
type
PRGB = ^TRGB;
 
TRGB = packed record
R, G, B: byte;
R, G, B: Byte;
end;
var
ddsd1, ddsd2: {$IFDEF D3D_deprecated}TDDSURFACEDESC{$ELSE}TDDSurfaceDesc2{$ENDIF};
r1, r2, r1a, r2a: TRect;
ddsd1, ddsd2: TDDSurfaceDesc;
r1, r2: TRect;
tc1, tc2: DWORD;
x, y, w, h: Integer;
P1, P2: Pointer;
begin
with rect1 do
r1 := Bounds(0, 0, Right - Left, Bottom - Top);
r1a := r1;
with rect2 do
r2 := Bounds(0, 0, Right - Left, Bottom - Top);
r2a := r2;
r1 := rect1;
with rect2 do r2 := Bounds(x2-x1, y2-y1, Right-Left, Bottom-Top);
 
with rect2 do
r2 := Bounds(x2 - x1, y2 - y1, Right - Left, Bottom - Top);
 
Result := OverlapRect(r1, r2);
 
if (suf1 = nil) or (suf2 = nil) then
Exit;
if (suf1=nil) or (suf2=nil) then Exit;
 
if DoPixelCheck and Result then
begin
{ Get Overlapping rectangle }
with r1 do
r1 := Bounds(Max(x2 - x1, 0), Max(y2 - y1, 0), Right - Left, Bottom - Top);
with r2 do
r2 := Bounds(Max(x1 - x2, 0), Max(y1 - y2, 0), Right - Left, Bottom - Top);
with r1 do r1 := Bounds(Max(x2-x1, 0), Max(y2-y1, 0), Right-Left, Bottom-Top);
with r2 do r2 := Bounds(Max(x1-x2, 0), Max(y1-y2, 0), Right-Left, Bottom-Top);
 
ClipRect(r1, r1a);
ClipRect(r2, r2a);
ClipRect(r1, rect1);
ClipRect(r2, rect2);
 
w := Min(r1.Right - r1.Left, r2.Right - r2.Left);
h := Min(r1.Bottom - r1.Top, r2.Bottom - r2.Top);
w := Min(r1.Right-r1.Left, r2.Right-r2.Left);
h := Min(r1.Bottom-r1.Top, r2.Bottom-r2.Top);
 
ClipRect(r1, bounds(r1.Left, r1.Top, w, h));
ClipRect(r2, bounds(r2.Left, r2.Top, w, h));
 
{ Pixel check !!! }
ddsd1.dwSize := SizeOf(ddsd1);
 
with rect1 do
r1 := Bounds(r1.Left + left, r1.Top + top, w, h);
with rect2 do
r2 := Bounds(r2.Left + left, r2.Top + top, w, h);
 
if suf1 = suf2 then
begin
suf2.Lock(r2, ddsd2);
suf2.unlock;
end;
 
if suf1.Lock(r1, ddsd1) then
begin
try
ddsd2.dwSize := SizeOf(ddsd2);
if (suf1 = suf2) or suf2.Lock(r2, ddsd2) then
if (suf1=suf2) or suf2.Lock(r2, ddsd2) then
begin
try
{this line out: don't test pixel but rect only, its wrong}
{if suf1=suf2 then ddsd2 := ddsd1;}
if ddsd1.ddpfPixelFormat.dwRGBBitCount <> ddsd2.ddpfPixelFormat.dwRGBBitCount then
Exit;
 
if suf1=suf2 then ddsd2 := ddsd1;
if ddsd1.ddpfPixelFormat.dwRGBBitCount<>ddsd2.ddpfPixelFormat.dwRGBBitCount then Exit;
{ Get transparent color }
tc1 := ddsd1.ddckCKSrcBlt.dwColorSpaceLowValue;
tc2 := ddsd2.ddckCKSrcBlt.dwColorSpaceLowValue;
 
case ddsd1.ddpfPixelFormat.dwRGBBitCount of
8:
begin
for y := 0 to h - 1 do
begin
P1 := Pointer(Integer(ddsd1.lpSurface) + y * ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface) + y * ddsd2.lPitch);
for x := 0 to w - 1 do
8 : begin
for y:=0 to h-1 do
begin
if (PByte(P1)^ <> tc1) and (PByte(P2)^ <> tc2) then
Exit;
Inc(PByte(P1));
Inc(PByte(P2));
P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
for x:=0 to w-1 do
begin
if (PByte(P1)^<>tc1) and (PByte(P2)^<>tc2) then Exit;
Inc(PByte(P1));
Inc(PByte(P2));
end;
end;
end;
end;
16:
begin
for y := 0 to h - 1 do
begin
P1 := Pointer(Integer(ddsd1.lpSurface) + y * ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface) + y * ddsd2.lPitch);
for x := 0 to w - 1 do
16: begin
for y:=0 to h-1 do
begin
if (PWord(P1)^ <> tc1) and (PWord(P2)^ <> tc2) then
Exit;
Inc(PWord(P1));
Inc(PWord(P2));
P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
for x:=0 to w-1 do
begin
if (PWord(P1)^<>tc1) and (PWord(P2)^<>tc2) then Exit;
Inc(PWord(P1));
Inc(PWord(P2));
end;
end;
end;
end;
24:
begin
for y := 0 to h - 1 do
begin
P1 := Pointer(Integer(ddsd1.lpSurface) + y * ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface) + y * ddsd2.lPitch);
for x := 0 to w - 1 do
24: begin
for y:=0 to h-1 do
begin
with PRGB(P1)^ do
if (R shl 16) or (G shl 8) or B <> tc1 then
Exit;
with PRGB(P2)^ do
if (R shl 16) or (G shl 8) or B <> tc2 then
Exit;
Inc(PRGB(P1));
Inc(PRGB(P2));
P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
for x:=0 to w-1 do
begin
if ((PRGB(P1)^.R shl 16) or (PRGB(P1)^.G shl 8) or PRGB(P1)^.B<>tc1) and
((PRGB(P2)^.R shl 16) or (PRGB(P2)^.G shl 8) or PRGB(P2)^.B<>tc2) then Exit;
Inc(PRGB(P1));
Inc(PRGB(P2));
end;
end;
end;
end;
32:
begin
for y := 0 to h - 1 do
begin
P1 := Pointer(Integer(ddsd1.lpSurface) + y * ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface) + y * ddsd2.lPitch);
for x := 0 to w - 1 do
32: begin
for y:=0 to h-1 do
begin
if (PDWORD(P1)^ <> tc1) and (PDWORD(P2)^ <> tc2) then
Exit;
Inc(PDWORD(P1));
Inc(PDWORD(P2));
P1 := Pointer(Integer(ddsd1.lpSurface)+y*ddsd1.lPitch);
P2 := Pointer(Integer(ddsd2.lpSurface)+y*ddsd2.lPitch);
for x:=0 to w-1 do
begin
if (PDWORD(P1)^ and $FFFFFF<>tc1) and (PDWORD(P2)^ and $FFFFFF<>tc2) then Exit;
Inc(PDWORD(P1));
Inc(PDWORD(P2));
end;
end;
end;
end;
end;
finally
if suf1 <> suf2 then
suf2.UnLock;
if suf1<>suf2 then suf2.UnLock;
end;
end;
finally
1196,351 → 715,85
end;
end;
 
{$HINTS ON}
{$WARNINGS ON}
 
function TImageSprite.TestCollision(Sprite: TSprite): Boolean;
var
img1, img2: Integer;
box1, box2: TRect;
b1, b2: TRect;
begin
if (Sprite is TImageSprite) then
if FPixelCheck then
begin
box1 := GetDrawRect;
box2 := TImageSprite(Sprite).GetDrawRect;
if (Sprite is TImageSprite) and FPixelCheck then
begin
b1 := GetDrawRect;
b2 := TImageSprite(Sprite).GetDrawRect;
 
img1 := GetDrawImageIndex;
img2 := TImageSprite(Sprite).GetDrawImageIndex;
img1 := GetDrawImageIndex;
img2 := TImageSprite(Sprite).GetDrawImageIndex;
 
Result := ImageCollisionTest(Image.PatternSurfaces[img1],
TImageSprite(Sprite).Image.PatternSurfaces[img2], Image.PatternRects[img1],
TImageSprite(Sprite).Image.PatternRects[img2], box1.Left, box1.Top,
box2.Left, box2.Top, True);
end
else
Result := OverlapRect(Bounds(Round(Sprite.WorldX), Round(Sprite.WorldY),
Sprite.Width, Sprite.Height), Bounds(Round(WorldX), Round(WorldY), Width, Height))
else
Result := ImageCollisionTest(Image.PatternSurfaces[img1], TImageSprite(Sprite).Image.PatternSurfaces[img2],
Image.PatternRects[img1], TImageSprite(Sprite).Image.PatternRects[img2],
b1.Left, b1.Top, b2.Left, b2.Top, True);
end else
Result := inherited TestCollision(Sprite);
end;
 
procedure TImageSprite.Assign(Source: TPersistent);
{ TImageSpriteEx }
 
constructor TImageSpriteEx.Create(AParent: TSprite);
begin
if Source is TImageSprite then begin
FCenterX := TImageSprite(Source).FCenterX;
FCenterY := TImageSprite(Source).FCenterY;
FAnimCount := TImageSprite(Source).FAnimCount;
FAnimLooped := TImageSprite(Source).FAnimLooped;
FAnimPos := TImageSprite(Source).FAnimPos;
FAnimSpeed := TImageSprite(Source).FAnimSpeed;
FAnimStart := TImageSprite(Source).FAnimStart;
FDXImage := TImageSprite(Source).FDXImage;
FPixelCheck := TImageSprite(Source).FPixelCheck;
FTile := TImageSprite(Source).FTile;
FTransparent := TImageSprite(Source).FTransparent;
FAngle := TImageSprite(Source).FAngle;
FAlpha := TImageSprite(Source).FAlpha;
FBlendMode := TImageSprite(Source).FBlendMode;
FBlurImage := TImageSprite(Source).FBlurImage;
end;
inherited;
inherited Create(AParent);
FAlpha := 255;
end;
 
procedure TImageSprite.ReAnimate(MoveCount: Integer);
procedure TImageSpriteEx.DoDraw;
var
I: Integer;
r: TRect;
begin
FAnimPos := FAnimPos + FAnimSpeed * MoveCount;
r := Bounds(Trunc(WorldX), Trunc(WorldY), Width, Height);
 
if FAnimLooped then
if FAngle and $FF=0 then
begin
if FAnimCount > 0 then
FAnimPos := Mod2f(FAnimPos, FAnimCount)
else
FAnimPos := 0;
end
else
begin
if Round(FAnimPos) >= FAnimCount then
if FAlpha<255 then
begin
FAnimPos := FAnimCount - 1;
FAnimSpeed := 0;
end;
if FAnimPos < 0 then
Image.DrawAlpha(FEngine.FSurface, r, GetDrawImageIndex, FAlpha)
end else
begin
FAnimPos := 0;
FAnimSpeed := 0;
Image.StretchDraw(FEngine.FSurface, r, GetDrawImageIndex);
end;
end;
if FBlurImage then
end else
begin
{ale jen jsou-li jine souradnice}
if (FBlurImageArr[High(FBlurImageArr)].eX <> Round(WorldX)) or
(FBlurImageArr[High(FBlurImageArr)].eY <> Round(WorldY)) then
if FAlpha<255 then
begin
for i := Low(FBlurImageArr) + 1 to High(FBlurImageArr) do
begin
FBlurImageArr[i - 1] := FBlurImageArr[i];
{adjust the blur intensity}
FBlurImageArr[i - 1].eIntensity := Round(FAlpha / (High(FBlurImageArr) + 1)) * (i - 1);
end;
with FBlurImageArr[High(FBlurImageArr)] do
begin
eX := Round(WorldX);
eY := Round(WorldY);
ePatternIndex := GetDrawImageIndex;
eIntensity := Round(FAlpha / (High(FBlurImageArr) + 1)) * High(FBlurImageArr);
eBlendMode := FBlendMode;
eActive := True;
end;
Image.DrawRotateAlpha(FEngine.FSurface, (r.Left+r.Right) div 2, (r.Top+r.Bottom) div 2,
Width, Height, GetDrawImageIndex, 0.5, 0.5, FAngle, FAlpha)
end else
begin
Image.DrawRotate(FEngine.FSurface, (r.Left+r.Right) div 2, (r.Top+r.Bottom) div 2,
Width, Height, GetDrawImageIndex, 0.5, 0.5, FAngle)
end;
end;
end;
 
function TImageSprite.StoreCenterX: Boolean;
function TImageSpriteEx.GetBoundsRect: TRect;
begin
Result := FCenterX <> 0.5;
Result := FEngine.SurfaceRect;
end;
 
function TImageSprite.StoreCenterY: Boolean;
function TImageSpriteEx.TestCollision(Sprite: TSprite): Boolean;
begin
Result := FCenterY <> 0.5;
end;
 
function TImageSprite.StoreAlpha: Boolean;
begin
Result := FAlpha <> 0.0;
end;
 
procedure TImageSprite.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineProperty('BlendMode', ReadBlendMode, WriteBlendMode, FBlendMode <> rtDraw);
Filer.DefineProperty('Angle', ReadAngle, WriteAngle, FAngle <> 0);
Filer.DefineProperty('CenterX', ReadCenterX, WriteCenterX, FCenterX <> 0.5);
Filer.DefineProperty('CenterY', ReadCenterY, WriteCenterY, FCenterY <> 0.5);
Filer.DefineProperty('Alpha', ReadAlpha, WriteAlpha, FAlpha <> $FF);
Filer.DefineProperty('AnimCount', ReadAnimCount, WriteAnimCount, FAnimCount <> 0);
Filer.DefineProperty('AnimLooped', ReadAnimLooped, WriteAnimLooped, FAnimLooped);
Filer.DefineProperty('AnimPos', ReadAnimPos, WriteAnimPos, FAnimPos <> 0);
Filer.DefineProperty('AnimSpeed', ReadAnimSpeed, WriteAnimSpeed, FAnimSpeed <> 0);
Filer.DefineProperty('AnimStart', ReadAnimStart, WriteAnimStart, True);
Filer.DefineProperty('PixelCheck', ReadPixelCheck, WritePixelCheck, FPixelCheck);
Filer.DefineProperty('Tile', ReadTile, WriteTile, FTile);
Filer.DefineProperty('BlurImage', ReadBlurImage, WriteBlurImage, FBlurImage);
Filer.DefineProperty('MirrorFlip', ReadMirrorFlip, WriteMirrorFlip, FMirrorFlip <> []);
Filer.DefineProperty('TextureFilter', ReadTextureFilter, WriteTextureFilter, FTextureFilter <> D2D_POINT);
end;
 
procedure TImageSprite.WriteMirrorFlip(Writer: TWriter);
var
q: TRenderMirrorFlip;
s, ss: string;
// I: Integer;
//PI: PPropInfo;
begin
// PI := GetPropInfo(Self,'MirrorFlip');
// I := Integer(FMirrorFlip);
s := '[]'; ss := '';
for q := Low(TRenderMirrorFlip) to High(TRenderMirrorFlip) do
if q in FMirrorFlip then
ss := ss + GetEnumName(TypeInfo(TRenderMirrorFlip), Ord(q)) + ', ';
if ss <> '' then
s := '[' + Copy(ss, 1, Length(ss) - 2) + ']';
Writer.WriteString(s);
//--- Writer.WriteString(SetToString(PI, GetOrdProp(Self, PI), True));
end;
 
procedure TImageSprite.ReadMirrorFlip(Reader: TReader);
var
q: TRenderMirrorFlip;
qq: TRenderMirrorFlipSet;
s {, ss}: string;
// PI: PPropInfo;
begin
// PI := GetPropInfo(Self,'MirrorFlip');
// SetOrdProp(Self,PI,StringToSet(PI, Reader.ReadString));
qq := [];
s := Reader.ReadString;
for q := Low(TRenderMirrorFlip) to High(TRenderMirrorFlip) do
if Pos(GetEnumName(TypeInfo(TRenderMirrorFlip), Ord(q)), s) <> 0 then
qq := qq + [q];
FMirrorFlip := qq;
end;
 
procedure TImageSprite.ReadAnimLooped(Reader: TReader);
begin
FAnimLooped := Reader.ReadBoolean;
end;
 
procedure TImageSprite.WriteAnimLooped(Writer: TWriter);
begin
Writer.WriteBoolean(FAnimLooped);
end;
 
procedure TImageSprite.ReadAnimPos(Reader: TReader);
begin
FAnimPos := Reader.ReadFloat;
end;
 
procedure TImageSprite.WriteAnimPos(Writer: TWriter);
begin
Writer.WriteFloat(FAnimPos);
end;
 
procedure TImageSprite.ReadAnimSpeed(Reader: TReader);
begin
FAnimSpeed := Reader.ReadFloat;
end;
 
procedure TImageSprite.WriteAnimSpeed(Writer: TWriter);
begin
Writer.WriteFloat(FAnimSpeed);
end;
 
procedure TImageSprite.ReadAnimStart(Reader: TReader);
begin
FAnimStart := Reader.ReadInteger;
end;
 
procedure TImageSprite.WriteAnimStart(Writer: TWriter);
begin
Writer.WriteInteger(FAnimStart);
end;
 
procedure TImageSprite.ReadPixelCheck(Reader: TReader);
begin
FPixelCheck := Reader.ReadBoolean;
end;
 
procedure TImageSprite.WritePixelCheck(Writer: TWriter);
begin
Writer.WriteBoolean(FPixelCheck);
end;
 
procedure TImageSprite.ReadTile(Reader: TReader);
begin
FTile := Reader.ReadBoolean;
end;
 
procedure TImageSprite.WriteTile(Writer: TWriter);
begin
Writer.WriteBoolean(FTile);
end;
 
procedure TImageSprite.ReadAnimCount(Reader: TReader);
begin
FAnimCount := Reader.ReadInteger;
end;
 
procedure TImageSprite.WriteAnimCount(Writer: TWriter);
begin
Writer.WriteInteger(FAnimCount);
end;
 
procedure TImageSprite.ReadAlpha(Reader: TReader);
begin
FAlpha := Reader.ReadInteger;
end;
 
procedure TImageSprite.WriteAlpha(Writer: TWriter);
begin
Writer.WriteInteger(FAlpha);
end;
 
procedure TImageSprite.ReadCenterY(Reader: TReader);
begin
FCenterY := Reader.ReadFloat;
end;
 
procedure TImageSprite.WriteCenterY(Writer: TWriter);
begin
Writer.WriteFloat(FCenterY);
end;
 
procedure TImageSprite.ReadCenterX(Reader: TReader);
begin
FCenterX := Reader.ReadFloat;
end;
 
procedure TImageSprite.WriteCenterX(Writer: TWriter);
begin
Writer.WriteFloat(FCenterX);
end;
 
procedure TImageSprite.ReadAngle(Reader: TReader);
begin
FAngle := Reader.{$IFDEF VER4UP}ReadSingle{$ELSE}ReadFloat{$ENDIF};
end;
 
procedure TImageSprite.WriteAngle(Writer: TWriter);
begin
Writer.{$IFDEF VER4UP}WriteSingle{$ELSE}WriteFloat{$ENDIF}(FAngle);
end;
 
procedure TImageSprite.ReadBlendMode(Reader: TReader);
begin
FBlendMode := TRenderType(GetEnumValue(TypeInfo(TRenderType), Reader.ReadString));
end;
 
procedure TImageSprite.WriteBlendMode(Writer: TWriter);
begin
Writer.WriteString(GetEnumName(TypeInfo(TRenderType), Ord(FBlendMode)));
end;
 
procedure TImageSprite.ReadBlurImage(Reader: TReader);
begin
FBlurImage := Reader.ReadBoolean;
end;
 
procedure TImageSprite.WriteBlurImage(Writer: TWriter);
begin
Writer.WriteBoolean(FBlurImage);
end;
 
procedure TImageSprite.ReadTextureFilter(Reader: TReader);
begin
FTextureFilter := TD2DTextureFilter(Reader.ReadInteger);
end;
 
procedure TImageSprite.WriteTextureFilter(Writer: TWriter);
begin
Writer.WriteInteger(Ord(FTextureFilter));
end;
 
procedure TImageSprite.SetBlurImageArr(const Value: TBlurImageArr);
begin
FBlurImageArr := Value;
end;
 
procedure TImageSprite.SetBlurImage(const Value: Boolean);
begin
if (FBlurImage <> Value) and (Value) then
if Sprite is TImageSpriteEx then
begin
FillChar(FBlurImageArr, SizeOf(FBlurImageArr), 0); //get out when set up
Result := OverlapRect(Bounds(Trunc(Sprite.WorldX), Trunc(Sprite.WorldY), Sprite.Width, Sprite.Height),
Bounds(Trunc(WorldX), Trunc(WorldY), Width, Height));
end else
begin
Result := OverlapRect(Sprite.BoundsRect, Bounds(Trunc(WorldX), Trunc(WorldY), Width, Height));
end;
FBlurImage := Value;
end;
 
function TImageSprite.GetImage: TPictureCollectionItem;
begin
Result := FDXImage;
end;
 
procedure TImageSprite.SetMirrorFlip(const Value: TRenderMirrorFlipSet);
begin
FMirrorFlip := Value;
end;
 
{ TBackgroundSprite }
 
constructor TBackgroundSprite.Create(AParent: TSprite);
begin
inherited Create(AParent);
FMap := nil;
FMapWidth := 0;
FMapHeight := 0;
Collisioned := False;
end;
 
1550,159 → 803,104
inherited Destroy;
end;
 
procedure TBackgroundSprite.ChipsDraw(Image: TPictureCollectionItem; X, Y: Integer; PatternIndex: Integer);
begin
if AsSigned(FOnDraw) then
FOnDraw(Self)
else
begin
//Image.Draw(FEngine.Surface, X, Y, PatternIndex);
{New function implemented}
if Assigned(FEngine.FOwner) then
//Image.DrawAlpha(DXDraw1.Surface,ChipsRect,ChipsPatternIndex,Blend);
DXDraws.DXDraw_Paint(FEngine.FOwner.FDXDraw, Image, ChipsRect, ChipsPatternIndex,
FBlurImageArr, FBlurImage, FTextureFilter, FMirrorFlip, FBlendMode, FAngle,
Map[X,Y].Alpha, FCenterX, FCenterY);
end;
end;
 
procedure TBackgroundSprite.DoDraw;
var
TmpX, TmpY, cx, cy, cx2, cy2, PatternIndex, ChipWidth, ChipHeight: Integer;
_x, _y, cx, cy, cx2, cy2, c, ChipWidth, ChipHeight: Integer;
StartX, StartY, EndX, EndY, StartX_, StartY_, OfsX, OfsY, dWidth, dHeight: Integer;
r: TRect;
Q: TMapType;
begin
LoadImage;
if Image = nil then
Exit;
if Image=nil then Exit;
 
if (FMapWidth <= 0) or (FMapHeight <= 0) then
Exit;
if (FMapWidth<=0) or (FMapHeight<=0) then Exit;
 
r := Image.PatternRects[0];
ChipWidth := r.Right - r.Left;
ChipHeight := r.Bottom - r.Top;
ChipWidth := r.Right-r.Left;
ChipHeight := r.Bottom-r.Top;
 
dWidth := (FEngine.SurfaceRect.Right + ChipWidth) div ChipWidth + 1;
dHeight := (FEngine.SurfaceRect.Bottom + ChipHeight) div ChipHeight + 1;
dWidth := (FEngine.SurfaceRect.Right+ChipWidth) div ChipWidth+1;
dHeight := (FEngine.SurfaceRect.Bottom+ChipHeight) div ChipHeight+1;
 
TmpX := Round(WorldX);
TmpY := Round(WorldY);
_x := Trunc(WorldX);
_y := Trunc(WorldY);
 
OfsX := TmpX mod ChipWidth;
OfsY := TmpY mod ChipHeight;
OfsX := _x mod ChipWidth;
OfsY := _y mod ChipHeight;
 
StartX := TmpX div ChipWidth;
StartX := _x div ChipWidth;
StartX_ := 0;
 
if StartX < 0 then
if StartX<0 then
begin
StartX_ := -StartX;
StartX := 0;
end;
 
StartY := TmpY div ChipHeight;
StartY := _y div ChipHeight;
StartY_ := 0;
 
if StartY < 0 then
if StartY<0 then
begin
StartY_ := -StartY;
StartY := 0;
end;
 
EndX := Min(StartX + FMapWidth - StartX_, dWidth);
EndY := Min(StartY + FMapHeight - StartY_, dHeight);
EndX := Min(StartX+FMapWidth-StartX_, dWidth);
EndY := Min(StartY+FMapHeight-StartY_, dHeight);
 
if FTile then
begin
for cy := -1 to dHeight do
for cy:=-1 to dHeight do
begin
cy2 := Mod2((cy - StartY + StartY_), FMapHeight);
for cx := -1 to dWidth do
cy2 := Mod2((cy-StartY+StartY_), FMapHeight);
for cx:=-1 to dWidth do
begin
cx2 := Mod2((cx - StartX + StartX_), FMapWidth);
PatternIndex := Chips[cx2, cy2];
ChipsPatternIndex := PatternIndex; //refresh only
ChipsRect := Bounds(cx * ChipWidth + OfsX, cy * ChipHeight + OfsY, ChipWidth, ChipHeight);
if PatternIndex >= 0 then
begin
if AsSigned(FOnDraw) then
FOnDraw(Self)
else
begin
{New function implemented}
if Assigned(FEngine.FOwner) then
begin
Q := Map[cx2,cy2];
DXDraws.DXDraw_Paint(FEngine.FOwner.FDXDraw, Image, ChipsRect, Q.MapChip,
FBlurImageArr, FBlurImage, Q.TextureFilter, Q.MirrorFlip, Q.Rendered, Q.Angle,
Q.Alpha, Q.CenterX, Q.CenterY);
end;
end;
end;
cx2 := Mod2((cx-StartX+StartX_), FMapWidth);
c := Chips[cx2, cy2];
if c>=0 then
Image.Draw(FEngine.Surface, cx*ChipWidth+OfsX, cy*ChipHeight+OfsY, c);
end;
end;
end
else
end else
begin
for cy := StartY to EndY - 1 do
for cx := StartX to EndX - 1 do
for cy:=StartY to EndY-1 do
for cx:=StartX to EndX-1 do
begin
PatternIndex := Chips[cx - StartX + StartX_, cy - StartY + StartY_];
ChipsPatternIndex := PatternIndex; //refresh only
ChipsRect := Bounds(cx * ChipWidth + OfsX, cy * ChipHeight + OfsY, ChipWidth, ChipHeight);
if PatternIndex >= 0 then
begin
if AsSigned(FOnDraw) then
FOnDraw(Self)
else
begin
{New function implemented}
if Assigned(FEngine.FOwner) then
begin
Q := Map[cx,cy];
DXDraws.DXDraw_Paint(FEngine.FOwner.FDXDraw, Image, ChipsRect, Q.MapChip,
FBlurImageArr, FBlurImage, Q.TextureFilter, Q.MirrorFlip, Q.Rendered, Q.Angle,
Q.Alpha, Q.CenterX, Q.CenterY);
end;
end;
end
c := Chips[cx-StartX+StartX_, cy-StartY+StartY_];
if c>=0 then
Image.Draw(FEngine.Surface, cx*ChipWidth+OfsX, cy*ChipHeight+OfsY, c);
end;
end;
end;
end;
 
function TBackgroundSprite.TestCollision(Sprite: TSprite): Boolean;
var
box0, box1, box2: TRect;
b, b1, b2: TRect;
cx, cy, ChipWidth, ChipHeight: Integer;
r: TRect;
begin
Result := True;
if Image = nil then
Exit;
if (FMapWidth <= 0) or (FMapHeight <= 0) then
Exit;
if Image=nil then Exit;
if (FMapWidth<=0) or (FMapHeight<=0) then Exit;
 
r := Image.PatternRects[0];
ChipWidth := r.Right - r.Left;
ChipHeight := r.Bottom - r.Top;
ChipWidth := r.Right-r.Left;
ChipHeight := r.Bottom-r.Top;
 
box1 := Sprite.BoundsRect;
box2 := BoundsRect;
 
IntersectRect(box0, box1, box2);
 
OffsetRect(box0, -Round(WorldX), -Round(WorldY));
OffsetRect(box1, -Round(WorldX), -Round(WorldY));
b1 := Sprite.BoundsRect;
b2 := BoundsRect;
 
for cy := (box0.Top - ChipHeight + 1) div ChipHeight to box0.Bottom div ChipHeight do
for cx := (box0.Left - ChipWidth + 1) div ChipWidth to box0.Right div ChipWidth do
IntersectRect(b, b1, b2);
 
OffsetRect(b, -Trunc(WorldX), -Trunc(WorldY));
OffsetRect(b1, -Trunc(WorldX), -Trunc(WorldY));
 
for cy:=(b.Top-ChipHeight+1) div ChipHeight to b.Bottom div ChipHeight do
for cx:=(b.Left-ChipWidth+1) div ChipWidth to b.Right div ChipWidth do
if CollisionMap[Mod2(cx, MapWidth), Mod2(cy, MapHeight)] then
begin
if OverlapRect(Bounds(cx * ChipWidth, cy * ChipHeight, ChipWidth,
ChipHeight), box1) then
Exit;
if OverlapRect(Bounds(cx*ChipWidth, cy*ChipHeight, ChipWidth, ChipHeight), b1) then Exit;
end;
 
Result := False;
1710,44 → 908,23
 
function TBackgroundSprite.GetChip(X, Y: Integer): Integer;
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
Result := PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.MapChip
if (X>=0) and (X<FMapWidth) and (Y>=0) and (Y<FMapHeight) then
Result := PInteger(Integer(FMap)+(Y*FMapWidth+X)*SizeOf(Integer))^
else
Result := -1;
end;
 
type
PBoolean = ^Boolean;
 
function TBackgroundSprite.GetCollisionMapItem(X, Y: Integer): Boolean;
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
Result := PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.CollisionChip
if (X>=0) and (X<FMapWidth) and (Y>=0) and (Y<FMapHeight) then
Result := PBoolean(Integer(FCollisionMap)+(Y*FMapWidth+X)*SizeOf(Boolean))^
else
Result := False;
end;
 
function TBackgroundSprite.GetCollisionRectItem(X, Y: Integer): TRect;
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
Result := PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.CollisionRect
else
Result := Rect(0, 0, 0, 0);
end;
 
function TBackgroundSprite.GetTagMap(X, Y: Integer): Integer;
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
Result := PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.Tag
else
Result := 0;
end;
 
function TBackgroundSprite.GetMap(X, Y: Integer): TMapType;
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
Result := PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^
else
FillChar(Result, SizeOf(Result), 0);
end;
 
function TBackgroundSprite.GetBoundsRect: TRect;
begin
if FTile then
1754,10 → 931,9
Result := FEngine.SurfaceRect
else
begin
LoadImage;
if Image <> nil then
Result := Bounds(Round(WorldX), Round(WorldY), Image.Width * FMapWidth,
Image.Height * FMapHeight)
if Image<>nil then
Result := Bounds(Trunc(WorldX), Trunc(WorldY),
Image.Width*FMapWidth, Image.Height*FMapHeight)
else
Result := Rect(0, 0, 0, 0);
end;
1765,34 → 941,16
 
procedure TBackgroundSprite.SetChip(X, Y: Integer; Value: Integer);
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.MapChip := Value;
if (X>=0) and (X<FMapWidth) and (Y>=0) and (Y<FMapHeight) then
PInteger(Integer(FMap)+(Y*FMapWidth+X)*SizeOf(Integer))^ := Value;
end;
 
procedure TBackgroundSprite.SetCollisionMapItem(X, Y: Integer; Value: Boolean);
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.CollisionChip := Value;
if (X>=0) and (X<FMapWidth) and (Y>=0) and (Y<FMapHeight) then
PBoolean(Integer(FCollisionMap)+(Y*FMapWidth+X)*SizeOf(Boolean))^ := Value;
end;
 
procedure TBackgroundSprite.SetCollisionRectItem(X, Y: Integer; Value: TRect);
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.CollisionRect := Value;
end;
 
procedure TBackgroundSprite.SetTagMap(X, Y: Integer; Value: Integer);
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.Tag := Value;
end;
 
procedure TBackgroundSprite.SetMap(X, Y: Integer; Value: TMapType);
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^ := Value;
end;
 
procedure TBackgroundSprite.SetMapHeight(Value: Integer);
begin
SetMapSize(FMapWidth, Value);
1803,116 → 961,25
SetMapSize(Value, FMapHeight);
end;
 
procedure TBackgroundSprite.SetImage(Img: TPictureCollectionItem);
begin
inherited SetImage(Img);
if Assigned(Img) then
begin
FWidth := FMapWidth * Img.Width;
FHeight := FMapHeight * Img.Height;
end
else
begin
FWidth := 0;
FHeight := 0;
end;
end;
 
procedure TBackgroundSprite.SetMapSize(AMapWidth, AMapHeight: Integer);
var I: Integer;
begin
if (FMapWidth <> AMapWidth) or (FMapHeight <> AMapHeight) or (FMap = nil) then
if (FMapWidth<>AMapWidth) or (FMapHeight<>AMapHeight) then
begin
try
if (AMapWidth <= 0) or (AMapHeight <= 0) then
begin
FreeMem(FMap, FMapWidth * FMapHeight * SizeOf(TMapType)); FMap := nil;
AMapWidth := 0;
AMapHeight := 0;
end;
FMapWidth := AMapWidth;
FMapHeight := AMapHeight;
System.ReallocMem(FMap, FMapWidth * FMapHeight * SizeOf(TMapType));
if Assigned(FMap) then
begin
FillChar(FMap^, FMapWidth * FMapHeight * SizeOf(TMapType), 0);
for I := 0 to FMapWidth * FMapHeight - 1 do
PMapType(Integer(FMap) + (I) * SizeOf(TMapType))^.CollisionChip := True;
end
except
FreeMem(FMap, FMapWidth * FMapHeight * SizeOf(TMapType));
FMap := nil;
if (AMapWidth<=0) or (AMapHeight<=0) then
begin
AMapWidth := 0;
AMapHeight := 0;
end;
end
end;
FMapWidth := AMapWidth;
FMapHeight := AMapHeight;
ReAllocMem(FMap, FMapWidth*FMapHeight*SizeOf(Integer));
FillChar(FMap^, FMapWidth*FMapHeight*SizeOf(Integer), 0);
 
procedure TBackgroundSprite.Assign(Source: TPersistent);
begin
if Source is TBackgroundSprite then
begin
FMapWidth := TBackgroundSprite(Source).FMapWidth;
FMapHeight := TBackgroundSprite(Source).FMapHeight;
FTile := TBackgroundSprite(Source).FTile;
ReAllocMem(FCollisionMap, FMapWidth*FMapHeight*SizeOf(Boolean));
FillChar(FCollisionMap^, FMapWidth*FMapHeight*SizeOf(Boolean), 1);
end;
inherited;
end;
 
procedure TBackgroundSprite.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineBinaryProperty('Map', ReadMapData, WriteMapData, FMap <> nil);
end;
 
type
TMapDataHeader = packed record
MapWidth: Integer;
MapHeight: Integer;
end;
 
procedure TBackgroundSprite.ReadMapData(Stream: TStream);
var
Header: TMapDataHeader;
begin
Stream.ReadBuffer(Header, SizeOf(Header));
FMapWidth := Header.MapWidth;
FMapHeight := Header.MapHeight;
SetMapSize(Header.MapWidth, Header.MapHeight);
if Assigned(FMap) and (Header.MapWidth > 0) and (Header.MapHeight > 0) then
begin
Stream.ReadBuffer(FMap^, FMapWidth * FMapHeight * SizeOf(TMapType));
end;
end;
 
procedure TBackgroundSprite.WriteMapData(Stream: TStream);
var
Header: TMapDataHeader;
begin
Header.MapWidth := FMapWidth;
Header.MapHeight := FMapHeight;
Stream.WriteBuffer(Header, SizeOf(Header));
if Assigned(FMap) then
Stream.WriteBuffer(FMap^, FMapWidth * FMapHeight * SizeOf(TMapType));
end;
 
function TBackgroundSprite.GetOverlap(X, Y: Integer): Integer;
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
Result := PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.Overlap
else
Result := 0;
end;
 
procedure TBackgroundSprite.SetOverlap(X, Y: Integer; const Value: Integer);
begin
if (X >= 0) and (X < FMapWidth) and (Y >= 0) and (Y < FMapHeight) then
PMapType(Integer(FMap) + (Y * FMapWidth + X) * SizeOf(TMapType))^.Overlap := Value;
end;
 
function TBackgroundSprite.IsMapEmpty: Boolean;
begin
Result := (FMap = nil) or (FMapWidth <= 0) or (FMapHeight <= 0);
end;
 
{ TSpriteEngine }
 
constructor TSpriteEngine.Create(AParent: TSprite);
1919,203 → 986,18
begin
inherited Create(AParent);
FDeadList := TList.Create;
// group handling
{$IFDEF Ver4Up}
fCurrentSelected := Tlist.create;
GroupCount := 10;
{$ENDIF}
end;
 
destructor TSpriteEngine.Destroy;
begin
// cleanup Group handling
{$IFDEF Ver4Up}
ClearCurrent;
GroupCount := 0;
{$ENDIF}
FDeadList.Free;
inherited Destroy;
{$IFDEF Ver4Up}
fCurrentSelected.free;
{$ENDIF}
end;
 
procedure TSpriteEngine.Collisions;
var
index: Integer;
begin
for index := 0 to Count - 1 do
Items[index].Collision;
end;
{Collisions}
{$IFDEF Ver4Up}
 
procedure TSpriteEngine.GroupSelect(const Area: TRect; Add: Boolean = False);
begin
GroupSelect(Area, [Tsprite], Add);
end; {GroupSelect}
 
procedure TSpriteEngine.GroupSelect(const Area: TRect; Filter: array of TSpriteClass; Add: Boolean = False);
var
index, index2: Integer;
sprite: TSprite;
begin
Assert(length(Filter) <> 0, 'Filter = []');
if not Add then
ClearCurrent;
if length(Filter) = 1 then
begin
for Index := 0 to Count - 1 do
begin
sprite := Items[Index];
if (sprite is Filter[0]) and OverlapRect(sprite.GetBoundsRect, Area) then
sprite.Selected := true;
end
end
else
begin
for Index := 0 to Count - 1 do
begin
sprite := Items[index];
for index2 := 0 to high(Filter) do
if (sprite is Filter[index2]) and OverlapRect(sprite.GetBoundsRect, Area) then
begin
sprite.Selected := true;
break;
end;
end
end;
fObjectsSelected := CurrentSelected.count <> 0;
end; {GroupSelect}
 
function TSpriteEngine.Select(Point: TPoint; Filter: array of TSpriteClass; Add: Boolean = False): Tsprite;
var
index, index2: Integer;
begin
Assert(length(Filter) <> 0, 'Filter = []');
if not Add then
ClearCurrent;
// By searching the Drawlist in reverse
// we select the highest sprite if the sprit is under the point
assert(FDrawList <> nil, 'FDrawList = nil');
if length(Filter) = 1 then
begin
for Index := FDrawList.Count - 1 downto 0 do
begin
Result := FDrawList[Index];
if (Result is Filter[0]) and PointInRect(Point, Result.GetBoundsRect) then
begin
Result.Selected := true;
fObjectsSelected := CurrentSelected.count <> 0;
exit;
end;
end
end
else
begin
for Index := FDrawList.Count - 1 downto 0 do
begin
Result := FDrawList[index];
for index2 := 0 to high(Filter) do
if (Result is Filter[index2]) and PointInRect(Point, Result.GetBoundsRect) then
begin
Result.Selected := true;
fObjectsSelected := CurrentSelected.count <> 0;
exit;
end;
end
end;
Result := nil;
end; {Select}
 
function TSpriteEngine.Select(Point: TPoint; Add: Boolean = False): TSprite;
begin
Result := Select(Point, [Tsprite], Add);
end; {Select}
 
procedure TSpriteEngine.ClearCurrent;
begin
while CurrentSelected.count <> 0 do
TSprite(CurrentSelected[CurrentSelected.count - 1]).Selected := False;
fObjectsSelected := False;
end; {ClearCurrent}
 
procedure TSpriteEngine.ClearGroup(GroupNumber: Integer);
var
index: Integer;
Group: Tlist;
begin
Group := Groups[GroupNumber];
if Group <> nil then
for index := 0 to Group.count - 1 do
TSprite(Group[index]).Selected := False;
end; {ClearGroup}
 
procedure TSpriteEngine.CurrentToGroup(GroupNumber: Integer; Add: Boolean = False);
var
Group: Tlist;
index: Integer;
begin
Group := Groups[GroupNumber];
if Group = nil then
exit;
if not Add then
ClearGroup(GroupNumber);
for index := 0 to Group.count - 1 do
TSprite(Group[index]).GroupNumber := GroupNumber;
end; {CurrentToGroup}
 
procedure TSpriteEngine.GroupToCurrent(GroupNumber: Integer; Add: Boolean = False);
var
Group: Tlist;
index: Integer;
begin
if not Add then
ClearCurrent;
Group := Groups[GroupNumber];
if Group <> nil then
for index := 0 to Group.count - 1 do
TSprite(Group[index]).Selected := true;
end; {GroupToCurrent}
 
function TSpriteEngine.GetGroup(Index: Integer): Tlist;
begin
if (index >= 0) or (index < fGroupCount) then
Result := fGroups[index]
else
Result := nil;
end; {GetGroup}
 
procedure TSpriteEngine.SetGroupCount(AGroupCount: Integer);
var
index: Integer;
begin
if (AGroupCount <> FGroupCount) and (AGroupCount >= 0) then
begin
if FGroupCount > AGroupCount then
begin // remove groups
for index := AGroupCount to FGroupCount - 1 do
begin
ClearGroup(index);
FGroups[index].Free;
end;
SetLength(FGroups, AGroupCount);
end
else
begin // add groups
SetLength(FGroups, AGroupCount);
for index := FGroupCount to AGroupCount - 1 do
FGroups[index] := Tlist.Create;
end;
FGroupCount := Length(FGroups);
end;
end; {SetGroupCount}
{$ENDIF}
 
procedure TSpriteEngine.Dead;
begin
while FDeadList.Count > 0 do
TSprite(FDeadList[FDeadList.Count - 1]).Free;
while FDeadList.Count>0 do
TSprite(FDeadList[FDeadList.Count-1]).Free;
end;
 
procedure TSpriteEngine.Draw;
2127,29 → 1009,24
procedure TSpriteEngine.SetSurface(Value: TDirectDrawSurface);
begin
FSurface := Value;
if FSurface <> nil then
if FSurface<>nil then
begin
FSurfaceRect := Surface.ClientRect;
Width := FSurfaceRect.Right - FSurfaceRect.Left;
Height := FSurfaceRect.Bottom - FSurfaceRect.Top;
Width := FSurfaceRect.Right-FSurfaceRect.Left;
Height := FSurfaceRect.Bottom-FSurfaceRect.Top;
end;
end;
 
{ TCustomDXSpriteEngine }
 
constructor TCustomDXSpriteEngine.Create(AOwner: TComponent);
constructor TCustomDXSpriteEngine.Create(AOnwer: TComponent);
begin
inherited Create(AOwner);
inherited Create(AOnwer);
FEngine := TSpriteEngine.Create(nil);
FEngine.FOwner := Self;
FItems := TSpriteCollection.Create(Self);
FItems.FOwner := Self;
FItems.FOwnerItem := FEngine;
FItems.Initialize(FEngine);
end;
 
destructor TCustomDXSpriteEngine.Destroy;
begin
begin
FEngine.Free;
inherited Destroy;
end;
2158,7 → 1035,7
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (DXDraw = AComponent) then
if (Operation=opRemove) and (DXDraw=AComponent) then
DXDraw := nil;
end;
 
2169,8 → 1046,8
 
procedure TCustomDXSpriteEngine.Draw;
begin
if (FDXDraw <> nil) and (FDXDraw.Initialized) then
FEngine.Draw;
if (FDXDraw<>nil) and (FDXDraw.Initialized) then
FEngine.Draw;
end;
 
procedure TCustomDXSpriteEngine.Move(MoveCount: Integer);
2184,286 → 1061,19
case NotifyType of
dxntDestroying: DXDraw := nil;
dxntInitialize: FEngine.Surface := Sender.Surface;
dxntFinalize: FEngine.Surface := nil;
dxntFinalize : FEngine.Surface := nil;
end;
end;
 
procedure TCustomDXSpriteEngine.SetDXDraw(Value: TCustomDXDraw);
begin
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.UnRegisterNotifyEvent(DXDrawNotifyEvent);
 
FDXDraw := Value;
 
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.RegisterNotifyEvent(DXDrawNotifyEvent);
end;
 
procedure TCustomDXSpriteEngine.SetItems(const Value: TSpriteCollection);
begin
FItems.Assign(Value);
end;
 
procedure TCustomDXSpriteEngine.Clone(const Amount: Word; const BaseNameOfSprite: string);
var
i: Integer;
begin
if Amount = 0 then Exit;
for i := 1 to Amount do
begin
with FItems.Add do
begin
KindSprite := FItems.Find(BaseNameOfSprite).KindSprite;
Sprite.AsSign(FItems.Find(BaseNameOfSprite).Sprite);
{name has to be different}
Name := Format(BaseNameOfSprite + '_%d', [I]); //simple name for sprite like Name_1 etc.
Sprite.Tag := 0; //for sprite you can use Tag property in future as well
end;
end;
end;
 
function TCustomDXSpriteEngine.ForEach(PrefixNameOdSprite: string; var Names: TStringList): Boolean;
var
I: Integer;
begin
if Names = nil then
Names := TStringList.Create;
for I := 0 to Items.Count - 1 do
begin
if PrefixNameOdSprite = '' then
Names.Add(Items[I].Name)
else
{is prefix, fo names like Player????}
if Pos(PrefixNameOdSprite, Items[I].Name) = 1 then
Names.Add(Items[I].Name);
end;
Result := Names.Count > 0;
if not Result then {$IFDEF VER5UP}FreeAndNil(Names){$ELSE}begin Names.Free; names := nil end{$ENDIF};
end;
 
{ TSpriteCollectionItem }
 
function TSpriteCollectionItem.GetSpriteCollection: TSpriteCollection;
begin
Result := Collection as TSpriteCollection;
end;
 
procedure TSpriteCollectionItem.SetSprite(const Value: TSprite);
begin
FSprite.Assign(Value);
end;
 
constructor TSpriteCollectionItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
FOwner := Collection;
FOwnerItem := (Collection as TSpriteCollection).FOwnerItem;
FSpriteType := stSprite;
FSprite := TSprite.Create(FOwnerItem);
end;
 
procedure TSpriteCollectionItem.Assign(Source: TPersistent);
begin
if Source is TSpriteCollectionItem then
begin
Finalize;
FSprite.Assign(TSpriteCollectionItem(Source).FSprite);
inherited Assign(Source);
Initialize;
end
else
inherited;
end;
 
procedure TSpriteCollectionItem.Initialize;
begin
 
end;
 
destructor TSpriteCollectionItem.Destroy;
begin
FSprite.Destroy;
inherited;
end;
 
procedure TSpriteCollectionItem.Finalize;
begin
 
end;
 
procedure TSpriteCollectionItem.SetOnCollision(
const Value: TCollisionEvent);
begin
FSprite.FOnCollision := Value;
end;
 
procedure TSpriteCollectionItem.SetOnDraw(const Value: TDrawEvent);
begin
FSprite.FOnDraw := Value;
end;
 
procedure TSpriteCollectionItem.SetOnMove(const Value: TMoveEvent);
begin
FSprite.FOnMove := Value
end;
 
function TSpriteCollectionItem.GetDisplayName: string;
begin
Result := inherited GetDisplayName
end;
 
procedure TSpriteCollectionItem.SetDisplayName(const Value: string);
begin
if (Value <> '') and (AnsiCompareText(Value, GetDisplayName) <> 0) and
(Collection is TSpriteCollection) and (TSpriteCollection(Collection).IndexOf(Value) >= 0) then
raise Exception.Create(Format(SSpriteDuplicateName, [Value]));
inherited SetDisplayName(Value);
end;
 
function TSpriteCollectionItem.GetSpriteType: TSpriteType;
begin
Result := FSpriteType;
end;
 
procedure TSpriteCollectionItem.SetSpriteType(const Value: TSpriteType);
var
tmpSprite: TSprite;
begin
if Value <> FSpriteType then
begin
case Value of
stSprite: tmpSprite := TSprite.Create(TSpriteEngine(FOwnerItem));
stImageSprite: TImageSprite(tmpSprite) := TImageSprite.Create(TSpriteEngine(FOwnerItem));
{$WARNINGS OFF}
stImageSpriteEx: TImageSpriteEx(tmpSprite) := TImageSpriteEx.Create(TSpriteEngine(FOwnerItem));
{$WARNINGS ON}
stBackgroundSprite: TBackgroundSprite(tmpSprite) := TBackgroundSprite.Create(TSpriteEngine(FOwnerItem));
else
tmpSprite := nil
end;
if Assigned(FSprite) then
try
tmpSprite.Assign(FSprite);
tmpSprite.FOnDraw := FSprite.FOnDraw;
tmpSprite.FOnMove := FSprite.FOnMove;
tmpSprite.FOnCollision := FSprite.FOnCollision;
tmpSprite.FOnGetImage := FSprite.FOnGetImage;
finally
FSprite.Free; FSprite := nil;
end;
FSprite := tmpSprite;
FSpriteType := Value;
end;
end;
 
function TSpriteCollectionItem.GetOnCollision: TCollisionEvent;
begin
Result := FSprite.FOnCollision
end;
 
function TSpriteCollectionItem.GetOnDraw: TDrawEvent;
begin
Result := FSprite.FOnDraw
end;
 
function TSpriteCollectionItem.GetOnMove: TMoveEvent;
begin
Result := FSprite.FOnMove
end;
 
function TSpriteCollectionItem.GetOnGetImage: TGetImage;
begin
Result := FSprite.FOnGetImage;
end;
 
procedure TSpriteCollectionItem.SetOnGetImage(const Value: TGetImage);
begin
FSprite.FOnGetImage := Value;
end;
 
function TSpriteCollectionItem.GetImageList: TCustomDXImageList;
begin
Result := FSprite.FDXImageList;
end;
 
procedure TSpriteCollectionItem.SetImageList(const Value: TCustomDXImageList);
begin
FSprite.FDXImageList := Value;
end;
 
function TSpriteCollectionItem.Clone(NewName: string): TSprite;
var
T: TSpriteCollectionItem;
begin
T := GetSpriteCollection.Add;
T.KindSprite := Self.FSpriteType;
T.Assign(Self);
T.Name := NewName;
Result := T.FSprite;
end;
 
{ TSpriteCollection }
 
function TSpriteCollection.Initialized: Boolean;
begin
Result := FInitializeFlag;
end;
 
constructor TSpriteCollection.Create(AOwner: TPersistent);
begin
inherited Create(TSpriteCollectionItem);
FOwner := AOwner;
FInitializeFlag := Initialize(TSpriteEngine(AOwner));
end;
 
function TSpriteCollection.GetItem(Index: Integer): TSpriteCollectionItem;
begin
Result := TSpriteCollectionItem(inherited Items[Index]);
end;
 
function TSpriteCollection.Initialize(DXSpriteEngine: TSpriteEngine): Boolean;
begin
Result := True;
try
if AsSigned(FOnInitialize) then
FOnInitialize(DXSpriteEngine);
except
Result := False;
end
end;
 
function TSpriteCollection.Find(const Name: string): TSpriteCollectionItem;
var
i: Integer;
begin
i := IndexOf(Name);
if i = -1 then
raise ESpriteCollectionError.CreateFmt(SSpriteNotFound, [Name]);
Result := Items[i];
end;
 
procedure TSpriteCollection.Finalize;
begin
if AsSigned(FOnFinalize) then
FOnFinalize(FOwnerItem);
end;
 
function TSpriteCollection.GetOwner: TPersistent;
begin
Result := FOwner;
end;
 
function TSpriteCollection.Add: TSpriteCollectionItem;
begin
Result := TSpriteCollectionItem(inherited Add);
Result.FOwner := FOwner;
Result.FOwnerItem := FOwnerItem;
end;
 
destructor TSpriteCollection.Destroy;
begin
Finalize;
inherited;
end;
 
end.
/VCL_DELPHIX_D6/DelphiXcfg.inc
1,917 → 1,32
{$B-,J+,Q-,R-,T-,X+}
//*********************************************************************
// Main configuration file for (un)DelphiX
//*********************************************************************
{$IFDEF VER100}
{$DEFINE VER3UP}
{$ENDIF}
{$IFDEF VER120}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$ENDIF}
{$IFDEF VER130}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$ENDIF}
{$IFDEF VER140}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$ENDIF}
{$IFDEF VER150}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$ENDIF}
{$IFDEF VER170}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP} // Delphi 2005
{$ENDIF}
{$IFDEF VER180}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP} // Delphi 2006
{$IFDEF VER185}
{$DEFINE VER11UP} // Delphi 2007
{$ENDIF}
{$ENDIF}
{$IFDEF VER200}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$ENDIF}
{$IFDEF VER210}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$ENDIF}
{$IFDEF VER220}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP} //Delphi XE
{$ENDIF}
 
{$IFDEF VER230}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP} //Delphi XE2
{$ENDIF}
 
{$IFDEF VER240}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP} //Delphi XE3
{$ENDIF}
 
{$IFDEF VER250}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP} //Delphi XE4
{$ENDIF}
 
{$IFDEF VER260}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP} //Delphi XE5
{$ENDIF}
 
{$IFDEF VER270}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP} //Delphi XE6
{$ENDIF}
 
{$IFDEF VER280}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP} //Delphi XE7
{$ENDIF}
 
{$IFDEF VER290}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP} //Delphi XE8
{$ENDIF}
 
{$IFDEF VER300}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP} //Delphi 10 Seattle
{$ENDIF}
 
{$IFDEF VER310}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP}
{$DEFINE VER24UP}//Delphi 10.1 Berlin
{$ENDIF}
 
{$IFDEF VER320}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP}
{$DEFINE VER24UP}
{$DEFINE VER25UP} //Delphi 10.2 Tokyo
{$ENDIF}
 
{$IFDEF VER330}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP}
{$DEFINE VER24UP}
{$DEFINE VER25UP}
{$DEFINE VER26UP} //Delphi 10.3 Rio
{$ENDIF}
 
{$IFDEF VER340}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP}
{$DEFINE VER24UP}
{$DEFINE VER25UP}
{$DEFINE VER26UP}
{$DEFINE VER27UP} //Delphi 10.4 Sydney
{$ENDIF}
 
{$IFDEF VER350}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP}
{$DEFINE VER24UP}
{$DEFINE VER25UP}
{$DEFINE VER26UP}
{$DEFINE VER27UP}
{$DEFINE VER28UP} //Delphi 11 Alexandria
{$ENDIF}
 
{$IFDEF VER360}
{$DEFINE VER3UP}
{$DEFINE VER4UP}
{$DEFINE VER5UP}
{$DEFINE VER6UP}
{$DEFINE VER7UP}
{$DEFINE VER9UP}
{$DEFINE VER10UP}
{$DEFINE VER11UP}
{$DEFINE VER12UP}
{$DEFINE VER14UP}
{$DEFINE VER15UP}
{$DEFINE VER16UP}
{$DEFINE VER17UP}
{$DEFINE VER18UP}
{$DEFINE VER19UP}
{$DEFINE VER20UP}
{$DEFINE VER21UP}
{$DEFINE VER22UP}
{$DEFINE VER23UP}
{$DEFINE VER24UP}
{$DEFINE VER25UP}
{$DEFINE VER26UP}
{$DEFINE VER27UP}
{$DEFINE VER28UP}
{$DEFINE VER29UP}//Delphi 12 Athens
{$ENDIF}
 
{$IFDEF VER100}
// Delphi 3
{$Define D3UP}
{$DEFINE DelphiX_Delphi3}
{$ENDIF}
 
{$IFDEF VER120}
// Delphi 4
{$Define D3UP}
{$Define D4UP}
{$DEFINE DelphiX_Delphi4}
{$ENDIF}
 
{$IFDEF VER130}
// Delphi 5
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$DEFINE DelphiX_Delphi5}
{$ENDIF}
 
{$IFDEF VER140}
// Delphi 6
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$IFDEF DelphiX_Delphi3}
{$DEFINE DelphiX_Spt3}
{$ENDIF}
 
{$IFDEF VER150}
// Delphi 7
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$IFDEF DelphiX_Delphi4}
{$DEFINE DelphiX_Spt3}
{$DEFINE DelphiX_Spt4}
{$ENDIF}
 
{$IFDEF VER170}
// Delphi 9 - 2005
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$IFDEF DelphiX_Delphi5}
{$DEFINE DelphiX_Spt3}
{$DEFINE DelphiX_Spt4}
{$DEFINE DelphiX_Spt5}
{$ENDIF}
 
{$IFDEF VER180}
// Delphi 10 - 2006 or Turbo
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$ENDIF}
 
{$IFDEF VER185}
// Delphi 11 - 2007
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$ENDIF}
 
{$IFDEF VER200}
// Delphi 12 - 2009
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$ENDIF}
 
{$IFDEF VER210}
// Delphi 14 - 2010
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER220}
// Delphi 15 - XE
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER230}
// Delphi 16 - XE2
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER240}
// Delphi 17 - XE3
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER250}
// Delphi 18 - XE4
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER260}
// Delphi 19 - XE5
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER270}
// Delphi 20 - XE6
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER280}
// Delphi 21 - XE7
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER290}
// Delphi 22 - XE8
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER300}
// Delphi 23 - 10 Seattle
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER310}
// Delphi 24 - 10.1 Berlin
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D24UP}
//cannot be made, Berlin version lost older interfaces
//{.$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER320}
// Delphi 25 - 10.2 Tokyo
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D24UP}
{$Define D25UP}
//cannot be made, Berlin version lost older interfaces
//{.$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER330}
// Delphi 26 - 10.3 Rio
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D24UP}
{$Define D25UP}
{$Define D26UP}
//cannot be made, Berlin version lost older interfaces
//{.$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER340}
// Delphi 27 - 10.4 Sydney
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D24UP}
{$Define D25UP}
{$Define D26UP}
{$Define D27UP}
//cannot be made, Berlin version lost older interfaces
//{.$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER350}
// Delphi 28 - 11 Alexandria
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D24UP}
{$Define D25UP}
{$Define D26UP}
{$Define D27UP}
{$Define D28UP}
//cannot be made, Berlin version lost older interfaces
//{.$Define D_EE_UP}
{$ENDIF}
 
{$IFDEF VER360}
// Delphi 29 - 12 Athens
{$Define D3UP}
{$Define D4UP}
{$Define D5UP}
{$Define D6UP}
{$Define D7UP}
{$Define D9UP}
{$Define D10UP}
{$Define D11UP}
{$Define D12UP}
{$Define D14UP}
{$Define D15UP}
{$Define D16UP}
{$Define D17UP}
{$Define D18UP}
{$Define D19UP}
{$Define D20UP}
{$Define D21UP}
{$Define D22UP}
{$Define D23UP}
{$Define D24UP}
{$Define D25UP}
{$Define D26UP}
{$Define D27UP}
{$Define D28UP}
{$Define D29UP}
//cannot be made, Berlin version lost older interfaces
//{.$Define D_EE_UP}
{$ENDIF}
 
{standard feature for drawing blend textures}
{this conditional is add-on as is for eliminate bad color key switching}
{$DEFINE DrawHWAcc}
 
{DirectX Double precision activation}
{$DEFINE DXDOUBLEPRECISION}
 
{when you can use this option, you must use separate headers unit }
{if this turn off, you use built-in standard DirectX.pas unit (in one file)}
{$IFDEF D_EE_UP} //Delphi 2010/XE
{$DEFINE StandardDX}
{$ELSE}
{.$DEFINE StandardDX}
{$ENDIF}
 
{Only one can be set!}
{Use standard of DirectX version 7}
{$IFNDEF D_EE_UP}
{$DEFINE DX7}
{$ELSE}
 
{Use standard of DirectX version 9}
{in concert with StandardDX for separate units only}
{$IFDEF StandardDX}
{$DEFINE DX9}
{$ENDIF}
{$ENDIF}
 
{for better texture compression can be use ZLIB here}
{in some Delphi versions it errors occurred because ZLib package is "lock-like" package}
{I recommend use it for final version application only}
{$IFDEF VER5UP} {Delphi 5 (and lower) has any problems with ZLIB, may be replace by 3rd party lib. manually}
{$DEFINE DXTextureImage_UseZLIB}
{$ENDIF}
{when videotexture is used - like change images in texture}
{Note: it consume 2x more memory because texture is store twice unchanged and}
{changed - this conditional add/remove store shadow image in texture buffer}
{$IFDEF VER5UP} {Delphi 5 (and lower) has any problems with ZLIB, may be replace by 3rd party lib. manually}
{$DEFINE VIDEOTEX}
{$ENDIF}
 
{software rendering based on Hori's DXR code}
{this option is only for remove all DXR code, is not recommended remove it}
{it can be remove only for special usage like use PURE DirectX for SW rendering too}
{$DEFINE DXR_deprecated}
 
{$IfDef DX7}
{Retained mode is turn off for Vista as implicit value}
{When you want use it, you have to add the D3DRM.DLL}
{is recommended put library into Windows/System32 system directory}
{in application directory does not works properly under Vista}
{$Define D3D_deprecated} //both must be turn-on
{.$Define D3DRM} //required D3DRM.DLL !!
{for separete unit is DirectRM.pas required !! - it is not include in Delphi 2010/XE !!}
{this class is deprecated; when you can it use, remove dot bellow}
{this add additional component for D3D over DXDraw}
{$IFDEF D3DRM}
{$Define DX3D_deprecated}
{$ENDIF}
 
{$ELSE}
{$Define D3D_deprecated}
{$EndIf}
 
{$IFDEF VER12UP}
{PNG support is added in Delphi 2009 and up as native feature}
{there is turn on, it is for backward compatibility only}
{$DEFINE PNG_GRAPHICS}
{$ELSE}
{for Delphi 2007 and lower when you usen PNG support, you have write}
{name of PNG package into required section of pavkage source .dpk}
{and turn on this support here - remove the dot only bellow}
{.$DEFINE PNG_GRAPHICS}
{$ENDIF}
 
{special feature for enumerate displayis like primary, secondary etc.}
{only for special purpose, multimonitors etc.}
{.$DEFINE _DMO_}
 
{When you need DirectPlay, please remove this definition. It is not enabled by default, because}
{DirectPlay is not shipped with Windows by default, and the user might receive a warning}
{that the app might not work if DirectPlay is not installed.}
{.$Define UseDirectPlay}
/VCL_DELPHIX_D6/DXDraws.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXConsts.pas
22,7 → 22,7
SSession = 'Session';
 
SNotMade = '%s not made';
SStreamNotOpend = 'Stream not opened';
SStreamNotOpend = 'Stream not opend';
SWaveStreamNotSet = 'WaveStream not set';
SCannotMade = '%s cannot be made';
SCannotInitialized = '%s cannot be initialized';
29,7 → 29,7
SCannotChanged = '%s cannot be changed';
SCannotLock = '%s cannot be locked';
SCannotOpened = '%s cannot be opened';
SDLLNotLoaded = '%s is not loaded';
SDLLNotLoaded = '%s not loaded';
SImageNotFound = 'Image ''%s'' not found';
SWaveNotFound = 'Wave ''%s'' not found';
SEffectNotFound = 'Effect ''%s'' not found';
36,32 → 36,32
SListIndexError = 'Index of the list exceeds the range. (%d)';
SScanline = 'Index of the scanning line exceeded the range. (%d)';
SNoForm = 'Form not found';
SSinceDirectX5 = 'Requires DirectX 5.0 or later';
SSinceDirectX6 = 'Requires DirectX 6.0 or later';
SSinceDirectX7 = 'Requires DirectX 7.0 or later';
SSinceDirectX5 = 'Necessary since DirectX 5';
SSinceDirectX6 = 'Necessary since DirectX 6';
SSinceDirectX7 = 'Necessary since DirectX 7';
S3DDeviceNotFound = '3D device not found';
SDisplayModeChange = 'Display mode cannot be changed (%dx%d %dbit)';
SDisplayModeCannotAcquired = 'Display mode cannot be acquired';
SDisplayModeCannotAcquired = 'A present display mode cannot be acquired';
SInvalidDIB = 'DIB is invalid';
SInvalidDIBBitCount = 'Bitcount in invalid (%d)';
SInvalidDIBPixelFormat = 'PixelFormat in invalid';
SInvalidWave = 'Wave is invalid';
SInvalidDisplayBitCount = 'Display requires 8, 16, 24 or 32 bits';
SInvalidDisplayBitCount = 'It should be either of 8 or 16 or 24 or 32';
SInvalidWaveFormat = 'Format is invalid';
SNotSupported = '%s not supported';
SStreamOpend = 'Stream is already open';
SNecessaryDirectInputUseMouse = 'DirectInput is required for mouse support';
SStreamOpend = 'Stream has already been opened';
SNecessaryDirectInputUseMouse = 'DirectInput is necessary to use the mouse';
 
{ DirectPlay }
SDXPlayNotConnectedNow = 'TDXPlay component is disconnected.';
SDXPlayNotConnectedNow = 'TDXPlay component is not connected now.';
SDXPlayProviderNotFound = 'Provider ''%s'' not found';
SDXPlayProviderSpecifiedGUIDNotFound = 'Provider''s specified GUID is not found';
SDXPlayProviderSpecifiedGUIDNotFound = 'Provider of specified GUID is not found';
SDXPlayModemListCannotBeAcquired = 'Modem list cannot be acquired';
SDXPlaySessionListCannotBeAcquired = 'Session list cannot be acquired';
SDXPlaySessionNotFound = 'Session ''%s'' not found';
SDXPlaySessionCannotOpened = 'Session %s cannot be opened';
SDXPlayPlayerNotFound = 'Player''s specified ID is not found';
SDXPlayMessageIllegal = 'Illegal message form';
SDXPlayPlayerNotFound = 'The player of specified ID is not found';
SDXPlayMessageIllegal = 'The message form is illegal';
SDXPlayPlayerNameIsNotSpecified = 'Player name is not specified';
SDXPlaySessionNameIsNotSpecified = 'Session name is not specified';
 
69,10 → 69,11
DXPlayFormComplete = 'Complete';
 
 
SNotSupportGraphicFile = 'Graphic format not suported';
SInvalidDXTFile = 'DXT file is invalid';
SCannotLoadGraphic = 'Can not load graphic';
SOverlay = 'Surface overlay not possible';
SNotSupportGraphicFile = 'This format graphic not suported';
SInvalidDXTFile = 'This DXT file is invalid';
SCannotLoadGraphic = 'Can''t Load this Graphic';
SOverlay = 'Not posible Overlay Surface';
 
const
SDIBSize = '(%dx%d)';
/VCL_DELPHIX_D6/DXDraws.pas
1,97 → 1,5
(*******************************************************************************
EXTEND UNIT DXDRAWS FROM DELPHIX PACK
unit DXDraws;
 
* Copyright (c) 2004-2010 Jaro Benes
* All Rights Reserved
* Version 1.09
* D2D Hardware module
* web site: www.micrel.cz/Dx
* e-mail: delphix_d2d@micrel.cz
 
* Enhanced by User137
 
* DISCLAIMER:
This software is provided "as is" and is without warranty of any kind.
The author of this software does not warrant, guarantee or make any
representations regarding the use or results of use of this software
in terms of reliability, accuracy or fitness for purpose. You assume
the entire risk of direct or indirect, consequential or inconsequential
results from the correct or incorrect usage of this software even if the
author has been informed of the possibilities of such damage. Neither
the author nor anybody connected to this software in any way can assume
any responsibility.
 
Tested in Delphi 4, 5, 6, 7 and Delphi 2005/2006/2007/2009/2010
 
* FEATURES:
a) Implement Hardware acceleration for critical function like DrawAlpha {Blend},
DrawSub and DrawAdd for both way DXIMAGELIST and DIRECTDRAWSURFACE with rotation too.
b) Automatic adjustement for texture size different 2^n.
c) Minimum current source code change, all accelerated code added into:
DXDraw.BeginScene;
//code here
DXDraw.EndScene;
d) DelphiX facade continues using still.
 
* HOW TO USE
a) Design code like as DelphiX and drawing routine put into
DXDraw.BeginScene;
//code here
DXDraw.EndScene;
b) setup options in code or property for turn-on acceleration like:
DXDraw.Finalize; {done DXDraw}
If HardwareSwitch Then
{hardware}
Begin
if NOT (doDirectX7Mode in DXDraw.Options) then
DXDraw.Options := DXDraw.Options + [doDirectX7Mode];
if NOT (doHardware in DXDraw.Options) then
DXDraw.Options := DXDraw.Options + [doHardware];
if NOT (do3D in DXDraw.Options) then
DXDraw.Options := DXDraw.Options + [do3D];
if doSystemMemory in DXDraw.Options then
DXDraw.Options := DXDraw.Options - [doSystemMemory];
End
Else
{software}
Begin
if doDirectX7Mode in DXDraw.Options then
DXDraw.Options := DXDraw.Options - [doDirectX7Mode];
if do3D in DXDraw.Options then
DXDraw.Options := DXDraw.Options - [do3D];
if doHardware in DXDraw.Options then
DXDraw.Options := DXDraw.Options - [doHardware];
if NOT (doSystemMemory in DXDraw.Options) then
DXDraw.Options := DXDraw.Options + [doSystemMemory];
End;
{to fullscreen}
if doFullScreen in DXDraw.Options then
begin
RestoreWindow;
DXDraw.Cursor := crDefault;
BorderStyle := bsSingle;
DXDraw.Options := DXDraw.Options - [doFullScreen];
DXDraw.Options := DXDraw.Options + [doFlip];
end else
begin
StoreWindow;
DXDraw.Cursor := crNone;
BorderStyle := bsNone;
DXDraw.Options := DXDraw.Options + [doFullScreen];
DXDraw.Options := DXDraw.Options - [doFlip];
end;
DXDraw1.Initialize; {up DXDraw now}
 
* NOTE Main form has to declare like:
TForm1 = class(TDXForm)
 
* KNOWN BUGS OR RESTRICTION:
1/ Cannot be use DirectDrawSurface other from DXDraw.Surface in HW mode.
2/ New functions was not tested for two and more DXDraws on form. Sorry.
 
******************************************************************************)
unit DXDraws;
 
interface
 
{$INCLUDE DelphiXcfg.inc}
98,56 → 6,10
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
{$IFDEF VER14UP}
DXTypes,
{$ENDIF}
{$IFDEF VER17UP}System.Types, System.UITypes,{$ENDIF}
{$IFDEF DXTextureImage_UseZLIB}
ZLIB,
{$ENDIF}
DXClass, DIB,
{$IFDEF StandardDX}
DirectDraw, DirectSound,
{$IFDEF DX7}
{$IFDEF D3DRM}
Direct3DRM,
{$ENDIF}
Direct3D;
{$ENDIF}
{$IFDEF DX9}
Direct3D9, Direct3D, D3DX9, {Direct3D8,} DX7toDX8;
{$ENDIF}
{$ELSE}
DirectX;
{$ENDIF}
DXClass, DIB, DXTexImg, DirectX;
 
const
maxTexBlock = 2048; {maximum textures}
maxVideoBlockSize: Integer = 2048; {maximum size block of one texture}
SurfaceDivWidth: Integer = 2048;
SurfaceDivHeight: Integer = 2048;
{This conditional is for force set square texture when use it alphachannel from DIB32}
{$DEFINE FORCE_SQUARE}
DXTextureImageGroupType_Normal = 0; // Normal group
DXTextureImageGroupType_Mipmap = 1; // Mipmap group
 
Alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ"at 0123456789<>=()-''!_+\/{}^&%.=$#ÅÖÄ?*';
PowerAlphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`1234567890-=~!@#$%^&*()_+[];'',./\{}:"<>?|©®™ ';
ccDefaultSpecular = $FFFFFFFF;
 
ZeroRect: TRect = (Left: 0; Top: 0; Right: 0; Bottom: 0);
 
type
 
{ TRenderType }
 
TRenderType = (rtDraw, rtBlend, rtAdd, rtSub);
 
{ TRenderMirrorFlip }
 
TRenderMirrorFlip = (rmfMirror, rmfFlip);
TRenderMirrorFlipSet = set of TRenderMirrorFlip;
 
{ EDirectDrawError }
 
EDirectDrawError = class(EDirectXError);
163,10 → 25,8
 
TDirectDraw = class(TDirectX)
private
{$IFDEF D3D_deprecated}
FIDDraw: IDirectDraw;
FIDDraw4: IDirectDraw4;
{$ENDIF}
FIDDraw7: IDirectDraw7;
FDriverCaps: TDDCaps;
FHELCaps: TDDCaps;
175,16 → 35,12
FSurfaces: TList;
function GetClipper(Index: Integer): TDirectDrawClipper;
function GetClipperCount: Integer;
function GetDisplayMode: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
{$IFDEF D3D_deprecated}
function GetDisplayMode: TDDSurfaceDesc;
function GetIDDraw: IDirectDraw;
function GetIDDraw4: IDirectDraw4;
{$ENDIF}
function GetIDDraw7: IDirectDraw7;
{$IFDEF D3D_deprecated}
function GetIDraw: IDirectDraw;
function GetIDraw4: IDirectDraw4;
{$ENDIF}
function GetIDraw7: IDirectDraw7;
function GetPalette(Index: Integer): TDirectDrawPalette;
function GetPaletteCount: Integer;
195,21 → 51,16
constructor CreateEx(GUID: PGUID; DirectX7Mode: Boolean);
destructor Destroy; override;
class function Drivers: TDirectXDrivers;
{$IFDEF _DMO_}class function DriversEx: TDirectXDriversEx;{$ENDIF}
property ClipperCount: Integer read GetClipperCount;
property Clippers[Index: Integer]: TDirectDrawClipper read GetClipper;
property DisplayMode: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF} read GetDisplayMode;
property DisplayMode: TDDSurfaceDesc read GetDisplayMode;
property DriverCaps: TDDCaps read FDriverCaps;
property HELCaps: TDDCaps read FHELCaps;
{$IFDEF D3D_deprecated}
property IDDraw: IDirectDraw read GetIDDraw;
property IDDraw4: IDirectDraw4 read GetIDDraw4;
{$ENDIF}
property IDDraw7: IDirectDraw7 read GetIDDraw7;
{$IFDEF D3D_deprecated}
property IDraw: IDirectDraw read GetIDraw;
property IDraw4: IDirectDraw4 read GetIDraw4;
{$ENDIF}
property IDraw7: IDirectDraw7 read GetIDraw7;
property PaletteCount: Integer read GetPaletteCount;
property Palettes[Index: Integer]: TDirectDrawPalette read GetPalette;
276,7 → 127,7
destructor Destroy; override;
procedure Release;
end;
 
{ TDirectDrawSurface }
 
TDirectDrawSurface = class(TDirectX)
284,63 → 135,35
FCanvas: TDirectDrawSurfaceCanvas;
FHasClipper: Boolean;
FDDraw: TDirectDraw;
{$IFDEF D3D_deprecated}
FIDDSurface: IDirectDrawSurface;
FIDDSurface4: IDirectDrawSurface4;
{$ENDIF}
FIDDSurface7: IDirectDrawSurface7;
FSystemMemory: Boolean;
FStretchDrawClipper: IDirectDrawClipper;
FSurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
FSurfaceDesc: TDDSurfaceDesc;
FGammaControl: IDirectDrawGammaControl;
FLockSurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
FLockSurfaceDesc: TDDSurfaceDesc;
FLockCount: Integer;
FIsLocked: Boolean;
FModified: Boolean;
FCaption: TCaption;
DIB_COLMATCH: TDIB;
function GetBitCount: Integer;
function GetCanvas: TDirectDrawSurfaceCanvas;
function GetClientRect: TRect;
function GetHeight: Integer;
{$IFDEF D3D_deprecated}
function GetIDDSurface: IDirectDrawSurface; {$IFDEF VER9UP}inline;{$ENDIF}
function GetIDDSurface4: IDirectDrawSurface4; {$IFDEF VER9UP}inline;{$ENDIF}
{$ENDIF}
function GetIDDSurface7: IDirectDrawSurface7; {$IFDEF VER9UP}inline;{$ENDIF}
{$IFDEF D3D_deprecated}
function GetIDDSurface: IDirectDrawSurface;
function GetIDDSurface4: IDirectDrawSurface4;
function GetIDDSurface7: IDirectDrawSurface7;
function GetISurface: IDirectDrawSurface;
function GetISurface4: IDirectDrawSurface4;
{$ENDIF}
function GetISurface7: IDirectDrawSurface7;
function GetPixel(X, Y: Integer): Longint;
function GetWidth: Integer;
procedure SetClipper(Value: TDirectDrawClipper);
procedure SetColorKey(Flags: DWORD; const Value: TDDColorKey);
{$IFDEF D3D_deprecated}
procedure SetIDDSurface(Value: IDirectDrawSurface);
procedure SetIDDSurface4(Value: IDirectDrawSurface4);
{$ENDIF}
procedure SetIDDSurface7(Value: IDirectDrawSurface7);
procedure SetPalette(Value: TDirectDrawPalette);
procedure SetPixel(X, Y: Integer; Value: Longint);
procedure SetTransparentColor(Col: Longint);
{support RGB routines}
procedure LoadRGB(Color: cardinal; var R, G, B: Byte);
function SaveRGB(const R, G, B: Byte): cardinal;
{asm routine for direct surface by pixel}
{no clipping}
function GetPixel16(x, y: Integer): Integer; register;
function GetPixel24(x, y: Integer): Integer; register;
function GetPixel32(x, y: Integer): Integer; register;
function GetPixel8(x, y: Integer): Integer; register;
procedure PutPixel16(x, y, color: Integer); register;
procedure PutPixel24(x, y, color: Integer); register;
procedure PutPixel32(x, y, color: Integer); register;
procedure PutPixel8(x, y, color: Integer); register;
{routines calls asm pixel routine}
function Peek(X, Y: Integer): LongInt; {$IFDEF VER9UP} inline; {$ENDIF}
procedure Poke(X, Y: Integer; const Value: LongInt); {$IFDEF VER9UP} inline; {$ENDIF}
public
constructor Create(ADirectDraw: TDirectDraw);
destructor Destroy; override;
347,123 → 170,62
procedure Assign(Source: TPersistent); override;
procedure AssignTo(Dest: TPersistent); override;
function Blt(const DestRect, SrcRect: TRect; Flags: DWORD;
const DF: TDDBltFX; Source: TDirectDrawSurface): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
const DF: TDDBltFX; Source: TDirectDrawSurface): Boolean;
function BltFast(X, Y: Integer; const SrcRect: TRect;
Flags: DWORD; Source: TDirectDrawSurface): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function ColorMatch(Col: TColor): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
{$IFDEF VER4UP}
{$IFDEF D3D_deprecated}
function CreateSurface(SurfaceDesc: TDDSurfaceDesc): Boolean; overload;
{$ENDIF}
function CreateSurface(SurfaceDesc: TDDSurfaceDesc2): Boolean; overload;
{$ELSE}
function CreateSurface(SurfaceDesc: TDDSurfaceDesc): Boolean;
{$ENDIF}
 
procedure MirrorFlip(Value: TRenderMirrorFlipSet);
 
{$IFDEF VER4UP}
procedure Draw(X, Y: Integer; SrcRect: TRect; Source: TDirectDrawSurface; Transparent: Boolean = True); overload;
procedure Draw(X, Y: Integer; Source: TDirectDrawSurface; Transparent: Boolean = True); overload;
Flags: DWORD; Source: TDirectDrawSurface): Boolean;
function ColorMatch(Col: TColor): Integer;
{$IFDEF DelphiX_Spt4}
function CreateSurface(const SurfaceDesc: TDDSurfaceDesc): Boolean; overload;
function CreateSurface(const SurfaceDesc: TDDSurfaceDesc2): Boolean; overload;
{$ELSE}
function CreateSurface(const SurfaceDesc: TDDSurfaceDesc): Boolean;
{$ENDIF}
{$IFDEF DelphiX_Spt4}
procedure Draw(X, Y: Integer; SrcRect: TRect; Source: TDirectDrawSurface; Transparent: Boolean=True); overload;
procedure Draw(X, Y: Integer; Source: TDirectDrawSurface; Transparent: Boolean=True); overload;
procedure StretchDraw(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean = True); overload;
Transparent: Boolean=True); overload;
procedure StretchDraw(const DestRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean = True); overload;
{$ELSE}
Transparent: Boolean=True); overload;
{$ELSE}
procedure Draw(X, Y: Integer; SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean);
procedure StretchDraw(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean);
{$ENDIF}
{$ENDIF}
procedure DrawAdd(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
Transparent: Boolean; Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawAlpha(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
procedure DrawSub(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
 
procedure DrawAddCol(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Color, Alpha: Integer);
procedure DrawAlphaCol(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Color, Alpha: Integer);
procedure DrawSubCol(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Color, Alpha: Integer);
 
{Rotate}
Transparent: Boolean; Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawRotate(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single);
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Integer);
procedure DrawRotateAdd(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Integer;
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawRotateAlpha(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Integer;
Alpha: Integer);
procedure DrawRotateSub(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
 
procedure DrawRotateAddCol(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; CenterX,
CenterY: Double; Transparent: Boolean; Angle: Single; Color: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawRotateAlphaCol(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; CenterX,
CenterY: Double; Transparent: Boolean; Angle: Single; Color: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawRotateCol(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double;
Transparent: Boolean; Angle: Single; Color: Integer);
procedure DrawRotateSubCol(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; CenterX,
CenterY: Double; Transparent: Boolean; Angle: Single; Color: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{WaveX}
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Integer;
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawWaveX(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer);
procedure DrawWaveXAdd(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawWaveXAlpha(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
Alpha: Integer);
procedure DrawWaveXSub(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{WaveY}
procedure DrawWaveY(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer);
procedure DrawWaveYAdd(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawWaveYAlpha(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawWaveYSub(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{Poke function}
procedure PokeLine(X1, Y1, X2, Y2: Integer; Color: cardinal); {$IFDEF VER9UP} inline; {$ENDIF}
procedure PokeLinePolar(x, y: Integer; angle, length: extended;
Color: cardinal); {$IFDEF VER9UP} inline; {$ENDIF}
procedure PokeBox(xs, ys, xd, yd: Integer; Color: cardinal);
procedure PokeBlendPixel(const X, Y: Integer; aColor: cardinal;
Alpha: byte);
procedure PokeWuLine(X1, Y1, X2, Y2, aColor: Integer);
procedure Noise(Oblast: TRect; Density: Byte);
procedure Blur;
procedure DoRotate(cent1, cent2, angle: Integer; coord1, coord2: Real;
color: word);
procedure PokeCircle(X, Y, Radius, Color: Integer);
procedure PokeEllipse(exc, eyc, ea, eb, angle, color: Integer);
procedure PokeFilledEllipse(exc, eyc, ea, eb, color: Integer);
procedure PokeVLine(x, y1, y2: Integer; Color: cardinal);
{Fill}
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure Fill(DevColor: Longint);
procedure FillRect(const Rect: TRect; DevColor: Longint);
procedure FillRectAdd(const DestRect: TRect; Color: TColor; Alpha: Byte{$IFDEF VER4UP} = 128{$ENDIF});
procedure FillRectAdd(const DestRect: TRect; Color: TColor);
procedure FillRectAlpha(const DestRect: TRect; Color: TColor; Alpha: Integer);
procedure FillRectSub(const DestRect: TRect; Color: TColor; Alpha: Byte{$IFDEF VER4UP} = 128{$ENDIF});
{Load}
procedure FillRectSub(const DestRect: TRect; Color: TColor);
procedure LoadFromDIB(DIB: TDIB);
procedure LoadFromDIBRect(DIB: TDIB; AWidth, AHeight: Integer; const SrcRect: TRect);
procedure LoadFromGraphic(Graphic: TGraphic);
470,19 → 232,15
procedure LoadFromGraphicRect(Graphic: TGraphic; AWidth, AHeight: Integer; const SrcRect: TRect);
procedure LoadFromFile(const FileName: string);
procedure LoadFromStream(Stream: TStream);
{$IFDEF VER4UP}
function Lock(const Rect: TRect; var SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF}): Boolean; overload;
function Lock(var SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF}): Boolean; overload;
function Lock: Boolean; overload;
{$ELSE}
function LockSurface: Boolean;
{$IFDEF DelphiX_Spt4}
function Lock(const Rect: TRect; var SurfaceDesc: TDDSurfaceDesc): Boolean; overload;
function Lock(var SurfaceDesc: TDDSurfaceDesc): Boolean; overload;
{$ELSE}
function Lock(const Rect: TRect; var SurfaceDesc: TDDSurfaceDesc): Boolean;
{$ENDIF}
{$ENDIF}
procedure UnLock;
function Restore: Boolean;
property IsLocked: Boolean read FIsLocked;
procedure SetSize(AWidth, AHeight: Integer);
property Modified: Boolean read FModified write FModified;
property BitCount: Integer read GetBitCount;
property Canvas: TDirectDrawSurfaceCanvas read GetCanvas;
property ClientRect: TRect read GetClientRect;
491,24 → 249,18
property DDraw: TDirectDraw read FDDraw;
property GammaControl: IDirectDrawGammaControl read FGammaControl;
property Height: Integer read GetHeight;
{$IFDEF D3D_deprecated}
property IDDSurface: IDirectDrawSurface read GetIDDSurface write SetIDDSurface;
property IDDSurface4: IDirectDrawSurface4 read GetIDDSurface4 write SetIDDSurface4;
{$ENDIF}
property IDDSurface7: IDirectDrawSurface7 read GetIDDSurface7 write SetIDDSurface7;
{$IFDEF D3D_deprecated}
property ISurface: IDirectDrawSurface read GetISurface;
property ISurface4: IDirectDrawSurface4 read GetISurface4;
{$ENDIF}
property ISurface7: IDirectDrawSurface7 read GetISurface7;
property Palette: TDirectDrawPalette write SetPalette;
property Pixels[X, Y: Integer]: Longint read GetPixel write SetPixel;
property Pixel[X, Y: Integer]: LongInt read Peek write Poke;
property SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF} read FSurfaceDesc;
property SurfaceDesc: TDDSurfaceDesc read FSurfaceDesc;
property SystemMemory: Boolean read FSystemMemory write FSystemMemory;
property TransparentColor: Longint write SetTransparentColor;
property Width: Integer read GetWidth;
property Caption: TCaption read FCaption write FCaption;
end;
 
{ TDXDrawDisplay }
545,7 → 297,7
procedure SetBitCount(Value: Integer);
procedure SetHeight(Value: Integer);
procedure SetWidth(Value: Integer);
function SetSize(AWidth, AHeight, ABitCount{$IFNDEF D3D_deprecated}, ARefreshRate, AFlags{$ENDIF}: Integer): Boolean;
function SetSize(AWidth, AHeight, ABitCount: Integer): Boolean;
function DynSetSize(AWidth, AHeight, ABitCount: Integer): Boolean;
public
constructor Create(ADXDraw: TCustomDXDraw);
556,7 → 308,7
property Mode: TDXDrawDisplayMode read GetMode;
property Modes[Index: Integer]: TDXDrawDisplayMode read GetMode2; default;
published
property BitCount: Integer read FBitCount write SetBitCount default 16;
property BitCount: Integer read FBitCount write SetBitCount default 8;
property FixedBitCount: Boolean read FFixedBitCount write FFixedBitCount;
property FixedRatio: Boolean read FFixedRatio write FFixedRatio;
property FixedSize: Boolean read FFixedSize write FFixedSize;
571,23 → 323,11
 
EDXDrawError = class(Exception);
 
{ TD2D HW acceleration}
 
TD2D = class;
 
{ TTracerCollection }
 
TTraces = class;
 
{ TCustomDXDraw }
 
TD2DTextureFilter = (D2D_POINT, D2D_LINEAR, D2D_FLATCUBIC, D2D_GAUSSIANCUBIC, D2D_ANISOTROPIC);
 
 
TDXDrawOption = (doFullScreen, doNoWindowChange, doAllowReboot, doWaitVBlank,
doAllowPalette256, doSystemMemory, doStretch, doCenter, doFlip,
{$IFDEF D3D_deprecated}do3D, doDirectX7Mode,{$ENDIF} {$IFDEF D3DRM} doRetainedMode,{$ENDIF}
doHardware, doSelectDriver, doZBuffer);
do3D, doDirectX7Mode, doRetainedMode, doHardware, doSelectDriver, doZBuffer);
 
TDXDrawOptions = set of TDXDrawOption;
 
596,16 → 336,6
 
TDXDrawNotifyEvent = procedure(Sender: TCustomDXDraw; NotifyType: TDXDrawNotifyType) of object;
 
TD2DTextures = class;
TOnUpdateTextures = procedure(const Sender: TD2DTextures; var Changed: Boolean) of object;
 
TPictureCollectionItem = class;
 
{$IFNDEF D3D_deprecated}
TD3DDeviceType = (dtTnLHAL, dtHAL,dtMMX,dtRGB,dtRamp,dtRef);
TD3DDeviceTypeSet = Set of TD3DDeviceType;
{$ENDIF}
 
TCustomDXDraw = class(TCustomControl)
private
FAutoInitialize: Boolean;
634,9 → 364,6
FDriverGUID: TGUID;
FDDraw: TDirectDraw;
FDisplay: TDXDrawDisplay;
{$IFNDEF D3D_deprecated}
FDeviceTypeSet: TD3DDeviceTypeSet;{$ENDIF}
{$IFDEF _DMO_}FAdapters: TDirectXDriversEx;{$ENDIF}
FClipper: TDirectDrawClipper;
FPalette: TDirectDrawPalette;
FPrimary: TDirectDrawSurface;
644,19 → 371,14
FSurfaceWidth: Integer;
FSurfaceHeight: Integer;
{ Direct3D }
{$IFDEF D3D_deprecated}
FD3D: IDirect3D;
FD3D2: IDirect3D2;
FD3D3: IDirect3D3;
{$ENDIF}
FD3D7: IDirect3D7;
{$IFDEF D3D_deprecated}
FD3DDevice: IDirect3DDevice;
FD3DDevice2: IDirect3DDevice2;
FD3DDevice3: IDirect3DDevice3;
{$ENDIF}
FD3DDevice7: IDirect3DDevice7;
{$IFDEF D3DRM}
FD3DRM: IDirect3DRM;
FD3DRM2: IDirect3DRM2;
FD3DRM3: IDirect3DRM3;
666,18 → 388,14
FCamera: IDirect3DRMFrame;
FScene: IDirect3DRMFrame;
FViewport: IDirect3DRMViewport;
{$ENDIF}
FZBuffer: TDirectDrawSurface;
FD2D: TD2D;
FOnUpdateTextures: TOnUpdateTextures;
FTraces: TTraces;
FOnRender: TNotifyEvent;
procedure FormWndProc(var Message: TMessage; DefWindowProc: TWndMethod);
function GetCanDraw: Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function GetCanDraw: Boolean;
function GetCanPaletteAnimation: Boolean;
function GetSurfaceHeight: Integer;
function GetSurfaceWidth: Integer;
procedure NotifyEventList(NotifyType: TDXDrawNotifyType);
procedure SetAutoSize(Value: Boolean);
procedure SetColorTable(const ColorTable: TRGBQuads);
procedure SetCooperativeLevel;
procedure SetDisplay(Value: TDXDrawDisplay);
687,11 → 405,6
procedure SetSurfaceWidth(Value: Integer);
function TryRestore: Boolean;
procedure WMCreate(var Message: TMessage); message WM_CREATE;
function Fade2Color(colorfrom, colorto: Integer): LongInt;
function Grey2Fade(shadefrom, shadeto: Integer): Integer;
procedure SetTraces(const Value: TTraces);
function CheckD3: Boolean;
function CheckD3D(Dest: TDirectDrawSurface): Boolean;
protected
procedure DoFinalize; virtual;
procedure DoFinalizeSurface; virtual;
703,68 → 416,38
procedure Paint; override;
function PaletteChanged(Foreground: Boolean): Boolean; override;
procedure SetParent(AParent: TWinControl); override;
procedure SetAutoSize(Value: Boolean); {$IFDEF D6UP} override; {$ENDIF}
property OnUpdateTextures: TOnUpdateTextures read FOnUpdateTextures write FOnUpdateTextures;
property OnRender: TNotifyEvent read FOnRender write FOnRender;
public
ColorTable: TRGBQuads;
DefColorTable: TRGBQuads;
//
function Fade2Black(colorfrom: Integer): Longint;
function Fade2White(colorfrom: Integer): Longint;
//
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
class function Drivers: TDirectXDrivers;
{$IFDEF _DMO_}class function DriversEx: TDirectXDriversEx;{$ENDIF}
procedure Finalize;
procedure Flip;
procedure Initialize;
procedure Render(LagCount: Integer{$IFDEF VER4UP} = 0{$ENDIF});
procedure Render;
procedure Restore;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
procedure SetSize(ASurfaceWidth, ASurfaceHeight: Integer);
procedure BeginScene;
procedure EndScene;
procedure TextureFilter(Grade: TD2DTextureFilter);
procedure AntialiasFilter(Grade: TD3DAntialiasMode);
procedure MirrorFlip(Value: TRenderMirrorFlipSet);
procedure SaveTextures(path: string);
procedure ClearStack;
procedure UpdateTextures;
{grab images}
procedure PasteImage(sdib: TDIB; x, y: Integer);
procedure GrabImage(iX, iY, iWidth, iHeight: Integer; ddib: TDIB);
{fades}
function Black2Screen(oldcolor: Integer): Longint;
function Fade2Screen(oldcolor, newcolour: Integer): LongInt;
function White2Screen(oldcolor: Integer): LongInt;
function FadeGrey2Screen(oldcolor, newcolour: LongInt): LongInt;
procedure UpdatePalette;
procedure RegisterNotifyEvent(NotifyEvent: TDXDrawNotifyEvent);
procedure UnRegisterNotifyEvent(NotifyEvent: TDXDrawNotifyEvent);
 
property AutoInitialize: Boolean read FAutoInitialize write FAutoInitialize;
property AutoSize: Boolean read FAutoSize write SetAutoSize;
{$IFDEF D3DRM}property Camera: IDirect3DRMFrame read FCamera; {$ENDIF}
property Camera: IDirect3DRMFrame read FCamera;
property CanDraw: Boolean read GetCanDraw;
property CanPaletteAnimation: Boolean read GetCanPaletteAnimation;
property Clipper: TDirectDrawClipper read FClipper;
property Color;
{$IFDEF D3D_deprecated}
property D3D: IDirect3D read FD3D;
property D3D2: IDirect3D2 read FD3D2;
property D3D3: IDirect3D3 read FD3D3;
{$ENDIF}
property D3D7: IDirect3D7 read FD3D7;
{$IFDEF D3D_deprecated}
property D3DDevice: IDirect3DDevice read FD3DDevice;
property D3DDevice2: IDirect3DDevice2 read FD3DDevice2;
property D3DDevice3: IDirect3DDevice3 read FD3DDevice3;
{$ENDIF}
property D3DDevice7: IDirect3DDevice7 read FD3DDevice7;
{$IFNDEF D3D_deprecated}
property D3DDeviceTypeSet: TD3DDeviceTypeSet read FDeviceTypeSet;{$ENDIF}
{$IFDEF D3DRM}
property D3DRM: IDirect3DRM read FD3DRM;
property D3DRM2: IDirect3DRM2 read FD3DRM2;
property D3DRM3: IDirect3DRM3 read FD3DRM3;
771,10 → 454,8
property D3DRMDevice: IDirect3DRMDevice read FD3DRMDevice;
property D3DRMDevice2: IDirect3DRMDevice2 read FD3DRMDevice2;
property D3DRMDevice3: IDirect3DRMDevice3 read FD3DRMDevice3;
{$ENDIF}
property DDraw: TDirectDraw read FDDraw;
property Display: TDXDrawDisplay read FDisplay write SetDisplay;
{$IFDEF _DMO_}property Adapter: TDirectXDriversEx read FAdapters write FAdapters;{$ENDIF}
property Driver: PGUID read FDriver write SetDriver;
property Initialized: Boolean read FInitialized;
property NowOptions: TDXDrawOptions read FNowOptions;
787,14 → 468,12
property Options: TDXDrawOptions read FOptions write SetOptions;
property Palette: TDirectDrawPalette read FPalette;
property Primary: TDirectDrawSurface read FPrimary;
{$IFDEF D3DRM}property Scene: IDirect3DRMFrame read FScene; {$ENDIF}
property Scene: IDirect3DRMFrame read FScene;
property Surface: TDirectDrawSurface read FSurface;
property SurfaceHeight: Integer read GetSurfaceHeight write SetSurfaceHeight default 480;
property SurfaceWidth: Integer read GetSurfaceWidth write SetSurfaceWidth default 640;
{$IFDEF D3DRM}property Viewport: IDirect3DRMViewport read FViewport; {$ENDIF}
property Viewport: IDirect3DRMViewport read FViewport;
property ZBuffer: TDirectDrawSurface read FZBuffer;
property D2D1: TD2D read FD2D; {public object is here}
property Traces: TTraces read FTraces write SetTraces;
end;
 
{ TDXDraw }
801,7 → 480,6
 
TDXDraw = class(TCustomDXDraw)
published
{$IFDEF _DMO_}property Adapter;{$ENDIF}
property AutoInitialize;
property AutoSize;
property Color;
815,12 → 493,10
property OnInitializeSurface;
property OnInitializing;
property OnRestoreSurface;
property OnUpdateTextures;
property OnRender;
 
property Align;
{$IFDEF VER4UP}property Anchors; {$ENDIF}
{$IFDEF VER4UP}property Constraints; {$ENDIF}
{$IFDEF DelphiX_Spt4}property Anchors;{$ENDIF}
{$IFDEF DelphiX_Spt4}property Constraints;{$ENDIF}
property DragCursor;
property DragMode;
property Enabled;
829,7 → 505,6
property ShowHint;
property TabOrder;
property TabStop;
property Traces;
property Visible;
property OnClick;
property OnDblClick;
844,12 → 519,7
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
{$IFDEF VER9UP}
property OnMouseWheel;
property OnMouseWheelUp;
property OnMouseWheelDown;
{$ENDIF}
{$IFDEF VER4UP}property OnResize; {$ENDIF}
{$IFDEF DelphiX_Spt4}property OnResize;{$ENDIF}
property OnStartDrag;
end;
 
857,314 → 527,6
 
EDX3DError = class(Exception);
 
{ DxTracer }
 
EDXTracerError = class(Exception);
EDXBlitError = class(Exception);
 
TTracePointsType = (tptDot, tptLine, tptCircle, tptCurve);
 
TBlitMoveEvent = procedure(Sender: TObject; LagCount: Integer; var MoveIt: Boolean) of object;
TWaveType = (wtWaveNone, wtWaveX, wtWaveY);
TBlitRec = packed record
FCollisioned: Boolean;
FMoved: Boolean;
FVisible: Boolean;
FX: Double;
FY: Double;
FZ: Integer;
FWidth: Integer;
FHeight: Integer;
//--
FAnimCount: Integer;
FAnimLooped: Boolean;
FAnimPos: Double;
FAnimSpeed: Double;
FAnimStart: Integer;
//FTile: Boolean;
FAngle: Single;
FAlpha: Integer;
FCenterX: Double;
FCenterY: Double;
FScale: Double;
FBlendMode: TRenderType;
FAmplitude: Integer;
FAmpLength: Integer;
FPhase: Integer;
FWaveType: TWaveType;
FSpeedX, FSpeedY: Single;
FGravityX, FGravityY: Single;
FEnergy: Single;
FBlurImage: Boolean;
FMirror: Boolean;
FFlip: Boolean;
FTextureFilter: TD2DTextureFilter;
end;
TBlurImageProp = packed record
eActive: Boolean;
eX, eY: Integer;
ePatternIndex: Integer; {when animated or 0 always}
eAngle: Single; //angle can be saved too
eBlendMode: TRenderType; //blend mode
eIntensity: Byte; {intensity of Blur/Add/Sub}
end;
 
TPath = packed record
X, Y, Z: Single;
StayOn: Integer; {in milisecond}
Reserved: string[28]; {for future use}
Tag: Integer;
end;
TPathArr = array{$IFNDEF VER4UP} [0..0]{$ENDIF} of TPath;
{$IFNDEF VER4UP}
PPathArr = ^TPathArr;
{$ENDIF}
TBlit = class;
 
TOnRender = procedure(Sender: TBlit) of object;
 
TBlurImageArr = array[0..7] of TBlurImageProp;
TBlit = class(TPersistent)
private
FPathArr: {$IFNDEF VER4UP}PPathArr{$ELSE}TPathArr{$ENDIF};
{$IFNDEF VER4UP}
FPathLen: Integer;
{$ENDIF}
FParent: TBlit;
FBlitRec: TBlitRec;
FBlurImageArr: TBlurImageArr;
FActive: Boolean;
//--
FImage: TPictureCollectionItem;
FOnMove: TBlitMoveEvent;
FOnDraw: TNotifyEvent;
FOnCollision: TNotifyEvent;
FOnGetImage: TNotifyEvent;
FEngine: TCustomDXDraw;
FMovingRepeatly: Boolean;
FBustrofedon: Boolean;
FOnRender: TOnRender;
function GetWorldX: Double;
function GetWorldY: Double;
function GetDrawImageIndex: Integer;
function GetAlpha: Byte;
function GetAmpLength: Integer;
function GetAmplitude: Integer;
function GetAngle: Single;
function GetAnimCount: Integer;
function GetAnimLooped: Boolean;
function GetAnimPos: Double;
function GetAnimSpeed: Double;
function GetAnimStart: Integer;
function GetBlendMode: TRenderType;
function GetBlurImage: Boolean;
function GetCenterX: Double;
function GetCenterY: Double;
function GetCollisioned: Boolean;
function GetEnergy: Single;
function GetFlip: Boolean;
function GetGravityX: Single;
function GetGravityY: Single;
function GetHeight: Integer;
function GetMirror: Boolean;
function GetMoved: Boolean;
function GetPhase: Integer;
function GetScale: Double;
function GetSpeedX: Single;
function GetSpeedY: Single;
function GetVisible: Boolean;
function GetWaveType: TWaveType;
function GetWidth: Integer;
function GetX: Double;
function GetY: Double;
function GetZ: Integer;
procedure SetAlpha(const Value: Byte);
procedure SetAmpLength(const Value: Integer);
procedure SetAmplitude(const Value: Integer);
procedure SetAngle(const Value: Single);
procedure SetAnimCount(const Value: Integer);
procedure SetAnimLooped(const Value: Boolean);
procedure SetAnimPos(const Value: Double);
procedure SetAnimSpeed(const Value: Double);
procedure SetAnimStart(const Value: Integer);
procedure SetBlendMode(const Value: TRenderType);
procedure SetBlurImage(const Value: Boolean);
procedure SetCenterX(const Value: Double);
procedure SetCenterY(const Value: Double);
procedure SetCollisioned(const Value: Boolean);
procedure SetEnergy(const Value: Single);
procedure SetFlip(const Value: Boolean);
procedure SetGravityX(const Value: Single);
procedure SetGravityY(const Value: Single);
procedure SetHeight(const Value: Integer);
procedure SetMirror(const Value: Boolean);
procedure SetMoved(const Value: Boolean);
procedure SetPhase(const Value: Integer);
procedure SetScale(const Value: Double);
procedure SetSpeedX(const Value: Single);
procedure SetSpeedY(const Value: Single);
procedure SetVisible(const Value: Boolean);
procedure SetWaveType(const Value: TWaveType);
procedure SetWidth(const Value: Integer);
procedure SetX(const Value: Double);
procedure SetY(const Value: Double);
procedure SetZ(const Value: Integer);
function StoreAngle: Boolean;
function StoreAnimPos: Boolean;
function StoreAnimSpeed: Boolean;
function StoreCenterX: Boolean;
function StoreCenterY: Boolean;
function StoreEnergy: Boolean;
function StoreGravityX: Boolean;
function StoreGravityY: Boolean;
function StoreScale: Boolean;
function StoreSpeedX: Boolean;
function StoreSpeedY: Boolean;
function GetBoundsRect: TRect;
function GetClientRect: TRect;
function GetPath(index: Integer): TPath;
procedure SetPath(index: Integer; const Value: TPath);
procedure ReadPaths(Stream: TStream);
procedure WritePaths(Stream: TStream);
function GetMovingRepeatly: Boolean;
procedure SetMovingRepeatly(const Value: Boolean);
function GetBustrofedon: Boolean;
procedure SetBustrofedon(const Value: Boolean);
function GetTextureFilter: TD2DTextureFilter;
procedure SetTextureFilter(const Value: TD2DTextureFilter);
protected
procedure DoDraw; virtual;
procedure DoMove(LagCount: Integer);
function DoCollision: TBlit; virtual;
procedure DoGetImage; virtual;
procedure DefineProperties(Filer: TFiler); override;
public
FCurrentPosition, FCurrentTime: Integer;
FCurrentDirection: Boolean;
constructor Create(AParent: TObject); virtual;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property Engine: TCustomDXDraw read FEngine write FEngine;
property Parent: TBlit read FParent;
property WorldX: Double read GetWorldX;
property WorldY: Double read GetWorldY;
procedure ReAnimate(MoveCount: Integer); virtual;
property Image: TPictureCollectionItem read FImage write FImage;
property BoundsRect: TRect read GetBoundsRect;
property ClientRect: TRect read GetClientRect;
procedure SetPathLen(Len: Integer);
function IsPathEmpty: Boolean;
function GetPathCount: Integer;
function GetBlitAt(X, Y: Integer): TBlit;
property Path[index: Integer]: TPath read GetPath write SetPath; default;
published
property Active: Boolean read FActive write FActive default False;
//--
property Collisioned: Boolean read GetCollisioned write SetCollisioned default True;
property Moved: Boolean read GetMoved write SetMoved default True;
property Visible: Boolean read GetVisible write SetVisible default True;
property X: Double read GetX write SetX;
property Y: Double read GetY write SetY;
property Z: Integer read GetZ write SetZ;
property Width: Integer read GetWidth write SetWidth;
property Height: Integer read GetHeight write SetHeight;
property MovingRepeatly: Boolean read GetMovingRepeatly write SetMovingRepeatly default True;
property Bustrofedon: Boolean read GetBustrofedon write SetBustrofedon default False;
//--
property AnimCount: Integer read GetAnimCount write SetAnimCount default 0;
property AnimLooped: Boolean read GetAnimLooped write SetAnimLooped default False;
property AnimPos: Double read GetAnimPos write SetAnimPos stored StoreAnimPos;
property AnimSpeed: Double read GetAnimSpeed write SetAnimSpeed stored StoreAnimSpeed;
property AnimStart: Integer read GetAnimStart write SetAnimStart default 0;
property Angle: Single read GetAngle write SetAngle stored StoreAngle;
property Alpha: Byte read GetAlpha write SetAlpha default $FF;
property CenterX: Double read GetCenterX write SetCenterX stored StoreCenterX;
property CenterY: Double read GetCenterY write SetCenterY stored StoreCenterY;
property Scale: Double read GetScale write SetScale stored StoreScale;
property BlendMode: TRenderType read GetBlendMode write SetBlendMode default rtDraw;
property Amplitude: Integer read GetAmplitude write SetAmplitude default 0;
property AmpLength: Integer read GetAmpLength write SetAmpLength default 0;
property Phase: Integer read GetPhase write SetPhase default 0;
property WaveType: TWaveType read GetWaveType write SetWaveType default wtWaveNone;
property SpeedX: Single read GetSpeedX write SetSpeedX stored StoreSpeedX;
property SpeedY: Single read GetSpeedY write SetSpeedY stored StoreSpeedY;
property GravityX: Single read GetGravityX write SetGravityX stored StoreGravityX;
property GravityY: Single read GetGravityY write SetGravityY stored StoreGravityY;
property Energy: Single read GetEnergy write SetEnergy stored StoreEnergy;
property BlurImage: Boolean read GetBlurImage write SetBlurImage default False;
property Mirror: Boolean read GetMirror write SetMirror default False;
property Flip: Boolean read GetFlip write SetFlip default False;
property TextureFilter: TD2DTextureFilter read GetTextureFilter write SetTextureFilter default D2D_POINT;
 
property OnGetImage: TNotifyEvent read FOnGetImage write FOnGetImage;
property OnMove: TBlitMoveEvent read FOnMove write FOnMove;
property OnDraw: TNotifyEvent read FOnDraw write FOnDraw;
property OnCollision: TNotifyEvent read FOnCollision write FOnCollision;
property OnRender: TOnRender read FOnRender write FOnRender;
end;
 
TTrace = class(THashCollectionItem)
private
FActualized: Boolean;
FTag: Integer;
FBlit: TBlit;
function GetTraces: TTraces;
function GetOnCollision: TNotifyEvent;
function GetOnDraw: TNotifyEvent;
function GetOnGetImage: TNotifyEvent;
function GetOnMove: TBlitMoveEvent;
procedure SetOnCollision(const Value: TNotifyEvent);
procedure SetOnDraw(const Value: TNotifyEvent);
procedure SetOnGetImage(const Value: TNotifyEvent);
procedure SetOnMove(const Value: TBlitMoveEvent);
function GetActive: Boolean;
procedure SetActive(const Value: Boolean);
function GetOnRender: TOnRender;
procedure SetOnRender(const Value: TOnRender);
protected
function GetDisplayName: string; override;
procedure SetDisplayName(const Value: string); override;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
procedure Render(const LagCount: Integer);
function IsActualized: Boolean;
procedure Assign(Source: TPersistent); override;
property Traces: TTraces read GetTraces;
function Clone(NewName: string; OffsetX: Integer{$IFDEF VER4UP} = 0{$ENDIF}; OffsetY: Integer{$IFDEF VER4UP} = 0{$ENDIF}; Angle: Single{$IFDEF VER4UP} = 0{$ENDIF}): TTrace;
published
property Active: Boolean read GetActive write SetActive;
property Tag: Integer read FTag write FTag;
property Blit: TBlit read FBlit write FBlit;
{events}
property OnGetImage: TNotifyEvent read GetOnGetImage write SetOnGetImage;
property OnMove: TBlitMoveEvent read GetOnMove write SetOnMove;
property OnDraw: TNotifyEvent read GetOnDraw write SetOnDraw;
property OnCollision: TNotifyEvent read GetOnCollision write SetOnCollision;
property OnRender: TOnRender read GetOnRender write SetOnRender;
end;
 
TTraces = class(THashCollection)
private
FOwner: TPersistent;
function GetItem(Index: Integer): TTrace;
procedure SetItem(Index: Integer; Value: TTrace);
protected
function GetOwner: TPersistent; override;
public
constructor Create(AOwner: TComponent);
function Add: TTrace;
function Find(const Name: string): TTrace;
{$IFDEF VER4UP}
function Insert(Index: Integer): TTrace;
{$ENDIF}
procedure Update(Item: TCollectionItem); override;
property Items[Index: Integer]: TTrace read GetItem write SetItem;
destructor Destroy; override;
end;
 
{$IFDEF DX3D_deprecated}
 
{ TCustomDX3D }
 
TDX3DOption = (toRetainedMode, toSystemMemory, toHardware, toSelectDriver, toZBuffer);
1174,20 → 536,15
TCustomDX3D = class(TComponent)
private
FAutoSize: Boolean;
{$IFDEF D3DRM}FCamera: IDirect3DRMFrame; {$ENDIF}
{$IFDEF D3D_deprecated}
FCamera: IDirect3DRMFrame;
FD3D: IDirect3D;
FD3D2: IDirect3D2;
FD3D3: IDirect3D3;
{$ENDIF}
FD3D7: IDirect3D7;
{$IFDEF D3D_deprecated}
FD3DDevice: IDirect3DDevice;
FD3DDevice2: IDirect3DDevice2;
FD3DDevice3: IDirect3DDevice3;
{$ENDIF}
FD3DDevice7: IDirect3DDevice7;
{$IFDEF D3DRM}
FD3DRM: IDirect3DRM;
FD3DRM2: IDirect3DRM2;
FD3DRM3: IDirect3DRM3;
1194,7 → 551,6
FD3DRMDevice: IDirect3DRMDevice;
FD3DRMDevice2: IDirect3DRMDevice2;
FD3DRMDevice3: IDirect3DRMDevice3;
{$ENDIF}
FDXDraw: TCustomDXDraw;
FInitFlag: Boolean;
FInitialized: Boolean;
1202,11 → 558,11
FOnFinalize: TNotifyEvent;
FOnInitialize: TNotifyEvent;
FOptions: TDX3DOptions;
{$IFDEF D3DRM}FScene: IDirect3DRMFrame; {$ENDIF}
FScene: IDirect3DRMFrame;
FSurface: TDirectDrawSurface;
FSurfaceHeight: Integer;
FSurfaceWidth: Integer;
{$IFDEF D3DRM}FViewport: IDirect3DRMViewport; {$ENDIF}
FViewport: IDirect3DRMViewport;
FZBuffer: TDirectDrawSurface;
procedure Finalize;
procedure Initialize;
1216,7 → 572,7
function GetSurfaceWidth: Integer;
procedure SetAutoSize(Value: Boolean);
procedure SetDXDraw(Value: TCustomDXDraw);
procedure SetOptions(Value: TDX3DOptions); virtual; {TridenT}
procedure SetOptions(Value: TDX3DOptions);
procedure SetSurfaceHeight(Value: Integer);
procedure SetSurfaceWidth(Value: Integer);
protected
1229,19 → 585,16
procedure Render;
procedure SetSize(ASurfaceWidth, ASurfaceHeight: Integer);
property AutoSize: Boolean read FAutoSize write SetAutoSize;
{$IFDEF D3DRM}property Camera: IDirect3DRMFrame read FCamera; {$ENDIF}
property Camera: IDirect3DRMFrame read FCamera;
property CanDraw: Boolean read GetCanDraw;
property D3D: IDirect3D read FD3D;
property D3D2: IDirect3D2 read FD3D2;
property D3D3: IDirect3D3 read FD3D3;
property D3D7: IDirect3D7 read FD3D7;
{$IFDEF D3D_deprecated}
property D3DDevice: IDirect3DDevice read FD3DDevice;
property D3DDevice2: IDirect3DDevice2 read FD3DDevice2;
property D3DDevice3: IDirect3DDevice3 read FD3DDevice3;
{$ENDIF}
property D3DDevice7: IDirect3DDevice7 read FD3DDevice7;
{$IFDEF D3DRM}
property D3DRM: IDirect3DRM read FD3DRM;
property D3DRM2: IDirect3DRM2 read FD3DRM2;
property D3DRM3: IDirect3DRM3 read FD3DRM3;
1248,7 → 601,6
property D3DRMDevice: IDirect3DRMDevice read FD3DRMDevice;
property D3DRMDevice2: IDirect3DRMDevice2 read FD3DRMDevice2;
property D3DRMDevice3: IDirect3DRMDevice3 read FD3DRMDevice3;
{$ENDIF}
property DXDraw: TCustomDXDraw read FDXDraw write SetDXDraw;
property Initialized: Boolean read FInitialized;
property NowOptions: TDX3DOptions read FNowOptions;
1255,11 → 607,11
property OnFinalize: TNotifyEvent read FOnFinalize write FOnFinalize;
property OnInitialize: TNotifyEvent read FOnInitialize write FOnInitialize;
property Options: TDX3DOptions read FOptions write SetOptions;
{$IFDEF D3DRM}property Scene: IDirect3DRMFrame read FScene; {$ENDIF}
property Scene: IDirect3DRMFrame read FScene;
property Surface: TDirectDrawSurface read FSurface;
property SurfaceHeight: Integer read GetSurfaceHeight write SetSurfaceHeight default 480;
property SurfaceWidth: Integer read GetSurfaceWidth write SetSurfaceWidth default 640;
{$IFDEF D3DRM}property Viewport: IDirect3DRMViewport read FViewport; {$ENDIF}
property Viewport: IDirect3DRMViewport read FViewport;
property ZBuffer: TDirectDrawSurface read FZBuffer;
end;
 
1275,12 → 627,11
property OnFinalize;
property OnInitialize;
end;
{$ENDIF}
 
{ EDirect3DTextureError }
 
EDirect3DTextureError = class(Exception);
 
{ TDirect3DTexture }
 
TDirect3DTexture = class
1293,13 → 644,13
FHandle: TD3DTextureHandle;
FPaletteEntries: TPaletteEntries;
FSurface: TDirectDrawSurface;
FTexture: {$IFDEF D3D_deprecated}IDirect3DTexture{$ELSE}IDirect3DTexture2{$ENDIF};
FTexture: IDirect3DTexture;
FTransparentColor: TColor;
procedure Clear;
procedure DXDrawNotifyEvent(Sender: TCustomDXDraw; NotifyType: TDXDrawNotifyType);
function GetHandle: TD3DTextureHandle;
function GetSurface: TDirectDrawSurface;
function GetTexture: {$IFDEF D3D_deprecated}IDirect3DTexture{$ELSE}IDirect3DTexture2{$ENDIF};
function GetTexture: IDirect3DTexture;
procedure SetTransparentColor(Value: TColor);
public
constructor Create(Graphic: TGraphic; DXDraw: TComponent);
1308,133 → 659,9
property Handle: TD3DTextureHandle read GetHandle;
property Surface: TDirectDrawSurface read GetSurface;
property TransparentColor: TColor read FTransparentColor write SetTransparentColor;
property Texture: {$IFDEF D3D_deprecated}IDirect3DTexture{$ELSE}IDirect3DTexture2{$ENDIF} read GetTexture;
property Texture: IDirect3DTexture read GetTexture;
end;
 
{ EDXTextureImageError }
 
EDXTextureImageError = class(Exception);
 
{ channel structure }
 
TDXTextureImageChannel = record
Mask: DWORD;
BitCount: Integer;
 
{ Internal use }
_Mask2: DWORD;
_rshift: Integer;
_lshift: Integer;
_BitCount2: Integer;
end;
 
TDXTextureImage_PaletteEntries = array[0..255] of TPaletteEntry;
 
TDXTextureImageType = (
DXTextureImageType_PaletteIndexedColor,
DXTextureImageType_RGBColor
);
 
TDXTextureImageFileCompressType = (
DXTextureImageFileCompressType_None,
DXTextureImageFileCompressType_ZLIB
);
 
{forward}
 
TDXTextureImage = class;
 
{ TDXTextureImageLoadFunc }
 
TDXTextureImageLoadFunc = procedure(Stream: TStream; Image: TDXTextureImage);
 
{ TDXTextureImageProgressEvent }
 
TDXTextureImageProgressEvent = procedure(Sender: TObject; Progress, ProgressCount: Integer) of object;
 
{ TDXTextureImage }
 
TDXTextureImage = class
private
FOwner: TDXTextureImage;
FFileCompressType: TDXTextureImageFileCompressType;
FOnSaveProgress: TDXTextureImageProgressEvent;
FSubImage: TList;
FImageType: TDXTextureImageType;
FWidth: Integer;
FHeight: Integer;
FPBits: Pointer;
FBitCount: Integer;
FPackedPixelOrder: Boolean;
FWidthBytes: Integer;
FNextLine: Integer;
FSize: Integer;
FTopPBits: Pointer;
FTransparent: Boolean;
FTransparentColor: DWORD;
FImageGroupType: DWORD;
FImageID: DWORD;
FImageName: string;
FAutoFreeImage: Boolean;
procedure ClearImage;
function GetPixel(x, y: Integer): DWORD;
procedure SetPixel(x, y: Integer; c: DWORD);
function GetScanLine(y: Integer): Pointer;
function GetSubGroupImageCount(GroupTypeID: DWORD): Integer;
function GetSubGroupImage(GroupTypeID: DWORD; Index: Integer): TDXTextureImage;
function GetSubImageCount: Integer;
function GetSubImage(Index: Integer): TDXTextureImage;
protected
procedure DoSaveProgress(Progress, ProgressCount: Integer); virtual;
public
idx_index: TDXTextureImageChannel;
idx_alpha: TDXTextureImageChannel;
idx_palette: TDXTextureImage_PaletteEntries;
rgb_red: TDXTextureImageChannel;
rgb_green: TDXTextureImageChannel;
rgb_blue: TDXTextureImageChannel;
rgb_alpha: TDXTextureImageChannel;
constructor Create;
constructor CreateSub(AOwner: TDXTextureImage);
destructor Destroy; override;
procedure Assign(Source: TDXTextureImage);
procedure Clear;
procedure SetImage(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes, NextLine: Integer;
PBits, TopPBits: Pointer; Size: Integer; AutoFree: Boolean);
procedure SetSize(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes: Integer);
procedure LoadFromFile(const FileName: string);
procedure LoadFromStream(Stream: TStream);
procedure SaveToFile(const FileName: string);
procedure SaveToStream(Stream: TStream);
function EncodeColor(R, G, B, A: Byte): DWORD;
function PaletteIndex(R, G, B: Byte): DWORD;
class procedure RegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
class procedure UnRegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
property BitCount: Integer read FBitCount;
property PackedPixelOrder: Boolean read FPackedPixelOrder write FPackedPixelOrder;
property Height: Integer read FHeight;
property ImageType: TDXTextureImageType read FImageType;
property ImageGroupType: DWORD read FImageGroupType write FImageGroupType;
property ImageID: DWORD read FImageID write FImageID;
property ImageName: string read FImageName write FImageName;
property NextLine: Integer read FNextLine;
property PBits: Pointer read FPBits;
property Pixels[x, y: Integer]: DWORD read GetPixel write SetPixel;
property ScanLine[y: Integer]: Pointer read GetScanLine;
property Size: Integer read FSize;
property SubGroupImageCount[GroupTypeID: DWORD]: Integer read GetSubGroupImageCount;
property SubGroupImages[GroupTypeID: DWORD; Index: Integer]: TDXTextureImage read GetSubGroupImage;
property SubImageCount: Integer read GetSubImageCount;
property SubImages[Index: Integer]: TDXTextureImage read GetSubImage;
property TopPBits: Pointer read FTopPBits;
property Transparent: Boolean read FTransparent write FTransparent;
property TransparentColor: DWORD read FTransparentColor write FTransparentColor;
property Width: Integer read FWidth;
property WidthBytes: Integer read FWidthBytes;
property FileCompressType: TDXTextureImageFileCompressType read FFileCompressType write FFileCompressType;
property OnSaveProgress: TDXTextureImageProgressEvent read FOnSaveProgress write FOnSaveProgress;
end;
 
{ TDirect3DTexture2 }
 
TDirect3DTexture2 = class
1457,20 → 684,18
FD3DDevDesc: TD3DDeviceDesc;
procedure DXDrawNotifyEvent(Sender: TCustomDXDraw; NotifyType: TDXDrawNotifyType);
procedure SetDXDraw(ADXDraw: TCustomDXDraw);
procedure LoadSubTexture(Dest: {$IFDEF D3D_deprecated}IDirectDrawSurface4{$ELSE}IDirectDrawSurface7{$ENDIF}; SrcImage: TDXTextureImage);
procedure LoadSubTexture(Dest: IDirectDrawSurface4; SrcImage: TDXTextureImage);
procedure SetColorKey;
procedure SetDIB(DIB: TDIB);
function GetIsMipmap: Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function GetSurface: TDirectDrawSurface; {$IFDEF VER9UP}inline;{$ENDIF}
function GetTransparent: Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
procedure SetTransparent(Value: Boolean); {$IFDEF VER9UP}inline;{$ENDIF}
procedure SetTransparentColor(Value: TColorRef); {$IFDEF VER9UP}inline;{$ENDIF}
function GetHeight: Integer;
function GetWidth: Integer;
function GetIsMipmap: Boolean;
function GetSurface: TDirectDrawSurface;
function GetTransparent: Boolean;
procedure SetTransparent(Value: Boolean);
procedure SetTransparentColor(Value: TColorRef);
protected
procedure DoRestoreSurface; virtual;
public
constructor Create(ADXDraw: TCustomDXDraw; Graphic: TObject; AutoFreeGraphic: Boolean{$IFDEF VER4UP} = False{$ENDIF});
constructor Create(ADXDraw: TCustomDXDraw; Graphic: TObject; AutoFreeGraphic: Boolean);
constructor CreateFromFile(ADXDraw: TCustomDXDraw; const FileName: string);
constructor CreateVideoTexture(ADXDraw: TCustomDXDraw);
destructor Destroy; override;
1477,8 → 702,6
procedure Finalize;
procedure Load;
procedure Initialize;
property Height: Integer read GetHeight;
property Width: Integer read GetWidth;
property IsMipmap: Boolean read GetIsMipmap;
property Surface: TDirectDrawSurface read GetSurface;
property TextureFormat: TDDSurfaceDesc2 read FTextureFormat write FTextureFormat;
1487,103 → 710,6
property OnRestoreSurface: TNotifyEvent read FOnRestoreSurface write FOnRestoreSurface;
end;
 
{ EDXTBaseError }
 
EDXTBaseError = class(Exception);
 
{ parameters for DXT generator }
 
TDXTImageChannel = (rgbNone, rgbRed, rgbGreen, rgbBlue, rgbAlpha, yuvY);
TDXTImageChannels = set of TDXTImageChannel;
 
TDXTImageChannelInfo = packed record
Image: TDXTextureImage;
BitCount: Integer;
end;
 
TDXTImageFormat = packed record
ImageType: TDXTextureImageType;
Width: Integer;
Height: Integer;
Bits: Pointer;
BitCount: Integer;
WidthBytes: Integer;
{transparent}
Transparent: Boolean;
TransparentColor: TColorRef;
{texture channels}
idx_index: TDXTextureImageChannel;
idx_alpha: TDXTextureImageChannel;
idx_palette: TDXTextureImage_PaletteEntries;
rgb_red: TDXTextureImageChannel;
rgb_green: TDXTextureImageChannel;
rgb_blue: TDXTextureImageChannel;
rgb_alpha: TDXTextureImageChannel;
{compress level}
Compress: TDXTextureImageFileCompressType;
MipmapCount: Integer;
Name: string;
end;
 
{ TDXTBase }
 
{Note JB.}
{Class for DXT generation files, primary use for load bitmap 32 with alphachannel}
{recoded and class created by JB.}
TDXTBase = class
private
FHasChannels: TDXTImageChannels;
FHasChannelImages: array[TDXTImageChannel] of TDXTImageChannelInfo;
FChannelChangeTable: array[TDXTImageChannel] of TDXTImageChannel;
FHasImageList: TList;
FParamsFormat: TDXTImageFormat;
FStrImageFileName: string;
FDIB: TDIB;
function GetCompression: TDXTextureImageFileCompressType;
function GetHeight: Integer;
function GetMipmap: Integer;
function GetTransparentColor: TColorRef;
function GetWidth: Integer;
procedure SetCompression(const Value: TDXTextureImageFileCompressType);
procedure SetHeight(const Value: Integer);
procedure SetMipmap(const Value: Integer);
procedure SetTransparentColor(const Value: TColorRef);
procedure SetWidth(const Value: Integer);
procedure SetTransparentColorIndexed(const Value: TColorRef);
function GetTexture: TDXTextureImage;
procedure Resize(Image: TDXTextureImage; NewWidth, NewHeight: Integer;
FilterTypeResample: TFilterTypeResample);
procedure EvaluateChannels(const CheckChannelUsed: TDXTImageChannels;
const CheckChannelChanged, CheckBitCountForChannel: string);
function GetPicture: TDXTextureImage;
protected
procedure CalcOutputBitFormat;
procedure BuildImage(Image: TDXTextureImage);
public
constructor Create;
destructor Destroy; override;
procedure SetChannelR(T: TDIB);
procedure SetChannelG(T: TDIB);
procedure SetChannelB(T: TDIB);
procedure SetChannelA(T: TDIB);
procedure LoadChannelAFromFile(const FileName: string);
procedure SetChannelY(T: TDIB);
procedure SetChannelRGB(T: TDIB);
procedure LoadChannelRGBFromFile(const FileName: string);
procedure SetChannelRGBA(T: TDIB);
procedure LoadChannelRGBAFromFile(const FileName: string);
procedure SaveToFile(iFilename: string {$IFDEF VER4UP} = ''{$ENDIF});
function LoadFromFile(iFilename: string): Boolean;
property TransparentColor: TColorRef read GetTransparentColor write SetTransparentColor;
property TransparentColorIndexed: TColorRef read GetTransparentColor write SetTransparentColorIndexed;
property Width: Integer read GetWidth write SetWidth;
property Height: Integer read GetHeight write SetHeight;
property Compression: TDXTextureImageFileCompressType read GetCompression write SetCompression;
property Mipmap: Integer read GetMipmap write SetMipmap;
property Texture: TDXTextureImage read GetTexture;
end;
 
{$IFDEF D3DRM}
{ EDirect3DRMUserVisualError }
 
EDirect3DRMUserVisualError = class(Exception);
1601,7 → 727,6
destructor Destroy; override;
property UserVisual: IDirect3DRMUserVisual read FUserVisual;
end;
{$ENDIF}
 
{ EPictureCollectionError }
 
1631,7 → 756,7
function GetPictureCollection: TPictureCollection;
function GetPatternRect(Index: Integer): TRect;
function GetPatternSurface(Index: Integer): TDirectDrawSurface;
function GetPatternCount: Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function GetPatternCount: Integer;
function GetWidth: Integer;
procedure SetPicture(Value: TPicture);
procedure SetTransparentColor(Value: TColor);
1638,82 → 763,34
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
procedure UpdateTag;
procedure Assign(Source: TPersistent); override;
procedure Draw(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
// Modifier par MKost d'Uk@Team tous droit réservé.
// 22:02 04/11/2005
// Ajouté :
// Dans TPictureCollectionItem
// procedure DrawFlipH(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
// -Effectue un flip Horizontale de l'image
// procedure DrawFlipHV(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
// -Effectue un flip Oblique de l'image
// procedure DrawFlipV(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
// -Effectue un flip Verticale de l'image
procedure DrawFlipH(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
procedure DrawFlipHV(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
procedure DrawFlipV(Dest: TDirectDrawSurface; X, Y: Integer; PatternIndex: Integer);
procedure StretchDraw(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer);
procedure DrawAdd(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawAddCol(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Color: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawAlpha(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawAlphaCol(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Color: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
Alpha: Integer);
procedure DrawSub(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawSubCol(Dest: TDirectDrawSurface; const DestRect: TRect;
PatternIndex, Color: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{Rotate}
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawRotate(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single);
CenterX, CenterY: Double; Angle: Integer);
procedure DrawRotateAdd(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawRotateAddCol(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single;
Color: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
CenterX, CenterY: Double; Angle: Integer;
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawRotateAlpha(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawRotateAlphaCol(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single;
Color: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
CenterX, CenterY: Double; Angle: Integer;
Alpha: Integer);
procedure DrawRotateSub(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single;
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawRotateSubCol(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single;
Color: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{WaveX}
CenterX, CenterY: Double; Angle: Integer;
Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawWaveX(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer);
procedure DrawWaveXAdd(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
amp, Len, ph: Integer; Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure DrawWaveXAlpha(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
amp, Len, ph: Integer; Alpha: Integer);
procedure DrawWaveXSub(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{WaveY}
procedure DrawWaveY(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer);
procedure DrawWaveYAdd(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawWaveYAlpha(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawWaveYSub(Dest: TDirectDrawSurface; X, Y, Width, Height: Integer; PatternIndex: Integer;
amp, Len, ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
{SpecialDraw}
procedure DrawCol(Dest: TDirectDrawSurface; const DestRect, SourceRect: TRect;
PatternIndex: Integer; Faded: Boolean; RenderType: TRenderType; Color,
Specular: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
procedure DrawRect(Dest: TDirectDrawSurface;
const DestRect, SourceRect: TRect; PatternIndex: Integer;
RenderType: TRenderType; Transparent: Boolean{$IFDEF VER4UP} = True{$ENDIF};
Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF});
amp, Len, ph: Integer; Alpha: Integer{$IFDEF DelphiX_Spt4}=255{$ENDIF});
procedure Restore;
property Height: Integer read GetHeight;
property Initialized: Boolean read FInitialized;
1746,7 → 823,7
protected
procedure DefineProperties(Filer: TFiler); override;
function GetOwner: TPersistent; override;
public
public
ColorTable: TRGBQuads;
constructor Create(AOwner: TPersistent);
destructor Destroy; override;
1753,7 → 830,6
function Find(const Name: string): TPictureCollectionItem;
procedure Finalize;
procedure Initialize(DXDraw: TCustomDXDraw);
procedure InitializeImages(DXDraw: TCustomDXDraw; Id : Integer);
procedure LoadFromFile(const FileName: string);
procedure LoadFromStream(Stream: TStream);
procedure MakeColorTable;
1815,7 → 891,7
constructor CreateWindowed(WindowHandle: HWND);
destructor Destroy; override;
procedure Finalize;
procedure Initialize(const SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF});
procedure Initialize(const SurfaceDesc: TDDSurfaceDesc);
procedure Flip;
property OverlayColorKey: TColor read FOverlayColorKey write SetOverlayColorKey;
property OverlayRect: TRect read FOverlayRect write SetOverlayRect;
1824,542 → 900,27
property Visible: Boolean read FVisible write SetVisible;
end;
 
{
Modified by Michael Wilson 2/05/2001
- re-added redundant assignment to Offset
Modified by Marcus Knight 19/12/2000
- replaces all referaces to 'pos' with 'AnsiPos' <- faster
- replaces all referaces to 'uppercase' with 'Ansiuppercase' <- faster
- Now only uppercases outside the loop
- Fixed the non-virtual contructor
- renamed & moved Offset to private(fOffSet), and added the property OffSet
- Commented out the redundant assignment to Offset<- not needed, as Offset is now a readonly property
- Added the Notification method to catch when the image list is destroyed
- removed DXclasses from used list
}
 
TDXFont = class(TComponent)
private
FDXImageList: TDXImageList;
FFont: string;
FFontIndex: Integer;
FOffset: Integer; // renamed from Offset -> fOffset
procedure SetFont(const Value: string);
procedure SetFontIndex(const Value: Integer);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override; // added
public
constructor Create(AOwner: TComponent); override; // Modified
destructor Destroy; override;
procedure TextOut(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string);
property Offset: Integer read FOffset write FOffset; // added
published
property Font: string read FFont write SetFont;
property FontIndex: Integer read FFontIndex write SetFontIndex;
property DXImageList: TDXImageList read FDXImageList write FDXImageList;
end;
 
(*******************************************************************************
* Unit Name: DXPowerFont.pas
* Information: Writed By Ramin.S.Zaghi (Based On Wilson's DXFont Unit)
* Last Changes: Dec 25 2000;
* Unit Information:
* This unit includes a VCL-Component for DelphiX. This component draws the
* Character-Strings on a TDirectDrawSurface. This component helps the
* progarmmers to using custom fonts and printing texts easily such as
* TCanvas.TextOut function...
* Includes:
* 1. TDXPowerFontTextOutEffect ==> The kinds of drawing effects.
* - teNormal: Uses the Draw function. (Normal output)
* - teRotat: Uses the DrawRotate function. (Rotates each character)
* - teAlphaBlend: Uses DrawAlpha function. (Blends each character)
* - teWaveX: Uses DrawWaveX function. (Adds a Wave effect to the each character)
*
* 2. TDXPowerFontTextOutType ==> The kinds of each caracter.
* - ttUpperCase: Uppers all characters automaticaly.
* - ttLowerCase: Lowers all characters automaticaly.
* - ttNormal: Uses all characters with out any converting.
*
* 3. TDXPowerFontEffectsParameters ==> Includes the parameters for adding effects to the characters.
* - (CenterX, CenterY): The rotating center point.
* - (Width, Height): The new size of each character.
* - Angle: The angle of rotate.
* - AlphaValue: The value of Alpha-Chanel.
* - WAmplitude: The Amplitude of Wave function. (See The Help Of DelphiX)
* - WLenght: The Lenght Of Wave function. (See The Help Of DelphiX)
* - WPhase: The Phase Of Wave function. (See The Help Of DelphiX)
*
* 4. TDXPowerFontBeforeTextOutEvent ==> This is an event that occures before
* drawing texts on to TDirectDrawSurface object.
* - Sender: Retrieves the event caller object.
* - Text: Retrieves the text sended text for drawing.
* (NOTE: The changes will have effect)
* - DoTextOut: The False value means that the TextOut function must be stopped.
* (NOTE: The changes will have effect)
*
* 5. TDXPowerFontAfterTextOutEvent ==> This is an event that occures after
* drawing texts on to TDirectDrawSurface object.
* - Sender: Retrieves the event caller object.
* - Text: Retrieves the text sended text for drawing.
* (NOTE: The changes will not have any effects)
*
* 6. TDXPowerFont ==> I sthe main class of PowerFont VCL-Component.
* - property Font: string; The name of custom-font's image in the TDXImageList items.
* - property FontIndex: Integer; The index of custom-font's image in the TDXImageList items.
* - property DXImageList: TDXImageList; The TDXImageList that includes the image of custom-fonts.
* - property UseEnterChar: Boolean; When the value of this property is True, The component caculates Enter character.
* - property EnterCharacter: String;
*==> Note that TDXPowerFont calculates tow kinds of enter character:
*==> E1. The Enter character that draws the characters after it self in a new line and after last drawed character, ONLY.
*==> E2. The Enter character that draws the characters after it self in a new line such as #13#10 enter code in delphi.
*==> Imporatant::
*==> (E1) TDXPowerFont uses the first caracter of EnterCharacter string as the first enter caracter (Default value is '|').
*==> (E2) and uses the second character as the scond enter caracter (Default value is '<')
* - property BeforeTextOut: TDXPowerFontBeforeTextOutEvent; See TDXPowerFontBeforeTextOutEvent.
* - property AfterTextOut: TDXPowerFontAfterTextOutEvent; See TDXPowerFontAfterTextOutEvent.
* - property Alphabets: string; TDXPowerFont uses this character-string for retrieving the pattern number of each character.
* - property TextOutType: TDXPowerFontTextOutType; See TDXPowerFontTextOutType.
* - property TextOutEffect: TDXPowerFontTextOutEffect; See TDXPowerFontTextOutEffect.
* - property EffectsParameters: TDXPowerFontEffectsParameters; See TDXPowerFontEffectsParameters.
*
* - function TextOut(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string): Boolean;
* This function draws/prints the given text on the given TDirectDrawSurface.
* - DirectDrawSurface: The surface for drawing text (character-string).
* - (X , Y): The first point of outputed text. (Such as X,Y parameters in TCanvas.TextOut function)
* - Text: The text for printing.
* Return values: This function returns False when an error occured or...
* - function TextOutFast(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string): Boolean;
* This function works such as TextOut function but,
* with out calculating any Parameters/Effects/Enter-Characters/etc...
* This function calculates the TextOutType, ONLY.
*
* Ramin.S.Zaghi (ramin_zaghi@yahoo.com)
* (Based on wilson's code for TDXFont VCL-Component/Add-On)
* (wilson@no2games.com)
*
* For more information visit:
* www.no2games.com
* turbo.gamedev.net
******************************************************************************)
 
{ DXPowerFont types }
 
TDXPowerFontTextOutEffect = (teNormal, teRotat, teAlphaBlend, teWaveX);
TDXPowerFontTextOutType = (ttUpperCase, ttLowerCase, ttNormal);
TDXPowerFontBeforeTextOutEvent = procedure(Sender: TObject; var Text: string; var DoTextOut: Boolean) of object;
TDXPowerFontAfterTextOutEvent = procedure(Sender: TObject; Text: string) of object;
 
{ TDXPowerFontEffectsParameters }
 
TDXPowerFontEffectsParameters = class(TPersistent)
private
FCenterX: Integer;
FCenterY: Integer;
FHeight: Integer;
FWidth: Integer;
FAngle: Integer;
FAlphaValue: Integer;
FWPhase: Integer;
FWAmplitude: Integer;
FWLenght: Integer;
procedure SetAngle(const Value: Integer);
procedure SetCenterX(const Value: Integer);
procedure SetCenterY(const Value: Integer);
procedure SetHeight(const Value: Integer);
procedure SetWidth(const Value: Integer);
procedure SetAlphaValue(const Value: Integer);
procedure SetWAmplitude(const Value: Integer);
procedure SetWLenght(const Value: Integer);
procedure SetWPhase(const Value: Integer);
published
property CenterX: Integer read FCenterX write SetCenterX;
property CenterY: Integer read FCenterY write SetCenterY;
property Width: Integer read FWidth write SetWidth;
property Height: Integer read FHeight write SetHeight;
property Angle: Integer read FAngle write SetAngle;
property AlphaValue: Integer read FAlphaValue write SetAlphaValue;
property WAmplitude: Integer read FWAmplitude write SetWAmplitude;
property WLenght: Integer read FWLenght write SetWLenght;
property WPhase: Integer read FWPhase write SetWPhase;
end;
 
{ TDXPowerFont }
 
TDXPowerFont = class(TComponent)
private
FDXImageList: TDXImageList;
FFont: string;
FFontIndex: Integer;
FUseEnterChar: Boolean;
FEnterCharacter: string;
FAfterTextOut: TDXPowerFontAfterTextOutEvent;
FBeforeTextOut: TDXPowerFontBeforeTextOutEvent;
FAlphabets: string;
FTextOutType: TDXPowerFontTextOutType;
FTextOutEffect: TDXPowerFontTextOutEffect;
FEffectsParameters: TDXPowerFontEffectsParameters;
procedure SetFont(const Value: string);
procedure SetFontIndex(const Value: Integer);
procedure SetUseEnterChar(const Value: Boolean);
procedure SetEnterCharacter(const Value: string);
procedure SetAlphabets(const Value: string);
procedure SetTextOutType(const Value: TDXPowerFontTextOutType);
procedure SetTextOutEffect(const Value: TDXPowerFontTextOutEffect);
procedure SetEffectsParameters(const Value: TDXPowerFontEffectsParameters);
published
property Font: string read FFont write SetFont;
property FontIndex: Integer read FFontIndex write SetFontIndex;
property DXImageList: TDXImageList read FDXImageList write FDXImageList;
property UseEnterChar: Boolean read FUseEnterChar write SetUseEnterChar;
property EnterCharacter: string read FEnterCharacter write SetEnterCharacter;
property BeforeTextOut: TDXPowerFontBeforeTextOutEvent read FBeforeTextOut write FBeforeTextOut;
property AfterTextOut: TDXPowerFontAfterTextOutEvent read FAfterTextOut write FAfterTextOut;
property Alphabets: string read FAlphabets write SetAlphabets;
property TextOutType: TDXPowerFontTextOutType read FTextOutType write SetTextOutType;
property TextOutEffect: TDXPowerFontTextOutEffect read FTextOutEffect write SetTextOutEffect;
property EffectsParameters: TDXPowerFontEffectsParameters read FEffectsParameters write SetEffectsParameters;
public
Offset: Integer;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function TextOut(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string): Boolean;
function TextOutFast(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string): Boolean;
end;
 
{D2D unit for pure HW support
* Copyright (c) 2004-2010 Jaro Benes
* All Rights Reserved
* Version 1.09
* D2D Hardware module - interface part
* web site: www.micrel.cz/Dx
* e-mail: delphix_d2d@micrel.cz
}
 
{supported texture vertex as substitute type from DirectX}
 
{TD2D4Vertex - used with D2DTexturedOn}
 
TD2D4Vertex = array[0..3] of TD3DTLVERTEX;
 
{TD2DTextures - texture storage used with Direct3D}
TTextureRec = packed record
{$IFDEF VIDEOTEX}
VDIB: TDIB;
{$ENDIF}
D2DTexture: TDirect3DTexture2;
FloatX1, FloatY1, FloatX2, FloatY2: Double; //uschov vyrez
Name: string{$IFNDEF VER4UP} [255]{$ENDIF}; //jmeno obrazku pro snadne dohledani
Width, Height: Integer;
AlphaChannel: Boolean; //.06c
end;
PTextureRec = ^TTextureRec;
TTextureArr = array{$IFNDEF VER4UP} [0..0]{$ENDIF} of TTextureRec;
{$IFNDEF VER4UP}
PTextureArr = ^TTextureArr;
EMaxTexturesError = class(Exception);
{$ENDIF}
TD2DTextures = class
private
FDDraw: TCustomDXDraw;
{$IFNDEF VER4UP}
TexLen: Integer;
Texture: PTextureArr;
{$ELSE}
Texture: TTextureArr;
{$ENDIF}
function GetD2DMaxTextures: Integer;
procedure SetD2DMaxTextures(const Value: Integer);
procedure D2DPruneTextures;
procedure D2DPruneAllTextures;
procedure SizeAdjust(var DIB: TDIB; var FloatX1, FloatY1, FloatX2,
FloatY2: Double);
function SetTransparentColor(dds: TDirectDrawSurface; PixelColor: Integer;
Transparent: Boolean): Integer;
{$IFDEF VIDEOTEX}
function GetTexLayoutByName(name: string): TDIB;
{$ENDIF}
procedure SaveTextures(path: string);
public
constructor Create(DDraw: TCustomDXDraw);
destructor Destroy; override;
procedure D2DFreeTextures;
function Find(byName: string): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function GetTextureByName(const byName: string): TDirect3DTexture2;
function GetTextureByIndex(const byIndex: Integer): TDirect3DTexture2;
function GetTextureNameByIndex(const byIndex: Integer): string;
function Count: Integer;
{functions support loading image or DDS}
{$IFDEF VER4UP}
function CanFindTexture(aImage: TPictureCollectionItem): Boolean; overload; {$IFDEF VER9UP}inline;{$ENDIF}
function CanFindTexture(const TexName: string): Boolean; overload; {$IFDEF VER9UP}inline;{$ENDIF}
function CanFindTexture(const Color: LongInt): Boolean; overload;{$IFDEF VER9UP}inline;{$ENDIF}
function LoadTextures(aImage: TPictureCollectionItem): Boolean; overload; {$IFDEF VER9UP}inline;{$ENDIF}
function LoadTextures(dds: TDirectDrawSurface; Transparent: Boolean; asTexName: string): Boolean; overload;
function LoadTextures(dds: TDirectDrawSurface; Transparent: Boolean; TransparentColor: Integer; asTexName: string): Boolean; overload;
function LoadTextures(Color: Integer): Boolean; overload;
{$ELSE}
function CanFindTexture(aImage: TPictureCollectionItem): Boolean;
function CanFindTexture2(const TexName: string): Boolean;
function CanFindTexture3(const Color: LongInt): Boolean;
function LoadTextures(aImage: TPictureCollectionItem): Boolean;
function LoadTextures2(dds: TDirectDrawSurface; Transparent: Boolean; asTexName: string): Boolean;
function LoadTextures3(dds: TDirectDrawSurface; Transparent: Boolean; TransparentColor: Integer; asTexName: string): Boolean;
function LoadTextures4(Color: Integer): Boolean;
{$ENDIF}
{$IFDEF VIDEOTEX}
property TexLayoutByName[name: string]: TDIB read GetTexLayoutByName;
{$ENDIF}
//published
property D2DMaxTextures: Integer read GetD2DMaxTextures write SetD2DMaxTextures;
end;
 
{Main component for HW support}
 
TD2D = class
private
FDDraw: TCustomDXDraw;
FCanUseD2D: Boolean;
FBitCount: Integer;
FMirrorFlipSet: TRenderMirrorFlipSet;
FD2DTextureFilter: TD2DTextureFilter;
FD2DAntialiasFilter: TD3DAntialiasMode;
FVertex: TD2D4Vertex;
FD2DTexture: TD2DTextures;
FDIB: TDIB;
FD3DDevDesc7: TD3DDeviceDesc7;
FInitialized: Boolean;
{ukazuje pocet textur}
procedure D2DUpdateTextures; {$IFDEF VER9UP}inline;{$ENDIF}
 
procedure SetCanUseD2D(const Value: Boolean);
function GetCanUseD2D: Boolean;
{create the component}
constructor Create(DDraw: TCustomDXDraw);
procedure SetD2DTextureFilter(const Value: TD2DTextureFilter);
procedure SetD2DAntialiasFilter(const Value: TD3DAntialiasMode);
procedure D2DEffectSolid; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DEffectAdd; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DEffectSub; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DEffectBlend; {$IFDEF VER9UP}inline;{$ENDIF}// used with alpha
 
{verticies}
procedure InitVertex; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DWhite: Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DVertColor(RenderType: TRenderType; Alpha: Byte): DWORD; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DColoredVertex(C: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
function D2DAlphaVertex(Alpha: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DSpecularVertex(C: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
{Fade used with Add and Sub}
function D2DFade(Alpha: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DFadeColored(C, Alpha: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
 
function RenderQuad: Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
procedure D2DRect(R: TRect); {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DTU(T: TTextureRec); {$IFDEF VER9UP}inline;{$ENDIF}
{low lever version texturing for DDS}
function D2DTexturedOnDDSTex(dds: TDirectDrawSurface; SubPatternRect: TRect;
Transparent: Boolean): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
{texturing}
function D2DTexturedOn(Image: TPictureCollectionItem; Pattern: Integer; SubPatternRect: TRect; RenderType: TRenderType; Alpha: Byte): Boolean;
function D2DTexturedOnDDS(dds: TDirectDrawSurface; SubPatternRect: TRect; Transparent: Boolean; RenderType: TRenderType; Alpha: Byte): Boolean;
function D2DTexturedOnRect(Rect: TRect; Color: Integer): Boolean;
function D2DTexturedOnSubRect(Image: TPictureCollectionItem; Pattern: Integer; SubPatternRect, SubRect: TRect; RenderType: TRenderType; Alpha: Byte): Boolean;
 
{low level for rotate mesh}
procedure D2DRotate(X, Y, W, H: Integer; Px, Py: Double; Angle: single);
{low lever routine for mesh mapping}
function D2DMeshMapToWave(dds: TDirectDrawSurface; Transparent: Boolean;
TransparentColor: Integer; X, Y, iWidth, iHeight, PatternIndex: Integer;
PatternRect: TRect;
Amp, Len, Ph, Alpha: Integer;
Effect: TRenderType; DoY: Boolean{$IFDEF VER4UP} = False{$ENDIF}): Boolean;
property D2DTextures: TD2DTextures read FD2DTexture;
public
//added to public
procedure D2DColAlpha(C, Alpha: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DCol4Alpha(C1, C2, C3, C4, Alpha: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DFade4Colored(C1, C2, C3, C4, Alpha: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
function RenderTri: Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
procedure D2DMeshMapToRect(R: TRect);
//
{destruction textures and supported objects here}
destructor Destroy; override;
{use before starting rendering}
procedure BeginScene;
{use after all images have been rendered}
procedure EndScene;
{set directly of texture filter}
property TextureFilter: TD2DTextureFilter write SetD2DTextureFilter;
property AntialiasFilter: TD3DAntialiasMode write SetD2DAntialiasFilter;
{indicate using of this object}
property CanUseD2D: Boolean read GetCanUseD2D write SetCanUseD2D;
 
{set property mirror-flip}
property MirrorFlip: TRenderMirrorFlipSet read FMirrorFlipSet write FMirrorFlipSet;
 
{initialize surface}
function D2DInitializeSurface: Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
{Render routines}
function D2DRender(Image: TPictureCollectionItem; DestRect: TRect;
Pattern: Integer; SourceRect: TRect; RenderType: TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean;{$IFDEF VER4UP} overload; {$ENDIF}{$IFDEF VER9UP}inline;{$ENDIF}
 
function {$IFDEF VER4UP}D2DRender{$ELSE}D2DRender2{$ENDIF}(Image: TPictureCollectionItem; R: TRect;
Pattern: Integer; RenderType: TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER4UP} overload; {$ENDIF}{$IFDEF VER9UP}inline;{$ENDIF}
 
function D2DRenderDDS(Source: TDirectDrawSurface; SourceRect, DestRect: TRect; Transparent: Boolean;
Pattern: Integer; RenderType: TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
function D2DRenderCol(Image: TPictureCollectionItem; R: TRect;
Pattern, Color: Integer; RenderType: TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DRenderColDDS(Source: TDirectDrawSurface; SourceRect, DestRect: TRect;
Transparent: Boolean; Pattern, Color: Integer; RenderType:
TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
function D2DRenderDrawDDSXY(Source: TDirectDrawSurface; X, Y: Integer;
Transparent: Boolean; Pattern: Integer; RenderType: TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean;
{$IFDEF VER4UP} overload; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DRenderDrawDDSXY(Source: TDirectDrawSurface; X, Y: Integer;
SrcRect: TRect; Transparent: Boolean; Pattern: Integer; RenderType: TRenderType; Alpha: Byte{$IFDEF Ver4UP} = 255{$ENDIF}): Boolean; overload; {$IFDEF VER9UP}inline;{$ENDIF}
{$ENDIF}
function D2DRenderDrawXY(Image: TPictureCollectionItem; X, Y: Integer;
Pattern: Integer; RenderType: TRenderType; Alpha: Byte{$IFDEF VEr4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
{Rotate}
function D2DRenderRotate(Image: TPictureCollectionItem; RotX, RotY,
PictWidth, PictHeight, PatternIndex: Integer; RenderType: TRenderType;
CenterX, CenterY: Double; Angle: single; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DRenderRotateDDS(Image: TDirectDrawSurface; SourceRect: TRect; RotX, RotY,
PictWidth, PictHeight: Integer; RenderType: TRenderType;
CenterX, CenterY: Double; Angle: single; Alpha: Byte;
Transparent: Boolean): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
function D2DRenderRotateModeCol(Image: TPictureCollectionItem; RenderType: TRenderType; RotX, RotY,
PictWidth, PictHeight, PatternIndex: Integer; CenterX, CenterY: Double;
Angle: single; Color: Integer; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DRenderRotateModeColDDS(Image: TDirectDrawSurface;
RotX, RotY, PictWidth, PictHeight: Integer; RenderType: TRenderType;
CenterX, CenterY: Double; Angle: Single; Color: Integer; Alpha: Byte;
Transparent: Boolean): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
{WaveX}
function D2DRenderWaveX(Image: TPictureCollectionItem; X, Y, Width, Height,
PatternIndex: Integer; RenderType: TRenderType; Transparent: Boolean;
Amp, Len, Ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DRenderWaveXDDS(Source: TDirectDrawSurface; X, Y, Width,
Height: Integer; RenderType: TRenderType; Transparent: Boolean;
Amp, Len, Ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
{WaveY}
function D2DRenderWaveY(Image: TPictureCollectionItem; X, Y, Width, Height,
PatternIndex: Integer; RenderType: TRenderType; Transparent: Boolean;
Amp, Len, Ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function D2DRenderWaveYDDS(Source: TDirectDrawSurface; X, Y, Width,
Height: Integer; RenderType: TRenderType; Transparent: Boolean;
Amp, Len, Ph: Integer; Alpha: Integer{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
{Rect}
function D2DRenderFillRect(Rect: TRect; RGBColor: LongInt;
RenderType: TRenderType; Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
{addmod}
function D2DRenderColoredPartition(Image: TPictureCollectionItem; DestRect: TRect; PatternIndex,
Color, Specular: Integer; Faded: Boolean;
SourceRect: TRect;
RenderType: TRenderType;
Alpha: Byte{$IFDEF VER4UP} = 255{$ENDIF}): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
 
procedure SaveTextures(path: string);
end;
 
{ Support functions for texturing }
function dxtMakeChannel(Mask: DWORD; indexed: Boolean): TDXTextureImageChannel;
function dxtEncodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
function dxtDecodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
 
{ Single support routine for convert DIB32 to DXT in one line }
procedure dib2dxt(DIBImage: TDIB; out DXTImage: TDXTextureImage{$IFDEF DXTextureImage_UseZLIB}; const Shrink: Boolean = True{$ENDIF});
 
{ One line call drawing with attributes }
{$IFDEF VER4UP}
procedure DXDraw_Draw(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; TextureFilter: TD2DTextureFilter = D2D_POINT;
MirrorFlip: TRenderMirrorFlipSet = [];
BlendMode: TRenderType = rtDraw; Angle: Single = 0; Alpha: Byte = 255;
CenterX: Double = 0.5; CenterY: Double = 0.5;
Scale: Single = 1.0); {$IFDEF VER9UP}inline;{$ENDIF}
procedure DXDraw_Paint(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; var BlurImageArr: TBlurImageArr; BlurImage: Boolean = False;
TextureFilter: TD2DTextureFilter = D2D_POINT;
MirrorFlip: TRenderMirrorFlipSet = [];
BlendMode: TRenderType = rtDraw;
Angle: Single = 0;
Alpha: Byte = 255;
CenterX: Double = 0.5; CenterY: Double = 0.5); {$IFDEF VER9UP}inline;{$ENDIF}
procedure DXDraw_Render(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; var BlurImageArr: TBlurImageArr; BlurImage: Boolean = False;
TextureFilter: TD2DTextureFilter = D2D_POINT;
MirrorFlip: TRenderMirrorFlipSet = [];
BlendMode: TRenderType = rtDraw;
Angle: Single = 0;
Alpha: Byte = 255;
CenterX: Double = 0.5; CenterY: Double = 0.5;
Scale: Single = 1.0;
WaveType: TWaveType = wtWaveNone;
Amplitude: Integer = 0; AmpLength: Integer = 0; Phase: Integer = 0); {$IFDEF VER9UP}inline;{$ENDIF}
{$ELSE}
procedure DXDraw_Draw(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; TextureFilter: TD2DTextureFilter;
MirrorFlip: TRenderMirrorFlipSet;
BlendMode: TRenderType; Angle: Single; Alpha: Byte;
CenterX: Double; CenterY: Double;
Scale: Single);
procedure DXDraw_Paint(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; var BlurImageArr: TBlurImageArr; BlurImage: Boolean;
TextureFilter: TD2DTextureFilter;
MirrorFlip: TRenderMirrorFlipSet;
BlendMode: TRenderType;
Angle: Single;
Alpha: Byte;
CenterX: Double; CenterY: Double);
procedure DXDraw_Render(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; var BlurImageArr: TBlurImageArr; BlurImage: Boolean;
TextureFilter: TD2DTextureFilter;
MirrorFlip: TRenderMirrorFlipSet;
BlendMode: TRenderType;
Angle: Single;
Alpha: Byte;
CenterX: Double; CenterY: Double;
Scale: Single;
WaveType: TWaveType;
Amplitude: Integer; AmpLength: Integer; Phase: Integer);
{$ENDIF}
 
implementation
 
uses DXConsts{$IFDEF DXR_deprecated}, DXRender{$ENDIF}, D3DUtils;
 
function DXDirectDrawEnumerate(lpCallback: {$IFDEF UNICODE}TDDEnumCallbackW{$ELSE}TDDEnumCallbackA{$ENDIF};
lpContext: Pointer): HRESULT;
uses DXConsts, DXRender;
function DXDirectDrawEnumerate(lpCallback: TDDEnumCallbackA;
lpContext: Pointer): HRESULT;
type
TDirectDrawEnumerate = function(lpCallback: {$IFDEF UNICODE}TDDEnumCallbackW{$ELSE}TDDEnumCallbackA{$ENDIF};
TDirectDrawEnumerate = function(lpCallback: TDDEnumCallbackA;
lpContext: Pointer): HRESULT; stdcall;
begin
Result := TDirectDrawEnumerate(DXLoadLibrary('DDraw.dll', {$IFDEF UNICODE}'DirectDrawEnumerateW'{$ELSE}'DirectDrawEnumerateA'{$ENDIF}))
Result := TDirectDrawEnumerate(DXLoadLibrary('DDraw.dll', 'DirectDrawEnumerateA'))
(lpCallback, lpContext);
end;
 
var
DirectDrawDrivers: TDirectXDrivers;
{$IFDEF _DMO_}DirectDrawDriversEx: TDirectXDriversEx;{$ENDIF}
D2D: TD2D = nil; {for internal use only, }
RenderError: Boolean = false;
 
function EnumDirectDrawDrivers: TDirectXDrivers;
 
function DDENUMCALLBACK(lpGuid: PGUID; lpstrDescription: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF};
lpstrModule: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF}; lpContext: Pointer): BOOL; stdcall;
function DDENUMCALLBACK(lpGuid: PGUID; lpstrDescription: LPCSTR;
lpstrModule: LPCSTR; lpContext: Pointer): BOOL; stdcall;
begin
Result := True;
with TDirectXDriver.Create(TDirectXDrivers(lpContext)) do
2371,10 → 932,10
end;
 
begin
if DirectDrawDrivers = nil then
if DirectDrawDrivers=nil then
begin
DirectDrawDrivers := TDirectXDrivers.Create;
try
try
DXDirectDrawEnumerate(@DDENUMCALLBACK, DirectDrawDrivers);
except
DirectDrawDrivers.Free;
2385,45 → 946,6
Result := DirectDrawDrivers;
end;
 
{$IFDEF _DMO_}
function EnumDirectDrawDriversEx: TDirectXDriversEx;
 
function DDENUMCALLBACKEX(lpGuid: PGUID; lpstrDescription: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF};
lpDriverName: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF}; lpContext: Pointer; iMonitor: HMonitor): BOOL; stdcall;
var
X: TDirectXDriverEx;
begin
Result := True;
X := TDirectXDriverEx(DirectDrawDriversEx.Add);
with X do
begin
Guid := lpGuid;
Description := lpstrDescription;
Monitor := iMonitor;
DriverName := lpDriverName;
//GetPhysicalMonitorsFromHMONITOR()
end;
end;
 
//var
// DevMode: TDeviceMode;
begin
if DirectDrawDriversEx = nil then DirectDrawDriversEx := TDirectXDriversEx.Create;
if Assigned(DirectDrawDriversEx) then
begin
//FMonitors.Clear;
try
//FillChar(DevMode, SizeOf(TDeviceMode), 0);
if DirectDrawEnumerateEx(@DDENUMCALLBACKEX, nil{DeviceContext}, DDENUM_ATTACHEDSECONDARYDEVICES or DDENUM_DETACHEDSECONDARYDEVICES or DDENUM_NONDISPLAYDEVICES) = DD_OK then;
except
DirectDrawDriversEx.Free; DirectDrawDriversEx := nil;
raise;
end;
end;
Result := DirectDrawDriversEx;
end;
{$ENDIF}
 
function ClipRect(var DestRect: TRect; const DestRect2: TRect): Boolean;
begin
with DestRect do
2511,13 → 1033,11
FPalettes := TList.Create;
FSurfaces := TList.Create;
 
{$IFDEF D3D_deprecated}
if DirectX7Mode then
begin {$ENDIF}
begin
{ DirectX 7 }
if TDirectDrawCreateEx(DXLoadLibrary('DDraw.dll', 'DirectDrawCreateEx'))(GUID, FIDDraw7, IID_IDirectDraw7, nil) <> DD_OK then
if TDirectDrawCreateEx(DXLoadLibrary('DDraw.dll', 'DirectDrawCreateEx')) (GUID, FIDDraw7, IID_IDirectDraw7, nil)<>DD_OK then
raise EDirectDrawError.CreateFmt(SCannotInitialized, [SDirectDraw]);
{$IFDEF D3D_deprecated}
try
FIDDraw := FIDDraw7 as IDirectDraw;
FIDDraw4 := FIDDraw7 as IDirectDraw4;
2524,10 → 1044,9
except
raise EDirectDrawError.Create(SSinceDirectX7);
end;
{$ENDIF}
{$IFDEF D3D_deprecated}end else
end else
begin
if TDirectDrawCreate(DXLoadLibrary('DDraw.dll', 'DirectDrawCreate'))(GUID, FIDDraw, nil) <> DD_OK then
if TDirectDrawCreate(DXLoadLibrary('DDraw.dll', 'DirectDrawCreate')) (GUID, FIDDraw, nil)<>DD_OK then
raise EDirectDrawError.CreateFmt(SCannotInitialized, [SDirectDraw]);
try
FIDDraw4 := FIDDraw as IDirectDraw4;
2534,23 → 1053,23
except
raise EDirectDrawError.Create(SSinceDirectX6);
end;
end;{$ENDIF}
end;
 
FDriverCaps.dwSize := SizeOf(FDriverCaps);
FHELCaps.dwSize := SizeOf(FHELCaps);
{$IFDEF D3D_deprecated}FIDDraw{$ELSE}FIDDraw7{$ENDIF}.GetCaps(@FDriverCaps, @FHELCaps);
FIDDraw.GetCaps(FDriverCaps, FHELCaps);
end;
 
destructor TDirectDraw.Destroy;
begin
while SurfaceCount > 0 do
Surfaces[SurfaceCount - 1].Free;
while SurfaceCount>0 do
Surfaces[SurfaceCount-1].Free;
 
while PaletteCount > 0 do
Palettes[PaletteCount - 1].Free;
while PaletteCount>0 do
Palettes[PaletteCount-1].Free;
 
while ClipperCount > 0 do
Clippers[ClipperCount - 1].Free;
while ClipperCount>0 do
Clippers[ClipperCount-1].Free;
 
FSurfaces.Free;
FPalettes.Free;
2563,13 → 1082,6
Result := EnumDirectDrawDrivers;
end;
 
{$IFDEF _DMO_}
class function TDirectDraw.DriversEx: TDirectXDriversEx;
begin
Result := EnumDirectDrawDriversEx;
end;
{$ENDIF}
 
function TDirectDraw.GetClipper(Index: Integer): TDirectDrawClipper;
begin
Result := FClippers[Index];
2580,17 → 1092,17
Result := FClippers.Count;
end;
 
function TDirectDraw.GetDisplayMode: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
function TDirectDraw.GetDisplayMode: TDDSurfaceDesc;
begin
Result.dwSize := SizeOf(Result);
DXResult := {$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.GetDisplayMode(Result);
if DXResult <> DD_OK then
DXResult := IDraw.GetDisplayMode(Result);
if DXResult<>DD_OK then
FillChar(Result, SizeOf(Result), 0);
end;
{$IFDEF D3D_deprecated}
 
function TDirectDraw.GetIDDraw: IDirectDraw;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDraw
else
Result := nil;
2598,24 → 1110,24
 
function TDirectDraw.GetIDDraw4: IDirectDraw4;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDraw4
else
Result := nil;
end;
{$ENDIF}
 
function TDirectDraw.GetIDDraw7: IDirectDraw7;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDraw7
else
Result := nil;
end;
{$IFDEF D3D_deprecated}
 
function TDirectDraw.GetIDraw: IDirectDraw;
begin
Result := IDDraw;
if Result = nil then
if Result=nil then
raise EDirectDrawError.CreateFmt(SNotMade, ['IDirectDraw']);
end;
 
2622,14 → 1134,14
function TDirectDraw.GetIDraw4: IDirectDraw4;
begin
Result := IDDraw4;
if Result = nil then
if Result=nil then
raise EDirectDrawError.CreateFmt(SNotMade, ['IDirectDraw4']);
end;
{$ENDIF}
 
function TDirectDraw.GetIDraw7: IDirectDraw7;
begin
Result := IDDraw7;
if Result = nil then
if Result=nil then
raise EDirectDrawError.CreateFmt(SNotMade, ['IDirectDraw7']);
end;
 
2674,9 → 1186,9
begin
IDDPalette := nil;
 
FDDraw.DXResult := FDDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.CreatePalette(Caps, @Entries, TempPalette, nil);
FDDraw.DXResult := FDDraw.IDraw.CreatePalette(Caps, @Entries, TempPalette, nil);
FDXResult := FDDraw.DXResult;
Result := FDDraw.DXResult = DD_OK;
Result := FDDraw.DXResult=DD_OK;
if Result then
IDDPalette := TempPalette;
end;
2708,7 → 1220,7
DIB := TDIB.Create;
try
DIB.LoadFromStream(Stream);
if DIB.Size > 0 then
if DIB.Size>0 then
LoadFromDIB(DIB);
finally
DIB.Free;
2718,10 → 1230,10
function TDirectDrawPalette.GetEntries(StartIndex, NumEntries: Integer;
var Entries): Boolean;
begin
if IDDPalette <> nil then
if IDDPalette<>nil then
begin
DXResult := IPalette.GetEntries(0, StartIndex, NumEntries, @Entries);
Result := DXResult = DD_OK;
Result := DXResult=DD_OK;
end else
Result := False;
end;
2733,7 → 1245,7
 
function TDirectDrawPalette.GetIDDPalette: IDirectDrawPalette;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDPalette
else
Result := nil;
2742,7 → 1254,7
function TDirectDrawPalette.GetIPalette: IDirectDrawPalette;
begin
Result := IDDPalette;
if Result = nil then
if Result=nil then
raise EDirectDrawPaletteError.CreateFmt(SNotMade, ['IDirectDrawPalette']);
end;
 
2749,10 → 1261,10
function TDirectDrawPalette.SetEntries(StartIndex, NumEntries: Integer;
const Entries): Boolean;
begin
if IDDPalette <> nil then
if IDDPalette<>nil then
begin
DXResult := IPalette.SetEntries(0, StartIndex, NumEntries, @Entries);
Result := DXResult = DD_OK;
Result := DXResult=DD_OK;
end else
Result := False;
end;
2764,7 → 1276,7
 
procedure TDirectDrawPalette.SetIDDPalette(Value: IDirectDrawPalette);
begin
if FIDDPalette = Value then Exit;
if FIDDPalette=Value then Exit;
FIDDPalette := Value;
end;
 
2776,8 → 1288,8
FDDraw := ADirectDraw;
FDDraw.FClippers.Add(Self);
 
FDDraw.DXResult := FDDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.CreateClipper(0, FIDDClipper, nil);
if FDDraw.DXResult <> DD_OK then
FDDraw.DXResult := FDDraw.IDraw.CreateClipper(0, FIDDClipper, nil);
if FDDraw.DXResult<>DD_OK then
raise EDirectDrawClipperError.CreateFmt(SCannotMade, [SDirectDrawClipper]);
end;
 
2789,7 → 1301,7
 
function TDirectDrawClipper.GetIDDClipper: IDirectDrawClipper;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDClipper
else
Result := nil;
2798,7 → 1310,7
function TDirectDrawClipper.GetIClipper: IDirectDrawClipper;
begin
Result := IDDClipper;
if Result = nil then
if Result=nil then
raise EDirectDrawClipperError.CreateFmt(SNotMade, ['IDirectDrawClipper']);
end;
 
2812,7 → 1324,7
BoundsRect: TRect;
begin
BoundsRect := Rect(MaxInt, MaxInt, -MaxInt, -MaxInt);
for i := Low(Rects) to High(Rects) do
for i:=Low(Rects) to High(Rects) do
begin
with BoundsRect do
begin
2820,21 → 1332,21
Right := Max(Rects[i].Right, Right);
Top := Min(Rects[i].Top, Top);
Bottom := Max(Rects[i].Bottom, Bottom);
end;
end;
end;
 
GetMem(RgnData, SizeOf(TRgnDataHeader) + SizeOf(TRect) * (High(Rects) - Low(Rects) + 1));
GetMem(RgnData, SizeOf(TRgnDataHeader)+SizeOf(TRect)*(High(Rects)-Low(Rects)+1));
try
with RgnData^.rdh do
begin
dwSize := SizeOf(TRgnDataHeader);
iType := RDH_RECTANGLES;
nCount := High(Rects) - Low(Rects) + 1;
nRgnSize := nCount * SizeOf(TRect);
nCount := High(Rects)-Low(Rects)+1;
nRgnSize := nCount*SizeOf(TRect);
rcBound := BoundsRect;
end;
for i := Low(Rects) to High(Rects) do
PArrayRect(@RgnData^.Buffer)^[i - Low(Rects)] := Rects[i];
for i:=Low(Rects) to High(Rects) do
PArrayRect(@RgnData^.Buffer)^[i-Low(Rects)] := Rects[i];
DXResult := IClipper.SetClipList(RgnData, 0);
finally
FreeMem(RgnData);
2848,7 → 1360,7
 
procedure TDirectDrawClipper.SetIDDClipper(Value: IDirectDrawClipper);
begin
if FIDDClipper = Value then Exit;
if FIDDClipper=Value then Exit;
FIDDClipper := Value;
end;
 
2869,17 → 1381,17
 
procedure TDirectDrawSurfaceCanvas.CreateHandle;
begin
FSurface.DXResult := FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetDC(FDC);
if FSurface.DXResult = DD_OK then
FSurface.DXResult := FSurface.ISurface.GetDC(FDC);
if FSurface.DXResult=DD_OK then
Handle := FDC;
end;
 
procedure TDirectDrawSurfaceCanvas.Release;
begin
if (FSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) and (FDC <> 0) then
if (FSurface.IDDSurface<>nil) and (FDC<>0) then
begin
Handle := 0;
FSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF}.ReleaseDC(FDC);
FSurface.IDDSurface.ReleaseDC(FDC);
FDC := 0;
end;
end;
2891,21 → 1403,19
inherited Create;
FDDraw := ADirectDraw;
FDDraw.FSurfaces.Add(Self);
DIB_COLMATCH := TDIB.Create;
end;
 
destructor TDirectDrawSurface.Destroy;
begin
DIB_COLMATCH.Free;
FCanvas.Free;
{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil;
IDDSurface := nil;
FDDraw.FSurfaces.Remove(Self);
inherited Destroy;
end;
{$IFDEF D3D_deprecated}
 
function TDirectDrawSurface.GetIDDSurface: IDirectDrawSurface;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDSurface
else
Result := nil;
2913,24 → 1423,24
 
function TDirectDrawSurface.GetIDDSurface4: IDirectDrawSurface4;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDSurface4
else
Result := nil;
end;
{$ENDIF}
 
function TDirectDrawSurface.GetIDDSurface7: IDirectDrawSurface7;
begin
if Self <> nil then
if Self<>nil then
Result := FIDDSurface7
else
Result := nil;
end;
{$IFDEF D3D_deprecated}
 
function TDirectDrawSurface.GetISurface: IDirectDrawSurface;
begin
Result := IDDSurface;
if Result = nil then
if Result=nil then
raise EDirectDrawSurfaceError.CreateFmt(SNotMade, ['IDirectDrawSurface']);
end;
 
2937,23 → 1447,23
function TDirectDrawSurface.GetISurface4: IDirectDrawSurface4;
begin
Result := IDDSurface4;
if Result = nil then
if Result=nil then
raise EDirectDrawSurfaceError.CreateFmt(SNotMade, ['IDirectDrawSurface4']);
end;
{$ENDIF}
 
function TDirectDrawSurface.GetISurface7: IDirectDrawSurface7;
begin
Result := IDDSurface7;
if Result = nil then
if Result=nil then
raise EDirectDrawSurfaceError.CreateFmt(SNotMade, ['IDirectDrawSurface7']);
end;
{$IFDEF D3D_deprecated}
 
procedure TDirectDrawSurface.SetIDDSurface(Value: IDirectDrawSurface);
var
Clipper: IDirectDrawClipper;
begin
if Value = nil then Exit;
if Value as IDirectDrawSurface = FIDDSurface then Exit;
if Value=nil then Exit;
if Value as IDirectDrawSurface=FIDDSurface then Exit;
 
FIDDSurface := nil;
FIDDSurface4 := nil;
2965,18 → 1475,18
FLockCount := 0;
FillChar(FSurfaceDesc, SizeOf(FSurfaceDesc), 0);
 
if Value <> nil then
if Value<>nil then
begin
FIDDSurface := Value as IDirectDrawSurface;
FIDDSurface4 := Value as IDirectDrawSurface4;
if FDDraw.FIDDraw7 <> nil then FIDDSurface7 := Value as IDirectDrawSurface7;
if FDDraw.FIDDraw7<>nil then FIDDSurface7 := Value as IDirectDrawSurface7;
 
FHasClipper := (FIDDSurface.GetClipper(Clipper) = DD_OK) and (Clipper <> nil);
FHasClipper := (FIDDSurface.GetClipper(Clipper)=DD_OK) and (Clipper<>nil);
 
FSurfaceDesc.dwSize := SizeOf(FSurfaceDesc);
FIDDSurface.GetSurfaceDesc(FSurfaceDesc);
 
if FDDraw.DriverCaps.dwCaps2 and DDCAPS2_PRIMARYGAMMA <> 0 then
if FDDraw.DriverCaps.dwCaps2 and DDCAPS2_PRIMARYGAMMA<>0 then
FIDDSurface.QueryInterface(IID_IDirectDrawGammaControl, FGammaControl);
end;
end;
2983,55 → 1493,26
 
procedure TDirectDrawSurface.SetIDDSurface4(Value: IDirectDrawSurface4);
begin
if Value = nil then
if Value=nil then
SetIDDSurface(nil)
else
SetIDDSurface(Value as IDirectDrawSurface);
end;
{$ENDIF}
 
procedure TDirectDrawSurface.SetIDDSurface7(Value: IDirectDrawSurface7);
{$IFNDEF D3D_deprecated}
var
Clipper: IDirectDrawClipper;
{$ENDIF}
begin
{$IFDEF D3D_deprecated}
if Value = nil then
if Value=nil then
SetIDDSurface(nil)
else
SetIDDSurface(Value as IDirectDrawSurface);
{$ELSE}
if Value = nil then Exit;
if Value as IDirectDrawSurface7 = FIDDSurface7 then Exit;
FIDDSurface7 := nil;
 
FStretchDrawClipper := nil;
FGammaControl := nil;
FHasClipper := False;
FLockCount := 0;
FillChar(FSurfaceDesc, SizeOf(FSurfaceDesc), 0);
 
if Value <> nil then
begin
if FDDraw.FIDDraw7 <> nil then FIDDSurface7 := Value as IDirectDrawSurface7;
 
FHasClipper := (FIDDSurface7.GetClipper(Clipper) = DD_OK) and (Clipper <> nil);
 
FSurfaceDesc.dwSize := SizeOf(FSurfaceDesc);
{$IFDEF D3D_deprecated}FIDDSurface{$ELSE}FIDDSurface7{$ENDIF}.GetSurfaceDesc(FSurfaceDesc);
 
if FDDraw.DriverCaps.dwCaps2 and DDCAPS2_PRIMARYGAMMA <> 0 then
{$IFDEF D3D_deprecated}FIDDSurface{$ELSE}FIDDSurface7{$ENDIF}.QueryInterface(IID_IDirectDrawGammaControl, FGammaControl);
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.Assign(Source: TPersistent);
var
TempSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF};
TempSurface: IDirectDrawSurface;
begin
if Source = nil then
{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil
if Source=nil then
IDDSurface := nil
else if Source is TGraphic then
LoadFromGraphic(TGraphic(Source))
else if Source is TPicture then
3038,14 → 1519,14
LoadFromGraphic(TPicture(Source).Graphic)
else if Source is TDirectDrawSurface then
begin
if TDirectDrawSurface(Source).{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} = nil then
{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil
if TDirectDrawSurface(Source).IDDSurface=nil then
IDDSurface := nil
else begin
FDDraw.DXResult := FDDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.DuplicateSurface(TDirectDrawSurface(Source).{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF},
FDDraw.DXResult := FDDraw.IDraw.DuplicateSurface(TDirectDrawSurface(Source).IDDSurface,
TempSurface);
if FDDraw.DXResult = 0 then
if FDDraw.DXResult=0 then
begin
{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := TempSurface;
IDDSurface := TempSurface;
end;
end;
end else
3054,31 → 1535,11
 
procedure TDirectDrawSurface.AssignTo(Dest: TPersistent);
begin
if Dest is TBitmap then
begin
try
TBitmap(Dest).PixelFormat := pf24bit;
if BitCount >= 24 then {please accept the Alphachannel too}
TBitmap(Dest).PixelFormat := pf32bit;
TBitmap(Dest).Width := Width;
TBitmap(Dest).Height := Height;
TBitmap(Dest).Canvas.CopyRect(Rect(0, 0, TBitmap(Dest).Width, TBitmap(Dest).Height), Canvas, ClientRect);
finally
Canvas.Release;
end
end
else
if Dest is TDIB then
begin
try
if BitCount >= 24 then {please accept the Alphachannel too}
TDIB(Dest).SetSize(Width, Height, BitCount)
else
TDIB(Dest).SetSize(Width, Height, 24);
TDIB(Dest).Canvas.CopyRect(Rect(0, 0, TDIB(Dest).Width, TDIB(Dest).Height), Canvas, ClientRect);
finally
Canvas.Release;
end
TDIB(Dest).SetSize(Width, Height, 24);
TDIB(Dest).Canvas.CopyRect(Rect(0, 0, TDIB(Dest).Width, TDIB(Dest).Height), Canvas, ClientRect);
Canvas.Release;
end else
inherited AssignTo(Dest);
end;
3086,10 → 1547,10
function TDirectDrawSurface.Blt(const DestRect, SrcRect: TRect; Flags: DWORD;
const DF: TDDBltFX; Source: TDirectDrawSurface): Boolean;
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if IDDSurface<>nil then
begin
DXResult := {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF}.Blt(@DestRect, Source.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF}, @SrcRect, DWORD(Flags), @DF);
Result := DXResult = DD_OK;
DXResult := ISurface.Blt(DestRect, Source.IDDSurface, SrcRect, DWORD(Flags), DF);
Result := DXResult=DD_OK;
end else
Result := False;
end;
3097,10 → 1558,10
function TDirectDrawSurface.BltFast(X, Y: Integer; const SrcRect: TRect;
Flags: DWORD; Source: TDirectDrawSurface): Boolean;
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if IDDSurface<>nil then
begin
DXResult := {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF}.BltFast(X, Y, Source.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF}, @SrcRect, DWORD(Flags));
Result := DXResult = DD_OK;
DXResult := ISurface.BltFast(X, Y, Source.IDDSurface, SrcRect, DWORD(Flags));
Result := DXResult=DD_OK;
end else
Result := False;
end;
3107,25 → 1568,29
 
function TDirectDrawSurface.ColorMatch(Col: TColor): Integer;
var
DIB: TDIB;
i, oldc: Integer;
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if IDDSurface<>nil then
begin
oldc := Pixels[0, 0];
 
DIB := TDIB.Create;
try
i := ColorToRGB(Col);
DIB_COLMATCH.SetSize(1, 1, 8);
DIB_COLMATCH.ColorTable[0] := RGBQuad(GetRValue(i), GetGValue(i), GetBValue(i));
DIB_COLMATCH.UpdatePalette;
DIB_COLMATCH.Pixels[0, 0] := 0;
DIB.SetSize(1, 1, 8);
DIB.ColorTable[0] := RGBQuad(GetRValue(i), GetGValue(i), GetBValue(i));
DIB.UpdatePalette;
DIB.Pixels[0, 0] := 0;
 
with Canvas do
try
Draw(0, 0, DIB_COLMATCH);
finally
begin
Draw(0, 0, DIB);
Release;
end;
 
finally
DIB.Free;
end;
Result := Pixels[0, 0];
Pixels[0, 0] := oldc;
end else
3132,8 → 1597,7
Result := 0;
end;
 
{$IFDEF D3D_deprecated}
function TDirectDrawSurface.CreateSurface(SurfaceDesc: TDDSurfaceDesc): Boolean;
function TDirectDrawSurface.CreateSurface(const SurfaceDesc: TDDSurfaceDesc): Boolean;
var
TempSurface: IDirectDrawSurface;
begin
3141,7 → 1605,7
 
FDDraw.DXResult := FDDraw.IDraw.CreateSurface(SurfaceDesc, TempSurface, nil);
FDXResult := FDDraw.DXResult;
Result := FDDraw.DXResult = DD_OK;
Result := FDDraw.DXResult=DD_OK;
if Result then
begin
IDDSurface := TempSurface;
3148,19 → 1612,19
TransparentColor := 0;
end;
end;
{$ENDIF}
{$IFDEF VER4UP}
function TDirectDrawSurface.CreateSurface(SurfaceDesc: TDDSurfaceDesc2): Boolean;
 
{$IFDEF DelphiX_Spt4}
function TDirectDrawSurface.CreateSurface(const SurfaceDesc: TDDSurfaceDesc2): Boolean;
var
TempSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface4{$ELSE}IDirectDrawSurface7{$ENDIF};
TempSurface4: IDirectDrawSurface4;
begin
{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil;
FDDraw.DXResult := FDDraw.{$IFDEF D3D_deprecated}IDraw4{$ELSE}IDraw7{$ENDIF}.CreateSurface(SurfaceDesc, TempSurface, nil);
IDDSurface := nil;
FDDraw.DXResult := FDDraw.IDraw4.CreateSurface(SurfaceDesc, TempSurface4, nil);
FDXResult := FDDraw.DXResult;
Result := FDDraw.DXResult = DD_OK;
Result := FDDraw.DXResult=DD_OK;
if Result then
begin
{$IFDEF D3D_deprecated}IDDSurface4{$ELSE}IDDSurface7{$ENDIF} := TempSurface;
IDDSurface4 := TempSurface4;
TransparentColor := 0;
end;
end;
3170,46 → 1634,35
Transparent: Boolean);
const
BltFastFlags: array[Boolean] of Integer =
(DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT, DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT);
(DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT, DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT);
BltFlags: array[Boolean] of Integer =
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
{$IFDEF DXR_deprecated}var
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
var
DestRect: TRect;
DF: TDDBltFX;
Clipper: IDirectDrawClipper;
i: Integer;{$ENDIF}
i: Integer;
begin
if Source <> nil then
if Source<>nil then
begin
if (X > Width) or (Y > Height) then Exit;
{$IFDEF DrawHWAcc}
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then
if (X>Width) or (Y>Height) then Exit;
 
if (SrcRect.Left>SrcRect.Right) or (SrcRect.Top>SrcRect.Bottom) then
begin
{$IFDEF VER4UP}
D2D.D2DRenderDrawDDSXY(Source, X, Y, SrcRect, Transparent, 0, rtDraw{$IFNDEF VER4UP}, $FF{$ENDIF});
{$ELSE}
D2D.D2DRenderDDS(Source, SrcRect, Bounds(X, Y, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top), Transparent, 0, rtDraw, $FF);
{$ENDIF}
Exit;
end;
{$ENDIF DrawHWAcc}
{$IFDEF DXR_deprecated}
if (SrcRect.Left > SrcRect.Right) or (SrcRect.Top > SrcRect.Bottom) then
begin
{ Mirror }
if ((X + Abs(SrcRect.Left - SrcRect.Right)) <= 0) or
((Y + Abs(SrcRect.Top - SrcRect.Bottom)) <= 0) then Exit;
if ((X+Abs(SrcRect.Left-SrcRect.Right))<=0) or
((Y+Abs(SrcRect.Top-SrcRect.Bottom))<=0) then Exit;
 
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
 
if SrcRect.Left > SrcRect.Right then
if SrcRect.Left>SrcRect.Right then
begin
i := SrcRect.Left; SrcRect.Left := SrcRect.Right; SrcRect.Right := i;
DF.dwDDFX := DF.dwDDFX or DDBLTFX_MIRRORLEFTRIGHT;
end;
 
if SrcRect.Top > SrcRect.Bottom then
if SrcRect.Top>SrcRect.Bottom then
begin
i := SrcRect.Top; SrcRect.Top := SrcRect.Bottom; SrcRect.Bottom := i;
DF.dwDDFX := DF.dwDDFX or DDBLTFX_MIRRORUPDOWN;
3216,30 → 1669,30
end;
 
with SrcRect do
DestRect := Bounds(X, Y, Right - Left, Bottom - Top);
DestRect := Bounds(X, Y, Right-Left, Bottom-Top);
 
if ClipRect2(DestRect, SrcRect, ClientRect, Source.ClientRect) then
begin
if DF.dwDDFX and DDBLTFX_MIRRORLEFTRIGHT <> 0 then
if DF.dwDDFX and DDBLTFX_MIRRORLEFTRIGHT<>0 then
begin
i := SrcRect.Left;
SrcRect.Left := Source.Width - SrcRect.Right;
SrcRect.Right := Source.Width - i;
SrcRect.Left := Source.Width-SrcRect.Right;
SrcRect.Right := Source.Width-i;
end;
 
if DF.dwDDFX and DDBLTFX_MIRRORUPDOWN <> 0 then
if DF.dwDDFX and DDBLTFX_MIRRORUPDOWN<>0 then
begin
i := SrcRect.Top;
SrcRect.Top := Source.Height - SrcRect.Bottom;
SrcRect.Bottom := Source.Height - i;
SrcRect.Top := Source.Height-SrcRect.Bottom;
SrcRect.Bottom := Source.Height-i;
end;
 
Blt(DestRect, SrcRect, BltFlags[Transparent] or DDBLT_DDFX, df, Source);
end;
end else
begin
with SrcRect do
DestRect := Bounds(X, Y, Right - Left, Bottom - Top);
DestRect := Bounds(X, Y, Right-Left, Bottom-Top);
 
if ClipRect2(DestRect, SrcRect, ClientRect, Source.ClientRect) then
begin
3251,10 → 1704,10
end else
begin
BltFast(DestRect.Left, DestRect.Top, SrcRect, BltFastFlags[Transparent], Source);
if DXResult = DDERR_BLTFASTCANTCLIP then
if DXResult=DDERR_BLTFASTCANTCLIP then
begin
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetClipper(Clipper);
if Clipper <> nil then FHasClipper := True;
ISurface.GetClipper(Clipper);
if Clipper<>nil then FHasClipper := True;
 
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
3263,33 → 1716,26
end;
end;
end;
{$ENDIF}
end;
end;
 
{$IFDEF VER4UP}
{$IFDEF DelphiX_Spt4}
procedure TDirectDrawSurface.Draw(X, Y: Integer; Source: TDirectDrawSurface; Transparent: Boolean);
const
BltFastFlags: array[Boolean] of Integer =
(DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT, DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT);
(DDBLTFAST_NOCOLORKEY or DDBLTFAST_WAIT, DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT);
BltFlags: array[Boolean] of Integer =
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
var
DestRect, SrcRect: TRect;
{$IFDEF DXR_deprecated}DF: TDDBltFX;
Clipper: IDirectDrawClipper;{$ENDIF}
DF: TDDBltFX;
Clipper: IDirectDrawClipper;
begin
if Source <> nil then
if Source<>nil then
begin
SrcRect := Source.ClientRect;
DestRect := Bounds(X, Y, Source.Width, Source.Height);
{$IFDEF DrawHWAcc}
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderDDS(Source, ZeroRect, DestRect, Transparent, 0, rtDraw{$IFNDEF VER4UP}, $FF{$ENDIF});
Exit;
end;
{$ENDIF DrawHWAcc}
{$IFDEF DXR_deprecated}
 
if ClipRect2(DestRect, SrcRect, ClientRect, Source.ClientRect) then
begin
if FHasClipper then
3300,10 → 1746,10
end else
begin
BltFast(DestRect.Left, DestRect.Top, SrcRect, BltFastFlags[Transparent], Source);
if DXResult = DDERR_BLTFASTCANTCLIP then
if DXResult=DDERR_BLTFASTCANTCLIP then
begin
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetClipper(Clipper);
if Clipper <> nil then FHasClipper := True;
ISurface.GetClipper(Clipper);
if Clipper<>nil then FHasClipper := True;
 
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
3311,7 → 1757,6
end;
end;
end;
{$ENDIF}
end;
end;
{$ENDIF}
3320,23 → 1765,17
Transparent: Boolean);
const
BltFlags: array[Boolean] of Integer =
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
{$IFDEF DXR_deprecated}var
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
var
DF: TDDBltFX;
OldClipper: IDirectDrawClipper;
Clipper: TDirectDrawClipper;{$ENDIF}
Clipper: TDirectDrawClipper;
begin
if Source <> nil then
if Source<>nil then
begin
if (DestRect.Bottom <= DestRect.Top) or (DestRect.Right <= DestRect.Left) then Exit;
if (SrcRect.Bottom <= SrcRect.Top) or (SrcRect.Right <= SrcRect.Left) then Exit;
{$IFDEF DrawHWAcc}
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderDDS(Source, SrcRect, DestRect, Transparent, 0, rtDraw{$IFNDEF VER4UP}, $FF{$ENDIF});
Exit;
end;
{$ENDIF DrawHWAcc}
{$IFDEF DXR_deprecated}
if (DestRect.Bottom<=DestRect.Top) or (DestRect.Right<=DestRect.Left) then Exit;
if (SrcRect.Bottom<=SrcRect.Top) or (SrcRect.Right<=SrcRect.Left) then Exit;
 
if FHasClipper then
begin
DF.dwsize := SizeOf(DF);
3344,7 → 1783,7
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
end else
begin
if FStretchDrawClipper = nil then
if FStretchDrawClipper=nil then
begin
Clipper := TDirectDrawClipper.Create(DDraw);
try
3355,39 → 1794,35
end;
end;
 
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetClipper(OldClipper);
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetClipper(FStretchDrawClipper);
ISurface.GetClipper(OldClipper);
ISurface.SetClipper(FStretchDrawClipper);
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetClipper(nil);
ISurface.SetClipper(nil);
end;
{$ENDIF}
end;
end;
 
{$IFDEF VER4UP}
{$IFDEF DelphiX_Spt4}
procedure TDirectDrawSurface.StretchDraw(const DestRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean);
const
BltFlags: array[Boolean] of Integer = (DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
BltFlags: array[Boolean] of Integer =
 
(DDBLT_WAIT, DDBLT_KEYSRC or DDBLT_WAIT);
var
{$IFDEF DXR_deprecated}DF: TDDBltFX;
DF: TDDBltFX;
OldClipper: IDirectDrawClipper;
Clipper: TDirectDrawClipper;{$ENDIF}
Clipper: TDirectDrawClipper;
SrcRect: TRect;
begin
if Source <> nil then
begin
if Source<>nil then
begin
if (DestRect.Bottom <= DestRect.Top) or (DestRect.Right <= DestRect.Left) then Exit;
if (DestRect.Bottom<=DestRect.Top) or (DestRect.Right<=DestRect.Left) then Exit;
SrcRect := Source.ClientRect;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderDDS(Source, ZeroRect, DestRect, Transparent, 0, rtDraw{$IFNDEF VER4UP}, $FF{$ENDIF});
Exit;
end;
{$IFDEF DXR_deprecated}
if {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetClipper(OldClipper) = DD_OK then
if ISurface.GetClipper(OldClipper)=DD_OK then
begin
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
3394,7 → 1829,7
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
end else
begin
if FStretchDrawClipper = nil then
if FStretchDrawClipper=nil then
begin
Clipper := TDirectDrawClipper.Create(DDraw);
try
3405,507 → 1840,331
end;
end;
 
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetClipper(FStretchDrawClipper);
ISurface.SetClipper(FStretchDrawClipper);
try
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
Blt(DestRect, SrcRect, BltFlags[Transparent], df, Source);
finally
{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetClipper(nil);
ISurface.SetClipper(nil);
end;
end;
{$ENDIF}
end;
end;
end;
{$ENDIF}
 
procedure TDirectDrawSurface.DrawAdd(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderDDS(Source, SrcRect, DestRect, Transparent, 0, rtAdd, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
 
dxrCopyRectBlend(DestSurface, SrcSurface,
DestRect, SrcRect, Blend, Alpha, Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawAlpha(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderDDS(Source, SrcRect, DestRect, Transparent, 0, rtBlend, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
 
dxrCopyRectBlend(DestSurface, SrcSurface,
DestRect, SrcRect, Blend, Alpha, Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawSub(const DestRect, SrcRect: TRect; Source: TDirectDrawSurface;
Transparent: Boolean; Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderDDS(Source, SrcRect, DestRect, Transparent, 0, rtSub, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
 
dxrCopyRectBlend(DestSurface, SrcSurface,
DestRect, SrcRect, Blend, Alpha, Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawAlphaCol(const DestRect, SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; Color, Alpha: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if Alpha <= 0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderColDDS(Source, SrcRect, DestRect, Transparent, 0, Color, rtBlend, Alpha);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color DrawAlpha
Self.DrawAlpha(DestRect, SrcRect, Source, Transparent, Alpha);
end;
 
procedure TDirectDrawSurface.DrawSubCol(const DestRect, SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; Color, Alpha: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if Alpha <= 0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderColDDS(Source, SrcRect, DestRect, Transparent, 0, Color, rtSub, Alpha);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color DrawSub
Self.DrawSub(DestRect, SrcRect, Source, Transparent, Alpha);
end;
 
procedure TDirectDrawSurface.DrawAddCol(const DestRect, SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; Color, Alpha: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if Alpha <= 0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderColDDS(Source, SrcRect, DestRect, Transparent, 0, Color, rtAdd, Alpha);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color DrawAdd
Self.DrawAdd(DestRect, SrcRect, Source, Transparent, Alpha);
 
end;
 
procedure TDirectDrawSurface.DrawRotate(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
DestSurface, SrcSurface: TDXR_Surface;{$ENDIF}
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateDDS(Source, SrcRect, X, Y, Width, Height, rtDraw, CenterX, CenterY, Angle, $FF, Transparent);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, round(Angle), DXR_BLEND_ONE1, 0,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, DXR_BLEND_ONE1, 0,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawRotateAdd(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single; Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle, Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend; {$ENDIF}
Blend: TDXR_Blend;
begin
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateDDS(Source, SrcRect, X, Y, Width, Height, rtAdd, CenterX, CenterY, Angle, Alpha, Transparent);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
 
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, round(Angle), Blend, Alpha,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawRotateAlpha(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single; Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle, Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend; {$ENDIF}
Blend: TDXR_Blend;
begin
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateDDS(Source, SrcRect, X, Y, Width, Height, rtBlend, CenterX, CenterY, Angle, Alpha, Transparent);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
 
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, round(Angle), Blend, Alpha,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawRotateSub(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: single; Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle, Alpha: Integer);
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateDDS(Source, SrcRect, X, Y, Width, Height, rtSub, CenterX, CenterY, Angle, Alpha, Transparent);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
 
dxrDrawRotateBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, CenterX, CenterY, round(Angle), Blend, Alpha,
X, Y, Width, Height, SrcRect, CenterX, CenterY, Angle, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawRotateCol(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Single; Color: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateModeColDDS(Source, X, Y, Width, Height, rtDraw, CenterX, CenterY, Angle, Color, $FF, Transparent);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color, moded DrawRotate
Self.DrawRotate(X, Y, Width, Height, SrcRect, Source, CenterX, CenterY, Transparent, Angle);
end;
 
procedure TDirectDrawSurface.DrawRotateAlphaCol(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Single; Color, Alpha: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateModeColDDS(Source, X, Y, Width, Height, rtBlend, CenterX, CenterY, Angle, Color, Alpha, Transparent);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color, moded DrawRotate
Self.DrawRotateAlpha(X, Y, Width, Height, SrcRect, Source, CenterX, CenterY, Transparent, Angle, Alpha);
end;
 
procedure TDirectDrawSurface.DrawRotateAddCol(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Single; Color, Alpha: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateModeColDDS(Source, X, Y, Width, Height, rtAdd, CenterX, CenterY, Angle, Color, Alpha, Transparent);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color, moded DrawRotate
Self.DrawRotateAdd(X, Y, Width, Height, SrcRect, Source, CenterX, CenterY, Transparent, Angle, Alpha);
end;
 
procedure TDirectDrawSurface.DrawRotateSubCol(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; CenterX, CenterY: Double; Transparent: Boolean; Angle: Single; Color, Alpha: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderRotateModeColDDS(Source, X, Y, Width, Height, rtSub, CenterX, CenterY, Angle, Color, Alpha, Transparent);
Exit;
end;
 
// If no hardware acceleration, falls back to non-color, moded DrawRotate
Self.DrawRotateSub(X, Y, Width, Height, SrcRect, Source, CenterX, CenterY, Transparent, Angle, Alpha);
end;
 
//waves
 
procedure TDirectDrawSurface.DrawWaveX(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
DestSurface, SrcSurface: TDXR_Surface;{$ENDIF}
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveXDDS(Source, X, Y, Width, Height, rtDraw, Transparent, amp, Len, ph{$IFNDEF VER4UP}, $FF{$ENDIF});
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
dxrDrawWaveXBlend(DestSurface, SrcSurface,
3912,237 → 2171,150
X, Y, Width, Height, SrcRect, amp, Len, ph, DXR_BLEND_ONE1, 0,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawWaveXAdd(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph, Alpha: Integer);
{$IFDEF DXR_deprecated}var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
var
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveXDDS(Source, X, Y, Width, Height, rtAdd, Transparent, amp, Len, ph, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1_ADD_ONE2;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_ONE2;
end;
 
dxrDrawWaveXBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, amp, Len, ph, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawWaveXAlpha(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph, Alpha: Integer);
{$IFDEF DXR_deprecated}
var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveXDDS(Source, X, Y, Width, Height, rtBlend, Transparent, amp, Len, ph, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE1;
end else
begin
Blend := DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2;
end;
 
dxrDrawWaveXBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, amp, Len, ph, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawWaveXSub(X, Y, Width, Height: Integer; const SrcRect: TRect;
Source: TDirectDrawSurface; Transparent: Boolean; amp, Len, ph, Alpha: Integer);
{$IFDEF DXR_deprecated}
var
Src_ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
Src_ddsd: TDDSurfaceDesc;
DestSurface, SrcSurface: TDXR_Surface;
Blend: TDXR_Blend;{$ENDIF}
Blend: TDXR_Blend;
begin
if Alpha <= 0 then Exit;
if Alpha<=0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if (Width=0) or (Height=0) then Exit;
if Source=nil then Exit;
if (Source.Width=0) or (Source.Height=0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveXDDS(Source, X, Y, Width, Height, rtSub, Transparent, amp, Len, ph, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
if dxrDDSurfaceLock2(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, Src_ddsd, SrcSurface) then
if dxrDDSurfaceLock2(Source.ISurface, Src_ddsd, SrcSurface) then
begin
try
if DestSurface.ColorType = DXR_COLORTYPE_INDEXED then
if DestSurface.ColorType=DXR_COLORTYPE_INDEXED then
begin
Blend := DXR_BLEND_ONE1;
end else
if Alpha >= 255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
if Alpha>=255 then
begin
Blend := DXR_BLEND_ONE2_SUB_ONE1;
end else
begin
Blend := DXR_BLEND_ONE2_SUB_SRCALPHA1;
end;
 
dxrDrawWaveXBlend(DestSurface, SrcSurface,
X, Y, Width, Height, SrcRect, amp, Len, ph, Blend, Alpha,
Transparent, Src_ddsd.ddckCKSrcBlt.dwColorSpaceLowValue);
finally
dxrDDSurfaceUnLock(Source.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, SrcSurface)
dxrDDSurfaceUnLock(Source.ISurface, SrcSurface)
end;
end;
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.DrawWaveYSub(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; Transparent: Boolean; amp,
Len, ph, Alpha: Integer);
begin
if Alpha <= 0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveYDDS(Source, X, Y, Width, Height, rtSub, Transparent, amp, Len, ph, Alpha);
Exit;
end;
end;
 
procedure TDirectDrawSurface.DrawWaveY(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; Transparent: Boolean; amp,
Len, ph: Integer);
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveYDDS(Source, X, Y, Width, Height, rtDraw, Transparent, amp, Len, ph{$IFNDEF VER4UP}, $FF{$ENDIF});
Exit;
end;
end;
 
procedure TDirectDrawSurface.DrawWaveYAdd(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; Transparent: Boolean; amp,
Len, ph, Alpha: Integer);
begin
if Alpha <= 0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveYDDS(Source, X, Y, Width, Height, rtAdd, Transparent, amp, Len, ph, Alpha);
Exit;
end;
end;
 
procedure TDirectDrawSurface.DrawWaveYAlpha(X, Y, Width, Height: Integer;
const SrcRect: TRect; Source: TDirectDrawSurface; Transparent: Boolean; amp,
Len, ph, Alpha: Integer);
begin
if Alpha <= 0 then Exit;
 
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Width = 0) or (Height = 0) then Exit;
if Source = nil then Exit;
if (Source.Width = 0) or (Source.Height = 0) then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderWaveYDDS(Source, X, Y, Width, Height, rtBlend, Transparent, amp, Len, ph, Alpha);
Exit;
end;
end;
 
procedure TDirectDrawSurface.Fill(DevColor: Longint);
var
DBltEx: TDDBltFX;
4164,77 → 2336,61
Blt(DestRect, TRect(nil^), DDBLT_COLORFILL or DDBLT_WAIT, DBltEx, nil);
end;
 
procedure TDirectDrawSurface.FillRectAdd(const DestRect: TRect; Color: TColor; Alpha: Byte);
{$IFDEF DXR_deprecated}var
DestSurface: TDXR_Surface;{$ENDIF}
procedure TDirectDrawSurface.FillRectAdd(const DestRect: TRect; Color: TColor);
var
DestSurface: TDXR_Surface;
begin
if Color and $FFFFFF = 0 then Exit;
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if Color and $FFFFFF=0 then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if SurfaceDesc.ddpfPixelFormat.dwFlags and (DDPF_PALETTEINDEXED1 or DDPF_PALETTEINDEXED2 or
DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8) <> 0 then Exit;
DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8)<>0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderFillRect(DestRect, ColorToRGB(Color), rtAdd, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
dxrFillRectColorBlend(DestSurface, DestRect, DXR_BLEND_ONE1_ADD_ONE2, ColorToRGB(Color));
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;
{$ENDIF}
end;
 
procedure TDirectDrawSurface.FillRectAlpha(const DestRect: TRect; Color: TColor;
Alpha: Integer);
{$IFDEF DXR_deprecated}var
DestSurface: TDXR_Surface;{$ENDIF}
var
DestSurface: TDXR_Surface;
begin
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if SurfaceDesc.ddpfPixelFormat.dwFlags and (DDPF_PALETTEINDEXED1 or DDPF_PALETTEINDEXED2 or
DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8) <> 0 then Exit;
DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8)<>0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderFillRect(DestRect, ColorToRGB(Color), rtBlend, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
dxrFillRectColorBlend(DestSurface, DestRect, DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2, ColorToRGB(Color) or (Byte(Alpha) shl 24));
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;{$ENDIF}
end;
end;
 
procedure TDirectDrawSurface.FillRectSub(const DestRect: TRect; Color: TColor; Alpha: Byte);
{$IFDEF DXR_deprecated}var
DestSurface: TDXR_Surface;{$ENDIF}
procedure TDirectDrawSurface.FillRectSub(const DestRect: TRect; Color: TColor);
var
DestSurface: TDXR_Surface;
begin
if Color and $FFFFFF = 0 then Exit;
if (Self.Width = 0) or (Self.Height = 0) then Exit;
if Color and $FFFFFF=0 then Exit;
if (Self.Width=0) or (Self.Height=0) then Exit;
if SurfaceDesc.ddpfPixelFormat.dwFlags and (DDPF_PALETTEINDEXED1 or DDPF_PALETTEINDEXED2 or
DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8) <> 0 then Exit;
DDPF_PALETTEINDEXED4 or DDPF_PALETTEINDEXED8)<>0 then Exit;
 
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then begin
D2D.D2DRenderFillRect(DestRect, ColorToRGB(Color), rtSub, Alpha);
Exit;
end;
{$IFDEF DXR_deprecated}
if dxrDDSurfaceLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface) then
if dxrDDSurfaceLock(ISurface, DestSurface) then
begin
try
dxrFillRectColorBlend(DestSurface, DestRect, DXR_BLEND_ONE2_SUB_ONE1, ColorToRGB(Color));
finally
dxrDDSurfaceUnLock({$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, DestSurface)
dxrDDSurfaceUnLock(ISurface, DestSurface)
end;
end;{$ENDIF}
end;
end;
 
function TDirectDrawSurface.GetBitCount: Integer;
4244,7 → 2400,7
 
function TDirectDrawSurface.GetCanvas: TDirectDrawSurfaceCanvas;
begin
if FCanvas = nil then
if FCanvas=nil then
FCanvas := TDirectDrawSurfaceCanvas.Create(Self);
Result := FCanvas;
end;
4267,27 → 2423,27
 
function TDirectDrawSurface.GetPixel(X, Y: Integer): Longint;
var
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
begin
Result := 0;
if ({$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) and (X >= 0) and (X < Width) and (Y >= 0) and (Y < Height) then
if (IDDSurface<>nil) and (X>=0) and (X<Width) and (Y>=0) and (Y<Height) then
if Lock(PRect(nil)^, ddsd) then
begin
try
case ddsd.ddpfPixelFormat.dwRGBBitCount of
1: Result := Integer(PByte(Integer(ddsd.lpSurface) +
Y * ddsd.lPitch + (X shr 3))^ and (1 shl (X and 7)) <> 0);
4: begin
if X and 1 = 0 then
Result := PByte(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + (X shr 1))^ shr 4
else
Result := PByte(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + (X shr 1))^ and $0F;
end;
8: Result := PByte(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X)^;
16: Result := PWord(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X * 2)^;
24: with PRGB(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X * 3)^ do
Result := R or (G shl 8) or (B shl 16);
32: Result := PInteger(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X * 4)^;
1 : Result := Integer(PByte(Integer(ddsd.lpSurface)+
Y*ddsd.lPitch+(X shr 3))^ and (1 shl (X and 7))<>0);
4 : begin
if X and 1=0 then
Result := PByte(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+(X shr 1))^ shr 4
else
Result := PByte(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+(X shr 1))^ and $0F;
end;
8 : Result := PByte(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X)^;
16: Result := PWord(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X*2)^;
24: with PRGB(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X*3)^ do
Result := R or (G shl 8) or (B shl 16);
32: Result := PInteger(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X*4)^;
end;
finally
UnLock;
4319,10 → 2475,10
var
Temp: TDIB;
begin
if AWidth = 0 then
AWidth := SrcRect.Right - SrcRect.Left;
if AHeight = 0 then
AHeight := SrcRect.Bottom - SrcRect.Top;
if AWidth=0 then
AWidth := SrcRect.Right-SrcRect.Left;
if AHeight=0 then
AHeight := SrcRect.Bottom-SrcRect.Top;
 
SetSize(AWidth, AHeight);
 
4330,18 → 2486,16
if Graphic is TDIB then
begin
with Canvas do
try
begin
StretchBlt(Handle, 0, 0, AWidth, AHeight, TDIB(Graphic).Canvas.Handle,
Left, Top, Right - Left, Bottom - Top, SRCCOPY);
finally
Left, Top, Right-Left, Bottom-Top,SRCCOPY);
Release;
end;
end else if (Right - Left = AWidth) and (Bottom - Top = AHeight) then
end else if (Right-Left=AWidth) and (Bottom-Top=AHeight) then
begin
with Canvas do
try
begin
Draw(-Left, -Top, Graphic);
finally
Release;
end;
end else
4348,13 → 2502,12
begin
Temp := TDIB.Create;
try
Temp.SetSize(Right - Left, Bottom - Top, 24);
Temp.SetSize(Right-Left, Bottom-Top, 24);
Temp.Canvas.Draw(-Left, -Top, Graphic);
 
with Canvas do
try
begin
StretchDraw(Bounds(0, 0, AWidth, AHeight), Temp);
finally
Release;
end;
finally
4383,89 → 2536,71
DIB := TDIB.Create;
try
DIB.LoadFromStream(Stream);
if DIB.Size > 0 then
if DIB.Size>0 then
LoadFromGraphic(DIB);
finally
DIB.Free;
DIB.Free;
end;
end;
 
function TDirectDrawSurface.Lock(const Rect: TRect; var SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF}): Boolean;
function TDirectDrawSurface.Lock(const Rect: TRect; var SurfaceDesc: TDDSurfaceDesc): Boolean;
begin
Result := False;
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} = nil then Exit;
if IDDSurface=nil then Exit;
 
if FLockCount > 0 then Exit;
FIsLocked := False;
if FLockCount>0 then Exit;
 
FLockSurfaceDesc.dwSize := SizeOf(FLockSurfaceDesc);
 
if (@Rect <> nil) and ((Rect.Left <> 0) or (Rect.Top <> 0) or (Rect.Right <> Width) or (Rect.Bottom <> Height)) then
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.Lock(@Rect, FLockSurfaceDesc, DDLOCK_WAIT, 0)
else
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.Lock(nil, FLockSurfaceDesc, DDLOCK_WAIT, 0);
if DXResult <> DD_OK then Exit;
if (@Rect<>nil) and ((Rect.Left<>0) or (Rect.Top<>0) or (Rect.Right<>Width) or (Rect.Bottom<>Height)) then
DXResult := ISurface.Lock(@Rect, FLockSurfaceDesc, DDLOCK_WAIT, 0)
else
DXResult := ISurface.Lock(nil, FLockSurfaceDesc, DDLOCK_WAIT, 0);
if DXResult<>DD_OK then Exit;
 
Inc(FLockCount);
SurfaceDesc := FLockSurfaceDesc;
FIsLocked := True;
 
Result := True;
end;
 
{$IFDEF VER4UP}
function TDirectDrawSurface.Lock(var SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF}): Boolean;
{$IFDEF DelphiX_Spt4}
function TDirectDrawSurface.Lock(var SurfaceDesc: TDDSurfaceDesc): Boolean;
begin
Result := False;
FIsLocked := False;
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} = nil then Exit;
if IDDSurface=nil then Exit;
 
if FLockCount = 0 then
if FLockCount=0 then
begin
FLockSurfaceDesc.dwSize := SizeOf(FLockSurfaceDesc);
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.Lock(nil, FLockSurfaceDesc, DDLOCK_WAIT, 0);
if DXResult <> DD_OK then Exit;
DXResult := ISurface.Lock(nil, FLockSurfaceDesc, DDLOCK_WAIT, 0);
if DXResult<>DD_OK then Exit;
end;
 
Inc(FLockCount);
SurfaceDesc := FLockSurfaceDesc;
FIsLocked := True;
Result := True;
end;
 
function TDirectDrawSurface.Lock: Boolean;
var SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
begin
Result := Lock(SurfaceDesc);
end;
 
{$ELSE}
 
function TDirectDrawSurface.LockSurface: Boolean;
var SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF}; R: TRect;
begin
Result := Lock(R, SurfaceDesc);
end;
{$ENDIF}
 
procedure TDirectDrawSurface.UnLock;
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} = nil then Exit;
if IDDSurface=nil then Exit;
 
if FLockCount > 0 then
if FLockCount>0 then
begin
Dec(FLockCount);
if FLockCount = 0 then begin
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.UnLock(FLockSurfaceDesc.lpSurface);
FIsLocked := False;
end;
if FLockCount=0 then
DXResult := ISurface.UnLock(FLockSurfaceDesc.lpSurface);
end;
end;
 
function TDirectDrawSurface.Restore: Boolean;
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if IDDSurface<>nil then
begin
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}._Restore;
Result := DXResult = DD_OK;
DXResult := ISurface.Restore;
Result := DXResult=DD_OK;
end else
Result := False;
end;
4472,56 → 2607,56
 
procedure TDirectDrawSurface.SetClipper(Value: TDirectDrawClipper);
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetClipper(Value.IDDClipper);
FHasClipper := (Value <> nil) and (DXResult = DD_OK);
if IDDSurface<>nil then
DXResult := ISurface.SetClipper(Value.IDDClipper);
FHasClipper := (Value<>nil) and (DXResult=DD_OK);
end;
 
procedure TDirectDrawSurface.SetColorKey(Flags: DWORD; const Value: TDDColorKey);
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetColorKey(Flags, @Value);
if IDDSurface<>nil then
DXResult := ISurface.SetColorKey(Flags, Value);
end;
 
procedure TDirectDrawSurface.SetPalette(Value: TDirectDrawPalette);
begin
if {$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
DXResult := {$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetPalette(Value.IDDPalette);
if IDDSurface<>nil then
DXResult := ISurface.SetPalette(Value.IDDPalette);
end;
 
procedure TDirectDrawSurface.SetPixel(X, Y: Integer; Value: Longint);
var
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
P: PByte;
begin
if ({$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) and (X >= 0) and (X < Width) and (Y >= 0) and (Y < Height) then
if (IDDSurface<>nil) and (X>=0) and (X<Width) and (Y>=0) and (Y<Height) then
if Lock(PRect(nil)^, ddsd) then
begin
try
case ddsd.ddpfPixelFormat.dwRGBBitCount of
1: begin
P := PByte(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + (X shr 3));
if Value = 0 then
P^ := P^ and (not (1 shl (7 - (X and 7))))
else
P^ := P^ or (1 shl (7 - (X and 7)));
end;
4: begin
P := PByte(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + (X shr 1));
if X and 1 = 0 then
P^ := (P^ and $0F) or (Value shl 4)
else
P^ := (P^ and $F0) or (Value and $0F);
end;
8: PByte(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X)^ := Value;
16: PWord(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X * 2)^ := Value;
24: with PRGB(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X * 3)^ do
begin
R := Byte(Value);
G := Byte(Value shr 8);
B := Byte(Value shr 16);
end;
32: PInteger(Integer(ddsd.lpSurface) + Y * ddsd.lPitch + X * 4)^ := Value;
1 : begin
P := PByte(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+(X shr 3));
if Value=0 then
P^ := P^ and (not (1 shl (7-(X and 7))))
else
P^ := P^ or (1 shl (7-(X and 7)));
end;
4 : begin
P := PByte(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+(X shr 1));
if X and 1=0 then
P^ := (P^ and $0F) or (Value shl 4)
else
P^ := (P^ and $F0) or (Value and $0F);
end;
8 : PByte(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X)^ := Value;
16: PWord(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X*2)^ := Value;
24: with PRGB(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X*3)^ do
begin
R := Byte(Value);
G := Byte(Value shr 8);
B := Byte(Value shr 16);
end;
32: PInteger(Integer(ddsd.lpSurface)+Y*ddsd.lPitch+X*4)^ := Value;
end;
finally
UnLock;
4531,15 → 2666,14
 
procedure TDirectDrawSurface.SetSize(AWidth, AHeight: Integer);
var
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
begin
if (AWidth <= 0) or (AHeight <= 0) then
if (AWidth<=0) or (AHeight<=0) then
begin
{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil;
IDDSurface := nil;
Exit;
end;
 
FillChar(ddsd, SizeOf(ddsd), 0);
with ddsd do
begin
dwSize := SizeOf(ddsd);
4554,7 → 2688,7
if CreateSurface(ddsd) then Exit;
 
{ When the Surface cannot be made, making is attempted to the system memory. }
if ddsd.ddsCaps.dwCaps and DDSCAPS_SYSTEMMEMORY = 0 then
if ddsd.ddsCaps.dwCaps and DDSCAPS_SYSTEMMEMORY=0 then
begin
ddsd.ddsCaps.dwCaps := (ddsd.ddsCaps.dwCaps and (not DDSCAPS_VIDEOMEMORY)) or DDSCAPS_SYSTEMMEMORY;
if CreateSurface(ddsd) then
4576,744 → 2710,6
ColorKey[DDCKEY_SRCBLT] := ddck;
end;
 
{additional pixel routines like turbopixels}
 
{
procedure TDirectDrawSurface.PutPixel8(x, y, color: Integer);
var
SurfacePtr: PByte;
PixelOffset: Integer;
begin
SurfacePtr := FLockSurfaceDesc.lpSurface;
PixelOffset := x + y * FLockSurfaceDesc.dwWidth;
SurfacePtr[PixelOffset] := color and $FF; // set pixel (lo byte of color)
end;}
 
procedure TDirectDrawSurface.PutPixel8(x, y, color: Integer); assembler;
{ on entry: self = eax, x = edx, y = ecx, color = ? }
asm
push esi // must maintain esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface// set to surface
add esi,edx // add x
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.dwwidth] // eax = pitch
mul ecx // eax = pitch * y
add esi,eax // esi = pixel offset
mov ecx, color
mov ds:[esi],cl // set pixel (lo byte of ecx)
pop esi // restore esi
//ret // return
end;
 
{
procedure TDirectDrawSurface.PutPixel16(x, y, color: Integer);
var
pPixel: PWord;
begin
pPixel := PWord(Integer(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface) +
x * 2 + y * TDirectDrawSurface(Self).FLockSurfaceDesc.lPitch);
pPixel^ := color;
end;
}
 
procedure TDirectDrawSurface.PutPixel16(x, y, color: Integer); assembler;
{ on entry: self = eax, x = edx, y = ecx, color = ? }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,1
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov ecx, color
mov ds:[esi],cx
pop esi
//ret
end;
 
{
procedure TDirectDrawSurface.PutPixel24(x, y, color: Integer);
var
pPixel: PByte;
dwPitch: DWORD;
dwColor: DWORD;
begin
pPixel := PByte(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface);
Inc(pPixel, x * 3);
dwPitch := TDirectDrawSurface(Self).FLockSurfaceDesc.lPitch;
Inc(pPixel, y * dwPitch);
dwColor := color and $FFFFFF;
pPixel[0] := Byte(dwColor);
pPixel[1] := Byte(dwColor shr 8);
pPixel[2] := Byte(dwColor shr 16);
end;
}
 
procedure TDirectDrawSurface.PutPixel24(x, y, color: Integer); assembler;
{ on entry: self = eax, x = edx, y = ecx, color = ? }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
imul edx,3
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
and eax,$FF000000
mov ecx, color
or ecx,eax
mov ds:[esi+1],ecx
pop esi
//ret
end;
 
{
procedure TDirectDrawSurface.PutPixel24(x, y, color: Integer);
var
offset: Integer;
pixelColor: LongInt;
begin
offset := (y * TDirectDrawSurface(Self).FLockSurfaceDesc.lpitch) + (x * 3);
pixelColor := color and $FFFFFF;
Move(pixelColor, PByte(Integer(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface) + offset)^, 3);
end;
}
 
procedure TDirectDrawSurface.PutPixel32(x, y, color: Integer); assembler;
{ on entry: self = eax, x = edx, y = ecx, color = ? }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,2
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov ecx, color
mov ds:[esi],ecx
pop esi
//ret
end;
 
procedure TDirectDrawSurface.Poke(X, Y: Integer; const Value: LongInt);
begin
if (X < 0) or (X > (Width - 1)) or
(Y < 0) or (Y > (Height - 1)) or not FIsLocked then Exit;
case Bitcount of
8: PutPixel8(x, y, value);
16: PutPixel16(x, y, value);
24: PutPixel24(x, y, value);
32: PutPixel32(x, y, value);
end;
end;
 
{
function TDirectDrawSurface.GetPixel8(x, y: Integer): Integer;
var
Pixel: Byte;
PixelPtr: PByte;
begin
PixelPtr := PByte(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface + x + (y * TDirectDrawSurface(Self).FLockSurfaceDesc.lpitch));
Pixel := PixelPtr^;
Result := Pixel;
end;
 
function TDirectDrawSurface.GetPixel16(x, y: Integer): Integer;
var
Pixel: Word;
PixelPtr: PWord;
begin
PixelPtr := PWord(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface + (x * 2) + (y * TDirectDrawSurface(Self).FLockSurfaceDesc.lpitch));
Pixel := PixelPtr^;
Result := Pixel;
end;
 
function TDirectDrawSurface.GetPixel24(x, y: Integer): Integer;
var
Pixel: array[0..2] of Byte;
PixelPtr: PByte;
begin
PixelPtr := PByte(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface + (x * 3) + (y * TDirectDrawSurface(Self).FLockSurfaceDesc.lpitch));
Pixel[0] := PixelPtr^;
Pixel[1] := (PixelPtr+1)^;
Pixel[2] := (PixelPtr+2)^;
Result := Pixel[0] or (Pixel[1] shl 8) or (Pixel[2] shl 16);
end;
 
function TDirectDrawSurface.GetPixel32(x, y: Integer): Integer;
var
Pixel: Integer;
PixelPtr: PInteger;
begin
PixelPtr := PInteger(TDirectDrawSurface(Self).FLockSurfaceDesc.lpSurface + (x * 4) + (y * TDirectDrawSurface(Self).FLockSurfaceDesc.lpitch));
Pixel := PixelPtr^;
Result := Pixel;
end;
}
 
function TDirectDrawSurface.GetPixel8(x, y: Integer): Integer; assembler;
{ on entry: self = eax, x = edx, y = ecx, result = eax }
asm
push esi // myst maintain esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface // set to surface
add esi,edx // add x
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch] // eax = pitch
mul ecx // eax = pitch * y
add esi,eax // esi = pixel offset
mov eax,ds:[esi] // eax = color
and eax,$FF // map into 8bit
pop esi // restore esi
//ret // return
end;
 
function TDirectDrawSurface.GetPixel16(x, y: Integer): Integer; assembler;
{ on entry: self = eax, x = edx, y = ecx, result = eax }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,1
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
and eax,$FFFF // map into 16bit
pop esi
//ret
end;
 
function TDirectDrawSurface.GetPixel24(x, y: Integer): Integer; assembler;
{ on entry: self = eax, x = edx, y = ecx, result = eax }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
imul edx,3
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
and eax,$FFFFFF // map into 24bit
pop esi
//ret
end;
 
function TDirectDrawSurface.GetPixel32(x, y: Integer): Integer; assembler;
{ on entry: self = eax, x = edx, y = ecx, result = eax }
asm
push esi
mov esi,TDirectDrawSurface[eax].FLockSurfaceDesc.lpSurface
shl edx,2
add esi,edx
mov eax,[TDirectDrawSurface[eax].FLockSurfaceDesc.lpitch]
mul ecx
add esi,eax
mov eax,ds:[esi]
pop esi
//ret
end;
 
function TDirectDrawSurface.Peek(X, Y: Integer): LongInt;
begin
Result := 0;
if (X < 0) or (X > (Width - 1)) or
(Y < 0) or (Y > (Height - 1)) or not FIsLocked then Exit;
case Bitcount of
8: Result := GetPixel8(x, y);
16: Result := GetPixel16(x, y);
24: Result := GetPixel24(x, y);
32: Result := GetPixel32(x, y);
end;
end;
 
procedure TDirectDrawSurface.PokeLine(X1, Y1, X2, Y2: Integer; Color: cardinal);
var
i, deltax, deltay, numpixels,
d, dinc1, dinc2,
x, xinc1, xinc2,
y, yinc1, yinc2: Integer;
begin
if not FIsLocked then {$IFDEF VER4UP}Lock{$ELSE}LockSurface{$ENDIF}; //force lock the surface
{ Calculate deltax and deltay for initialisation }
deltax := abs(x2 - x1);
deltay := abs(y2 - y1);
 
{ Initialise all vars based on which is the independent variable }
if deltax >= deltay then
begin
{ x is independent variable }
numpixels := deltax + 1;
d := (2 * deltay) - deltax;
 
dinc1 := deltay shl 1;
dinc2 := (deltay - deltax) shl 1;
xinc1 := 1;
xinc2 := 1;
yinc1 := 0;
yinc2 := 1;
end
else
begin
{ y is independent variable }
numpixels := deltay + 1;
d := (2 * deltax) - deltay;
dinc1 := deltax shl 1;
dinc2 := (deltax - deltay) shl 1;
xinc1 := 0;
xinc2 := 1;
yinc1 := 1;
yinc2 := 1;
end;
{ Make sure x and y move in the right directions }
if x1 > x2 then
begin
xinc1 := -xinc1;
xinc2 := -xinc2;
end;
if y1 > y2 then
begin
yinc1 := -yinc1;
yinc2 := -yinc2;
end;
x := x1;
y := y1;
{ Draw the pixels }
for i := 1 to numpixels do
begin
if (x > 0) and (x < (Width - 1)) and (y > 0) and (y < (Height - 1)) then
Pixel[x, y] := Color;
if d < 0 then
begin
Inc(d, dinc1);
Inc(x, xinc1);
Inc(y, yinc1);
end
else
begin
Inc(d, dinc2);
Inc(x, xinc2);
Inc(y, yinc2);
end;
end;
end;
 
procedure TDirectDrawSurface.PokeLinePolar(x, y: Integer; angle, length: extended; Color: cardinal);
var
xp, yp: Integer;
begin
xp := round(sin(angle * pi / 180) * length) + x;
yp := round(cos(angle * pi / 180) * length) + y;
PokeLine(x, y, xp, yp, Color);
end;
 
procedure TDirectDrawSurface.PokeBox(xs, ys, xd, yd: Integer; Color: cardinal);
begin
pokeline(xs, ys, xd, ys, color);
pokeline(xs, ys, xs, yd, color);
pokeline(xd, ys, xd, yd, color);
pokeline(xs, yd, xd, yd, color);
end;
 
procedure TDirectDrawSurface.PokeBlendPixel(const X, Y: Integer; aColor: cardinal; Alpha: byte);
var
cr, cg, cb: byte;
ar, ag, ab: byte;
begin
LoadRGB(aColor, ar, ag, ab);
LoadRGB(Pixel[x, y], cr, cg, cb);
Pixel[x, y] := SaveRGB((Alpha * (aR - cr) shr 8) + cr, // R alpha
(Alpha * (aG - cg) shr 8) + cg, // G alpha
(Alpha * (aB - cb) shr 8) + cb); // B alpha
end;
 
{
function Conv24to16(Color: Integer): Word;
var
r, g, b: Byte;
begin
r := (Color shr 16) and $FF;
g := (Color shr 8) and $FF;
b := Color and $FF;
Result := ((r shr 3) shl 11) or ((g shr 2) shl 5) or (b shr 3);
end;
}
 
function Conv24to16(Color: Integer): Word; register;
asm
mov ecx,eax
shl eax,24
shr eax,27
shl eax,11
mov edx,ecx
shl edx,16
shr edx,26
shl edx,5
or eax,edx
mov edx,ecx
shl edx,8
shr edx,27
or eax,edx
end;
 
procedure TDirectDrawSurface.PokeWuLine(X1, Y1, X2, Y2, aColor: Integer);
var DeltaX, DeltaY, Loop, Start, Finish: Integer;
Dx, Dy, DyDx: Single; // fractional parts
Color16: DWord;
begin
DeltaX := Abs(X2 - X1); // Calculate DeltaX and DeltaY for initialization
DeltaY := Abs(Y2 - Y1);
if (DeltaX = 0) or (DeltaY = 0) then
begin // straight lines
PokeLine(X1, Y1, X2, Y2, aColor);
Exit;
end;
if BitCount = 16 then
Color16 := Conv24to16(aColor)
else
Color16 := aColor;
if DeltaX > DeltaY then // horizontal or vertical
begin
{ determine rise and run }
if Y2 > Y1 then DyDx := -(DeltaY / DeltaX)
else DyDx := DeltaY / DeltaX;
if X2 < X1 then
begin
Start := X2; // right to left
Finish := X1;
Dy := Y2;
end else
begin
Start := X1; // left to right
Finish := X2;
Dy := Y1;
DyDx := -DyDx; // inverse slope
end;
for Loop := Start to Finish do
begin
PokeBlendPixel(Loop, Trunc(Dy), Color16, Trunc((1 - Frac(Dy)) * 255));
PokeBlendPixel(Loop, Trunc(Dy) + 1, Color16, Trunc(Frac(Dy) * 255));
Dy := Dy + DyDx; // next point
end;
end else
begin
{ determine rise and run }
if X2 > X1 then DyDx := -(DeltaX / DeltaY)
else DyDx := DeltaX / DeltaY;
if Y2 < Y1 then
begin
Start := Y2; // right to left
Finish := Y1;
Dx := X2;
end else
begin
Start := Y1; // left to right
Finish := Y2;
Dx := X1;
DyDx := -DyDx; // inverse slope
end;
for Loop := Start to Finish do
begin
PokeBlendPixel(Trunc(Dx), Loop, Color16, Trunc((1 - Frac(Dx)) * 255));
PokeBlendPixel(Trunc(Dx), Loop, Color16, Trunc(Frac(Dx) * 255));
Dx := Dx + DyDx; // next point
end;
end;
end;
 
procedure TDirectDrawSurface.Noise(Oblast: TRect; Density: Byte);
var
dx, dy: Integer;
Dens: byte;
begin
{noise}
case Density of
0..2: Dens := 3;
255: Dens := 254;
else
Dens := Density;
end;
if Dens >= Oblast.Right then
Dens := Oblast.Right div 3;
dy := Oblast.Top;
while dy <= Oblast.Bottom do begin
dx := Oblast.Left;
while dx <= Oblast.Right do begin
inc(dx, random(dens));
if dx <= Oblast.Right then
Pixel[dx, dy] := not Pixel[dx, dy];
end;
inc(dy);
end;
end;
 
{
function Conv16to24(Color: Word): Integer;
var
r, g, b: Byte;
begin
r := (Color shr 11) and $1F;
g := (Color shr 5) and $3F;
b := Color and $1F;
Result := (r shl 19) or (g shl 10) or (b shl 3);
end;
}
 
function Conv16to24(Color: Word): Integer; register;
asm
xor edx,edx
mov dx,ax
 
mov eax,edx
shl eax,27
shr eax,8
 
mov ecx,edx
shr ecx,5
shl ecx,26
shr ecx,16
or eax,ecx
 
mov ecx,edx
shr ecx,11
shl ecx,27
shr ecx,24
or eax,ecx
end;
 
procedure GetRGB(Color: cardinal; var R, G, B: Byte); {$IFDEF VER9UP}inline; {$ENDIF}
begin
R := Color;
G := Color shr 8;
B := Color shr 16;
end;
 
procedure TDirectDrawSurface.LoadRGB(Color: cardinal; var R, G, B: Byte);
var grB: Byte;
begin
grB := 1;
if FLockSurfaceDesc.ddpfPixelFormat.dwGBitMask = 2016 then grB := 0; // 565
case BitCount of
15, 16: begin
R := (color shr (11 - grB)) shl 3;
if grB = 0 then
G := ((color and 2016) shr 5) shl 2
else
G := ((color and 992) shr 5) shl 3;
B := (color and 31) shl 3;
end;
else
GetRGB(Color, R, G, B);
end;
end;
 
function TDirectDrawSurface.SaveRGB(const R, G, B: Byte): cardinal;
begin
case BitCount of
15, 16: begin
Result := Conv24to16(RGB(R, G, B));
end;
else
Result := RGB(R, G, B);
end;
end;
 
procedure TDirectDrawSurface.Blur;
var
x, y, tr, tg, tb: Integer;
r, g, b: byte;
begin
for y := 1 to GetHeight - 1 do
for x := 1 to GetWidth - 1 do begin
LoadRGB(peek(x, y), r, g, b);
tr := r;
tg := g;
tb := b;
LoadRGB(peek(x, y + 1), r, g, b);
Inc(tr, r);
Inc(tg, g);
Inc(tb, b);
LoadRGB(peek(x, y - 1), r, g, b);
Inc(tr, r);
Inc(tg, g);
Inc(tb, b);
LoadRGB(peek(x - 1, y), r, g, b);
Inc(tr, r);
Inc(tg, g);
Inc(tb, b);
LoadRGB(peek(x + 1, y), r, g, b);
Inc(tr, r);
Inc(tg, g);
Inc(tb, b);
tr := tr shr 2;
tg := tg shr 2;
tb := tb shr 2;
Poke(x, y, savergb(tr, tg, tb));
end;
end;
 
procedure TDirectDrawSurface.PokeCircle(X, Y, Radius, Color: Integer);
var
a, af, b, bf, c,
target, r2: Integer;
begin
Target := 0;
A := Radius;
B := 0;
R2 := Sqr(Radius);
 
while a >= B do
begin
b := Round(Sqrt(R2 - Sqr(A)));
c := target; target := b; b := c;
while B < Target do
begin
Af := (120 * a) div 100;
Bf := (120 * b) div 100;
pixel[x + af, y + b] := color;
pixel[x + bf, y + a] := color;
pixel[x - af, y + b] := color;
pixel[x - bf, y + a] := color;
pixel[x - af, y - b] := color;
pixel[x - bf, y - a] := color;
pixel[x + af, y - b] := color;
pixel[x + bf, y - a] := color;
B := B + 1;
end;
A := A - 1;
end;
end;
 
function RGBToBGR(Color: cardinal): cardinal;
begin
result := (LoByte(LoWord(Color)) shr 3 shl 11) or // Red
(HiByte((Color)) shr 2 shl 5) or // Green
(LoByte(HiWord(Color)) shr 3); // Blue
end;
 
procedure TDirectDrawSurface.PokeVLine(x, y1, y2: Integer; Color: cardinal);
var
y: Integer;
NColor: cardinal;
r, g, b: byte;
begin
if y1 < 0 then y1 := 0;
if y2 >= Height then y2 := Height - 1;
GetRGB(Color, r, g, b);
NColor := RGBToBGR(rgb(r, g, b));
for y := y1 to y2 do
begin
pixel[x, y] := NColor;
end;
end;
 
procedure TDirectDrawSurface.PokeFilledEllipse(exc, eyc, ea, eb, color: Integer);
var x, y: Integer; aa, aa2, bb, bb2, d, dx, dy: LongInt;
begin
x := 0;
y := eb;
aa := LongInt(ea) * ea;
aa2 := 2 * aa;
bb := LongInt(eb) * eb;
bb2 := 2 * bb;
d := bb - aa * eb + aa div 4;
dx := 0;
dy := aa2 * eb;
PokevLine(exc, eyc - y, eyc + y, color);
while (dx < dy) do begin
if (d > 0) then begin
dec(y); dec(dy, aa2); dec(d, dy);
end;
inc(x); inc(dx, bb2); inc(d, bb + dx);
PokevLine(exc - x, eyc - y, eyc + y, color);
PokevLine(exc + x, eyc - y, eyc + y, color);
end;
inc(d, (3 * (aa - bb) div 2 - (dx + dy)) div 2);
while (y >= 0) do begin
if (d < 0) then begin
inc(x); inc(dx, bb2); inc(d, bb + dx);
PokevLine(exc - x, eyc - y, eyc + y, color);
PokevLine(exc + x, eyc - y, eyc + y, color);
end;
dec(y); dec(dy, aa2); inc(d, aa - dy);
end;
end;
 
procedure TDirectDrawSurface.DoRotate(cent1, cent2, angle: Integer; coord1, coord2: Real; Color: word);
var coord1t, coord2t: Real;
c1, c2: Integer;
begin
coord1t := coord1 - cent1;
coord2t := coord2 - cent2;
coord1 := coord1t * cos(angle * pi / 180) - coord2t * sin(angle * pi / 180);
coord2 := coord1t * sin(angle * pi / 180) + coord2t * cos(angle * pi / 180);
coord1 := coord1 + cent1;
coord2 := coord2 + cent2;
c1 := round(coord1);
c2 := round(coord2);
pixel[c1, c2] := Color;
end;
 
procedure TDirectDrawSurface.PokeEllipse(exc, eyc, ea, eb, angle, Color: Integer);
var
elx, ely: Integer;
aa, aa2, bb, bb2, d, dx, dy: LongInt;
x, y: real;
begin
elx := 0;
ely := eb;
aa := LongInt(ea) * ea;
aa2 := 2 * aa;
bb := LongInt(eb) * eb;
bb2 := 2 * bb;
d := bb - aa * eb + aa div 4;
dx := 0;
dy := aa2 * eb;
x := exc;
y := eyc - ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc;
y := eyc + ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc - ea;
y := eyc;
dorotate(exc, eyc, angle, x, y, Color);
x := exc + ea;
y := eyc;
dorotate(exc, eyc, angle, x, y, Color);
while (dx < dy) do begin
if (d > 0) then begin Dec(ely); Dec(dy, aa2); Dec(d, dy); end;
Inc(elx); Inc(dx, bb2); Inc(d, bb + dx);
x := exc + elx; y := eyc + ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc - elx; y := eyc + ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc + elx; y := eyc - ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc - elx; y := eyc - ely;
dorotate(exc, eyc, angle, x, y, Color);
end;
Inc(d, (3 * (aa - bb) div 2 - (dx + dy)) div 2);
while (ely > 0) do begin
if (d < 0) then begin Inc(elx); Inc(dx, bb2); Inc(d, bb + dx); end;
Dec(ely); Dec(dy, aa2); Inc(d, aa - dy);
x := exc + elx; y := eyc + ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc - elx; y := eyc + ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc + elx; y := eyc - ely;
dorotate(exc, eyc, angle, x, y, Color);
x := exc - elx; y := eyc - ely;
dorotate(exc, eyc, angle, x, y, Color);
end;
end;
 
procedure TDirectDrawSurface.MirrorFlip(Value: TRenderMirrorFlipSet);
begin
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Self) then
D2D.MirrorFlip := Value;
end;
 
{ TDXDrawDisplayMode }
 
function TDXDrawDisplayMode.GetBitCount: Integer;
5340,10 → 2736,10
FModes := TCollection.Create(TDXDrawDisplayMode);
FWidth := 640;
FHeight := 480;
FBitCount := 16;
FFixedBitCount := False; //True;
FBitCount := 8;
FFixedBitCount := True;
FFixedRatio := True;
FFixedSize := True; //False;
FFixedSize := False;
end;
 
destructor TDXDrawDisplay.Destroy;
5356,7 → 2752,7
begin
if Source is TDXDrawDisplay then
begin
if Source <> Self then
if Source<>Self then
begin
FBitCount := TDXDrawDisplay(Source).BitCount;
FHeight := TDXDrawDisplay(Source).Height;
5372,7 → 2768,7
 
function TDXDrawDisplay.GetCount: Integer;
begin
if FModes.Count = 0 then
if FModes.Count=0 then
LoadDisplayModes;
Result := FModes.Count;
end;
5380,24 → 2776,24
function TDXDrawDisplay.GetMode: TDXDrawDisplayMode;
var
i: Integer;
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
begin
Result := nil;
if FDXDraw.DDraw <> nil then
if FDXDraw.DDraw<>nil then
begin
ddsd := FDXDraw.DDraw.DisplayMode;
with ddsd do
i := IndexOf(dwWidth, dwHeight, ddpfPixelFormat.dwRGBBitCount);
if i <> -1 then
if i<>-1 then
Result := Modes[i];
end;
if Result = nil then
if Result=nil then
raise EDirectDrawError.Create(SDisplayModeCannotAcquired);
end;
 
function TDXDrawDisplay.GetMode2(Index: Integer): TDXDrawDisplayMode;
begin
if FModes.Count = 0 then
if FModes.Count=0 then
LoadDisplayModes;
Result := TDXDrawDisplayMode(FModes.Items[Index]);
end;
5407,8 → 2803,8
i: Integer;
begin
Result := -1;
for i := 0 to Count - 1 do
if (Modes[i].Width = Width) and (Modes[i].Height = Height) and (Modes[i].BitCount = BitCount) then
for i:=0 to Count-1 do
if (Modes[i].Width=Width) and (Modes[i].Height=Height) and (Modes[i].BitCount=BitCount) then
begin
Result := i;
Exit;
5427,12 → 2823,12
 
function Compare(Item1, Item2: TDXDrawDisplayMode): Integer;
begin
if Item1.Width <> Item2.Width then
Result := Item1.Width - Item2.Width
else if Item1.Height <> Item2.Height then
Result := Item1.Height - Item2.Height
if Item1.Width<>Item2.Width then
Result := Item1.Width-Item2.Width
else if Item1.Height<>Item2.Height then
Result := Item1.Height-Item2.Height
else
Result := Item1.BitCount - Item2.BitCount;
Result := Item1.BitCount-Item2.BitCount;
end;
 
var
5442,30 → 2838,27
begin
FModes.Clear;
 
if FDXDraw.DDraw <> nil then
if FDXDraw.DDraw<>nil then
begin
FDXDraw.DDraw.DXResult := FDXDraw.DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}
.EnumDisplayModes(0, {$IFDEF D3D_deprecated}PDDSurfaceDesc{$ELSE}PDDSurfaceDesc2{$ENDIF}(nil),
FDXDraw.DDraw.DXResult := FDXDraw.DDraw.IDraw.EnumDisplayModes(0, PDDSurfaceDesc(nil)^,
FModes, @EnumDisplayModesProc);
end else
begin
DDraw := TDirectDraw.Create(PGUID(FDXDraw.FDriver));
try
DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}
.EnumDisplayModes(0, {$IFDEF D3D_deprecated}PDDSurfaceDesc{$ELSE}PDDSurfaceDesc2{$ENDIF}(nil),
FModes, @EnumDisplayModesProc);
DDraw.IDraw.EnumDisplayModes(0, PDDSurfaceDesc(nil)^, FModes, @EnumDisplayModesProc);
finally
DDraw.Free;
end;
end;
 
TempList := TList.Create;
try
for i := 0 to FModes.Count - 1 do
for i:=0 to FModes.Count-1 do
TempList.Add(FModes.Items[i]);
TempList.Sort(@Compare);
 
for i := FModes.Count - 1 downto 0 do
for i:=FModes.Count-1 downto 0 do
TDXDrawDisplayMode(TempList[i]).Index := i;
finally
TempList.Free;
5472,14 → 2865,13
end;
end;
 
function TDXDrawDisplay.SetSize(AWidth, AHeight, ABitCount{$IFNDEF D3D_deprecated}, ARefreshRate, AFlags{$ENDIF}: Integer): Boolean;
function TDXDrawDisplay.SetSize(AWidth, AHeight, ABitCount: Integer): Boolean;
begin
Result := False;
if FDXDraw.DDraw <> nil then
if FDXDraw.DDraw<>nil then
begin
FDXDraw.DDraw.DXResult := FDXDraw.DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}
.SetDisplayMode(AWidth, AHeight, ABitCount{$IFNDEF D3D_deprecated}, ARefreshRate, AFlags{$ENDIF});
Result := FDXDraw.DDraw.DXResult = DD_OK;
FDXDraw.DDraw.DXResult := FDXDraw.DDraw.IDraw.SetDisplayMode(AWidth, AHeight, ABitCount);
Result := FDXDraw.DDraw.DXResult=DD_OK;
 
if Result then
begin
5492,27 → 2884,20
 
function TDXDrawDisplay.DynSetSize(AWidth, AHeight, ABitCount: Integer): Boolean;
 
{$IFNDEF D3D_deprecated}
function GetDefaultRefreshRate: Integer;
begin
Result := 60;
end;
{$ENDIF}
 
function TestBitCount(BitCount, ABitCount: Integer): Boolean;
begin
if (BitCount > 8) and (ABitCount > 8) then
if (BitCount>8) and (ABitCount>8) then
begin
Result := True;
end else
begin
Result := BitCount >= ABitCount;
Result := BitCount>=ABitCount;
end;
end;
 
function SetSize2(Ratio: Boolean): Boolean;
var
DWidth, DHeight, DBitCount{$IFNDEF D3D_deprecated}, DRRate, DFlags{$ENDIF}, i: Integer;
DWidth, DHeight, DBitCount, i: Integer;
Flag: Boolean;
begin
Result := False;
5520,20 → 2905,17
DWidth := Maxint;
DHeight := Maxint;
DBitCount := ABitCount;
{$IFNDEF D3D_deprecated}
DRRate := GetDefaultRefreshRate;
DFlags := 0;
{$ENDIF}
 
Flag := False;
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
with Modes[i] do
begin
if ((DWidth >= Width) and (DHeight >= Width) and
((not Ratio) or (Width / Height = AWidth / AHeight)) and
((FFixedSize and (Width = AWidth) and (Height = Height)) or
((not FFixedSize) and (Width >= AWidth) and (Height >= AHeight))) and
if ((DWidth>=Width) and (DHeight>=Width) and
((not Ratio) or (Width/Height=AWidth/AHeight)) and
((FFixedSize and (Width=AWidth) and (Height=Height)) or
((not FFixedSize) and (Width>=AWidth) and (Height>=AHeight))) and
 
((FFixedBitCount and (BitCount = ABitCount)) or
((FFixedBitCount and (BitCount=ABitCount)) or
((not FFixedBitCount) and TestBitCount(BitCount, ABitCount)))) then
begin
DWidth := Width;
5545,13 → 2927,13
 
if Flag then
begin
if (DBitCount <> ABitCount) then
if (DBitCount<>ABitCount) then
begin
if IndexOf(DWidth, DHEight, ABitCount) <> -1 then
if IndexOf(DWidth, DHEight, ABitCount)<>-1 then
DBitCount := ABitCount;
end;
 
Result := SetSize(DWidth, DHeight, DBitCount{$IFNDEF D3D_deprecated}, DRRate, DFlags{$ENDIF});
Result := SetSize(DWidth, DHeight, DBitCount);
end;
end;
 
5558,10 → 2940,10
begin
Result := False;
 
if (AWidth <= 0) or (AHeight <= 0) or (not (ABitCount in [8, 16, 24, 32])) then Exit;
if (AWidth<=0) or (AHeight<=0) or (not (ABitCount in [8, 16, 24, 32])) then Exit;
 
{ The change is attempted by the size of default. }
if SetSize(AWidth, AHeight, ABitCount{$IFNDEF D3D_deprecated}, GetDefaultRefreshRate, 0{$ENDIF}) then
if SetSize(AWidth, AHeight, ABitCount) then
begin
Result := True;
Exit;
5619,10 → 3001,10
 
procedure FreeZBufferSurface(Surface: TDirectDrawSurface; var ZBuffer: TDirectDrawSurface);
begin
if ZBuffer <> nil then
if ZBuffer<>nil then
begin
if (Surface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) and (ZBuffer.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) then
Surface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.DeleteAttachedSurface(0, ZBuffer.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF});
if (Surface.IDDSurface<>nil) and (ZBuffer.IDDSurface<>nil) then
Surface.ISurface.DeleteAttachedSurface(0, ZBuffer.IDDSurface);
ZBuffer.Free; ZBuffer := nil;
end;
end;
5629,12 → 3011,12
 
type
TInitializeDirect3DOption = (idoSelectDriver, idoOptimizeDisplayMode,
idoHardware, {$IFDEF D3DRM}idoRetainedMode,{$ENDIF} idoZBuffer);
idoHardware, idoRetainedMode, idoZBuffer);
 
TInitializeDirect3DOptions = set of TInitializeDirect3DOption;
 
procedure Direct3DInitializing(Options: TInitializeDirect3DOptions;
var BitCount: Integer; var Driver: PGUID; var DriverGUID: TGUID{$IFNDEF D3D_deprecated}; var D3DDeviceTypeSet: TD3DDeviceTypeSet{$ENDIF});
var BitCount: Integer; var Driver: PGUID; var DriverGUID: TGUID);
type
PDirect3DInitializingRecord = ^TDirect3DInitializingRecord;
TDirect3DInitializingRecord = record
5646,29 → 3028,19
Flag: Boolean;
DriverCaps: TDDCaps;
HELCaps: TDDCaps;
{$IFDEF D3D_deprecated}
HWDeviceDesc: TD3DDeviceDesc;
HELDeviceDesc: TD3DDeviceDesc;
DeviceDesc: TD3DDeviceDesc;
{$ELSE}
DeviceDesc: TD3DDeviceDesc7;
{$ENDIF}
 
D3DFlag: Boolean;
{$IFDEF D3D_deprecated}
HWDeviceDesc2: TD3DDeviceDesc;
HELDeviceDesc2: TD3DDeviceDesc;
DeviceDesc2: TD3DDeviceDesc;
{$ELSE}
DeviceDesc2: TD3DDeviceDesc7;
{$ENDIF}
end;
 
{$IFDEF D3D_deprecated}
function EnumDeviceCallBack(lpGuid: PGUID; // nil for the default device
lpDeviceDescription: PAnsiChar; lpDeviceName: PAnsiChar;
var lpD3DHWDeviceDesc: TD3DDeviceDesc;
var lpD3DHELDeviceDesc: TD3DDeviceDesc;
rec: PDirect3DInitializingRecord) : HResult; stdcall;
function EnumDeviceCallBack(const lpGuid: TGUID; lpDeviceDescription, lpDeviceName: PChar;
const lpD3DHWDeviceDesc, lpD3DHELDeviceDesc: TD3DDeviceDesc;
rec: PDirect3DInitializingRecord): HRESULT; stdcall;
 
procedure UseThisDevice;
begin
5681,51 → 3053,24
begin
Result := D3DENUMRET_OK;
 
if lpD3DHWDeviceDesc.dcmColorModel = 0 then Exit;
if lpD3DHWDeviceDesc.dcmColorModel=0 then Exit;
 
if idoOptimizeDisplayMode in rec.Options then
begin
if (lpD3DHWDeviceDesc.dwDeviceRenderBitDepth and (DDBD_16 or DDBD_24 or DDBD_32)) = 0 then Exit;
end
else
if (lpD3DHWDeviceDesc.dwDeviceRenderBitDepth and (DDBD_16 or DDBD_24 or DDBD_32))=0 then Exit;
end else
begin
if (lpD3DHWDeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount)) = 0 then Exit;
if (lpD3DHWDeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount))=0 then Exit;
end;
 
UseThisDevice;
end;
{$ELSE}
function EnumDeviceCallBack(lpDeviceDescription: PAnsiChar; lpDeviceName: PAnsiChar;
const lpD3DDeviceDesc: TD3DDeviceDesc7; rec: PDirect3DInitializingRecord) : HResult; stdcall;
begin
Result := D3DENUMRET_OK;
 
maxVideoBlockSize := Min(lpD3DDeviceDesc.dwMaxTextureWidth, lpD3DDeviceDesc.dwMaxTextureHeight);
SurfaceDivWidth := lpD3DDeviceDesc.dwMaxTextureWidth;
SurfaceDivHeight := lpD3DDeviceDesc.dwMaxTextureHeight;
 
//if lpD3DHWDeviceDesc.dcmColorModel = 0 then Exit;
if idoOptimizeDisplayMode in rec.Options then
begin
if (lpD3DDeviceDesc.dwDeviceRenderBitDepth and (DDBD_16 or DDBD_24 or DDBD_32)) = 0 then Exit;
end
else
begin
if (lpD3DDeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount)) = 0 then Exit;
end;
 
rec.D3DFlag := True;
rec.DeviceDesc2 := lpD3DDeviceDesc;
end;
{$ENDIF}
 
function EnumDirectDrawDriverCallback(lpGUID: PGUID; lpDriverDescription: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF};
lpDriverName: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF}; rec: PDirect3DInitializingRecord): HRESULT; stdcall;
function EnumDirectDrawDriverCallback(lpGUID: PGUID; lpDriverDescription: LPSTR;
lpDriverName: LPSTR; rec: PDirect3DInitializingRecord): HRESULT; stdcall;
var
DDraw: TDirectDraw;
{$IFDEF D3D_deprecated}
Direct3D: IDirect3D;
{$ENDIF}
Direct3D7: IDirect3D7;
 
function CountBitMask(i: DWORD; const Bits: array of DWORD): DWORD;
5734,9 → 3079,9
begin
Result := 0;
 
for j := Low(Bits) to High(Bits) do
for j:=Low(Bits) to High(Bits) do
begin
if i and Bits[j] <> 0 then
if i and Bits[j]<>0 then
Inc(Result);
end;
end;
5748,9 → 3093,9
j := CountBitMask(i, Bits);
j2 := CountBitMask(i2, Bits);
 
if j < j2 then
if j<j2 then
Result := -1
else if i > j2 then
else if i>j2 then
Result := 1
else
Result := 0;
5762,16 → 3107,16
begin
Result := 0;
 
for j := 0 to 31 do
if i and (1 shl j) <> 0 then
for j:=0 to 31 do
if i and (1 shl j)<>0 then
Inc(Result);
end;
 
function CompareCountBit(i, i2: DWORD): Integer;
begin
Result := CountBit(i) - CountBit(i2);
if Result < 0 then Result := -1;
if Result > 0 then Result := 1;
Result := CountBit(i)-CountBit(i2);
if Result<0 then Result := -1;
if Result>0 then Result := 1;
end;
 
function FindDevice: Boolean;
5778,19 → 3123,7
begin
{ The Direct3D driver is examined. }
rec.D3DFlag := False;
try
{$IFDEF D3D_deprecated}Direct3D{$ELSE}Direct3D7{$ENDIF}.EnumDevices(@EnumDeviceCallBack, rec) {= DD_OK}
except
on E: Exception do
begin
rec.D3DFlag := False;
// eventually catch exception to automatic log
Log(E.Message {$IFNDEF VER4UP}, ChangefileExt(ParamStr(0), '.log'){$ENDIF});
//and cannot continue !!!
Result := False;
Exit;
end;
end;
Direct3D.EnumDevices(@EnumDeviceCallBack, rec);
Result := rec.D3DFlag;
 
if not Result then Exit;
5798,32 → 3131,29
{ Comparison of DirectDraw driver. }
if not rec.Flag then
begin
{$IFDEF D3D_deprecated}
rec.HWDeviceDesc := rec.HWDeviceDesc2;
rec.HELDeviceDesc := rec.HELDeviceDesc2;
rec.DeviceDesc := rec.DeviceDesc2;
{$ENDIF}
rec.Flag := True;
end
else
end else
begin
{ Comparison of hardware. (One with large number of functions to support is chosen. }
Result := False;
 
if DDraw.DriverCaps.dwVidMemTotal < rec.DriverCaps.dwVidMemTotal then Exit;
{$IFDEF D3D_deprecated}
if CompareCountBitMask(DDraw.DriverCaps.ddscaps.dwCaps, rec.DriverCaps.ddscaps.dwCaps, [DDSCAPS_TEXTURE, DDSCAPS_ZBUFFER, DDSCAPS_MIPMAP]) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwMiscCaps, rec.HWDeviceDesc2.dpcLineCaps.dwMiscCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwRasterCaps, rec.HWDeviceDesc2.dpcLineCaps.dwRasterCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwAlphaCmpCaps, rec.HWDeviceDesc2.dpcLineCaps.dwAlphaCmpCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwSrcBlendCaps, rec.HWDeviceDesc2.dpcLineCaps.dwSrcBlendCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwDestBlendCaps, rec.HWDeviceDesc2.dpcLineCaps.dwDestBlendCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwShadeCaps, rec.HWDeviceDesc2.dpcLineCaps.dwShadeCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureFilterCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureFilterCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureBlendCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureBlendCaps) +
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureAddressCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureAddressCaps) < 0 then Exit;
{$ENDIF}
if DDraw.DriverCaps.dwVidMemTotal<rec.DriverCaps.dwVidMemTotal then Exit;
 
if CompareCountBitMask(DDraw.DriverCaps.ddscaps.dwCaps, rec.DriverCaps.ddscaps.dwCaps, [DDSCAPS_TEXTURE, DDSCAPS_ZBUFFER, DDSCAPS_MIPMAP])+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwMiscCaps, rec.HWDeviceDesc2.dpcLineCaps.dwMiscCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwRasterCaps, rec.HWDeviceDesc2.dpcLineCaps.dwRasterCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwAlphaCmpCaps, rec.HWDeviceDesc2.dpcLineCaps.dwAlphaCmpCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwSrcBlendCaps, rec.HWDeviceDesc2.dpcLineCaps.dwSrcBlendCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwDestBlendCaps, rec.HWDeviceDesc2.dpcLineCaps.dwDestBlendCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwShadeCaps, rec.HWDeviceDesc2.dpcLineCaps.dwShadeCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureFilterCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureFilterCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureBlendCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureBlendCaps)+
CompareCountBit(rec.HWDeviceDesc.dpcLineCaps.dwTextureAddressCaps, rec.HWDeviceDesc2.dpcLineCaps.dwTextureAddressCaps)<0 then Exit;
 
Result := True;
end;
end;
5833,20 → 3163,13
 
DDraw := TDirectDraw.Create(lpGUID);
try
if (DDraw.DriverCaps.dwCaps and DDCAPS_3D <> 0) and
(DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_TEXTURE <> 0) then
if (DDraw.DriverCaps.dwCaps and DDCAPS_3D<>0) and
(DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_TEXTURE<>0) then
begin
try
if DDraw.IDDraw7 <> nil then
if DDraw.IDDraw7<>nil then
Direct3D7 := DDraw.IDraw7 as IDirect3D7
{$IFDEF D3D_deprecated}
else
Direct3D := DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF} as IDirect3D
{$ENDIF};
except
on E: Exception do
log(E.Message {$IFNDEF VER4UP}, ChangefileExt(ParamStr(0), '.log'){$ENDIF});
end;
Direct3D := DDraw.IDraw as IDirect3D;
try
if FindDevice then
begin
5853,18 → 3176,15
rec.DriverCaps := DDraw.DriverCaps;
rec.HELCaps := DDraw.HELCaps;
 
if lpGUID = nil then
if lpGUID=nil then
rec.Driver := nil
else
begin
else begin
rec.DriverGUID^ := lpGUID^;
rec.Driver^ := @rec.DriverGUID;
end;
end;
finally
{$IFDEF D3D_deprecated}
Direct3D := nil;
{$ENDIF}
Direct3D7 := nil;
end;
end;
5876,9 → 3196,6
var
rec: TDirect3DInitializingRecord;
DDraw: TDirectDraw;
{$IFNDEF D3D_deprecated}
devGUID: Tguid;
{$ENDIF}
begin
FillChar(rec, SizeOf(rec), 0);
rec.BitCount := BitCount;
5891,9 → 3208,8
rec.Options := Options;
rec.Driver := @Driver;
rec.DriverGUID := @DriverGUID;
DXDirectDrawEnumerate(@EnumDirectDrawDriverCallback, @rec);
end
else
DXDirectDrawEnumerate(@EnumDirectDrawDriverCallback, @rec)
end else
begin
DDraw := TDirectDraw.Create(Driver);
try
5901,13 → 3217,10
rec.HELCaps := DDraw.HELCaps;
 
rec.D3DFlag := False;
(DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF} as IDirect3D).EnumDevices(@EnumDeviceCallBack, @rec);
(DDraw.IDraw as IDirect3D).EnumDevices(@EnumDeviceCallBack, @rec);
 
if rec.D3DFlag then
{$IFDEF D3D_deprecated}
rec.DeviceDesc := rec.DeviceDesc2;
{$ELSE}
rec.DeviceDesc := rec.DeviceDesc2;
{$ENDIF}
finally
DDraw.Free;
end;
5917,42 → 3230,17
{ Display mode optimization }
if rec.Flag and (idoOptimizeDisplayMode in Options) then
begin
if (rec.DeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount)) = 0 then
if (rec.DeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount))=0 then
begin
if rec.DeviceDesc.dwDeviceRenderBitDepth and DDBD_16 <> 0 then
if rec.DeviceDesc.dwDeviceRenderBitDepth and DDBD_16<>0 then
rec.BitCount := 16
else
if rec.DeviceDesc.dwDeviceRenderBitDepth and DDBD_24 <> 0 then
else if rec.DeviceDesc.dwDeviceRenderBitDepth and DDBD_24<>0 then
rec.BitCount := 24
else if rec.DeviceDesc.dwDeviceRenderBitDepth and DDBD_32 <> 0 then
else if rec.DeviceDesc.dwDeviceRenderBitDepth and DDBD_32<>0 then
rec.BitCount := 32;
end;
end;
 
{test type of device}
{$IFNDEF D3D_deprecated}
D3DDeviceTypeSet := [];
 
Move(rec.DeviceDesc2.deviceGUID, devGUID, Sizeof(TGUID) );
 
if CompareMem(@devGUID, @IID_IDirect3DTnLHalDevice, Sizeof(TGUID)) then
D3DDeviceTypeSet := D3DDeviceTypeSet + [dtTnLHAL];
 
if CompareMem(@devGUID, @IID_IDirect3DHALDEVICE, Sizeof(TGUID)) then
D3DDeviceTypeSet := D3DDeviceTypeSet + [dtHAL];
 
if CompareMem(@devGUID, @IID_IDirect3DMMXDevice, Sizeof(TGUID)) then
D3DDeviceTypeSet := D3DDeviceTypeSet + [dtMMX];
 
if CompareMem(@devGUID, @IID_IDirect3DRGBDevice, Sizeof(TGUID)) then
D3DDeviceTypeSet := D3DDeviceTypeSet + [dtRGB];
 
if CompareMem(@devGUID, @IID_IDirect3DRampDevice, Sizeof(TGUID)) then
D3DDeviceTypeSet := D3DDeviceTypeSet + [dtRamp];
 
if CompareMem(@devGUID, @IID_IDirect3DRefDevice, Sizeof(TGUID)) then
D3DDeviceTypeSet := D3DDeviceTypeSet + [dtRef];
{$ENDIF}
BitCount := rec.BitCount;
end;
 
5962,21 → 3250,14
BitCount: Integer;
Driver: PGUID;
DriverGUID: TGUID;
{$IFNDEF D3D_deprecated}
D3DDeviceTypeSet: TD3DDeviceTypeSet;
{$ENDIF}
begin
BitCount := DXDraw.Display.BitCount;
Driver := DXDraw.Driver;
Direct3DInitializing(Options, BitCount, Driver, DriverGUID{$IFNDEF D3D_deprecated}, D3DDeviceTypeSet{$ENDIF});
Direct3DInitializing(Options, BitCount, Driver, DriverGUID);
DXDraw.Driver := Driver;
DXDraw.Display.BitCount := BitCount;
{$IFNDEF D3D_deprecated}
DXDraw.FDeviceTypeSet := D3DDeviceTypeSet;
{$ENDIF}
end;
 
{$IFDEF D3D_deprecated}
procedure InitializeDirect3D(Surface: TDirectDrawSurface;
var ZBuffer: TDirectDrawSurface;
out D3D: IDirect3D;
5985,7 → 3266,6
out D3DDevice: IDirect3DDevice;
out D3DDevice2: IDirect3DDevice2;
out D3DDevice3: IDirect3DDevice3;
{$IFDEF D3DRM}
var D3DRM: IDirect3DRM;
var D3DRM2: IDirect3DRM2;
var D3DRM3: IDirect3DRM3;
5995,7 → 3275,6
out Viewport: IDirect3DRMViewport;
var Scene: IDirect3DRMFrame;
var Camera: IDirect3DRMFrame;
{$ENDIF}
var NowOptions: TInitializeDirect3DOptions);
type
TInitializeDirect3DRecord = record
6021,18 → 3300,16
Result := False;
FreeZBufferSurface(Surface, ZBuffer);
 
if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_16 <> 0 then
if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_16<>0 then
ZBufferBitDepth := 16
else
if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_24 <> 0 then
else if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_24<>0 then
ZBufferBitDepth := 24
else
if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_32 <> 0 then
else if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_32<>0 then
ZBufferBitDepth := 32
else
ZBufferBitDepth := 0;
 
if ZBufferBitDepth <> 0 then
if ZBufferBitDepth<>0 then
begin
with ddsd do
begin
6048,7 → 3325,7
ZBuffer := TDirectDrawSurface.Create(Surface.DDraw);
if ZBuffer.CreateSurface(ddsd) then
begin
if Surface.ISurface.AddAttachedSurface(ZBuffer.ISurface) <> DD_OK then
if Surface.ISurface.AddAttachedSurface(ZBuffer.ISurface)<>DD_OK then
begin
ZBuffer.Free; ZBuffer := nil;
Exit;
6062,6 → 3339,7
end;
end;
 
 
function EnumDeviceCallBack(const lpGuid: TGUID; lpDeviceDescription, lpDeviceName: PChar;
const lpD3DHWDeviceDesc, lpD3DHELDeviceDesc: TD3DDeviceDesc;
lpUserArg: Pointer): HRESULT; stdcall;
6084,7 → 3362,7
Result := D3DENUMRET_OK;
rec := lpUserArg;
 
Hardware := lpD3DHWDeviceDesc.dcmColorModel <> 0;
Hardware := lpD3DHWDeviceDesc.dcmColorModel<>0;
if Hardware then
dev := @lpD3DHWDeviceDesc
else
6091,11 → 3369,11
dev := @lpD3DHELDeviceDesc;
 
if (Hardware) and (not rec.SupportHardware) then Exit;
if dev.dcmColorModel <> D3DCOLOR_RGB then Exit;
if dev.dcmColorModel<>D3DCOLOR_RGB then Exit;
if CompareMem(@lpGUID, @IID_IDirect3DRefDevice, SizeOf(TGUID)) then Exit;
 
{ Bit depth test. }
if (dev.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount)) = 0 then Exit;
if (dev.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount))=0 then Exit;
 
if Hardware then
begin
6144,10 → 3422,9
NowOptions := NowOptions + [idoZBuffer];
end;
end;
{$IFDEF D3DRM}
 
type
TDirect3DRMCreate = function(out lplpDirect3DRM: IDirect3DRM): HRESULT; stdcall;
{$ENDIF}
TDirect3DRMCreate= function(out lplpDirect3DRM: IDirect3DRM): HRESULT; stdcall;
begin
try
Options := NowOptions;
6158,20 → 3435,20
D3D := D3D3 as IDirect3D;
 
{ Whether hardware can be used is tested. }
SupportHardware := (Surface.SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_VIDEOMEMORY <> 0) and
(idoHardware in Options) and (Surface.DDraw.DriverCaps.dwCaps and DDCAPS_3D <> 0);
SupportHardware := (Surface.SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_VIDEOMEMORY<>0) and
(idoHardware in Options) and (Surface.DDraw.DriverCaps.dwCaps and DDCAPS_3D<>0);
 
if Surface.DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_TEXTURE = 0 then
if Surface.DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_TEXTURE=0 then
SupportHardware := False;
 
{ Direct3D }
InitDevice;
 
if D3D3.CreateDevice(D3DDeviceGUID, Surface.ISurface4, D3DDevice3, nil) <> D3D_OK then
if D3D3.CreateDevice(D3DDeviceGUID, Surface.ISurface4, D3DDevice3, nil)<>D3D_OK then
begin
SupportHardware := False;
InitDevice;
if D3D3.CreateDevice(D3DDeviceGUID, Surface.ISurface4, D3DDevice3, nil) <> D3D_OK then
if D3D3.CreateDevice(D3DDeviceGUID, Surface.ISurface4, D3DDevice3, nil)<>D3D_OK then
raise EDXDrawError.CreateFmt(SCannotMade, ['IDirect3DDevice3']);
end;
 
6183,23 → 3460,24
with D3DDevice3 do
begin
SetRenderState(TD3DRenderStateType(D3DRENDERSTATE_DITHERENABLE), 1);
SetRenderState(TD3DRenderStateType(D3DRENDERSTATE_ZENABLE), Ord(ZBuffer <> nil));
SetRenderState(TD3DRenderStateType(D3DRENDERSTATE_ZWRITEENABLE), Ord(ZBuffer <> nil));
SetRenderState(TD3DRenderStateType(D3DRENDERSTATE_ZENABLE), Ord(ZBuffer<>nil));
SetRenderState(TD3DRenderStateType(D3DRENDERSTATE_ZWRITEENABLE), Ord(ZBuffer<>nil));
end;
{$IFDEF D3DRM}
 
{ Direct3D Retained Mode}
if idoRetainedMode in Options then
begin
NowOptions := NowOptions + [idoRetainedMode];
if D3DRM = nil then
 
if D3DRM=nil then
begin
if TDirect3DRMCreate(DXLoadLibrary('D3DRM.dll', 'Direct3DRMCreate'))(D3DRM) <> D3DRM_OK then
if TDirect3DRMCreate(DXLoadLibrary('D3DRM.dll', 'Direct3DRMCreate'))(D3DRM)<>D3DRM_OK then
raise EDXDrawError.CreateFmt(SCannotInitialized, [SDirect3DRM]);
D3DRM2 := D3DRM as IDirect3DRM2;
D3DRM3 := D3DRM as IDirect3DRM3;
end;
 
if D3DRM3.CreateDeviceFromD3D(D3D2, D3DDevice2, D3DRMDevice3) <> D3DRM_OK then
if D3DRM3.CreateDeviceFromD3D(D3D2, D3DDevice2, D3DRMDevice3)<>D3DRM_OK then
raise EDXDrawError.CreateFmt(SCannotMade, ['IDirect3DRMDevice2']);
 
D3DRMDevice3.SetBufferCount(2);
6211,7 → 3489,7
D3DRMDevice.SetTextureQuality(D3DRMTEXTURE_NEAREST);
D3DRMDevice.SetDither(True);
 
if Surface.BitCount = 8 then
if Surface.BitCount=8 then
begin
D3DRMDevice.SetShades(8);
D3DRM.SetDefaultTextureColors(64);
6223,7 → 3501,7
end;
 
{ Frame making }
if Scene = nil then
if Scene=nil then
begin
D3DRM.CreateFrame(nil, Scene);
D3DRM.CreateFrame(Scene, Camera);
6235,8 → 3513,7
Surface.Width, Surface.Height, Viewport);
Viewport.SetBack(5000.0);
end;
{$ENDIF}
except
except
FreeZBufferSurface(Surface, ZBuffer);
D3D := nil;
D3D2 := nil;
6244,7 → 3521,6
D3DDevice := nil;
D3DDevice2 := nil;
D3DDevice3 := nil;
{$IFDEF D3DRM}
D3DRM := nil;
D3DRM2 := nil;
D3DRMDevice := nil;
6252,11 → 3528,9
Viewport := nil;
Scene := nil;
Camera := nil;
{$ENDIF}
raise;
end;
end;
{$ENDIF}
 
procedure InitializeDirect3D7(Surface: TDirectDrawSurface;
var ZBuffer: TDirectDrawSurface;
6279,46 → 3553,37
MemPosition: array[Boolean] of Integer = (DDSCAPS_SYSTEMMEMORY, DDSCAPS_VIDEOMEMORY);
var
ZBufferBitDepth: Integer;
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
begin
Result := False;
FreeZBufferSurface(Surface, ZBuffer);
 
if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_16 <> 0 then
if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_16<>0 then
ZBufferBitDepth := 16
else if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_24 <> 0 then
else if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_24<>0 then
ZBufferBitDepth := 24
else if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_32 <> 0 then
else if DeviceDesc.dwDeviceZBufferBitDepth and DDBD_32<>0 then
ZBufferBitDepth := 32
else
ZBufferBitDepth := 0;
 
if ZBufferBitDepth <> 0 then
if ZBufferBitDepth<>0 then
begin
with ddsd do
begin
dwSize := SizeOf(ddsd);
Surface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetSurfaceDesc(ddsd);
Surface.ISurface.GetSurfaceDesc(ddsd);
dwFlags := DDSD_CAPS or DDSD_WIDTH or DDSD_HEIGHT or DDSD_ZBUFFERBITDEPTH;
ddsCaps.dwCaps := DDSCAPS_ZBUFFER or MemPosition[Hardware];
dwHeight := Surface.Height;
dwWidth := Surface.Width;
{$IFDEF D3D_deprecated}
dwZBufferBitDepth := ZBufferBitDepth;
{$ELSE}
ddpfPixelFormat.dwFlags := DDPF_ZBUFFER;
ddpfPixelFormat.dwZBufferBitDepth := ZBufferBitDepth;
ddpfPixelFormat.dwStencilBitDepth := 0;
ddpfPixelFormat.dwZBitMask := (1 shl ZBufferBitDepth) - 1;
ddpfPixelFormat.dwStencilBitMask := 0;
ddpfPixelFormat.dwLuminanceAlphaBitMask := 0;
{$ENDIF}
end;
 
ZBuffer := TDirectDrawSurface.Create(Surface.DDraw);
if ZBuffer.CreateSurface(ddsd) then
begin
if Surface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.AddAttachedSurface(ZBuffer.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}) <> DD_OK then
if Surface.ISurface.AddAttachedSurface(ZBuffer.ISurface)<>DD_OK then
begin
ZBuffer.Free; ZBuffer := nil;
Exit;
6349,13 → 3614,13
Result := D3DENUMRET_OK;
rec := lpUserArg;
 
Hardware := lpTD3DDeviceDesc.dwDevCaps and D3DDEVCAPS_HWRASTERIZATION <> 0;
Hardware := lpTD3DDeviceDesc.dwDevCaps and D3DDEVCAPS_HWRASTERIZATION<>0;
 
if Hardware and (not rec.SupportHardware) then Exit;
if CompareMem(@lpTD3DDeviceDesc.deviceGUID, @IID_IDirect3DRefDevice, SizeOf(TGUID)) then Exit;
 
{ Bit depth test. }
if (lpTD3DDeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount)) = 0 then Exit;
if (lpTD3DDeviceDesc.dwDeviceRenderBitDepth and BPPToDDBD(rec.BitCount))=0 then Exit;
 
if Hardware then
begin
6406,26 → 3671,27
end;
 
begin
 
try
Options := NowOptions {$IFDEF D3DRM}- [idoRetainedMode]{$ENDIF};
Options := NowOptions - [idoRetainedMode];
NowOptions := [];
 
D3D7 := Surface.DDraw.IDraw7 as IDirect3D7;
 
{ Whether hardware can be used is tested. }
SupportHardware := (Surface.SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_VIDEOMEMORY <> 0) and
(idoHardware in Options) and (Surface.DDraw.DriverCaps.dwCaps and DDCAPS_3D <> 0) and
(Surface.DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_TEXTURE <> 0);
SupportHardware := (Surface.SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_VIDEOMEMORY<>0) and
(idoHardware in Options) and (Surface.DDraw.DriverCaps.dwCaps and DDCAPS_3D<>0);
 
if Surface.DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_TEXTURE=0 then
SupportHardware := False;
 
{ Direct3D }
InitDevice;
 
if D3D7.CreateDevice(D3DDeviceGUID, Surface.ISurface7, D3DDevice7) <> D3D_OK then
if D3D7.CreateDevice(D3DDeviceGUID, Surface.ISurface7, D3DDevice7)<>D3D_OK then
begin
SupportHardware := False;
InitDevice;
if D3D7.CreateDevice(D3DDeviceGUID, Surface.ISurface7, D3DDevice7) <> D3D_OK then
if D3D7.CreateDevice(D3DDeviceGUID, Surface.ISurface7, D3DDevice7)<>D3D_OK then
raise EDXDrawError.CreateFmt(SCannotMade, ['IDirect3DDevice7']);
end;
 
6437,10 → 3703,10
raise;
end;
end;
 
type
{ TDXDrawDriver }
 
{ TDXDrawDriver }
 
TDXDrawDriver = class
private
FDXDraw: TCustomDXDraw;
6468,17 → 3734,6
procedure Initialize; override;
end;
 
procedure TCustomDXDraw.MirrorFlip(Value: TRenderMirrorFlipSet);
begin
if CheckD3 then
FD2D.MirrorFlip := Value;
end;
 
procedure TCustomDXDraw.SaveTextures(path: string);
begin
if CheckD3 then
FD2D.SaveTextures(path)
end;
{ TDXDrawDriver }
 
constructor TDXDrawDriver.Create(ADXDraw: TCustomDXDraw);
6489,8 → 3744,8
FDXDraw := ADXDraw;
 
{ Driver selection and Display mode optimizationn }
if FDXDraw.FOptions * [doFullScreen, doSystemMemory, {$IFDEF D3D_deprecated}do3D,{$ENDIF} doHardware] =
[doFullScreen, {$IFDEF D3D_deprecated}do3D,{$ENDIF} doHardware] then
if FDXDraw.FOptions*[doFullScreen, doSystemMemory, do3D, doHardware]=
[doFullScreen, do3D, doHardware] then
begin
AOptions := [];
with FDXDraw do
6499,7 → 3754,7
if not FDXDraw.Display.FixedBitCount then AOptions := AOptions + [idoOptimizeDisplayMode];
 
if doHardware in Options then AOptions := AOptions + [idoHardware];
{$IFDEF D3DRM}if doRetainedMode in Options then AOptions := AOptions + [idoRetainedMode];{$ENDIF}
if doRetainedMode in Options then AOptions := AOptions + [idoRetainedMode];
if doZBuffer in Options then AOptions := AOptions + [idoZBuffer];
end;
 
6506,15 → 3761,15
Direct3DInitializing_DXDraw(AOptions, FDXDraw);
end;
 
if FDXDraw.Options * [doFullScreen, doHardware, doSystemMemory] = [doFullScreen, doHardware] then
FDXDraw.FDDraw := TDirectDraw.CreateEx(PGUID(FDXDraw.FDriver), {$IFDEF D3D_deprecated}doDirectX7Mode in FDXDraw.Options{$ELSE}True{$ENDIF})
if FDXDraw.Options*[doFullScreen, doHardware, doSystemMemory]=[doFullScreen, doHardware] then
FDXDraw.FDDraw := TDirectDraw.CreateEx(PGUID(FDXDraw.FDriver), doDirectX7Mode in FDXDraw.Options)
else
FDXDraw.FDDraw := TDirectDraw.CreateEx(nil, {$IFDEF D3D_deprecated}doDirectX7Mode in FDXDraw.Options{$ELSE}True{$ENDIF});
FDXDraw.FDDraw := TDirectDraw.CreateEx(nil, doDirectX7Mode in FDXDraw.Options);
end;
 
procedure TDXDrawDriver.Initialize3D;
const
DXDrawOptions3D = [doHardware, {$IFDEF D3DRM}doRetainedMode,{$ENDIF} doSelectDriver, doZBuffer];
DXDrawOptions3D = [doHardware, doRetainedMode, doSelectDriver, doZBuffer];
var
AOptions: TInitializeDirect3DOptions;
begin
6522,10 → 3777,10
with FDXDraw do
begin
if doHardware in FOptions then AOptions := AOptions + [idoHardware];
{$IFDEF D3DRM}if doRetainedMode in FNowOptions then AOptions := AOptions + [idoRetainedMode];{$ENDIF}
if doRetainedMode in FNowOptions then AOptions := AOptions + [idoRetainedMode];
if doSelectDriver in FOptions then AOptions := AOptions + [idoSelectDriver];
if doZBuffer in FOptions then AOptions := AOptions + [idoZBuffer];
{$IFDEF D3D_deprecated}
 
if doDirectX7Mode in FOptions then
begin
InitializeDirect3D7(FSurface, FZBuffer, FD3D7, FD3DDevice7, AOptions);
6532,17 → 3787,12
end else
begin
InitializeDirect3D(FSurface, FZBuffer, FD3D, FD3D2, FD3D3, FD3DDevice, FD3DDevice2, FD3DDevice3,
{$IFDEF D3DRM}
FD3DRM, FD3DRM2, FD3DRM3, FD3DRMDevice, FD3DRMDevice2, FD3DRMDevice3, FViewport, FScene, FCamera,
{$ENDIF}
AOptions);
FD3DRM, FD3DRM2, FD3DRM3, FD3DRMDevice, FD3DRMDevice2, FD3DRMDevice3, FViewport, FScene, FCamera, AOptions);
end;
{$ELSE}
InitializeDirect3D7(FSurface, FZBuffer, FD3D7, FD3DDevice7, AOptions);
{$ENDIF}
 
FNowOptions := FNowOptions - DXDrawOptions3D;
if idoHardware in AOptions then FNowOptions := FNowOptions + [doHardware];
{$IFDEF D3DRM}if idoRetainedMode in AOptions then FNowOptions := FNowOptions + [doRetainedMode];{$ENDIF}
if idoRetainedMode in AOptions then FNowOptions := FNowOptions + [doRetainedMode];
if idoSelectDriver in AOptions then FNowOptions := FNowOptions + [doSelectDriver];
if idoZBuffer in AOptions then FNowOptions := FNowOptions + [doZBuffer];
end;
6559,7 → 3809,6
begin
with FDXDraw do
begin
{$IFDEF D3DRM}
FViewport := nil;
FCamera := nil;
FScene := nil;
6567,30 → 3816,25
FD3DRMDevice := nil;
FD3DRMDevice2 := nil;
FD3DRMDevice3 := nil;
FD3DRM3 := nil;
FD3DRM2 := nil;
FD3DRM := nil;
{$ENDIF}
{$IFDEF D3D_deprecated}
FD3DDevice := nil;
FD3DDevice2 := nil;
FD3DDevice3 := nil;
{$ENDIF}
FD3DDevice7 := nil;
{$IFDEF D3D_deprecated}
FD3D := nil;
FD3D2 := nil;
FD3D3 := nil;
{$ENDIF}
FD3D7 := nil;
 
FreeZBufferSurface(FSurface, FZBuffer);
 
FClipper.Free; FClipper := nil;
FPalette.Free; FPalette := nil;
FSurface.Free; FSurface := nil;
FPrimary.Free; FPrimary := nil;
FClipper.Free; FClipper := nil;
FPalette.Free; FPalette := nil;
FSurface.Free; FSurface := nil;
FPrimary.Free; FPrimary := nil;
 
FD3DRM3 := nil;
FD3DRM2 := nil;
FD3DRM := nil;
end;
end;
 
6623,20 → 3867,17
if not AllowPalette256 then
begin
dc := GetDC(0);
try
GetSystemPaletteEntries(dc, 0, 256, Entries);
finally
ReleaseDC(0, dc);
end;
GetSystemPaletteEntries(dc, 0, 256, Entries);
ReleaseDC(0, dc);
 
for i := 0 to 9 do
for i:=0 to 9 do
Result[i] := Entries[i];
 
for i := 256 - 10 to 255 do
for i:=256-10 to 255 do
Result[i] := Entries[i];
end;
 
for i := 0 to 255 do
for i:=0 to 255 do
Result[i].peFlags := D3DPAL_READONLY;
end;
 
6655,8 → 3896,8
begin
if doCenter in FDXDraw.NowOptions then
begin
Inc(pt.x, (FDXDraw.Width - FDXDraw.FSurface.Width) div 2);
Inc(pt.y, (FDXDraw.Height - FDXDraw.FSurface.Height) div 2);
Inc(pt.x, (FDXDraw.Width-FDXDraw.FSurface.Width) div 2);
Inc(pt.y, (FDXDraw.Height-FDXDraw.FSurface.Height) div 2);
end;
 
Dest := Bounds(pt.x, pt.y, FDXDraw.FSurface.Width, FDXDraw.FSurface.Height);
6663,9 → 3904,8
end;
 
if doWaitVBlank in FDXDraw.NowOptions then
FDXDraw.FDDraw.DXResult := FDXDraw.FDDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, 0);
FDXDraw.FDDraw.DXResult := FDXDraw.FDDraw.IDraw.WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, 0);
 
FillChar(DF, SizeOf(DF), 0);
DF.dwsize := SizeOf(DF);
DF.dwDDFX := 0;
 
6673,27 → 3913,16
end;
 
procedure TDXDrawDriverBlt.Initialize;
{$IFDEF D3D_deprecated}
const
PrimaryDesc: TDDSurfaceDesc = (
dwSize: SizeOf(PrimaryDesc);
dwFlags: DDSD_CAPS;
ddsCaps: (dwCaps: DDSCAPS_PRIMARYSURFACE)
);
{$ENDIF}
dwSize: SizeOf(PrimaryDesc);
dwFlags: DDSD_CAPS;
ddsCaps: (dwCaps: DDSCAPS_PRIMARYSURFACE)
);
var
Entries: TPaletteEntries;
PaletteCaps: Integer;
{$IFNDEF D3D_deprecated}
PrimaryDesc: TDDSurfaceDesc2;
{$ENDIF}
begin
{$IFNDEF D3D_deprecated}
FillChar(PrimaryDesc, SizeOf(PrimaryDesc), 0);
PrimaryDesc.dwSize := SizeOf(PrimaryDesc);
PrimaryDesc.dwFlags := DDSD_CAPS;
PrimaryDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;
{$ENDIF}
{ Surface making }
FDXDraw.FPrimary := TDirectDrawSurface.Create(FDXDraw.FDDraw);
if not FDXDraw.FPrimary.CreateSurface(PrimaryDesc) then
6723,9 → 3952,9
 
procedure TDXDrawDriverBlt.InitializeSurface;
var
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
begin
FDXDraw.FSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil;
FDXDraw.FSurface.IDDSurface := nil;
 
{ Surface making }
FDXDraw.FNowOptions := FDXDraw.FNowOptions - [doSystemMemory];
6740,7 → 3969,7
ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;
if doSystemMemory in FDXDraw.Options then
ddsCaps.dwCaps := ddsCaps.dwCaps or DDSCAPS_SYSTEMMEMORY;
{$IFDEF D3D_deprecated}if do3D in FDXDraw.FNowOptions then{$ENDIF}
if do3D in FDXDraw.FNowOptions then
ddsCaps.dwCaps := ddsCaps.dwCaps or DDSCAPS_3DDEVICE;
end;
 
6751,13 → 3980,13
raise EDXDrawError.CreateFmt(SCannotMade, [SDirectDrawSurface]);
end;
 
if FDXDraw.FSurface.SurfaceDesc.ddscaps.dwCaps and DDSCAPS_VIDEOMEMORY = 0 then
if FDXDraw.FSurface.SurfaceDesc.ddscaps.dwCaps and DDSCAPS_VIDEOMEMORY=0 then
FDXDraw.FNowOptions := FDXDraw.FNowOptions + [doSystemMemory];
 
FDXDraw.FSurface.Palette := FDXDraw.Palette;
FDXDraw.FSurface.Fill(0);
 
{$IFDEF D3D_deprecated}if do3D in FDXDraw.FNowOptions then{$ENDIF}
if do3D in FDXDraw.FNowOptions then
Initialize3D;
end;
 
6776,8 → 4005,8
begin
FDXDraw.FCalledDoInitializeSurface := False;
FDXDraw.DoFinalizeSurface;
end;
 
end;
InitializeSurface;
 
FDXDraw.NotifyEventList(dxntInitializeSurface);
6790,46 → 4019,32
{ TDXDrawDriverFlip }
 
procedure TDXDrawDriverFlip.Flip;
begin
if (FDXDraw.FForm <> nil) and (FDXDraw.FForm.Active) then
FDXDraw.FPrimary.DXResult := FDXDraw.FPrimary.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.Flip(nil, DDFLIP_WAIT)
begin
if (FDXDraw.FForm<>nil) and (FDXDraw.FForm.Active) then
FDXDraw.FPrimary.DXResult := FDXDraw.FPrimary.ISurface.Flip(nil, DDFLIP_WAIT)
else
FDXDraw.FPrimary.DXResult := 0;
end;
 
procedure TDXDrawDriverFlip.Initialize;
{$IFDEF D3D_deprecated}
const
DefPrimaryDesc: TDDSurfaceDesc = (
dwSize: SizeOf(DefPrimaryDesc);
dwFlags: DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
dwBackBufferCount: 1;
ddsCaps: (dwCaps: DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX)
);
dwSize: SizeOf(DefPrimaryDesc);
dwFlags: DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
dwBackBufferCount: 1;
ddsCaps: (dwCaps: DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX)
);
BackBufferCaps: TDDSCaps = (dwCaps: DDSCAPS_BACKBUFFER);
{$ENDIF}
var
PrimaryDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
PrimaryDesc: TDDSurfaceDesc;
PaletteCaps: Integer;
Entries: TPaletteEntries;
DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF};
{$IFNDEF D3D_deprecated}
BackBufferCaps: TDDSCaps2;
{$ENDIF}
DDSurface: IDirectDrawSurface;
begin
{ Surface making }
{$IFDEF D3D_deprecated}
PrimaryDesc := DefPrimaryDesc;
{$ELSE}
FillChar(PrimaryDesc, SizeOf(PrimaryDesc), 0);
PrimaryDesc.dwSize := SizeOf(PrimaryDesc);
PrimaryDesc.dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
PrimaryDesc.dwBackBufferCount := 1;
PrimaryDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
FillChar(BackBufferCaps, SizeOf(BackBufferCaps), 0);
BackBufferCaps.dwCaps := DDSCAPS_BACKBUFFER;
{$ENDIF}
{$IFDEF D3D_deprecated}if do3D in FDXDraw.FNowOptions then{$ENDIF}
 
if do3D in FDXDraw.FNowOptions then
PrimaryDesc.ddsCaps.dwCaps := PrimaryDesc.ddsCaps.dwCaps or DDSCAPS_3DDEVICE;
 
FDXDraw.FPrimary := TDirectDrawSurface.Create(FDXDraw.FDDraw);
6837,11 → 4052,11
raise EDXDrawError.CreateFmt(SCannotMade, [SDirectDrawPrimarySurface]);
 
FDXDraw.FSurface := TDirectDrawSurface.Create(FDXDraw.FDDraw);
if FDXDraw.FPrimary.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetAttachedSurface(BackBufferCaps, DDSurface) = DD_OK then
FDXDraw.FSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := DDSurface;
if FDXDraw.FPrimary.ISurface.GetAttachedSurface(BackBufferCaps, DDSurface)=DD_OK then
FDXDraw.FSurface.IDDSurface := DDSurface;
 
FDXDraw.FNowOptions := FDXDraw.FNowOptions - [doSystemMemory];
if FDXDraw.FSurface.SurfaceDesc.ddscaps.dwCaps and DDSCAPS_SYSTEMMEMORY <> 0 then
if FDXDraw.FSurface.SurfaceDesc.ddscaps.dwCaps and DDSCAPS_SYSTEMMEMORY<>0 then
FDXDraw.FNowOptions := FDXDraw.FNowOptions + [doSystemMemory];
 
{ Clipper making of dummy }
6856,13 → 4071,12
Entries := TDXDrawRGBQuadsToPaletteEntries(FDXDraw.ColorTable,
doAllowPalette256 in FDXDraw.NowOptions);
FDXDraw.FPalette.CreatePalette(PaletteCaps, Entries);
 
FDXDraw.FPrimary.Palette := FDXDraw.Palette;
FDXDraw.FSurface.Palette := FDXDraw.Palette;
 
{$IFDEF D3D_deprecated}if do3D in FDXDraw.FNowOptions then{$ENDIF}
if do3D in FDXDraw.FNowOptions then
Initialize3D;
 
end;
 
constructor TCustomDXDraw.Create(AOwner: TComponent);
6874,18 → 4088,14
inherited Create(AOwner);
FAutoInitialize := True;
FDisplay := TDXDrawDisplay.Create(Self);
{$IFDEF _DMO_}FAdapters := EnumDirectDrawDriversEx;{$ENDIF}
Options := [doAllowReboot, doWaitVBlank, doCenter, {$IFDEF D3D_deprecated}doDirectX7Mode, do3D,{$ENDIF}
doHardware, doSelectDriver];
 
Options := [doAllowReboot, doWaitVBlank, doCenter, doDirectX7Mode, doHardware, doSelectDriver];
 
FAutoSize := True;
 
dc := GetDC(0);
try
GetSystemPaletteEntries(dc, 0, 256, Entries);
finally
ReleaseDC(0, dc);
end;
GetSystemPaletteEntries(dc, 0, 256, Entries);
ReleaseDC(0, dc);
 
ColorTable := PaletteEntriesToRGBQuads(Entries);
DefColorTable := ColorTable;
6893,11 → 4103,7
Width := 100;
Height := 100;
ParentColor := False;
Color := clBlack; //clBtnFace; // FIX
 
FD2D := TD2D.Create(Self);
D2D := FD2D; {as loopback}
FTraces := TTraces.Create(Self);
Color := clBtnFace;
end;
 
destructor TCustomDXDraw.Destroy;
6905,13 → 4111,8
Finalize;
NotifyEventList(dxntDestroying);
FDisplay.Free;
{$IFDEF _DMO_}FAdapters := nil;{$ENDIF}
FSubClass.Free; FSubClass := nil;
FNotifyEventList.Free;
FD2D.Free;
FD2D := nil;
D2D := nil;
FTraces.Free;
inherited Destroy;
end;
 
6920,13 → 4121,6
Result := EnumDirectDrawDrivers;
end;
 
{$IFDEF _DMO_}
class function TCustomDXDraw.DriversEx: TDirectXDriversEx;
begin
Result := EnumDirectDrawDriversEx;
end;
{$ENDIF}
 
type
PDXDrawNotifyEvent = ^TDXDrawNotifyEvent;
 
6947,7 → 4141,7
NotifyEvent(Self, dxntInitialize);
if FCalledDoInitializeSurface then
NotifyEvent(Self, dxntInitializeSurface);
if FOffNotifyRestore = 0 then
if FOffNotifyRestore=0 then
NotifyEvent(Self, dxntRestore);
end;
end;
6957,7 → 4151,7
Event: PDXDrawNotifyEvent;
i: Integer;
begin
for i := 0 to FNotifyEventList.Count - 1 do
for i:=0 to FNotifyEventList.Count-1 do
begin
Event := FNotifyEventList[i];
if (TMethod(Event^).Code = TMethod(NotifyEvent).Code) and
6980,7 → 4174,7
var
i: Integer;
begin
for i := FNotifyEventList.Count - 1 downto 0 do
for i:=FNotifyEventList.Count-1 downto 0 do
PDXDrawNotifyEvent(FNotifyEventList[i])^(Self, NotifyType);
end;
 
6988,8 → 4182,8
 
procedure FlipToGDISurface;
begin
if Initialized and (FNowOptions * [doFullScreen, doFlip] = [doFullScreen, doFlip]) then
DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.FlipToGDISurface;
if Initialized and (FNowOptions*[doFullScreen, doFlip]=[doFullScreen, doFlip]) then
DDraw.IDraw.FlipToGDISurface;
end;
 
begin
7002,64 → 4196,29
Exit;
end; }
WM_WINDOWPOSCHANGED:
begin
if TWMWindowPosChanged(Message).WindowPos^.flags and SWP_SHOWWINDOW <> 0 then
begin
DefWindowProc(Message);
if AutoInitialize and (not FInitialized2) then
Initialize;
Exit;
if TWMWindowPosChanged(Message).WindowPos^.flags and SWP_SHOWWINDOW<>0 then
begin
DefWindowProc(Message);
if AutoInitialize and (not FInitialized2) then
Initialize;
Exit;
end;
end;
end;
(*
WM_ACTIVATEAPP:
begin
if TWMActivateApp(Message).Active then
WM_ACTIVATE:
begin
FActive := True;
DoActivate;
// PostMessage(FHandle, CM_ACTIVATE, 0, 0)
end
else
if TWMActivate(Message).Active=WA_INACTIVE then
FlipToGDISurface;
end;
WM_INITMENU:
begin
FActive := False;
DoDeactivate;
// PostMessage(FHandle, CM_DEACTIVATE, 0, 0);
FlipToGDISurface;
end;
end;
*)
WM_ACTIVATE:
begin
if TWMActivate(Message).Active = WA_INACTIVE then
FlipToGDISurface;
end;
WM_INITMENU:
begin
FlipToGDISurface;
end;
WM_DESTROY:
begin
Finalize;
end;
WM_ENTERSIZEMOVE:
begin
if not (csLoading in ComponentState) then
begin
Finalize;
end;
WM_EXITSIZEMOVE:
begin
if not (csLoading in ComponentState) then
Initialize;
end;
// SW_RESTORE, SW_MAXIMIZE:
// begin
// {force finalize/initialize loop}
// if not AutoInitialize or not (csLoading in ComponentState) then begin
// Finalize;
// Initialize;
// end;
// end;
end;
end;
end;
DefWindowProc(Message);
end;
 
7075,26 → 4234,11
 
procedure TCustomDXDraw.DoInitialize;
begin
{$IFDEF _DMO_}
{erase items for following refresh}
if Assigned(FAdapters) then FAdapters.Clear;
EnumDirectDrawDriversEx;
{$ENDIF}
if Assigned(FOnInitialize) then FOnInitialize(Self);
{$IFNDEF DXR_deprecated}
{$IFDEF D3D_deprecated}
if not (do3D in Options) then
Options := Options + [do3D];
{$ENDIF}
{$ENDIF}
end;
 
procedure TCustomDXDraw.DoInitializeSurface;
begin
{.06 added for better initialization}
if Assigned(FD2D) then
RenderError := FD2D.D2DInitializeSurface;
 
if Assigned(FOnInitializeSurface) then FOnInitializeSurface(Self);
end;
 
7150,10 → 4294,6
FUpdating := False;
end;
end;
if AsSigned(FD2D) then
FD2D.Free;
FD2D := nil;
D2D := nil
end;
 
procedure TCustomDXDraw.Flip;
7160,21 → 4300,14
begin
if Initialized and (not FUpdating) then
begin
if TryRestore and (not RenderError) then
if TryRestore then
TDXDrawDriver(FDXDrawDriver).Flip;
end;
RenderError := false;
end;
 
function TCustomDXDraw.GetCanDraw: Boolean;
begin
{$IFNDEF DXR_deprecated}
{$IFDEF D3D_deprecated}
if not (do3D in Options) then
Options := Options + [do3D];
{$ENDIF}
{$ENDIF}
Result := Initialized and (not FUpdating) and (Surface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) and
Result := Initialized and (not FUpdating) and (Surface.IDDSurface<>nil) and
TryRestore;
end;
 
7181,12 → 4314,12
function TCustomDXDraw.GetCanPaletteAnimation: Boolean;
begin
Result := Initialized and (not FUpdating) and (doFullScreen in FNowOptions)
and (DDraw.DisplayMode.ddpfPixelFormat.dwRGBBitCount <= 8);
and (DDraw.DisplayMode.ddpfPixelFormat.dwRGBBitCount<=8);
end;
 
function TCustomDXDraw.GetSurfaceHeight: Integer;
begin
if Surface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if Surface.IDDSurface<>nil then
Result := Surface.Height
else
Result := FSurfaceHeight;
7194,7 → 4327,7
 
function TCustomDXDraw.GetSurfaceWidth: Integer;
begin
if Surface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if Surface.IDDSurface<>nil then
Result := Surface.Width
else
Result := FSurfaceWidth;
7213,8 → 4346,8
NotifyEventList(dxntSetSurfaceSize);
 
if FAutoInitialize and (not (csDesigning in ComponentState)) then
begin
if {(not (doFullScreen in FOptions)) or }(FSubClass = nil) then
begin
if {(not (doFullScreen in FOptions)) or }(FSubClass=nil) then
Initialize;
end;
end;
7225,7 → 4358,7
 
Finalize;
 
if FForm = nil then
if FForm=nil then
raise EDXDrawError.Create(SNoForm);
 
try
7284,11 → 4417,6
Dec(FOffNotifyRestore);
end;
 
if not Assigned(FD2D) then begin
FD2D := TD2D.Create(Self);
D2D := FD2D; {as loopback}
end;
 
Restore;
end;
 
7321,7 → 4449,7
 
Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := clBtnFace;
Canvas.TextOut(Width div 2 - w div 2, Height div 2 - h div 2, s);
Canvas.TextOut(Width div 2-w div 2, Height div 2-h div 2, s);
end else
begin
Old := FNowOptions;
7328,11 → 4456,11
try
FNowOptions := FNowOptions - [doWaitVBlank];
Flip;
finally
finally
FNowOptions := Old;
end;
if (Parent <> nil) and (Initialized) and (Surface.SurfaceDesc.ddscaps.dwCaps and DDSCAPS_VIDEOMEMORY <> 0) then
Parent.Invalidate;
end;
if (Parent<>nil) and (Initialized) and (Surface.SurfaceDesc.ddscaps.dwCaps and DDSCAPS_VIDEOMEMORY<>0) then
Parent.Invalidate;
end;
end;
 
7346,11 → 4474,9
Result := False;
end;
 
procedure TCustomDXDraw.Render(LagCount: Integer{$IFDEF VER4UP} = 0{$ENDIF});
var I: Integer;
procedure TCustomDXDraw.Render;
begin
{$IFDEF D3DRM}
if FInitialized and {$IFDEF D3D_deprecated}(do3D in FNowOptions) and{$ENDIF} (doRetainedMode in FNowOptions) then
if FInitialized and (do3D in FNowOptions) and (doRetainedMode in FNowOptions) then
begin
asm FInit end;
FViewport.Clear;
7358,15 → 4484,6
FD3DRMDevice.Update;
asm FInit end;
end;
{$ENDIF}
{traces}
if FTraces.Count > 0 then
for I := 0 to FTraces.Count - 1 do
if FTraces.Items[I].Active then
FTraces.Items[I].Render(LagCount);
{own rendering event}
if Assigned(FOnRender) then
FOnRender(Self);
end;
 
procedure TCustomDXDraw.Restore;
7393,7 → 4510,7
 
procedure TCustomDXDraw.SetAutoSize(Value: Boolean);
begin
if FAutoSize <> Value then
if FAutoSize<>Value then
begin
FAutoSize := Value;
if FAutoSize then
7408,260 → 4525,11
SetSize(AWidth, AHeight);
end;
 
procedure TCustomDXDraw.BeginScene;
begin
if CheckD3 then
FD2D.BeginScene
end;
 
procedure TCustomDXDraw.EndScene;
begin
if CheckD3 then
FD2D.EndScene
end;
 
function TCustomDXDraw.CheckD3: Boolean;
begin
Result := {$IFDEF D3D_deprecated}(do3D in Options) and{$ENDIF} (doHardware in Options) and AsSigned(FD2D);
end;
 
function TCustomDXDraw.CheckD3D(Dest: TDirectDrawSurface): Boolean;
begin
Result := CheckD3 and (FD2D.FDDraw.FSurface = Dest)
end;
 
procedure TCustomDXDraw.ClearStack;
begin
if CheckD3 then
FD2D.D2DTextures.D2DPruneAllTextures;
end;
 
procedure TCustomDXDraw.UpdateTextures;
var Changed: Boolean;
begin
if CheckD3 then begin
if Assigned(FOnUpdateTextures) then begin
Changed := False;
FOnUpdateTextures(FD2D.FD2DTexture, Changed);
if Changed then FD2D.D2DUpdateTextures;
end
end;
end;
 
procedure TCustomDXDraw.TextureFilter(Grade: TD2DTextureFilter);
begin
if CheckD3 then
FD2D.TextureFilter := Grade;
end;
 
procedure TCustomDXDraw.AntialiasFilter(Grade: TD3DAntialiasMode);
begin
if CheckD3 then
FD2D.AntialiasFilter := Grade;
end;
 
// ***** fade effects
// do not use in dxtimer cycle
 
function TCustomDXDraw.Fade2Color(colorfrom, colorto: LongInt): LongInt;
var i, r1, r2, g1, g2, b1, b2: Integer;
begin
r1 := GetRValue(colorfrom);
r2 := GetRValue(colorto);
g1 := GetGValue(colorfrom);
g2 := GetGValue(colorto);
b1 := GetBValue(colorfrom);
b2 := GetBValue(colorto);
if r1 < r2 then
begin
for i := r1 to r2 do
begin
Surface.Fill(RGB(i, g1, b1));
Flip;
end;
end
else
begin
for i := r1 downto r2 do
begin
Surface.Fill(RGB(i, g1, b1));
Flip;
end;
end;
 
if g1 < g2 then
begin
for i := g1 to g2 do
begin
Surface.Fill(RGB(r2, i, b1));
Flip;
end;
end
else
begin
for i := g1 downto g2 do
begin
Surface.Fill(RGB(r2, i, b1));
Flip;
end;
end;
if b1 < b2 then
begin
for i := b1 to b2 do
begin
Surface.Fill(RGB(r2, g2, i));
Flip;
end;
end
else
begin
for i := b1 downto b2 do
begin
Surface.Fill(RGB(r2, g2, i));
Flip;
end;
end;
Result := colorto;
end;
 
function TCustomDXDraw.Fade2Black(colorfrom: LongInt): LongInt;
var i, r, g, b: Integer;
begin
r := GetRValue(colorfrom);
g := GetGValue(colorfrom);
b := GetBValue(colorfrom);
for i := r downto 0 do
begin
Surface.Fill(RGB(i, g, b));
Flip;
end;
for i := g downto 0 do
begin
Surface.Fill(RGB(0, i, b));
Flip;
end;
for i := g downto 0 do
begin
Surface.Fill(RGB(0, 0, i));
Flip;
end;
Result := 0;
end;
 
function TCustomDXDraw.Fade2White(colorfrom: LongInt): LongInt;
var i, r, g, b: Integer;
begin
r := GetRValue(colorfrom);
g := GetGValue(colorfrom);
b := GetBValue(colorfrom);
for i := r to 255 do
begin
Surface.Fill(RGB(i, g, b));
Flip;
end;
for i := g to 255 do
begin
Surface.Fill(RGB(255, i, b));
Flip;
end;
for i := b to 255 do
begin
Surface.Fill(RGB(255, 255, i));
Flip;
end;
Result := RGB(255, 255, 255);
end;
 
function TCustomDXDraw.Grey2Fade(shadefrom, shadeto: Integer): Integer;
var i: Integer;
begin
if shadefrom < shadeto then
begin
for i := shadefrom to shadeto do
begin
Surface.Fill(RGB(i, i, i));
Flip;
end;
end
else
begin
for i := shadefrom downto shadeto do
begin
Surface.Fill(RGB(i, i, i));
Flip;
end;
end;
Result := shadeto;
end;
 
function TCustomDXDraw.FadeGrey2Screen(oldcolor, newcolour: LongInt): LongInt;
begin
result := Grey2Fade(oldcolor, newcolour);
end;
 
function TCustomDXDraw.Fade2Screen(oldcolor, newcolour: LongInt): LongInt;
begin
result := Fade2Color(oldcolor, newcolour);
end;
 
function TCustomDXDraw.White2Screen(oldcolor: Integer): LongInt;
begin
result := Fade2Color(oldcolor, RGB(255, 255, 255));
end;
 
function TCustomDXDraw.Black2Screen(oldcolor: Integer): LongInt;
begin
result := Fade2Color(oldcolor, RGB(0, 0, 0));
end;
 
procedure TCustomDXDraw.GrabImage(iX, iY, iWidth, iHeight: Integer; ddib: TDIB);
var ts, td: trect;
begin
ddib.SetSize(iWidth, iHeight, 24);
ts.left := iX;
ts.top := iY;
ts.right := iX + iWidth - 1;
ts.bottom := iY + iHeight - 1;
td.left := 0;
td.top := 0;
td.right := iWidth;
td.bottom := iHeight;
with Surface.Canvas do
begin
ddib.Canvas.CopyRect(td, Surface.Canvas, ts);
Release;
end;
end;
 
procedure TCustomDXDraw.PasteImage(sdib: TDIB; x, y: Integer);
var
ts, td: trect;
w, h: Integer;
begin
w := sdib.width - 1;
h := sdib.height - 1;
ts.left := 0;
ts.top := 0;
ts.right := w;
ts.bottom := h;
td.left := x;
td.top := y;
td.right := x + w;
td.bottom := y + h;
with Surface.Canvas do
begin
CopyRect(td, sdib.Canvas, ts);
release;
end;
end;
 
// *****
 
procedure TCustomDXDraw.SetColorTable(const ColorTable: TRGBQuads);
var
Entries: TPaletteEntries;
begin
if Initialized and (Palette <> nil) then
if Initialized and (Palette<>nil) then
begin
Entries := TDXDrawRGBQuadsToPaletteEntries(ColorTable,
doAllowPalette256 in FNowOptions);
7675,20 → 4543,20
Control: TWinControl;
begin
Control := FForm;
if Control = nil then
if Control=nil then
Control := Self;
 
if doFullScreen in FNowOptions then
begin
Flags := DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE or DDSCL_ALLOWMODEX{$IFDEF DXDOUBLEPRECISION} or DDSCL_FPUPRESERVE{$ENDIF};
Flags := DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE or DDSCL_ALLOWMODEX;
if doNoWindowChange in FNowOptions then
Flags := Flags or DDSCL_NOWINDOWCHANGES;
if doAllowReboot in FNowOptions then
Flags := Flags or DDSCL_ALLOWREBOOT;
end else
Flags := DDSCL_NORMAL{$IFDEF DXDOUBLEPRECISION} or DDSCL_FPUPRESERVE{$ENDIF};
Flags := DDSCL_NORMAL;
 
DDraw.DXResult := DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.SetCooperativeLevel(Control.Handle, Flags);
DDraw.DXResult := DDraw.IDraw.SetCooperativeLevel(Control.Handle, Flags);
end;
 
procedure TCustomDXDraw.SetDisplay(Value: TDXDrawDisplay);
7708,10 → 4576,9
 
procedure TCustomDXDraw.SetOptions(Value: TDXDrawOptions);
const
InitOptions = [doFullScreen, doNoWindowChange, doAllowReboot,
doAllowPalette256, doSystemMemory, doFlip,
{$IFDEF D3D_deprecated}doDirectX7Mode, do3D,{$ENDIF}{$IFDEF D3DRM} doRetainedMode, {$ENDIF}
doHardware, doSelectDriver, doZBuffer];
InitOptions = [doDirectX7Mode, doFullScreen, doNoWindowChange, doAllowReboot,
doAllowPalette256, doSystemMemory, doFlip, do3D,
doRetainedMode, doHardware, doSelectDriver, doZBuffer];
var
OldOptions: TDXDrawOptions;
begin
7720,11 → 4587,10
if Initialized then
begin
OldOptions := FNowOptions;
FNowOptions := FNowOptions * InitOptions + (FOptions - InitOptions);
{$IFDEF D3D_deprecated}
FNowOptions := FNowOptions*InitOptions+(FOptions-InitOptions);
 
if not (do3D in FNowOptions) then
FNowOptions := FNowOptions - [doHardware, {$IFDEF D3DRM}doRetainedMode,{$ENDIF} doSelectDriver, doZBuffer];
{$ENDIF}
FNowOptions := FNowOptions - [doHardware, doRetainedMode, doSelectDriver, doZBuffer];
end else
begin
FNowOptions := FOptions;
7731,16 → 4597,16
 
if not (doFullScreen in FNowOptions) then
FNowOptions := FNowOptions - [doNoWindowChange, doAllowReBoot, doAllowPalette256, doFlip];
{$IFDEF D3D_deprecated}
 
if not (do3D in FNowOptions) then
FNowOptions := FNowOptions - [doDirectX7Mode, {$IFDEF D3DRM}doRetainedMode,{$ENDIF} doHardware, doSelectDriver, doZBuffer];
{$ENDIF}
FNowOptions := FNowOptions - [doDirectX7Mode, doRetainedMode, doHardware, doSelectDriver, doZBuffer];
 
if doSystemMemory in FNowOptions then
FNowOptions := FNowOptions - [doFlip];
{$IFDEF D3DRM}
 
if doDirectX7Mode in FNowOptions then
FNowOptions := FNowOptions - [doRetainedMode];
{$ENDIF}
 
FNowOptions := FNowOptions - [doHardware];
end;
end;
7757,9 → 4623,9
if not (csDesigning in ComponentState) then
begin
Control := Parent;
while (Control <> nil) and (not (Control is TCustomForm)) do
while (Control<>nil) and (not (Control is TCustomForm)) do
Control := Control.Parent;
if Control <> nil then
if Control<>nil then
begin
FForm := TCustomForm(Control);
FSubClass := TControlSubClass.Create(Control, FormWndProc);
7769,7 → 4635,7
 
procedure TCustomDXDraw.SetSize(ASurfaceWidth, ASurfaceHeight: Integer);
begin
if ((ASurfaceWidth <> SurfaceWidth) or (ASurfaceHeight <> SurfaceHeight)) and
if ((ASurfaceWidth<>SurfaceWidth) or (ASurfaceHeight<>SurfaceHeight)) and
(not FUpdating) then
begin
if Initialized then
7793,7 → 4659,7
 
procedure TCustomDXDraw.SetSurfaceHeight(Value: Integer);
begin
if ComponentState * [csReading, csLoading] = [] then
if ComponentState*[csReading, csLoading]=[] then
SetSize(SurfaceWidth, Value)
else
FSurfaceHeight := Value;
7801,7 → 4667,7
 
procedure TCustomDXDraw.SetSurfaceWidth(Value: Integer);
begin
if ComponentState * [csReading, csLoading] = [] then
if ComponentState*[csReading, csLoading]=[] then
SetSize(Value, SurfaceHeight)
else
FSurfaceWidth := Value;
7811,31 → 4677,25
begin
Result := False;
 
if Initialized and (not FUpdating) and (Primary.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil) then
if Initialized and (not FUpdating) and (Primary.IDDSurface<>nil) then
begin
if (Primary.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.IsLost = DDERR_SURFACELOST) or
(Surface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.IsLost = DDERR_SURFACELOST) then
if (Primary.ISurface.IsLost=DDERR_SURFACELOST) or
(Surface.ISurface.IsLost=DDERR_SURFACELOST) then
begin
if Assigned(FD2D) and Assigned(FD2D.FD2DTexture) then FD2D.FD2DTexture.D2DPruneAllTextures;//<-Add Mr.Kawasaki
Restore;
Result := (Primary.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.IsLost = DD_OK) and (Surface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.IsLost = DD_OK);
Result := (Primary.ISurface.IsLost=DD_OK) and (Surface.ISurface.IsLost=DD_OK);
end else
Result := True;
end;
end;
 
procedure TCustomDXDraw.SetTraces(const Value: TTraces);
begin
FTraces.Assign(Value);
end;
 
procedure TCustomDXDraw.UpdatePalette;
begin
if Initialized and (doWaitVBlank in FNowOptions) then
begin
if FDDraw.FDriverCaps.dwPalCaps and DDPCAPS_VSYNC = 0 then
FDDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, 0);
end;
if FDDraw.FDriverCaps.dwPalCaps and DDPCAPS_VSYNC=0 then
FDDraw.IDraw.WaitForVerticalBlank(DDWAITVB_BLOCKBEGIN, 0);
end;
 
SetColorTable(ColorTable);
end;
7845,14 → 4705,12
inherited;
if Initialized and (not FUpdating) then
begin
if Clipper <> nil then
if Clipper<>nil then
Clipper.Handle := Handle;
SetCooperativeLevel;
end;
end;
 
{$IFDEF DX3D_deprecated}
 
{ TCustomDX3D }
 
constructor TCustomDX3D.Create(AOwner: TComponent);
7893,7 → 4751,7
FInitialized := False;
 
SetOptions(FOptions);
{$IFDEF D3DRM}
 
FViewport := nil;
FCamera := nil;
FScene := nil;
7901,28 → 4759,22
FD3DRMDevice := nil;
FD3DRMDevice2 := nil;
FD3DRMDevice3 := nil;
{$ENDIF}
{$IFDEF D3D_deprecated}
FD3DDevice := nil;
FD3DDevice2 := nil;
FD3DDevice3 := nil;
{$ENDIF}
FD3DDevice7 := nil;
{$IFDEF D3D_deprecated}
FD3D := nil;
FD3D2 := nil;
FD3D3 := nil;
{$ENDIF}
FD3D7 := nil;
 
FreeZBufferSurface(FSurface, FZBuffer);
 
FSurface.Free; FSurface := nil;
{$IFDEF D3DRM}
FSurface.Free; FSurface := nil;
 
FD3DRM3 := nil;
FD3DRM2 := nil;
FD3DRM := nil;
{$ENDIF}
end;
end;
end;
7969,8 → 4821,7
end else
begin
InitializeDirect3D(FSurface, FZBuffer, FD3D, FD3D2, FD3D3, FD3DDevice, FD3DDevice2, FD3DDevice3,
{$IFDEF D3DRM}FD3DRM, FD3DRM2, FD3DRM3, FD3DRMDevice, FD3DRMDevice2, FD3DRMDevice3, FViewport, FScene, FCamera, {$ENDIF}
AOptions);
FD3DRM, FD3DRM2, FD3DRM3, FD3DRMDevice, FD3DRMDevice2, FD3DRMDevice3, FViewport, FScene, FCamera, AOptions);
end;
 
FNowOptions := [];
7989,7 → 4840,6
 
procedure TCustomDX3D.Render;
begin
{$IFDEF D3DRM}
if FInitialized and (toRetainedMode in FNowOptions) then
begin
asm FInit end;
7998,18 → 4848,17
FD3DRMDevice.Update;
asm FInit end;
end;
{$ENDIF}
end;
 
function TCustomDX3D.GetCanDraw: Boolean;
begin
Result := Initialized and (Surface.IDDSurface <> nil) and
(Surface.ISurface.IsLost = DD_OK);
Result := Initialized and (Surface.IDDSurface<>nil) and
(Surface.ISurface.IsLost=DD_OK);
end;
 
function TCustomDX3D.GetSurfaceHeight: Integer;
begin
if FSurface.IDDSurface <> nil then
if FSurface.IDDSurface<>nil then
Result := FSurface.Height
else
Result := FSurfaceHeight;
8017,7 → 4866,7
 
function TCustomDX3D.GetSurfaceWidth: Integer;
begin
if FSurface.IDDSurface <> nil then
if FSurface.IDDSurface<>nil then
Result := FSurface.Width
else
Result := FSurfaceWidth;
8025,10 → 4874,10
 
procedure TCustomDX3D.SetAutoSize(Value: Boolean);
begin
if FAutoSize <> Value then
if FAutoSize<>Value then
begin
FAutoSize := Value;
if FAutoSize and (DXDraw <> nil) then
if FAutoSize and (DXDraw<>nil) then
SetSize(DXDraw.SurfaceWidth, DXDraw.SurfaceHeight);
end;
end;
8045,12 → 4894,12
if Initialized then
begin
OldOptions := FNowOptions;
FNowOptions := FNowOptions * InitOptions + FOptions * (DX3DOptions - InitOptions);
FNowOptions := FNowOptions*InitOptions+FOptions*(DX3DOptions - InitOptions);
end else
begin
FNowOptions := FOptions;
 
if (FDXDraw <> nil) and (doDirectX7Mode in FDXDraw.FNowOptions) then
if (FDXDraw<>nil) and (doDirectX7Mode in FDXDraw.FNowOptions) then
FNowOptions := FNowOptions - [toRetainedMode];
end;
end;
8057,7 → 4906,7
 
procedure TCustomDX3D.SetSize(ASurfaceWidth, ASurfaceHeight: Integer);
begin
if (ASurfaceWidth <> SurfaceWidth) or (ASurfaceHeight <> SurfaceHeight) then
if (ASurfaceWidth<>SurfaceWidth) or (ASurfaceHeight<>SurfaceHeight) then
begin
FSurfaceWidth := ASurfaceWidth;
FSurfaceHeight := ASurfaceHeight;
8069,7 → 4918,7
 
procedure TCustomDX3D.SetSurfaceHeight(Value: Integer);
begin
if ComponentState * [csReading, csLoading] = [] then
if ComponentState*[csReading, csLoading]=[] then
SetSize(SurfaceWidth, Value)
else
FSurfaceHeight := Value;
8077,7 → 4926,7
 
procedure TCustomDX3D.SetSurfaceWidth(Value: Integer);
begin
if ComponentState * [csReading, csLoading] = [] then
if ComponentState*[csReading, csLoading]=[] then
SetSize(Value, SurfaceHeight)
else
FSurfaceWidth := Value;
8087,7 → 4936,7
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (FDXDraw = AComponent) then
if (Operation=opRemove) and (FDXDraw=AComponent) then
DXDraw := nil;
end;
 
8098,65 → 4947,63
begin
case NotifyType of
dxntDestroying:
begin
DXDraw := nil;
end;
begin
DXDraw := nil;
end;
dxntInitializing:
begin
if (FDXDraw.FOptions * [do3D, doFullScreen] = [doFullScreen])
and (FOptions * [toSystemMemory, toSelectDriver] = [toSelectDriver]) then
begin
AOptions := [];
with FDXDraw do
if (FDXDraw.FOptions*[do3D, doFullScreen]=[doFullScreen])
and (FOptions*[toSystemMemory, toSelectDriver]=[toSelectDriver]) then
begin
if doHardware in Options then AOptions := AOptions + [idoHardware];
if doRetainedMode in Options then AOptions := AOptions + [idoRetainedMode];
if doSelectDriver in Options then AOptions := AOptions + [idoSelectDriver];
if doZBuffer in Options then AOptions := AOptions + [idoZBuffer];
AOptions := [];
with FDXDraw do
begin
if doHardware in Options then AOptions := AOptions + [idoHardware];
if doRetainedMode in Options then AOptions := AOptions + [idoRetainedMode];
if doSelectDriver in Options then AOptions := AOptions + [idoSelectDriver];
if doZBuffer in Options then AOptions := AOptions + [idoZBuffer];
end;
 
Direct3DInitializing_DXDraw(AOptions, FDXDraw);
end;
 
Direct3DInitializing_DXDraw(AOptions, FDXDraw);
end;
end;
dxntInitialize:
begin
Initialize;
end;
begin
Initialize;
end;
dxntFinalize:
begin
Finalize;
end;
begin
Finalize;
end;
dxntRestore:
begin
FSurface.Restore;
if FZBuffer <> nil then
FZBuffer.Restore;
FSurface.Palette := FDXDraw.Palette;
end;
begin
FSurface.Restore;
if FZBuffer<>nil then
FZBuffer.Restore;
FSurface.Palette := FDXDraw.Palette;
end;
dxntSetSurfaceSize:
begin
if AutoSize then
SetSize(Sender.SurfaceWidth, Sender.SurfaceHeight);
end;
begin
if AutoSize then
SetSize(Sender.SurfaceWidth, Sender.SurfaceHeight);
end;
end;
end;
 
procedure TCustomDX3D.SetDXDraw(Value: TCustomDXDraw);
begin
if FDXDraw <> Value then
if FDXDraw<>Value then
begin
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.UnRegisterNotifyEvent(DXDrawNotifyEvent);
 
FDXDraw := Value;
 
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.RegisterNotifyEvent(DXDrawNotifyEvent);
end;
end;
 
{$ENDIF}
 
{ TDirect3DTexture }
 
constructor TDirect3DTexture.Create(Graphic: TGraphic; DXDraw: TComponent);
8170,8 → 5017,8
{ The palette is acquired. }
i := GetPaletteEntries(FGraphic.Palette, 0, 256, FPaletteEntries);
case i of
1..2: FBitCount := 1;
3..16: FBitCount := 4;
1..2 : FBitCount := 1;
3..16 : FBitCount := 4;
17..256: FBitCount := 8;
else
FBitCount := 24;
8181,27 → 5028,23
begin
with (FDXDraw as TCustomDXDraw) do
begin
if (not Initialized) {$IFDEF D3D_deprecated}or (not (do3D in NowOptions)){$ENDIF} then
if (not Initialized) or (not (do3D in NowOptions)) then
raise EDirect3DTextureError.CreateFmt(SNotMade, [FDXDraw.ClassName]);
end;
FSurface := TDirectDrawSurface.Create((FDXDraw as TCustomDXDraw).Surface.DDraw);
(FDXDraw as TCustomDXDraw).RegisterNotifyEvent(DXDrawNotifyEvent);
end
else
{$IFDEF DX3D_deprecated}
if FDXDraw is TCustomDX3D then
end else if FDXDraw is TCustomDX3D then
begin
with (FDXDraw as TDX3D) do
begin
with (FDXDraw as TDX3D) do
begin
if not Initialized then
raise EDirect3DTextureError.CreateFmt(SNotMade, [FDXDraw.ClassName]);
end;
if not Initialized then
raise EDirect3DTextureError.CreateFmt(SNotMade, [FDXDraw.ClassName]);
end;
 
FSurface := TDirectDrawSurface.Create((FDXDraw as TCustomDX3D).Surface.DDraw);
(FDXDraw as TCustomDX3D).FDXDraw.RegisterNotifyEvent(DXDrawNotifyEvent);
end else
{$ENDIF}
raise EDirect3DTextureError.CreateFmt(SNotSupported, [FDXDraw.ClassName]);
FSurface := TDirectDrawSurface.Create((FDXDraw as TCustomDX3D).Surface.DDraw);
(FDXDraw as TCustomDX3D).FDXDraw.RegisterNotifyEvent(DXDrawNotifyEvent);
end else
raise EDirect3DTextureError.CreateFmt(SNotSupported, [FDXDraw.ClassName]);
end;
 
destructor TDirect3DTexture.Destroy;
8209,13 → 5052,11
if FDXDraw is TCustomDXDraw then
begin
(FDXDraw as TCustomDXDraw).UnRegisterNotifyEvent(DXDrawNotifyEvent);
end
{$IFDEF DX3D_deprecated}
else if FDXDraw is TCustomDX3D then
end else if FDXDraw is TCustomDX3D then
begin
(FDXDraw as TCustomDX3D).FDXDraw.UnRegisterNotifyEvent(DXDrawNotifyEvent);
end
{$ENDIF};
end;
 
Clear;
FSurface.Free;
inherited Destroy;
8225,12 → 5066,12
begin
FHandle := 0;
FTexture := nil;
FSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := nil;
FSurface.IDDSurface := nil;
end;
 
function TDirect3DTexture.GetHandle: TD3DTextureHandle;
begin
if FTexture = nil then
if FTexture=nil then
Restore;
Result := FHandle;
end;
8237,14 → 5078,14
 
function TDirect3DTexture.GetSurface: TDirectDrawSurface;
begin
if FTexture = nil then
if FTexture=nil then
Restore;
Result := FSurface;
end;
 
function TDirect3DTexture.GetTexture: {$IFDEF D3D_deprecated}IDirect3DTexture{$ELSE}IDirect3DTexture2{$ENDIF};
function TDirect3DTexture.GetTexture: IDirect3DTexture;
begin
if FTexture = nil then
if FTexture=nil then
Restore;
Result := FTexture;
end;
8251,11 → 5092,11
 
procedure TDirect3DTexture.SetTransparentColor(Value: TColor);
begin
if FTransparentColor <> Value then
if FTransparentColor<>Value then
begin
FTransparentColor := Value;
 
if FSurface <> nil then
if FSurface<>nil then
FSurface.TransparentColor := FSurface.ColorMatch(Value);
end;
end;
8277,7 → 5118,7
Result := DDENUMRET_OK;
tex := lParam;
 
if ddsd.ddpfPixelFormat.dwFlags and (DDPF_ALPHA or DDPF_ALPHAPIXELS) <> 0 then
if ddsd.ddpfPixelFormat.dwFlags and (DDPF_ALPHA or DDPF_ALPHAPIXELS)<>0 then
Exit;
 
if not tex.FEnumFormatFlag then
8286,17 → 5127,17
UseThisFormat;
end else
begin
if (tex.FBitCount <= 8) and (ddsd.ddpfPixelFormat.dwRGBBitCount >= tex.FBitCount) and
(ddsd.ddpfPixelFormat.dwRGBBitCount >= 8) and
(ddsd.ddpfPixelFormat.dwFlags and DDPF_RGB <> 0) then
if (tex.FBitCount<=8) and (ddsd.ddpfPixelFormat.dwRGBBitCount>=tex.FBitCount) and
(ddsd.ddpfPixelFormat.dwRGBBitCount>=8) and
(ddsd.ddpfPixelFormat.dwFlags and DDPF_RGB<>0) then
begin
if tex.FFormat.ddpfPixelFormat.dwRGBBitCount > ddsd.ddpfPixelFormat.dwRGBBitCount then
if tex.FFormat.ddpfPixelFormat.dwRGBBitCount>ddsd.ddpfPixelFormat.dwRGBBitCount then
UseThisFormat;
end else
begin
if (tex.FFormat.ddpfPixelFormat.dwRGBBitCount > ddsd.ddpfPixelFormat.dwRGBBitCount) and
(ddsd.ddpfPixelFormat.dwRGBBitCount > 8) and
(ddsd.ddpfPixelFormat.dwFlags and DDPF_RGB <> 0) then
if (tex.FFormat.ddpfPixelFormat.dwRGBBitCount>ddsd.ddpfPixelFormat.dwRGBBitCount) and
(ddsd.ddpfPixelFormat.dwRGBBitCount>8) and
(ddsd.ddpfPixelFormat.dwFlags and DDPF_RGB<>0) then
UseThisFormat;
end;
end;
8306,11 → 5147,11
var
j: Integer;
begin
for j := 32 downto 1 do
if (1 shl j) and i <> 0 then
for j:=32 downto 1 do
if (1 shl j) and i<>0 then
begin
Result := j;
if 1 shl j <> i then
if 1 shl j<>i then
Dec(Result);
Exit;
end;
8321,23 → 5162,23
var
i: Integer;
begin
for i := 0 to 255 do
for i:=0 to 255 do
with Result[i] do
begin
peRed := ((i shr (G + B - 1)) and (1 shl R - 1)) * 255 div (1 shl R - 1);
peGreen := ((i shr (B - 1)) and (1 shl G - 1)) * 255 div (1 shl G - 1);
peBlue := ((i shr 0) and (1 shl B - 1)) * 255 div (1 shl B - 1);
peRed := ((i shr (G+B-1)) and (1 shl R-1)) * 255 div (1 shl R-1);
peGreen := ((i shr (B-1)) and (1 shl G-1)) * 255 div (1 shl G-1);
peBlue := ((i shr 0) and (1 shl B-1)) * 255 div (1 shl B-1);
peFlags := 0;
end;
end;
 
var
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
Palette: TDirectDrawPalette;
PaletteCaps: Integer;
TempSurface: TDirectDrawSurface;
Width2, Height2: Integer;
D3DDevice: {$IFDEF D3D_deprecated}IDirect3DDevice{$ELSE}IDirect3DDevice7{$ENDIF};
D3DDevice: IDirect3DDevice;
Hardware: Boolean;
DDraw: TDirectDraw;
begin
8348,19 → 5189,16
if FDXDraw is TCustomDXDraw then
begin
DDraw := (FDXDraw as TCustomDXDraw).DDraw;
D3DDevice := (FDXDraw as TCustomDXDraw).{$IFDEF D3D_deprecated}D3DDevice{$ELSE}D3DDevice7{$ENDIF};
D3DDevice := (FDXDraw as TCustomDXDraw).D3DDevice;
Hardware := doHardware in (FDXDraw as TCustomDXDraw).NowOptions;
end
{$IFDEF DX3D_deprecated}
else if FDXDraw is TCustomDX3D then
end else if FDXDraw is TCustomDX3D then
begin
DDraw := (FDXDraw as TCustomDX3D).Surface.DDraw;
D3DDevice := (FDXDraw as TCustomDX3D).D3DDevice;
Hardware := toHardware in (FDXDraw as TCustomDX3D).NowOptions;
end
{$ENDIF};
end;
 
if (DDraw = nil) or (D3DDevice = nil) then Exit;
if (DDraw=nil) or (D3DDevice=nil) then Exit;
 
{ The size of texture is arranged in the size of the square of two. }
Width2 := Max(1 shl GetBitCount(FGraphic.Width), 1);
8405,20 → 5243,20
raise EDirect3DTextureError.CreateFmt(SCannotMade, [STexture]);
 
{ Make palette. }
if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED8 <> 0 then
if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED8<>0 then
begin
PaletteCaps := DDPCAPS_8BIT or DDPCAPS_ALLOW256;
if FBitCount = 24 then
if FBitCount=24 then
CreateHalftonePalette(3, 3, 2);
end else if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED4 <> 0 then
end else if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED4<>0 then
begin
PaletteCaps := DDPCAPS_4BIT;
if FBitCount = 24 then
if FBitCount=24 then
CreateHalftonePalette(1, 2, 1);
end else if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED1 <> 0 then
end else if ddsd.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED1<>0 then
begin
PaletteCaps := DDPCAPS_1BIT;
if FBitCount = 24 then
if FBitCount=24 then
begin
FPaletteEntries[0] := RGBQuadToPaletteEntry(RGBQuad(0, 0, 0));
FPaletteEntries[1] := RGBQuadToPaletteEntry(RGBQuad(255, 255, 255));
8426,7 → 5264,7
end else
PaletteCaps := 0;
 
if PaletteCaps <> 0 then
if PaletteCaps<>0 then
begin
Palette := TDirectDrawPalette.Create(DDraw);
try
8446,13 → 5284,13
end;
 
{ Source surface is loaded into surface. }
FTexture := FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF} as {$IFDEF D3D_deprecated}IDirect3DTexture{$ELSE}IDirect3DTexture2{$ENDIF};
FTexture.Load(TempSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF} as {$IFDEF D3D_deprecated}IDirect3DTexture{$ELSE}IDirect3DTexture2{$ENDIF});
FTexture := FSurface.ISurface as IDirect3DTexture;
FTexture.Load(TempSurface.ISurface as IDirect3DTexture);
finally
TempSurface.Free;
end;
 
if FTexture.GetHandle(D3DDevice as {$IFDEF D3D_deprecated}IDirect3DDevice{$ELSE}IDirect3DDevice2{$ENDIF}, FHandle) <> D3D_OK then
if FTexture.GetHandle(D3DDevice, FHandle)<>D3D_OK then
raise EDirect3DTextureError.CreateFmt(SCannotMade, [STexture]);
 
FSurface.TransparentColor := FSurface.ColorMatch(FTransparentColor);
8467,13 → 5305,13
begin
case NotifyType of
dxntInitializeSurface:
begin
Restore;
end;
begin
Restore;
end;
dxntRestore:
begin
Restore;
end;
begin
Restore;
end;
end;
end;
 
8489,11 → 5327,9
 
if FSrcImage is TDXTextureImage then
FImage := TDXTextureImage(FSrcImage)
else
if FSrcImage is TDIB then
else if FSrcImage is TDIB then
SetDIB(TDIB(FSrcImage))
else
if FSrcImage is TGraphic then
else if FSrcImage is TGraphic then
begin
FSrcImage := TDIB.Create;
try
8504,24 → 5340,22
Graphic.Free;
FAutoFreeGraphic := True;
end;
end
else
if FSrcImage is TPicture then
begin
FSrcImage := TDIB.Create;
try
TDIB(FSrcImage).Assign(TPicture(Graphic).Graphic);
SetDIB(TDIB(FSrcImage));
finally
if FAutoFreeGraphic then
Graphic.Free;
FAutoFreeGraphic := True;
end;
end
else
raise Exception.CreateFmt(SCannotLoadGraphic, [Graphic.ClassName]);
end else
if FSrcImage is TPicture then
begin
FSrcImage := TDIB.Create;
try
TDIB(FSrcImage).Assign(TPicture(Graphic).Graphic);
SetDIB(TDIB(FSrcImage));
finally
if FAutoFreeGraphic then
Graphic.Free;
FAutoFreeGraphic := True;
end;
end else
raise Exception.CreateFmt(SCannotLoadGraphic, [Graphic.ClassName]);
 
FMipmap := FImage.SubGroupImageCount[DXTextureImageGroupType_Mipmap] > 0;
FMipmap := FImage.SubGroupImageCount[DXTextureImageGroupType_Mipmap]>0;
 
FTransparent := FImage.Transparent;
case FImage.ImageType of
8556,7 → 5390,7
end;
 
{ TDIB }
if Image = nil then
if Image=nil then
begin
Image := TDIB.Create;
try
8568,7 → 5402,7
end;
 
{ TPicture }
if Image = nil then
if Image=nil then
begin
Image := TPicture.Create;
try
8610,34 → 5444,34
begin
case NotifyType of
dxntDestroying:
begin
SetDXDraw(nil);
end;
begin
SetDXDraw(nil);
end;
dxntInitializeSurface:
begin
Initialize;
end;
begin
Initialize;
end;
dxntFinalizeSurface:
begin
Finalize;
end;
begin
Finalize;
end;
dxntRestore:
begin
Load;
end;
begin
Load;
end;
end;
end;
 
procedure TDirect3DTexture2.SetDXDraw(ADXDraw: TCustomDXDraw);
begin
if FDXDraw <> ADXDraw then
if FDXDraw<>ADXDraw then
begin
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.UnRegisterNotifyEvent(DXDrawNotifyEvent);
 
FDXDraw := ADXDraw;
 
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.RegisterNotifyEvent(DXDrawNotifyEvent);
end;
end;
8652,16 → 5486,16
var
i: Integer;
begin
if FImage2 = nil then
if FImage2=nil then
FImage2 := TDXTextureImage.Create;
 
if DIB.BitCount <= 8 then
if DIB.BitCount<=8 then
begin
FImage2.SetImage(DXTextureImageType_PaletteIndexedColor, DIB.Width, DIB.Height, DIB.BitCount,
DIB.WidthBytes, DIB.NextLine, DIB.PBits, DIB.TopPBits, DIB.Size, False);
 
FImage2.idx_index := dxtMakeChannel((1 shl DIB.BitCount) - 1, True);
for i := 0 to 255 do
FImage2.idx_index := dxtMakeChannel((1 shl DIB.BitCount)-1, True);
for i:=0 to 255 do
FImage2.idx_palette[i] := RGBQuadToPaletteEntry(DIB.ColorTable[i]);
end else
begin
8672,28 → 5506,17
FImage2.rgb_green := dxtMakeChannel(DIB.NowPixelFormat.GBitMask, False);
FImage2.rgb_blue := dxtMakeChannel(DIB.NowPixelFormat.BBitMask, False);
 
i := DIB.NowPixelFormat.RBitCount + DIB.NowPixelFormat.GBitCount + DIB.NowPixelFormat.BBitCount;
if i < DIB.BitCount then
FImage2.rgb_alpha := dxtMakeChannel(((1 shl (DIB.BitCount - i)) - 1) shl i, False);
i := DIB.NowPixelFormat.RBitCount+DIB.NowPixelFormat.GBitCount+DIB.NowPixelFormat.BBitCount;
if i<DIB.BitCount then
FImage2.rgb_alpha := dxtMakeChannel(((1 shl (DIB.BitCount-i))-1) shl i, False);
end;
 
FImage := FImage2;
end;
 
function TDirect3DTexture2.GetHeight: Integer;
begin
if Assigned(FImage) then
Result := FImage.Height
else
if Assigned(FImage2) then
Result := FImage2.Height
else
Result := 0;
end;
 
function TDirect3DTexture2.GetIsMipmap: Boolean;
begin
if FSurface <> nil then
if FSurface<>nil then
Result := FUseMipmap
else
Result := FMipmap;
8702,35 → 5525,24
function TDirect3DTexture2.GetSurface: TDirectDrawSurface;
begin
Result := FSurface;
if (Result <> nil) and FNeedLoadTexture then
if (Result<>nil) and FNeedLoadTexture then
Load;
end;
 
function TDirect3DTexture2.GetTransparent: Boolean;
begin
if FSurface <> nil then
if FSurface<>nil then
Result := FUseColorKey
else
Result := FTransparent;
end;
 
function TDirect3DTexture2.GetWidth: Integer;
begin
if Assigned(FImage) then
Result := FImage.Width
else
if Assigned(FImage2) then
Result := FImage2.Width
else
Result := 0;
end;
 
procedure TDirect3DTexture2.SetTransparent(Value: Boolean);
begin
if FTransparent <> Value then
if FTransparent<>Value then
begin
FTransparent := Value;
if FSurface <> nil then
if FSurface<>nil then
SetColorKey;
end;
end;
8737,10 → 5549,10
 
procedure TDirect3DTexture2.SetTransparentColor(Value: TColorRef);
begin
if FTransparentColor <> Value then
if FTransparentColor<>Value then
begin
FTransparentColor := Value;
if (FSurface <> nil) and FTransparent then
if (FSurface<>nil) and FTransparent then
SetColorKey;
end;
end;
8763,7 → 5575,7
function GetBitCount(i: Integer): Integer;
begin
Result := 31;
while (i >= 0) and (((1 shl Result) and i) = 0) do Dec(Result);
while (i>=0) and (((1 shl Result) and i)=0) do Dec(Result);
end;
 
function GetMaskBitCount(b: Integer): Integer;
8771,10 → 5583,10
i: Integer;
begin
i := 0;
while (i < 31) and (((1 shl i) and b) = 0) do Inc(i);
while (i<31) and (((1 shl i) and b)=0) do Inc(i);
 
Result := 0;
while ((1 shl i) and b) <> 0 do
while ((1 shl i) and b)<>0 do
begin
Inc(i);
Inc(Result);
8783,13 → 5595,13
 
function GetPaletteBitCount(const ddpfPixelFormat: TDDPixelFormat): Integer;
begin
if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED8 <> 0 then
if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED8<>0 then
Result := 8
else if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED4 <> 0 then
else if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED4<>0 then
Result := 4
else if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED2 <> 0 then
else if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED2<>0 then
Result := 2
else if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED1 <> 0 then
else if ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED1<>0 then
Result := 1
else
Result := 0;
8842,17 → 5654,17
end;
 
{ The texture examines whether this pixel format can be used. }
if lpDDPixFmt.dwFlags and DDPF_RGB = 0 then Exit;
if lpDDPixFmt.dwFlags and DDPF_RGB=0 then Exit;
 
case tex.FImage.ImageType of
DXTextureImageType_RGBColor:
begin
if lpDDPixFmt.dwFlags and DDPF_PALETTEINDEXED <> 0 then Exit;
if lpDDPixFmt.dwFlags and DDPF_PALETTEINDEXED<>0 then Exit;
end;
DXTextureImageType_PaletteIndexedColor:
begin
if (lpDDPixFmt.dwFlags and DDPF_PALETTEINDEXED <> 0) and
(GetPaletteBitCount(lpDDPixFmt) < idx_index) then Exit;
if (lpDDPixFmt.dwFlags and DDPF_PALETTEINDEXED<>0) and
(GetPaletteBitCount(lpDDPixFmt)<idx_index) then Exit;
end;
end;
 
8859,48 → 5671,48
{ The pixel format which can be used is selected carefully. }
if tex.FEnumTextureFormatFlag then
begin
if lpDDPixFmt.dwFlags and DDPF_PALETTEINDEXED <> 0 then
if lpDDPixFmt.dwFlags and DDPF_PALETTEINDEXED<>0 then
begin
{ Bit count check }
if Abs(Integer(lpDDPixFmt.dwRGBBitCount) - idx_index) >
Abs(Integer(tex.FTextureFormat.ddpfPixelFormat.dwRGBBitCount) - idx_index) then Exit;
if Abs(Integer(lpDDPixFmt.dwRGBBitCount)-idx_index)>
Abs(Integer(tex.FTextureFormat.ddpfPixelFormat.dwRGBBitCount)-idx_index) then Exit;
 
{ Alpha channel check }
if rgb_alpha > 0 then Exit;
if rgb_alpha>0 then Exit;
end else
if lpDDPixFmt.dwFlags and DDPF_RGB <> 0 then
if lpDDPixFmt.dwFlags and DDPF_RGB<>0 then
begin
{ The alpha channel is indispensable. }
if (rgb_alpha>0) and (tex.FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS=0) and
(lpDDPixFmt.dwFlags and DDPF_ALPHAPIXELS<>0) then
begin
{ The alpha channel is indispensable. }
if (rgb_alpha > 0) and (tex.FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS = 0) and
(lpDDPixFmt.dwFlags and DDPF_ALPHAPIXELS <> 0) then
begin
UseThisFormat;
Exit;
end;
UseThisFormat;
Exit;
end;
 
{ Alpha channel check }
if (rgb_alpha > 0) and (tex.FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS <> 0) and
(lpDDPixFmt.dwFlags and DDPF_ALPHAPIXELS = 0) then
begin
Exit;
end;
if (rgb_alpha>0) and (tex.FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS<>0) and
(lpDDPixFmt.dwFlags and DDPF_ALPHAPIXELS=0) then
begin
Exit;
end;
 
{ Bit count check }
if tex.FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED = 0 then
begin
sum1 := Sqr(GetMaskBitCount(lpDDPixFmt.dwRBitMask) - rgb_red) +
Sqr(GetMaskBitCount(lpDDPixFmt.dwGBitMask) - rgb_green) +
Sqr(GetMaskBitCount(lpDDPixFmt.dwBBitMask) - rgb_blue) +
Sqr(GetMaskBitCount(lpDDPixFmt.dwRGBAlphaBitMask) - rgb_alpha);
if tex.FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED=0 then
begin
sum1 := Sqr(GetMaskBitCount(lpDDPixFmt.dwRBitMask)-rgb_red)+
Sqr(GetMaskBitCount(lpDDPixFmt.dwGBitMask)-rgb_green)+
Sqr(GetMaskBitCount(lpDDPixFmt.dwBBitMask)-rgb_blue)+
Sqr(GetMaskBitCount(lpDDPixFmt.dwRGBAlphaBitMask)-rgb_alpha);
 
sum2 := Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwRBitMask) - rgb_red) +
Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwGBitMask) - rgb_green) +
Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwBBitMask) - rgb_blue) +
Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwRGBAlphaBitMask) - rgb_alpha);
sum2 := Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwRBitMask)-rgb_red)+
Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwGBitMask)-rgb_green)+
Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwBBitMask)-rgb_blue)+
Sqr(GetMaskBitCount(tex.FTextureFormat.ddpfPixelFormat.dwRGBAlphaBitMask)-rgb_alpha);
 
if sum1 > sum2 then Exit;
end;
if sum1>sum2 then Exit;
end;
end;
end;
 
UseThisFormat;
8910,13 → 5722,13
Width, Height: Integer;
PaletteCaps: DWORD;
Palette: IDirectDrawPalette;
{$IFDEF D3D_deprecated}TempD3DDevDesc: TD3DDeviceDesc;{$ENDIF}
TempD3DDevDesc: TD3DDeviceDesc;
D3DDevDesc7: TD3DDeviceDesc7;
TempSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface4{$ELSE}IDirectDrawSurface7{$ENDIF};
TempSurface: IDirectDrawSurface4;
begin
Finalize;
try
if FDXDraw.D3DDevice7 <> nil then
if FDXDraw.D3DDevice7<>nil then
begin
FDXDraw.D3DDevice7.GetCaps(D3DDevDesc7);
FD3DDevDesc.dpcLineCaps.dwTextureCaps := D3DDevDesc7.dpcLineCaps.dwTextureCaps;
8923,62 → 5735,59
FD3DDevDesc.dpcTriCaps.dwTextureCaps := D3DDevDesc7.dpcTriCaps.dwTextureCaps;
FD3DDevDesc.dwMinTextureWidth := D3DDevDesc7.dwMinTextureWidth;
FD3DDevDesc.dwMaxTextureWidth := D3DDevDesc7.dwMaxTextureWidth;
end
{$IFDEF D3D_deprecated}
else
end else
begin
FD3DDevDesc.dwSize := SizeOf(FD3DDevDesc);
TempD3DDevDesc.dwSize := SizeOf(TempD3DDevDesc);
FDXDraw.D3DDevice3.GetCaps(FD3DDevDesc, TempD3DDevDesc);
end{$ENDIF};
end;
 
if FImage <> nil then
if FImage<>nil then
begin
{ Size adjustment of texture }
if FD3DDevDesc.dpcTriCaps.dwTextureCaps and D3DPTEXTURECAPS_POW2 <> 0 then
if FD3DDevDesc.dpcTriCaps.dwTextureCaps and D3DPTEXTURECAPS_POW2<>0 then
begin
{ The size of the texture is only Sqr(n). }
Width := Max(1 shl GetBitCount(FImage.Width), 1);
Height := Max(1 shl GetBitCount(FImage.Height), 1);
end
else
end else
begin
Width := FImage.Width;
Height := FImage.Height;
end;
 
if FD3DDevDesc.dpcTriCaps.dwTextureCaps and D3DPTEXTURECAPS_SQUAREONLY <> 0 then
if FD3DDevDesc.dpcTriCaps.dwTextureCaps and D3DPTEXTURECAPS_SQUAREONLY<>0 then
begin
{ The size of the texture is only a square. }
if Width < Height then Width := Height;
if Width<Height then Width := Height;
Height := Width;
end;
 
if FD3DDevDesc.dwMinTextureWidth > 0 then
if FD3DDevDesc.dwMinTextureWidth>0 then
Width := Max(Width, FD3DDevDesc.dwMinTextureWidth);
 
if FD3DDevDesc.dwMaxTextureWidth > 0 then
if FD3DDevDesc.dwMaxTextureWidth>0 then
Width := Min(Width, FD3DDevDesc.dwMaxTextureWidth);
 
if FD3DDevDesc.dwMinTextureHeight > 0 then
if FD3DDevDesc.dwMinTextureHeight>0 then
Height := Max(Height, FD3DDevDesc.dwMinTextureHeight);
 
if FD3DDevDesc.dwMaxTextureHeight > 0 then
if FD3DDevDesc.dwMaxTextureHeight>0 then
Height := Min(Height, FD3DDevDesc.dwMaxTextureHeight);
 
{ Pixel format selection }
FEnumTextureFormatFlag := False;
if FDXDraw.D3DDevice7 <> nil then
if FDXDraw.D3DDevice7<>nil then
FDXDraw.D3DDevice7.EnumTextureFormats(@EnumTextureFormatCallback, Self)
{$IFDEF D3D_deprecated}else
FDXDraw.D3DDevice3.EnumTextureFormats(@EnumTextureFormatCallback, Self){$ENDIF};
else
FDXDraw.D3DDevice3.EnumTextureFormats(@EnumTextureFormatCallback, Self);
 
if not FEnumTextureFormatFlag then
raise EDirect3DTextureError.CreateFmt(SCannotInitialized, [STexture]);
 
{ Is Mipmap surface used ? }
FUseMipmap := FMipmap and (FTextureFormat.ddpfPixelFormat.dwRGBBitCount > 8) and
(FImage.SubGroupImageCount[DXTextureImageGroupType_Mipmap] > 0) and (FDXDraw.DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_MIPMAP <> 0);
FUseMipmap := FMipmap and (FTextureFormat.ddpfPixelFormat.dwRGBBitCount>8) and
(FImage.SubGroupImageCount[DXTextureImageGroupType_Mipmap]>0) and (FDXDraw.DDraw.DriverCaps.ddsCaps.dwCaps and DDSCAPS_MIPMAP<>0);
 
{ Surface form setting }
with FTextureFormat do
9005,34 → 5814,31
end;
 
FSurface := TDirectDrawSurface.Create(FDXDraw.DDraw);
FSurface.DDraw.DXResult := FSurface.DDraw.{$IFDEF D3D_deprecated}IDraw4{$ELSE}IDraw7{$ENDIF}.CreateSurface(FTextureFormat, TempSurface, nil);
if FSurface.DDraw.DXResult <> DD_OK then
FSurface.DDraw.DXResult := FSurface.DDraw.IDraw4.CreateSurface(FTextureFormat, TempSurface, nil);
if FSurface.DDraw.DXResult<>DD_OK then
raise EDirect3DTextureError.CreateFmt(SCannotInitialized, [STexture]);
FSurface.{$IFDEF D3D_deprecated}IDDSurface4{$ELSE}IDDSurface7{$ENDIF} := TempSurface;
FSurface.IDDSurface4 := TempSurface;
 
{ Palette making }
if (FImage <> nil) and (FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED <> 0) then
if (FImage<>nil) and (FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED<>0) then
begin
if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED8 <> 0 then
if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED8<>0 then
PaletteCaps := DDPCAPS_8BIT or DDPCAPS_ALLOW256
else
if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED4 <> 0 then
else if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED4<>0 then
PaletteCaps := DDPCAPS_4BIT
else
if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED2 <> 0 then
else if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED2<>0 then
PaletteCaps := DDPCAPS_2BIT
else
if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED1 <> 0 then
else if FTextureFormat.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED1<>0 then
PaletteCaps := DDPCAPS_1BIT
else
PaletteCaps := 0;
 
if PaletteCaps <> 0 then
if PaletteCaps<>0 then
begin
if FDXDraw.DDraw.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.CreatePalette(PaletteCaps, @FImage.idx_palette, Palette, nil) <> 0 then
if FDXDraw.DDraw.IDraw.CreatePalette(PaletteCaps, @FImage.idx_palette, Palette, nil)<>0 then
Exit;
 
FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetPalette(Palette);
FSurface.ISurface.SetPalette(Palette);
end;
end;
 
9047,15 → 5853,15
const
MipmapCaps: TDDSCaps2 = (dwCaps: DDSCAPS_TEXTURE or DDSCAPS_MIPMAP);
var
CurSurface, NextSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface4{$ELSE}IDirectDrawSurface7{$ENDIF};
CurSurface, NextSurface: IDirectDrawSurface4;
Index: Integer;
SrcImage: TDXTextureImage;
begin
if FSurface = nil then
if FSurface=nil then
Initialize;
 
FNeedLoadTexture := False;
if FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.IsLost = DDERR_SURFACELOST then
if FSurface.ISurface.IsLost=DDERR_SURFACELOST then
FSurface.Restore;
 
{ Color key setting. }
9062,26 → 5868,26
SetColorKey;
 
{ Image loading into surface. }
if FImage <> nil then
if FImage<>nil then
begin
if FSrcImage is TDIB then
SetDIB(TDIB(FSrcImage));
 
CurSurface := FSurface.{$IFDEF D3D_deprecated}ISurface4{$ELSE}ISurface7{$ENDIF};
CurSurface := FSurface.ISurface4;
Index := 0;
while CurSurface <> nil do
while CurSurface<>nil do
begin
SrcImage := FImage;
if Index > 0 then
if Index>0 then
begin
if Index - 1 >= FImage.SubGroupImageCount[DXTextureImageGroupType_Mipmap] then
if Index-1>=FImage.SubGroupImageCount[DXTextureImageGroupType_Mipmap] then
Break;
SrcImage := FImage.SubGroupImages[DXTextureImageGroupType_Mipmap, Index - 1];
SrcImage := FImage.SubGroupImages[DXTextureImageGroupType_Mipmap, Index-1];
end;
 
LoadSubTexture(CurSurface, SrcImage);
 
if CurSurface.GetAttachedSurface(MipmapCaps, NextSurface) = 0 then
if CurSurface.GetAttachedSurface(MipmapCaps, NextSurface)=0 then
CurSurface := NextSurface
else
CurSurface := nil;
9088,8 → 5894,7
 
Inc(Index);
end;
end
else
end else
DoRestoreSurface;
end;
 
9099,27 → 5904,25
begin
FUseColorKey := False;
 
if (FSurface <> nil) and FTransparent and (FD3DDevDesc.dpcTriCaps.dwTextureCaps and D3DPTEXTURECAPS_TRANSPARENCY <> 0) then
if (FSurface<>nil) and FTransparent and (FD3DDevDesc.dpcTriCaps.dwTextureCaps and D3DPTEXTURECAPS_TRANSPARENCY<>0) then
begin
FillChar(ck, SizeOf(ck), 0);
if FSurface.SurfaceDesc.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED <> 0 then
if FSurface.SurfaceDesc.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED<>0 then
begin
if FTransparentColor shr 24 = $01 then
if FTransparentColor shr 24=$01 then
begin
{ Palette index }
ck.dwColorSpaceLowValue := FTransparentColor and $FF;
end
else
if FImage <> nil then
begin
end else
if FImage<>nil then
begin
{ RGB value }
ck.dwColorSpaceLowValue := FImage.PaletteIndex(GetRValue(FTransparentColor), GetGValue(FTransparentColor), GetBValue(FTransparentColor));
end else
Exit;
end
else
ck.dwColorSpaceLowValue := FImage.PaletteIndex(GetRValue(FTransparentColor), GetGValue(FTransparentColor), GetBValue(FTransparentColor));
end else
Exit;
end else
begin
if (FImage <> nil) and (FImage.ImageType = DXTextureImageType_PaletteIndexedColor) and (FTransparentColor shr 24 = $01) then
if (FImage<>nil) and (FImage.ImageType=DXTextureImageType_PaletteIndexedColor) and (FTransparentColor shr 24=$01) then
begin
{ Palette index }
ck.dwColorSpaceLowValue :=
9126,28 → 5929,26
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwRBitMask, False), FImage.idx_palette[FTransparentColor and $FF].peRed) or
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwGBitMask, False), FImage.idx_palette[FTransparentColor and $FF].peGreen) or
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwBBitMask, False), FImage.idx_palette[FTransparentColor and $FF].peBlue);
end
else
if FTransparentColor shr 24 = $00 then
begin
end else
if FTransparentColor shr 24=$00 then
begin
{ RGB value }
ck.dwColorSpaceLowValue :=
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwRBitMask, False), GetRValue(FTransparentColor)) or
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwGBitMask, False), GetGValue(FTransparentColor)) or
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwBBitMask, False), GetBValue(FTransparentColor));
end
else
Exit;
ck.dwColorSpaceLowValue :=
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwRBitMask, False), GetRValue(FTransparentColor)) or
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwGBitMask, False), GetGValue(FTransparentColor)) or
dxtEncodeChannel(dxtMakeChannel(FSurface.SurfaceDesc.ddpfPixelFormat.dwBBitMask, False), GetBValue(FTransparentColor));
end else
Exit;
end;
 
ck.dwColorSpaceHighValue := ck.dwColorSpaceLowValue;
FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.SetColorKey(DDCKEY_SRCBLT, @ck);
FSurface.ISurface.SetColorKey(DDCKEY_SRCBLT, ck);
 
FUseColorKey := True;
end;
end;
 
procedure TDirect3DTexture2.LoadSubTexture(Dest: {$IFDEF D3D_deprecated}IDirectDrawSurface4{$ELSE}IDirectDrawSurface7{$ENDIF}; SrcImage: TDXTextureImage);
procedure TDirect3DTexture2.LoadSubTexture(Dest: IDirectDrawSurface4; SrcImage: TDXTextureImage);
const
Mask1: array[0..7] of DWORD = (1, 2, 4, 8, 16, 32, 64, 128);
Mask2: array[0..3] of DWORD = (3, 12, 48, 192);
9159,20 → 5960,20
procedure SetPixel(const ddsd: TDDSurfaceDesc2; x, y: Integer; c: DWORD);
begin
case ddsd.ddpfPixelFormat.dwRGBBitCount of
1: PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x div 8)^ :=
(PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x div 8)^ and (not Mask1[x mod 8])) or (c shl Shift1[x mod 8]);
2: PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x div 4)^ :=
(PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x div 4)^ and (not Mask2[x mod 4])) or (c shl Shift2[x mod 4]);
4: PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x div 2)^ :=
(PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x div 2)^ and (not Mask4[x mod 2])) or (c shl Shift4[x mod 2]);
8: PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x)^ := c;
16: PWord(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x * 2)^ := c;
1 : PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x div 8)^ :=
(PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x div 8)^ and (not Mask1[x mod 8])) or (c shl Shift1[x mod 8]);
2 : PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x div 4)^ :=
(PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x div 4)^ and (not Mask2[x mod 4])) or (c shl Shift2[x mod 4]);
4 : PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x div 2)^ :=
(PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x div 2)^ and (not Mask4[x mod 2])) or (c shl Shift4[x mod 2]);
8 : PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x)^ := c;
16: PWord(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x*2)^ := c;
24: begin
PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x * 3)^ := c shr 0;
PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x * 3 + 1)^ := c shr 8;
PByte(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x * 3 + 2)^ := c shr 16;
end;
32: PDWORD(Integer(ddsd.lpSurface) + ddsd.lPitch * y + x * 4)^ := c;
PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x*3)^ := c shr 0;
PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x*3+1)^ := c shr 8;
PByte(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x*3+2)^ := c shr 16;
end;
32: PDWORD(Integer(ddsd.lpSurface)+ddsd.lPitch*y+x*4)^ := c;
end;
end;
 
9182,23 → 5983,19
x, y: Integer;
begin
ddsd.dwSize := SizeOf(ddsd);
if Dest.Lock(nil, ddsd, DDLOCK_WAIT, 0) = 0 then
if Dest.Lock(nil, ddsd, DDLOCK_WAIT, 0)=0 then
begin
try
if (SrcImage.idx_index.Mask = DWORD(1 shl ddsd.ddpfPixelFormat.dwRGBBitCount) - 1) and
(SrcImage.idx_alpha.Mask = 0) and
(SrcImage.BitCount = Integer(ddsd.ddpfPixelFormat.dwRGBBitCount)) and
(not SrcImage.PackedPixelOrder)
then
if (SrcImage.idx_index.Mask=DWORD(1 shl ddsd.ddpfPixelFormat.dwRGBBitCount)-1) and (SrcImage.idx_alpha.Mask=0) and
(SrcImage.BitCount=Integer(ddsd.ddpfPixelFormat.dwRGBBitCount)) and (not SrcImage.PackedPixelOrder) then
begin
for y := 0 to ddsd.dwHeight - 1 do
Move(SrcImage.ScanLine[y]^, Pointer(Integer(ddsd.lpSurface) + ddsd.lPitch * y)^, (Integer(ddsd.dwWidth) * SrcImage.BitCount + 7) div 8);
end
else
for y:=0 to ddsd.dwHeight-1 do
Move(SrcImage.ScanLine[y]^, Pointer(Integer(ddsd.lpSurface)+ddsd.lPitch*y)^, (Integer(ddsd.dwWidth)*SrcImage.BitCount+7) div 8);
end else
begin
for y := 0 to ddsd.dwHeight - 1 do
for y:=0 to ddsd.dwHeight-1 do
begin
for x := 0 to ddsd.dwWidth - 1 do
for x:=0 to ddsd.dwWidth-1 do
SetPixel(ddsd, x, y, dxtDecodeChannel(SrcImage.idx_index, SrcImage.Pixels[x, y]));
end;
end;
9216,7 → 6013,7
dest_red_fmt, dest_green_fmt, dest_blue_fmt, dest_alpha_fmt: TDXTextureImageChannel;
begin
ddsd.dwSize := SizeOf(ddsd);
if Dest.Lock(nil, ddsd, DDLOCK_WAIT, 0) = 0 then
if Dest.Lock(nil, ddsd, DDLOCK_WAIT, 0)=0 then
begin
try
dest_red_fmt := dxtMakeChannel(ddsd.ddpfPixelFormat.dwRBitMask, False);
9224,10 → 6021,10
dest_blue_fmt := dxtMakeChannel(ddsd.ddpfPixelFormat.dwBBitMask, False);
dest_alpha_fmt := dxtMakeChannel(ddsd.ddpfPixelFormat.dwRGBAlphaBitMask, False);
 
if SrcImage.idx_alpha.mask <> 0 then
if SrcImage.idx_alpha.mask<>0 then
begin
for y := 0 to ddsd.dwHeight - 1 do
for x := 0 to ddsd.dwWidth - 1 do
for y:=0 to ddsd.dwHeight-1 do
for x:=0 to ddsd.dwWidth-1 do
begin
c := SrcImage.Pixels[x, y];
cIdx := dxtDecodeChannel(SrcImage.idx_index, c);
9239,13 → 6036,12
 
SetPixel(ddsd, x, y, c);
end;
end
else
end else
begin
cA := dxtEncodeChannel(dest_alpha_fmt, 255);
 
for y := 0 to ddsd.dwHeight - 1 do
for x := 0 to ddsd.dwWidth - 1 do
for y:=0 to ddsd.dwHeight-1 do
for x:=0 to ddsd.dwWidth-1 do
begin
c := SrcImage.Pixels[x, y];
cIdx := dxtDecodeChannel(SrcImage.idx_index, c);
9271,7 → 6067,7
dest_red_fmt, dest_green_fmt, dest_blue_fmt, dest_alpha_fmt: TDXTextureImageChannel;
begin
ddsd.dwSize := SizeOf(ddsd);
if Dest.Lock(nil, ddsd, DDLOCK_WAIT, 0) = 0 then
if Dest.Lock(nil, ddsd, DDLOCK_WAIT, 0)=0 then
begin
try
dest_red_fmt := dxtMakeChannel(ddsd.ddpfPixelFormat.dwRBitMask, False);
9279,46 → 6075,43
dest_blue_fmt := dxtMakeChannel(ddsd.ddpfPixelFormat.dwBBitMask, False);
dest_alpha_fmt := dxtMakeChannel(ddsd.ddpfPixelFormat.dwRGBAlphaBitMask, False);
 
if (dest_red_fmt.Mask = SrcImage.rgb_red.Mask) and (dest_green_fmt.Mask = SrcImage.rgb_green.Mask) and
(dest_blue_fmt.Mask = SrcImage.rgb_blue.Mask) and (dest_alpha_fmt.Mask = SrcImage.rgb_alpha.Mask) and
(Integer(ddsd.ddpfPixelFormat.dwRGBBitCount) = SrcImage.BitCount) and (not SrcImage.PackedPixelOrder)
then
if (dest_red_fmt.Mask=SrcImage.rgb_red.Mask) and (dest_green_fmt.Mask=SrcImage.rgb_green.Mask) and
(dest_blue_fmt.Mask=SrcImage.rgb_blue.Mask) and (dest_alpha_fmt.Mask=SrcImage.rgb_alpha.Mask) and
(Integer(ddsd.ddpfPixelFormat.dwRGBBitCount)=SrcImage.BitCount) and (not SrcImage.PackedPixelOrder) then
begin
for y:=0 to ddsd.dwHeight-1 do
Move(SrcImage.ScanLine[y]^, Pointer(Integer(ddsd.lpSurface)+ddsd.lPitch*y)^, (Integer(ddsd.dwWidth)*SrcImage.BitCount+7) div 8);
end else
if SrcImage.rgb_alpha.mask<>0 then
begin
for y := 0 to ddsd.dwHeight - 1 do
Move(SrcImage.ScanLine[y]^, Pointer(Integer(ddsd.lpSurface) + ddsd.lPitch * y)^, (Integer(ddsd.dwWidth) * SrcImage.BitCount + 7) div 8);
end
else
if SrcImage.rgb_alpha.mask <> 0 then
begin
for y := 0 to ddsd.dwHeight - 1 do
for x := 0 to ddsd.dwWidth - 1 do
begin
c := SrcImage.Pixels[x, y];
for y:=0 to ddsd.dwHeight-1 do
for x:=0 to ddsd.dwWidth-1 do
begin
c := SrcImage.Pixels[x, y];
 
c := dxtEncodeChannel(dest_red_fmt, dxtDecodeChannel(SrcImage.rgb_red, c)) or
dxtEncodeChannel(dest_green_fmt, dxtDecodeChannel(SrcImage.rgb_green, c)) or
dxtEncodeChannel(dest_blue_fmt, dxtDecodeChannel(SrcImage.rgb_blue, c)) or
dxtEncodeChannel(dest_alpha_fmt, dxtDecodeChannel(SrcImage.rgb_alpha, c));
c := dxtEncodeChannel(dest_red_fmt, dxtDecodeChannel(SrcImage.rgb_red, c)) or
dxtEncodeChannel(dest_green_fmt, dxtDecodeChannel(SrcImage.rgb_green, c)) or
dxtEncodeChannel(dest_blue_fmt, dxtDecodeChannel(SrcImage.rgb_blue, c)) or
dxtEncodeChannel(dest_alpha_fmt, dxtDecodeChannel(SrcImage.rgb_alpha, c));
 
SetPixel(ddsd, x, y, c);
end;
end
else
begin
cA := dxtEncodeChannel(dest_alpha_fmt, 255);
SetPixel(ddsd, x, y, c);
end;
end else
begin
cA := dxtEncodeChannel(dest_alpha_fmt, 255);
 
for y := 0 to ddsd.dwHeight - 1 do
for x := 0 to ddsd.dwWidth - 1 do
begin
c := SrcImage.Pixels[x, y];
for y:=0 to ddsd.dwHeight-1 do
for x:=0 to ddsd.dwWidth-1 do
begin
c := SrcImage.Pixels[x, y];
 
c := dxtEncodeChannel(dest_red_fmt, dxtDecodeChannel(SrcImage.rgb_red, c)) or
dxtEncodeChannel(dest_green_fmt, dxtDecodeChannel(SrcImage.rgb_green, c)) or
dxtEncodeChannel(dest_blue_fmt, dxtDecodeChannel(SrcImage.rgb_blue, c)) or cA;
c := dxtEncodeChannel(dest_red_fmt, dxtDecodeChannel(SrcImage.rgb_red, c)) or
dxtEncodeChannel(dest_green_fmt, dxtDecodeChannel(SrcImage.rgb_green, c)) or
dxtEncodeChannel(dest_blue_fmt, dxtDecodeChannel(SrcImage.rgb_blue, c)) or cA;
 
SetPixel(ddsd, x, y, c);
end;
end;
SetPixel(ddsd, x, y, c);
end;
end;
finally
Dest.UnLock(ddsd.lpSurface);
end;
9331,2162 → 6124,25
SurfaceDesc.dwSize := SizeOf(SurfaceDesc);
Dest.GetSurfaceDesc(SurfaceDesc);
 
if SurfaceDesc.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED <> 0 then
if SurfaceDesc.ddpfPixelFormat.dwFlags and DDPF_PALETTEINDEXED<>0 then
begin
case SrcImage.ImageType of
DXTextureImageType_PaletteIndexedColor: LoadTexture_IndexToIndex;
DXTextureImageType_RGBColor: ;
DXTextureImageType_RGBColor : ;
end;
end else if SurfaceDesc.ddpfPixelFormat.dwFlags and DDPF_RGB <> 0 then
end else if SurfaceDesc.ddpfPixelFormat.dwFlags and DDPF_RGB<>0 then
begin
case SrcImage.ImageType of
DXTextureImageType_PaletteIndexedColor: LoadTexture_IndexToRGB;
DXTextureImageType_RGBColor: LoadTexture_RGBToRGB;
DXTextureImageType_RGBColor : LoadTexture_RGBToRGB;
end;
end;
end;
 
{ Support function }
 
function GetWidthBytes(Width, BitCount: Integer): Integer;
begin
Result := (((Width * BitCount) + 31) div 32) * 4;
end;
 
function dxtEncodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
begin
Result := ((c shl Channel._rshift) shr Channel._lshift) and Channel.Mask;
end;
 
function dxtDecodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
begin
Result := ((c and Channel.Mask) shr Channel._rshift) shl Channel._lshift;
Result := Result or (Result shr Channel._BitCount2);
end;
 
function dxtMakeChannel(Mask: DWORD; indexed: Boolean): TDXTextureImageChannel;
 
function GetMaskBitCount(b: Integer): Integer;
var
i: Integer;
begin
i := 0;
while (i < 31) and (((1 shl i) and b) = 0) do Inc(i);
 
Result := 0;
while ((1 shl i) and b) <> 0 do
begin
Inc(i);
Inc(Result);
end;
end;
 
function GetBitCount2(b: Integer): Integer;
begin
Result := 0;
while (Result < 31) and (((1 shl Result) and b) = 0) do Inc(Result);
end;
 
begin
Result.BitCount := GetMaskBitCount(Mask);
Result.Mask := Mask;
 
if indexed then
begin
Result._rshift := GetBitCount2(Mask);
Result._lshift := 0;
Result._Mask2 := 1 shl Result.BitCount - 1;
Result._BitCount2 := 0;
end
else
begin
Result._rshift := GetBitCount2(Mask) - (8 - Result.BitCount);
if Result._rshift < 0 then
begin
Result._lshift := -Result._rshift;
Result._rshift := 0;
end
else
Result._lshift := 0;
Result._Mask2 := (1 shl Result.BitCount - 1) shl (8 - Result.BitCount);
Result._BitCount2 := 8 - Result.BitCount;
end;
end;
 
{ TDXTextureImage }
 
var
_DXTextureImageLoadFuncList: TList;
 
procedure DXTextureImage_LoadDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage); forward;
procedure DXTextureImage_LoadBitmapFunc(Stream: TStream; Image: TDXTextureImage); forward;
 
function DXTextureImageLoadFuncList: TList;
begin
if _DXTextureImageLoadFuncList = nil then
begin
_DXTextureImageLoadFuncList := TList.Create;
_DXTextureImageLoadFuncList.Add(@DXTextureImage_LoadDXTextureImageFunc);
_DXTextureImageLoadFuncList.Add(@DXTextureImage_LoadBitmapFunc);
end;
Result := _DXTextureImageLoadFuncList;
end;
 
class procedure TDXTextureImage.RegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
begin
if DXTextureImageLoadFuncList.IndexOf(@LoadFunc) = -1 then
DXTextureImageLoadFuncList.Add(@LoadFunc);
end;
 
class procedure TDXTextureImage.UnRegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
begin
DXTextureImageLoadFuncList.Remove(@LoadFunc);
end;
 
constructor TDXTextureImage.Create;
begin
inherited Create;
FSubImage := TList.Create;
end;
 
constructor TDXTextureImage.CreateSub(AOwner: TDXTextureImage);
begin
Create;
 
FOwner := AOwner;
try
FOwner.FSubImage.Add(Self);
except
FOwner := nil;
raise;
end;
end;
 
destructor TDXTextureImage.Destroy;
begin
Clear;
FSubImage.Free;
if FOwner <> nil then
FOwner.FSubImage.Remove(Self);
inherited Destroy;
end;
 
procedure TDXTextureImage.DoSaveProgress(Progress, ProgressCount: Integer);
begin
if Assigned(FOnSaveProgress) then
FOnSaveProgress(Self, Progress, ProgressCount);
end;
 
procedure TDXTextureImage.Assign(Source: TDXTextureImage);
var
y: Integer;
begin
SetSize(Source.ImageType, Source.Width, Source.Height, Source.BitCount, Source.WidthBytes);
 
idx_index := Source.idx_index;
idx_alpha := Source.idx_alpha;
idx_palette := Source.idx_palette;
 
rgb_red := Source.rgb_red;
rgb_green := Source.rgb_green;
rgb_blue := Source.rgb_blue;
rgb_alpha := Source.rgb_alpha;
 
for y := 0 to Height - 1 do
Move(Source.ScanLine[y]^, ScanLine[y]^, WidthBytes);
 
Transparent := Source.Transparent;
TransparentColor := Source.TransparentColor;
ImageGroupType := Source.ImageGroupType;
ImageID := Source.ImageID;
ImageName := Source.ImageName;
end;
 
procedure TDXTextureImage.ClearImage;
begin
if FAutoFreeImage then
FreeMem(FPBits);
 
FImageType := DXTextureImageType_PaletteIndexedColor;
FWidth := 0;
FHeight := 0;
FBitCount := 0;
FWidthBytes := 0;
FNextLine := 0;
FSize := 0;
FPBits := nil;
FTopPBits := nil;
FAutoFreeImage := False;
end;
 
procedure TDXTextureImage.Clear;
begin
ClearImage;
 
while SubImageCount > 0 do
SubImages[SubImageCount - 1].Free;
 
FImageGroupType := 0;
FImageID := 0;
FImageName := '';
 
FTransparent := False;
FTransparentColor := 0;
 
FillChar(idx_index, SizeOf(idx_index), 0);
FillChar(idx_alpha, SizeOf(idx_alpha), 0);
FillChar(idx_palette, SizeOf(idx_palette), 0);
FillChar(rgb_red, SizeOf(rgb_red), 0);
FillChar(rgb_green, SizeOf(rgb_green), 0);
FillChar(rgb_blue, SizeOf(rgb_blue), 0);
FillChar(rgb_alpha, SizeOf(rgb_alpha), 0);
end;
 
procedure TDXTextureImage.SetImage(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes, NextLine: Integer;
PBits, TopPBits: Pointer; Size: Integer; AutoFree: Boolean);
begin
ClearImage;
 
FAutoFreeImage := AutoFree;
FImageType := ImageType;
FWidth := Width;
FHeight := Height;
FBitCount := BitCount;
FWidthBytes := WidthBytes;
FNextLine := NextLine;
FSize := Size;
FPBits := PBits;
FTopPBits := TopPBits;
end;
 
procedure TDXTextureImage.SetSize(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes: Integer);
var
APBits: Pointer;
begin
ClearImage;
 
if WidthBytes = 0 then
WidthBytes := GetWidthBytes(Width, BitCount);
 
GetMem(APBits, WidthBytes * Height);
SetImage(ImageType, Width, Height, BitCount, WidthBytes,
WidthBytes, APBits, APBits, WidthBytes * Height, True);
end;
 
function TDXTextureImage.GetScanLine(y: Integer): Pointer;
begin
Result := Pointer(Integer(FTopPBits) + FNextLine * y);
end;
 
function TDXTextureImage.GetSubGroupImageCount(GroupTypeID: DWORD): Integer;
var
i: Integer;
begin
Result := 0;
for i := 0 to SubImageCount - 1 do
if SubImages[i].ImageGroupType = GroupTypeID then
Inc(Result);
end;
 
function TDXTextureImage.GetSubGroupImage(GroupTypeID: DWORD; Index: Integer): TDXTextureImage;
var
i, j: Integer;
begin
j := 0;
for i := 0 to SubImageCount - 1 do
if SubImages[i].ImageGroupType = GroupTypeID then
begin
if j = Index then
begin
Result := SubImages[i];
Exit;
end;
 
Inc(j);
end;
 
Result := nil;
SubImages[-1];
end;
 
function TDXTextureImage.GetSubImageCount: Integer;
begin
Result := 0;
if Assigned(FSubImage) then
Result := FSubImage.Count;
end;
 
function TDXTextureImage.GetSubImage(Index: Integer): TDXTextureImage;
begin
Result := FSubImage[Index];
end;
 
function TDXTextureImage.EncodeColor(R, G, B, A: Byte): DWORD;
begin
if ImageType = DXTextureImageType_PaletteIndexedColor then
begin
Result := dxtEncodeChannel(idx_index, PaletteIndex(R, G, B)) or
dxtEncodeChannel(idx_alpha, A);
end
else
begin
Result := dxtEncodeChannel(rgb_red, R) or
dxtEncodeChannel(rgb_green, G) or
dxtEncodeChannel(rgb_blue, B) or
dxtEncodeChannel(rgb_alpha, A);
end;
end;
 
function TDXTextureImage.PaletteIndex(R, G, B: Byte): DWORD;
var
i, d, d2: Integer;
begin
Result := 0;
if ImageType = DXTextureImageType_PaletteIndexedColor then
begin
d := MaxInt;
for i := 0 to (1 shl idx_index.BitCount) - 1 do
with idx_palette[i] do
begin
d2 := Abs((peRed - R)) * Abs((peRed - R)) + Abs((peGreen - G)) * Abs((peGreen - G)) + Abs((peBlue - B)) * Abs((peBlue - B));
if d > d2 then
begin
d := d2;
Result := i;
end;
end;
end;
end;
 
const
Mask1: array[0..7] of DWORD = (1, 2, 4, 8, 16, 32, 64, 128);
Mask2: array[0..3] of DWORD = (3, 12, 48, 192);
Mask4: array[0..1] of DWORD = ($0F, $F0);
 
Shift1: array[0..7] of DWORD = (0, 1, 2, 3, 4, 5, 6, 7);
Shift2: array[0..3] of DWORD = (0, 2, 4, 6);
Shift4: array[0..1] of DWORD = (0, 4);
 
type
PByte3 = ^TByte3;
TByte3 = array[0..2] of Byte;
 
function TDXTextureImage.GetPixel(x, y: Integer): DWORD;
begin
Result := 0;
if (x >= 0) and (x < FWidth) and (y >= 0) and (y < FHeight) then
begin
case FBitCount of
1: begin
if FPackedPixelOrder then
Result := (PByte(Integer(FTopPBits) + FNextLine * y + x shr 3)^ and Mask1[7 - x and 7]) shr Shift1[7 - x and 7]
else
Result := (PByte(Integer(FTopPBits) + FNextLine * y + x shr 3)^ and Mask1[x and 7]) shr Shift1[x and 7];
end;
2: begin
if FPackedPixelOrder then
Result := (PByte(Integer(FTopPBits) + FNextLine * y + x shr 2)^ and Mask2[3 - x and 3]) shr Shift2[3 - x and 3]
else
Result := (PByte(Integer(FTopPBits) + FNextLine * y + x shr 2)^ and Mask2[x and 3]) shr Shift2[x and 3];
end;
4: begin
if FPackedPixelOrder then
Result := (PByte(Integer(FTopPBits) + FNextLine * y + x shr 1)^ and Mask4[1 - x and 1]) shr Shift4[1 - x and 1]
else
Result := (PByte(Integer(FTopPBits) + FNextLine * y + x shr 1)^ and Mask4[x and 1]) shr Shift4[x and 1];
end;
8: Result := PByte(Integer(FTopPBits) + FNextLine * y + x)^;
16: Result := PWord(Integer(FTopPBits) + FNextLine * y + x * 2)^;
24: PByte3(@Result)^ := PByte3(Integer(FTopPBits) + FNextLine * y + x * 3)^;
32: Result := PDWORD(Integer(FTopPBits) + FNextLine * y + x * 4)^;
end;
end;
end;
 
procedure TDXTextureImage.SetPixel(x, y: Integer; c: DWORD);
var
P: PByte;
begin
if (x >= 0) and (x < FWidth) and (y >= 0) and (y < FHeight) then
begin
case FBitCount of
1: begin
P := Pointer(Integer(FTopPBits) + FNextLine * y + x shr 3);
if FPackedPixelOrder then
P^ := (P^ and (not Mask1[7 - x and 7])) or ((c and 1) shl Shift1[7 - x and 7])
else
P^ := (P^ and (not Mask1[x and 7])) or ((c and 1) shl Shift1[x and 7]);
end;
2: begin
P := Pointer(Integer(FTopPBits) + FNextLine * y + x shr 2);
if FPackedPixelOrder then
P^ := (P^ and (not Mask2[3 - x and 3])) or ((c and 3) shl Shift2[3 - x and 3])
else
P^ := (P^ and (not Mask2[x and 3])) or ((c and 3) shl Shift2[x and 3]);
end;
4: begin
P := Pointer(Integer(FTopPBits) + FNextLine * y + x shr 1);
if FPackedPixelOrder then
P^ := (P^ and (not Mask4[1 - x and 1])) or ((c and 7) shl Shift4[1 - x and 1])
else
P^ := (P^ and (not Mask4[x and 1])) or ((c and 7) shl Shift4[x and 1]);
end;
8: PByte(Integer(FTopPBits) + FNextLine * y + x)^ := c;
16: PWord(Integer(FTopPBits) + FNextLine * y + x * 2)^ := c;
24: PByte3(Integer(FTopPBits) + FNextLine * y + x * 3)^ := PByte3(@c)^;
32: PDWORD(Integer(FTopPBits) + FNextLine * y + x * 4)^ := c;
end;
end;
end;
 
procedure TDXTextureImage.LoadFromFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure TDXTextureImage.LoadFromStream(Stream: TStream);
var
i, p: Integer;
begin
Clear;
 
p := Stream.Position;
for i := 0 to DXTextureImageLoadFuncList.Count - 1 do
begin
Stream.Position := p;
try
TDXTextureImageLoadFunc(DXTextureImageLoadFuncList[i])(Stream, Self);
Exit;
except
Clear;
end;
end;
 
raise EDXTextureImageError.Create(SNotSupportGraphicFile);
end;
 
procedure TDXTextureImage.SaveToFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure DXTextureImage_SaveDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage); forward;
 
procedure TDXTextureImage.SaveToStream(Stream: TStream);
begin
DXTextureImage_SaveDXTextureImageFunc(Stream, Self);
end;
 
{ DXTextureImage_LoadDXTextureImageFunc }
 
const
DXTextureImageFile_Type = 'dxt:';
DXTextureImageFile_Version = $100;
 
DXTextureImageCompress_None = 0;
DXTextureImageCompress_ZLIB = 1; // ZLIB enabled
 
DXTextureImageFileCategoryType_Image = $100;
 
DXTextureImageFileBlockID_EndFile = 0;
DXTextureImageFileBlockID_EndGroup = 1;
DXTextureImageFileBlockID_StartGroup = 2;
DXTextureImageFileBlockID_Image_Format = DXTextureImageFileCategoryType_Image + 1;
DXTextureImageFileBlockID_Image_PixelData = DXTextureImageFileCategoryType_Image + 2;
DXTextureImageFileBlockID_Image_GroupInfo = DXTextureImageFileCategoryType_Image + 3;
DXTextureImageFileBlockID_Image_Name = DXTextureImageFileCategoryType_Image + 4;
DXTextureImageFileBlockID_Image_TransparentColor = DXTextureImageFileCategoryType_Image + 5;
 
type
TDXTextureImageFileHeader = packed record
FileType: array[0..4] of Char;
ver: DWORD;
end;
 
TDXTextureImageFileBlockHeader = packed record
ID: DWORD;
Size: Integer;
end;
 
TDXTextureImageFileBlockHeader_StartGroup = packed record
CategoryType: DWORD;
end;
 
TDXTextureImageHeader_Image_Format = packed record
ImageType: TDXTextureImageType;
Width: DWORD;
Height: DWORD;
BitCount: DWORD;
WidthBytes: DWORD;
end;
 
TDXTextureImageHeader_Image_Format_Index = packed record
idx_index_Mask: DWORD;
idx_alpha_Mask: DWORD;
idx_palette: array[0..255] of TPaletteEntry;
end;
 
TDXTextureImageHeader_Image_Format_RGB = packed record
rgb_red_Mask: DWORD;
rgb_green_Mask: DWORD;
rgb_blue_Mask: DWORD;
rgb_alpha_Mask: DWORD;
end;
 
TDXTextureImageHeader_Image_GroupInfo = packed record
ImageGroupType: DWORD;
ImageID: DWORD;
end;
 
TDXTextureImageHeader_Image_PixelData = packed record
Compress: DWORD;
end;
 
TDXTextureImageHeader_Image_TransparentColor = packed record
Transparent: Boolean;
TransparentColor: DWORD;
end;
 
procedure DXTextureImage_LoadDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage);
 
procedure ReadGroup_Image(Image: TDXTextureImage);
var
i: Integer;
BlockHeader: TDXTextureImageFileBlockHeader;
NextPos: Integer;
SubImage: TDXTextureImage;
Header_StartGroup: TDXTextureImageFileBlockHeader_StartGroup;
Header_Image_Format: TDXTextureImageHeader_Image_Format;
Header_Image_Format_Index: TDXTextureImageHeader_Image_Format_Index;
Header_Image_Format_RGB: TDXTextureImageHeader_Image_Format_RGB;
Header_Image_GroupInfo: TDXTextureImageHeader_Image_GroupInfo;
Header_Image_TransparentColor: TDXTextureImageHeader_Image_TransparentColor;
Header_Image_PixelData: TDXTextureImageHeader_Image_PixelData;
ImageName: string;
{$IFDEF DXTextureImage_UseZLIB}
Decompression: TDecompressionStream;
{$ENDIF}
begin
while True do
begin
Stream.ReadBuffer(BlockHeader, SizeOf(BlockHeader));
NextPos := Stream.Position + BlockHeader.Size;
 
case BlockHeader.ID of
DXTextureImageFileBlockID_EndGroup:
begin
{ End of group }
Break;
end;
DXTextureImageFileBlockID_StartGroup:
begin
{ Beginning of group }
Stream.ReadBuffer(Header_StartGroup, SizeOf(Header_StartGroup));
case Header_StartGroup.CategoryType of
DXTextureImageFileCategoryType_Image:
begin
{ Image group }
SubImage := TDXTextureImage.CreateSub(Image);
try
ReadGroup_Image(SubImage);
except
SubImage.Free;
raise;
end;
end;
end;
end;
DXTextureImageFileBlockID_Image_Format:
begin
{ Image information reading (size etc.) }
Stream.ReadBuffer(Header_Image_Format, SizeOf(Header_Image_Format));
 
if (Header_Image_Format.ImageType <> DXTextureImageType_PaletteIndexedColor) and
(Header_Image_Format.ImageType <> DXTextureImageType_RGBColor)
then
raise EDXTextureImageError.Create(SInvalidDXTFile);
 
Image.SetSize(Header_Image_Format.ImageType, Header_Image_Format.Width, Header_Image_Format.Height,
Header_Image_Format.BitCount, Header_Image_Format.Widthbytes);
 
if Header_Image_Format.ImageType = DXTextureImageType_PaletteIndexedColor then
begin
{ INDEX IMAGE }
Stream.ReadBuffer(Header_Image_Format_Index, SizeOf(Header_Image_Format_Index));
 
Image.idx_index := dxtMakeChannel(Header_Image_Format_Index.idx_index_Mask, True);
Image.idx_alpha := dxtMakeChannel(Header_Image_Format_Index.idx_alpha_Mask, False);
 
for i := 0 to 255 do
Image.idx_palette[i] := Header_Image_Format_Index.idx_palette[i];
end
else
if Header_Image_Format.ImageType = DXTextureImageType_RGBColor then
begin
{ RGB IMAGE }
Stream.ReadBuffer(Header_Image_Format_RGB, SizeOf(Header_Image_Format_RGB));
 
Image.rgb_red := dxtMakeChannel(Header_Image_Format_RGB.rgb_red_Mask, False);
Image.rgb_green := dxtMakeChannel(Header_Image_Format_RGB.rgb_green_Mask, False);
Image.rgb_blue := dxtMakeChannel(Header_Image_Format_RGB.rgb_blue_Mask, False);
Image.rgb_alpha := dxtMakeChannel(Header_Image_Format_RGB.rgb_alpha_Mask, False);
end;
end;
DXTextureImageFileBlockID_Image_Name:
begin
{ Name reading }
SetLength(ImageName, BlockHeader.Size);
Stream.ReadBuffer(ImageName[1], BlockHeader.Size);
 
Image.ImageName := ImageName;
end;
DXTextureImageFileBlockID_Image_GroupInfo:
begin
{ Image group information reading }
Stream.ReadBuffer(Header_Image_GroupInfo, SizeOf(Header_Image_GroupInfo));
 
Image.ImageGroupType := Header_Image_GroupInfo.ImageGroupType;
Image.ImageID := Header_Image_GroupInfo.ImageID;
end;
DXTextureImageFileBlockID_Image_TransparentColor:
begin
{ Transparent color information reading }
Stream.ReadBuffer(Header_Image_TransparentColor, SizeOf(Header_Image_TransparentColor));
 
Image.Transparent := Header_Image_TransparentColor.Transparent;
Image.TransparentColor := Header_Image_TransparentColor.TransparentColor;
end;
DXTextureImageFileBlockID_Image_PixelData:
begin
{ Pixel data reading }
Stream.ReadBuffer(Header_Image_PixelData, SizeOf(Header_Image_PixelData));
 
case Header_Image_PixelData.Compress of
DXTextureImageCompress_None:
begin
{ NO compress }
for i := 0 to Image.Height - 1 do
Stream.ReadBuffer(Image.ScanLine[i]^, Header_Image_Format.Widthbytes);
end;
{$IFDEF DXTextureImage_UseZLIB}
DXTextureImageCompress_ZLIB:
begin
{ ZLIB compress enabled }
Decompression := TDecompressionStream.Create(Stream);
try
for i := 0 to Image.Height - 1 do
Decompression.ReadBuffer(Image.ScanLine[i]^, Header_Image_Format.Widthbytes);
finally
Decompression.Free;
end;
end;
{$ENDIF}
else
raise EDXTextureImageError.CreateFmt('Decompression error (%d)', [Header_Image_PixelData.Compress]);
end;
end;
 
end;
 
Stream.Seek(NextPos, soFromBeginning);
end;
end;
 
var
FileHeader: TDXTextureImageFileHeader;
BlockHeader: TDXTextureImageFileBlockHeader;
Header_StartGroup: TDXTextureImageFileBlockHeader_StartGroup;
NextPos: Integer;
begin
{ File header reading }
Stream.ReadBuffer(FileHeader, SizeOf(FileHeader));
 
if FileHeader.FileType <> DXTextureImageFile_Type then
raise EDXTextureImageError.Create(SInvalidDXTFile);
if FileHeader.ver <> DXTextureImageFile_Version then
raise EDXTextureImageError.Create(SInvalidDXTFile);
 
while True do
begin
Stream.ReadBuffer(BlockHeader, SizeOf(BlockHeader));
NextPos := Stream.Position + BlockHeader.Size;
 
case BlockHeader.ID of
DXTextureImageFileBlockID_EndFile:
begin
{ End of file }
Break;
end;
DXTextureImageFileBlockID_StartGroup:
begin
{ Beginning of group }
Stream.ReadBuffer(Header_StartGroup, SizeOf(Header_StartGroup));
case Header_StartGroup.CategoryType of
DXTextureImageFileCategoryType_Image: ReadGroup_Image(Image);
end;
end;
end;
 
Stream.Seek(NextPos, soFromBeginning);
end;
end;
 
type
PDXTextureImageFileBlockHeaderWriter_BlockInfo = ^TDXTextureImageFileBlockHeaderWriter_BlockInfo;
TDXTextureImageFileBlockHeaderWriter_BlockInfo = record
BlockID: DWORD;
StreamPos: Integer;
end;
 
TDXTextureImageFileBlockHeaderWriter = class
private
FStream: TStream;
FList: TList;
public
constructor Create(Stream: TStream);
destructor Destroy; override;
procedure StartBlock(BlockID: DWORD);
procedure EndBlock;
procedure WriteBlock(BlockID: DWORD);
procedure StartGroup(CategoryType: DWORD);
procedure EndGroup;
end;
 
constructor TDXTextureImageFileBlockHeaderWriter.Create(Stream: TStream);
begin
inherited Create;
FStream := Stream;
FList := TList.Create;
end;
 
destructor TDXTextureImageFileBlockHeaderWriter.Destroy;
var
i: Integer;
begin
for i := 0 to FList.Count - 1 do
Dispose(PDXTextureImageFileBlockHeaderWriter_BlockInfo(FList[i]));
FList.Free;
inherited Destroy;
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.StartBlock(BlockID: DWORD);
var
BlockInfo: PDXTextureImageFileBlockHeaderWriter_BlockInfo;
BlockHeader: TDXTextureImageFileBlockHeader;
begin
New(BlockInfo);
BlockInfo.BlockID := BlockID;
BlockInfo.StreamPos := FStream.Position;
FList.Add(BlockInfo);
 
BlockHeader.ID := BlockID;
BlockHeader.Size := 0;
FStream.WriteBuffer(BlockHeader, SizeOf(BlockHeader));
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.EndBlock;
var
BlockHeader: TDXTextureImageFileBlockHeader;
BlockInfo: PDXTextureImageFileBlockHeaderWriter_BlockInfo;
CurStreamPos: Integer;
begin
CurStreamPos := FStream.Position;
try
BlockInfo := FList[FList.Count - 1];
 
FStream.Position := BlockInfo.StreamPos;
BlockHeader.ID := BlockInfo.BlockID;
BlockHeader.Size := CurStreamPos - (BlockInfo.StreamPos + SizeOf(TDXTextureImageFileBlockHeader));
FStream.WriteBuffer(BlockHeader, SizeOf(BlockHeader));
finally
FStream.Position := CurStreamPos;
 
Dispose(FList[FList.Count - 1]);
FList.Count := FList.Count - 1;
end;
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.WriteBlock(BlockID: DWORD);
var
BlockHeader: TDXTextureImageFileBlockHeader;
begin
BlockHeader.ID := BlockID;
BlockHeader.Size := 0;
FStream.WriteBuffer(BlockHeader, SizeOf(BlockHeader));
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.StartGroup(CategoryType: DWORD);
var
Header_StartGroup: TDXTextureImageFileBlockHeader_StartGroup;
begin
StartBlock(DXTextureImageFileBlockID_StartGroup);
 
Header_StartGroup.CategoryType := CategoryType;
FStream.WriteBuffer(Header_StartGroup, SizeOf(Header_StartGroup));
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.EndGroup;
begin
WriteBlock(DXTextureImageFileBlockID_EndGroup);
EndBlock;
end;
 
procedure DXTextureImage_SaveDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage);
var
Progress: Integer;
ProgressCount: Integer;
BlockHeaderWriter: TDXTextureImageFileBlockHeaderWriter;
 
function CalcProgressCount(Image: TDXTextureImage): Integer;
var
i: Integer;
begin
Result := Image.WidthBytes * Image.Height;
for i := 0 to Image.SubImageCount - 1 do
Inc(Result, CalcProgressCount(Image.SubImages[i]));
end;
 
procedure AddProgress(Count: Integer);
begin
Inc(Progress, Count);
Image.DoSaveProgress(Progress, ProgressCount);
end;
 
procedure WriteGroup_Image(Image: TDXTextureImage);
var
i: Integer;
Header_Image_Format: TDXTextureImageHeader_Image_Format;
Header_Image_Format_Index: TDXTextureImageHeader_Image_Format_Index;
Header_Image_Format_RGB: TDXTextureImageHeader_Image_Format_RGB;
Header_Image_GroupInfo: TDXTextureImageHeader_Image_GroupInfo;
Header_Image_TransparentColor: TDXTextureImageHeader_Image_TransparentColor;
Header_Image_PixelData: TDXTextureImageHeader_Image_PixelData;
{$IFDEF DXTextureImage_UseZLIB}
Compression: TCompressionStream;
{$ENDIF}
begin
BlockHeaderWriter.StartGroup(DXTextureImageFileCategoryType_Image);
try
{ Image format writing }
if Image.Size > 0 then
begin
Header_Image_Format.ImageType := Image.ImageType;
Header_Image_Format.Width := Image.Width;
Header_Image_Format.Height := Image.Height;
Header_Image_Format.BitCount := Image.BitCount;
Header_Image_Format.WidthBytes := Image.WidthBytes;
 
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_Format);
try
Stream.WriteBuffer(Header_Image_Format, SizeOf(Header_Image_Format));
 
case Image.ImageType of
DXTextureImageType_PaletteIndexedColor:
begin
{ INDEX IMAGE }
Header_Image_Format_Index.idx_index_Mask := Image.idx_index.Mask;
Header_Image_Format_Index.idx_alpha_Mask := Image.idx_alpha.Mask;
for i := 0 to 255 do
Header_Image_Format_Index.idx_palette[i] := Image.idx_palette[i];
 
Stream.WriteBuffer(Header_Image_Format_Index, SizeOf(Header_Image_Format_Index));
end;
DXTextureImageType_RGBColor:
begin
{ RGB IMAGE }
Header_Image_Format_RGB.rgb_red_Mask := Image.rgb_red.Mask;
Header_Image_Format_RGB.rgb_green_Mask := Image.rgb_green.Mask;
Header_Image_Format_RGB.rgb_blue_Mask := Image.rgb_blue.Mask;
Header_Image_Format_RGB.rgb_alpha_Mask := Image.rgb_alpha.Mask;
 
Stream.WriteBuffer(Header_Image_Format_RGB, SizeOf(Header_Image_Format_RGB));
end;
end;
finally
BlockHeaderWriter.EndBlock;
end;
end;
 
{ Image group information writing }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_GroupInfo);
try
Header_Image_GroupInfo.ImageGroupType := Image.ImageGroupType;
Header_Image_GroupInfo.ImageID := Image.ImageID;
 
Stream.WriteBuffer(Header_Image_GroupInfo, SizeOf(Header_Image_GroupInfo));
finally
BlockHeaderWriter.EndBlock;
end;
 
{ Name writing }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_Name);
try
Stream.WriteBuffer(Image.ImageName[1], Length(Image.ImageName));
finally
BlockHeaderWriter.EndBlock;
end;
 
{ Transparent color writing }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_TransparentColor);
try
Header_Image_TransparentColor.Transparent := Image.Transparent;
Header_Image_TransparentColor.TransparentColor := Image.TransparentColor;
 
Stream.WriteBuffer(Header_Image_TransparentColor, SizeOf(Header_Image_TransparentColor));
finally
BlockHeaderWriter.EndBlock;
end;
 
{ Pixel data writing }
if Image.Size > 0 then
begin
{ Writing start }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_PixelData);
try
{ Scan compress type }
case Image.FileCompressType of
DXTextureImageFileCompressType_None:
begin
Header_Image_PixelData.Compress := DXTextureImageCompress_None;
end;
{$IFDEF DXTextureImage_UseZLIB}
DXTextureImageFileCompressType_ZLIB:
begin
Header_Image_PixelData.Compress := DXTextureImageCompress_ZLIB;
end;
{$ENDIF}
else
Header_Image_PixelData.Compress := DXTextureImageCompress_None;
end;
 
Stream.WriteBuffer(Header_Image_PixelData, SizeOf(Header_Image_PixelData));
 
case Header_Image_PixelData.Compress of
DXTextureImageCompress_None:
begin
for i := 0 to Image.Height - 1 do
begin
Stream.WriteBuffer(Image.ScanLine[i]^, Image.Widthbytes);
AddProgress(Image.Widthbytes);
end;
end;
{$IFDEF DXTextureImage_UseZLIB}
DXTextureImageCompress_ZLIB:
begin
Compression := TCompressionStream.Create(clMax, Stream);
try
for i := 0 to Image.Height - 1 do
begin
Compression.WriteBuffer(Image.ScanLine[i]^, Image.WidthBytes);
AddProgress(Image.Widthbytes);
end;
finally
Compression.Free;
end;
end;
{$ENDIF}
end;
finally
BlockHeaderWriter.EndBlock;
end;
end;
 
{ Sub-image writing }
for i := 0 to Image.SubImageCount - 1 do
WriteGroup_Image(Image.SubImages[i]);
finally
BlockHeaderWriter.EndGroup;
end;
end;
 
var
FileHeader: TDXTextureImageFileHeader;
begin
Progress := 0;
ProgressCount := CalcProgressCount(Image);
 
{ File header writing }
FileHeader.FileType := DXTextureImageFile_Type;
FileHeader.ver := DXTextureImageFile_Version;
Stream.WriteBuffer(FileHeader, SizeOf(FileHeader));
 
{ Image writing }
BlockHeaderWriter := TDXTextureImageFileBlockHeaderWriter.Create(Stream);
try
{ Image writing }
WriteGroup_Image(Image);
 
{ End of file }
BlockHeaderWriter.WriteBlock(DXTextureImageFileBlockID_EndFile);
finally
BlockHeaderWriter.Free;
end;
end;
 
{ DXTextureImage_LoadBitmapFunc }
 
procedure DXTextureImage_LoadBitmapFunc(Stream: TStream; Image: TDXTextureImage);
type
TDIBPixelFormat = packed record
RBitMask, GBitMask, BBitMask: DWORD;
end;
var
TopDown: Boolean;
BF: TBitmapFileHeader;
BI: TBitmapInfoHeader;
 
procedure DecodeRGB;
var
y: Integer;
begin
for y := 0 to Image.Height - 1 do
begin
if TopDown then
Stream.ReadBuffer(Image.ScanLine[y]^, Image.WidthBytes)
else
Stream.ReadBuffer(Image.ScanLine[Image.Height - y - 1]^, Image.WidthBytes);
end;
end;
 
procedure DecodeRLE4;
var
SrcDataP: Pointer;
B1, B2, C: Byte;
Dest, Src, P: PByte;
X, Y, i: Integer;
begin
GetMem(SrcDataP, BI.biSizeImage);
try
Stream.ReadBuffer(SrcDataP^, BI.biSizeImage);
 
Dest := Image.TopPBits;
Src := SrcDataP;
X := 0;
Y := 0;
 
while True do
begin
B1 := Src^; Inc(Src);
B2 := Src^; Inc(Src);
 
if B1 = 0 then
begin
case B2 of
0: begin { End of line }
X := 0; Inc(Y);
Dest := Image.ScanLine[Y];
end;
1: Break; { End of bitmap }
2: begin { Difference of coordinates }
Inc(X, B1); Inc(Y, B2); Inc(Src, 2);
Dest := Image.ScanLine[Y];
end;
else
{ Absolute mode }
C := 0;
for i := 0 to B2 - 1 do
begin
if i and 1 = 0 then
begin
C := Src^; Inc(Src);
end
else
begin
C := C shl 4;
end;
 
P := Pointer(Integer(Dest) + X shr 1);
if X and 1 = 0 then
P^ := (P^ and $0F) or (C and $F0)
else
P^ := (P^ and $F0) or ((C and $F0) shr 4);
 
Inc(X);
end;
end;
end
else
begin
{ Encoding mode }
for i := 0 to B1 - 1 do
begin
P := Pointer(Integer(Dest) + X shr 1);
if X and 1 = 0 then
P^ := (P^ and $0F) or (B2 and $F0)
else
P^ := (P^ and $F0) or ((B2 and $F0) shr 4);
 
Inc(X);
 
// Swap nibble
B2 := (B2 shr 4) or (B2 shl 4);
end;
end;
 
{ Word arrangement }
Inc(Src, Longint(Src) and 1);
end;
finally
FreeMem(SrcDataP);
end;
end;
 
procedure DecodeRLE8;
var
SrcDataP: Pointer;
B1, B2: Byte;
Dest, Src: PByte;
X, Y: Integer;
begin
GetMem(SrcDataP, BI.biSizeImage);
try
Stream.ReadBuffer(SrcDataP^, BI.biSizeImage);
 
Dest := Image.TopPBits;
Src := SrcDataP;
X := 0;
Y := 0;
 
while True do
begin
B1 := Src^; Inc(Src);
B2 := Src^; Inc(Src);
 
if B1 = 0 then
begin
case B2 of
0: begin { End of line }
X := 0; Inc(Y);
Dest := Pointer(Longint(Image.TopPBits) + Y * Image.NextLine + X);
end;
1: Break; { End of bitmap }
2: begin { Difference of coordinates }
Inc(X, B1); Inc(Y, B2); Inc(Src, 2);
Dest := Pointer(Longint(Image.TopPBits) + Y * Image.NextLine + X);
end;
else
{ Absolute mode }
Move(Src^, Dest^, B2); Inc(Dest, B2); Inc(Src, B2);
end;
end
else
begin
{ Encoding mode }
FillChar(Dest^, B1, B2); Inc(Dest, B1);
end;
 
{ Word arrangement }
Inc(Src, Longint(Src) and 1);
end;
finally
FreeMem(SrcDataP);
end;
end;
 
var
BC: TBitmapCoreHeader;
RGBTriples: array[0..255] of TRGBTriple;
RGBQuads: array[0..255] of TRGBQuad;
i, PalCount, j: Integer;
OS2: Boolean;
PixelFormat: TDIBPixelFormat;
begin
{ File header reading }
i := Stream.Read(BF, SizeOf(TBitmapFileHeader));
if i = 0 then Exit;
if i <> SizeOf(TBitmapFileHeader) then
raise EDXTextureImageError.Create(SInvalidDIB);
 
{ Is the head 'BM'? }
if BF.bfType <> Ord('B') + Ord('M') * $100 then
raise EDXTextureImageError.Create(SInvalidDIB);
 
{ Reading of size of header }
i := Stream.Read(BI.biSize, 4);
if i <> 4 then
raise EDXTextureImageError.Create(SInvalidDIB);
 
{ Kind check of DIB }
OS2 := False;
 
case BI.biSize of
SizeOf(TBitmapCoreHeader):
begin
{ OS/2 type }
Stream.ReadBuffer(Pointer(Integer(@BC) + 4)^, SizeOf(TBitmapCoreHeader) - 4);
 
FilLChar(BI, SizeOf(BI), 0);
with BI do
begin
biClrUsed := 0;
biCompression := BI_RGB;
biBitCount := BC.bcBitCount;
biHeight := BC.bcHeight;
biWidth := BC.bcWidth;
end;
 
OS2 := True;
end;
SizeOf(TBitmapInfoHeader):
begin
{ Windows type }
Stream.ReadBuffer(Pointer(Integer(@BI) + 4)^, SizeOf(TBitmapInfoHeader) - 4);
end;
else
raise EDXTextureImageError.Create(SInvalidDIB);
end;
 
{ Bit mask reading }
if BI.biCompression = BI_BITFIELDS then
begin
Stream.ReadBuffer(PixelFormat, SizeOf(PixelFormat));
end
else
begin
if BI.biBitCount = 16 then
begin
PixelFormat.RBitMask := $7C00;
PixelFormat.GBitMask := $03E0;
PixelFormat.BBitMask := $001F;
end else if (BI.biBitCount = 24) or (BI.biBitCount = 32) then
begin
PixelFormat.RBitMask := $00FF0000;
PixelFormat.GBitMask := $0300FF00;
PixelFormat.BBitMask := $000000FF;
end;
end;
 
{ DIB making }
if BI.biHeight < 0 then
begin
BI.biHeight := -BI.biHeight;
TopDown := True;
end
else
TopDown := False;
 
if BI.biBitCount in [1, 4, 8] then
begin
Image.SetSize(DXTextureImageType_PaletteIndexedColor, BI.biWidth, BI.biHeight, BI.biBitCount,
(((BI.biWidth * BI.biBitCount) + 31) div 32) * 4);
 
Image.idx_index := dxtMakeChannel(1 shl BI.biBitCount - 1, True);
Image.PackedPixelOrder := True;
end
else
begin
Image.SetSize(DXTextureImageType_RGBColor, BI.biWidth, BI.biHeight, BI.biBitCount,
(((BI.biWidth * BI.biBitCount) + 31) div 32) * 4);
 
Image.rgb_red := dxtMakeChannel(PixelFormat.RBitMask, False);
Image.rgb_green := dxtMakeChannel(PixelFormat.GBitMask, False);
Image.rgb_blue := dxtMakeChannel(PixelFormat.BBitMask, False);
 
j := Image.rgb_red.BitCount + Image.rgb_green.BitCount + Image.rgb_blue.BitCount;
if j < BI.biBitCount then
Image.rgb_alpha := dxtMakeChannel((1 shl (BI.biBitCount - j) - 1) shl j, False);
 
Image.PackedPixelOrder := False;
end;
 
{ palette reading }
PalCount := BI.biClrUsed;
if (PalCount = 0) and (BI.biBitCount <= 8) then
PalCount := 1 shl BI.biBitCount;
if PalCount > 256 then PalCount := 256;
 
if OS2 then
begin
{ OS/2 type }
Stream.ReadBuffer(RGBTriples, SizeOf(TRGBTriple) * PalCount);
for i := 0 to PalCount - 1 do
begin
Image.idx_palette[i].peRed := RGBTriples[i].rgbtRed;
Image.idx_palette[i].peGreen := RGBTriples[i].rgbtGreen;
Image.idx_palette[i].peBlue := RGBTriples[i].rgbtBlue;
end;
end
else
begin
{ Windows type }
Stream.ReadBuffer(RGBQuads, SizeOf(TRGBQuad) * PalCount);
for i := 0 to PalCount - 1 do
begin
Image.idx_palette[i].peRed := RGBQuads[i].rgbRed;
Image.idx_palette[i].peGreen := RGBQuads[i].rgbGreen;
Image.idx_palette[i].peBlue := RGBQuads[i].rgbBlue;
end;
end;
 
{ Pixel data reading }
case BI.biCompression of
BI_RGB: DecodeRGB;
BI_BITFIELDS: DecodeRGB;
BI_RLE4: DecodeRLE4;
BI_RLE8: DecodeRLE8;
else
raise EDXTextureImageError.Create(SInvalidDIB);
end;
end;
 
{ TDXTBase }
 
//Note by JB.
//This class is supplement of original Hori's code.
//For use alphablend you can have a bitmap 32 bit RGBA
//when isn't alphachannel present, it works like RGB 24bit
 
//functions required actualized DIB source for works with alphachannel
 
function TDXTBase.GetCompression: TDXTextureImageFileCompressType;
begin
Result := FParamsFormat.Compress;
end;
 
procedure TDXTBase.SetCompression(const Value: TDXTextureImageFileCompressType);
begin
FParamsFormat.Compress := Value;
end;
 
function TDXTBase.GetWidth: Integer;
begin
Result := FParamsFormat.Width;
end;
 
procedure TDXTBase.SetWidth(const Value: Integer);
begin
FParamsFormat.Width := Value;
end;
 
function TDXTBase.GetMipmap: Integer;
begin
Result := FParamsFormat.MipmapCount;
end;
 
procedure TDXTBase.SetMipmap(const Value: Integer);
begin
if Value = -1 then
FParamsFormat.MipmapCount := MaxInt
else
FParamsFormat.MipmapCount := Value;
end;
 
function TDXTBase.GetTransparentColor: TColorRef;
begin
Result := FParamsFormat.TransparentColor;
end;
 
procedure TDXTBase.SetTransparentColor(const Value: TColorRef);
begin
FParamsFormat.Transparent := True;
FParamsFormat.TransparentColor := RGB(Value shr 16, Value shr 8, Value);
end;
 
procedure TDXTBase.SetTransparentColorIndexed(const Value: TColorRef);
begin
FParamsFormat.TransparentColor := PaletteIndex(Value);
end;
 
function TDXTBase.GetHeight: Integer;
begin
Result := FParamsFormat.Height;
end;
 
procedure TDXTBase.SetHeight(const Value: Integer);
begin
FParamsFormat.Height := Value;
end;
 
procedure TDXTBase.SetChannelY(T: TDIB);
begin
 
end;
 
procedure TDXTBase.LoadChannelRGBFromFile(const FileName: string);
begin
FStrImageFileName := FileName;
try
EvaluateChannels([rgbRed, rgbGreen, rgbBlue], '', '');
finally
FStrImageFileName := '';
end;
end;
 
function TDXTBase.LoadFromFile(iFilename: string): Boolean;
begin
Result := FileExists(iFilename);
if Result then
try
Texture.LoadFromFile(iFileName);
except
Result := False;
end;
end;
 
procedure TDXTBase.LoadChannelAFromFile(const FileName: string);
begin
FStrImageFileName := FileName;
try
EvaluateChannels([rgbAlpha], '', '');
finally
FStrImageFileName := '';
end;
end;
 
constructor TDXTBase.Create;
var
Channel: TDXTImageChannel;
begin
FillChar(Channel, SizeOf(Channel), 0);
FilLChar(FParamsFormat, SizeOf(FParamsFormat), 0);
FParamsFormat.Compress := DXTextureImageFileCompressType_None;
FHasImageList := TList.Create;
for Channel := Low(Channel) to High(Channel) do
FChannelChangeTable[Channel] := Channel;
FChannelChangeTable[rgbAlpha] := yuvY;
FDIB := nil;
FStrImageFileName := '';
end;
 
procedure TDXTBase.SetChannelRGBA(T: TDIB);
begin
FDIB := T;
try
EvaluateChannels([rgbRed, rgbGreen, rgbBlue, rgbAlpha], '', '');
finally
FDIB := nil;
end;
end;
 
procedure TDXTBase.BuildImage(Image: TDXTextureImage);
type
TOutputImageChannelInfo2 = record
Image: TDXTextureImage;
Channels: TDXTImageChannels;
end;
var
cR, cG, cB: Byte;
 
function GetChannelVal(const Channel: TDXTextureImageChannel; SrcChannel: TDXTImageChannel): DWORD;
begin
case SrcChannel of
rgbRed: Result := dxtEncodeChannel(Channel, cR);
rgbGreen: Result := dxtEncodeChannel(Channel, cG);
rgbBlue: Result := dxtEncodeChannel(Channel, cB);
yuvY: Result := dxtEncodeChannel(Channel, (cR * 306 + cG * 602 + cB * 116) div 1024);
else Result := 0;
end;
end;
 
var
HasImageChannelList: array[0..Ord(High(TDXTImageChannel)) + 1] of TOutputImageChannelInfo2;
HasImageChannelListCount: Integer;
x, y, i: Integer;
c, c2, c3: DWORD;
Channel: TDXTImageChannel;
Flag: Boolean;
 
SrcImage: TDXTextureImage;
UseChannels: TDXTImageChannels;
begin
HasImageChannelListCount := 0;
for Channel := Low(Channel) to High(Channel) do
if Channel in FHasChannels then
begin
Flag := False;
for i := 0 to HasImageChannelListCount - 1 do
if HasImageChannelList[i].Image = FHasChannelImages[Channel].Image then
begin
HasImageChannelList[i].Channels := HasImageChannelList[i].Channels + [Channel];
Flag := True;
Break;
end;
if not Flag then
begin
HasImageChannelList[HasImageChannelListCount].Image := FHasChannelImages[Channel].Image;
HasImageChannelList[HasImageChannelListCount].Channels := [Channel];
Inc(HasImageChannelListCount);
end;
end;
 
cR := 0;
cG := 0;
cB := 0;
 
if Image.ImageType = DXTextureImageType_PaletteIndexedColor then
begin
{ Index color }
for y := 0 to Image.Height - 1 do
for x := 0 to Image.Width - 1 do
begin
c := 0;
 
for i := 0 to HasImageChannelListCount - 1 do
begin
SrcImage := HasImageChannelList[i].Image;
UseChannels := HasImageChannelList[i].Channels;
 
case SrcImage.ImageType of
DXTextureImageType_PaletteIndexedColor:
begin
c2 := SrcImage.Pixels[x, y];
c3 := dxtDecodeChannel(SrcImage.idx_index, c2);
 
if rgbRed in UseChannels then
c := c or dxtEncodeChannel(Image.idx_index, c3);
 
cR := SrcImage.idx_palette[c3].peRed;
cG := SrcImage.idx_palette[c3].peGreen;
cB := SrcImage.idx_palette[c3].peBlue;
end;
DXTextureImageType_RGBColor:
begin
c2 := SrcImage.Pixels[x, y];
 
cR := dxtDecodeChannel(SrcImage.rgb_red, c2);
cG := dxtDecodeChannel(SrcImage.rgb_green, c2);
cB := dxtDecodeChannel(SrcImage.rgb_blue, c2);
end;
end;
 
if rgbAlpha in UseChannels then
c := c or GetChannelVal(Image.idx_alpha, FChannelChangeTable[rgbAlpha]);
end;
 
Image.Pixels[x, y] := c;
end;
end
else
if Image.ImageType = DXTextureImageType_RGBColor then
begin
{ RGB color }
for y := 0 to Image.Height - 1 do
for x := 0 to Image.Width - 1 do
begin
c := 0;
 
for i := 0 to HasImageChannelListCount - 1 do
begin
SrcImage := HasImageChannelList[i].Image;
UseChannels := HasImageChannelList[i].Channels;
 
case SrcImage.ImageType of
DXTextureImageType_PaletteIndexedColor:
begin
c2 := SrcImage.Pixels[x, y];
c3 := dxtDecodeChannel(SrcImage.idx_index, c2);
 
cR := SrcImage.idx_palette[c3].peRed;
cG := SrcImage.idx_palette[c3].peGreen;
cB := SrcImage.idx_palette[c3].peBlue;
end;
DXTextureImageType_RGBColor:
begin
c2 := SrcImage.Pixels[x, y];
 
cR := dxtDecodeChannel(SrcImage.rgb_red, c2);
cG := dxtDecodeChannel(SrcImage.rgb_green, c2);
cB := dxtDecodeChannel(SrcImage.rgb_blue, c2);
end;
end;
 
if rgbRed in UseChannels then
c := c or GetChannelVal(Image.rgb_red, FChannelChangeTable[rgbRed]);
if rgbGreen in UseChannels then
c := c or GetChannelVal(Image.rgb_green, FChannelChangeTable[rgbGreen]);
if rgbBlue in UseChannels then
c := c or GetChannelVal(Image.rgb_Blue, FChannelChangeTable[rgbBlue]);
if rgbAlpha in UseChannels then
c := c or GetChannelVal(Image.rgb_alpha, FChannelChangeTable[rgbAlpha]);
end;
 
Image.Pixels[x, y] := c;
end;
end;
end;
 
procedure TDXTBase.SetChannelR(T: TDIB);
begin
FDIB := T;
try
EvaluateChannels([rgbRed], '', '');
finally
FDIB := nil;
end;
end;
 
function GetBitCount(b: Integer): Integer;
begin
Result := 32;
while (Result > 0) and (((1 shl (Result - 1)) and b) = 0) do Dec(Result);
end;
 
procedure TDXTBase.CalcOutputBitFormat;
var
BitCount: DWORD;
NewWidth, NewHeight, i, j: Integer;
Channel: TDXTImageChannel;
begin
{ Size calculation }
NewWidth := 1 shl GetBitCount(TDXTextureImage(FHasImageList[0]).Width);
NewHeight := 1 shl GetBitCount(TDXTextureImage(FHasImageList[0]).Height);
NewWidth := Max(NewWidth, NewHeight);
NewHeight := NewWidth;
if Abs(FParamsFormat.Width - NewWidth) > Abs(FParamsFormat.Width - NewWidth div 2) then
NewWidth := NewWidth div 2;
if Abs(FParamsFormat.Height - NewHeight) > Abs(FParamsFormat.Height - NewHeight div 2) then
NewHeight := NewHeight div 2;
 
if FParamsFormat.Width = 0 then FParamsFormat.Width := NewWidth;
if FParamsFormat.Height = 0 then FParamsFormat.Height := NewHeight;
 
{ Other several calculation }
i := Min(FParamsFormat.Width, FParamsFormat.Height);
j := 0;
while i > 1 do
begin
i := i div 2;
Inc(j);
end;
 
FParamsFormat.MipmapCount := Min(j, FParamsFormat.MipmapCount);
 
{ Output type calculation }
if (FHasChannelImages[rgbRed].Image = FHasChannelImages[rgbGreen].Image) and
(FHasChannelImages[rgbRed].Image = FHasChannelImages[rgbBlue].Image) and
(FHasChannelImages[rgbRed].Image <> nil) and
(FHasChannelImages[rgbRed].Image.ImageType = DXTextureImageType_PaletteIndexedColor) and
 
(FHasChannelImages[rgbRed].BitCount = 8) and
(FHasChannelImages[rgbGreen].BitCount = 8) and
(FHasChannelImages[rgbBlue].BitCount = 8) and
 
(FChannelChangeTable[rgbRed] = rgbRed) and
(FChannelChangeTable[rgbGreen] = rgbGreen) and
(FChannelChangeTable[rgbBlue] = rgbBlue) and
 
(FParamsFormat.Width = FHasChannelImages[rgbRed].Image.Width) and
(FParamsFormat.Height = FHasChannelImages[rgbRed].Image.Height) and
 
(FParamsFormat.MipmapCount = 0)
then
begin
FParamsFormat.ImageType := DXTextureImageType_PaletteIndexedColor;
end
else
FParamsFormat.ImageType := DXTextureImageType_RGBColor;
 
{ Bit several calculations }
FParamsFormat.BitCount := 0;
 
for Channel := Low(TDXTImageChannel) to High(TDXTImageChannel) do
if (FHasChannelImages[Channel].Image <> nil) and (FHasChannelImages[Channel].Image.ImageType = DXTextureImageType_PaletteIndexedColor) then
begin
FParamsFormat.idx_palette := FHasChannelImages[Channel].Image.idx_palette;
Break;
end;
 
if FParamsFormat.ImageType = DXTextureImageType_PaletteIndexedColor then
begin
{ Index channel }
if rgbRed in FHasChannels then
begin
BitCount := FHasChannelImages[rgbRed].BitCount;
FParamsFormat.idx_index := dxtMakeChannel(((1 shl BitCount) - 1) shl FParamsFormat.BitCount, True);
Inc(FParamsFormat.BitCount, BitCount);
end;
 
{ Alpha channel }
if rgbAlpha in FHasChannels then
begin
BitCount := FHasChannelImages[rgbAlpha].BitCount;
FParamsFormat.idx_alpha := dxtMakeChannel(((1 shl BitCount) - 1) shl FParamsFormat.BitCount, False);
Inc(FParamsFormat.BitCount, BitCount);
end;
end
else
begin
{ B channel }
if rgbBlue in FHasChannels then
begin
BitCount := FHasChannelImages[rgbBlue].BitCount;
FParamsFormat.rgb_blue := dxtMakeChannel(((1 shl BitCount) - 1) shl FParamsFormat.BitCount, False);
Inc(FParamsFormat.BitCount, BitCount);
end;
 
{ G channel }
if rgbGreen in FHasChannels then
begin
BitCount := FHasChannelImages[rgbGreen].BitCount;
FParamsFormat.rgb_green := dxtMakeChannel(((1 shl BitCount) - 1) shl FParamsFormat.BitCount, False);
Inc(FParamsFormat.BitCount, BitCount);
end;
 
{ R channel }
if rgbRed in FHasChannels then
begin
BitCount := FHasChannelImages[rgbRed].BitCount;
FParamsFormat.rgb_red := dxtMakeChannel(((1 shl BitCount) - 1) shl FParamsFormat.BitCount, False);
Inc(FParamsFormat.BitCount, BitCount);
end;
 
{ Alpha channel }
if rgbAlpha in FHasChannels then
begin
BitCount := FHasChannelImages[rgbAlpha].BitCount;
FParamsFormat.rgb_alpha := dxtMakeChannel(((1 shl BitCount) - 1) shl FParamsFormat.BitCount, False);
Inc(FParamsFormat.BitCount, BitCount);
end;
end;
 
{ As for the number of bits only either of 1, 2, 4, 8, 16, 24, 32 }
if FParamsFormat.BitCount in [3] then
FParamsFormat.BitCount := 4
else
if FParamsFormat.BitCount in [5..7] then
FParamsFormat.BitCount := 8
else
if FParamsFormat.BitCount in [9..15] then
FParamsFormat.BitCount := 16
else
if FParamsFormat.BitCount in [17..23] then
FParamsFormat.BitCount := 24
else
if FParamsFormat.BitCount in [25..31] then
FParamsFormat.BitCount := 32;
 
{ Transparent color }
if (FParamsFormat.ImageType = DXTextureImageType_RGBColor) and (FParamsFormat.TransparentColor shr 24 = $01) then
begin
FParamsFormat.TransparentColor := RGB(FParamsFormat.idx_palette[Byte(FParamsFormat.TransparentColor)].peRed,
FParamsFormat.idx_palette[Byte(FParamsFormat.TransparentColor)].peGreen,
FParamsFormat.idx_palette[Byte(FParamsFormat.TransparentColor)].peBlue);
end;
end;
 
procedure TDXTBase.LoadChannelRGBAFromFile(const FileName: string);
begin
FStrImageFileName := FileName;
try
EvaluateChannels([rgbRed, rgbGreen, rgbBlue, rgbAlpha], '', '');
finally
FStrImageFileName := '';
end;
end;
 
procedure TDXTBase.SetChannelB(T: TDIB);
begin
FDIB := T;
try
EvaluateChannels([rgbBlue], '', '');
finally
FDIB := nil;
end;
end;
 
procedure TDXTBase.SetChannelRGB(T: TDIB);
begin
FDIB := T;
try
EvaluateChannels([rgbRed, rgbGreen, rgbBlue], '', '');
finally
FDIB := nil;
end;
end;
 
procedure TDXTBase.SaveToFile(iFilename: string {$IFDEF VER4UP} = ''{$ENDIF});
var
Image: TDXTextureImage;
begin
{ Create output stream }
Image := Self.Texture;
if (FHasImageList.Count > 0) and Assigned(Image) then
begin
if iFilename <> '' then
Image.SaveToFile(iFilename)
else
Image.SaveToFile(FParamsFormat.Name + '.dxt');
end;
end;
 
procedure TDXTBase.SetChannelA(T: TDIB);
begin
FDIB := T;
try
EvaluateChannels([rgbAlpha], '', '');
finally
FDIB := nil;
end;
end;
 
procedure TDXTBase.SetChannelG(T: TDIB);
begin
FDIB := T;
try
EvaluateChannels([rgbGreen], '', '');
finally
FDIB := nil;
end;
end;
 
destructor TDXTBase.Destroy;
var I: Integer;
begin
for I := 0 to FHasImageList.Count - 1 do
TDXTextureImage(FHasImageList[I]).Free;
FHasImageList.Free;
inherited Destroy;
end;
 
function TDXTBase.GetPicture: TDXTextureImage;
var
MemoryStream: TMemoryStream;
begin
Result := TDXTextureImage.Create;
try
if (FStrImageFileName <> '') and FileExists(FStrImageFileName) then
begin
Result.LoadFromFile(FStrImageFileName);
Result.FImageName := ExtractFilename(FStrImageFileName);
end
else
if Assigned(FDIB) then
begin
MemoryStream := TMemoryStream.Create;
try
FDIB.SaveToStream(MemoryStream);
MemoryStream.Position := 0; //reading from 0
Result.LoadFromStream(MemoryStream);
finally
MemoryStream.Free;
end;
Result.FImageName := Format('DIB%x', [Integer(Result)]); //supplement name
end;
except
on E: Exception do
begin
EDXTBaseError.Create(E.Message);
end;
end
end;
 
procedure TDXTBase.Resize(Image: TDXTextureImage; NewWidth, NewHeight: Integer;
FilterTypeResample: TFilterTypeResample);
//resize used for Mipmap
var
DIB: TDIB;
x, y: Integer;
c: DWORD;
MemoryStream: TMemoryStream;
begin
{ Exit when no resize }
if (Image.Width = NewWidth) and (Image.Height = NewHeight) then Exit;
{ Supplement for image resizing }
//raise EDXTBaseError.Create('Invalid image size for texture.');
{ No image at start }
DIB := TDIB.Create; //DIB accept
try
DIB.SetSize(Image.Width, Image.Height, Image.BitCount);
{ of type }
for y := 0 to Image.Height - 1 do
for x := 0 to Image.Width - 1 do
begin
if Image.ImageType = DXTextureImageType_PaletteIndexedColor then
begin
c := dxtDecodeChannel(Image.idx_index, Image.Pixels[x, y]);
DIB.Pixels[x, y] := (Image.idx_palette[c].peRed shl 16) or
(Image.idx_palette[c].peGreen shl 8) or
Image.idx_palette[c].peBlue;
end
else begin
c := Image.Pixels[x, y];
DIB.Pixels[x, y] := (dxtDecodeChannel(Image.rgb_red, c) shl 16) or
(dxtDecodeChannel(Image.rgb_green, c) shl 8) or
dxtDecodeChannel(Image.rgb_blue, c);
end;
end;
 
{ Resize for 24 bitcount deep }
Image.SetSize(DXTextureImageType_RGBColor, Width, Height, Image.BitCount, 0);
 
Image.rgb_red := dxtMakeChannel($FF0000, False);
Image.rgb_green := dxtMakeChannel($00FF00, False);
Image.rgb_blue := dxtMakeChannel($0000FF, False);
Image.rgb_alpha := dxtMakeChannel(0, False);
 
{ Resample routine DIB based there }
DIB.DoResample(Width, Height, FilterTypeResample);
 
{Image returned through stream}
Image.ClearImage;
MemoryStream := TMemoryStream.Create;
try
DIB.SaveToStream(MemoryStream);
MemoryStream.Position := 0; //from first byte
Image.LoadFromStream(MemoryStream);
finally
MemoryStream.Free;
end;
finally
DIB.Free;
end;
end;
 
procedure TDXTBase.EvaluateChannels
(const CheckChannelUsed: TDXTImageChannels;
const CheckChannelChanged, CheckBitCountForChannel: string);
var J: Integer;
Channel: TDXTImageChannel;
ChannelBitCount: array[TDXTImageChannel] of Integer;
ChannelParamName: TDXTImageChannels;
Image: TDXTextureImage;
Q: TDXTImageChannel;
begin
Fillchar(ChannelBitCount, SizeOf(ChannelBitCount), 0);
ChannelParamName := [];
{ The channel which you use acquisition }
J := 0;
for Q := rgbRed to rgbAlpha do
begin
if Q in CheckChannelUsed then
begin
Inc(J);
Channel := Q;
if not (Channel in FHasChannels) then
begin
if CheckBitCountForChannel <> '' then
ChannelBitCount[Channel] := StrToInt(Copy(CheckBitCountForChannel, j, 1))
else
ChannelBitCount[Channel] := 8; {poke default value}
if ChannelBitCount[Channel] <> 0 then
ChannelParamName := ChannelParamName + [Channel];
 
if CheckChannelChanged <> '' then
begin
case UpCase(CheckChannelChanged[j]) of
'R': FChannelChangeTable[Channel] := rgbRed;
'G': FChannelChangeTable[Channel] := rgbGreen;
'B': FChannelChangeTable[Channel] := rgbBlue;
'Y': FChannelChangeTable[Channel] := yuvY;
'N': FChannelChangeTable[Channel] := rgbNone;
else
raise EDXTBaseError.CreateFmt('Invalid channel type(%s)', [CheckChannelChanged[j]]);
end;
end;
end;
end;
end;
{ Processing of each }
if ChannelParamName <> [] then
begin
{ Picture load }
Image := nil;
{pokud je image uz nahrany tj. stejneho jmena, pokracuj dale}
for j := 0 to FHasImageList.Count - 1 do
if AnsiCompareFileName(TDXTextureImage(FHasImageList[j]).ImageName, FStrImageFileName) = 0 then
begin
Image := FHasImageList[j];
Break;
end;
{obrazek neexistuje, musi se dotahnout bud z proudu, souboru nebo odjinut}
if Image = nil then
begin
try
Image := GetPicture;
except
if Assigned(Image) then
begin
{$IFNDEF VER5UP}
Image.Free; Image := nil;
{$ELSE}
FreeAndNil(Image);
{$ENDIF}
end;
raise;
end;
FHasImageList.Add(Image);
end;
 
{ Each channel processing }
for Channel := Low(Channel) to High(Channel) do
if Channel in ChannelParamName then
begin
if ChannelBitCount[Channel] >= 0 then
FHasChannelImages[Channel].BitCount := ChannelBitCount[Channel]
else
begin
case Image.ImageType of
DXTextureImageType_PaletteIndexedColor:
begin
case Channel of
rgbRed: FHasChannelImages[Channel].BitCount := 8;
rgbGreen: FHasChannelImages[Channel].BitCount := 8;
rgbBlue: FHasChannelImages[Channel].BitCount := 8;
rgbAlpha: FHasChannelImages[Channel].BitCount := 8;
end;
end;
DXTextureImageType_RGBColor:
begin
case Channel of
rgbRed: FHasChannelImages[Channel].BitCount := Image.rgb_red.BitCount;
rgbGreen: FHasChannelImages[Channel].BitCount := Image.rgb_green.BitCount;
rgbBlue: FHasChannelImages[Channel].BitCount := Image.rgb_blue.BitCount;
rgbAlpha: FHasChannelImages[Channel].BitCount := 8;
end;
end;
end;
end;
if FHasChannelImages[Channel].BitCount = 0 then Continue;
FHasChannels := FHasChannels + [Channel];
FHasChannelImages[Channel].Image := Image;
end;
end;
end;
 
function TDXTBase.GetTexture: TDXTextureImage;
var
i, j: Integer;
SubImage: TDXTextureImage;
CurWidth, CurHeight: Integer;
begin
Result := nil;
if FHasImageList.Count = 0 then
raise EDXTBaseError.Create('No image found');
 
{ Output format calculation }
CalcOutputBitFormat;
Result := TDXTextureImage.Create;
try
Result.SetSize(FParamsFormat.ImageType, FParamsFormat.Width, FParamsFormat.Height, FParamsFormat.BitCount, 0);
 
Result.idx_index := FParamsFormat.idx_index;
Result.idx_alpha := FParamsFormat.idx_alpha;
Result.idx_palette := FParamsFormat.idx_palette;
 
Result.rgb_red := FParamsFormat.rgb_red;
Result.rgb_green := FParamsFormat.rgb_green;
Result.rgb_blue := FParamsFormat.rgb_blue;
Result.rgb_alpha := FParamsFormat.rgb_alpha;
 
Result.ImageName := FParamsFormat.Name;
 
Result.Transparent := FParamsFormat.Transparent;
if FParamsFormat.TransparentColor shr 24 = $01 then
Result.TransparentColor := dxtEncodeChannel(Result.idx_index, PaletteIndex(Byte(FParamsFormat.TransparentColor)))
else
Result.TransparentColor := Result.EncodeColor(GetRValue(FParamsFormat.TransparentColor), GetGValue(FParamsFormat.TransparentColor), GetBValue(FParamsFormat.TransparentColor), 0);
 
BuildImage(Result);
 
if FParamsFormat.ImageType = DXTextureImageType_RGBColor then
begin
BuildImage(Result);
{ Picture information store here }
CurWidth := FParamsFormat.Width;
CurHeight := FParamsFormat.Height;
for i := 0 to FParamsFormat.MipmapCount - 1 do
begin
CurWidth := CurWidth div 2;
CurHeight := CurHeight div 2;
if (CurWidth <= 0) or (CurHeight <= 0) then Break;
{ Resize calc here }
for j := 0 to FHasImageList.Count - 1 do
Resize(FHasImageList[j], CurWidth, CurHeight, ftrTriangle);
 
SubImage := TDXTextureImage.CreateSub(Result);
SubImage.SetSize(FParamsFormat.ImageType, CurWidth, CurHeight, FParamsFormat.BitCount, 0);
 
SubImage.idx_index := FParamsFormat.idx_index;
SubImage.idx_alpha := FParamsFormat.idx_alpha;
SubImage.idx_palette := FParamsFormat.idx_palette;
 
SubImage.rgb_red := FParamsFormat.rgb_red;
SubImage.rgb_green := FParamsFormat.rgb_green;
SubImage.rgb_blue := FParamsFormat.rgb_blue;
SubImage.rgb_alpha := FParamsFormat.rgb_alpha;
 
SubImage.ImageGroupType := DXTextureImageGroupType_Normal;
SubImage.ImageID := i;
SubImage.ImageName := Format('%s - mimap #%d', [Result.ImageName, i + 1]);
 
BuildImage(SubImage);
end;
end;
Result.FileCompressType := FParamsFormat.Compress;
except
on E: Exception do
begin
{$IFNDEF VER5UP}
Result.Free;
Result := nil;
{$ELSE}
FreeAndNil(Result);
{$ENDIF}
raise EDXTBaseError.Create(E.Message);
end;
end;
end;
 
{ DIB2DTX }
 
procedure dib2dxt(DIBImage: TDIB; out DXTImage: TDXTextureImage{$IFDEF DXTextureImage_UseZLIB}; const Shrink: Boolean = True{$ENDIF});
var
TexImage: TDXTBase;
DIB: TDIB;
begin
TexImage := TDXTBase.Create;
try
{$IFDEF DXTextureImage_UseZLIB}
if Shrink then
begin
TexImage.Compression := DXTextureImageFileCompressType_ZLIB;
TexImage.Mipmap := 4;
end;
{$ENDIF}
try
if DIBImage.HasAlphaChannel then
begin
DIB := DIBImage.RGBChannel;
TexImage.SetChannelRGB(DIB);
DIB.Free;
DIB := DIBImage.AlphaChannel;
TexImage.SetChannelA(DIB);
DIB.Free;
end
else
TexImage.SetChannelRGB(DIBImage);
 
DXTImage := TexImage.Texture;
except
if Assigned(DXTImage) then
DXTImage.Free;
DXTImage := nil;
end;
finally
TexImage.Free;
end
end;
 
{$IFDEF D3DRM}
 
{ TDirect3DRMUserVisual }
 
procedure TDirect3DRMUserVisual_D3DRMOBJECTCALLBACK(lpD3DRMobj: IDirect3DRMObject;
lpArg: Pointer); cdecl;
lpArg: Pointer); CDECL;
begin
TDirect3DRMUserVisual(lpArg).Free;
end;
11493,7 → 6149,7
 
function TDirect3DRMUserVisual_D3DRMUSERVISUALCALLBACK(lpD3DRMUV: IDirect3DRMUserVisual;
lpArg: Pointer; lpD3DRMUVreason: TD3DRMUserVisualReason;
lpD3DRMDev: IDirect3DRMDevice; lpD3DRMview: IDirect3DRMViewport): Integer; cdecl;
lpD3DRMDev: IDirect3DRMDevice; lpD3DRMview: IDirect3DRMViewport): Integer; CDECL;
begin
Result := TDirect3DRMUserVisual(lpArg).DoRender(lpD3DRMUVreason, lpD3DRMDev, lpD3DRMview);
end;
11503,8 → 6159,7
inherited Create;
 
if D3DRM.CreateUserVisual(@TDirect3DRMUserVisual_D3DRMUSERVISUALCALLBACK,
Self, FUserVisual) <> D3DRM_OK
then
Self, FUserVisual)<>D3DRM_OK then
raise EDirect3DRMUserVisualError.CreateFmt(SCannotMade, ['IDirect3DRMUserVisual']);
 
FUserVisual.AddDestroyCallback(@TDirect3DRMUserVisual_D3DRMOBJECTCALLBACK, Self);
11512,7 → 6167,7
 
destructor TDirect3DRMUserVisual.Destroy;
begin
if FUserVisual <> nil then
if FUserVisual<>nil then
FUserVisual.DeleteDestroyCallback(@TDirect3DRMUserVisual_D3DRMOBJECTCALLBACK, Self);
FUserVisual := nil;
inherited Destroy;
11523,10 → 6178,13
begin
Result := 0;
end;
{$ENDIF}
 
{ TPictureCollectionItem }
 
const
SurfaceDivWidth = 512;
SurfaceDivHeight = 512;
 
type
TPictureCollectionItemPattern = class(TCollectionItem)
private
11575,7 → 6233,7
Restore;
end else
inherited Assign(Source);
end;
end;
 
procedure TPictureCollectionItem.ClearSurface;
var
11582,7 → 6240,7
i: Integer;
begin
FPatterns.Clear;
for i := 0 to FSurfaceList.Count - 1 do
for i:=0 to FSurfaceList.Count-1 do
TDirectDrawSurface(FSurfaceList[i]).Free;
FSurfaceList.Clear;
end;
11590,7 → 6248,7
function TPictureCollectionItem.GetHeight: Integer;
begin
Result := FPatternHeight;
if (Result <= 0) then
if (Result<=0) then
Result := FPicture.Height;
end;
 
11601,8 → 6259,7
 
function TPictureCollectionItem.GetPatternRect(Index: Integer): TRect;
begin
if (Index >= 0) and (index < FPatterns.Count) then
//Result := (FPatterns.Items[Index] as TPictureCollectionItemPattern).FRect
if (Index>=0) and (index<FPatterns.Count) then
Result := TPictureCollectionItemPattern(FPatterns.Items[Index]).FRect
else
Result := Rect(0, 0, 0, 0);
11610,7 → 6267,7
 
function TPictureCollectionItem.GetPatternSurface(Index: Integer): TDirectDrawSurface;
begin
if (Index >= 0) and (index < FPatterns.Count) then
if (Index>=0) and (index<FPatterns.Count) then
Result := TPictureCollectionItemPattern(FPatterns.Items[Index]).FSurface
else
Result := nil;
11620,17 → 6277,17
var
XCount, YCount: Integer;
begin
if FSurfaceList.Count = 0 then
if FSurfaceList.Count=0 then
begin
if PatternWidth = 0 then PatternWidth := FPicture.Width; //prevent division by zero
XCount := FPicture.Width div (PatternWidth + SkipWidth);
if FPicture.Width - XCount * (PatternWidth + SkipWidth) = PatternWidth then
Inc(XCount);
if PatternHeight = 0 then PatternHeight := FPicture.Height; //prevent division by zero
YCount := FPicture.Height div (PatternHeight + SkipHeight);
if FPicture.Height - YCount * (PatternHeight + SkipHeight) = PatternHeight then
Inc(YCount);
Result := XCount * YCount;
XCount := FPicture.Width div (PatternWidth+SkipWidth);
if FPicture.Width-XCount*(PatternWidth+SkipWidth)=PatternWidth then
Inc(XCount);
 
YCount := FPicture.Height div (PatternHeight+SkipHeight);
if FPicture.Height-YCount*(PatternHeight+SkipHeight)=PatternHeight then
Inc(YCount);
 
Result := XCount*YCount;
end else
Result := FPatterns.Count;
end;
11638,103 → 6295,26
function TPictureCollectionItem.GetWidth: Integer;
begin
Result := FPatternWidth;
if (Result <= 0) then
if (Result<=0) then
Result := FPicture.Width;
end;
 
procedure TPictureCollectionItem.Draw(Dest: TDirectDrawSurface; X, Y,
PatternIndex: Integer);
PatternIndex: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
{$IFDEF DrawHWAcc}
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.{$IFNDEF VER4UP}D2DRender2{$ELSE}D2DRender{$ENDIF}(Self, Bounds(X, Y, Width, Height), PatternIndex, rtDraw{$IFNDEF VER4UP}, $FF{$ENDIF});
end
else
{$ENDIF DrawHWAcc}
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.Draw(X, Y, FRect, FSurface, Transparent);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.Draw(X, Y, FRect, FSurface, Transparent);
end;
end;
 
procedure TPictureCollectionItem.DrawFlipHV(Dest: TDirectDrawSurface; X, Y,
PatternIndex: Integer);
var
flrc: trect;
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
begin
flrc.Left := frect.right; flrc.Right := frect.left;
flrc.Top := fpicture.height - frect.top;
flrc.Bottom := fpicture.height - frect.bottom;
Dest.Draw(X, Y, Flrc, FSurface, Transparent);
end;
end;
 
procedure TPictureCollectionItem.DrawFlipH(Dest: TDirectDrawSurface; X, Y,
PatternIndex: Integer);
var
flrc: TRect;
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
begin
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Dest) then
begin
flrc := frect;
Dest.MirrorFlip([rmfMirror]);
end
else
begin
flrc.Left := fpicture.width - frect.left;
flrc.Right := fpicture.width - frect.right;
flrc.Top := frect.Top; flrc.Bottom := frect.Bottom;
end;
Dest.Draw(X, Y, Flrc, FSurface, Transparent);
end;
end;
 
procedure TPictureCollectionItem.DrawFlipV(Dest: TDirectDrawSurface; X, Y,
PatternIndex: Integer);
var
flrc: TRect;
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
begin
if AsSigned(D2D) and D2D.CanUseD2D and (D2D.FDDraw.Surface = Dest) then
begin
flrc := frect;
Dest.MirrorFlip([rmfFlip]);
end
else
begin
flrc.Left := frect.left; flrc.Right := frect.right;
flrc.Top := fpicture.height - frect.top;
flrc.Bottom := fpicture.height - frect.bottom;
end;
Dest.Draw(X, Y, Flrc, FSurface, Transparent);
end;
end;
 
procedure TPictureCollectionItem.StretchDraw(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
{$IFDEF DrawHWAcc}
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.{$IFNDEF VER4UP}D2DRender2{$ELSE}D2DRender{$ENDIF}(Self, DestRect, PatternIndex, rtDraw{$IFNDEF VER4UP}, $FF{$ENDIF})
end
else
{$ENDIF DrawHWAcc}
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.StretchDraw(DestRect, FRect, FSurface, Transparent);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.StretchDraw(DestRect, FRect, FSurface, Transparent);
end;
end;
 
11741,48 → 6321,20
procedure TPictureCollectionItem.DrawAdd(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.{$IFNDEF VER4UP}D2DRender2{$ELSE}D2DRender{$ENDIF}(Self, DestRect, PatternIndex, rtAdd, Alpha)
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAdd(DestRect, FRect, FSurface, Transparent, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAdd(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawAddCol(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Color: Integer; Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderCol(Self, DestRect, PatternIndex, Color, rtAdd, Alpha)
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAdd(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawAlpha(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.{$IFNDEF VER4UP}D2DRender2{$ELSE}D2DRender{$ENDIF}(Self, DestRect, PatternIndex, rtBlend, Alpha)
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAlpha(DestRect, FRect, FSurface, Transparent, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAlpha(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
11789,101 → 6341,50
procedure TPictureCollectionItem.DrawSub(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.{$IFNDEF VER4UP}D2DRender2{$ELSE}D2DRender{$ENDIF}(Self, DestRect, PatternIndex, rtSub, Alpha)
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawSub(DestRect, FRect, FSurface, Transparent, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawSub(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawSubCol(Dest: TDirectDrawSurface; const DestRect: TRect; PatternIndex: Integer;
Color: Integer; Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderCol(Self, DestRect, PatternIndex, Color, rtSub, Alpha)
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawSub(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRotate(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single);
CenterX, CenterY: Double; Angle: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
//X,Y................ Center of rotation
//Width,Height....... Picture
//PatternIndex....... Piece of picture
//CenterX,CenterY ... Center of rotation on picture
//Angle.............. Angle of rotation
FDXDraw.FD2D.D2DRenderRotate(Self, X, Y, Width, Height, PatternIndex, rtDraw, CenterX, CenterY, Angle{$IFNDEF VER4UP}, $FF{$ENDIF});
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotate(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotate(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle);
end;
end;
 
procedure TPictureCollectionItem.DrawRotateAdd(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single; Alpha: Integer);
CenterX, CenterY: Double; Angle, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderRotate(Self, X, Y, Width, Height, PatternIndex, rtAdd, CenterX, CenterY, Angle, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateAdd(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateAdd(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRotateAlpha(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single; Alpha: Integer);
CenterX, CenterY: Double; Angle, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderRotate(Self, X, Y, Width, Height, PatternIndex, rtBlend, CenterX, CenterY, Angle, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateAlpha(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateAlpha(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRotateSub(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
CenterX, CenterY: Double; Angle: single; Alpha: Integer);
CenterX, CenterY: Double; Angle, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderRotate(Self, X, Y, Width, Height, PatternIndex, rtSub, CenterX, CenterY, Angle, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateSub(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateSub(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
end;
end;
 
11890,17 → 6391,10
procedure TPictureCollectionItem.DrawWaveX(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveX(Self, X, Y, Width, Height, PatternIndex, rtDraw,
Transparent, amp, Len, ph{$IFNDEF VER4UP}, $FF{$ENDIF});
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveX(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveX(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph);
end;
end;
 
11907,17 → 6401,10
procedure TPictureCollectionItem.DrawWaveXAdd(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveX(Self, X, Y, Width, Height, PatternIndex, rtAdd,
Transparent, amp, Len, ph, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveXAdd(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveXAdd(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph, Alpha);
end;
end;
 
11924,17 → 6411,10
procedure TPictureCollectionItem.DrawWaveXAlpha(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveX(Self, X, Y, Width, Height, PatternIndex, rtBlend,
Transparent, amp, Len, ph, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveXAlpha(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveXAlpha(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph, Alpha);
end;
end;
 
11941,77 → 6421,13
procedure TPictureCollectionItem.DrawWaveXSub(Dest: TDirectDrawSurface; X, Y, Width, Height, PatternIndex: Integer;
amp, Len, ph, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
if FInitialized and (PatternIndex>=0) and (PatternIndex<FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveX(Self, X, Y, Width, Height, PatternIndex, rtSub,
Transparent, amp, Len, ph, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveXSub(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph, Alpha);
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawWaveXSub(X, Y, Width, Height, FRect, FSurface, Transparent, amp, Len, ph, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawWaveYSub(Dest: TDirectDrawSurface; X, Y,
Width, Height, PatternIndex, amp, Len, ph, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveY(Self, X, Y, Width, Height, PatternIndex, rtSub,
Transparent, amp, Len, ph, Alpha);
end
{there is not software version}
end;
end;
 
procedure TPictureCollectionItem.DrawWaveY(Dest: TDirectDrawSurface; X, Y,
Width, Height, PatternIndex, amp, Len, ph: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveY(Self, X, Y, Width, Height, PatternIndex, rtDraw,
Transparent, amp, Len, ph{$IFNDEF VER4UP}, $FF{$ENDIF});
end
end;
end;
 
procedure TPictureCollectionItem.DrawWaveYAdd(Dest: TDirectDrawSurface; X, Y,
Width, Height, PatternIndex, amp, Len, ph, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveY(Self, X, Y, Width, Height, PatternIndex, rtAdd,
Transparent, amp, Len, ph, Alpha);
end
end;
end;
 
procedure TPictureCollectionItem.DrawWaveYAlpha(Dest: TDirectDrawSurface; X, Y,
Width, Height, PatternIndex, amp, Len, ph, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderWaveY(Self, X, Y, Width, Height, PatternIndex, rtBlend,
Transparent, amp, Len, ph, Alpha);
end
end;
end;
 
procedure TPictureCollectionItem.Finalize;
begin
if FInitialized then
12021,98 → 6437,10
end;
end;
 
procedure TPictureCollectionItem.UpdateTag;
 
function AddSurface(const SrcRect: TRect): TDirectDrawSurface;
begin
Result := TDirectDrawSurface.Create(PictureCollection.DXDraw.DDraw);
FSurfaceList.Add(Result);
 
Result.SystemMemory := FSystemMemory;
Result.LoadFromGraphicRect(FPicture.Graphic, 0, 0, SrcRect);
Result.TransparentColor := Result.ColorMatch(FTransparentColor);
end;
 
var
x, y, x2, y2: Integer;
BlockWidth, BlockHeight, BlockXCount, BlockYCount: Integer;
Width2, Height2: Integer;
TempSurface : TDirectDrawSurface;
begin
if FPicture.Graphic = nil then Exit;
// ClearSurface;
Width2 := Width + SkipWidth;
Height2 := Height + SkipHeight;
 
if (Width = FPicture.Width) and (Height = FPicture.Height) then
begin
with TPictureCollectionItemPattern.Create(FPatterns) do
begin
TempSurface := TDirectDrawSurface.Create(PictureCollection.DXDraw.DDraw);
FSurface := TempSurface;
FRect := Bounds(0, 0, FPicture.Width, FPicture.Height);
TempSurface.LoadFromGraphicRect(FPicture.Graphic, 0, 0, FRect);
TempSurface.SystemMemory := FSystemMemory;
TempSurface.TransparentColor := TempSurface.ColorMatch(FTransparentColor);
FSurfaceList.Add(TempSurface);
end;
end
else
if FSystemMemory then
begin
AddSurface(Bounds(0, 0, FPicture.Width, FPicture.Height));
for y := 0 to (FPicture.Height + SkipHeight) div Height2 - 1 do
for x := 0 to (FPicture.Width + SkipWidth) div Width2 - 1 do
with TPictureCollectionItemPattern.Create(FPatterns) do
begin
FRect := Bounds(x * Width2, y * Height2, Width, Height);
FSurface := TDirectDrawSurface(FSurfaceList[0]);
end;
end
else
begin
{ Load to a video memory with dividing the image. }
BlockWidth := Min(((SurfaceDivWidth + Width2 - 1) div Width2) * Width2,
(FPicture.Width + SkipWidth) div Width2 * Width2);
BlockHeight := Min(((SurfaceDivHeight + Height2 - 1) div Height2) * Height2,
(FPicture.Height + SkipHeight) div Height2 * Height2);
 
if (BlockWidth = 0) or (BlockHeight = 0) then Exit;
 
BlockXCount := (FPicture.Width + BlockWidth - 1) div BlockWidth;
BlockYCount := (FPicture.Height + BlockHeight - 1) div BlockHeight;
 
for y := 0 to BlockYCount - 1 do
for x := 0 to BlockXCount - 1 do
begin
x2 := Min(BlockWidth, Max(FPicture.Width - x * BlockWidth, 0));
if x2 = 0 then x2 := BlockWidth;
 
y2 := Min(BlockHeight, Max(FPicture.Height - y * BlockHeight, 0));
if y2 = 0 then y2 := BlockHeight;
 
AddSurface(Bounds(x * BlockWidth, y * BlockHeight, x2, y2));
end;
 
for y := 0 to (FPicture.Height + SkipHeight) div Height2 - 1 do
for x := 0 to (FPicture.Width + SkipWidth) div Width2 - 1 do
begin
x2 := x * Width2;
y2 := y * Height2;
with TPictureCollectionItemPattern.Create(FPatterns) do
begin
FRect := Bounds(x2 - (x2 div BlockWidth * BlockWidth), y2 - (y2 div BlockHeight * BlockHeight), Width, Height);
FSurface := TDirectDrawSurface(FSurfaceList[(x2 div BlockWidth) + ((y2 div BlockHeight) * BlockXCount)]);
end;
end;
end;
end;
 
procedure TPictureCollectionItem.Initialize;
begin
Finalize;
FInitialized := PictureCollection.Initialized;
UpdateTag;
end;
 
procedure TPictureCollectionItem.Restore;
12132,7 → 6460,7
BlockWidth, BlockHeight, BlockXCount, BlockYCount: Integer;
Width2, Height2: Integer;
begin
if FPicture.Graphic = nil then Exit;
if FPicture.Graphic=nil then Exit;
 
if not FInitialized then
begin
12143,10 → 6471,10
 
ClearSurface;
 
Width2 := Width + SkipWidth;
Height2 := Height + SkipHeight;
Width2 := Width+SkipWidth;
Height2 := Height+SkipHeight;
 
if (Width = FPicture.Width) and (Height = FPicture.Height) then
if (Width=FPicture.Width) and (Height=FPicture.Height) then
begin
{ There is no necessity of division because the number of patterns is one. }
with TPictureCollectionItemPattern.Create(FPatterns) do
12154,65 → 6482,55
FRect := Bounds(0, 0, FPicture.Width, FPicture.Height);
FSurface := AddSurface(Bounds(0, 0, FPicture.Width, FPicture.Height));
end;
end
else
if FSystemMemory then
end else if FSystemMemory then
begin
{ Load to a system memory. }
AddSurface(Bounds(0, 0, FPicture.Width, FPicture.Height));
 
for y := 0 to (FPicture.Height + SkipHeight) div Height2 - 1 do
for x := 0 to (FPicture.Width + SkipWidth) div Width2 - 1 do
for y:=0 to (FPicture.Height+SkipHeight) div Height2-1 do
for x:=0 to (FPicture.Width+SkipWidth) div Width2-1 do
with TPictureCollectionItemPattern.Create(FPatterns) do
begin
FRect := Bounds(x * Width2, y * Height2, Width, Height);
FSurface := TDirectDrawSurface(FSurfaceList[0]);
end;
end
else
end else
begin
{ Load to a video memory with dividing the image. }
BlockWidth := Min(((SurfaceDivWidth + Width2 - 1) div Width2) * Width2,
(FPicture.Width + SkipWidth) div Width2 * Width2);
BlockHeight := Min(((SurfaceDivHeight + Height2 - 1) div Height2) * Height2,
(FPicture.Height + SkipHeight) div Height2 * Height2);
BlockWidth := Min(((SurfaceDivWidth+Width2-1) div Width2)*Width2,
(FPicture.Width+SkipWidth) div Width2*Width2);
BlockHeight := Min(((SurfaceDivHeight+Height2-1) div Height2)*Height2,
(FPicture.Height+SkipHeight) div Height2*Height2);
 
if (BlockWidth = 0) or (BlockHeight = 0) then Exit;
if (BlockWidth=0) or (BlockHeight=0) then Exit;
 
BlockXCount := (FPicture.Width + BlockWidth - 1) div BlockWidth;
BlockYCount := (FPicture.Height + BlockHeight - 1) div BlockHeight;
BlockXCount := (FPicture.Width+BlockWidth-1) div BlockWidth;
BlockYCount := (FPicture.Height+BlockHeight-1) div BlockHeight;
 
for y := 0 to BlockYCount - 1 do
for x := 0 to BlockXCount - 1 do
for y:=0 to BlockYCount-1 do
for x:=0 to BlockXCount-1 do
begin
x2 := Min(BlockWidth, Max(FPicture.Width - x * BlockWidth, 0));
if x2 = 0 then x2 := BlockWidth;
 
y2 := Min(BlockHeight, Max(FPicture.Height - y * BlockHeight, 0));
if y2 = 0 then y2 := BlockHeight;
 
AddSurface(Bounds(x * BlockWidth, y * BlockHeight, x2, y2));
x2 := Min(BlockWidth, Max(FPicture.Width-x*BlockWidth, 0));
if x2=0 then x2 := BlockWidth;
y2 := Min(BlockHeight, Max(FPicture.Height-y*BlockHeight, 0));
if y2=0 then y2 := BlockHeight;
AddSurface(Bounds(x*BlockWidth, y*BlockHeight, x2, y2));
end;
 
for y := 0 to (FPicture.Height + SkipHeight) div Height2 - 1 do
for x := 0 to (FPicture.Width + SkipWidth) div Width2 - 1 do
for y:=0 to (FPicture.Height+SkipHeight) div Height2-1 do
for x:=0 to (FPicture.Width+SkipWidth) div Width2-1 do
begin
x2 := x * Width2;
y2 := y * Height2;
with TPictureCollectionItemPattern.Create(FPatterns) do
begin
FRect := Bounds(x2 - (x2 div BlockWidth * BlockWidth), y2 - (y2 div BlockHeight * BlockHeight), Width, Height);
FSurface := TDirectDrawSurface(FSurfaceList[(x2 div BlockWidth) + ((y2 div BlockHeight) * BlockXCount)]);
FRect := Bounds(x2-(x2 div BlockWidth*BlockWidth), y2-(y2 div BlockHeight*BlockHeight), Width, Height);
FSurface := TDirectDrawSurface(FSurfaceList[(x2 div BlockWidth)+((y2 div BlockHeight)*BlockXCount)]);
end;
end;
end;
{Code added for better compatibility}
{When is any picture changed, then all textures cleared and list have to reloaded}
with PictureCollection do
{$IFDEF D3D_deprecated}if (do3D in FDXDraw.Options) then{$ENDIF}
if AsSigned(FDXDraw.FD2D) then
if Assigned(FDXDraw.FD2D.D2DTextures) then
FDXDraw.FD2D.D2DTextures.D2DPruneAllTextures;
end;
 
procedure TPictureCollectionItem.SetPicture(Value: TPicture);
12225,10 → 6543,10
i: Integer;
Surface: TDirectDrawSurface;
begin
if Value <> FTransparentColor then
if Value<>FTransparentColor then
begin
FTransparentColor := Value;
for i := 0 to FSurfaceList.Count - 1 do
for i:=0 to FSurfaceList.Count-1 do
begin
try
Surface := TDirectDrawSurface(FSurfaceList[i]);
12239,121 → 6557,6
end;
end;
 
procedure TPictureCollectionItem.DrawAlphaCol(Dest: TDirectDrawSurface;
const DestRect: TRect; PatternIndex, Color, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderCol(Self, DestRect, PatternIndex, color, rtBlend, Alpha)
end else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAlpha(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRotateAddCol(Dest: TDirectDrawSurface;
X, Y, Width, Height, PatternIndex: Integer; CenterX, CenterY: Double;
Angle: single; Color, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderRotateModeCol(Self, rtAdd, X, Y, Width,
Height, PatternIndex, CenterX, CenterY, Angle, Color, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateAdd(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRotateAlphaCol(Dest: TDirectDrawSurface;
X, Y, Width, Height, PatternIndex: Integer; CenterX, CenterY: Double;
Angle: single; Color, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderRotateModeCol(Self, rtBlend, X, Y, Width,
Height, PatternIndex, CenterX, CenterY, Angle, Color, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateAlpha(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRotateSubCol(Dest: TDirectDrawSurface;
X, Y, Width, Height, PatternIndex: Integer; CenterX, CenterY: Double;
Angle: single; Color, Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderRotateModeCol(Self, rtSub, X, Y, Width,
Height, PatternIndex, CenterX, CenterY, Angle, Color, Alpha);
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawRotateSub(X, Y, Width, Height, FRect, FSurface, CenterX, CenterY, Transparent, Angle, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawCol(Dest: TDirectDrawSurface;
const DestRect, SourceRect: TRect; PatternIndex: Integer; Faded: Boolean;
RenderType: TRenderType; Color, Specular: Integer; Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRenderColoredPartition(Self, DestRect, PatternIndex,
Color, Specular, Faded, SourceRect, RenderType,
Alpha)
end
else
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
Dest.DrawAlpha(DestRect, FRect, FSurface, Transparent, Alpha);
end;
end;
 
procedure TPictureCollectionItem.DrawRect(Dest: TDirectDrawSurface;
const DestRect, SourceRect: TRect; PatternIndex: Integer;
RenderType: TRenderType; Transparent: Boolean; Alpha: Integer);
begin
if FInitialized and (PatternIndex >= 0) and (PatternIndex < FPatterns.Count) then
begin
{$IFDEF DrawHWAcc}
with TPictureCollection(Self.GetPictureCollection) do
if FDXDraw.CheckD3D(Dest) then
begin
FDXDraw.FD2D.D2DRender(Self, DestRect, PatternIndex, SourceRect, RenderType, Alpha);
end
else
{$ENDIF DrawHWAcc}
with TPictureCollectionItemPattern(FPatterns.Items[PatternIndex]) do
begin
case RenderType of
rtDraw: Dest.StretchDraw(DestRect, SourceRect, FSurface, Transparent);
//Dest.Draw(DestRect.Left, DestRect.Top, SourceRect, FSurface, Transparent);
rtBlend: Dest.DrawAlpha(DestRect, SourceRect, FSurface, Transparent, Alpha);
rtAdd: Dest.DrawAdd(DestRect, SourceRect, FSurface, Transparent, Alpha);
rtSub: Dest.DrawSub(DestRect, SourceRect, FSurface, Transparent, Alpha);
end;
end;
end;
end;
 
{ TPictureCollection }
 
constructor TPictureCollection.Create(AOwner: TPersistent);
12383,7 → 6586,7
i: Integer;
begin
i := IndexOf(Name);
if i = -1 then
if i=-1 then
raise EPictureCollectionError.CreateFmt(SImageNotFound, [Name]);
Result := Items[i];
end;
12393,7 → 6596,7
i: Integer;
begin
try
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Finalize;
finally
FDXDraw := nil;
12400,22 → 6603,6
end;
end;
 
procedure TPictureCollection.InitializeImages(DXDraw: TCustomDXDraw; Id : Integer);
var
i: Integer;
begin
If id = -1 Then
Finalize;
FDXDraw := DXDraw;
 
if not Initialized then
raise EPictureCollectionError.CreateFmt(SCannotInitialized, [ClassName]);
 
for i := 0 to Count - 1 do
If (id = -1) or (id = i) Then
Items[i].Initialize;
end;
 
procedure TPictureCollection.Initialize(DXDraw: TCustomDXDraw);
var
i: Integer;
12426,13 → 6613,13
if not Initialized then
raise EPictureCollectionError.CreateFmt(SCannotInitialized, [ClassName]);
 
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Initialize;
end;
 
function TPictureCollection.Initialized: Boolean;
begin
Result := (FDXDraw <> nil) and (FDXDraw.Initialized);
Result := (FDXDraw<>nil) and (FDXDraw.Initialized);
end;
 
procedure TPictureCollection.Restore;
12439,7 → 6626,7
var
i: Integer;
begin
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Restore;
end;
 
12459,11 → 6646,11
var
i: Integer;
begin
for i := 0 to 255 do
for i:=0 to 255 do
if UseColorTable[i] then
if DWORD(ColorTable[i]) = DWORD(Col) then
if DWORD(ColorTable[i])=DWORD(Col) then
Exit;
for i := 0 to 255 do
for i:=0 to 255 do
if not UseColorTable[i] then
begin
SetColor(i, Col);
12475,9 → 6662,9
var
i: Integer;
begin
if DIB.BitCount > 8 then Exit;
if DIB.BitCount>8 then Exit;
 
for i := 0 to 255 do
for i:=0 to 255 do
AddColor(DIB.ColorTable[i]);
end;
 
12486,10 → 6673,10
i, n: Integer;
PaletteEntries: TPaletteEntries;
begin
if Graphic.Palette <> 0 then
if Graphic.Palette<>0 then
begin
n := GetPaletteEntries(Graphic.Palette, 0, 256, PaletteEntries);
for i := 0 to n - 1 do
for i:=0 to n-1 do
AddColor(PaletteEntryToRGBQuad(PaletteEntries[i]));
end;
end;
12521,14 → 6708,14
SetColor(254, RGBQuad(0, 255, 255));
SetColor(255, RGBQuad(255, 255, 255));
 
for i := 0 to Count - 1 do
if Items[i].Picture.Graphic <> nil then
for i:=0 to Count-1 do
if Items[i].Picture.Graphic<>nil then
begin
if Items[i].Picture.Graphic is TDIB then
AddDIB(TDIB(Items[i].Picture.Graphic))
else
AddGraphic(Items[i].Picture.Graphic);
if PaletteCount = 256 then Break;
if PaletteCount=256 then Break;
end;
end;
 
12632,7 → 6819,7
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (DXDraw = AComponent) then
if (Operation=opRemove) and (DXDraw=AComponent) then
DXDraw := nil;
end;
 
12642,19 → 6829,19
case NotifyType of
dxntDestroying: DXDraw := nil;
dxntInitialize: FItems.Initialize(Sender);
dxntFinalize: FItems.Finalize;
dxntRestore: FItems.Restore;
dxntFinalize : FItems.Finalize;
dxntRestore : FItems.Restore;
end;
end;
 
procedure TCustomDXImageList.SetDXDraw(Value: TCustomDXDraw);
begin
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.UnRegisterNotifyEvent(DXDrawNotifyEvent);
 
FDXDraw := Value;
 
if FDXDraw <> nil then
if FDXDraw<>nil then
FDXDraw.RegisterNotifyEvent(DXDrawNotifyEvent);
end;
 
12674,29 → 6861,18
end;
 
constructor TDirectDrawOverlay.CreateWindowed(WindowHandle: HWND);
{$IFDEF D3D_deprecated}
const
PrimaryDesc: TDDSurfaceDesc = (
dwSize: SizeOf(PrimaryDesc);
dwFlags: DDSD_CAPS;
ddsCaps: (dwCaps: DDSCAPS_PRIMARYSURFACE)
);
{$ELSE}
var
PrimaryDesc: TDDSurfaceDesc2;
{$ENDIF}
dwSize: SizeOf(PrimaryDesc);
dwFlags: DDSD_CAPS;
ddsCaps: (dwCaps: DDSCAPS_PRIMARYSURFACE)
);
begin
FDDraw2 := TDirectDraw.CreateEx(nil, False);
if FDDraw2.{$IFDEF D3D_deprecated}IDraw{$ELSE}IDraw7{$ENDIF}.SetCooperativeLevel(WindowHandle, DDSCL_NORMAL) <> DD_OK then
if FDDraw2.IDraw.SetCooperativeLevel(WindowHandle, DDSCL_NORMAL)<>DD_OK then
raise EDirectDrawOverlayError.CreateFmt(SCannotInitialized, [SOverlay]);
 
FTargetSurface2 := TDirectDrawSurface.Create(FDDraw2);
{$IFNDEF D3D_deprecated}
FillChar(PrimaryDesc, SizeOf(PrimaryDesc), 0);
PrimaryDesc.dwSize := SizeOf(PrimaryDesc);
PrimaryDesc.dwFlags := DDSD_CAPS;
PrimaryDesc.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE;
{$ENDIF}
if not FTargetSurface2.CreateSurface(PrimaryDesc) then
raise EDirectDrawOverlayError.CreateFmt(SCannotInitialized, [SOverlay]);
 
12717,17 → 6893,11
FSurface.Free; FSurface := nil;
end;
 
procedure TDirectDrawOverlay.Initialize(const SurfaceDesc: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF});
{$IFDEF D3D_deprecated}
procedure TDirectDrawOverlay.Initialize(const SurfaceDesc: TDDSurfaceDesc);
const
BackBufferCaps: TDDSCaps = (dwCaps: DDSCAPS_BACKBUFFER);
var
DDSurface: IDirectDrawSurface;
{$ELSE}
var
DDSurface: IDirectDrawSurface7;
BackBufferCaps: TDDSCaps2;
{$ENDIF}
begin
Finalize;
try
12736,21 → 6906,18
raise EDirectDrawOverlayError.CreateFmt(SCannotInitialized, [SOverlay]);
 
FBackSurface := TDirectDrawSurface.Create(FDDraw);
{$IFNDEF D3D_deprecated}
BackBufferCaps.dwCaps := DDSCAPS_BACKBUFFER;
{$ENDIF}
if SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_FLIP <> 0 then
if SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_FLIP<>0 then
begin
if FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetAttachedSurface(BackBufferCaps, DDSurface) = DD_OK then
FBackSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := DDSurface;
end
else
FBackSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} := FSurface.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF};
if FSurface.ISurface.GetAttachedSurface(BackBufferCaps, DDSurface)=DD_OK then
FBackSurface.IDDSurface := DDSurface;
end else
FBackSurface.IDDSurface := FSurface.IDDSurface;
 
if FVisible then
SetOverlayRect(FOverlayRect)
else
FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.UpdateOverlay(PRect(nil), FTargetSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, PRect(nil), DDOVER_HIDE, PDDOverlayFX(nil));
FSurface.ISurface.UpdateOverlay(PRect(nil)^, FTargetSurface.ISurface, PRect(nil)^, DDOVER_HIDE, PDDOverlayFX(nil)^);
except
Finalize;
raise;
12759,16 → 6926,16
 
procedure TDirectDrawOverlay.Flip;
begin
if FSurface = nil then Exit;
if FSurface=nil then Exit;
 
if FSurface.SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_FLIP <> 0 then
FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.Flip(nil, DDFLIP_WAIT);
if FSurface.SurfaceDesc.ddsCaps.dwCaps and DDSCAPS_FLIP<>0 then
FSurface.ISurface.Flip(nil, DDFLIP_WAIT);
end;
 
procedure TDirectDrawOverlay.SetOverlayColorKey(Value: TColor);
begin
FOverlayColorKey := Value;
if FSurface <> nil then
if FSurface<>nil then
SetOverlayRect(FOverlayRect);
end;
 
12780,7 → 6947,7
OverlayFlags: DWORD;
begin
FOverlayRect := Value;
if (FSurface <> nil) and FVisible then
if (FSurface<>nil) and FVisible then
begin
DestRect := FOverlayRect;
SrcRect.Left := 0;
12797,34 → 6964,26
XScaleRatio := (DestRect.right - DestRect.left) * 1000 div (SrcRect.right - SrcRect.left);
YScaleRatio := (DestRect.bottom - DestRect.top) * 1000 div (SrcRect.bottom - SrcRect.top);
 
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH <> 0)
and (FDDraw.DriverCaps.dwMinOverlayStretch <> 0)
and (XScaleRatio < Integer(FDDraw.DriverCaps.dwMinOverlayStretch))
then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH<>0) and
(FDDraw.DriverCaps.dwMinOverlayStretch<>0) and (XScaleRatio<Integer(FDDraw.DriverCaps.dwMinOverlayStretch)) then
begin
DestRect.Right := DestRect.Left + (Integer(FSurface.SurfaceDesc.dwWidth) * (Integer(FDDraw.DriverCaps.dwMinOverlayStretch) + 1)) div 1000;
end;
 
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH <> 0)
and (FDDraw.DriverCaps.dwMaxOverlayStretch <> 0)
and (XScaleRatio > Integer(FDDraw.DriverCaps.dwMaxOverlayStretch))
then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH<>0) and
(FDDraw.DriverCaps.dwMaxOverlayStretch<>0) and (XScaleRatio>Integer(FDDraw.DriverCaps.dwMaxOverlayStretch)) then
begin
DestRect.Right := DestRect.Left + (Integer(FSurface.SurfaceDesc.dwWidth) * (Integer(FDDraw.DriverCaps.dwMaxOverlayStretch) + 999)) div 1000;
end;
 
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH <> 0)
and (FDDraw.DriverCaps.dwMinOverlayStretch <> 0)
and (YScaleRatio < Integer(FDDraw.DriverCaps.dwMinOverlayStretch))
then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH<>0) and
(FDDraw.DriverCaps.dwMinOverlayStretch<>0) and (YScaleRatio<Integer(FDDraw.DriverCaps.dwMinOverlayStretch)) then
begin
DestRect.Bottom := DestRect.Top + (Integer(FSurface.SurfaceDesc.dwHeight) * (Integer(FDDraw.DriverCaps.dwMinOverlayStretch) + 1)) div 1000;
end;
 
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH <> 0)
and (FDDraw.DriverCaps.dwMaxOverlayStretch <> 0)
and (YScaleRatio > Integer(FDDraw.DriverCaps.dwMaxOverlayStretch))
then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_OVERLAYSTRETCH<>0) and
(FDDraw.DriverCaps.dwMaxOverlayStretch<>0) and (YScaleRatio>Integer(FDDraw.DriverCaps.dwMaxOverlayStretch)) then
begin
DestRect.Bottom := DestRect.Top + (Integer(FSurface.SurfaceDesc.dwHeight) * (Integer(FDDraw.DriverCaps.dwMaxOverlayStretch) + 999)) div 1000;
end;
12858,33 → 7017,33
end;
 
{ Forwarding former arrangement }
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNBOUNDARYSRC <> 0) and (FDDraw.DriverCaps.dwAlignBoundarySrc <> 0) then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNBOUNDARYSRC<>0) and (FDDraw.DriverCaps.dwAlignBoundarySrc<>0) then
begin
SrcRect.Left := (SrcRect.Left + Integer(FDDraw.DriverCaps.dwAlignBoundarySrc) div 2) div
Integer(FDDraw.DriverCaps.dwAlignBoundarySrc) * Integer(FDDraw.DriverCaps.dwAlignBoundarySrc);
Integer(FDDraw.DriverCaps.dwAlignBoundarySrc)*Integer(FDDraw.DriverCaps.dwAlignBoundarySrc);
end;
 
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNSIZESRC <> 0) and (FDDraw.DriverCaps.dwAlignSizeSrc <> 0) then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNSIZESRC<>0) and (FDDraw.DriverCaps.dwAlignSizeSrc<>0) then
begin
SrcRect.Right := SrcRect.Left + (SrcRect.Right - SrcRect.Left + Integer(FDDraw.DriverCaps.dwAlignSizeSrc) div 2) div
Integer(FDDraw.DriverCaps.dwAlignSizeSrc) * Integer(FDDraw.DriverCaps.dwAlignSizeSrc);
Integer(FDDraw.DriverCaps.dwAlignSizeSrc)*Integer(FDDraw.DriverCaps.dwAlignSizeSrc);
end;
 
{ Forwarding destination arrangement }
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNBOUNDARYDEST <> 0) and (FDDraw.DriverCaps.dwAlignBoundaryDest <> 0) then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNBOUNDARYDEST<>0) and (FDDraw.DriverCaps.dwAlignBoundaryDest<>0) then
begin
DestRect.Left := (DestRect.Left + Integer(FDDraw.DriverCaps.dwAlignBoundaryDest) div 2) div
Integer(FDDraw.DriverCaps.dwAlignBoundaryDest) * Integer(FDDraw.DriverCaps.dwAlignBoundaryDest);
Integer(FDDraw.DriverCaps.dwAlignBoundaryDest)*Integer(FDDraw.DriverCaps.dwAlignBoundaryDest);
end;
 
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNSIZEDEST <> 0) and (FDDraw.DriverCaps.dwAlignSizeDest <> 0) then
if (FDDraw.DriverCaps.dwCaps and DDCAPS_ALIGNSIZEDEST<>0) and (FDDraw.DriverCaps.dwAlignSizeDest<>0) then
begin
DestRect.Right := DestRect.Left + (DestRect.Right - DestRect.Left) div
Integer(FDDraw.DriverCaps.dwAlignSizeDest) * Integer(FDDraw.DriverCaps.dwAlignSizeDest);
Integer(FDDraw.DriverCaps.dwAlignSizeDest)*Integer(FDDraw.DriverCaps.dwAlignSizeDest);
end;
 
{ Color key setting }
if FDDraw.DriverCaps.dwCKeyCaps and DDCKEYCAPS_DESTOVERLAY <> 0 then
if FDDraw.DriverCaps.dwCKeyCaps and DDCKEYCAPS_DESTOVERLAY<>0 then
begin
OverlayFX.dckDestColorkey.dwColorSpaceLowValue := FTargetSurface.ColorMatch(FOverlayColorKey);
OverlayFX.dckDestColorkey.dwColorSpaceHighValue := OverlayFX.dckDestColorkey.dwColorSpaceLowValue;
12892,7 → 7051,7
OverlayFlags := OverlayFlags or (DDOVER_KEYDESTOVERRIDE or DDOVER_DDFX);
end;
 
FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.UpdateOverlay(@SrcRect, FTargetSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, @DestRect, OverlayFlags, @OverlayFX);
FSurface.ISurface.UpdateOverlay(SrcRect, FTargetSurface.ISurface, DestRect, OverlayFlags, OverlayFX);
end;
end;
 
12899,3619 → 7058,18
procedure TDirectDrawOverlay.SetVisible(Value: Boolean);
begin
FVisible := False;
if FSurface <> nil then
if FSurface<>nil then
begin
if FVisible then
SetOverlayRect(FOverlayRect)
else
FSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.UpdateOverlay(PRect(nil), FTargetSurface.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}, PRect(nil), DDOVER_HIDE, PDDOverlayFX(nil));
FSurface.ISurface.UpdateOverlay(PRect(nil)^, FTargetSurface.ISurface, PRect(nil)^, DDOVER_HIDE, PDDOverlayFX(nil)^);
end;
end;
 
{ TDXFont }
 
constructor TDXFont.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
end;
 
destructor TDXFont.Destroy;
begin
inherited Destroy;
end;
 
procedure TDXFont.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FDXImageList) then
begin
FDXImageList := nil;
end;
end; {Notification}
 
procedure TDXFont.SetFont(const Value: string);
begin
FFont := Value;
if assigned(FDXImageList) then
begin
FFontIndex := FDXImageList.items.IndexOf(FFont); { find font once }
fOffset := FDXImageList.Items[FFontIndex].PatternWidth;
end;
end;
 
procedure TDXFont.SetFontIndex(const Value: Integer);
begin
FFontIndex := Value;
if assigned(FDXImageList) then
begin
FFont := FDXImageList.Items[FFontIndex].Name;
fOffset := FDXImageList.Items[FFontIndex].PatternWidth;
end;
end;
 
procedure TDXFont.TextOut(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string);
var
loop, letter: Integer;
UpperText: string;
begin
if not assigned(FDXImageList) then
exit;
Offset := FDXImageList.Items[FFontIndex].PatternWidth;
UpperText := AnsiUppercase(text);
for loop := 1 to Length(UpperText) do
begin
letter := AnsiPos(UpperText[loop], Alphabet) - 1;
if letter < 0 then letter := 30;
FDXImageList.items[FFontIndex].Draw(DirectDrawSurface, x + Offset * loop, y, letter);
end; { loop }
end;
 
{ TDXPowerFontEffectsParameters }
 
procedure TDXPowerFontEffectsParameters.SetAlphaValue(
const Value: Integer);
begin
FAlphaValue := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetAngle(const Value: Integer);
begin
FAngle := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetCenterX(const Value: Integer);
begin
FCenterX := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetCenterY(const Value: Integer);
begin
FCenterY := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetHeight(const Value: Integer);
begin
FHeight := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetWAmplitude(
const Value: Integer);
begin
FWAmplitude := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetWidth(const Value: Integer);
begin
FWidth := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetWLenght(const Value: Integer);
begin
FWLenght := Value;
end;
 
procedure TDXPowerFontEffectsParameters.SetWPhase(const Value: Integer);
begin
FWPhase := Value;
end;
 
{ TDXPowerFont }
 
constructor TDXPowerFont.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FUseEnterChar := True;
FEnterCharacter := '|<';
FAlphabets := PowerAlphaBet;
FTextOutType := ttNormal;
FTextOutEffect := teNormal;
FEffectsParameters := TDXPowerFontEffectsParameters.Create;
end;
 
destructor TDXPowerFont.Destroy;
begin
inherited Destroy;
end;
 
procedure TDXPowerFont.SetAlphabets(const Value: string);
begin
if FDXImageList <> nil then
if Length(Value) > FDXImageList.Items[FFontIndex].PatternCount - 1 then Exit;
FAlphabets := Value;
end;
 
procedure TDXPowerFont.SetEnterCharacter(const Value: string);
begin
if Length(Value) >= 2 then Exit;
FEnterCharacter := Value;
end;
 
procedure TDXPowerFont.SetFont(const Value: string);
begin
FFont := Value;
if FDXImageList <> nil then
begin
FFontIndex := FDXImageList.Items.IndexOf(FFont); // Find font once...
Offset := FDXImageList.Items[FFontIndex].PatternWidth;
 
FEffectsParameters.Width := FDXImageList.Items[FFontIndex].PatternWidth;
FEffectsParameters.Height := FDXImageList.Items[FFontIndex].PatternHeight;
end;
end;
 
procedure TDXPowerFont.SetFontIndex(const Value: Integer);
begin
FFontIndex := Value;
if FDXImageList <> nil then
begin
FFont := FDXImageList.Items[FFontIndex].Name;
Offset := FDXImageList.Items[FFontIndex].PatternWidth;
 
FEffectsParameters.Width := FDXImageList.Items[FFontIndex].PatternWidth;
FEffectsParameters.Height := FDXImageList.Items[FFontIndex].PatternHeight;
end;
end;
 
procedure TDXPowerFont.SetEffectsParameters(const Value: TDXPowerFontEffectsParameters);
begin
FEffectsParameters := Value;
end;
 
procedure TDXPowerFont.SetTextOutEffect(const Value: TDXPowerFontTextOutEffect);
begin
FTextOutEffect := Value;
end;
 
procedure TDXPowerFont.SetTextOutType(const Value: TDXPowerFontTextOutType);
begin
FTextOutType := Value;
end;
 
procedure TDXPowerFont.SetUseEnterChar(const Value: Boolean);
begin
FUseEnterChar := Value;
end;
 
function TDXPowerFont.TextOutFast(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string): Boolean;
var
Loop, Letter: Integer;
txt: string;
begin
Result := False;
if FDXImageList = nil then Exit;
// modified
case FTextOutType of
ttNormal: Txt := Text;
ttUpperCase: Txt := AnsiUpperCase(Text);
ttLowerCase: Txt := AnsiLowerCase(Text);
end;
Offset := FDXImageList.Items[FFontIndex].PatternWidth;
Loop := 1;
while (Loop <= Length(Text)) do
begin
Letter := AnsiPos(txt[Loop], FAlphabets); // modified
if (Letter > 0) and (Letter < FDXImageList.Items[FFontIndex].PatternCount - 1) then
FDXImageList.Items[FFontIndex].Draw(DirectDrawSurface, X + (Offset * Loop), Y, Letter - 1);
Inc(Loop);
end;
Result := True;
end;
 
function TDXPowerFont.TextOut(DirectDrawSurface: TDirectDrawSurface; X, Y: Integer; const Text: string): Boolean;
var
Loop, Letter: Integer;
FCalculatedEnters, EnterHeghit, XLoop: Integer;
DoTextOut: Boolean;
Txt: string;
Rect: TRect;
begin
Result := False;
if FDXImageList = nil then Exit;
Txt := Text;
DoTextOut := True;
if Assigned(FBeforeTextOut) then FBeforeTextOut(Self, Txt, DoTextOut);
if not DoTextOut then Exit;
// modified
case FTextOutType of
ttNormal: Txt := Text;
ttUpperCase: Txt := AnsiUpperCase(Text);
ttLowerCase: Txt := AnsiLowerCase(Text);
end;
Offset := FDXImageList.Items[FFontIndex].PatternWidth;
FCalculatedEnters := 0;
EnterHeghit := FDXImageList.Items[FFontIndex].PatternHeight;
XLoop := 0;
Loop := 1;
while (Loop <= Length(Txt)) do
begin
if FUseEnterChar then
begin
if Txt[Loop] = FEnterCharacter[1] then begin Inc(FCalculatedEnters); Inc(Loop); end;
if Txt[Loop] = FEnterCharacter[2] then begin Inc(FCalculatedEnters); XLoop := 0; {-FCalculatedEnters;} Inc(Loop); end;
end;
Letter := AnsiPos(Txt[Loop], FAlphabets); // modified
 
if (Letter > 0) and (Letter < FDXImageList.Items[FFontIndex].PatternCount - 1) then
case FTextOutEffect of
teNormal: FDXImageList.Items[FFontIndex].Draw(DirectDrawSurface, X + (Offset * XLoop), Y + (FCalculatedEnters * EnterHeghit), Letter - 1);
teRotat: FDXImageList.Items[FFontIndex].DrawRotate(DirectDrawSurface, X + (Offset * XLoop), Y + (FCalculatedEnters * EnterHeghit), FEffectsParameters.Width, FEffectsParameters.Height, Letter - 1, FEffectsParameters.CenterX, FEffectsParameters.CenterY, FEffectsParameters.Angle);
teAlphaBlend:
begin
Rect.Left := X + (Offset * XLoop);
Rect.Top := Y + (FCalculatedEnters * EnterHeghit);
Rect.Right := Rect.Left + FEffectsParameters.Width;
Rect.Bottom := Rect.Top + FEffectsParameters.Height;
 
FDXImageList.Items[FFontIndex].DrawAlpha(DirectDrawSurface, Rect, Letter - 1, FEffectsParameters.AlphaValue);
end;
teWaveX: FDXImageList.Items[FFontIndex].DrawWaveX(DirectDrawSurface, X + (Offset * XLoop), Y + (FCalculatedEnters * EnterHeghit), FEffectsParameters.Width, FEffectsParameters.Height, Letter - 1, FEffectsParameters.WAmplitude, FEffectsParameters.WLenght, FEffectsParameters.WPhase);
end;
Inc(Loop);
Inc(XLoop);
end;
if Assigned(FAfterTextOut) then FAfterTextOut(Self, Txt);
Result := True;
end;
 
//---------------------------------------------------------------------------
{
Main code supported hardware acceleration by videoadapteur
* Copyright (c) 2004-2010 Jaro Benes
* All Rights Reserved
* Version 1.09
* D2D Hardware module - main implementation part
* web site: www.micrel.cz/Dx
* e-mail: delphix_d2d@micrel.cz
}
 
constructor TD2DTextures.Create(DDraw: TCustomDXDraw);
begin
//inherited;
FDDraw := DDraw; //reload DDraw
{$IFNDEF VER4UP}
TexLen := 0;
Texture := nil;
{$ELSE}
SetLength(Texture, 0);
{$ENDIF}
end;
 
destructor TD2DTextures.Destroy;
var
I: Integer;
begin
if Assigned(Texture) then
{$IFDEF VER4UP}
for I := Low(Texture) to High(Texture) do
begin
Texture[I].D2DTexture.Free;
{$IFDEF VIDEOTEX}
if Assigned(Texture[I].VDIB) then
Texture[I].VDIB.Free;
{$ENDIF}
end;
{$ELSE}
for I := 0 to TexLen - 1 do
begin
Texture[I].D2DTexture.Free;
{$IFDEF VIDEOTEX}
if Assigned(Texture[I].VDIB) then
Texture[I].VDIB.Free;
{$ENDIF}
end;
{$ENDIF}
inherited;
end;
 
function TD2DTextures.GetD2DMaxTextures: Integer;
begin
Result := {$IFDEF VER4UP}Length(Texture){$ELSE}TexLen{$ENDIF};
end;
 
procedure TD2DTextures.SaveTextures(path: string);
var I: Integer;
begin
if Texture <> nil then
{$IFDEF VER4UP}
if Length(Texture) > 0 then
for I := Low(Texture) to High(Texture) do
{$ELSE}
if TexLen > 0 then
for I := 0 to TexLen - 1 do
{$ENDIF}
Texture[I].D2DTexture.FImage.SaveToFile(path + Texture[I].Name + '.dxt');
end;
 
procedure TD2DTextures.SetD2DMaxTextures(const Value: Integer);
begin
if Value > 0 then
{$IFDEF VER4UP}
SetLength(Texture, Value)
{$ELSE}
Inc(TexLen);
if Texture = nil then
Texture := AllocMem(SizeOf(TTextureRec))
else begin
{alokuj pamet}
ReallocMem(Texture, TexLen * SizeOf(TTextureRec));
end;
{$ENDIF}
end;
 
function TD2DTextures.Find(byName: string): Integer;
var I: Integer;
begin
Result := -1;
if Texture <> nil then
{$IFDEF VER4UP}
if Length(Texture) > 0 then
for I := Low(Texture) to High(Texture) do
if AnsiUpperCase(Texture[I].Name) = AnsiUpperCase(byName) then
begin
Result := I;
Exit;
end;
{$ELSE}
if TexLen > 0 then
for I := 0 to TexLen - 1 do
if AnsiUpperCase(Texture[I].Name) = AnsiUpperCase(byName) then
begin
Result := I;
Exit;
end;
{$ENDIF}
end;
 
function TD2DTextures.GetTextureByName(const byName: string): TDirect3DTexture2;
begin
Result := nil;
if Assigned(Texture) then
Result := Texture[Find(byName)].D2DTexture;
end;
 
function TD2DTextures.GetTextureByIndex(const byIndex: Integer): TDirect3DTexture2;
begin
Result := nil;
{$IFNDEF VER4UP}
if Assigned(Texture) and (byIndex >= 0) and (byIndex <= (TexLen - 1)) then
Result := Texture[byIndex].D2DTexture;
{$ELSE}
if Assigned(Texture) and (byIndex in [0..High(Texture)]) then
Result := Texture[byIndex].D2DTexture;
{$ENDIF}
end;
 
function TD2DTextures.GetTextureNameByIndex(const byIndex: Integer): string;
begin
Result := '';
{$IFNDEF VER4UP}
if Assigned(Texture) and (byIndex >= 0) and (byIndex <= (TexLen - 1)) then
Result := Texture[byIndex].Name;
{$ELSE}
if Assigned(Texture) and (byIndex in [0..High(Texture)]) then
Result := Texture[byIndex].Name;
{$ENDIF}
end;
 
function TD2DTextures.Count: Integer;
begin
Result := 0;
if Assigned(Texture) then
{$IFNDEF VER4UP}
Result := TexLen;
{$ELSE}
Result := High(Texture) + 1;
{$ENDIF}
end;
 
procedure TD2DTextures.D2DPruneAllTextures;
var I: Integer;
begin
if not Assigned(Texture) then Exit;
{$IFDEF VER4UP}
for I := Low(Texture) to High(Texture) do
{$ELSE}
for I := 0 to TexLen - 1 do
{$ENDIF}
begin
Texture[I].D2DTexture.Free;
{$IFDEF VIDEOTEX}
if Assigned(Texture[I].VDIB) then
Texture[I].VDIB.Free;
{$ENDIF}
end;
{$IFDEF VER4UP}
SetLength(Texture, 0);
{$ELSE}
TexLen := 0;
{$ENDIF}
end;
 
procedure TD2DTextures.D2DFreeTextures;
var I: Integer;
begin
if not Assigned(Texture) then Exit;
{$IFDEF VER4UP}
for I := Low(Texture) to High(Texture) do
{$ELSE}
for I := 0 to TexLen - 1 do
{$ENDIF}
begin
Texture[I].D2DTexture.Free;
{$IFDEF VIDEOTEX}
if Assigned(Texture[I].VDIB) then
Texture[I].VDIB.Free;
{$ENDIF}
end;
{$IFNDEF VER4UP}
FreeMem(Texture, TexLen * SizeOf(TTextureRec));
Texture := nil;
{$ENDIF}
end;
 
procedure TD2DTextures.D2DPruneTextures;
begin
if {$IFDEF VER4UP}Length(Texture){$ELSE}TexLen{$ENDIF} > maxTexBlock then
begin
D2DPruneAllTextures
end;
end;
 
procedure TD2DTextures.SizeAdjust(var DIB: TDIB; var FloatX1, FloatY1, FloatX2, FloatY2: Double);
var
X, Y: Integer;
tempDIB: TDIB;
begin {auto-adjust size n^2 for accelerator compatibility}
X := 1;
repeat
X := X * 2;
until DIB.Width <= X;
Y := 1;
repeat
Y := Y * 2
until DIB.Height <= Y;
{$IFDEF FORCE_SQUARE}
X := Max(X, Y);
Y := X;
{$ENDIF}
if (X = DIB.Width) and (Y = DIB.Height) then
begin
if DIB.BitCount = 32 then Exit; {do not touch}
{code for correction a DIB.BitCount to 24 bit only}
tempDIB := TDIB.Create;
try
tempDIB.SetSize(X, Y, 24);
FillChar(tempDIB.PBits^, tempDIB.Size, 0);
tempDIB.Canvas.Draw(0, 0, DIB);
DIB.Assign(tempDIB);
finally
tempDIB.Free;
end;
Exit;
end;
tempDIB := TDIB.Create;
try
if DIB.BitCount = 32 then
begin
tempDIB.SetSize(X, Y, 32);
FillChar(tempDIB.PBits^, tempDIB.Size, 0);
//tempDIB.Canvas.Brush.Color := clBlack;
//tempDIB.Canvas.FillRect(Bounds(0, 0, X, Y));
tempDIB.Canvas.Draw(0, 0, DIB);
// if DIB.HasAlphaChannel then
// tempDIB.AssignAlphaChannel(DIB);
end
else
begin
tempDIB.SetSize(X, Y, 24 {DIB.BitCount}); {bad value for some 16}
FillChar(tempDIB.PBits^, tempDIB.Size, 0);
//tempDIB.Canvas.Brush.Color := clBlack;
//tempDIB.Canvas.FillRect(Bounds(0, 0, X, Y));
tempDIB.Canvas.Draw(0, 0, DIB);
end;
FloatX2 := (1 / tempDIB.Width) * DIB.Width;
FloatY2 := (1 / tempDIB.Height) * DIB.Height;
DIB.Assign(tempDIB);
finally
tempDIB.Free;
end
end;
 
function TD2DTextures.CanFindTexture(aImage: TPictureCollectionItem): Boolean;
var I: Integer;
begin
Result := True;
{$IFDEF VER4UP}
if Length(Texture) > 0 then
{$ELSE}
if TexLen > 0 then
{$ENDIF}
for I := 0 to D2DMaxTextures - 1 do
if Texture[I].Name = aImage.Name then Exit;
Result := False;
end;
 
function TD2DTextures.LoadTextures(aImage: TPictureCollectionItem): Boolean;
var
{$IFNDEF VIDEOTEX}
VDIB: TDIB;
{$ENDIF}
T: TDXTextureImage;
begin
Result := True;
try
D2DPruneTextures; {up to maxTexBlock textures only}
D2DMaxTextures := D2DMaxTextures + 1;
if aImage.Name = '' then // FIX: OPTIMIZED
aImage.Name := aImage.GetNamePath; {this name is supplement name, when wasn't aImage.Name fill}
{$IFDEF VIDEOTEX}Texture[D2DMaxTextures - 1].{$ENDIF}VDIB := TDIB.Create;
try
with Texture[D2DMaxTextures - 1] do
begin
VDIB.Assign(aImage.Picture.Graphic);
VDIB.Transparent := aImage.Transparent;
FloatX1 := 0; FloatY1 := 0; FloatX2 := 1; FloatY2 := 1;
SizeAdjust(VDIB, FloatX1, FloatY1, FloatX2, FloatY2);
Name := aImage.Name;
Width := VDIB.Width;
Height := VDIB.Height;
if VDIB.HasAlphaChannel then
begin
DIB2DXT(VDIB, T);
T.ImageName := aImage.Name;
T.Transparent := aImage.Transparent;
D2DTexture := TDirect3DTexture2.Create(FDDraw, T, False);
D2DTexture.Transparent := aImage.Transparent;
AlphaChannel := True;
//**T.Free; DO NOT FREE - surface is lost ** FIX by JB.
end
else
begin
D2DTexture := TDirect3DTexture2.Create(FDDraw, VDIB, False);
D2DTexture.TransparentColor := DWORD(aImage.TransparentColor);
D2DTexture.Surface.TransparentColor := DWORD(aImage.TransparentColor);
D2DTexture.Transparent := aImage.Transparent;
AlphaChannel := False;
end;
end;
finally
{$IFNDEF VIDEOTEX}
VDIB.Free;
{$ENDIF}
end;
except
D2DMaxTextures := D2DMaxTextures - 1;
Result := False;
end;
end;
 
{$IFDEF VER4UP}
function TD2DTextures.CanFindTexture(const TexName: string): Boolean;
{$ELSE}
function TD2DTextures.CanFindTexture2(const TexName: string): Boolean;
{$ENDIF}
var I: Integer;
begin
Result := True;
{$IFDEF VER4UP}
if Length(Texture) > 0 then
{$ELSE}
if TexLen > 0 then
{$ENDIF}
for I := 0 to D2DMaxTextures - 1 do
if Texture[I].Name = TexName then Exit;
Result := False;
end;
 
function TD2DTextures.SetTransparentColor(dds: TDirectDrawSurface; PixelColor: Integer; Transparent: Boolean): Integer;
{Give a speculative transparent color value from DDS}
var
ddck: TDDColorKey;
CLL: Integer;
begin
Result := 0;
if dds.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if dds.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetColorKey(DDCKEY_SRCBLT, ddck) = DD_OK then
Result := ddck.dwColorSpaceLowValue;
CLL := PixelColor; {have to pick up color from 0,0 pix of DIB}
if Transparent then {and must be transparent}
if (CLL <> Result) then {when different}
Result := CLL; {use our TransparentColor}
end;
 
{$IFDEF VER4UP}
function TD2DTextures.LoadTextures(dds: TDirectDrawSurface; Transparent: Boolean; asTexName: string): Boolean;
{$ELSE}
function TD2DTextures.LoadTextures2(dds: TDirectDrawSurface; Transparent: Boolean; asTexName: string): Boolean;
{$ENDIF}
var
{$IFNDEF VIDEOTEX}
VDIB: TDIB;
{$ENDIF}
Col: Integer;
T: PTextureRec;
begin
Result := True;
T := nil;
try
if dds.Modified then
begin
{search existing texture and return the pointer}
T := Addr(Texture[Find(asTexName)]);
{$IFNDEF VIDEOTEX}VDIB := TDIB.Create;{$ENDIF}
end
else
begin
D2DPruneTextures; {up to maxTexBlock textures only}
D2DMaxTextures := D2DMaxTextures + 1; {next to new space}
T := Addr(Texture[D2DMaxTextures - 1]); {is new place}
{set name}
T.Name := asTexName;
{and create video-dib object for store the picture periodically changed}
{$IFDEF VIDEOTEX}T.{$ENDIF}VDIB := TDIB.Create;
//T.VDIB.PixelFormat := MakeDIBPixelFormat(8, 8, 8);
end;
try
{the dds assigned here}
{$IFDEF VIDEOTEX}T.{$ENDIF}VDIB.Assign(dds);
{with full adjustation}
T.FloatX1 := 0; T.FloatY1 := 0; T.FloatX2 := 1; T.FloatY2 := 1;
SizeAdjust({$IFDEF VIDEOTEX}T.{$ENDIF}VDIB, T.FloatX1, T.FloatY1, T.FloatX2, T.FloatY2);
{and store 'changed' values of size here}
T.Width := {$IFDEF VIDEOTEX}T.{$ENDIF}VDIB.Width;
T.Height := {$IFDEF VIDEOTEX}T.{$ENDIF}VDIB.Height;
{and it have to set by dds as transparent, when it set up}
{$IFDEF VIDEOTEX}T.{$ENDIF}VDIB.Transparent := Transparent;
{get up transparent color}
Col := SetTransparentColor(dds, {$IFDEF VIDEOTEX}T.{$ENDIF}VDIB.Pixels[0, 0], Transparent);
if dds.Modified then
T.D2DTexture.Load {for minimize time only load as videotexture}
else
T.D2DTexture := TDirect3DTexture2.Create(FDDraw, {$IFDEF VIDEOTEX}T.{$ENDIF}VDIB, False); {create it}
{don't forget set transparent values on texture!}
T.D2DTexture.TransparentColor := DWORD(COL);
T.D2DTexture.Surface.TransparentColor := DWORD(COL);
T.D2DTexture.Transparent := Transparent;
finally
{$IFNDEF VIDEOTEX}
if Assigned(VDIB) then VDIB.Free;
{$ENDIF}
end;
except
{eh, sorry, when is not the dds modified, roll back and release last the VDIB}
if not dds.Modified then
if T <> nil then
begin
if Assigned({$IFDEF VIDEOTEX}T.{$ENDIF}VDIB) then
{$IFNDEF D5UP}
begin {$IFDEF VIDEOTEX}T.{$ENDIF}VDIB.Free; {$IFDEF VIDEOTEX}T.{$ENDIF}VDIB := nil; end;
{$ELSE}
FreeAndNil({$IFDEF VIDEOTEX}T.{$ENDIF}VDIB);
{$ENDIF}
if Assigned(T.D2DTexture) then
{$IFNDEF D5UP}
begin T.D2DTexture.Free; T.D2DTexture := nil; end;
{$ELSE}
FreeAndNil(T.D2DTexture);
{$ENDIF}
 
D2DMaxTextures := D2DMaxTextures - 1; //go back
end;
Result := False;
end;
dds.Modified := False; {this flag turn off always}
end;
 
{$IFDEF VER4UP}
function TD2DTextures.LoadTextures(dds: TDirectDrawSurface; Transparent: Boolean;
TransparentColor: Integer; asTexName: string): Boolean;
{$ELSE}
function TD2DTextures.LoadTextures3(dds: TDirectDrawSurface; Transparent: Boolean;
TransparentColor: Integer; asTexName: string): Boolean;
{$ENDIF}
function getDDSTransparentColor(DIB: TDIB; dds: TDirectDrawSurface): Integer;
var CLL: Integer; ddck: TDDColorKey;
begin
Result := 0;
if dds.{$IFDEF D3D_deprecated}IDDSurface{$ELSE}IDDSurface7{$ENDIF} <> nil then
if dds.{$IFDEF D3D_deprecated}ISurface{$ELSE}ISurface7{$ENDIF}.GetColorKey(DDCKEY_SRCBLT, ddck) = DD_OK then
Result := ddck.dwColorSpaceLowValue;
CLL := TransparentColor;
if (CLL = -1) or (cardinal(CLL) <> DIB.Pixels[0, 0]) then //when is DDS
CLL := DIB.Pixels[0, 0]; //have to pick up color from 0,0 pix of DIB
if Transparent then //and must be transparent
if CLL <> Result then //when different
Result := CLL; //use TransparentColor
end;
var
{$IFNDEF VIDEOTEX}
VDIB: TDIB;
{$ENDIF}
COL: Integer;
T: TDXTextureImage;
begin
Result := True;
try
D2DPruneTextures; {up to maxTexBlock textures only}
D2DMaxTextures := D2DMaxTextures + 1;
Texture[D2DMaxTextures - 1].Name := asTexName;
{$IFDEF VIDEOTEX}Texture[D2DMaxTextures - 1].{$ENDIF}VDIB := TDIB.Create;
try
with Texture[D2DMaxTextures - 1] do
begin
VDIB.AsSign(dds);
VDIB.Transparent := Transparent;
FloatX1 := 0; FloatY1 := 0; FloatX2 := 1; FloatY2 := 1;
SizeAdjust(VDIB, FloatX1, FloatY1, FloatX2, FloatY2);
Width := VDIB.Width;
Height := VDIB.Height;
if VDIB.HasAlphaChannel then
begin
DIB2DXT(VDIB, T);
T.ImageName := asTexName;
T.Transparent := Transparent;
D2DTexture := TDirect3DTexture2.Create(FDDraw, T, False);
D2DTexture.Transparent := Transparent;
AlphaChannel := True;
//**T.Free; DO NOT FREE - surface is lost ** FIX by JB.
end
else
begin
D2DTexture := TDirect3DTexture2.Create(FDDraw, VDIB, False);
if transparentcolor = -1 then
COL := getDDSTransparentColor(VDIB, DDS)
else
COL := D2DTexture.Surface.ColorMatch(transparentcolor);
D2DTexture.TransparentColor := DWORD(COL); //**
D2DTexture.Surface.TransparentColor := DWORD(COL); //**
D2DTexture.Transparent := Transparent;
AlphaChannel := False;
end;
end
finally
{$IFNDEF VIDEOTEX}
VDIB.Free;
{$ENDIF}
end;
except
D2DMaxTextures := D2DMaxTextures - 1;
Result := False;
end;
end;
 
{$IFDEF VER4UP}
function TD2DTextures.CanFindTexture(const Color: LongInt): Boolean;
{$ELSE}
function TD2DTextures.CanFindTexture3(const Color: LongInt): Boolean;
{$ENDIF}
var I: Integer;
begin
Result := True;
{$IFDEF VER4UP}
if Length(Texture) > 0 then
{$ELSE}
if TexLen > 0 then
{$ENDIF}
for I := 0 to D2DMaxTextures - 1 do
if Texture[I].Name = '$' + IntToStr(Color) then Exit;
Result := False;
end;
 
{$IFDEF VER4UP}
function TD2DTextures.LoadTextures(Color: LongInt): Boolean;
{$ELSE}
function TD2DTextures.LoadTextures4(Color: LongInt): Boolean;
{$ENDIF}
var
S: string;
{$IFNDEF VIDEOTEX}
VDIB: TDIB;
{$ENDIF}
begin
Result := True;
try
D2DPruneTextures; {up to maxTexBlock textures only}
D2DMaxTextures := D2DMaxTextures + 1;
S := '$' + IntToStr(Color); {this name is supplement name}
{$IFDEF VIDEOTEX}Texture[D2DMaxTextures - 1].{$ENDIF}VDIB := TDIB.Create;
try
with Texture[D2DMaxTextures - 1] do
begin
VDIB.SetSize(16, 16, 24); {16x16 good size}
VDIB.Canvas.Brush.Color := Color;
VDIB.Canvas.FillRect(Bounds(0, 0, 16, 16));
 
FloatX1 := 0;
FloatY1 := 0;
FloatX2 := 1;
FloatY2 := 1;
Name := S;
D2DTexture := TDirect3DTexture2.Create(FDDraw, VDIB, False);
D2DTexture.Transparent := False; //cannot be transparent
end;
finally
{$IFNDEF VIDEOTEX}
VDIB.Free;
{$ENDIF}
end;
except
D2DMaxTextures := D2DMaxTextures - 1;
Result := False;
end;
end;
 
{$IFDEF VIDEOTEX}
function TD2DTextures.GetTexLayoutByName(name: string): TDIB;
var
I: Integer;
begin
Result := nil;
I := Find(name);
{$IFDEF VER4UP}
if (I >= Low(Texture)) and (I <= High(Texture)) then
{$ELSE}
if I <> -1 then
{$ENDIF}
Result := Texture[I].VDIB
end;
{$ENDIF}
 
//---------------------------------------------------------------------------
 
constructor TD2D.Create(DDraw: TCustomDXDraw);
begin
inherited Create;
//after inheritance
FDDraw := DDraw;
FD2DTextureFilter := D2D_POINT {D2D_LINEAR};
{$IFNDEF D3D_deprecated}
FD2DTexture := TD2DTextures.Create(FDDraw);
{$ENDIF}
InitVertex;
{internal allocation of texture}
CanUseD2D := {$IFDEF D3D_deprecated}(do3D in FDDraw.Options) and
(doDirectX7Mode in FDDraw.Options) and
(doHardware in FDDraw.Options){$ELSE}True{$ENDIF};
FDIB := TDIB.Create;
FInitialized := False;
end;
 
destructor TD2D.Destroy;
begin
{freeing texture and stop using it}
CanUseD2D := False;
if AsSigned(FD2DTexture) then
begin
FD2DTexture.Free; {add 29.5.2005 Takanori Kawasaki}
FD2DTexture := nil;
end;
FDIB.Free;
inherited Destroy;
end;
 
procedure TD2D.InitVertex;
var i: Integer;
begin
Fillchar(FVertex, SizeOf(FVertex), 0);
for i := 0 to 3 do
begin
FVertex[i].Specular := D3DRGB(1.0, 1.0, 1.0);
FVertex[i].rhw := 1.0;
end;
end;
 
//---------------------------------------------------------------------------
 
procedure TD2D.BeginScene();
begin
asm
FINIT
end;
FDDraw.D3DDevice7.BeginScene();
asm
FINIT
end;
FDDraw.D3DDevice7.Clear(0, nil, D3DCLEAR_TARGET, 0, 0, 0);
end;
 
//---------------------------------------------------------------------------
 
procedure TD2D.EndScene();
begin
asm
FINIT
end;
FDDraw.D3DDevice7.EndScene();
asm
FINIT
end;
end;
 
function TD2D.D2DTexturedOn(Image: TPictureCollectionItem; Pattern: Integer; SubPatternRect: TRect; RenderType: TRenderType; Alpha: Byte): Boolean;
var I: Integer;
SrcX, SrcY, diffX: Double;
R: TRect;
Q: TTextureRec;
begin
Result := False;
FDDraw.D3DDevice7.SetTexture(0, nil);
if not FD2DTexture.CanFindTexture(Image) then {when no texture in list try load it}
if not FD2DTexture.LoadTextures(Image) then {loading is here}
Exit; {on error occurr out}
I := FD2DTexture.Find(Image.Name);
if I = -1 then Exit;
{set pattern as texture}
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MAGFILTER, DWord(Ord(FD2DTextureFilter)+1));
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MINFILTER, DWord(Ord(FD2DTextureFilter)+1));
try
RenderError := FDDraw.D3DDevice7.SetTexture(0, FD2DTexture.Texture[I].D2DTexture.Surface.IDDSurface7) <> DD_OK;
case RenderType of
rtDraw: begin D2DEffectSolid; D2DWhite; end;
rtBlend: begin D2DEffectBlend; D2DAlphaVertex(Alpha); end;
rtAdd: begin D2DEffectAdd; D2DFade(Alpha); end;
rtSub: begin D2DEffectSub; D2DFade(Alpha); end;
end;
except
RenderError := True;
FD2DTexture.D2DPruneAllTextures;
Image.Restore;
SetD2DTextureFilter(D2D_LINEAR);
Exit;
end;
{set transparent area}
RenderError := FDDraw.D3DDevice7.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, Ord(FD2DTexture.Texture[I].D2DTexture.Transparent)) <> DD_OK;
{except for Draw when alphachannel exists}
{change for blend drawing but save transparent area still}
if FD2DTexture.Texture[I].AlphaChannel then
{when is Draw selected then}
if RenderType = rtDraw then
begin
D2DEffectBlend;
D2DAlphaVertex($FF);
end;
{pokud je obrazek rozdeleny, nastav oka site}
if (Image.PatternHeight <> 0) or (Image.PatternWidth <> 0) then
begin
{vezmi rect jenom dilku}
R := Image.PatternRects[Pattern];
SrcX := 1 / FD2DTexture.Texture[I].Width;
SrcY := 1 / FD2DTexture.Texture[I].Height;
//namapovani vertexu na texturu
FD2DTexture.Texture[I].FloatX1 := SrcX * R.Left;
FD2DTexture.Texture[I].FloatY1 := SrcY * R.Top;
{for meshed subimage contain one image only can be problem there}
diffX := 0.5; if Image.PatternCount = 1 then diffX := 0;
FD2DTexture.Texture[I].FloatX2 := SrcX * (R.Right - diffX);
FD2DTexture.Texture[I].FloatY2 := SrcY * (R.Bottom - diffX);
if not (
(SubPatternRect.Left = Image.PatternRects[Pattern].Left) and
(SubPatternRect.Top = Image.PatternRects[Pattern].Top) and
(SubPatternRect.Right = Image.PatternRects[Pattern].Right) and
(SubPatternRect.Bottom = Image.PatternRects[Pattern].Bottom))
then
begin
{remaping subtexture via subpattern}
Q.FloatX1 := SrcX * SubPatternRect.Left;
Q.FloatY1 := SrcY * SubPatternRect.Top;
Q.FloatX2 := SrcX * (SubPatternRect.Right - diffX);
Q.FloatY2 := SrcY * (SubPatternRect.Bottom - diffX);
D2DTU(Q); {with mirroring/flipping}
Result := not RenderError;
Exit;
end;
end; {jinak celeho obrazku}
 
{ X1,Y1 X2,Y1
0 +-----------------+ 1
| |
| |
| |
| |
2 +-----------------+ 3
X1,Y2 X2,Y2 }
D2DTU(FD2DTexture.Texture[I]);
Result := not RenderError;
end;
 
function TD2D.D2DTexturedOnDDSTex(dds: TDirectDrawSurface; SubPatternRect: TRect; Transparent: Boolean): Integer;
{special version of map for TDirectDrawSurface only}
{set up transparent color from this surface}
var
TexName: string;
begin
Result := -1;
{pokud je seznam prazdny, nahrej texturu}
if dds.Caption <> '' then TexName := dds.Caption
else TexName := IntToStr(Integer(dds)); {simple but stupid}
if not FD2DTexture.{$IFDEF VER4UP}CanFindTexture{$ELSE}CanFindTexture2{$ENDIF}(TexName) then
begin
{when texture doesn't exists, has to the Modified flag turn off}
if dds.Modified then
dds.Modified := not dds.Modified;
if not FD2DTexture.{$IFDEF VER4UP}LoadTextures{$ELSE}LoadTextures2{$ENDIF}(dds, Transparent, TexName) then
Exit; {nepovede-li se to, pak ven}
end
else
if dds.Modified then
begin {when modifying, load texture allways}
if not FD2DTexture.{$IFDEF VER4UP}LoadTextures{$ELSE}LoadTextures2{$ENDIF}(dds, Transparent, TexName) then
Exit; {nepovede-li se to, pak ven}
end;
Result := FD2DTexture.Find(TexName);
end;
 
function IsNotZero(Z: TRect): Boolean;
begin
Result := ((Z.Right - Z.Left) > 0) and ((Z.Bottom - Z.Top) > 0)
end;
 
function TD2D.D2DTexturedOnDDS(dds: TDirectDrawSurface; SubPatternRect: TRect; Transparent: Boolean; RenderType: TRenderType; Alpha: Byte): Boolean;
var I: Integer;
SrcX, SrcY: Double;
begin
Result := False;
FDDraw.D3DDevice7.SetTexture(0, nil);
{call a low level routine for load DDS texture}
I := D2DTexturedOnDDSTex(dds, SubPatternRect, Transparent);
if I = -1 then Exit;
{set pattern as texture}
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MAGFILTER, DWord(Ord(FD2DTextureFilter)+1));
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MINFILTER, DWord(Ord(FD2DTextureFilter)+1));
try
RenderError := FDDraw.D3DDevice7.SetTexture(0, FD2DTexture.Texture[I].D2DTexture.Surface.IDDSurface7) <> DD_OK;
case RenderType of
rtDraw: begin D2DEffectSolid; D2DWhite; end;
rtBlend: begin D2DEffectBlend; D2DAlphaVertex(Alpha); end;
rtAdd: begin D2DEffectAdd; D2DFade(Alpha); end;
rtSub: begin D2DEffectSub; D2DFade(Alpha); end;
end;
except
RenderError := True;
FD2DTexture.D2DPruneAllTextures;
SetD2DTextureFilter(D2D_LINEAR); //default
Exit;
end;
{set transparent area}
RenderError := FDDraw.D3DDevice7.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, Ord(FD2DTexture.Texture[I].D2DTexture.Transparent)) <> DD_OK;
if IsNotZero(SubPatternRect) then
begin
{Set Texture Coordinates}
SrcX := 1 / FD2DTexture.Texture[I].D2DTexture.FImage.Width;
SrcY := 1 / FD2DTexture.Texture[I].D2DTexture.FImage.Height;
//namapovani vertexu na texturu
FD2DTexture.Texture[I].FloatX1 := SrcX * SubPatternRect.Left;
FD2DTexture.Texture[I].FloatY1 := SrcY * SubPatternRect.Top;
FD2DTexture.Texture[I].FloatX2 := SrcX * (SubPatternRect.Right - 0.5 { - 1}); //by Speeeder
FD2DTexture.Texture[I].FloatY2 := SrcY * (SubPatternRect.Bottom - 0.5 { - 1}); //by Speeeder
end;
D2DTU(FD2DTexture.Texture[I]);
Result := not RenderError;
end;
 
//---------------------------------------------------------------------------
 
procedure TD2D.SaveTextures(path: string);
begin
FD2DTexture.SaveTextures(path);
end;
 
procedure TD2D.SetCanUseD2D(const Value: Boolean);
begin
case Value of
False: {prestava se uzivat}
if AsSigned(FD2DTexture) and (Value <> FCanUseD2D) then
begin
FInitialized := False;
end;
True:
if Value <> FCanUseD2D then
begin
{$IFDEF D3D_deprecated}
FD2DTexture := TD2DTextures.Create(FDDraw);
TextureFilter := D2D_LINEAR;
{$ENDIF}
end
end;
FCanUseD2D := Value;
end;
 
function TD2D.GetCanUseD2D: Boolean;
begin
{$IFDEF D3D_deprecated}
{Mode has to do3D, doDirectX7Mode and doHardware}
if (do3D in FDDraw.Options) and
(doDirectX7Mode in FDDraw.Options) and
(doHardware in FDDraw.Options)
then
begin
if not FCanUseD2D then CanUseD2D := True;
end
else
if not (do3D in FDDraw.Options) or
not (doDirectX7Mode in FDDraw.Options) or
not (doHardware in FDDraw.Options)
then
if FCanUseD2D then FCanUseD2D := False; // CanUseD2D -> FCanUseD2D
{$ELSE}
FCanUseD2D := (doHardware in FDDraw.Options);
{$ENDIF}
FBitCount := FDDraw.Surface.SurfaceDesc.ddpfPixelFormat.dwRGBBitCount;
{supported 16 or 32 bitcount deepth only}
{$IFDEF D3D_deprecated}
if not (FBitCount in [16, 32]) then FCanUseD2D := False;
{$ENDIF}
if not FInitialized then
if FCanUseD2D and Assigned(FDDraw.D3DDevice7) then
begin
FDDraw.D3DDevice7.GetCaps(FD3DDevDesc7);
FInitialized := True;
end;
 
Result := FCanUseD2D;
end;
 
procedure TD2D.SetD2DTextureFilter(const Value: TD2DTextureFilter);
begin
FD2DTextureFilter := Value;
if {$IFDEF D3D_deprecated}(do3D in FDDraw.Options) and{$ENDIF} AsSigned(FDDraw.D3DDevice7) then
begin
FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MAGFILTER, DWord(Ord(FD2DTextureFilter) + 1));
FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MINFILTER, DWord(Ord(FD2DTextureFilter) + 1));
end;
end;
 
procedure TD2D.SetD2DAntialiasFilter(const Value: TD3DAntialiasMode);
begin
FD2DAntialiasFilter := Value;
if {$IFDEF D3D_deprecated}(do3D in FDDraw.Options) and{$ENDIF} AsSigned(FDDraw.D3DDevice7) then
begin
FDDraw.D3DDevice7.SetRenderState(D3DRENDERSTATE_ANTIALIAS, Ord(Value));
end;
end;
 
procedure TD2D.D2DRect(R: TRect);
begin
FVertex[0].sx := R.Left - 0.5;
FVertex[0].sy := R.Top - 0.5;
FVertex[1].sx := R.Right - 0.5;
FVertex[1].sy := R.Top - 0.5;
FVertex[2].sx := R.Left - 0.5;
FVertex[2].sy := R.Bottom - 0.5;
FVertex[3].sx := R.Right - 0.5;
FVertex[3].sy := R.Bottom - 0.5;
end;
 
procedure TD2D.D2DTU(T: TTextureRec);
begin
if FMirrorFlipSet = [rmfMirror] then
begin
{ X1,Y1 X2,Y1
0 +-----------------+ 1
| |
| |
| |
| |
2 +-----------------+ 3
X1,Y2 X2,Y2 }
FVertex[1].tu := T.FloatX1;
FVertex[1].tv := T.FloatY1;
FVertex[0].tu := T.FloatX2;
FVertex[0].tv := T.FloatY1;
FVertex[3].tu := T.FloatX1;
FVertex[3].tv := T.FloatY2;
FVertex[2].tu := T.FloatX2;
FVertex[2].tv := T.FloatY2;
end
else
if FMirrorFlipSet = [rmfFlip] then
begin
{ X1,Y1 X2,Y1
0 +-----------------+ 1
| |
| |
| |
| |
2 +-----------------+ 3
X1,Y2 X2,Y2 }
FVertex[2].tu := T.FloatX1;
FVertex[2].tv := T.FloatY1;
FVertex[3].tu := T.FloatX2;
FVertex[3].tv := T.FloatY1;
FVertex[0].tu := T.FloatX1;
FVertex[0].tv := T.FloatY2;
FVertex[1].tu := T.FloatX2;
FVertex[1].tv := T.FloatY2;
end
else
if FMirrorFlipSet = [rmfMirror, rmfFlip] then
begin
{ X1,Y1 X2,Y1
0 +-----------------+ 1
| |
| |
| |
| |
2 +-----------------+ 3
X1,Y2 X2,Y2 }
FVertex[3].tu := T.FloatX1;
FVertex[3].tv := T.FloatY1;
FVertex[2].tu := T.FloatX2;
FVertex[2].tv := T.FloatY1;
FVertex[1].tu := T.FloatX1;
FVertex[1].tv := T.FloatY2;
FVertex[0].tu := T.FloatX2;
FVertex[0].tv := T.FloatY2;
end
else
begin
{ X1,Y1 X2,Y1
0 +-----------------+ 1
| |
| |
| |
| |
2 +-----------------+ 3
X1,Y2 X2,Y2 }
FVertex[0].tu := T.FloatX1;
FVertex[0].tv := T.FloatY1;
FVertex[1].tu := T.FloatX2;
FVertex[1].tv := T.FloatY1;
FVertex[2].tu := T.FloatX1;
FVertex[2].tv := T.FloatY2;
FVertex[3].tu := T.FloatX2;
FVertex[3].tv := T.FloatY2;
end;
end;
 
{Final public routines}
 
function TD2D.D2DRender(Image: TPictureCollectionItem; DestRect: TRect;
Pattern: Integer; SourceRect: TRect; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
if D2DTexturedOnSubRect(Image, Pattern, Image.PatternRects[Pattern], SourceRect, RenderType, Alpha) then
begin
D2DRect(DestRect);
Result := RenderQuad;
end;
end;
 
function TD2D.{$IFNDEF VER4UP}D2DRender2{$ELSE}D2DRender{$ENDIF}(Image: TPictureCollectionItem; R: TRect;
Pattern: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
if D2DTexturedOn(Image, Pattern, Image.PatternRects[Pattern], RenderType, Alpha) then
begin
D2DRect(R);
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderDDS(Source: TDirectDrawSurface; SourceRect, DestRect: TRect;
Transparent: Boolean; Pattern: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
if D2DTexturedOnDDS(Source, SourceRect, Transparent, RenderType, Alpha) then
begin
D2DRect(DestRect);
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderCol(Image: TPictureCollectionItem; R: TRect;
Pattern, Color: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
if D2DTexturedOn(Image, Pattern, Image.PatternRects[Pattern], RenderType, Alpha) then
begin
D2DRect(R);
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderColDDS(Source: TDirectDrawSurface; SourceRect, DestRect: TRect;
Transparent: Boolean; Pattern, Color: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{Add}
if D2DTexturedOnDDS(Source, SourceRect, Transparent, RenderType, Alpha) then
begin
D2DRect(DestRect);
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderDrawXY(Image: TPictureCollectionItem; X, Y: Integer;
Pattern: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
var PWidth, PHeight: Integer;
begin
Result := False; if not CanUseD2D then Exit;
{Draw}
if D2DTexturedOn(Image, Pattern, Image.PatternRects[Pattern], RenderType, Alpha) then
begin
PWidth := Image.PatternWidth; if PWidth = 0 then PWidth := Image.Width;
PHeight := Image.PatternHeight; if PHeight = 0 then PHeight := Image.Height;
D2DRect(Bounds(X, Y, PWidth, PHeight));
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderDrawDDSXY(Source: TDirectDrawSurface; X, Y: Integer;
Transparent: Boolean; Pattern: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{Draw}
if D2DTexturedOnDDS(Source, ZeroRect, Transparent, RenderType, Alpha) then
begin
D2DRect(Bounds(X, Y, Source.Width, Source.Height));
Result := RenderQuad;
end;
end;
 
{$IFDEF VER4UP}
function TD2D.D2DRenderDrawDDSXY(Source: TDirectDrawSurface; X, Y: Integer;
SrcRect: TRect; Transparent: Boolean; Pattern: Integer; RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{Draw}
if D2DTexturedOnDDS(Source, SrcRect, Transparent, RenderType, Alpha) then
begin
D2DRect(Bounds(X, Y, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top));
Result := RenderQuad;
end;
end;
{$ENDIF}
 
{Rotate functions}
 
procedure TD2D.D2DRotate(X, Y, W, H: Integer; Px, Py: Double; Angle: Single);
procedure SinCosS(const Theta: Single; var Sin, Cos: Single); register;
{ EAX contains address of Sin}
{ EDX contains address of Cos}
{ Theta is passed over the stack}
asm
FLD Theta
FSINCOS
FSTP DWORD PTR [EDX] // cosine
FSTP DWORD PTR [EAX] // sine
end;
const PI256 = 2 * PI / 256;
var x1, y1, up, s_angle, c_angle, s_up, c_up: Single;
begin
angle := angle * PI256; up := angle + PI / 2;
x1 := w * px; y1 := h * py;
SinCosS(angle, s_angle, c_angle);
SinCosS(up, s_up, c_up);
FVertex[0].sx := X - x1 * c_angle - y1 * c_up;
FVertex[0].sy := Y - x1 * s_angle - y1 * s_up;
FVertex[1].sx := FVertex[0].sx + W * c_angle;
FVertex[1].sy := FVertex[0].sy + W * s_angle;
FVertex[2].sx := FVertex[0].sx + H * c_up;
FVertex[2].sy := FVertex[0].sy + H * s_up;
FVertex[3].sx := FVertex[2].sx + W * c_angle;
FVertex[3].sy := FVertex[2].sy + W * s_angle;
end;
 
function TD2D.D2DRenderRotate(Image: TPictureCollectionItem; RotX, RotY,
PictWidth, PictHeight, PatternIndex: Integer; RenderType: TRenderType;
CenterX, CenterY: Double;
Angle: single; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{load textures and map it, set of effect}
if D2DTexturedOn(Image, PatternIndex, Image.PatternRects[PatternIndex], RenderType, Alpha) then
begin
{do rotate mesh}
D2DRotate(RotX, RotY, PictWidth, PictHeight, CenterX, CenterY, Angle);
{render it}
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderRotateDDS(Image: TDirectDrawSurface; SourceRect: TRect; RotX, RotY,
PictWidth, PictHeight: Integer; RenderType: TRenderType;
CenterX, CenterY: Double; Angle: single; Alpha: Byte;
Transparent: Boolean): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{load textures and map it, set of effect}
if D2DTexturedOnDDS(Image, SourceRect, Transparent, RenderType, Alpha) then
begin
{do rotate mesh}
D2DRotate(RotX, RotY, PictWidth, PictHeight, CenterX, CenterY, Angle);
{render it}
Result := RenderQuad;
end;
end;
 
{------------------------------------------------------------------------------}
{created 31.1.2005 JB.}
{replacement original Hori's functionality}
{24.4.2006 create WaveY as supplement like WaveX functions}
{14.5.2006 added functionality for tile drawing through PatternIndex}
 
function TD2D.D2DMeshMapToWave(dds: TDirectDrawSurface; Transparent: Boolean;
TransparentColor: Integer; X, Y, iWidth, iHeight, PatternIndex: Integer;
PatternRect: TRect;
Amp, Len, Ph, Alpha: Integer; effect: TRenderType; DoY: Boolean): Boolean;
function D2DTexturedOn(dds: TDirectDrawSurface; Transparent: Boolean; var TexNo: Integer): Boolean;
{special version of mapping for TDirectDrawSurface only}
{set up transparent color from this surface}
var I: Integer;
TexName: string;
begin
Result := False;
TexNo := -1;
RenderError := FDDraw.D3DDevice7.SetTexture(0, nil) <> DD_OK;
{pokud je seznam prazdny, nahrej texturu}
if dds.Caption <> '' then TexName := dds.Caption
else TexName := IntToStr(Integer(dds));
if not FD2DTexture.{$IFDEF VER4UP}CanFindTexture{$ELSE}CanFindTexture2{$ENDIF}(TexName) then
{nepovede-li se to, pak ven}
if not FD2DTexture.{$IFDEF VER4UP}LoadTextures{$ELSE}LoadTextures3{$ENDIF}(dds, Transparent, TransparentColor, TexName) then Exit;
I := FD2DTexture.Find(TexName);
if I = -1 then Exit;
TexNo := I;
{set pattern as texture}
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MAGFILTER, DWord(Ord(FD2DTextureFilter)+1));
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MINFILTER, DWord(Ord(FD2DTextureFilter)+1));
try
RenderError := FDDraw.D3DDevice7.SetTexture(0, FD2DTexture.Texture[I].D2DTexture.Surface.IDDSurface7) <> DD_OK;
//Result := True; {not RetderError}
except
RenderError := True;
Result := False;
FD2DTexture.D2DPruneAllTextures;
Exit;
end;
{set transparent area}
RenderError := FDDraw.D3DDevice7.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, Ord(FD2DTexture.Texture[I].D2DTexture.Transparent)) <> DD_OK;
Result := not RenderError;
end;
type
TVertexArray = array{$IFNDEF VER4UP} [0..0]{$ENDIF} of TD3DTLVERTEX;
{$IFNDEF VER4UP}
PVertexArray = ^TVertexArray;
{$ENDIF}
var
SVertex: {$IFDEF VER4UP}TVertexArray{$ELSE}PVertexArray{$ENDIF};
I, maxVertex, maxPix, VStepVx, TexNo, Width, Height: Integer;
VStep, VStepTo, D, Z, FX1, FX2, FY1, FY2, SX, SY, X1, Y1, X2, Y2: Extended;
R: TRect;
clr: DWORD;
begin
Result := False;
{zde uschovano maximum [0..1] po adjustaci textury, ktera nemela nektery rozmer 2^n}
{FD2DTexture.Texture[I].FloatX2;}
{FD2DTexture.Texture[I].FloatY2;}
{napr. pokud byl rozmer 0.7 pak je nutno prepocitat tento interval [0..0.7] na height}
if not D2DTexturedOn(dds, Transparent, TexNo) then Exit;
{musi se prenastavit velikost pokud je PatternIndex <> -1}
Width := iWidth;
Height := iHeight;
{remove into local variabled for multi-picture adjustation}
FX1 := FD2DTexture.Texture[TexNo].FloatX1;
FX2 := FD2DTexture.Texture[TexNo].FloatX2;
FY1 := FD2DTexture.Texture[TexNo].FloatY1;
FY2 := FD2DTexture.Texture[TexNo].FloatY2;
{when pattertindex selected, get real value of subtexture}
if (PatternIndex <> -1) {and (PatternRect <> ZeroRect)} then
begin
R := PatternRect;
Width := R.Right - R.Left;
Height := R.Bottom - R.Top;
{scale unit of full new width and height}
SX := 1 / FD2DTexture.Texture[TexNo].Width;
SY := 1 / FD2DTexture.Texture[TexNo].Height;
{remap there}
FX1 := R.Left * SX;
FX2 := R.Right * SX;
FY1 := R.Top * SY;
FY2 := R.Bottom * SY;
end;
{nastavuje se tolik vertexu, kolik je potreba}
{speculative set up of rows for better look how needed}
if not DoY then
begin
maxVertex := 2 * Trunc(Height / Len * 8);
if (maxVertex mod 2) > 0 then {top to limits}
Inc(maxVertex, 2);
if (maxVertex div 2) > Height then {correct to Height}
maxVertex := 2 * Height;
end
else
begin
maxVertex := 2 * Trunc(Width / Len * 8);
if (maxVertex mod 2) > 0 then {top to limits}
Inc(maxVertex, 2);
if (maxVertex div 2) > Width then {correct to Width}
maxVertex := 2 * Width;
end;
 
{pocet pixlu mezi ploskami}
if not DoY then
begin
repeat
if (Height mod (maxVertex div 2)) <> 0 then
Inc(maxVertex, 2);
maxPix := Height div (maxVertex div 2);
until (Height mod (maxVertex div 2)) = 0;
{krok k nastaveni vertexu}
VStep := (FY2 - FY1) / (maxVertex div 2);
end
else
begin
repeat
if (Width mod (maxVertex div 2)) <> 0 then
Inc(maxVertex, 2);
maxPix := Width div (maxVertex div 2);
until (Width mod (maxVertex div 2)) = 0;
{krok k nastaveni vertexu}
VStep := (FX2 - FX1) / (maxVertex div 2);
end;
//prostor
{$IFDEF VER4UP}
SetLength(SVertex, maxVertex);
{$ELSE}
SVertex := AllocMem(maxVertex * SizeOf(TD3DTLVERTEX));
try
{$ENDIF}
//inicializace
VStepVx := 0;
VStepTo := 0;
D := ph / (128 / PI); {shift wave}
Z := (Len / 2) / PI; {wave length to radians}
clr := D2DVertColor(Effect, Alpha); //effect cumulate to one param and one line of code
{vlastni nastaveni vertexu v pasu vertexu}
for I := 0 to maxVertex - 1 do
begin
SVertex[I].Specular := D3DRGB(1.0, 1.0, 1.0);
SVertex[I].rhw := 1.0;
SVertex[I].color := clr;
if not DoY then
case (I + 1) mod 2 of //triangle driver
1: begin
if I <> 0 then Inc(VStepVx, maxPix);
SVertex[I].sx := X + Trunc(amp * Sin((Y + VStepVx) / Z + D)) - 0.5; //levy
SVertex[I].sy := Y + VStepVx - 0.5;
if FMirrorFlipSet = [rmfMirror] then
begin
X1 := FX2; if I <> 0 then VStepTo := VStepTo + VStep;
Y1 := FY1 + VStepTo;
end
else
if FMirrorFlipSet = [rmfFlip] then
begin
X1 := FX1;
Y1 := FY2 - VStepTo;
end
else
if FMirrorFlipSet = [rmfMirror, rmfFlip] then
begin
X1 := FX2;
Y1 := FY2 - VStepTo;
end
else
begin
X1 := FX1; if I <> 0 then VStepTo := VStepTo + VStep;
Y1 := FY1 + VStepTo;
end;
SVertex[I].tu := X1;
SVertex[I].tv := Y1;
end;
0: begin
SVertex[I].sx := X + Width + Trunc(amp * Sin((Y + VStepVx) / Z + D)) - 1; //pravy
SVertex[I].sy := Y + VStepVx;
if FMirrorFlipSet = [rmfMirror] then
begin
X2 := FX1;
Y2 := FY1 + VStepTo;
end
else
if FMirrorFlipSet = [rmfFlip] then
begin
X2 := FX2;
Y2 := FY2 - VStepTo; if I <> 0 then VStepTo := VStepTo + VStep;
end
else
if FMirrorFlipSet = [rmfMirror, rmfFlip] then
begin
X2 := FX1;
Y2 := FY2 - VStepTo; if I <> 0 then VStepTo := VStepTo + VStep;
end
else
begin
X2 := FX2;
Y2 := FY1 + VStepTo;
end;
SVertex[I].tu := X2;
SVertex[I].tv := Y2;
end;
end {case}
else
case (I + 1) mod 2 of //triangle driver
0: begin
if I <> 0 then Inc(VStepVx, maxPix);
SVertex[I].sy := Y + Trunc(amp * Sin((X + VStepVx) / Z + D)) - 0.5; //hore
SVertex[I].sx := X + VStepVx - 0.5;
if FMirrorFlipSet = [rmfMirror] then
begin
Y1 := FY1; if I <> 0 then VStepTo := VStepTo + VStep;
X1 := FX2 - VStepTo;
end
else
if FMirrorFlipSet = [rmfFlip] then
begin
Y1 := FY2; if I <> 0 then VStepTo := VStepTo + VStep;
X1 := FX1 + VStepTo;
end
else
if FMirrorFlipSet = [rmfMirror, rmfFlip] then
begin
Y1 := FY2; if I <> 0 then VStepTo := VStepTo + VStep;
X1 := FX2 - VStepTo;
end
else
begin
Y1 := FY1; if I <> 0 then VStepTo := VStepTo + VStep;
X1 := FX1 + VStepTo;
end;
SVertex[I].tu := X1;
SVertex[I].tv := Y1;
end;
1: begin
SVertex[I].sy := Y + Height + Trunc(amp * Sin((X + VStepVx) / Z + D)) - 1; //dole
SVertex[I].sx := X + VStepVx;
if FMirrorFlipSet = [rmfMirror] then
begin
Y2 := FY2;
X2 := FX2 - VStepTo;
end
else
if FMirrorFlipSet = [rmfFlip] then
begin
Y2 := FY1;
X2 := FX1 + VStepTo;
end
else
if FMirrorFlipSet = [rmfMirror, rmfFlip] then
begin
Y2 := FY1;
X2 := FX2 - VStepTo;
end
else
begin
Y2 := FY2;
X2 := FX1 + VStepTo;
end;
SVertex[I].tu := X2;
SVertex[I].tv := Y2;
end;
end;
end;
{set of effect}
case Effect of
rtDraw: D2DEffectSolid;
rtBlend: D2DEffectBlend;
rtAdd: D2DEffectAdd;
rtSub: D2DEffectSub;
end;
with FDDraw.D3DDevice7 do
begin
{kreslime hned zde}//render now and here
Result := DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, SVertex[0], maxVertex, D3DDP_WAIT) = DD_OK;
//zpet hodnoty
//FIX InitVertex;
FMirrorFlipSet := []; {only for one operation, back to normal position}
{restore device status}
RenderError := SetTextureStageState(1, D3DTSS_COLOROP, Ord(D3DTOP_DISABLE)) <> DD_OK;
RenderError := SetTextureStageState(1, D3DTSS_ALPHAOP, Ord(D3DTOP_DISABLE)) <> DD_OK;
RenderError := SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0) <> DD_OK;
end;
{$IFNDEF VER4UP}
finally
FreeMem(SVertex, maxVertex * SizeOf(TD3DTLVERTEX));
end;
{$ENDIF}
end;
 
function TD2D.D2DRenderWaveX(Image: TPictureCollectionItem; X, Y, Width,
Height, PatternIndex: Integer; RenderType: TRenderType; transparent: Boolean;
amp, Len, ph, Alpha: Integer): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{load textures and map, do make wave mesh and render it}
Result := D2DMeshMapToWave(Image.PatternSurfaces[PatternIndex], transparent,
Image.FTransparentColor, X, Y, Width, Height, PatternIndex,
Image.PatternRects[PatternIndex],
amp, Len, ph, Alpha, RenderType{$IFNDEF VER4UP}, False{$ENDIF});
end;
 
function TD2D.D2DRenderWaveXDDS(Source: TDirectDrawSurface; X, Y, Width,
Height: Integer; RenderType: TRenderType; Transparent: Boolean; Amp, Len, Ph, Alpha: Integer): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{load textures and map, do make wave mesh and render it}
Result := D2DMeshMapToWave(Source, transparent, -1, X, Y, Width, Height, -1,
ZeroRect,
amp, Len, ph, Alpha, RenderType{$IFNDEF VER4UP}, False{$ENDIF});
end;
 
function TD2D.D2DRenderWaveY(Image: TPictureCollectionItem; X, Y, Width,
Height, PatternIndex: Integer; RenderType: TRenderType; Transparent: Boolean;
Amp, Len, Ph, Alpha: Integer): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{load textures and map, do make wave mesh and render it}
Result := D2DMeshMapToWave(Image.PatternSurfaces[PatternIndex], transparent,
Image.FTransparentColor, X, Y, Width, Height, PatternIndex,
Image.PatternRects[PatternIndex],
amp, Len, ph, Alpha, RenderType, True);
end;
 
function TD2D.D2DRenderWaveYDDS(Source: TDirectDrawSurface; X, Y, Width,
Height: Integer; RenderType: TRenderType; Transparent: Boolean;
Amp, Len, Ph, Alpha: Integer): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{load textures and map, do make wave mesh and render it}
Result := D2DMeshMapToWave(Source, transparent, -1, X, Y, Width, Height, -1,
ZeroRect,
amp, Len, ph, Alpha, RenderType, True);
end;
 
function TD2D.D2DTexturedOnRect(Rect: TRect; Color: LongInt): Boolean;
var I: Integer;
begin
Result := False;
FDDraw.D3DDevice7.SetTexture(0, nil);
if not FD2DTexture.{$IFDEF VER4UP}CanFindTexture{$ELSE}CanFindTexture3{$ENDIF}(Color) then {when no texture in list try load it}
if not FD2DTexture.{$IFDEF VER4UP}LoadTextures{$ELSE}LoadTextures4{$ENDIF}(Color) then Exit; {on error occurr go out}
I := FD2DTexture.Find('$' + IntToStr(Color)); //simply .. but stupid
if I = -1 then Exit;
{set pattern as texture}
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MAGFILTER, DWord(Ord(FD2DTextureFilter)+1));
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MINFILTER, DWord(Ord(FD2DTextureFilter)+1));
try
RenderError := FDDraw.D3DDevice7.SetTexture(0, FD2DTexture.Texture[I].D2DTexture.Surface.IDDSurface7) <> DD_OK;
except
RenderError := True;
FD2DTexture.D2DPruneAllTextures;
exit;
end;
{set transparent part}
FDDraw.D3DDevice7.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, 0); //no transparency
 
D2DTU(FD2DTexture.Texture[I]);
Result := not RenderError;
end;
 
function TD2D.D2DTexturedOnSubRect(Image: TPictureCollectionItem;
Pattern: Integer; SubPatternRect, SubRect: TRect; RenderType: TRenderType;
Alpha: Byte): Boolean;
label
lblHop;
var
I, W, H: Integer;
SrcX, SrcY, diffX: Double;
R, tmpSubRect: TRect;
Q: TTextureRec;
qFloatX1, qFloatX2, qFloatY1, qFloatY2: Double;
begin
Result := False;
FDDraw.D3DDevice7.SetTexture(0, nil);
if not FD2DTexture.CanFindTexture(Image) then {when no texture in list try load it}
if not FD2DTexture.LoadTextures(Image) then {loading is here}
Exit; {on error occurr out}
I := FD2DTexture.Find(Image.Name);
if I = -1 then Exit;
{set pattern as texture}
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MAGFILTER, DWord(Ord(FD2DTextureFilter)+1));
// FDDraw.D3DDevice7.SetTextureStageState(0, D3DTSS_MINFILTER, DWord(Ord(FD2DTextureFilter)+1));
try
FDDraw.D3DDevice7.SetTexture(0, FD2DTexture.Texture[I].D2DTexture.Surface.IDDSurface7);
case RenderType of
rtDraw: begin D2DEffectSolid; D2DWhite; end;
rtBlend: begin D2DEffectBlend; D2DAlphaVertex(Alpha); end;
rtAdd: begin D2DEffectAdd; D2DFade(Alpha); end;
rtSub: begin D2DEffectSub; D2DFade(Alpha); end;
end;
except
RenderError := true;
FD2DTexture.D2DPruneAllTextures;
Image.Restore;
SetD2DTextureFilter(D2D_LINEAR);
Exit;
end;
{set transparent part}
FDDraw.D3DDevice7.SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, Ord(FD2DTexture.Texture[I].D2DTexture.Transparent));
{except for Draw when alphachannel exists}
{change for blend drawing but save transparent area still}
if FD2DTexture.Texture[I].AlphaChannel then
{when is Draw selected then}
if RenderType = rtDraw then
begin
D2DEffectBlend; D2DAlphaVertex($FF);
end;
{pokud je obrazek rozdeleny, nastav oka site}
if (Image.PatternHeight <> 0) or (Image.PatternWidth <> 0) then
begin
{vezmi rect jenom dilku}
R := Image.PatternRects[Pattern];
 
if not CompareMem(@SubRect, @ZeroRect, SizeOf(SubRect)) then
begin
{ktere oko site to je?}
W := SubRect.Right - SubRect.Left; {takhle je siroky}
H := SubRect.Bottom - SubRect.Top; {takhle je vysoky}
tmpSubRect := Bounds(R.Left + SubRect.Left, R.Top + SubRect.Top, W, H);
if RectInRect(tmpSubRect, R) then
begin
{pokud je subrect jeste v ramci patternu, musi se posouvat podle patternindex}
Inc(R.Left, SubRect.Left);
Inc(R.Top, SubRect.Top);
if (R.Left + W) < R.Right then R.Right := R.Left + W;
if (R.Top + H) < R.Bottom then R.Bottom := R.Top + H;
goto lblHop;
end;
end;
SrcX := 1 / FD2DTexture.Texture[I].Width;
SrcY := 1 / FD2DTexture.Texture[I].Height;
//namapovani vertexu na texturu
FD2DTexture.Texture[I].FloatX1 := SrcX * R.Left;
FD2DTexture.Texture[I].FloatY1 := SrcY * R.Top;
{for meshed subimage contain one image only can be problem there}
diffX := 0.5; if Image.PatternCount = 1 then diffX := 0;
FD2DTexture.Texture[I].FloatX2 := SrcX * (R.Right - diffX);
FD2DTexture.Texture[I].FloatY2 := SrcY * (R.Bottom - diffX);
if not (
(SubPatternRect.Left = Image.PatternRects[Pattern].Left) and
(SubPatternRect.Top = Image.PatternRects[Pattern].Top) and
(SubPatternRect.Right = Image.PatternRects[Pattern].Right) and
(SubPatternRect.Bottom = Image.PatternRects[Pattern].Bottom))
then
begin
{remaping subtexture via subpattern}
Q.FloatX1 := SrcX * SubPatternRect.Left;
Q.FloatY1 := SrcY * SubPatternRect.Top;
Q.FloatX2 := SrcX * (SubPatternRect.Right - diffX);
Q.FloatY2 := SrcY * (SubPatternRect.Bottom - diffX);
D2DTU(Q); {with mirroring/flipping}
Result := True;
Exit;
end;
end; {jinak celeho obrazku}
 
if not CompareMem(@SubRect, @ZeroRect, SizeOf(SubRect)) then
if RectInRect(SubRect, Bounds(0,0, FD2DTexture.Texture[I].Width, FD2DTexture.Texture[I].Height)) then
begin
R := SubRect;
lblHop:
SrcX := 1 / FD2DTexture.Texture[I].Width;
SrcY := 1 / FD2DTexture.Texture[I].Height;
//namapovani vertexu na texturu
qFloatX1 := FD2DTexture.Texture[I].FloatX1;
qFloatY1 := FD2DTexture.Texture[I].FloatY1;
qFloatX2 := FD2DTexture.Texture[I].FloatX2;
qFloatY2 := FD2DTexture.Texture[I].FloatY2;
try
FD2DTexture.Texture[I].FloatX1 := SrcX * R.Left;
FD2DTexture.Texture[I].FloatY1 := SrcY * R.Top;
{for meshed subimage contain one image only can be problem there}
diffX := 0.5; if Image.PatternCount = 1 then diffX := 0;
FD2DTexture.Texture[I].FloatX2 := SrcX * (R.Right - diffX);
FD2DTexture.Texture[I].FloatY2 := SrcY * (R.Bottom - diffX);
{remaping subtexture via subpattern}
D2DTU(FD2DTexture.Texture[I]); {with mirroring/flipping}
Result := True;
Exit;
finally
FD2DTexture.Texture[I].FloatX1 := qFloatX1;
FD2DTexture.Texture[I].FloatY1 := qFloatY1;
FD2DTexture.Texture[I].FloatX2 := qFloatX2;
FD2DTexture.Texture[I].FloatY2 := qFloatY2;
end;
end;
 
{ X1,Y1 X2,Y1
0 +-----------------+ 1
| |
| |
| |
| |
2 +-----------------+ 3
X1,Y2 X2,Y2 }
D2DTU(FD2DTexture.Texture[I]);
Result := True;
end;
 
function TD2D.D2DRenderColoredPartition(Image: TPictureCollectionItem;
DestRect: TRect;
PatternIndex, Color, Specular: Integer;
Faded: Boolean;
SourceRect: TRect;
RenderType: TRenderType;
Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{set of effect before fade}
case RenderType of
rtDraw: D2DEffectSolid;
rtBlend: D2DEffectBlend;
rtAdd: D2DEffectAdd;
rtSub: D2DEffectSub;
end;
if Faded then D2DFade(Alpha);
 
D2DColoredVertex(Color);
if Specular <> Round(D3DRGB(1.0, 1.0, 1.0)) then
D2DSpecularVertex(Specular);
{load textures and map it}
if D2DTexturedOn(Image, PatternIndex, SourceRect, RenderType, Alpha) then
begin
D2DRect(DestRect);
{render it}
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderFillRect(Rect: TRect; RGBColor: LongInt;
RenderType: TRenderType; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
case RenderType of
rtDraw: begin D2DEffectSolid; D2DColoredVertex(RGBColor); end;
rtBlend: begin D2DEffectBlend; D2DAlphaVertex(Alpha); end;
rtAdd: begin D2DEffectAdd; D2DFade(Alpha); end;
rtSub: begin D2DEffectSub; D2DFade(Alpha); end;
end;
if D2DTexturedOnRect(Rect, RGBColor) then
begin
D2DRect(Rect);
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderRotateModeCol(Image: TPictureCollectionItem;
RenderType: TRenderType;
RotX, RotY, PictWidth, PictHeight, PatternIndex: Integer; CenterX,
CenterY: Double; Angle: single; Color: Integer; Alpha: Byte): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{set of effect before colored}
case RenderType of
rtDraw: D2DEffectSolid;
rtAdd: D2DEffectAdd;
rtSub: D2DEffectSub;
rtBlend: D2DEffectBlend;
end;
D2DFadeColored(Color, Alpha);
{load textures and map it}
if D2DTexturedOn(Image, PatternIndex, Image.PatternRects[PatternIndex], RenderType, Alpha) then
begin
{do rotate mesh}
D2DRotate(RotX, RotY, PictWidth, PictHeight, CenterX, CenterY, Angle);
{render it}
Result := RenderQuad;
end;
end;
 
function TD2D.D2DRenderRotateModeColDDS(Image: TDirectDrawSurface;
RotX, RotY, PictWidth, PictHeight: Integer; RenderType: TRenderType;
CenterX, CenterY: Double; Angle: Single; Color: Integer; Alpha: Byte;
Transparent: Boolean): Boolean;
begin
Result := False; if not CanUseD2D then Exit;
{set of effect}
D2DFadeColored(Color, Alpha);
{load textures and map it}
if D2DTexturedOnDDS(Image, ZeroRect, Transparent, RenderType, Alpha) then
begin
{do rotate mesh}
D2DRotate(RotX, RotY, PictWidth, PictHeight, CenterX, CenterY, Angle);
{render it}
Result := RenderQuad;
end;
end;
 
procedure TD2D.D2DEffectSolid;
begin
with FDDraw.D3DDevice7 do
begin
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0);
//SetRenderState(D3DRENDERSTATE_FILLMODE, Integer(D3DFILL_SOLID));
SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, Integer(True));
SetRenderState(D3DRENDERSTATE_SRCBLEND, Integer(D3DBLEND_ONE));
end;
end;
 
procedure TD2D.D2DEffectBlend;
begin
with FDDraw.D3DDevice7 do
begin
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1);
SetRenderState(D3DRENDERSTATE_SRCBLEND, Integer(D3DBLEND_SRCALPHA));
SetRenderState(D3DRENDERSTATE_DESTBLEND, Integer(D3DBLEND_INVSRCALPHA));
 
SetTextureStageState(0, D3DTSS_COLOROP, Integer(D3DTOP_MODULATE));
SetTextureStageState(0, D3DTSS_COLORARG1, Integer(D3DTA_TEXTURE));
SetTextureStageState(0, D3DTSS_COLORARG2, Integer(D3DTA_CURRENT));
 
SetTextureStageState(0, D3DTSS_ALPHAOP, Integer(D3DTOP_BLENDDIFFUSEALPHA));
SetTextureStageState(0, D3DTSS_ALPHAARG1, Integer(D3DTA_TEXTURE));
SetTextureStageState(0, D3DTSS_ALPHAARG2, Integer(D3DTA_CURRENT));
 
SetTextureStageState(0, D3DTSS_ALPHAOP, Integer(D3DTOP_MODULATE));
end;
end;
 
procedure TD2D.D2DEffectAdd;
begin
with FDDraw.D3DDevice7 do
begin
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1);
SetRenderState(D3DRENDERSTATE_SRCBLEND, Integer(D3DBLEND_ONE));
SetRenderState(D3DRENDERSTATE_DESTBLEND, Integer(D3DBLEND_ONE));
SetTextureStageState(0, D3DTSS_ALPHAOP, Ord(D3DTOP_SELECTARG1));
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
SetTextureStageState(0, D3DTSS_ALPHAOP, Integer(D3DTOP_MODULATE));
end;
end;
 
procedure TD2D.D2DEffectSub;
begin
with FDDraw.D3DDevice7 do
begin
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 1);
SetRenderState(D3DRENDERSTATE_SRCBLEND, Integer(D3DBLEND_ZERO));
SetRenderState(D3DRENDERSTATE_DESTBLEND, Integer(D3DBLEND_INVSRCCOLOR));
SetTextureStageState(0, D3DTSS_ALPHAOP, Ord(D3DTOP_SELECTARG1));
SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
SetTextureStageState(0, D3DTSS_ALPHAOP, Integer(D3DTOP_MODULATE));
end;
end;
 
function TD2D.D2DAlphaVertex(Alpha: Integer): Integer;
begin
Result := RGBA_MAKE($FF, $FF, $FF, Alpha);
FVertex[0].Color := Result;
FVertex[1].Color := Result;
FVertex[2].Color := Result;
FVertex[3].Color := Result;
end;
 
procedure TD2D.D2DColoredVertex(C: Integer);
begin
C := D3DRGB(C and $FF / 255, (C shr 8) and $FF / 255, (C shr 16) and $FF / 255);
FVertex[0].Color := C;
FVertex[1].Color := C;
FVertex[2].Color := C;
FVertex[3].Color := C;
end;
 
procedure TD2D.D2DColAlpha(C, Alpha: Integer);
begin
C := D3DRGBA(C and $FF / 255, (C shr 8) and $FF / 255, (C shr 16) and $FF / 255, Alpha / 255);
FVertex[0].Color := C;
FVertex[1].Color := C;
FVertex[2].Color := C;
FVertex[3].Color := C;
end;
 
procedure TD2D.D2DSpecularVertex(C: Integer);
begin
C := D3DRGB(C and $FF / 255, (C shr 8) and $FF / 255, (C shr 16) and $FF / 255);
FVertex[0].Specular := C;
FVertex[1].Specular := C;
FVertex[2].Specular := C;
FVertex[3].Specular := C;
end;
 
procedure TD2D.D2DCol4Alpha(C1, C2, C3, C4, Alpha: Integer);
begin
FVertex[0].Color := D3DRGBA(C1 and $FF / 255, (C1 shr 8) and $FF / 255,
(C1 shr 16) and $FF / 255, Alpha / 255);
FVertex[1].Color := D3DRGBA(C2 and $FF / 255, (C2 shr 8) and $FF / 255,
(C2 shr 16) and $FF / 255, Alpha / 255);
FVertex[2].Color := D3DRGBA(C3 and $FF / 255, (C3 shr 8) and $FF / 255,
(C3 shr 16) and $FF / 255, Alpha / 255);
FVertex[3].Color := D3DRGBA(C4 and $FF / 255, (C4 shr 8) and $FF / 255,
(C4 shr 16) and $FF / 255, Alpha / 255);
end;
 
function TD2D.D2DVertColor(RenderType: TRenderType; Alpha: Byte): DWORD;
begin
case RenderType of //effect cumulate to one param and four line of code
rtDraw: Result := RGB_MAKE($FF, $FF, $FF);
rtBlend: Result := RGBA_MAKE($FF, $FF, $FF, Alpha);
rtAdd: Result := RGB_MAKE(Alpha, Alpha, Alpha);
rtSub: Result := RGB_MAKE(Alpha, Alpha, Alpha);
else
Result := RGB_MAKE($FF, $FF, $FF);
end;
end;
 
function TD2D.D2DWhite: Integer;
begin
Result := RGB_MAKE($FF, $FF, $FF);
FVertex[0].Color := Result;
FVertex[1].Color := Result;
FVertex[2].Color := Result;
FVertex[3].Color := Result;
end;
 
function TD2D.D2DFade(Alpha: Integer): Integer;
begin
Result := RGB_MAKE(Alpha, Alpha, Alpha);
FVertex[0].Color := Result;
FVertex[1].Color := Result;
FVertex[2].Color := Result;
FVertex[3].Color := Result;
end;
 
procedure TD2D.D2DFadeColored(C, Alpha: Integer);
var mult: single;
begin
mult := Alpha / 65025; //Alpha/255/255;
C := D3DRGB((C and $FF) * mult, ((C shr 8) and $FF) * mult, ((C shr 16) and $FF) * mult);
FVertex[0].Color := C;
FVertex[1].Color := C;
FVertex[2].Color := C;
FVertex[3].Color := C;
end;
 
procedure TD2D.D2DFade4Colored(C1, C2, C3, C4, Alpha: Integer);
var mult: single;
begin
mult := Alpha / 65025; //Alpha/255/255;
FVertex[0].Color := D3DRGB((C1 and $FF) * mult, ((C1 shr 8) and $FF) * mult,
((C1 shr 16) and $FF) * mult);
FVertex[1].Color := D3DRGB((C2 and $FF) * mult, ((C2 shr 8) and $FF) * mult,
((C2 shr 16) and $FF) * mult);
FVertex[2].Color := D3DRGB((C3 and $FF) * mult, ((C3 shr 8) and $FF) * mult,
((C3 shr 16) and $FF) * mult);
FVertex[3].Color := D3DRGB((C4 and $FF) * mult, ((C4 shr 8) and $FF) * mult,
((C4 shr 16) and $FF) * mult);
end;
 
function TD2D.RenderQuad: Boolean;
begin
Result := FDDraw.D3DDevice7.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, FVertex, 4, D3DDP_WAIT) <> DD_OK;
InitVertex;
FMirrorFlipSet := []; {only for one operation, back to normal position}
{restore device status}
with FDDraw.D3DDevice7 do
begin
SetTextureStageState(1, D3DTSS_COLOROP, Ord(D3DTOP_DISABLE));
SetTextureStageState(1, D3DTSS_ALPHAOP, Ord(D3DTOP_DISABLE));
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0);
end;
end;
 
function TD2D.RenderTri: Boolean;
begin
Result := FDDraw.D3DDevice7.DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, FVertex, 3, D3DDP_WAIT) <> DD_OK;
InitVertex;
FMirrorFlipSet := []; {only for one operation, back to normal position}
{restore device status}
with FDDraw.D3DDevice7 do
begin
SetTextureStageState(1, D3DTSS_COLOROP, Ord(D3DTOP_DISABLE));
SetTextureStageState(1, D3DTSS_ALPHAOP, Ord(D3DTOP_DISABLE));
SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, 0);
end;
end;
 
procedure TD2D.D2DMeshMapToRect(R: TRect);
begin
FVertex[0].sx := R.Left - 0.5;
FVertex[0].sy := R.Top - 0.5;
FVertex[1].sx := R.Right - 0.5;
FVertex[1].sy := R.Top - 0.5;
FVertex[2].sx := R.Left - 0.5;
FVertex[2].sy := R.Bottom - 0.5;
FVertex[3].sx := R.Right - 0.5;
FVertex[3].sy := R.Bottom - 0.5;
end;
 
function TD2D.D2DInitializeSurface: Boolean;
begin
Result := False;
if Assigned(FDDraw.D3DDevice7) then
Result := FDDraw.D3DDevice7.SetRenderTarget(FDDraw.Surface.IDDSurface7, 0) = DD_OK;
end;
 
procedure TD2D.D2DUpdateTextures;
var I: Integer;
begin
{$IFDEF VER4UP}
for I := Low(FD2DTexture.Texture) to High(FD2DTexture.Texture) do
{$ELSE}
for I := 0 to FD2DTexture.TexLen - 1 do
{$ENDIF}
begin
FD2DTexture.Texture[I].Width := FD2DTexture.Texture[I].D2DTexture.Surface.Width;
FD2DTexture.Texture[I].Height := FD2DTexture.Texture[I].D2DTexture.Surface.Height;
// FD2DTexture.Texture[I].AlphaChannel := ?
end;
end;
 
{ TTrace }
 
constructor TTrace.Create(Collection: TCollection);
begin
inherited Create(Collection);
FBlit := TBlit.Create(Self);
FBlit.FEngine := TCustomDXDraw(Traces.FOwner);
end;
 
destructor TTrace.Destroy;
begin
FBlit.Free;
inherited Destroy;
end;
 
function TTrace.GetDisplayName: string;
begin
Result := inherited GetDisplayName
end;
 
procedure TTrace.SetDisplayName(const Value: string);
begin
if (Value <> '') and (AnsiCompareText(Value, GetDisplayName) <> 0) and
(Collection is TTraces) and (TTraces(Collection).IndexOf(Value) >= 0) then
raise Exception.Create(Format('Item duplicate name "%s" error', [Value]));
inherited SetDisplayName(Value);
end;
 
function TTrace.GetTraces: TTraces;
begin
if Collection is TTraces then
Result := TTraces(Collection)
else
Result := nil;
end;
 
procedure TTrace.Render(const LagCount: Integer);
begin
FBlit.DoMove(LagCount);
FBlit.DoCollision;
FBlit.DoDraw;
if Assigned(FBlit.FOnRender) then
FBlit.FOnRender(FBlit);
end;
 
function TTrace.IsActualized: Boolean;
begin
Result := FActualized;
end;
 
procedure TTrace.Assign(Source: TPersistent);
begin
if Source is TTrace then begin
//FTracePoints.Assign(TTrace(Source).FTracePoints);
FBlit.Assign(TTrace(Source).FBlit);
FTag := TTrace(Source).FTag;
end
else
inherited Assign(Source);
end;
 
function TTrace.GetActive: Boolean;
begin
Result := FBlit.FActive;
end;
 
procedure TTrace.SetActive(const Value: Boolean);
begin
FBlit.FActive := Value;
end;
 
function TTrace.GetOnCollision: TNotifyEvent;
begin
Result := FBlit.FOnCollision;
end;
 
procedure TTrace.SetOnCollision(const Value: TNotifyEvent);
begin
FBlit.FOnCollision := Value;
end;
 
function TTrace.GetOnGetImage: TNotifyEvent;
begin
Result := FBlit.FOnGetImage;
end;
 
procedure TTrace.SetOnGetImage(const Value: TNotifyEvent);
begin
FBlit.FOnGetImage := Value;
end;
 
function TTrace.GetOnDraw: TNotifyEvent;
begin
Result := FBlit.FOnDraw;
end;
 
procedure TTrace.SetOnDraw(const Value: TNotifyEvent);
begin
FBlit.FOnDraw := Value;
end;
 
function TTrace.GetOnMove: TBlitMoveEvent;
begin
Result := FBlit.FOnMove;
end;
 
procedure TTrace.SetOnMove(const Value: TBlitMoveEvent);
begin
FBlit.FOnMove := Value;
end;
 
function TTrace.Clone(NewName: string; OffsetX, OffsetY: Integer;
Angle: Single): TTrace;
var
NewItem: TTrace;
I: Integer;
begin
NewItem := GetTraces.Add;
NewItem.Assign(Self);
NewItem.Name := NewName;
for I := 0 to NewItem.Blit.GetPathCount - 1 do begin
NewItem.Blit.FPathArr[I].X := NewItem.Blit.FPathArr[I].X + OffsetX;
NewItem.Blit.FPathArr[I].Y := NewItem.Blit.FPathArr[I].Y + OffsetY;
end;
Result := NewItem
end;
 
function TTrace.GetOnRender: TOnRender;
begin
Result := FBlit.FOnRender;
end;
 
procedure TTrace.SetOnRender(const Value: TOnRender);
begin
FBlit.FOnRender := Value;
end;
 
{ TTraces }
 
constructor TTraces.Create(AOwner: TComponent);
begin
inherited Create(TTrace);
FOwner := AOwner;
end;
 
destructor TTraces.Destroy;
begin
inherited Destroy;
end;
 
function TTraces.Add: TTrace;
begin
Result := TTrace(inherited Add);
end;
 
function TTraces.Find(const Name: string): TTrace;
var
i: Integer;
begin
i := IndexOf(Name);
if i = -1 then
raise EDXTracerError.CreateFmt('Tracer item named %s not found', [Name]);
Result := Items[i];
end;
 
function TTraces.GetItem(Index: Integer): TTrace;
begin
Result := TTrace(inherited GetItem(Index));
end;
 
procedure TTraces.SetItem(Index: Integer;
Value: TTrace);
begin
inherited SetItem(Index, Value);
end;
 
procedure TTraces.Update(Item: TCollectionItem);
begin
inherited Update(Item);
end;
 
{$IFDEF VER4UP}
function TTraces.Insert(Index: Integer): TTrace;
begin
Result := TTrace(inherited Insert(Index));
end;
{$ENDIF}
 
function TTraces.GetOwner: TPersistent;
begin
Result := FOwner;
end;
 
{ TBlit }
 
function TBlit.GetWorldX: Double;
begin
if Parent <> nil then
Result := Parent.WorldX + FBlitRec.FX
else
Result := FBlitRec.FX;
end;
 
function TBlit.GetWorldY: Double;
begin
if Parent <> nil then
Result := Parent.WorldY + FBlitRec.FY
else
Result := FBlitRec.FY;
end;
 
procedure TBlit.DoMove(LagCount: Integer);
var
MoveIt: Boolean;
begin
if not FBlitRec.FMoved then Exit;
if AsSigned(FOnMove) then begin
MoveIt := True; {if nothing then reanimate will force}
FOnMove(Self, LagCount, MoveIt); {when returned MoveIt = true still that do not move}
if MoveIt then
ReAnimate(LagCount); //for reanimation
end
else begin
ReAnimate(LagCount);
end;
{there is moving to next foot of the path}
if Active then
if GetPathCount > 0 then begin
Dec(FCurrentTime, LagCount);
if FCurrentTime < 0 then begin
if FBustrofedon then begin
case FCurrentDirection of
True: begin
Inc(FCurrentPosition); //go forward
if FCurrentPosition = (GetPathCount - 1) then
FCurrentDirection := not FCurrentDirection //change direction
end;
False: begin
Dec(FCurrentPosition); //go backward
if FCurrentPosition = 0 then
FCurrentDirection := not FCurrentDirection //change direction
end;
end;
end
else
if FCurrentPosition < (GetPathCount - 1) then begin
Inc(FCurrentPosition) //go forward only
end
else
if FMovingRepeatly then
FCurrentPosition := 0; {return to start}
{get actual new value for showing time}
{must be pick-up there, after change of the current position}
FCurrentTime := Path[FCurrentPosition].StayOn; {cas mezi pohyby}
end;
X := Path[FCurrentPosition].X;
Y := Path[FCurrentPosition].Y;
end;
{}
end;
 
function TBlit.GetDrawImageIndex: Integer;
begin
Result := FBlitRec.FAnimStart + Trunc(FBlitRec.FAnimPos);
end;
 
procedure TBlit.DoDraw;
var
f: TRenderMirrorFlipSet;
r: TRect;
begin
with FBlitRec do begin
if not FVisible then Exit;
if FImage = nil then DoGetImage;
if FImage = nil then Exit;
{owner draw called here}
if AsSigned(FOnDraw) then
FOnDraw(Self)
else
{when is not owner draw then go here}
begin
f := [];
if FMirror then f := f + [rmfMirror];
if FFlip then f := f + [rmfFlip];
r := Bounds(Round(FX), Round(FY), FImage.Width, FImage.Height);
DXDraw_Render(FEngine, FImage, r,
GetDrawImageIndex, FBlurImageArr, FBlurImage, FTextureFilter, f, FBlendMode, FAngle,
FAlpha, FCenterX, FCenterY, FScale, FWaveType, FAmplitude, FAmpLength, FPhase);
end;
end
end;
 
function Mod2f(i: Double; i2: Integer): Double;
begin
if i2 = 0 then
Result := i
else
begin
Result := i - Round(i / i2) * i2;
if Result < 0 then
Result := i2 + Result;
end;
end;
 
procedure TBlit.ReAnimate(MoveCount: Integer);
var I: Integer;
begin
with FBlitRec do begin
FAnimPos := FAnimPos + FAnimSpeed * MoveCount;
 
if FAnimLooped then
begin
if FAnimCount > 0 then
FAnimPos := Mod2f(FAnimPos, FAnimCount)
else
FAnimPos := 0;
end
else
begin
if Round(FAnimPos) >= FAnimCount then
begin
FAnimPos := FAnimCount - 1;
FAnimSpeed := 0;
end;
if FAnimPos < 0 then
begin
FAnimPos := 0;
FAnimSpeed := 0;
end;
end;
{incerease or decrease speed}
if (FEnergy <> 0) then begin
FSpeedX := FSpeedX + FSpeedX * FEnergy;
FSpeedY := FSpeedY + FSpeedY * FEnergy;
end;
{adjust with speed}
if (FSpeedX > 0) or (FSpeedY > 0) then begin
FX := FX + FSpeedX * MoveCount;
FY := FY + FSpeedY * MoveCount;
end;
{and gravity aplicable}
if (FGravityX > 0) or (FGravityY > 0) then begin
FX := FX + FGravityX * MoveCount;
FY := FY + FGravityY * MoveCount;
end;
if FBlurImage then begin
{ale jen jsou-li jine souradnice}
if (FBlurImageArr[High(FBlurImageArr)].eX <> Round(WorldX)) or
(FBlurImageArr[High(FBlurImageArr)].eY <> Round(WorldY)) then begin
for i := Low(FBlurImageArr) + 1 to High(FBlurImageArr) do begin
FBlurImageArr[i - 1] := FBlurImageArr[i];
{adjust the blur intensity}
FBlurImageArr[i - 1].eIntensity := Round(FAlpha / (High(FBlurImageArr) + 1)) * (i - 1);
end;
with FBlurImageArr[High(FBlurImageArr)] do begin
eX := Round(WorldX);
eY := Round(WorldY);
ePatternIndex := GetDrawImageIndex;
eIntensity := Round(FAlpha / (High(FBlurImageArr) + 1)) * High(FBlurImageArr);
eBlendMode := FBlendMode;
eActive := True;
end;
end;
end;
end;
end;
 
function TBlit.DoCollision: TBlit;
var
i, maxzaxis: Integer;
begin
Result := nil;
if not FBlitRec.FCollisioned then Exit;
if AsSigned(FOnCollision) then
FOnCollision(Self)
else begin
{over z axis}
maxzaxis := 0;
for i := 0 to FEngine.Traces.Count - 1 do
maxzaxis := Max(maxzaxis, FEngine.Traces.Items[i].FBlit.Z);
{for all items}
for i := 0 to FEngine.Traces.Count - 1 do
{no self item}
if FEngine.Traces.Items[i].FBlit <> Self then
{through engine}
with FEngine.Traces.Items[i] do
{test overlap}
if OverlapRect(Bounds(Round(FBlit.WorldX), Round(FBlit.WorldY),
FBlit.Width, FBlit.Height), Bounds(Round(WorldX), Round(WorldY), Width, Height)) then
begin
{if any, then return first blit}
Result := FBlit;
{and go out}
Break;
end;
end;
end;
 
procedure TBlit.DoGetImage;
begin
{init image when object come from form}
if FImage = nil then
if AsSigned(FOnGetImage) then begin
FOnGetImage(Self);
if FImage = nil then
raise EDXBlitError.Create('Undefined image file!');
FBlitRec.FWidth := FImage.Width;
FBlitRec.FHeight := FImage.Height;
end;
end;
 
constructor TBlit.Create(AParent: TObject);
begin
inherited Create;
FParent := nil;
if AParent is TBlit then
FParent := TBlit(AParent);
FillChar(FBlitRec, SizeOf(FBlitRec), 0);
with FBlitRec do begin
FCollisioned := True; {can be collisioned}
FMoved := True; {can be moved}
FVisible := True; {can be rendered}
FAnimCount := 0;
FAnimLooped := False;
FAnimPos := 0;
FAnimSpeed := 0;
FAnimStart := 0;
FAngle := 0;
FAlpha := $FF;
FCenterX := 0.5;
FCenterY := 0.5;
FScale := 1;
FBlendMode := rtDraw;
FAmplitude := 0;
FAmpLength := 0;
FPhase := 0;
FWaveType := wtWaveNone;
FSpeedX := 0;
FSpeedY := 0;
FGravityX := 0;
FGravityY := 0;
FEnergy := 0;
FBlurImage := False;
FMirror := False;
FFlip := False;
end;
FillChar(FBlurImageArr, SizeOf(FBlitRec), 0);
FActive := True; {active on}
FMovingRepeatly := True;
{super private}
FCurrentTime := 0;
FCurrentPosition := 0;
FCurrentDirection := True;
end;
 
destructor TBlit.Destroy;
begin
{$IFDEF VER4UP}
SetLength(FPathArr, 0);
{$ELSE}
SetPathLen(0);
{$ENDIF}
inherited;
end;
 
function TBlit.GetMoved: Boolean;
begin
Result := FBlitRec.FMoved;
end;
 
procedure TBlit.SetMoved(const Value: Boolean);
begin
FBlitRec.FMoved := Value;
end;
 
function TBlit.GetWaveType: TWaveType;
begin
Result := FBlitRec.FWaveType;
end;
 
procedure TBlit.SetWaveType(const Value: TWaveType);
begin
FBlitRec.FWaveType := Value;
end;
 
function TBlit.GetAmplitude: Integer;
begin
Result := FBlitRec.FAmplitude;
end;
 
procedure TBlit.SetAmplitude(const Value: Integer);
begin
FBlitRec.FAmplitude := Value;
end;
 
function TBlit.GetAnimStart: Integer;
begin
Result := FBlitRec.FAnimStart;
end;
 
procedure TBlit.SetAnimStart(const Value: Integer);
begin
FBlitRec.FAnimStart := Value;
end;
 
function TBlit.GetAmpLength: Integer;
begin
Result := FBlitRec.FAmpLength;
end;
 
procedure TBlit.SetAmpLength(const Value: Integer);
begin
FBlitRec.FAmpLength := Value;
end;
 
function TBlit.GetWidth: Integer;
begin
Result := FBlitRec.FWidth;
end;
 
procedure TBlit.SetWidth(const Value: Integer);
begin
FBlitRec.FWidth := Value;
end;
 
function TBlit.GetGravityX: Single;
begin
Result := FBlitRec.FGravityX;
end;
 
procedure TBlit.SetGravityX(const Value: Single);
begin
FBlitRec.FGravityX := Value;
end;
 
function TBlit.StoreGravityX: Boolean;
begin
Result := FBlitRec.FGravityX <> 1.0;
end;
 
function TBlit.GetPhase: Integer;
begin
Result := FBlitRec.FPhase;
end;
 
procedure TBlit.SetPhase(const Value: Integer);
begin
FBlitRec.FPhase := Value;
end;
 
function TBlit.GetAnimPos: Double;
begin
Result := FBlitRec.FAnimPos;
end;
 
procedure TBlit.SetAnimPos(const Value: Double);
begin
FBlitRec.FAnimPos := Value;
end;
 
function TBlit.StoreAnimPos: Boolean;
begin
Result := FBlitRec.FAnimPos <> 0;
end;
 
function TBlit.GetFlip: Boolean;
begin
Result := FBlitRec.FFlip;
end;
 
procedure TBlit.SetFlip(const Value: Boolean);
begin
FBlitRec.FFlip := Value;
end;
 
function TBlit.GetGravityY: Single;
begin
Result := FBlitRec.FGravityY;
end;
 
procedure TBlit.SetGravityY(const Value: Single);
begin
FBlitRec.FGravityY := Value;
end;
 
function TBlit.StoreGravityY: Boolean;
begin
Result := FBlitRec.FGravityY <> 1.0;
end;
 
function TBlit.GetSpeedX: Single;
begin
Result := FBlitRec.FSpeedX;
end;
 
procedure TBlit.SetSpeedX(const Value: Single);
begin
FBlitRec.FSpeedX := Value;
end;
 
function TBlit.StoreSpeedX: Boolean;
begin
Result := FBlitRec.FSpeedX <> 0;
end;
 
function TBlit.GetSpeedY: Single;
begin
Result := FBlitRec.FSpeedY;
end;
 
procedure TBlit.SetSpeedY(const Value: Single);
begin
FBlitRec.FSpeedY := Value;
end;
 
function TBlit.StoreSpeedY: Boolean;
begin
Result := FBlitRec.FSpeedY <> 0;
end;
 
function TBlit.GetCenterX: Double;
begin
Result := FBlitRec.FCenterX;
end;
 
procedure TBlit.SetCenterX(const Value: Double);
begin
FBlitRec.FCenterX := Value;
end;
 
function TBlit.StoreCenterX: Boolean;
begin
Result := FBlitRec.FCenterX <> 0.5;
end;
 
function TBlit.GetAngle: Single;
begin
Result := FBlitRec.FAngle;
end;
 
procedure TBlit.SetAngle(const Value: Single);
begin
FBlitRec.FAngle := Value;
end;
 
function TBlit.StoreAngle: Boolean;
begin
Result := FBlitRec.FAngle <> 0;
end;
 
function TBlit.GetBlurImage: Boolean;
begin
Result := FBlitRec.FBlurImage;
end;
 
procedure TBlit.SetBlurImage(const Value: Boolean);
begin
FBlitRec.FBlurImage := Value;
end;
 
function TBlit.GetCenterY: Double;
begin
Result := FBlitRec.FCenterY;
end;
 
procedure TBlit.SetCenterY(const Value: Double);
begin
FBlitRec.FCenterY := Value;
end;
 
function TBlit.StoreCenterY: Boolean;
begin
Result := FBlitRec.FCenterY <> 0.5;
end;
 
function TBlit.GetBlendMode: TRenderType;
begin
Result := FBlitRec.FBlendMode;
end;
 
procedure TBlit.SetBlendMode(const Value: TRenderType);
begin
FBlitRec.FBlendMode := Value;
end;
 
function TBlit.GetAnimSpeed: Double;
begin
Result := FBlitRec.FAnimSpeed;
end;
 
procedure TBlit.SetAnimSpeed(const Value: Double);
begin
FBlitRec.FAnimSpeed := Value;
end;
 
function TBlit.StoreAnimSpeed: Boolean;
begin
Result := FBlitRec.FAnimSpeed <> 0;
end;
 
function TBlit.GetZ: Integer;
begin
Result := FBlitRec.FZ;
end;
 
procedure TBlit.SetZ(const Value: Integer);
begin
FBlitRec.FZ := Value;
end;
 
function TBlit.GetMirror: Boolean;
begin
Result := FBlitRec.FMirror;
end;
 
procedure TBlit.SetMirror(const Value: Boolean);
begin
FBlitRec.FMirror := Value;
end;
 
function TBlit.GetX: Double;
begin
Result := FBlitRec.FX;
end;
 
procedure TBlit.SetX(const Value: Double);
begin
FBlitRec.FX := Value;
end;
 
function TBlit.GetVisible: Boolean;
begin
Result := FBlitRec.FVisible;
end;
 
procedure TBlit.SetVisible(const Value: Boolean);
begin
FBlitRec.FVisible := Value;
end;
 
function TBlit.GetY: Double;
begin
Result := FBlitRec.FY;
end;
 
procedure TBlit.SetY(const Value: Double);
begin
FBlitRec.FY := Value;
end;
 
function TBlit.GetAlpha: Byte;
begin
Result := FBlitRec.FAlpha;
end;
 
procedure TBlit.SetAlpha(const Value: Byte);
begin
FBlitRec.FAlpha := Value;
end;
 
function TBlit.GetEnergy: Single;
begin
Result := FBlitRec.FEnergy;
end;
 
procedure TBlit.SetEnergy(const Value: Single);
begin
FBlitRec.FEnergy := Value;
end;
 
function TBlit.StoreEnergy: Boolean;
begin
Result := FBlitRec.FEnergy <> 0;
end;
 
function TBlit.GetCollisioned: Boolean;
begin
Result := FBlitRec.FCollisioned;
end;
 
procedure TBlit.SetCollisioned(const Value: Boolean);
begin
FBlitRec.FCollisioned := Value;
end;
 
function TBlit.GetAnimLooped: Boolean;
begin
Result := FBlitRec.FAnimLooped;
end;
 
procedure TBlit.SetAnimLooped(const Value: Boolean);
begin
FBlitRec.FAnimLooped := Value;
end;
 
function TBlit.GetHeight: Integer;
begin
Result := FBlitRec.FHeight;
end;
 
procedure TBlit.SetHeight(const Value: Integer);
begin
FBlitRec.FHeight := Value;
end;
 
function TBlit.GetScale: Double;
begin
Result := FBlitRec.FScale;
end;
 
procedure TBlit.SetScale(const Value: Double);
begin
FBlitRec.FScale := Value;
end;
 
function TBlit.StoreScale: Boolean;
begin
Result := FBlitRec.FScale <> 1.0;
end;
 
function TBlit.GetAnimCount: Integer;
begin
Result := FBlitRec.FAnimCount;
end;
 
procedure TBlit.SetAnimCount(const Value: Integer);
begin
FBlitRec.FAnimCount := Value;
end;
 
function TBlit.GetTextureFilter: TD2DTextureFilter;
begin
Result := FBlitRec.FTextureFilter;
end;
 
procedure TBlit.SetTextureFilter(const Value: TD2DTextureFilter);
begin
FBlitRec.FTextureFilter := Value;
end;
 
function TBlit.GetBoundsRect: TRect;
begin
Result := Bounds(Round(WorldX), Round(WorldY), Width, Height);
end;
 
function TBlit.GetClientRect: TRect;
begin
Result := Bounds(0, 0, Width, Height);
end;
 
function TBlit.GetBlitAt(X, Y: Integer): TBlit;
 
procedure BlitAt(X, Y: Double; Blit: TBlit);
var
i: Integer;
X2, Y2: Double;
begin
if Blit.Visible and PointInRect(Point(Round(X), Round(Y)),
Bounds(Round(Blit.X), Round(Blit.Y), Blit.Width, Blit.Width)) then
begin
if (Result = nil) or (Blit.Z > Result.Z) then
Result := Blit; {uniquelly - where will be store last blit}
end;
 
X2 := X - Blit.X;
Y2 := Y - Blit.Y;
for i := 0 to Blit.Engine.FTraces.Count - 1 do
BlitAt(X2, Y2, Blit.Engine.FTraces.Items[i].FBlit);
end;
 
var
i: Integer;
X2, Y2: Double;
begin
Result := nil;
 
X2 := X - Self.X;
Y2 := Y - Self.Y;
for i := 0 to Engine.FTraces.Count - 1 do
BlitAt(X2, Y2, Engine.FTraces.Items[i].FBlit);
end;
 
procedure TBlit.SetPathLen(Len: Integer);
var I, L: Integer;
begin
{$IFDEF VER4UP}
if Length(FPathArr) <> Len then
{$ELSE}
if FPathLen <> Len then
{$ENDIF}
begin
L := Len;
if Len <= 0 then L := 0;
{$IFDEF VER4UP}
SetLength(FPathArr, L);
for I := Low(FPathArr) to High(FPathArr) do begin
FillChar(FPathArr[i], SizeOf(FPathArr), 0);
FPathArr[i].StayOn := 25;
end;
{$ELSE}
FPathLen := L;
if FPathArr = nil then
FPAthArr := AllocMem(FPathLen * SizeOf(TPath))
else
{alokuj pamet}
ReallocMem(FPathArr, FPathLen * SizeOf(TPath));
if Assigned(FPathArr) then begin
FillChar(FPathArr^, FPathLen * SizeOf(TPath), 0);
for I := 0 to FPathLen do
FPathArr[i].StayOn := 25;
end
{$ENDIF}
end;
end;
 
function TBlit.IsPathEmpty: Boolean;
begin
{$IFNDEF VER4UP}
Result := FPathLen = 0;
{$ELSE}
Result := Length(FPathArr) = 0;
{$ENDIF}
end;
 
function TBlit.GetPathCount: Integer;
begin
{$IFNDEF VER4UP}
Result := FPathLen;
{$ELSE}
Result := Length(FPathArr);
{$ENDIF}
end;
 
function TBlit.GetPath(index: Integer): TPath;
begin
{$IFDEF VER4UP}
if (index >= Low(FPathArr)) and (index <= High(FPathArr)) then
{$ELSE}
if (index >= 0) and (index < FPathLen) then
{$ENDIF}
Result := FPathArr[index]
else
raise Exception.Create('Bad path index!');
end;
 
procedure TBlit.SetPath(index: Integer; const Value: TPath);
begin
{$IFDEF VER4UP}
if (index >= Low(FPathArr)) and (index <= High(FPathArr)) then
{$ELSE}
if (index >= 0) and (index < FPathLen) then
{$ENDIF}
FPathArr[index] := Value
else
raise Exception.Create('Bad path index!');
end;
 
procedure TBlit.ReadPaths(Stream: TStream);
var
PathLen: Integer;
begin
{nacti delku}
Stream.ReadBuffer(PathLen, SizeOf(PathLen));
SetPathLen(PathLen);
Stream.ReadBuffer(FPathArr[0], PathLen * SizeOf(TPath));
end;
 
procedure TBlit.WritePaths(Stream: TStream);
var
PathLen: Integer;
begin
PathLen := GetPathCount;
Stream.WriteBuffer(PathLen, SizeOf(PathLen));
Stream.WriteBuffer(FPathArr[0], PathLen * SizeOf(TPath));
end;
 
procedure TBlit.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineBinaryProperty('Paths', ReadPaths, WritePaths, not IsPathEmpty);
end;
 
procedure TBlit.Assign(Source: TPersistent);
var I: Integer;
begin
if Source is TBlit then
begin
{$IFDEF VER4UP}
I := Length(TBlit(Source).FPathArr);
{$ELSE}
I := FPathLen;
{$ENDIF}
SetPathLen(I);
if I > 0 then
Move(TBlit(Source).FPathArr[0], FPathArr[0], I * SizeOf(TPath));
FBlitRec := TBlit(Source).FBlitRec;
FillChar(FBlurImageArr, SizeOf(FBlurImageArr), 0);
FActive := TBlit(Source).FActive;
FMovingRepeatly := TBlit(Source).FMovingRepeatly;
FImage := nil;
FOnMove := TBlit(Source).FOnMove;
FOnDraw := TBlit(Source).FOnDraw;
FOnCollision := TBlit(Source).FOnCollision;
FOnGetImage := TBlit(Source).FOnGetImage;
FEngine := TBlit(Source).FEngine;
end
else
inherited Assign(Source);
end;
 
function TBlit.GetMovingRepeatly: Boolean;
begin
Result := FMovingRepeatly;
end;
 
procedure TBlit.SetMovingRepeatly(const Value: Boolean);
begin
FMovingRepeatly := Value;
end;
 
function TBlit.GetBustrofedon: Boolean;
begin
Result := FBustrofedon;
end;
 
procedure TBlit.SetBustrofedon(const Value: Boolean);
begin
FBustrofedon := Value;
end;
 
{ utility draw }
 
procedure DXDraw_Draw(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; TextureFilter: TD2DTextureFilter;
MirrorFlip: TRenderMirrorFlipSet;
BlendMode: TRenderType; Angle: Single; Alpha: Byte;
CenterX: Double; CenterY: Double;
Scale: Single); {$IFDEF VER9UP}inline;{$ENDIF}
var
// r: TRect;
width, height: Integer;
begin
if not Assigned(DXDraw.Surface) then Exit;
if not Assigned(Image) then Exit;
if Scale <> 1.0 then begin
width := Round(Scale * Image.Width);
height := Round(Scale * Image.Height);
end
else begin
width := Image.Width;
height := Image.Height;
end;
//r := Bounds(X, Y, width, height);
DXDraw.TextureFilter(TextureFilter);
DXDraw.MirrorFlip(MirrorFlip);
case BlendMode of
rtDraw: begin
if Angle = 0 then
Image.StretchDraw(DXDraw.Surface, Rect, Pattern)
else
Image.DrawRotate(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle);
end;
rtBlend: begin
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateAlpha(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
rtAdd: begin
if Angle = 0 then
Image.DrawAdd(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateAdd(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
rtSub: begin
if Angle = 0 then
Image.DrawSub(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateSub(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
end; {case}
end;
 
procedure DXDraw_Paint(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; var BlurImageArr: TBlurImageArr; BlurImage: Boolean;
TextureFilter: TD2DTextureFilter;
MirrorFlip: TRenderMirrorFlipSet;
BlendMode: TRenderType;
Angle: Single;
Alpha: Byte;
CenterX: Double; CenterY: Double); {$IFDEF VER9UP}inline;{$ENDIF}
var
rr: TRect;
i, width, height: Integer;
begin
if not Assigned(DXDraw.Surface) then Exit;
if not Assigned(Image) then Exit;
width := Image.Width;
height := Image.Height;
//rr := Bounds(X, Y, width, height);
//DXDraw.MirrorFlip(MirrorFlip);
DXDraw.TextureFilter(TextureFilter);
case BlendMode of
rtDraw: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Width, Height);
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, rr, BlurImageArr[i].ePatternIndex, BlurImageArr[i].eIntensity)
else
Image.DrawRotateAlpha(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, BlurImageArr[i].ePatternIndex, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.StretchDraw(DXDraw.Surface, Rect, Pattern)
else
Image.DrawRotate(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle);
end;
rtBlend: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Width, Height);
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, rr, Pattern, BlurImageArr[i].eIntensity)
else
Image.DrawRotateAlpha(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateAlpha(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
rtAdd: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Width, Height);
if Angle = 0 then
Image.DrawAdd(DXDraw.Surface, rr, Pattern, BlurImageArr[i].eIntensity)
else
Image.DrawRotateAdd(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.DrawAdd(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateAdd(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
rtSub: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Width, Height);
if Angle = 0 then
Image.DrawSub(DXDraw.Surface, rr, Pattern, BlurImageArr[i].eIntensity)
else
Image.DrawRotateSub(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.DrawSub(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateSub(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
end; {case}
end;
 
procedure DXDraw_Render(DXDraw: TCustomDXDraw; Image: TPictureCollectionItem;
Rect: TRect; Pattern: Integer; var BlurImageArr: TBlurImageArr; BlurImage: Boolean;
TextureFilter: TD2DTextureFilter; MirrorFlip: TRenderMirrorFlipSet;
BlendMode: TRenderType;
Angle: Single;
Alpha: Byte;
CenterX: Double; CenterY: Double;
Scale: Single;
WaveType: TWaveType;
Amplitude: Integer; AmpLength: Integer; Phase: Integer); {$IFDEF VER9UP}inline;{$ENDIF}
var
rr: TRect;
i, width, height: Integer;
begin
if not Assigned(DXDraw.Surface) then Exit;
if not Assigned(Image) then Exit;
if Scale <> 1.0 then begin
width := Round(Scale * Image.Width);
height := Round(Scale * Image.Height);
end
else begin
width := Image.Width;
height := Image.Height;
end;
//r := Bounds(X, Y, width, height);
DXDraw.TextureFilter(TextureFilter);
DXDraw.MirrorFlip(MirrorFlip);
case BlendMode of
rtDraw:
begin
case WaveType of
wtWaveNone:
begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Round(Scale * Width), Round(Scale * Height));
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, rr, BlurImageArr[i].ePatternIndex, BlurImageArr[i].eIntensity)
else
Image.DrawRotateAlpha(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, BlurImageArr[i].ePatternIndex, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.StretchDraw(DXDraw.Surface, Rect, Pattern)
else
Image.DrawRotate(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle);
end;
wtWaveX: Image.DrawWaveX(DXDraw.Surface, Round(Rect.Left), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase);
wtWaveY: Image.DrawWaveY(DXDraw.Surface, Round(Rect.Left), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase);
end;
end;
rtBlend: begin
case WaveType of
wtWaveNone: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Round(Scale * Width), Round(Scale * Height));
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, rr, Pattern, BlurImageArr[i].eIntensity)
else
Image.DrawRotateAlpha(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.DrawAlpha(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateAlpha(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
wtWaveX: Image.DrawWaveXAlpha(DXDraw.Surface, Round(Rect.Left), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase, Alpha);
wtWaveY: Image.DrawWaveYAlpha(DXDraw.Surface, Round(Rect.Top), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase, Alpha);
end;
end;
rtAdd: begin
case WaveType of
wtWaveNone: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Round(Scale * Width), Round(Scale * Height));
if Angle = 0 then
Image.DrawAdd(DXDraw.Surface, rr, Pattern, BlurImageArr[i].eIntensity)
else
Image.DrawRotateAdd(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.DrawAdd(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateAdd(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
wtWaveX: Image.DrawWaveXAdd(DXDraw.Surface, Round(Rect.Left), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase, Alpha);
wtWaveY: Image.DrawWaveYAdd(DXDraw.Surface, Round(Rect.Top), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase, Alpha);
end;
end;
rtSub: begin
case WaveType of
wtWaveNone: begin
if BlurImage then begin
for i := Low(BlurImageArr) to High(BlurImageArr) do if BlurImageArr[i].eActive then begin
DXDraw.MirrorFlip(MirrorFlip);
rr := Bounds(BlurImageArr[i].eX, BlurImageArr[i].eY, Round(Scale * Width), Round(Scale * Height));
if Angle = 0 then
Image.DrawSub(DXDraw.Surface, rr, Pattern, BlurImageArr[i].eIntensity)
else
Image.DrawRotateSub(DXDraw.Surface, (rr.Left + rr.Right) div 2,
(rr.Top + rr.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, BlurImageArr[i].eAngle, BlurImageArr[i].eIntensity);
if BlurImageArr[i].eIntensity > 0 then Dec(BlurImageArr[i].eIntensity) else FillChar(BlurImageArr[i], SizeOf(BlurImageArr[i]), 0);
end;
end;
DXDraw.MirrorFlip(MirrorFlip);
if Angle = 0 then
Image.DrawSub(DXDraw.Surface, Rect, Pattern, Alpha)
else
Image.DrawRotateSub(DXDraw.Surface, (Rect.Left + Rect.Right) div 2,
(Rect.Top + Rect.Bottom) div 2,
Width, Height, Pattern, CenterX, CenterY, Angle, Alpha);
end;
wtWaveX: Image.DrawWaveXSub(DXDraw.Surface, Round(Rect.Left), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase, Alpha);
wtWaveY: Image.DrawWaveYSub(DXDraw.Surface, Round(Rect.Top), Round(Rect.Top), Width, Height, Pattern, Amplitude, AmpLength, Phase, Alpha);
end;
end;
end; {case}
end;
 
initialization
_DXTextureImageLoadFuncList := TList.Create;
TDXTextureImage.RegisterLoadFunc(DXTextureImage_LoadDXTextureImageFunc); //delete Mr.Kawasaki
TDXTextureImage.RegisterLoadFunc(DXTextureImage_LoadBitmapFunc);
finalization
TDXTextureImage.UnRegisterLoadFunc(DXTextureImage_LoadDXTextureImageFunc); //delete Mr.Kawasaki
TDXTextureImage.UnRegisterLoadFunc(DXTextureImage_LoadBitmapFunc);
_DXTextureImageLoadFuncList.Free;
{ driver free }
DirectDrawDrivers.Free;
{$IFDEF _DMO_}DirectDrawDriversEx.Free;{$ENDIF}
end.
end.
 
 
/VCL_DELPHIX_D6/DXPlayFm.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DAnim.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXETable.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXTexImg.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DelphiX_for6.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXFFBEdit.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DXGUIDEdit.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXInput.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXPlayFm.pas
1,23 → 1,10
unit DXPlayFm;
 
{$INCLUDE DelphiXcfg.inc}
 
{$IFNDEF UseDirectPlay}
// If you want to use DXPlayFm.pas, please enable the IFDEF UseDirectPlay in DelphiXcfg.inc
interface
implementation
{$ELSE} // !UseDirectPlay
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, DXPlay, ActiveX, DXETable, DIB,
{$IfDef StandardDX}
DirectDraw, DirectPlay;
{$Else}
DirectX;
{$EndIf}
StdCtrls, ExtCtrls, DirectX, DXPlay, ActiveX, DXETable, DIB;
 
type
TDelphiXDXPlayForm = class(TForm)
67,9 → 54,7
private
FProviderGUID: TGUID;
public
DPlay: //{$IfDef DX7}
IDirectPlay4A;
//{$Else}IDirectPlay8Address{$EndIf};
DPlay: IDirectPlay4A;
DXPlay: TCustomDXPlay;
PlayerName: string;
ProviderName: string;
119,15 → 104,12
 
procedure InitDirectPlay;
var
DPlay1: //{$IfDef DX7}
IDirectPlay;
//{$Else}IDirectPlay8Server{$EndIf};
DPlay1: IDirectPlay;
begin
if DXDirectPlayCreate(FProviderGUID, DPlay1, nil)<>0 then
raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
 
DPlay := DPlay1 as //{$IfDef DX7}
IDirectPlay4A//{$Else}IDirectPlay8Address{$EndIf}
DPlay := DPlay1 as IDirectPlay4A;
end;
 
function EnumSessionsCallback(const lpThisSD: TDPSessionDesc2;
143,11 → 125,8
 
Guid := New(PGUID);
Move(lpThisSD.guidInstance, Guid^, SizeOf(TGUID));
{$IFDEF UNICODE}
TDelphiXDXPlayForm(lpContext).JoinGameSessionList.Items.AddObject(lpThisSD.lpszSessionNameW, Pointer(Guid));
{$ELSE}
TDelphiXDXPlayForm(lpContext).JoinGameSessionList.Items.AddObject(lpThisSD.lpszSessionNameA, Pointer(Guid));
{$ENDIF}
 
Result := True;
end;
 
253,11 → 232,7
with lpName do
begin
if lpszShortNameA<>nil then
{$IFDEF UNICODE}
TDelphiXDXPlayForm(lpContext).JoinGamePlayerList.Items.Add(lpszShortNameW);
{$ELSE}
TDelphiXDXPlayForm(lpContext).JoinGamePlayerList.Items.Add(lpszShortNameA);
{$ENDIF}
end;
 
Result := True;
289,7 → 264,7
hr := TempDPlay.Open(dpDesc, DPOPEN_JOIN);
if hr<>0 then Exit;
try
TempDPlay.EnumPlayers(PGUID(nil), @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);
TempDPlay.EnumPlayers(PGUID(nil)^, @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);
finally
TempDPlay.Close;
end;
436,7 → 411,5
end;
end;
 
{$ENDIF} // UseDirectPlay
 
end.
 
/VCL_DELPHIX_D6/DXETable.pas
5,36 → 5,15
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, SysUtils,
{$IfDef StandardDX}
{$ifdef DX7}
DirectDraw, Direct3D,DirectInput,DirectPlay,DirectSound;
{$else}
{$IfDef DX9}
DirectDraw, Direct3D9, Direct3D, D3DX9, {Direct3D8,} DX7toDX8, DirectInput, DirectPlay8, DirectSound;
// {$Else}
// {$IfDef DX81}
// D3DX8, Direct3D8, DirectInput8, DirectXGraphics, DX7toDX8, DirectPlay8;
// {$Else}
// DirectInput, Direct3D, Direct3DRM, DirectPlay;
{$EndIf}
{$EndIf}
{$Else}
DirectX;
{$EndIf}
Windows, SysUtils, DirectX;
 
 
function WindowsErrorMsg(ErrorCode: HRESULT): string;
function DDrawErrorMsg(ErrorCode: HRESULT): string;
function D3DErrorMsg(ErrorCode: HRESULT): string;
{$IFDEF D3DRM}
function D3DRMErrorMsg(ErrorCode: HRESULT): string;
{$ENDIF}
function DSoundErrorMsg(ErrorCode: HRESULT): string;
function DInputErrorMsg(ErrorCode: HRESULT): string;
{$IFDEF UseDirectPlay}
function DPlayErrorMsg(ErrorCode: HRESULT): string;
{$EndIf} // UseDirectPlay
 
implementation
 
225,7 → 204,7
Result := WindowsErrorMsg(ErrorCode);
end;
end;
{$IFDEF D3DRM}
 
function D3DRMErrorMsg(ErrorCode: HRESULT): string;
begin
case ErrorCode of
247,7 → 226,7
Result := WindowsErrorMsg(ErrorCode);
end;
end;
{$ENDIF}
 
function DSoundErrorMsg(ErrorCode: HRESULT): string;
begin
case ErrorCode of
292,82 → 271,15
DIERR_INPUTLOST : Result := 'DIERR_INPUTLOST';
DIERR_ACQUIRED : Result := 'DIERR_ACQUIRED';
DIERR_NOTACQUIRED : Result := 'DIERR_NOTACQUIRED';
HRESULT(E_PENDING) : Result := 'E_PENDING';
E_PENDING : Result := 'E_PENDING';
else
Result := WindowsErrorMsg(ErrorCode);
end;
end;
{$IFDEF UseDirectPlay}
{$IfDef DX9}
 
function DPlayErrorMsg(ErrorCode: HRESULT): string;
begin
case ErrorCode of
DPN_OK : Result := 'DPN_OK';
DPNERR_ALREADYINITIALIZED : Result := 'DPNERR_ALREADYINITIALIZED';
//DPNERR_ACCESSDENIED : Result := 'DPNERR_ACCESSDENIED';
//DPNERR_ACTIVEPLAYERS : Result := 'DPNERR_ACTIVEPLAYERS';
DPNERR_BUFFERTOOSMALL : Result := 'DPNERR_BUFFERTOOSMALL';
//DPNERR_CANTADDPLAYER : Result := 'DPNERR_CANTADDPLAYER';
DPNERR_CANTCREATEGROUP : Result := 'DPNERR_CANTCREATEGROUP';
DPNERR_CANTCREATEPLAYER : Result := 'DPNERR_CANTCREATEPLAYER';
//DPNERR_CANTCREATESESSION : Result := 'DPNERR_CANTCREATESESSION';
//DPNERR_CAPSNOTAVAILABLEYET : Result := 'DPNERR_CAPSNOTAVAILABLEYET';
DPNERR_EXCEPTION : Result := 'DPNERR_EXCEPTION';
DPNERR_GENERIC : Result := 'DPNERR_GENERIC';
DPNERR_INVALIDFLAGS : Result := 'DPNERR_INVALIDFLAGS';
DPNERR_INVALIDOBJECT : Result := 'DPNERR_INVALIDOBJECT';
DPNERR_INVALIDPARAM : Result := 'DPNERR_INVALIDPARAM, DPNERR_INVALIDPARAMS';
DPNERR_INVALIDPLAYER : Result := 'DPNERR_INVALIDPLAYER';
DPNERR_INVALIDGROUP : Result := 'DPNERR_INVALIDGROUP';
DPNERR_NOCAPS : Result := 'DPNERR_NOCAPS';
DPNERR_NOCONNECTION : Result := 'DPNERR_NOCONNECTION';
//DPNERR_NOMEMORY : Result := 'DPNERR_NOMEMORY, DPNERR_OUTOFMEMORY';
//DPNERR_NOMESSAGES : Result := 'DPNERR_NOMESSAGES';
//DPNERR_NONAMESERVERFOUND : Result := 'DPNERR_NONAMESERVERFOUND';
//DPNERR_NOPLAYERS : Result := 'DPNERR_NOPLAYERS';
//DPNERR_NOSESSIONS : Result := 'DPNERR_NOSESSIONS';
DPNERR_PENDING : Result := 'DPNERR_PENDING';
//DPNERR_SENDTOOBIG : Result := 'DPNERR_SENDTOOBIG';
//DPNERR_TIMEOUT : Result := 'DPNERR_TIMEOUT';
//DPNERR_UNAVAILABLE : Result := 'DPNERR_UNAVAILABLE';
DPNERR_UNSUPPORTED : Result := 'DPNERR_UNSUPPORTED';
//DPNERR_BUSY : Result := 'DPNERR_BUSY';
DPNERR_USERCANCEL : Result := 'DPNERR_USERCANCEL';
DPNERR_NOINTERFACE : Result := 'DPNERR_NOINTERFACE';
//DPNERR_CANNOTCREATESERVER : Result := 'DPNERR_CANNOTCREATESERVER';
DPNERR_PLAYERLOST : Result := 'DPNERR_PLAYERLOST';
//DPNERR_SESSIONLOST : Result := 'DPNERR_SESSIONLOST';
DPNERR_UNINITIALIZED : Result := 'DPNERR_UNINITIALIZED';
//DPNERR_NONEWPLAYERS : Result := 'DPNERR_NONEWPLAYERS';
DPNERR_INVALIDPASSWORD : Result := 'DPNERR_INVALIDPASSWORD';
DPNERR_CONNECTING : Result := 'DPNERR_CONNECTING';
//DPNERR_BUFFERTOOLARGE : Result := 'DPNERR_BUFFERTOOLARGE';
//DPNERR_CANTCREATEPROCESS : Result := 'DPNERR_CANTCREATEPROCESS';
//DPNERR_APPNOTSTARTED : Result := 'DPNERR_APPNOTSTARTED';
DPNERR_INVALIDINTERFACE : Result := 'DPNERR_INVALIDINTERFACE';
//DPNERR_NOSERVICEPROVIDER : Result := 'DPNERR_NOSERVICEPROVIDER';
//DPNERR_UNKNOWNAPPLICATION : Result := 'DPNERR_UNKNOWNAPPLICATION';
//DPNERR_NOTLOBBIED : Result := 'DPNERR_NOTLOBBIED';
//DPNERR_SERVICEPROVIDERLOADED : Result := 'DPNERR_SERVICEPROVIDERLOADED';
DPNERR_NOTREGISTERED : Result := 'DPNERR_NOTREGISTERED';
// Security related errors
//DPNERR_AUTHENTICATIONFAILED : Result := 'DPNERR_AUTHENTICATIONFAILED';
//DPNERR_CANTLOADSSPI : Result := 'DPNERR_CANTLOADSSPI';
//DPNERR_ENCRYPTIONFAILED : Result := 'DPNERR_ENCRYPTIONFAILED';
//DPNERR_SIGNFAILED : Result := 'DPNERR_SIGNFAILED';
//DPNERR_CANTLOADSECURITYPACKAGE : Result := 'DPNERR_CANTLOADSECURITYPACKAGE';
//DPNERR_ENCRYPTIONNOTSUPPORTED : Result := 'DPNERR_ENCRYPTIONNOTSUPPORTED';
//DPNERR_CANTLOADCAPI : Result := 'DPNERR_CANTLOADCAPI';
//DPNERR_NOTLOGGEDIN : Result := 'DPNERR_NOTLOGGEDIN';
//DPNERR_LOGONDENIED : Result := 'DPNERR_LOGONDENIED';
else
Result := WindowsErrorMsg(ErrorCode);
end;
end;
{$Else}
function DPlayErrorMsg(ErrorCode: HRESULT): string;
begin
case ErrorCode of
DP_OK : Result := 'DP_OK';
DPERR_ALREADYINITIALIZED : Result := 'DPERR_ALREADYINITIALIZED';
DPERR_ACCESSDENIED : Result := 'DPERR_ACCESSDENIED';
430,6 → 342,5
Result := WindowsErrorMsg(ErrorCode);
end;
end;
{$EndIf}
{$EndIf} // UseDirectPlay
 
end.
/VCL_DELPHIX_D6/DAnim.pas
22,9 → 22,7
 
{$Z4}
{$A+}
{$IfNDef D7UP}
{$WEAKPACKAGEUNIT}
{$EndIf}
 
uses Windows, ActiveX, DirectX, DShow;
 
1111,18 → 1109,18
out lplpDDClipper: IDirectDrawClipper; pUnkOuter: IUnknown): HResult; stdcall;
function CreatePalette(dwFlags: DWORD; lpColorTable: PPaletteEntry;
out lplpDDPalette: IDirectDrawPalette; pUnkOuter: IUnknown): HResult;stdcall;
function CreateSurface(const lpDDSurfaceDesc: TDDSURFACEDESC;
function CreateSurface(const lpDDSurfaceDesc: DDSURFACEDESC;
out lplpDDSurface: IDirectDrawSurface; pUnkOuter: IUnknown): HResult; stdcall;
function DuplicateSurface(lpDDSurface: IDirectDrawSurface;
out lplpDupDDSurface: IDirectDrawSurface): HResult; stdcall;
function EnumDisplayModes(dwFlags: DWORD;
const lpDDSurfaceDesc: TDDSURFACEDESC; lpContext: Pointer;
lpEnumModesCallback: {LPDDENUMMODESCALLBACK}TDDEnumModesCallback): HResult; stdcall;
function EnumSurfaces(dwFlags: DWORD; const lpDDSD: TDDSURFACEDESC;
lpContext: Pointer; lpEnumCallback: {LPDDENUMSURFACESCALLBACK}TDDEnumSurfacesCallback): HResult; stdcall;
const lpDDSurfaceDesc: DDSURFACEDESC; lpContext: Pointer;
lpEnumModesCallback: LPDDENUMMODESCALLBACK): HResult; stdcall;
function EnumSurfaces(dwFlags: DWORD; const lpDDSD: DDSURFACEDESC;
lpContext: Pointer; lpEnumCallback: LPDDENUMSURFACESCALLBACK): HResult; stdcall;
function FlipToGDISurface: HResult; stdcall;
function GetCaps(var lpDDDriverCaps: TDDCAPS; var lpDDHELCaps: TDDCAPS): HResult; stdcall;
function GetDisplayMode(var lpDDSurfaceDesc: TDDSURFACEDESC): HResult; stdcall;
function GetCaps(var lpDDDriverCaps: DDCAPS; var lpDDHELCaps: DDCAPS): HResult; stdcall;
function GetDisplayMode(var lpDDSurfaceDesc: DDSURFACEDESC): HResult; stdcall;
function GetFourCCCodes(var lpNumCodes, lpCodes: DWORD): HResult; stdcall;
function GetGDISurface(out lplpGDIDDSSurface: IDirectDrawSurface): HResult; stdcall;
function GetMonitorFrequency(var lpdwFrequency: DWORD): HResult; stdcall;
1135,7 → 1133,7
dwFlags: DWORD): HResult; stdcall;
function WaitForVerticalBlank(dwFlags: DWORD; hEvent: THandle): HResult; stdcall;
// IDirectDraw2 methods
function GetAvailableVidMem(var lpDDSCaps: TDDSCAPS;
function GetAvailableVidMem(var lpDDSCaps: DDSCAPS;
var lpdwTotal, lpdwFree: DWORD): HResult; stdcall;
// IDirectDraw3 methods
function GetSurfaceFromDC(hdc: HDC; out ppSurface: IDirectDrawSurface): HResult; stdcall;
/VCL_DELPHIX_D6/DXTexImg.pas
0,0 → 1,1304
unit DXTexImg;
 
interface
 
uses
Windows, SysUtils, Classes, DXConsts;
 
const
DXTextureImageGroupType_Normal = 0; // Normal group
DXTextureImageGroupType_Mipmap = 1; // Mipmap group
 
type
EDXTextureImageError = class(Exception);
 
TDXTextureImageChannel = record
Mask: DWORD;
BitCount: Integer;
 
{ Internal use }
_Mask2: DWORD;
_rshift: Integer;
_lshift: Integer;
_BitCount2: Integer;
end;
 
TDXTextureImage_PaletteEntries = array[0..255] of TPaletteEntry;
 
TDXTextureImageType = (
DXTextureImageType_PaletteIndexedColor,
DXTextureImageType_RGBColor
);
 
TDXTextureImage = class;
 
TDXTextureImageLoadFunc = procedure(Stream: TStream; Image: TDXTextureImage);
 
TDXTextureImage = class
private
FOwner: TDXTextureImage;
FSubImage: TList;
FImageType: TDXTextureImageType;
FWidth: Integer;
FHeight: Integer;
FPBits: Pointer;
FBitCount: Integer;
FPackedPixelOrder: Boolean;
FWidthBytes: Integer;
FNextLine: Integer;
FSize: Integer;
FTopPBits: Pointer;
FTransparent: Boolean;
FTransparentColor: DWORD;
FImageGroupType: DWORD;
FImageID: DWORD;
FImageName: string;
FAutoFreeImage: Boolean;
procedure ClearImage;
function GetPixel(x, y: Integer): DWORD;
procedure SetPixel(x, y: Integer; c: DWORD);
function GetScanLine(y: Integer): Pointer;
function GetSubGroupImageCount(GroupTypeID: DWORD): Integer;
function GetSubGroupImage(GroupTypeID: DWORD; Index: Integer): TDXTextureImage;
function GetSubImageCount: Integer;
function GetSubImage(Index: Integer): TDXTextureImage;
public
idx_index: TDXTextureImageChannel;
idx_alpha: TDXTextureImageChannel;
idx_palette: TDXTextureImage_PaletteEntries;
rgb_red: TDXTextureImageChannel;
rgb_green: TDXTextureImageChannel;
rgb_blue: TDXTextureImageChannel;
rgb_alpha: TDXTextureImageChannel;
constructor Create;
constructor CreateSub(AOwner: TDXTextureImage);
destructor Destroy; override;
procedure Assign(Source: TDXTextureImage);
procedure Clear;
procedure SetImage(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes, NextLine: Integer;
PBits, TopPBits: Pointer; Size: Integer; AutoFree: Boolean);
procedure SetSize(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes: Integer);
procedure LoadFromFile(const FileName: string);
procedure LoadFromStream(Stream: TStream);
procedure SaveToFile(const FileName: string);
procedure SaveToStream(Stream: TStream);
function EncodeColor(R, G, B, A: Byte): DWORD;
function PaletteIndex(R, G, B: Byte): DWORD;
class procedure RegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
class procedure UnRegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
property BitCount: Integer read FBitCount;
property PackedPixelOrder: Boolean read FPackedPixelOrder write FPackedPixelOrder;
property Height: Integer read FHeight;
property ImageType: TDXTextureImageType read FImageType;
property ImageGroupType: DWORD read FImageGroupType write FImageGroupType;
property ImageID: DWORD read FImageID write FImageID;
property ImageName: string read FImageName write FImageName;
property NextLine: Integer read FNextLine;
property PBits: Pointer read FPBits;
property Pixels[x, y: Integer]: DWORD read GetPixel write SetPixel;
property ScanLine[y: Integer]: Pointer read GetScanLine;
property Size: Integer read FSize;
property SubGroupImageCount[GroupTypeID: DWORD]: Integer read GetSubGroupImageCount;
property SubGroupImages[GroupTypeID: DWORD; Index: Integer]: TDXTextureImage read GetSubGroupImage;
property SubImageCount: Integer read GetSubImageCount;
property SubImages[Index: Integer]: TDXTextureImage read GetSubImage;
property TopPBits: Pointer read FTopPBits;
property Transparent: Boolean read FTransparent write FTransparent;
property TransparentColor: DWORD read FTransparentColor write FTransparentColor;
property Width: Integer read FWidth;
property WidthBytes: Integer read FWidthBytes;
end;
 
function dxtMakeChannel(Mask: DWORD; indexed: Boolean): TDXTextureImageChannel;
function dxtEncodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
function dxtDecodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
 
implementation
 
function GetWidthBytes(Width, BitCount: Integer): Integer;
begin
Result := (((Width*BitCount)+31) div 32)*4;
end;
 
function dxtEncodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
begin
Result := ((c shl Channel._rshift) shr Channel._lshift) and Channel.Mask;
end;
 
function dxtDecodeChannel(const Channel: TDXTextureImageChannel; c: DWORD): DWORD;
begin
Result := ((c and Channel.Mask) shr Channel._rshift) shl Channel._lshift;
Result := Result or (Result shr Channel._BitCount2);
end;
 
function dxtMakeChannel(Mask: DWORD; indexed: Boolean): TDXTextureImageChannel;
 
function GetMaskBitCount(b: Integer): Integer;
var
i: Integer;
begin
i := 0;
while (i<31) and (((1 shl i) and b)=0) do Inc(i);
 
Result := 0;
while ((1 shl i) and b)<>0 do
begin
Inc(i);
Inc(Result);
end;
end;
 
function GetBitCount2(b: Integer): Integer;
begin
Result := 0;
while (Result<31) and (((1 shl Result) and b)=0) do Inc(Result);
end;
 
begin
Result.BitCount := GetMaskBitCount(Mask);
Result.Mask := Mask;
 
if indexed then
begin
Result._rshift := GetBitCount2(Mask);
Result._lshift := 0;
Result._Mask2 := 1 shl Result.BitCount-1;
Result._BitCount2 := 0;
end else
begin
Result._rshift := GetBitCount2(Mask)-(8-Result.BitCount);
if Result._rshift<0 then
begin
Result._lshift := -Result._rshift;
Result._rshift := 0;
end else
Result._lshift := 0;
Result._Mask2 := (1 shl Result.BitCount-1) shl (8-Result.BitCount);
Result._BitCount2 := 8-Result.BitCount;
end;
end;
 
{ TDXTextureImage }
 
var
_DXTextureImageLoadFuncList: TList;
 
procedure DXTextureImage_LoadDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage); forward;
procedure DXTextureImage_LoadBitmapFunc(Stream: TStream; Image: TDXTextureImage); forward;
 
function DXTextureImageLoadFuncList: TList;
begin
if _DXTextureImageLoadFuncList=nil then
begin
_DXTextureImageLoadFuncList := TList.Create;
_DXTextureImageLoadFuncList.Add(@DXTextureImage_LoadDXTextureImageFunc);
_DXTextureImageLoadFuncList.Add(@DXTextureImage_LoadBitmapFunc);
end;
Result := _DXTextureImageLoadFuncList;
end;
 
class procedure TDXTextureImage.RegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
begin
if DXTextureImageLoadFuncList.IndexOf(@LoadFunc)=-1 then
DXTextureImageLoadFuncList.Add(@LoadFunc);
end;
 
class procedure TDXTextureImage.UnRegisterLoadFunc(LoadFunc: TDXTextureImageLoadFunc);
begin
DXTextureImageLoadFuncList.Remove(@LoadFunc);
end;
 
constructor TDXTextureImage.Create;
begin
inherited Create;
FSubImage := TList.Create;
end;
 
constructor TDXTextureImage.CreateSub(AOwner: TDXTextureImage);
begin
Create;
 
FOwner := AOwner;
try
FOwner.FSubImage.Add(Self);
except
FOwner := nil;
raise;
end;
end;
 
destructor TDXTextureImage.Destroy;
begin
Clear;
FSubImage.Free;
if FOwner<>nil then
FOwner.FSubImage.Remove(Self);
inherited Destroy;
end;
 
procedure TDXTextureImage.Assign(Source: TDXTextureImage);
var
y: Integer;
begin
SetSize(Source.ImageType, Source.Width, Source.Height, Source.BitCount, Source.WidthBytes);
 
idx_index := Source.idx_index;
idx_alpha := Source.idx_alpha;
idx_palette := Source.idx_palette;
 
rgb_red := Source.rgb_red;
rgb_green := Source.rgb_green;
rgb_blue := Source.rgb_blue;
rgb_alpha := Source.rgb_alpha;
 
for y:=0 to Height-1 do
Move(Source.ScanLine[y]^, ScanLine[y]^, WidthBytes);
 
Transparent := Source.Transparent;
TransparentColor := Source.TransparentColor;
ImageGroupType := Source.ImageGroupType;
ImageID := Source.ImageID;
ImageName := Source.ImageName;
end;
 
procedure TDXTextureImage.ClearImage;
begin
if FAutoFreeImage then
FreeMem(FPBits);
 
FImageType := DXTextureImageType_PaletteIndexedColor;
FWidth := 0;
FHeight := 0;
FBitCount := 0;
FWidthBytes := 0;
FNextLine := 0;
FSize := 0;
FPBits := nil;
FTopPBits := nil;
FAutoFreeImage := False;
end;
 
procedure TDXTextureImage.Clear;
begin
ClearImage;
 
while SubImageCount>0 do
SubImages[SubImageCount-1].Free;
 
FImageGroupType := 0;
FImageID := 0;
FImageName := '';
 
FTransparent := False;
FTransparentColor := 0;
 
FillChar(idx_index, SizeOf(idx_index), 0);
FillChar(idx_alpha, SizeOf(idx_alpha), 0);
FillChar(idx_palette, SizeOf(idx_palette), 0);
FillChar(rgb_red, SizeOf(rgb_red), 0);
FillChar(rgb_green, SizeOf(rgb_green), 0);
FillChar(rgb_blue, SizeOf(rgb_blue), 0);
FillChar(rgb_alpha, SizeOf(rgb_alpha), 0);
end;
 
procedure TDXTextureImage.SetImage(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes, NextLine: Integer;
PBits, TopPBits: Pointer; Size: Integer; AutoFree: Boolean);
begin
ClearImage;
 
FAutoFreeImage := AutoFree;
FImageType := ImageType;
FWidth := Width;
FHeight := Height;
FBitCount := BitCount;
FWidthBytes := WidthBytes;
FNextLine := NextLine;
FSize := Size;
FPBits := PBits;
FTopPBits := TopPBits;
end;
 
procedure TDXTextureImage.SetSize(ImageType: TDXTextureImageType; Width, Height, BitCount, WidthBytes: Integer);
var
APBits: Pointer;
begin
ClearImage;
 
if WidthBytes=0 then
WidthBytes := GetWidthBytes(Width, BitCount);
 
GetMem(APBits, WidthBytes*Height);
SetImage(ImageType, Width, Height, BitCount, WidthBytes, WidthBytes, APBits, APBits, WidthBytes*Height, True);
end;
 
function TDXTextureImage.GetScanLine(y: Integer): Pointer;
begin
Result := Pointer(Integer(FTopPBits)+FNextLine*y);
end;
 
function TDXTextureImage.GetSubGroupImageCount(GroupTypeID: DWORD): Integer;
var
i: Integer;
begin
Result := 0;
for i:=0 to SubImageCount-1 do
if SubImages[i].ImageGroupType=GroupTypeID then
Inc(Result);
end;
 
function TDXTextureImage.GetSubGroupImage(GroupTypeID: DWORD; Index: Integer): TDXTextureImage;
var
i, j: Integer;
begin
j := 0;
for i:=0 to SubImageCount-1 do
if SubImages[i].ImageGroupType=GroupTypeID then
begin
if j=Index then
begin
Result := SubImages[i];
Exit;
end;
 
Inc(j);
end;
 
Result := nil;
SubImages[-1];
end;
 
function TDXTextureImage.GetSubImageCount: Integer;
begin
Result := FSubImage.Count;
end;
 
function TDXTextureImage.GetSubImage(Index: Integer): TDXTextureImage;
begin
Result := FSubImage[Index];
end;
 
function TDXTextureImage.EncodeColor(R, G, B, A: Byte): DWORD;
begin
if ImageType=DXTextureImageType_PaletteIndexedColor then
begin
Result := dxtEncodeChannel(idx_index, PaletteIndex(R, G, B)) or
dxtEncodeChannel(idx_alpha, A);
end else
begin
Result := dxtEncodeChannel(rgb_red, R) or
dxtEncodeChannel(rgb_green, G) or
dxtEncodeChannel(rgb_blue, B) or
dxtEncodeChannel(rgb_alpha, A);
end;
end;
 
function TDXTextureImage.PaletteIndex(R, G, B: Byte): DWORD;
var
i, d, d2: Integer;
begin
Result := 0;
if ImageType=DXTextureImageType_PaletteIndexedColor then
begin
d := MaxInt;
for i:=0 to (1 shl idx_index.BitCount)-1 do
with idx_palette[i] do
begin
d2 := Abs((peRed-R))*Abs((peRed-R)) + Abs((peGreen-G))*Abs((peGreen-G)) + Abs((peBlue-B))*Abs((peBlue-B));
if d>d2 then
begin
d := d2;
Result := i;
end;
end;
end;
end;
 
const
Mask1: array[0..7] of DWORD= (1, 2, 4, 8, 16, 32, 64, 128);
Mask2: array[0..3] of DWORD= (3, 12, 48, 192);
Mask4: array[0..1] of DWORD= ($0F, $F0);
 
Shift1: array[0..7] of DWORD= (0, 1, 2, 3, 4, 5, 6, 7);
Shift2: array[0..3] of DWORD= (0, 2, 4, 6);
Shift4: array[0..1] of DWORD= (0, 4);
 
type
PByte3 = ^TByte3;
TByte3 = array[0..2] of Byte;
 
function TDXTextureImage.GetPixel(x, y: Integer): DWORD;
begin
Result := 0;
if (x>=0) and (x<FWidth) and (y>=0) and (y<FHeight) then
begin
case FBitCount of
1 : begin
if FPackedPixelOrder then
Result := (PByte(Integer(FTopPBits)+FNextLine*y+x shr 3)^ and Mask1[7-x and 7]) shr Shift1[7-x and 7]
else
Result := (PByte(Integer(FTopPBits)+FNextLine*y+x shr 3)^ and Mask1[x and 7]) shr Shift1[x and 7];
end;
2 : begin
if FPackedPixelOrder then
Result := (PByte(Integer(FTopPBits)+FNextLine*y+x shr 2)^ and Mask2[3-x and 3]) shr Shift2[3-x and 3]
else
Result := (PByte(Integer(FTopPBits)+FNextLine*y+x shr 2)^ and Mask2[x and 3]) shr Shift2[x and 3];
end;
4 : begin
if FPackedPixelOrder then
Result := (PByte(Integer(FTopPBits)+FNextLine*y+x shr 1)^ and Mask4[1-x and 1]) shr Shift4[1-x and 1]
else
Result := (PByte(Integer(FTopPBits)+FNextLine*y+x shr 1)^ and Mask4[x and 1]) shr Shift4[x and 1];
end;
8 : Result := PByte(Integer(FTopPBits)+FNextLine*y+x)^;
16: Result := PWord(Integer(FTopPBits)+FNextLine*y+x*2)^;
24: PByte3(@Result)^ := PByte3(Integer(FTopPBits)+FNextLine*y+x*3)^;
32: Result := PDWORD(Integer(FTopPBits)+FNextLine*y+x*4)^;
end;
end;
end;
 
procedure TDXTextureImage.SetPixel(x, y: Integer; c: DWORD);
var
P: PByte;
begin
if (x>=0) and (x<FWidth) and (y>=0) and (y<FHeight) then
begin
case FBitCount of
1 : begin
P := Pointer(Integer(FTopPBits)+FNextLine*y+x shr 3);
if FPackedPixelOrder then
P^ := (P^ and (not Mask1[7-x and 7])) or ((c and 1) shl Shift1[7-x and 7])
else
P^ := (P^ and (not Mask1[x and 7])) or ((c and 1) shl Shift1[x and 7]);
end;
2 : begin
P := Pointer(Integer(FTopPBits)+FNextLine*y+x shr 2);
if FPackedPixelOrder then
P^ := (P^ and (not Mask2[3-x and 3])) or ((c and 3) shl Shift2[3-x and 3])
else
P^ := (P^ and (not Mask2[x and 3])) or ((c and 3) shl Shift2[x and 3]);
end;
4 : begin
P := Pointer(Integer(FTopPBits)+FNextLine*y+x shr 1);
if FPackedPixelOrder then
P^ := (P^ and (not Mask4[1-x and 1])) or ((c and 7) shl Shift4[1-x and 1])
else
P^ := (P^ and (not Mask4[x and 1])) or ((c and 7) shl Shift4[x and 1]);
end;
8 : PByte(Integer(FTopPBits)+FNextLine*y+x)^ := c;
16: PWord(Integer(FTopPBits)+FNextLine*y+x*2)^ := c;
24: PByte3(Integer(FTopPBits)+FNextLine*y+x*3)^ := PByte3(@c)^;
32: PDWORD(Integer(FTopPBits)+FNextLine*y+x*4)^ := c;
end;
end;
end;
 
procedure TDXTextureImage.LoadFromFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure TDXTextureImage.LoadFromStream(Stream: TStream);
var
i, p: Integer;
begin
Clear;
 
p := Stream.Position;
for i:=0 to DXTextureImageLoadFuncList.Count-1 do
begin
Stream.Position := p;
try
TDXTextureImageLoadFunc(DXTextureImageLoadFuncList[i])(Stream, Self);
Exit;
except
Clear;
end;
end;
 
raise EDXTextureImageError.Create(SNotSupportGraphicFile);
end;
 
procedure TDXTextureImage.SaveToFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure DXTextureImage_SaveDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage); forward;
 
procedure TDXTextureImage.SaveToStream(Stream: TStream);
begin
DXTextureImage_SaveDXTextureImageFunc(Stream, Self);
end;
 
{ DXTextureImage_LoadDXTextureImageFunc }
 
const
DXTextureImageFile_Type = 'dxt:';
DXTextureImageFile_Version = $100;
 
DXTextureImageCompress_None = 0;
 
DXTextureImageFileCategoryType_Image = $100;
 
DXTextureImageFileBlockID_EndFile = 0;
DXTextureImageFileBlockID_EndGroup = 1;
DXTextureImageFileBlockID_StartGroup = 2;
DXTextureImageFileBlockID_Image_Format = DXTextureImageFileCategoryType_Image + 1;
DXTextureImageFileBlockID_Image_PixelData = DXTextureImageFileCategoryType_Image + 2;
DXTextureImageFileBlockID_Image_GroupInfo = DXTextureImageFileCategoryType_Image + 3;
DXTextureImageFileBlockID_Image_Name = DXTextureImageFileCategoryType_Image + 4;
DXTextureImageFileBlockID_Image_TransparentColor = DXTextureImageFileCategoryType_Image + 5;
 
type
TDXTextureImageFileHeader = packed record
FileType: array[0..4] of Char;
ver: DWORD;
end;
 
TDXTextureImageFileBlockHeader = packed record
ID: DWORD;
Size: Integer;
end;
 
TDXTextureImageFileBlockHeader_StartGroup = packed record
CategoryType: DWORD;
end;
 
TDXTextureImageHeader_Image_Format = packed record
ImageType: TDXTextureImageType;
Width: DWORD;
Height: DWORD;
BitCount: DWORD;
WidthBytes: DWORD;
end;
 
TDXTextureImageHeader_Image_Format_Index = packed record
idx_index_Mask: DWORD;
idx_alpha_Mask: DWORD;
idx_palette: array[0..255] of TPaletteEntry;
end;
 
TDXTextureImageHeader_Image_Format_RGB = packed record
rgb_red_Mask: DWORD;
rgb_green_Mask: DWORD;
rgb_blue_Mask: DWORD;
rgb_alpha_Mask: DWORD;
end;
 
TDXTextureImageHeader_Image_GroupInfo = packed record
ImageGroupType: DWORD;
ImageID: DWORD;
end;
 
TDXTextureImageHeader_Image_TransparentColor = packed record
Transparent: Boolean;
TransparentColor: DWORD;
end;
 
procedure DXTextureImage_LoadDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage);
 
procedure ReadGroup_Image(Image: TDXTextureImage);
var
i: Integer;
BlockHeader: TDXTextureImageFileBlockHeader;
NextPos: Integer;
SubImage: TDXTextureImage;
Header_StartGroup: TDXTextureImageFileBlockHeader_StartGroup;
Header_Image_Format: TDXTextureImageHeader_Image_Format;
Header_Image_Format_Index: TDXTextureImageHeader_Image_Format_Index;
Header_Image_Format_RGB: TDXTextureImageHeader_Image_Format_RGB;
Header_Image_GroupInfo: TDXTextureImageHeader_Image_GroupInfo;
Header_Image_TransparentColor: TDXTextureImageHeader_Image_TransparentColor;
ImageName: string;
begin
while True do
begin
Stream.ReadBuffer(BlockHeader, SizeOf(BlockHeader));
NextPos := Stream.Position + BlockHeader.Size;
 
case BlockHeader.ID of
DXTextureImageFileBlockID_EndGroup:
begin
{ End of group }
Break;
end;
DXTextureImageFileBlockID_StartGroup:
begin
{ Beginning of group }
Stream.ReadBuffer(Header_StartGroup, SizeOf(Header_StartGroup));
case Header_StartGroup.CategoryType of
DXTextureImageFileCategoryType_Image:
begin
{ Image group }
SubImage := TDXTextureImage.CreateSub(Image);
try
ReadGroup_Image(SubImage);
except
SubImage.Free;
raise;
end;
end;
end;
end;
DXTextureImageFileBlockID_Image_Format:
begin
{ Image information reading (size etc.) }
Stream.ReadBuffer(Header_Image_Format, SizeOf(Header_Image_Format));
 
if (Header_Image_Format.ImageType<>DXTextureImageType_PaletteIndexedColor) and
(Header_Image_Format.ImageType<>DXTextureImageType_RGBColor) then
raise EDXTextureImageError.Create(SInvalidDXTFile);
 
Image.SetSize(Header_Image_Format.ImageType, Header_Image_Format.Width, Header_Image_Format.Height,
Header_Image_Format.BitCount, Header_Image_Format.Widthbytes);
 
if Header_Image_Format.ImageType=DXTextureImageType_PaletteIndexedColor then
begin
{ INDEX IMAGE }
Stream.ReadBuffer(Header_Image_Format_Index, SizeOf(Header_Image_Format_Index));
 
Image.idx_index := dxtMakeChannel(Header_Image_Format_Index.idx_index_Mask, True);
Image.idx_alpha := dxtMakeChannel(Header_Image_Format_Index.idx_alpha_Mask, False);
 
for i:=0 to 255 do
Image.idx_palette[i] := Header_Image_Format_Index.idx_palette[i];
end else if Header_Image_Format.ImageType=DXTextureImageType_RGBColor then
begin
{ RGB IMAGE }
Stream.ReadBuffer(Header_Image_Format_RGB, SizeOf(Header_Image_Format_RGB));
 
Image.rgb_red := dxtMakeChannel(Header_Image_Format_RGB.rgb_red_Mask, False);
Image.rgb_green := dxtMakeChannel(Header_Image_Format_RGB.rgb_green_Mask, False);
Image.rgb_blue := dxtMakeChannel(Header_Image_Format_RGB.rgb_blue_Mask, False);
Image.rgb_alpha := dxtMakeChannel(Header_Image_Format_RGB.rgb_alpha_Mask, False);
end;
end;
DXTextureImageFileBlockID_Image_Name:
begin
{ Name reading }
SetLength(ImageName, BlockHeader.Size);
Stream.ReadBuffer(ImageName[1], BlockHeader.Size);
 
Image.ImageName := ImageName;
end;
DXTextureImageFileBlockID_Image_GroupInfo:
begin
{ Image group information reading }
Stream.ReadBuffer(Header_Image_GroupInfo, SizeOf(Header_Image_GroupInfo));
 
Image.ImageGroupType := Header_Image_GroupInfo.ImageGroupType;
Image.ImageID := Header_Image_GroupInfo.ImageID;
end;
DXTextureImageFileBlockID_Image_TransparentColor:
begin
{ Transparent color information reading }
Stream.ReadBuffer(Header_Image_TransparentColor, SizeOf(Header_Image_TransparentColor));
 
Image.Transparent := Header_Image_TransparentColor.Transparent;
Image.TransparentColor := Header_Image_TransparentColor.TransparentColor;
end;
DXTextureImageFileBlockID_Image_PixelData:
begin
{ Pixel data reading }
for i:=0 to Image.Height-1 do
Stream.ReadBuffer(Image.ScanLine[i]^, Header_Image_Format.Widthbytes);
end;
end;
 
Stream.Seek(NextPos, soFromBeginning);
end;
end;
 
var
FileHeader: TDXTextureImageFileHeader;
BlockHeader: TDXTextureImageFileBlockHeader;
Header_StartGroup: TDXTextureImageFileBlockHeader_StartGroup;
NextPos: Integer;
begin
{ File header reading }
Stream.ReadBuffer(FileHeader, SizeOf(FileHeader));
 
if FileHeader.FileType<>DXTextureImageFile_Type then
raise EDXTextureImageError.Create(SInvalidDXTFile);
if FileHeader.ver<>DXTextureImageFile_Version then
raise EDXTextureImageError.Create(SInvalidDXTFile);
 
while True do
begin
Stream.ReadBuffer(BlockHeader, SizeOf(BlockHeader));
NextPos := Stream.Position + BlockHeader.Size;
 
case BlockHeader.ID of
DXTextureImageFileBlockID_EndFile:
begin
{ End of file }
Break;
end;
DXTextureImageFileBlockID_StartGroup:
begin
{ Beginning of group }
Stream.ReadBuffer(Header_StartGroup, SizeOf(Header_StartGroup));
case Header_StartGroup.CategoryType of
DXTextureImageFileCategoryType_Image: ReadGroup_Image(Image);
end;
end;
end;
Stream.Seek(NextPos, soFromBeginning);
end;
end;
 
type
PDXTextureImageFileBlockHeaderWriter_BlockInfo = ^TDXTextureImageFileBlockHeaderWriter_BlockInfo;
TDXTextureImageFileBlockHeaderWriter_BlockInfo = record
BlockID: DWORD;
StreamPos: Integer;
end;
 
TDXTextureImageFileBlockHeaderWriter = class
private
FStream: TStream;
FList: TList;
public
constructor Create(Stream: TStream);
destructor Destroy; override;
procedure StartBlock(BlockID: DWORD);
procedure EndBlock;
procedure WriteBlock(BlockID: DWORD);
procedure StartGroup(CategoryType: DWORD);
procedure EndGroup;
end;
 
constructor TDXTextureImageFileBlockHeaderWriter.Create(Stream: TStream);
begin
inherited Create;
FStream := Stream;
FList := TList.Create;
end;
 
destructor TDXTextureImageFileBlockHeaderWriter.Destroy;
var
i: Integer;
begin
for i:=0 to FList.Count-1 do
Dispose(PDXTextureImageFileBlockHeaderWriter_BlockInfo(FList[i]));
FList.Free;
inherited Destroy;
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.StartBlock(BlockID: DWORD);
var
BlockInfo: PDXTextureImageFileBlockHeaderWriter_BlockInfo;
BlockHeader: TDXTextureImageFileBlockHeader;
begin
New(BlockInfo);
BlockInfo.BlockID := BlockID;
BlockInfo.StreamPos := FStream.Position;
FList.Add(BlockInfo);
 
BlockHeader.ID := BlockID;
BlockHeader.Size := 0;
FStream.WriteBuffer(BlockHeader, SizeOf(BlockHeader));
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.EndBlock;
var
BlockHeader: TDXTextureImageFileBlockHeader;
BlockInfo: PDXTextureImageFileBlockHeaderWriter_BlockInfo;
CurStreamPos: Integer;
begin
CurStreamPos := FStream.Position;
try
BlockInfo := FList[FList.Count-1];
 
FStream.Position := BlockInfo.StreamPos;
BlockHeader.ID := BlockInfo.BlockID;
BlockHeader.Size := CurStreamPos-(BlockInfo.StreamPos+SizeOf(TDXTextureImageFileBlockHeader));
FStream.WriteBuffer(BlockHeader, SizeOf(BlockHeader));
finally
FStream.Position := CurStreamPos;
 
Dispose(FList[FList.Count-1]);
FList.Count := FList.Count-1;
end;
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.WriteBlock(BlockID: DWORD);
var
BlockHeader: TDXTextureImageFileBlockHeader;
begin
BlockHeader.ID := BlockID;
BlockHeader.Size := 0;
FStream.WriteBuffer(BlockHeader, SizeOf(BlockHeader));
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.StartGroup(CategoryType: DWORD);
var
Header_StartGroup: TDXTextureImageFileBlockHeader_StartGroup;
begin
StartBlock(DXTextureImageFileBlockID_StartGroup);
 
Header_StartGroup.CategoryType := CategoryType;
FStream.WriteBuffer(Header_StartGroup, SizeOf(Header_StartGroup));
end;
 
procedure TDXTextureImageFileBlockHeaderWriter.EndGroup;
begin
WriteBlock(DXTextureImageFileBlockID_EndGroup);
EndBlock;
end;
 
procedure DXTextureImage_SaveDXTextureImageFunc(Stream: TStream; Image: TDXTextureImage);
var
BlockHeaderWriter: TDXTextureImageFileBlockHeaderWriter;
 
function CalcProgressCount(Image: TDXTextureImage): Integer;
var
i: Integer;
begin
Result := Image.WidthBytes*Image.Height;
for i:=0 to Image.SubImageCount-1 do
Inc(Result, CalcProgressCount(Image.SubImages[i]));
end;
 
procedure WriteGroup_Image(Image: TDXTextureImage);
var
i: Integer;
Header_Image_Format: TDXTextureImageHeader_Image_Format;
Header_Image_Format_Index: TDXTextureImageHeader_Image_Format_Index;
Header_Image_Format_RGB: TDXTextureImageHeader_Image_Format_RGB;
Header_Image_GroupInfo: TDXTextureImageHeader_Image_GroupInfo;
Header_Image_TransparentColor: TDXTextureImageHeader_Image_TransparentColor;
begin
BlockHeaderWriter.StartGroup(DXTextureImageFileCategoryType_Image);
try
{ Image format writing }
if Image.Size>0 then
begin
Header_Image_Format.ImageType := Image.ImageType;
Header_Image_Format.Width := Image.Width;
Header_Image_Format.Height := Image.Height;
Header_Image_Format.BitCount := Image.BitCount;
Header_Image_Format.WidthBytes := Image.WidthBytes;
 
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_Format);
try
Stream.WriteBuffer(Header_Image_Format, SizeOf(Header_Image_Format));
 
case Image.ImageType of
DXTextureImageType_PaletteIndexedColor:
begin
{ INDEX IMAGE }
Header_Image_Format_Index.idx_index_Mask := Image.idx_index.Mask;
Header_Image_Format_Index.idx_alpha_Mask := Image.idx_alpha.Mask;
for i:=0 to 255 do
Header_Image_Format_Index.idx_palette[i] := Image.idx_palette[i];
 
Stream.WriteBuffer(Header_Image_Format_Index, SizeOf(Header_Image_Format_Index));
end;
DXTextureImageType_RGBColor:
begin
{ RGB IMAGE }
Header_Image_Format_RGB.rgb_red_Mask := Image.rgb_red.Mask;
Header_Image_Format_RGB.rgb_green_Mask := Image.rgb_green.Mask;
Header_Image_Format_RGB.rgb_blue_Mask := Image.rgb_blue.Mask;
Header_Image_Format_RGB.rgb_alpha_Mask := Image.rgb_alpha.Mask;
 
Stream.WriteBuffer(Header_Image_Format_RGB, SizeOf(Header_Image_Format_RGB));
end;
end;
finally
BlockHeaderWriter.EndBlock;
end;
end;
 
{ Image group information writing }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_GroupInfo);
try
Header_Image_GroupInfo.ImageGroupType := Image.ImageGroupType;
Header_Image_GroupInfo.ImageID := Image.ImageID;
 
Stream.WriteBuffer(Header_Image_GroupInfo, SizeOf(Header_Image_GroupInfo));
finally
BlockHeaderWriter.EndBlock;
end;
 
{ Name writing }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_Name);
try
Stream.WriteBuffer(Image.ImageName[1], Length(Image.ImageName));
finally
BlockHeaderWriter.EndBlock;
end;
 
{ Transparent color writing }
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_TransparentColor);
try
Header_Image_TransparentColor.Transparent := Image.Transparent;
Header_Image_TransparentColor.TransparentColor := Image.TransparentColor;
 
Stream.WriteBuffer(Header_Image_TransparentColor, SizeOf(Header_Image_TransparentColor));
finally
BlockHeaderWriter.EndBlock;
end;
 
{ Pixel data writing }
if Image.Size>0 then
begin
BlockHeaderWriter.StartBlock(DXTextureImageFileBlockID_Image_PixelData);
try
for i:=0 to Image.Height-1 do
Stream.WriteBuffer(Image.ScanLine[i]^, Image.Widthbytes);
finally
BlockHeaderWriter.EndBlock;
end;
end;
 
{ Sub-image writing }
for i:=0 to Image.SubImageCount-1 do
WriteGroup_Image(Image.SubImages[i]);
finally
BlockHeaderWriter.EndGroup;
end;
end;
 
var
FileHeader: TDXTextureImageFileHeader;
begin
{ File header writing }
FileHeader.FileType := DXTextureImageFile_Type;
FileHeader.ver := DXTextureImageFile_Version;
Stream.WriteBuffer(FileHeader, SizeOf(FileHeader));
 
{ Image writing }
BlockHeaderWriter := TDXTextureImageFileBlockHeaderWriter.Create(Stream);
try
{ Image writing }
WriteGroup_Image(Image);
 
{ End of file }
BlockHeaderWriter.WriteBlock(DXTextureImageFileBlockID_EndFile);
finally
BlockHeaderWriter.Free;
end;
end;
 
{ DXTextureImage_LoadBitmapFunc }
 
procedure DXTextureImage_LoadBitmapFunc(Stream: TStream; Image: TDXTextureImage);
type
TDIBPixelFormat = packed record
RBitMask, GBitMask, BBitMask: DWORD;
end;
var
TopDown: Boolean;
BF: TBitmapFileHeader;
BI: TBitmapInfoHeader;
 
procedure DecodeRGB;
var
y: Integer;
begin
for y:=0 to Image.Height-1 do
begin
if TopDown then
Stream.ReadBuffer(Image.ScanLine[y]^, Image.WidthBytes)
else
Stream.ReadBuffer(Image.ScanLine[Image.Height-y-1]^, Image.WidthBytes);
end;
end;
 
procedure DecodeRLE4;
var
SrcDataP: Pointer;
B1, B2, C: Byte;
Dest, Src, P: PByte;
X, Y, i: Integer;
begin
GetMem(SrcDataP, BI.biSizeImage);
try
Stream.ReadBuffer(SrcDataP^, BI.biSizeImage);
 
Dest := Image.TopPBits;
Src := SrcDataP;
X := 0;
Y := 0;
 
while True do
begin
B1 := Src^; Inc(Src);
B2 := Src^; Inc(Src);
 
if B1=0 then
begin
case B2 of
0: begin { End of line }
X := 0; Inc(Y);
Dest := Image.ScanLine[Y];
end;
1: Break; { End of bitmap }
2: begin { Difference of coordinates }
Inc(X, B1); Inc(Y, B2); Inc(Src, 2);
Dest := Image.ScanLine[Y];
end;
else
{ Absolute mode }
C := 0;
for i:=0 to B2-1 do
begin
if i and 1=0 then
begin
C := Src^; Inc(Src);
end else
begin
C := C shl 4;
end;
 
P := Pointer(Integer(Dest)+X shr 1);
if X and 1=0 then
P^ := (P^ and $0F) or (C and $F0)
else
P^ := (P^ and $F0) or ((C and $F0) shr 4);
 
Inc(X);
end;
end;
end else
begin
{ Encoding mode }
for i:=0 to B1-1 do
begin
P := Pointer(Integer(Dest)+X shr 1);
if X and 1=0 then
P^ := (P^ and $0F) or (B2 and $F0)
else
P^ := (P^ and $F0) or ((B2 and $F0) shr 4);
 
Inc(X);
 
// Swap nibble
B2 := (B2 shr 4) or (B2 shl 4);
end;
end;
 
{ Word arrangement }
Inc(Src, Longint(Src) and 1);
end;
finally
FreeMem(SrcDataP);
end;
end;
 
procedure DecodeRLE8;
var
SrcDataP: Pointer;
B1, B2: Byte;
Dest, Src: PByte;
X, Y: Integer;
begin
GetMem(SrcDataP, BI.biSizeImage);
try
Stream.ReadBuffer(SrcDataP^, BI.biSizeImage);
 
Dest := Image.TopPBits;
Src := SrcDataP;
X := 0;
Y := 0;
 
while True do
begin
B1 := Src^; Inc(Src);
B2 := Src^; Inc(Src);
 
if B1=0 then
begin
case B2 of
0: begin { End of line }
X := 0; Inc(Y);
Dest := Pointer(Longint(Image.TopPBits)+Y*Image.NextLine+X);
end;
1: Break; { End of bitmap }
2: begin { Difference of coordinates }
Inc(X, B1); Inc(Y, B2); Inc(Src, 2);
Dest := Pointer(Longint(Image.TopPBits)+Y*Image.NextLine+X);
end;
else
{ Absolute mode }
Move(Src^, Dest^, B2); Inc(Dest, B2); Inc(Src, B2);
end;
end else
begin
{ Encoding mode }
FillChar(Dest^, B1, B2); Inc(Dest, B1);
end;
 
{ Word arrangement }
Inc(Src, Longint(Src) and 1);
end;
finally
FreeMem(SrcDataP);
end;
end;
 
var
BC: TBitmapCoreHeader;
RGBTriples: array[0..255] of TRGBTriple;
RGBQuads: array[0..255] of TRGBQuad;
i, PalCount, j: Integer;
OS2: Boolean;
PixelFormat: TDIBPixelFormat;
begin
{ File header reading }
i := Stream.Read(BF, SizeOf(TBitmapFileHeader));
if i=0 then Exit;
if i<>SizeOf(TBitmapFileHeader) then
raise EDXTextureImageError.Create(SInvalidDIB);
 
{ Is the head 'BM'? }
if BF.bfType<>Ord('B') + Ord('M')*$100 then
raise EDXTextureImageError.Create(SInvalidDIB);
 
{ Reading of size of header }
i := Stream.Read(BI.biSize, 4);
if i<>4 then
raise EDXTextureImageError.Create(SInvalidDIB);
 
{ Kind check of DIB }
OS2 := False;
 
case BI.biSize of
SizeOf(TBitmapCoreHeader):
begin
{ OS/2 type }
Stream.ReadBuffer(Pointer(Integer(@BC)+4)^, SizeOf(TBitmapCoreHeader)-4);
 
FilLChar(BI, SizeOf(BI), 0);
with BI do
begin
biClrUsed := 0;
biCompression := BI_RGB;
biBitCount := BC.bcBitCount;
biHeight := BC.bcHeight;
biWidth := BC.bcWidth;
end;
 
OS2 := True;
end;
SizeOf(TBitmapInfoHeader):
begin
{ Windows type }
Stream.ReadBuffer(Pointer(Integer(@BI)+4)^, SizeOf(TBitmapInfoHeader)-4);
end;
else
raise EDXTextureImageError.Create(SInvalidDIB);
end;
 
{ Bit mask reading }
if BI.biCompression = BI_BITFIELDS then
begin
Stream.ReadBuffer(PixelFormat, SizeOf(PixelFormat));
end else
begin
if BI.biBitCount=16 then
begin
PixelFormat.RBitMask := $7C00;
PixelFormat.GBitMask := $03E0;
PixelFormat.BBitMask := $001F;
end else if (BI.biBitCount=24) or (BI.biBitCount=32) then
begin
PixelFormat.RBitMask := $00FF0000;
PixelFormat.GBitMask := $0300FF00;
PixelFormat.BBitMask := $000000FF;
end;
end;
 
{ DIB making }
if BI.biHeight<0 then
begin
BI.biHeight := -BI.biHeight;
TopDown := True;
end else
TopDown := False;
 
if BI.biBitCount in [1, 4, 8] then
begin
Image.SetSize(DXTextureImageType_PaletteIndexedColor, BI.biWidth, BI.biHeight, BI.biBitCount,
(((BI.biWidth*BI.biBitCount)+31) div 32)*4);
 
Image.idx_index := dxtMakeChannel(1 shl BI.biBitCount-1, True);
Image.PackedPixelOrder := True;
end else
begin
Image.SetSize(DXTextureImageType_RGBColor, BI.biWidth, BI.biHeight, BI.biBitCount,
(((BI.biWidth*BI.biBitCount)+31) div 32)*4);
 
Image.rgb_red := dxtMakeChannel(PixelFormat.RBitMask, False);
Image.rgb_green := dxtMakeChannel(PixelFormat.GBitMask, False);
Image.rgb_blue := dxtMakeChannel(PixelFormat.BBitMask, False);
 
j := Image.rgb_red.BitCount+Image.rgb_green.BitCount+Image.rgb_blue.BitCount;
if j<BI.biBitCount then
Image.rgb_alpha := dxtMakeChannel((1 shl (BI.biBitCount-j)-1) shl j, False);
 
Image.PackedPixelOrder := False;
end;
 
{ palette reading }
PalCount := BI.biClrUsed;
if (PalCount=0) and (BI.biBitCount<=8) then
PalCount := 1 shl BI.biBitCount;
if PalCount>256 then PalCount := 256;
 
if OS2 then
begin
{ OS/2 type }
Stream.ReadBuffer(RGBTriples, SizeOf(TRGBTriple)*PalCount);
for i:=0 to PalCount-1 do
begin
Image.idx_palette[i].peRed := RGBTriples[i].rgbtRed;
Image.idx_palette[i].peGreen := RGBTriples[i].rgbtGreen;
Image.idx_palette[i].peBlue := RGBTriples[i].rgbtBlue;
end;
end else
begin
{ Windows type }
Stream.ReadBuffer(RGBQuads, SizeOf(TRGBQuad)*PalCount);
for i:=0 to PalCount-1 do
begin
Image.idx_palette[i].peRed := RGBQuads[i].rgbRed;
Image.idx_palette[i].peGreen := RGBQuads[i].rgbGreen;
Image.idx_palette[i].peBlue := RGBQuads[i].rgbBlue;
end;
end;
 
{ Pixel data reading }
case BI.biCompression of
BI_RGB : DecodeRGB;
BI_BITFIELDS: DecodeRGB;
BI_RLE4 : DecodeRLE4;
BI_RLE8 : DecodeRLE8;
else
raise EDXTextureImageError.Create(SInvalidDIB);
end;
end;
 
initialization
finalization
_DXTextureImageLoadFuncList.Free;
end.
/VCL_DELPHIX_D6/DXPictEdit.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXPlay.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXInput.pas
6,20 → 6,7
 
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, MMSystem,
DXClass, {$IFDEF VER17UP} Types, {$ENDIF}
{$IfDef StandardDX}
{$IfDef DX9}
DirectInput;
{$Else}
{$IfDef DX81}
DirectInput8;
{$Else}
DirectInput;
{$EndIf}
{$EndIf}
{$Else}
DirectX;
{$EndIf}
DirectX, DXClass;
 
type
 
778,7 → 765,7
FFindEffectGUID := pdei.guid;
end;
 
Result := Integer(DIENUM_STOP);
Result := DIENUM_STOP;
end;
 
procedure CreateIEffectGuid(const GUID: TGUID;
787,7 → 774,7
if EffectObject.Feff.dwSize=0 then Exit;
 
if FRoot.FInput.FDevice2<>nil then
FRoot.FInput.FDevice2.CreateEffect(GUID, @EffectObject.Feff, EffectObject.FEffect, nil);
FRoot.FInput.FDevice2.CreateEffect(GUID, EffectObject.Feff, EffectObject.FEffect, nil);
end;
 
procedure CreateIEffect(dwFlags: DWORD;
1418,11 → 1405,11
 
if FDevice<>nil then
begin
hr := FDevice.GetDeviceState(dwSize, @Data);
hr := FDevice.GetDeviceState(dwSize, Data);
if (hr=DIERR_INPUTLOST) or (hr=DIERR_NOTACQUIRED) then
begin
FDevice.Acquire;
hr := FDevice.GetDeviceState(dwSize, @Data);
hr := FDevice.GetDeviceState(dwSize, Data);
end;
Result := hr=DI_OK;
end else
1434,7 → 1421,7
function DIEnumDeviceObjectsProc(const peff: TDIDeviceObjectInstanceA;
pvRef: Pointer): HRESULT; stdcall;
begin
Result := Integer(DIENUM_CONTINUE);
Result := DIENUM_CONTINUE;
 
if CompareMem(@peff.guidType, @GUID_Unknown, SizeOf(TGUID)) then Exit;
 
1659,11 → 1646,8
DIK_APPS : Result := VK_APPS;
end;
end;
{$IFDEF StandardDX}
type
TDIKeyboardState = array[0..255] of Byte;
{$ENDIF}
var
 
var
j: Integer;
i: TDXInputState;
dikb: TDIKeyboardState;
1864,7 → 1848,7
function TJoystick_EnumJoysticksCallback(const lpddi: TDIDeviceInstanceA;
pvRef: Pointer): HRESULT; stdcall;
begin
Result := Integer(DIENUM_CONTINUE);
Result := DIENUM_CONTINUE;
 
with TJoystick(pvRef) do
begin
1872,7 → 1856,7
begin
FDeviceGUID := lpddi.guidInstance;
FEnumFlag := True;
Result := Integer(DIENUM_STOP);
Result := DIENUM_STOP;
Exit;
end;
Inc(FEnumIndex);
1896,7 → 1880,7
FEnumFlag := False;
FEnumIndex := 0;
 
FDXInput.FDInput.EnumDevices({DIDEVTYPE_JOYSTICK}4, @TJoystick_EnumJoysticksCallback,
FDXInput.FDInput.EnumDevices(DIDEVTYPE_JOYSTICK, @TJoystick_EnumJoysticksCallback,
Self, DIEDFL_ATTACHEDONLY);
 
if not FEnumFlag then Exit;
1912,7 → 1896,7
FForceFeedbackDevice := True;
end;
 
//if FDXInput.FDInput.CreateDevice(GUID_Joystick, FDevice, nil)<>DI_OK then Exit; get out by Paul van Dinther
if FDXInput.FDInput.CreateDevice(GUID_Joystick, FDevice, nil)<>DI_OK then Exit;
 
{ Device data format (TDIDataFormat) making. }
 
2138,12 → 2122,12
procedure InitDirectInput(out DI: IDirectInput);
type
TDirectInputCreate = function(hinst: THandle; dwVersion: DWORD;
out ppDI: {$IFDEF UNICODE}IDirectInputW{$ELSE}IDirectInputA{$ENDIF}; punkOuter: IUnknown): HRESULT; stdcall;
out ppDI: IDirectInputA; punkOuter: IUnknown): HRESULT; stdcall;
begin
if FDirectInput=nil then
begin
try
TDirectInputCreate(DXLoadLibrary('DInput.dll', {$IFDEF UNICODE}'DirectInputCreateW'{$ELSE}'DirectInputCreateA'{$ENDIF}))
TDirectInputCreate(DXLoadLibrary('DInput.dll', 'DirectInputCreateA'))
(HInstance, DIRECTINPUT_VERSION, FDirectInput, nil);
except
FDirectInput := nil;
2342,4 → 2326,4
FOldStates := s;
end;
 
end.
end.
/VCL_DELPHIX_D6/DXWaveEdit.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXReg_original.pas
0,0 → 1,685
unit DXReg_original;
 
interface
 
uses
Windows, SysUtils, Classes, DsgnIntf, Forms, Dialogs, Graphics, TypInfo,
DXDraws, DXSounds, DIB, Wave, DXInput, DXPlay, DXSprite, DXClass;
 
type
 
{ TDXDrawDisplayProperty }
 
TDXDrawDisplayProperty = class(TClassProperty)
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
 
{ TDIBProperty }
 
TDIBProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXDIBEditor }
 
TDXDIBEditor = class(TComponentEditor)
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TPictureCollectionItem_PictureProperty }
 
TPictureCollectionItem_PictureProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXImageListEditor }
 
TDXImageListEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TWaveProperty }
 
TWaveProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXWaveEditor }
 
TDXWaveEditor = class(TComponentEditor)
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TDXWaveListEditor }
 
TDXWaveListEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TForceFeedbackEffectsProperty }
 
TForceFeedbackEffectsProperty = class(TClassProperty)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXInputEditor }
 
TDXInputEditor = class(TComponentEditor)
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TGUIDProperty }
 
TGUIDProperty = class(TStringProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
procedure Register;
 
implementation
 
uses DXPictEdit, DXWaveEdit, DXFFBEdit, DXInptEdit, DXGUIDEdit;
 
const
SNone = '(None)';
 
SSettingImage = '&Image...';
SSettingWave = '&Wave...';
SDXGFileFilter = 'DXG file(*.dxg)|*.dxg|All files(*.*)|*.*';
SDXGOpenFileFilter = 'DXG file(*.dxg)|*.dxg|Bitmap file(*.bmp)|*.bmp|All files(*.*)|*.*';
SDXWFileFilter = 'DXW file(*.dxw)|*.dxg|All files(*.*)|*.*';
SDXWOpenFileFilter = 'DXW file(*.dxw)|*.dxw|Wave file(*.wav)|*.wav|All files(*.*)|*.*';
SSinglePlayer = '&Single player';
SMultiPlayer1 = 'Multi player &1';
SMultiPlayer2 = 'Multi player &2';
 
SOpen = '&Open...';
SSave = '&Save..';
 
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TDXDrawDisplay), nil, '',
TDXDrawDisplayProperty);
 
RegisterPropertyEditor(TypeInfo(TDIB), nil, '', TDIBProperty);
RegisterComponentEditor(TCustomDXDIB, TDXDIBEditor);
 
RegisterPropertyEditor(TypeInfo(TPicture), TPictureCollectionItem, 'Picture', TPictureCollectionItem_PictureProperty);
RegisterComponentEditor(TCustomDXImageList, TDXImageListEditor);
 
RegisterPropertyEditor(TypeInfo(TWave), nil, '', TWaveProperty);
RegisterComponentEditor(TCustomDXWave, TDXWaveEditor);
 
RegisterComponentEditor(TCustomDXWaveList, TDXWaveListEditor);
 
RegisterPropertyEditor(TypeInfo(TForceFeedbackEffects), nil, '', TForceFeedbackEffectsProperty);
 
RegisterComponentEditor(TCustomDXInput, TDXInputEditor);
 
RegisterPropertyEditor(TypeInfo(string), TCustomDXPlay, 'GUID', TGUIDProperty);
 
RegisterComponents('DelphiX',
[TDXDraw,
TDXDIB,
TDXImageList,
TDX3D,
TDXSound,
TDXWave,
TDXWaveList,
TDXInput,
TDXPlay,
TDXSpriteEngine,
TDXTimer,
TDXPaintBox]);
end;
 
{ TDXDrawDisplayProperty }
 
function TDXDrawDisplayProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paValueList] - [paReadOnly];
end;
 
const
SDisplayMode = '%dx%dx%d';
 
function TDXDrawDisplayProperty.GetValue: string;
begin
with TDXDrawDisplay(GetOrdValue) do
Result := Format(SDisplayMode, [Width, Height, BitCount]);
end;
 
procedure TDXDrawDisplayProperty.GetValues(Proc: TGetStrProc);
const
List: array[0..2] of TPoint = (
(X: 640; Y: 480),
(X: 800; Y: 600),
(X: 1024; Y: 768));
var
BitCount, i: Integer;
begin
for i:=Low(List) to High(List) do
for BitCount:=1 to 3 do
Proc(Format(SDisplayMode, [List[i].x, List[i].y, BitCount*8]));
end;
 
procedure TDXDrawDisplayProperty.SetValue(const Value: string);
var
s: string;
i, AWidth, AHeight, ABitCount: Integer;
begin
s := Value;
 
i := Pos('x', s);
AWidth := StrToInt(Copy(s, 1, i-1));
s := Copy(s, i+1, Length(s));
 
i := Pos('x', s);
AHeight := StrToInt(Copy(s, 1, i-1));
s := Copy(s, i+1, Length(s));
 
ABitCount := StrToInt(s);
 
with TDXDrawDisplay(GetOrdValue) do
begin
Width := AWidth;
Height := AHeight;
BitCount := ABitCount;
end;
 
SetOrdValue(GetOrdValue);
end;
 
{ TDIBProperty }
 
procedure TDIBProperty.Edit;
var
Form: TDelphiXPictureEditForm;
begin
Form := TDelphiXPictureEditForm.Create(nil);
try
Form.ViewBox.Picture.Assign(TDIB(GetOrdValue));
Form.DIBClassOnly := True;
Form.ShowModal;
if Form.Tag<>0 then
begin
SetOrdValue(Integer(Form.ViewBox.Picture.Graphic));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TDIBProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TDIBProperty.GetValue: string;
begin
if TDIB(GetOrdValue).Size=0 then
Result := SNone
else
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TDXDIBEditor }
 
procedure TDXDIBEditor.Edit;
var
Form: TDelphiXPictureEditForm;
begin
Form := TDelphiXPictureEditForm.Create(nil);
try
Form.ViewBox.Picture.Assign(TCustomDXDIB(Component).DIB);
Form.DIBClassOnly := True;
Form.ShowModal;
if Form.Tag<>0 then
begin
TCustomDXDIB(Component).DIB.Assign(TGraphic(Form.ViewBox.Picture.Graphic));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
procedure TDXDIBEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: Edit;
end;
end;
 
function TDXDIBEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SSettingImage;
end;
end;
 
function TDXDIBEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
{ TPictureCollectionItem_PictureProperty }
 
procedure TPictureCollectionItem_PictureProperty.Edit;
var
Form: TDelphiXPictureEditForm;
Item: TPictureCollectionItem;
TempDIB: TDIB;
begin
Form := TDelphiXPictureEditForm.Create(nil);
try
Form.ViewBox.Picture := TPicture(GetOrdValue);
Form.ShowModal;
if Form.Tag<>0 then
begin
SetOrdValue(Integer(Form.ViewBox.Picture));
 
Item := GetComponent(0) as TPictureCollectionItem;
if Item.Picture.Graphic<>nil then
begin
TempDIB := TDIB.Create;
try
TempDIB.SetSize(1, 1, 24);
TempDIB.Canvas.Draw(0, 0, Item.Picture.Graphic);
Item.TransparentColor := TempDIB.Pixels[0, 0];
finally
TempDIB.Free;
end;
end;
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TPictureCollectionItem_PictureProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TPictureCollectionItem_PictureProperty.GetValue: string;
begin
if (TPicture(GetOrdValue).Graphic=nil) or (TPicture(GetOrdValue).Graphic.Empty) then
Result := SNone
else
Result := Format('(%s)', [TPicture(GetOrdValue).Graphic.ClassName]);
end;
 
{ TDXImageListEditor }
 
procedure TDXImageListEditor.ExecuteVerb(Index: Integer);
var
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
i: Integer;
begin
case Index of
0: begin
OpenDialog := TOpenDialog.Create(nil);
try
OpenDialog.DefaultExt := 'dxg';
OpenDialog.Filter := SDXGOpenFileFilter;
OpenDialog.Options := [ofPathMustExist, ofFileMustExist, ofAllowMultiSelect];
if OpenDialog.Execute then
begin
if OpenDialog.FilterIndex=2 then
begin
for i:=0 to OpenDialog.Files.Count-1 do
with TPictureCollectionItem.Create(TCustomDXImageList(Component).Items) do
begin
try
Picture.LoadFromFile(OpenDialog.Files[i]);
Name := ExtractFileName(OpenDialog.Files[i]);
except
Free;
raise;
end;
end;
end else
TCustomDXImageList(Component).Items.LoadFromFile(OpenDialog.FileName);
Designer.Modified;
end;
finally
OpenDialog.Free;
end;
end;
1: begin
SaveDialog := TSaveDialog.Create(nil);
try
SaveDialog.DefaultExt := 'dxg';
SaveDialog.Filter := SDXGFileFilter;
SaveDialog.Options := [ofOverwritePrompt, ofPathMustExist];
if SaveDialog.Execute then
TCustomDXImageList(Component).Items.SaveToFile(SaveDialog.FileName);
finally
SaveDialog.Free;
end;
end;
end;
end;
 
function TDXImageListEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SOpen;
1: Result := SSave;
end;
end;
 
function TDXImageListEditor.GetVerbCount: Integer;
begin
Result := 2;
end;
 
{ TWaveProperty }
 
procedure TWaveProperty.Edit;
var
Form: TDelphiXWaveEditForm;
begin
Form := TDelphiXWaveEditForm.Create(nil);
try
Form.Wave := TWave(GetOrdValue);
Form.ShowModal;
if Form.Tag<>0 then
begin
SetOrdValue(Integer(Form.Wave));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TWaveProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TWaveProperty.GetValue: string;
begin
if TWave(GetOrdValue).Size=0 then
Result := SNone
else
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TDXWaveEditor }
 
procedure TDXWaveEditor.Edit;
var
Form: TDelphiXWaveEditForm;
begin
Form := TDelphiXWaveEditForm.Create(nil);
try
Form.Wave := TCustomDXWave(Component).Wave;
Form.ShowModal;
if Form.Tag<>0 then
begin
TCustomDXWave(Component).Wave := Form.Wave;
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
procedure TDXWaveEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: Edit;
end;
end;
 
function TDXWaveEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SSettingWave;
end;
end;
 
function TDXWaveEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
{ TDXWaveListEditor }
 
procedure TDXWaveListEditor.ExecuteVerb(Index: Integer);
var
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
i: Integer;
begin
case Index of
0: begin
OpenDialog := TOpenDialog.Create(nil);
try
OpenDialog.DefaultExt := 'dxw';
OpenDialog.Filter := SDXWOpenFileFilter;
OpenDialog.Options := [ofPathMustExist, ofFileMustExist, ofAllowMultiSelect];
if OpenDialog.Execute then
begin
if OpenDialog.FilterIndex=2 then
begin
for i:=0 to OpenDialog.Files.Count-1 do
with TWaveCollectionItem.Create(TCustomDXWaveList(Component).Items) do
begin
try
Wave.LoadFromFile(OpenDialog.Files[i]);
Name := ExtractFileName(OpenDialog.Files[i]);
except
Free;
raise;
end;
end;
end else
TCustomDXWaveList(Component).Items.LoadFromFile(OpenDialog.FileName);
Designer.Modified;
end;
finally
OpenDialog.Free;
end;
end;
1: begin
SaveDialog := TSaveDialog.Create(nil);
try
SaveDialog.DefaultExt := 'dxw';
SaveDialog.Filter := SDXWFileFilter;
SaveDialog.Options := [ofOverwritePrompt, ofPathMustExist];
if SaveDialog.Execute then
TCustomDXWaveList(Component).Items.SaveToFile(SaveDialog.FileName);
finally
SaveDialog.Free;
end;
end;
end;
end;
 
function TDXWaveListEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SOpen;
1: Result := SSave;
end;
end;
 
function TDXWaveListEditor.GetVerbCount: Integer;
begin
Result := 2;
end;
 
{ TForceFeedbackEffectsProperty }
 
procedure TForceFeedbackEffectsProperty.Edit;
var
Form: TDelphiXFFEditForm;
Effects: TForceFeedbackEffects;
begin
Effects := TForceFeedbackEffects(GetOrdValue);
 
Form := TDelphiXFFEditForm.Create(nil);
try
if Effects.Input is TJoystick then
Form.Effects := Form.DXInput.Joystick.Effects
else if Effects.Input is TKeyboard then
Form.Effects := Form.DXInput.Keyboard.Effects
else if Effects.Input is TMouse then
Form.Effects := Form.DXInput.Mouse.Effects
else Exit;
 
Form.Effects.Assign(TForceFeedbackEffects(GetOrdValue));
Form.ShowModal;
if Form.Tag<>0 then
begin
SetOrdValue(Integer(Form.Effects));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TForceFeedbackEffectsProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TForceFeedbackEffectsProperty.GetValue: string;
begin
if TForceFeedbackEffects(GetOrdValue).Count=0 then
Result := SNone
else
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TDXInputEditor }
 
procedure TDXInputEditor.Edit;
var
Form: TDelphiXInputEditForm;
begin
Form := TDelphiXInputEditForm.Create(nil);
try
Form.DXInput := TCustomDXInput(Component);
Form.ShowModal;
if Form.Tag<>0 then
Designer.Modified;
finally
Form.Free;
end;
end;
 
procedure TDXInputEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: begin
with TCustomDXInput(Component) do
begin
Joystick.ID := 0;
Keyboard.KeyAssigns := DefKeyAssign;
end;
Designer.Modified;
end;
1: begin
with TCustomDXInput(Component) do
begin
Joystick.ID := 0;
Keyboard.KeyAssigns := DefKeyAssign2_1;
end;
Designer.Modified;
end;
2: begin
with TCustomDXInput(Component) do
begin
Joystick.ID := 1;
Keyboard.KeyAssigns := DefKeyAssign2_2;
end;
Designer.Modified;
end;
end;
end;
 
function TDXInputEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SSinglePlayer;
1: Result := SMultiPlayer1;
2: Result := SMultiPlayer2;
end;
end;
 
function TDXInputEditor.GetVerbCount: Integer;
begin
Result := 3;
end;
 
{ TGUIDProperty }
 
procedure TGUIDProperty.Edit;
var
Form: TDelphiXGUIDEditForm;
begin
Form := TDelphiXGUIDEditForm.Create(nil);
try
Form.GUID := GetStrValue;
Form.ShowModal;
if Form.Tag<>0 then
begin
SetStrValue(Form.GUID);
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TGUIDProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog];
end;
 
end.
/VCL_DELPHIX_D6/DXSounds.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXPictEdit.pas
1,10 → 1,10
unit DXPictEdit;
{$INCLUDE DelphiXcfg.inc}
 
interface
 
uses
Windows, SysUtils, Classes, Forms, Dialogs, Controls, StdCtrls, ExtCtrls,
ExtDlgs, DIB, Menus, Graphics, Clipbrd {$IFDEF VER28UP}, PNGImage{$ENDIF};
ExtDlgs, DIB, Menus, Graphics, Clipbrd;
 
type
 
/VCL_DELPHIX_D6/DXPlay.pas
1,33 → 1,13
unit DXPlay;
 
{$INCLUDE DelphiXcfg.inc}
 
{$IFNDEF UseDirectPlay}
// If you want to use DXPlay.pas, please enable the IFDEF UseDirectPlay in DelphiXcfg.inc
interface
implementation
{$ELSE} // !UseDirectPlay
 
interface
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, SysUtils, Classes, Forms, DXClass, ActiveX, DXETable,
{$IfDef StandardDX}
DirectDraw,
// Delphi 2010 cannot be use DirectPlay8 because structure was not rewriten
// {$IfDef DX9}
// DirectPlay8, DX7toDX8;
// {$Else}
DirectPlay; //old wersion, current in directory
// {$EndIf}
{$Else}
DirectX;
{$EndIf}
 
Windows, SysUtils, Classes, Forms, DXClass, ActiveX, DirectX, DXETable;
type
{$IfDef DX9}
TDPID = DWORD;
{$EndIf}
 
{ TDXPlayPlayer }
 
108,8 → 88,7
 
TCustomDXPlay = class(TComponent)
private
FDPlay: //{$IfDef DX7}
IDirectPlay4A;//{$Else}IDirectPlay8Address{$EndIf};
FDPlay: IDirectPlay4A;
FGUID: string;
FIsHost: Boolean;
FLocalPlayer: TDXPlayPlayer;
137,11 → 116,7
FAsync: Boolean;
FAsyncSupported: Boolean;
procedure ChangeDPlay;
procedure CreateDPlayWithoutDialog(out DPlay:
//{$IfDef DX7}
IDirectPlay4A;
//{$Else}IDirectPlay8Address{$EndIf};
const ProviderName: string);
procedure CreateDPlayWithoutDialog(out DPlay: IDirectPlay4A; const ProviderName: string);
function OpenDPlayWithLobby(out Name: string): Boolean;
function OpenDPlayWithoutLobby(out Name: string): Boolean;
function OpenDPlayWithoutLobby2(const NewSession: Boolean; const ProviderName, SessionName, PlayerName: string): Boolean;
216,10 → 191,7
function DXPlayMessageType(P: Pointer): DWORD;
 
function DXPlayStringToGUID(const S: string): TGUID;
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP:
//{$IfDef DX7}
IDirectPlay;
//{$Else}IDirectPlay8Server{$EndIf};
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay;
pUnk: IUnknown): HRESULT;
 
implementation
252,10 → 224,7
CoTaskMemFree(P);
end;
 
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP:
//{$IfDef DX7}
IDirectPlay;
//{$Else}IDirectPlay8Server{$EndIf};
function DXDirectPlayCreate(const lpGUID: TGUID; out lplpDP: IDirectPlay;
pUnk: IUnknown): HRESULT;
type
TDirectPlayCreate= function(const lpGUID: TGUID; out lplpDP: IDirectPlay; pUnk: IUnknown): HRESULT; stdcall;
263,27 → 232,9
Result := TDirectPlayCreate(DXLoadLibrary('DPlayX.dll', 'DirectPlayCreate'))
(lpGUID, lplpDP, pUnk);
end;
{$IFDEF UNICODE}
function DXDirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackW; lpContext: Pointer): HRESULT;
type
TDirectPlayEnumerateW= function(lpEnumDPCallback: TDPEnumDPCallbackW; lpContext: Pointer): HRESULT; stdcall;
begin
Result := TDirectPlayEnumerateW(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateW'))
(lpEnumDPCallback, lpContext);
end;
 
function DXDirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyW;
lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT;
function DXDirectPlayEnumerateA(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT;
type
TDirectPlayLobbyCreateW = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyW;
lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT; stdcall;
begin
Result := TDirectPlayLobbyCreateW(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateW'))
(lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize);
end;
{$ELSE}
function DXDirectPlayEnumerate(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT;
type
TDirectPlayEnumerateA= function(lpEnumDPCallback: TDPEnumDPCallbackA; lpContext: Pointer): HRESULT; stdcall;
begin
Result := TDirectPlayEnumerateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayEnumerateA'))
290,7 → 241,7
(lpEnumDPCallback, lpContext);
end;
 
function DXDirectPlayLobbyCreate(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
function DXDirectPlayLobbyCreateA(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
lpUnk: IUnknown; lpData: Pointer; dwDataSize: DWORD): HRESULT;
type
TDirectPlayLobbyCreateA = function(const lpguidSP: TGUID; out lplpDPL: IDirectPlayLobbyA;
299,7 → 250,7
Result := TDirectPlayLobbyCreateA(DXLoadLibrary('DPlayX.dll', 'DirectPlayLobbyCreateA'))
(lpguidSP, lplpDPL, lpUnk, lpData, dwDataSize);
end;
{$ENDIF}
 
{ TDXPlayPlayers }
 
constructor TDXPlayPlayers.Create;
365,16 → 316,10
end;
 
var
{$IFDEF UNICODE}
Lobby1: IDirectPlayLobbyW;
Lobby: IDirectPlayLobby2W;
DPlay: IDirectPlay4W;
{$ELSE}
Lobby1: IDirectPlayLobbyA;
Lobby: IDirectPlayLobby2A;
DPlay1: IDirectPlay;
DPlay: IDirectPlay4A;
{$ENDIF}
DPlay1: IDirectPlay;
lpAddress: Pointer;
dwAddressSize: DWORD;
begin
382,16 → 327,16
begin
FModemNames := TStringList.Create;
try
if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
Lobby := Lobby1 as {$IFDEF UNICODE}IDirectPlayLobby2W{$ELSE}IDirectPlayLobby2A{$ENDIF};
Lobby := Lobby1 as IDirectPlayLobby2A;
 
if DXDirectPlayCreate(DPSPGUID_MODEM, DPlay1, nil)<>0 then
raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
DPlay := DPlay1 as {$IFDEF UNICODE}IDirectPlay4W{$ELSE}IDirectPlay4A{$ENDIF};
DPlay := DPlay1 as IDirectPlay4A;
 
{ get size of player address for all players }
if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, nil, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, nil^, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
 
GetMem(lpAddress, dwAddressSize);
399,7 → 344,7
FillChar(lpAddress^, dwAddressSize, 0);
 
{ get the address }
if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, lpAddress, dwAddressSize)<>0 then
if DPlay.GetPlayerAddress(DPID_ALLPLAYERS, lpAddress^, dwAddressSize)<>0 then
raise EDXPlayError.Create(SDXPlayModemListCannotBeAcquired);
 
{ get modem strings from address and put them in the combo box }
525,12 → 470,12
 
try
repeat
hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer, dwMsgBufferSize);
hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer^, dwMsgBufferSize);
 
if hr=DPERR_BUFFERTOOSMALL then
begin
ReAllocMem(lpvMsgBuffer, dwMsgBufferSize);
hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer, dwMsgBufferSize);
hr := FDPlay.Receive(idFrom, idTo, DPRECEIVE_ALL, lpvMsgBuffer^, dwMsgBufferSize);
end;
 
if (hr=0) and (dwMsgBufferSize>=SizeOf(TDPMSG_GENERIC)) then
552,13 → 497,8
 
with Msg_CreatePlayerOrGroup.dpnName do
begin
{$IFDEF UNICODE}
if lpszShortNameW<>nil then
Player.FName := lpszShortNameW;
{$ELSE}
if lpszShortNameA<>nil then
Player.FName := lpszShortNameA;
{$ENDIF}
end;
 
DoAddPlayer(Player);
573,7 → 513,7
begin
i := Players.IndexOf(Msg_DeletePlayerOrGroup.DPID);
if i<>-1 then
begin
begin
Player := Players[i];
DoDeletePlayer(Player);
Player.Free;
664,7 → 604,7
 
function TCustomDXPlay.GetProviders: TStrings;
 
function EnumProviderCallback(const lpguidSP: TGUID; lpSPName: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPSTR{$ENDIF};
function EnumProviderCallback(const lpguidSP: TGUID; lpSPName: LPSTR;
dwMajorVersion: DWORD; dwMinorVersion: DWORD; lpContext: Pointer):
BOOL; stdcall;
var
681,7 → 621,7
begin
FProviders := TStringList.Create;
try
DXDirectPlayEnumerate(@EnumProviderCallback, FProviders);
DXDirectPlayEnumerateA(@EnumProviderCallback, FProviders);
except
FProviders.Free; FProviders := nil;
raise;
706,11 → 646,8
 
Guid := New(PGUID);
Move(lpThisSD.guidInstance, Guid^, SizeOf(TGUID));
{$IFDEF UNICODE}
TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameW, TObject(Guid));
{$ELSE}
TStrings(lpContext).AddObject(lpThisSD.lpszSessionNameA, TObject(Guid));
{$ENDIF}
 
Result := True;
end;
 
761,13 → 698,8
ProviderGUID: TGUID;
addressElements: array[0..15] of TDPCompoundAddressElement;
dwElementCount: Integer;
{$IFDEF UNICODE}
Lobby1: IDirectPlayLobbyW;
Lobby: IDirectPlayLobby2W;
{$ELSE}
Lobby1: IDirectPlayLobbyA;
Lobby: IDirectPlayLobby2A;
{$ENDIF}
lpAddress: Pointer;
dwAddressSize: DWORD;
begin
777,9 → 709,9
ProviderGUID := PGUID(Providers.Objects[i])^;
 
{ DirectPlay address making }
if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby1, nil, nil, 0)<>0 then
raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
Lobby := Lobby1 as {$IFDEF UNICODE}IDirectPlayLobby2W{$ELSE}IDirectPlayLobby2A{$ENDIF};
Lobby := Lobby1 as IDirectPlayLobby2A;
 
FillChar(addressElements, SizeOf(addressElements), 0);
dwElementCount := 0;
820,15 → 752,15
end;
 
if TCPIPSetting.Port<>0 then
begin
begin
addressElements[dwElementCount].guidDataType := DPAID_INetPort;
addressElements[dwElementCount].dwDataSize := SizeOf(TCPIPSetting.FPort);
addressElements[dwElementCount].lpData := @TCPIPSetting.FPort;
Inc(dwElementCount);
Inc(dwElementCount);
end;
end;
 
if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, nil, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, nil^, dwAddressSize)<>DPERR_BUFFERTOOSMALL then
raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
 
GetMem(lpAddress, dwAddressSize);
835,7 → 767,7
try
FillChar(lpAddress^, dwAddressSize, 0);
 
if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress, dwAddressSize)<>0 then
if Lobby.CreateCompoundAddress(addressElements[0], dwElementCount, lpAddress^, dwAddressSize)<>0 then
raise EDXPlayError.CreateFmt(SCannotInitialized, [SDirectPlay]);
 
{ DirectPlay initialization }
896,7 → 828,7
function EnumPlayersCallback2(TDPID: TDPID; dwPlayerType: DWORD;
const lpName: TDPName; dwFlags: DWORD; lpContext: Pointer): BOOL;
stdcall;
var
var
Player: TDXPlayPlayer;
begin
Player := TDXPlayPlayer.Create(TCustomDXPlay(lpContext).Players);
905,13 → 837,8
 
with lpName do
begin
{$IFDEF UNICODE}
if lpszShortNameW<>nil then
Player.FName := lpszShortNameW;
{$ELSE}
if lpszShortNameA<>nil then
Player.FName := lpszShortNameA;
{$ENDIF}
end;
 
Result := True;
935,11 → 862,11
FLocalPlayer := TDXPlayPlayer.Create(FPlayers);
FLocalPlayer.FName := NameS;
 
if FDPlay.CreatePlayer(FLocalPlayer.FID, @Name, FRecvEvent[0], nil, 0, 0)<>DP_OK then
if FDPlay.CreatePlayer(FLocalPlayer.FID, Name, FRecvEvent[0], nil^, 0, 0)<>DP_OK then
raise EDXPlayError.CreateFmt(SCannotOpened, [FSessionName]);
 
{ Player enumeration }
FDPlay.EnumPlayers(PGUID(nil), @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);
FDPlay.EnumPlayers(PGUID(nil)^, @EnumPlayersCallback2, Self, DPENUMPLAYERS_REMOTE);
 
FIsHost := FPlayers.Count=1;
 
948,7 → 875,7
 
{ Thread start }
FRecvThread := TDXPlayRecvThread.Create(Self);
FRecvThread.{$IFDEF VER14UP}Start{$ELSE}Resume{$ENDIF};
FRecvThread.Resume;
except
Close;
raise;
973,25 → 900,21
function TCustomDXPlay.OpenDPlayWithLobby(out Name: string): Boolean;
var
DPlay1: IDirectPlay2;
{$IFDEF UNICODE}
Lobby: IDirectPlayLobbyW;
{$ELSE}
Lobby: IDirectPlayLobbyA;
{$ENDIF}
dwSize: DWORD;
ConnectionSettings: PDPLConnection;
begin
Result := False;
 
if DXDirectPlayLobbyCreate(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then
if DXDirectPlayLobbyCreateA(PGUID(nil)^, Lobby, nil, nil, 0)<>0 then
Exit;
 
if Lobby.GetConnectionSettings(0, PDPLConnection(nil), dwSize)<>DPERR_BUFFERTOOSMALL then
if Lobby.GetConnectionSettings(0, PDPLConnection(nil)^, dwSize)<>DPERR_BUFFERTOOSMALL then
Exit;
 
GetMem(ConnectionSettings, dwSize);
try
if Lobby.GetConnectionSettings(0, ConnectionSettings, dwSize)<>0 then
if Lobby.GetConnectionSettings(0, ConnectionSettings^, dwSize)<>0 then
Exit;
 
with ConnectionSettings^.lpSessionDesc^ do
1010,24 → 933,14
 
with ConnectionSettings.lpSessionDesc^ do
begin
{$IFDEF UNICODE}
if lpszSessionNameW<>nil then
FSessionName := lpszSessionNameW;
{$ELSE}
if lpszSessionNameA<>nil then
FSessionName := lpszSessionNameA;
{$ENDIF}
end;
 
with ConnectionSettings.lpPlayerName^ do
begin
{$IFDEF UNICODE}
if lpszShortNameW<>nil then
Name := lpszShortNameW;
{$ELSE}
if lpszShortNameA<>nil then
Name := lpszShortNameA;
{$ENDIF}
end;
finally
FreeMem(ConnectionSettings);
1082,11 → 995,7
FillChar(dpDesc, SizeOf(dpDesc), 0);
dpDesc.dwSize := SizeOf(dpDesc);
dpDesc.dwFlags := DPSESSION_MIGRATEHOST or DPSESSION_KEEPALIVE;
{$IFDEF UNICODE}
dpDesc.lpszSessionNameW := {$IFDEF VER12UP}PChar{$ELSE}PWideChar{$ENDIF}(SessionName);
{$ELSE}
dpDesc.lpszSessionNameA := PAnsiChar(SessionName);
{$ENDIF}
dpDesc.lpszSessionNameA := PChar(SessionName);
dpDesc.guidApplication := DXPlayStringToGUID(GUID);
dpDesc.dwMaxPlayers := MaxPlayers;
 
1138,7 → 1047,7
FProviderName := '';
FSessionName := '';
FAsyncSupported := False;
 
ClearSessionList;
 
FDPlay := nil;
1148,7 → 1057,7
SetEvent(FRecvEvent[1])
else
FRecvThread.Free;
 
CloseHandle(FRecvEvent[0]); FRecvEvent[0] := 0;
 
FPlayers.Clear;
1170,7 → 1079,7
DoMessage(FLocalPlayer, Data, DataSize);
end else
if FAsync and FAsyncSupported then
FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data, DataSize, 0, 0, nil, nil)
FDPlay.SendEx(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED or DPSEND_ASYNC, Data^, DataSize, 0, 0, nil, nil)
else
FDPlay.Send(FLocalPlayer.ID, ToID, DPSEND_GUARANTEED, Data^, DataSize);
end;
1189,7 → 1098,7
{ Ž©•ªˆ¶‚̃ƒbƒZ[ƒW }
DoMessage(FLocalPlayer, Data, DataSize);
end else
FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data, DataSize,
FDPlay.SendEx(FLocalPlayer.ID, ToID, dwFlags, Data^, DataSize,
0, 0, nil, @Result); // 0 ˆÈŠO‚̓Tƒ|[ƒg‚µ‚È‚¢ƒfƒoƒCƒX‚ ‚é‚Ì‚ÅŽg‚í‚È‚¢
end;
 
1234,6 → 1143,4
CoInitialize(nil);
finalization
CoUninitialize;
{$ENDIF} // UseDirectPlay
 
end.
end.
/VCL_DELPHIX_D6/DXReg.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXRender.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXWaveEdit.pas
4,7 → 4,7
 
uses
Windows, SysUtils, Classes, Forms, Dialogs, Controls, StdCtrls, ExtCtrls,
Buttons, ComCtrls, DXSounds, DXWave, Graphics;
Buttons, ComCtrls, DXSounds, Wave, Graphics;
 
type
 
/VCL_DELPHIX_D6/DXInptEdit.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXPlayFm.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DXSounds.pas
5,13 → 5,8
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows, Messages, SysUtils, Classes, Controls, Forms, ExtCtrls, MMSystem, ActiveX,
DXClass, DXWave, D3DUtils, {$IFDEF VER17UP} Types, {$ENDIF}
{$IFDEF StandardDX}
DirectSound, DirectMusic;
{$ELSE}
DirectX;
{$ENDIF}
Windows, Messages, SysUtils, Classes, Controls, Forms, ExtCtrls, MMSystem,
DirectX, DXClass, Wave;
 
type
 
35,7 → 30,7
function GetBufferCount: Integer;
function GetIDSound: IDirectSound;
function GetISound: IDirectSound;
protected
protected
procedure CheckBuffer(Buffer: TDirectSoundBuffer);
procedure DoRestoreBuffer; virtual;
public
48,50 → 43,6
property ISound: IDirectSound read GetISound;
end;
 
{ TD3DSParams }
 
TConeAngle = record
Inside,Outside:DWord;
end;
TD3DSParams = class
private
FOwner: TDirectSoundBuffer;
 
FDsb: TDS3DBUFFER;
 
function GetPosition: TD3DVector;
function GetVelocity: TD3DVector;
function GetConeOrientation: TD3DVector;
function GetConeAngle: TConeAngle;
function GetConeOutsideVolume: Integer;
function GetMinDistance: TD3DValue;
function GetMaxDistance: TD3DValue;
function GetRaw: TDS3DBuffer;
 
procedure SetPosition(const v: TD3DVector);
procedure SetVelocity(const v: TD3DVector);
procedure SetConeOrientation(const v: TD3DVector);
procedure SetConeAngle(const v: TConeAngle);
procedure SetConeOutsideVolume(const v: Integer);
procedure SetMinDistance(const v: TD3DValue);
procedure SetMaxDistance(const v: TD3DValue);
procedure SetRaw(const v: TDS3DBuffer);
 
function CheckValidity: Boolean;
public
constructor Create(Owner: TDirectSoundBuffer);
destructor Destroy; override;
property Position: TD3DVector read getPosition write setPosition;
property Velocity: TD3DVector read getVelocity write setVelocity;
property ConeOrientation: TD3DVector read getConeOrientation write setConeOrientation;
property ConeAngle: TConeAngle read getConeAngle write setConeAngle;
property ConeOutsideVolume: Integer read getConeOutsideVolume write setConeOutsideVolume;
property MinDistance: TD3DValue read getMinDistance write setMinDistance;
property MaxDistance: TD3DValue read getMaxDistance write setMaxDistance;
property RawParams: TDS3DBuffer read getRaw write setRaw;
procedure Assign(Prms: TD3DSParams);
end;
 
{ TDirectSoundBuffer }
 
TDirectSoundBuffer = class(TDirectX)
98,8 → 49,6
private
FDSound: TDirectSound;
FIDSBuffer: IDirectSoundBuffer;
FIDS3DBuffer:IDirectSound3DBuffer;
FD3DSParams: TD3DSParams;
FCaps: TDSBCaps;
FFormat: PWaveFormatEx;
FFormatSize: Integer;
106,7 → 55,6
FLockAudioPtr1, FLockAudioPtr2: array[0..0] of Pointer;
FLockAudioSize1, FLockAudioSize2: array[0..0] of DWORD;
FLockCount: Integer;
FIsD3D: Boolean;
function GetBitCount: Longint;
function GetFormat: PWaveFormatEx;
function GetFrequency: Integer;
123,9 → 71,6
procedure SetPan(Value: Integer);
procedure SetPosition(Value: Longint);
procedure SetVolume(Value: Integer);
function GetIDS3DBuffer: IDirectSound3DBuffer;
procedure SetIDS3DBuffer(const Value: IDirectSound3DBuffer);
procedure SetD3DSParams(const Value: TD3DSParams);
protected
procedure Check; override;
public
141,10 → 86,10
function Lock(LockPosition, LockSize: Longint;
var AudioPtr1: Pointer; var AudioSize1: Longint;
var AudioPtr2: Pointer; var AudioSize2: Longint): Boolean;
function Play(Loop: Boolean{$IFNDEF VER100} = False{$ENDIF}): Boolean;
function Play(Loop: Boolean{$IFNDEF VER100}=False{$ENDIF}): Boolean;
function Restore: Boolean;
function SetFormat(const Format: TWaveFormatEx): Boolean;
procedure SetSize(const Format: TWaveFormatEx; Size: Integer; D3D: Boolean {$IFNDEF VER100}= False{$ENDIF});
procedure SetSize(const Format: TWaveFormatEx; Size: Integer);
procedure Stop;
procedure UnLock;
property BitCount: Longint read GetBitCount;
154,11 → 99,8
property Frequency: Integer read GetFrequency write SetFrequency;
property IBuffer: IDirectSoundBuffer read GetIBuffer;
property IDSBuffer: IDirectSoundBuffer read GetIDSBuffer write SetIDSBuffer;
property IDS3DBuffer: IDirectSound3DBuffer read GetIDS3DBuffer write SetIDS3DBuffer;
property Playing: Boolean read GetPlaying;
property Pan: Integer read GetPan write SetPan;
property D3DSParams: TD3DSParams read FD3DSParams write SetD3DSParams;
property IsD3D: Boolean read FIsD3D write FIsD3D default False;
property Position: Longint read GetPosition write SetPosition;
property Size: Integer read GetSize;
property Volume: Integer read GetVolume write SetVolume;
228,7 → 170,7
property Volume: Integer read GetVolume write SetVolume;
property WaveStream: TCustomWaveStream read FWaveStream write SetWaveStream;
end;
 
{ TAudioFileStream }
 
TAudioFileStream = class(TAudioStream)
435,8 → 377,6
procedure SetPan(Value: Integer);
procedure SetVolume(Value: Integer);
procedure SetWave(Value: TWave);
protected
function GetPlaying: boolean;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
449,8 → 389,6
property Pan: Integer read FPan write SetPan;
property Volume: Integer read FVolume write SetVolume;
property WaveCollection: TWaveCollection read GetWaveCollection;
 
property Playing: boolean read GetPlaying;
published
property Looped: Boolean read FLooped write SetLooped;
property MaxPlayingCount: Integer read FMaxPlayingCount write SetMaxPlayingCount;
507,125 → 445,10
property Items;
end;
 
{ EDXMusicError }
 
EDXMusicError = class(Exception);
 
TMusicListCollection = class;
 
{ TMusicListCollectionItem }
 
TMusicDataProp = class(TPersistent)
private
FMusicData: string;
FMidiname: string;
function GetMusicData: string;
procedure SetMusicData(const Value: string);
protected
procedure DefineProperties(Filer: TFiler); override;
procedure ReadMidiData(Stream: TStream);
procedure WriteMidiData(Stream: TStream);
public
property MusicData: string read GetMusicData write SetMusicData;
published
property MidiName: string read FMidiname write FMidiname;
end;
 
TMusicListCollectionItem = class(THashCollectionItem)
private
{ Private declarations }
FDirectMusicPerformance: IDirectMusicPerformance;
FDirectSound: IDirectSound;
FDirectMusic: IDirectMusic;
FDirectMusicLoader: IDirectMusicLoader;
FDirectMusicSegment: IDirectMusicSegment;
FMusicObjDesc: TDMus_ObjectDesc;
FDirectMusicSegmentState: IDirectMusicSegmentState;
FRepeats: Cardinal;
FStartpoint: Integer;
FDuration: Integer;
// startpoint props in seconds these used to hold millisecond value
FActualDuration: Integer;
FActualStartPoint: Integer;
FIsInitialized: Boolean;
FMusicDataProp: TMusicDataProp;
procedure SetDuration(const Value: integer);
procedure SetRepeats(const Value: Cardinal);
procedure SetStartPoint(const Value: integer);
function GetMusicListCollection: TMusicListCollection;
protected
function GetDisplayName: string; override;
public
constructor Create(Collection: TCollection); override;
destructor Destroy; override;
function Size: Integer;
procedure Play;
function IsPlaying: Boolean;
procedure Stop;
procedure Load;
procedure Init;
procedure LoadFromFile(const MidiFileName: string);
procedure SaveToFile(const MidiFileName: string);
property MusicCollection: TMusicListCollection read GetMusicListCollection;
property IsInitialized: Boolean read FIsInitialized write FIsInitialized;
published
property Name;
property Repeats: Cardinal read Frepeats write SetRepeats;
property Duration: integer read FDuration write SetDuration;
property StartPoint: integer read FStartPoint write SetStartPoint;
property Midi: TMusicDataProp read FMusicDataProp write FMusicDataProp;
end;
 
{ TMusicListCollection }
 
TMusicListCollection = class(THashCollection)
private
FOwner: TPersistent;
FDirectSound: IDirectSound;
protected
function GetItem(Index: Integer): TMusicListCollectionItem;
procedure SetItem(Index: Integer; Value: TMusicListCollectionItem);
procedure Update(Item: TCollectionItem); override;
function GetOwner: TPersistent; override;
public
constructor Create(AOwner: TComponent);
function Add: TMusicListCollectionItem;
function Find(const Name: string): TMusicListCollectionItem;
procedure Restore;
procedure LoadFromFile(const FileName: string);
procedure LoadFromStream(Stream: TStream);
procedure SaveToFile(const FileName: string);
procedure SaveToStream(Stream: TStream);
{$IFDEF VER4UP}
function Insert(Index: Integer): TMusicListCollectionItem;
{$ENDIF}
property Items[Index: Integer]: TMusicListCollectionItem read GetItem write SetItem;
published
end;
 
{ TDXMusic }
 
TDXMusic = class(TComponent)
private
FDXSound: TDXSound;
FMidis: TMusicListCollection;
procedure SetMidis(const value: TMusicListCollection);
procedure SetDXSound(const Value: TDXSound);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property DXSound: TDXSound read FDXSound write SetDXSound;
property Midis: TMusicListCollection read FMidis write SetMidis;
end;
 
implementation
 
uses DXConsts;
 
const
dm_OK = 0;
 
function DXDirectSoundCreate(lpGUID: PGUID; out lpDS: IDirectSound;
pUnkOuter: IUnknown): HRESULT;
type
636,13 → 459,13
(lpGUID, lpDS, pUnkOuter);
end;
 
function DXDirectSoundEnumerate(lpCallback: {$IFDEF UNICODE}TDSEnumCallbackW{$ELSE}TDSEnumCallbackA{$ENDIF};
lpContext: Pointer): HRESULT;
function DXDirectSoundEnumerate(lpCallback: TDSEnumCallbackA;
lpContext: Pointer): HRESULT;
type
TDirectSoundEnumerate = function(lpCallback: {$IFDEF UNICODE}TDSEnumCallbackW{$ELSE}TDSEnumCallbackA{$ENDIF};
TDirectSoundEnumerate = function(lpCallback: TDSEnumCallbackA;
lpContext: Pointer): HRESULT; stdcall;
begin
Result := TDirectSoundEnumerate(DXLoadLibrary('DSound.dll', {$IFDEF UNICODE}'DirectSoundEnumerateW'{$ELSE}'DirectSoundEnumerateA'{$ENDIF}))
Result := TDirectSoundEnumerate(DXLoadLibrary('DSound.dll', 'DirectSoundEnumerateA'))
(lpCallback, lpContext);
end;
 
661,13 → 484,13
end;
 
function DXDirectSoundCaptureEnumerate(lpCallback: TDSEnumCallbackA;
lpContext: Pointer): HRESULT;
lpContext: Pointer): HRESULT;
type
TDirectSoundCaptureEnumerate = function(lpCallback: TDSEnumCallbackA;
lpContext: Pointer): HRESULT; stdcall;
begin
try
Result := TDirectSoundCaptureEnumerate(DXLoadLibrary('DSound.dll', {$IFDEF UNICODE}'DirectSoundCaptureEnumerateW'{$ELSE}'DirectSoundCaptureEnumerateA'{$ENDIF}))
Result := TDirectSoundCaptureEnumerate(DXLoadLibrary('DSound.dll', 'DirectSoundCaptureEnumerateA'))
(lpCallback, lpContext);
except
raise EDirectXError.Create(SSinceDirectX5);
678,8 → 501,8
DirectSoundDrivers: TDirectXDrivers;
DirectSoundCaptureDrivers: TDirectXDrivers;
 
function EnumDirectSoundDrivers_DSENUMCALLBACK(lpGuid: PGUID; lpstrDescription: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF};
lpstrModule: {$IFDEF UNICODE}LPCTSTR{$ELSE}LPCSTR{$ENDIF}; lpContext: Pointer): BOOL; stdcall;
function EnumDirectSoundDrivers_DSENUMCALLBACK(lpGuid: PGUID; lpstrDescription: LPCSTR;
lpstrModule: LPCSTR; lpContext: Pointer): BOOL; stdcall;
begin
Result := True;
with TDirectXDriver.Create(TDirectXDrivers(lpContext)) do
692,7 → 515,7
 
function EnumDirectSoundDrivers: TDirectXDrivers;
begin
if DirectSoundDrivers = nil then
if DirectSoundDrivers=nil then
begin
DirectSoundDrivers := TDirectXDrivers.Create;
try
708,7 → 531,7
 
function EnumDirectSoundCaptureDrivers: TDirectXDrivers;
begin
if DirectSoundCaptureDrivers = nil then
if DirectSoundCaptureDrivers=nil then
begin
DirectSoundCaptureDrivers := TDirectXDrivers.Create;
try
729,14 → 552,14
inherited Create;
FBufferList := TList.Create;
 
if DXDirectSoundCreate(GUID, FIDSound, nil) <> DS_OK then
if DXDirectSoundCreate(GUID, FIDSound, nil)<>DS_OK then
raise EDirectSoundError.CreateFmt(SCannotInitialized, [SDirectSound]);
end;
 
destructor TDirectSound.Destroy;
begin
while BufferCount > 0 do
Buffers[BufferCount - 1].Free;
while BufferCount>0 do
Buffers[BufferCount-1].Free;
FBufferList.Free;
 
FIDSound := nil;
782,7 → 605,7
 
function TDirectSound.GetIDSound: IDirectSound;
begin
if Self <> nil then
if Self<>nil then
Result := FIDSound
else
Result := nil;
791,7 → 614,7
function TDirectSound.GetISound: IDirectSound;
begin
Result := IDSound;
if Result = nil then
if Result=nil then
raise EDirectSoundError.CreateFmt(SNotMade, ['IDirectSound']);
end;
 
800,9 → 623,7
constructor TDirectSoundBuffer.Create(ADirectSound: TDirectSound);
begin
inherited Create;
FIsD3D := False;
FDSound := ADirectSound;
FIDS3DBuffer := nil;
FDSound.FBufferList.Add(Self);
end;
 
809,7 → 630,6
destructor TDirectSoundBuffer.Destroy;
begin
IDSBuffer := nil;
IDS3DBuffer := nil;
FDSound.FBufferList.Remove(Self);
inherited Destroy;
end;
818,37 → 638,23
var
TempBuffer: IDirectSoundBuffer;
begin
if Source = nil then
if Source=nil then
IDSBuffer := nil
else
if Source is TWave then
else if Source is TWave then
LoadFromWave(TWave(Source))
else
if Source is TDirectSoundBuffer then
else if Source is TDirectSoundBuffer then
begin
if TDirectSoundBuffer(Source).IDSBuffer = nil then
if TDirectSoundBuffer(Source).IDSBuffer=nil then
IDSBuffer := nil
else
begin
FDSound.DXResult := FDSound.ISound.DuplicateSoundBuffer(TDirectSoundBuffer(Source).IDSBuffer, TempBuffer);
if FDSound.DXResult = DS_OK then
else begin
FDSound.DXResult := FDSound.ISound.DuplicateSoundBuffer(TDirectSoundBuffer(Source).IDSBuffer,
TempBuffer);
if FDSound.DXResult=0 then
begin
IDSBuffer := TempBuffer;
end;
end;
 
if FIsD3D then
if TDirectSoundBuffer(Source).IDS3DBuffer = nil then
IDS3DBuffer := nil
else
begin
FDSound.DXResult := FDSound.ISound.QueryInterface(IID_IDirectSound3DBuffer, FIDS3DBuffer);
if FDSound.DXResult = DS_OK then
FD3DSParams := TDirectSoundBuffer(Source).FD3DSParams;
end;
 
end
else
end else
inherited Assign(Source);
end;
 
865,7 → 671,7
 
FDSound.DXResult := FDSound.ISound.CreateSoundBuffer(BufferDesc, TempBuffer, nil);
FDXResult := FDSound.DXResult;
Result := DXResult = DS_OK;
Result := DXResult=DS_OK;
if Result then
IDSBuffer := TempBuffer;
end;
886,17 → 692,9
DXResult := IBuffer.GetFrequency(DWORD(Result));
end;
 
function TDirectSoundBuffer.GetIDS3DBuffer: IDirectSound3DBuffer;
begin
if Self <> nil then
Result := FIDS3DBuffer
else
Result := nil;
end;
 
function TDirectSoundBuffer.GetIDSBuffer: IDirectSoundBuffer;
begin
if Self <> nil then
if Self<>nil then
Result := FIDSBuffer
else
Result := nil;
905,13 → 703,13
function TDirectSoundBuffer.GetIBuffer: IDirectSoundBuffer;
begin
Result := IDSBuffer;
if Result = nil then
if Result=nil then
raise EDirectSoundBufferError.CreateFmt(SNotMade, ['IDirectSoundBuffer']);
end;
 
function TDirectSoundBuffer.GetPlaying: Boolean;
begin
Result := (GetStatus and (DSBSTATUS_PLAYING or DSBSTATUS_LOOPING)) <> 0;
Result := (GetStatus and (DSBSTATUS_PLAYING or DSBSTATUS_LOOPING))<>0;
end;
 
function TDirectSoundBuffer.GetPan: Integer;
920,10 → 718,10
end;
 
function TDirectSoundBuffer.GetPosition: Longint;
var
var
dwCurrentWriteCursor: Longint;
begin
IBuffer.GetCurrentPosition(@DWORD(Result), @DWORD(dwCurrentWriteCursor));
IBuffer.GetCurrentPosition(DWORD(Result), DWORD(dwCurrentWriteCursor));
end;
 
function TDirectSoundBuffer.GetSize: Integer;
943,7 → 741,7
 
procedure TDirectSoundBuffer.LoadFromFile(const FileName: string);
var
Stream: TFileStream;
Stream : TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead);
try
959,24 → 757,22
Data1, Data2: Pointer;
Data1Size, Data2Size: Longint;
begin
SetSize(Format, Size, FIsD3D);
SetSize(Format, Size);
 
if Data <> nil then
if Data<>nil then
begin
if Lock(0, Size, Data1, Data1Size, Data2, Data2Size) then
begin
try
Move(Data^, Data1^, Data1Size);
if Data2 <> nil then
Move(Pointer(Longint(Data) + Data1Size)^, Data2^, Data2Size);
if Data2<>nil then
Move(Pointer(Longint(Data)+Data1Size)^, Data2^, Data2Size);
finally
UnLock;
end;
end
else
end else
begin
FIDSBuffer := nil;
FIDS3DBuffer := nil;
raise EDirectSoundBufferError.CreateFmt(SCannotLock, [SDirectSoundBuffer]);
end;
end;
983,7 → 779,7
end;
 
procedure TDirectSoundBuffer.LoadFromStream(Stream: TStream);
var
var
Wave: TWave;
begin
Wave := TWave.Create;
1005,13 → 801,14
var AudioPtr2: Pointer; var AudioSize2: Longint): Boolean;
begin
Result := False;
if IDSBuffer = nil then Exit;
if IDSBuffer=nil then Exit;
 
if FLockCount > High(FLockAudioPtr1) then Exit;
if FLockCount>High(FLockAudioPtr1) then Exit;
 
DXResult := IBuffer.Lock(LockPosition, LockSize,
{$IFNDEF DX7}@{$ENDIF}FLockAudioPtr1[FLockCount], {$IFNDEF DX7}@{$ENDIF}FLockAudioSize1[FLockCount],
{$IFNDEF DX7}@{$ENDIF}FLockAudioPtr2[FLockCount], {$IFNDEF DX7}@{$ENDIF}FLockAudioSize2[FLockCount], 0);
Result := DXResult = DS_OK;
FLockAudioPtr1[FLockCount], FLockAudioSize1[FLockCount],
FLockAudioPtr2[FLockCount], FLockAudioSize2[FLockCount], 0);
Result := DXResult=DS_OK;
 
if Result then
begin
1029,24 → 826,19
DXResult := IBuffer.Play(0, 0, DSBPLAY_LOOPING)
else
DXResult := IBuffer.Play(0, 0, 0);
Result := DXResult = DS_OK;
Result := DXResult=DS_OK;
end;
 
function TDirectSoundBuffer.Restore: Boolean;
begin
DXResult := IBuffer.Restore;
Result := DXResult = DS_OK;
Result := DXResult=DS_OK;
end;
 
procedure TDirectSoundBuffer.SetD3DSParams(const Value: TD3DSParams);
begin
FD3DSParams.Assign(Value);
end;
 
function TDirectSoundBuffer.SetFormat(const Format: TWaveFormatEx): Boolean;
begin
DXResult := IBuffer.SetFormat(FFormat{$IFDEF DX7}^{$ENDIF});
Result := DXResult = DS_OK;
DXResult := IBuffer.SetFormat(Format);
Result := DXResult=DS_OK;
 
if Result then
begin
1053,11 → 845,11
FreeMem(FFormat);
FFormat := nil;
FFormatSize := 0;
if IBuffer.GetFormat(PWaveFormatEx(nil), 0, @DWORD(FFormatSize)) = DS_OK then
if IBuffer.GetFormat(PWaveFormatEx(nil)^, 0, DWORD(FFormatSize))=DS_OK then
begin
GetMem(FFormat, FFormatSize);
IBuffer.GetFormat(FFormat, FFormatSize, nil);
end;
IBuffer.GetFormat(FFormat^, FFormatSize, PDWORD(nil)^);
end;
end;
end;
 
1066,33 → 858,9
DXResult := IBuffer.SetFrequency(Value);
end;
 
procedure TDirectSoundBuffer.SetIDS3DBuffer(const Value: IDirectSound3DBuffer);
begin
if FIDS3DBuffer = Value then Exit;
 
FIDS3DBuffer := Value;
FillChar(FCaps, SizeOf(FCaps), 0);
FreeMem(FFormat);
FFormat := nil;
FFormatSize := 0;
FLockCount := 0;
 
if FIDS3DBuffer <> nil then
begin
FCaps.dwSize := SizeOf(FCaps);
IBuffer.GetCaps(FCaps);
 
if IBuffer.GetFormat(PWaveFormatEx(nil), 0, @DWORD(FFormatSize)) = DS_OK then
begin
GetMem(FFormat, FFormatSize);
IBuffer.GetFormat(FFormat, FFormatSize, nil);
end;
end;
end;
 
procedure TDirectSoundBuffer.SetIDSBuffer(Value: IDirectSoundBuffer);
begin
if FIDSBuffer = Value then Exit;
if FIDSBuffer=Value then Exit;
 
FIDSBuffer := Value;
FillChar(FCaps, SizeOf(FCaps), 0);
1101,16 → 869,16
FFormatSize := 0;
FLockCount := 0;
 
if FIDSBuffer <> nil then
if FIDSBuffer<>nil then
begin
FCaps.dwSize := SizeOf(FCaps);
IBuffer.GetCaps(FCaps);
 
if IBuffer.GetFormat(PWaveFormatEx(nil), 0, @DWORD(FFormatSize)) = DS_OK then
if IBuffer.GetFormat(PWaveFormatEx(nil)^, 0, DWORD(FFormatSize))=DS_OK then
begin
GetMem(FFormat, FFormatSize);
IBuffer.GetFormat(FFormat, FFormatSize, nil);
end;
IBuffer.GetFormat(FFormat^, FFormatSize, PDWORD(nil)^);
end;
end;
end;
 
1123,18 → 891,14
begin
DXResult := IBuffer.SetCurrentPosition(Value);
end;
{$IFNDEF DX7}
const
DSBCAPS_CTRLDEFAULT = DSBCAPS_CTRLFREQUENCY or DSBCAPS_CTRLPAN or DSBCAPS_CTRLVOLUME;
{$ENDIF}
 
procedure TDirectSoundBuffer.SetSize(const Format: TWaveFormatEx; Size: Integer; D3D: Boolean {$IFNDEF VER100}= False{$ENDIF});
procedure TDirectSoundBuffer.SetSize(const Format: TWaveFormatEx; Size: Integer);
var
BufferDesc: TDSBufferDesc;
begin
{ IDirectSoundBuffer made. }
FillChar(BufferDesc, SizeOf(BufferDesc), 0);
 
with BufferDesc do
begin
dwSize := SizeOf(TDSBufferDesc);
1143,8 → 907,6
dwFlags := dwFlags or DSBCAPS_STICKYFOCUS
else if DSound.FGlobalFocus then
dwFlags := dwFlags or DSBCAPS_GLOBALFOCUS;
if D3D then
dwFlags := DSBCAPS_STATIC + DSBCAPS_CTRLDEFAULT + DSBCAPS_CTRL3D - DSBCAPS_CTRLPAN;
dwBufferBytes := Size;
lpwfxFormat := @Format;
end;
1165,8 → 927,8
 
procedure TDirectSoundBuffer.Unlock;
begin
if IDSBuffer = nil then Exit;
if FLockCount = 0 then Exit;
if IDSBuffer=nil then Exit;
if FLockCount=0 then Exit;
 
Dec(FLockCount);
DXResult := IBuffer.UnLock(FLockAudioPtr1[FLockCount], FLockAudioSize1[FLockCount],
1173,207 → 935,6
FLockAudioPtr2[FLockCount], FLockAudioSize2[FLockCount]);
end;
 
{ TD3DSParams }
 
function TD3DSParams.CheckValidity: Boolean;
begin
Result := (FOwner <> nil) and (TDirectSoundBuffer(FOwner).IDS3DBuffer <> nil)
end;
 
constructor TD3DSParams.Create(Owner: TDirectSoundBuffer);
{$IFDEF VER14UP}
function MakeD3DVector(x, y, z: TD3DValue): TD3DVector; {$IFDEF VER9UP}inline; {$ENDIF}
begin
Result.x := x;
Result.y := y;
Result.z := z;
end;
{$ENDIF}
begin
inherited Create;
FOwner := Owner;
with FDsb do
begin
dwSize := SizeOf(TDS3DBuffer);
vPosition := MakeD3DVector(0, 0, 0);
vVelocity := MakeD3DVector(0, 0, 0);
dwInsideConeAngle := DS3D_DEFAULTCONEANGLE;
dwOutsideConeAngle := DS3D_DEFAULTCONEANGLE;
vConeOrientation := MakeD3DVector(0, 0, 0);
lConeoutsideVolume := DS3D_DEFAULTCONEOUTSIDEVOLUME;
flMinDistance := 5;
flMaxDistance := 100.0;
dwMode := DS3DMODE_NORMAL;
end;
end;
 
destructor TD3DSParams.destroy;
begin
inherited destroy;
end;
 
function TD3DSParams.getPosition: TD3DVector;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetPosition(FDsb.vPosition);
end;
result := FDsb.vPosition;
end;
 
function TD3DSParams.getVelocity: TD3DVector;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetVelocity(FDsb.vVelocity);
end;
result := FDsb.vVelocity;
end;
 
function TD3DSParams.getConeOrientation: TD3DVector;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetConeOrientation(FDsb.vConeOrientation);
end;
result := FDsb.vConeOrientation;
end;
 
function TD3DSParams.getConeAngle: TConeAngle;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetConeAngles(FDsb.dwInsideConeAngle, FDsb.dwOutsideConeAngle);
end;
with result do
begin
Inside := FDsb.dwInsideConeAngle;
OutSide := FDsb.dwOutsideConeAngle;
end;
end;
 
function TD3DSParams.getConeOutsideVolume: Integer;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetConeOutsideVolume(FDsb.lConeOutsideVolume);
end;
result := FDsb.lConeOutsideVolume;
end;
 
function TD3DSParams.getMinDistance: TD3DValue;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetMinDistance(FDsb.flMinDistance);
end;
result := FDsb.flMinDistance;
end;
 
function TD3DSParams.getMaxDistance: TD3DValue;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetMaxDistance(FDsb.flMaxDistance);
end;
result := FDsb.flMaxDistance;
end;
 
function TD3DSParams.getRaw: TDS3DBuffer;
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.GetAllParameters(FDsb);
end;
result := FDsb;
end;
 
 
procedure TD3DSParams.setPosition(const v: TD3DVector);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetPosition(v.x, v.y, v.z, DS3D_IMMEDIATE);
end;
FDsb.vPosition := v;
end;
 
procedure TD3DSParams.setVelocity(const v: TD3DVector);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetVelocity(v.x, v.y, v.z, DS3D_IMMEDIATE);
end;
FDsb.vVelocity := v;
end;
 
procedure TD3DSParams.setConeOrientation(const v: TD3DVector);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetConeOrientation(v.x, v.y, v.z, DS3D_IMMEDIATE);
end;
FDsb.vConeOrientation := v;
end;
 
procedure TD3DSParams.setConeAngle(const v: TConeAngle);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetConeAngles(v.Inside, v.Outside, DS3D_IMMEDIATE);
end;
FDsb.dwInsideConeAngle := v.Inside;
FDsb.dwInsideConeAngle := v.Outside;
end;
 
procedure TD3DSParams.setConeOutsideVolume(const v: Integer);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetConeOutsideVolume(v, DS3D_IMMEDIATE);
end;
FDsb.lConeOutsideVolume := v;
end;
 
procedure TD3DSParams.setMinDistance(const v: TD3DValue);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetMinDistance(v, DS3D_IMMEDIATE);
end;
FDsb.flMinDistance := v;
end;
 
procedure TD3DSParams.setMaxDistance(const v: TD3DValue);
begin
if CheckValidity then
begin
FOwner.IDS3DBuffer.SetMaxDistance(v, DS3D_IMMEDIATE);
end;
FDsb.flMaxDistance := v;
end;
 
procedure TD3DSParams.setRaw(const v: TDS3DBuffer);
begin
if CheckValidity then
begin
if FOwner.IDS3DBuffer.SetAllParameters(v, DS3D_IMMEDIATE) <> DS_OK then
{'Parameter is invalid for Params3D'};
end;
FDsb := v;
end;
 
procedure TD3DSParams.Assign(Prms: TD3DSParams);
begin
FDsb := Prms.RawParams;
 
if CheckValidity then
begin
if FOwner.IDS3DBuffer.SetAllParameters(FDsb, DS3D_IMMEDIATE) <> DS_OK then
{'Parameter is invalid for Params3D'};
end;
end;
 
{ TAudioStream }
 
type
1424,7 → 985,7
 
procedure TAudioStreamNotify.Execute;
begin
while WaitForSingleObject(FAudio.FNotifyEvent, FSleepTime) = WAIT_TIMEOUT do
while WaitForSingleObject(FAudio.FNotifyEvent, FSleepTime)=WAIT_TIMEOUT do
Synchronize(Update);
end;
 
1466,7 → 1027,7
 
function TAudioStream.GetFormat: PWaveFormatEX;
begin
if WaveStream = nil then
if WaveStream=nil then
raise EAudioStreamError.Create(SWaveStreamNotSet);
Result := WaveStream.Format;
end;
1473,7 → 1034,7
 
function TAudioStream.GetFormatSize: Integer;
begin
if WaveStream = nil then
if WaveStream=nil then
raise EAudioStreamError.Create(SWaveStreamNotSet);
Result := WaveStream.FormatSize;
end;
1496,7 → 1057,7
 
function TAudioStream.GetSize: Integer;
begin
if WaveStream <> nil then
if WaveStream<>nil then
Result := WaveStream.Size
else
Result := 0;
1542,7 → 1103,7
end;
 
i := WaveStream.FilledSize;
if i >= 0 then Result := Min(Result, i);
if i>=0 then Result := Min(Result, i);
end;
 
procedure TAudioStream.Play;
1549,10 → 1110,10
begin
if not FPlaying then
begin
if WaveStream = nil then
if WaveStream=nil then
raise EAudioStreamError.Create(SWaveStreamNotSet);
 
if Size = 0 then Exit;
if Size=0 then Exit;
 
FPlaying := True;
try
1575,12 → 1136,12
AVolume: Integer;
begin
APlaying := Playing;
 
APosition := Position;
AFrequency := Frequency;
APan := Pan;
AVolume := Volume;
 
SetWaveStream(WaveStream);
 
Position := APosition;
1587,18 → 1148,18
Frequency := AFrequency;
Pan := APan;
Volume := AVolume;
 
if APlaying then Play;
end;
 
procedure TAudioStream.SetAutoUpdate(Value: Boolean);
begin
if FAutoUpdate <> Value then
if FAutoUpdate<>Value then
begin
FAutoUpdate := Value;
if FPlaying then
begin
if FNotifyThread <> nil then
if FNotifyThread<>nil then
begin
(FNotifyThread as TAudioStreamNotify).FStopOnTerminate := False;
FNotifyThread.Free;
1612,11 → 1173,11
 
procedure TAudioStream.SetBufferLength(Value: Integer);
begin
if Value < 10 then Value := 10;
if FBufferLength <> Value then
if Value<10 then Value := 10;
if FBufferLength<>Value then
begin
FBufferLength := Value;
if WaveStream <> nil then RecreateBuf;
if WaveStream<>nil then RecreateBuf;
end;
end;
 
1627,7 → 1188,7
 
procedure TAudioStream.SetLooped(Value: Boolean);
begin
if FLooped <> Value then
if FLooped<>Value then
begin
FLooped := Value;
Position := Position;
1647,10 → 1208,10
 
procedure TAudioStream.SetPosition(Value: Integer);
begin
if WaveStream = nil then
if WaveStream=nil then
raise EAudioStreamError.Create(SWaveStreamNotSet);
 
Value := Max(Min(Value, Size - 1), 0);
Value := Max(Min(Value, Size-1), 0);
Value := Value div Format^.nBlockAlign * Format^.nBlockAlign;
 
FPosition := Value;
1691,7 → 1252,7
FPosition := 0;
FWritePosition := 0;
 
if (Value <> nil) and (FBufferLength > 0) then
if (Value<>nil) and (FBufferLength>0) then
begin
FBufferSize := FBufferLength * Integer(Value.Format^.nAvgBytesPerSec) div 1000;
 
1743,10 → 1304,10
try
UpdatePlayedSize;
 
if Size < 0 then
if Size<0 then
begin
WriteSize := GetWriteSize;
if WriteSize > 0 then
if WriteSize>0 then
begin
WriteSize := WriteWave(WriteSize);
FPosition := FPosition + WriteSize;
1756,7 → 1317,7
if FLooped then
begin
WriteSize := GetWriteSize;
if WriteSize > 0 then
if WriteSize>0 then
begin
WriteWave(WriteSize);
FPosition := (FPosition + WriteSize) mod Size;
1763,14 → 1324,14
end;
end else
begin
if FPosition < Size then
if FPosition<Size then
begin
WriteSize := GetWriteSize;
if WriteSize > 0 then
if WriteSize>0 then
begin
WriteWave(WriteSize);
FPosition := FPosition + WriteSize;
if FPosition > Size then FPosition := Size;
if FPosition>Size then FPosition := Size;
end;
end else
begin
1804,7 → 1365,7
FWaveStream.ReadBuffer(Data1^, Data1Size);
FWritePosition := FWritePosition + Data1Size;
 
if Data2 <> nil then
if Data2<>nil then
begin
FWaveStream.ReadBuffer(Data2^, Data2Size);
FWritePosition := FWritePosition + Data2Size;
1831,7 → 1392,7
FBufferPos := (FBufferPos + DWORD(s1)) mod FBufferSize;
Inc(Result, s1);
 
if (Data2 <> nil) and (s1 = Data1Size) then
if (Data2<>nil) and (s1=Data1Size) then
begin
s2 := FWaveStream.Read(Data2^, Data2Size);
FWritePosition := FWritePosition + s2;
1850,7 → 1411,7
Data1, Data2: Pointer;
Data1Size, Data2Size: Longint;
begin
if Format^.wBitsPerSample = 8 then C := $80 else C := 0;
if Format^.wBitsPerSample=8 then C := $80 else C := 0;
 
if FBuffer.Lock(FBufferPos, Size, Data1, Data1Size, Data2, Data2Size) then
begin
1857,7 → 1418,7
try
FillChar(Data1^, Data1Size, C);
 
if Data2 <> nil then
if Data2<>nil then
FillChar(Data2^, Data2Size, C);
finally
FBuffer.UnLock;
1870,14 → 1431,14
var
DataSize: Integer;
begin
if Size >= 0 then
if Size>=0 then
begin
Result := WriteSize;
if FLooped then
begin
while WriteSize > 0 do
while WriteSize>0 do
begin
DataSize := Min(Size - FWritePosition, WriteSize);
DataSize := Min(Size-FWritePosition, WriteSize);
 
WriteData(DataSize);
FWritePosition := FWritePosition mod Size;
1886,20 → 1447,20
end;
end else
begin
DataSize := Size - FWritePosition;
DataSize := Size-FWritePosition;
 
if DataSize <= 0 then
if DataSize<=0 then
begin
WriteSilence(WriteSize);
end else
if DataSize >= WriteSize then
begin
WriteData(WriteSize);
end else
begin
WriteData(DataSize);
WriteSilence(WriteSize - DataSize);
end;
if DataSize>=WriteSize then
begin
WriteData(WriteSize);
end else
begin
WriteData(DataSize);
WriteSilence(WriteSize-DataSize);
end;
end;
end else
begin
1918,11 → 1479,11
 
procedure TAudioFileStream.SetFileName(const Value: string);
begin
if FFileName = Value then Exit;
if FFileName=Value then Exit;
 
FFileName := Value;
 
if FWaveFileStream <> nil then
if FWaveFileStream<>nil then
begin
WaveStream := nil;
FWaveFileStream.Free;
1929,7 → 1490,7
FWaveFileStream := nil;
end;
 
if Value <> '' then
if Value<>'' then
begin
try
FWaveFileStream := TWaveFileStream.Create(Value, fmOpenRead or fmShareDenyWrite);
1960,9 → 1521,9
i: Integer;
begin
Result := -1;
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
with Items[i] do
if (FSamplesPerSec = ASamplesPerSec) and (FBitsPerSample = ABitsPerSample) and (FChannels = AChannels) then
if (FSamplesPerSec=ASamplesPerSec) and (FBitsPerSample=ABitsPerSample) and (FChannels=AChannels) then
begin
Result := i;
Break;
2008,7 → 1569,7
 
procedure TSoundCaptureStreamNotify.Execute;
begin
while WaitForSingleObject(FCapture.FNotifyEvent, FSleepTime) = WAIT_TIMEOUT do
while WaitForSingleObject(FCapture.FNotifyEvent, FSleepTime)=WAIT_TIMEOUT do
begin
Synchronize(Update);
end;
2016,7 → 1577,7
 
procedure TSoundCaptureStreamNotify.Update;
begin
if FCapture.FilledSize > 0 then
if FCapture.FilledSize>0 then
begin
try
FCapture.DoFilledBuffer;
2045,13 → 1606,13
FBufferLength := 1000;
FSupportedFormats := TSoundCaptureFormats.Create;
 
if DXDirectSoundCaptureCreate(GUID, FCapture, nil) <> DS_OK then
if DXDirectSoundCaptureCreate(GUID, FCapture, nil)<>DS_OK then
raise ESoundCaptureStreamError.CreateFmt(SCannotInitialized, [SDirectSoundCapture]);
 
{ The supported format list is acquired. }
for ASamplesPerSec := Low(SamplesPerSecList) to High(SamplesPerSecList) do
for ABitsPerSample := Low(BitsPerSampleList) to High(BitsPerSampleList) do
for AChannels := Low(ChannelsList) to High(ChannelsList) do
for ASamplesPerSec:=Low(SamplesPerSecList) to High(SamplesPerSecList) do
for ABitsPerSample:=Low(BitsPerSampleList) to High(BitsPerSampleList) do
for AChannels:=Low(ChannelsList) to High(ChannelsList) do
begin
{ Test }
MakePCMWaveFormatEx(Format, SamplesPerSecList[ASamplesPerSec], BitsPerSampleList[ABitsPerSample], ChannelsList[AChannels]);
2062,7 → 1623,7
dscbd.lpwfxFormat := @Format;
 
{ If the buffer can be made, the format of present can be used. }
if FCapture.CreateCaptureBuffer(dscbd, TempBuffer, nil) = DS_OK then
if FCapture.CreateCaptureBuffer(dscbd, TempBuffer, nil)=DS_OK then
begin
TempBuffer := nil;
with TSoundCaptureFormat.Create(FSupportedFormats) do
2101,9 → 1662,9
var
CapturePosition, ReadPosition: DWORD;
begin
if FBuffer.GetCurrentPosition(@DWORD(CapturePosition), @DWORD(ReadPosition)) = DS_OK then
if FBuffer.GetCurrentPosition(CapturePosition, ReadPosition)=DS_OK then
begin
if FBufferPos <= ReadPosition then
if FBufferPos<=ReadPosition then
Result := ReadPosition - FBufferPos
else
Result := FBufferSize - FBufferPos + ReadPosition;
2120,23 → 1681,21
begin
if not FCapturing then
Start;
Data1 := nil;
Data2 := nil;
 
Result := 0;
while Result < Count do
while Result<Count do
begin
Size := Min(Count - Result, GetReadSize);
if Size > 0 then
Size := Min(Count-Result, GetReadSize);
if Size>0 then
begin
if FBuffer.Lock(FBufferPos, Size, Data1, {$IFNDEF DX7}@{$ENDIF}Data1Size,
Data2, {$IFNDEF DX7}@{$ENDIF}Data2Size, 0) = DS_OK then
if FBuffer.Lock(FBufferPos, Size, Data1, Data1Size, Data2, Data2Size, 0)=DS_OK then
begin
Move(Data1^, Pointer(Integer(@Buffer) + Result)^, Data1Size);
Move(Data1^, Pointer(Integer(@Buffer)+Result)^, Data1Size);
Result := Result + Integer(Data1Size);
 
if Data2 <> nil then
if Data2<>nil then
begin
Move(Data2^, Pointer(Integer(@Buffer) + Result)^, Data2Size);
Move(Data2^, Pointer(Integer(@Buffer)+Result)^, Data2Size);
Result := Result + Integer(Data1Size);
end;
 
2145,17 → 1704,17
end else
Break;
end;
if Result < Count then Sleep(50);
if Result<Count then Sleep(50);
end;
 
case Format^.wBitsPerSample of
8: C := $80;
8: C := $80;
16: C := $00;
else
C := $00;
end;
 
FillChar(Pointer(Integer(@Buffer) + Result)^, Count - Result, C);
FillChar(Pointer(Integer(@Buffer)+Result)^, Count-Result, C);
Result := Count;
end;
 
2178,7 → 1737,7
if Assigned(FOnFilledBuffer) then
begin
FNotifyThread := TSoundCaptureStreamNotify.Create(Self);
FNotifyThread.{$IFDEF VER14UP}Start{$ELSE}Resume{$ENDIF};
FNotifyThread.Resume;
end;
end else
FOnFilledBuffer := Value;
2203,7 → 1762,7
dscbd.dwBufferBytes := FBufferSize;
dscbd.lpwfxFormat := Format;
 
if FCapture.CreateCaptureBuffer(dscbd, FBuffer, nil) <> DS_OK then
if FCapture.CreateCaptureBuffer(dscbd, FBuffer, nil)<>DS_OK then
raise ESoundCaptureStreamError.CreateFmt(SCannotMade, [SDirectSoundCaptureBuffer]);
 
FBufferPos := 0;
2213,7 → 1772,7
if Assigned(FOnFilledBuffer) then
begin
FNotifyThread := TSoundCaptureStreamNotify.Create(Self);
FNotifyThread.{$IFDEF VER14UP}Start{$ELSE}Resume{$ENDIF};
FNotifyThread.Resume;
end;
except
Stop;
2227,7 → 1786,7
begin
FNotifyThread.Free;
FCapturing := False;
if FBuffer <> nil then
if FBuffer<>nil then
FBuffer.Stop;
FBuffer := nil;
end;
2241,6 → 1800,7
FDSound := ADSound;
FEnabled := True;
 
 
FEffectList := TList.Create;
FTimer := TTimer.Create(nil);
FTimer.Interval := 500;
2259,7 → 1819,7
var
i: Integer;
begin
for i := EffectCount - 1 downto 0 do
for i:=EffectCount-1 downto 0 do
Effects[i].Free;
FEffectList.Clear;
end;
2266,9 → 1826,9
 
procedure TSoundEngine.EffectFile(const Filename: string; Loop, Wait: Boolean);
var
Stream: TFileStream;
Stream : TFileStream;
begin
Stream := TFileStream.Create(Filename, fmOpenRead);
Stream :=TFileStream.Create(Filename, fmOpenRead);
try
EffectStream(Stream, Loop, Wait);
finally
2334,7 → 1894,7
var
i: Integer;
begin
for i := EffectCount - 1 downto 0 do
for i:=EffectCount-1 downto 0 do
Effects[i].Free;
FEffectList.Clear;
 
2346,7 → 1906,7
var
i: Integer;
begin
for i := EffectCount - 1 downto 0 do
for i:=EffectCount-1 downto 0 do
if not TDirectSoundBuffer(FEffectList[i]).Playing then
begin
TDirectSoundBuffer(FEffectList[i]).Free;
2411,7 → 1971,7
Event: PDXSoundNotifyEvent;
i: Integer;
begin
for i := 0 to FNotifyEventList.Count - 1 do
for i:=0 to FNotifyEventList.Count-1 do
begin
Event := FNotifyEventList[i];
if (TMethod(Event^).Code = TMethod(NotifyEvent).Code) and
2432,7 → 1992,7
var
i: Integer;
begin
for i := FNotifyEventList.Count - 1 downto 0 do
for i:=FNotifyEventList.Count-1 downto 0 do
PDXSoundNotifyEvent(FNotifyEventList[i])^(Self, NotifyType);
end;
 
2440,11 → 2000,11
begin
case Message.Msg of
WM_CREATE:
begin
DefWindowProc(Message);
SetForm(FForm);
Exit;
end;
begin
DefWindowProc(Message);
SetForm(FForm);
Exit;
end;
end;
DefWindowProc(Message);
end;
2497,7 → 2057,7
SetOptions(FOptions);
 
FPrimary.Free; FPrimary := nil;
FDSound.Free; FDSound := nil;
FDSound.Free; FDSound := nil;
end;
end;
end;
2505,8 → 2065,8
procedure TCustomDXSound.Initialize;
const
PrimaryDesc: TDSBufferDesc = (
dwSize: SizeOf(PrimaryDesc);
dwFlags: DSBCAPS_PRIMARYBUFFER);
dwSize: SizeOf (PrimaryDesc);
dwFlags: DSBCAPS_PRIMARYBUFFER);
var
Component: TComponent;
begin
2513,9 → 2073,9
Finalize;
 
Component := Owner;
while (Component <> nil) and (not (Component is TCustomForm)) do
while (Component<>nil) and (not (Component is TCustomForm)) do
Component := Component.Owner;
if Component = nil then
if Component=nil then
raise EDXSoundError.Create(SNoForm);
 
NotifyEventList(dsntInitializing);
2559,7 → 2119,7
Initialize;
except
on E: EDirectSoundError do ;
else raise;
else raise;
end;
end;
end;
2663,40 → 2223,13
 
if PrevInitialized then
Restore;
end
else
end else
inherited Assign(Source);
end;
end;
 
function TWaveCollectionItem.GetPlaying: boolean;
var
Buffer: TDirectSoundBuffer;
index: integer;
begin
Result := False;
if not FInitialized then Exit;
Assert(GetBuffer <> nil);
Assert(FBufferList <> nil);
if FLooped then
begin
Buffer := GetBuffer;
Assert(Buffer <> nil);
Result := Buffer.Playing;
end
else
begin
for index := 0 to FBufferList.Count - 1 do
begin
Result := TDirectSoundBuffer(FBufferList[index]).Playing;
if Result then
Break;
end;
end;
end; {GetPlaying}
 
function TWaveCollectionItem.GetBuffer: TDirectSoundBuffer;
begin
if FInitialized and (FBuffer = nil) then
if FInitialized and (FBuffer=nil) then
Restore;
Result := FBuffer;
end;
2713,7 → 2246,7
if not FInitialized then Exit;
FInitialized := False;
 
for i := 0 to FBufferList.Count - 1 do
for i:=0 to FBufferList.Count-1 do
TDirectSoundBuffer(FBufferList[i]).Free;
FBufferList.Clear;
FBuffer.Free; FBuffer := nil;
2728,7 → 2261,7
function TWaveCollectionItem.CreateBuffer: TDirectSoundBuffer;
begin
Result := nil;
if GetBuffer = nil then Exit;
if GetBuffer=nil then Exit;
 
Result := TDirectSoundBuffer.Create(WaveCollection.DXSound.DSound);
try
2751,39 → 2284,36
GetBuffer.Stop;
GetBuffer.Position := 0;
GetBuffer.Play(True);
end
else
end else
begin
NewBuffer := nil;
for i := 0 to FBufferList.Count - 1 do
for i:=0 to FBufferList.Count-1 do
if not TDirectSoundBuffer(FBufferList[i]).Playing then
begin
NewBuffer := FBufferList[i];
Break;
end;
 
if NewBuffer = nil then
if NewBuffer=nil then
begin
if FMaxPlayingCount = 0 then
if FMaxPlayingCount=0 then
begin
NewBuffer := CreateBuffer;
if NewBuffer = nil then Exit;
if NewBuffer=nil then Exit;
 
FBufferList.Add(NewBuffer);
end
else
end else
begin
if FBufferList.Count < FMaxPlayingCount then
if FBufferList.Count<FMaxPlayingCount then
begin
NewBuffer := CreateBuffer;
if NewBuffer = nil then Exit;
if NewBuffer=nil then Exit;
 
FBufferList.Add(NewBuffer);
end
else
end else
begin
NewBuffer := FBufferList[0];
FBufferList.Move(0, FBufferList.Count - 1);
FBufferList.Move(0, FBufferList.Count-1);
end;
end;
end;
2805,7 → 2335,7
 
procedure TWaveCollectionItem.Restore;
begin
if FWave.Size = 0 then Exit;
if FWave.Size=0 then Exit;
 
if not FInitialized then
begin
2814,7 → 2344,7
if not FInitialized then Exit;
end;
 
if FBuffer = nil then
if FBuffer=nil then
FBuffer := TDirectSoundBuffer.Create(WaveCollection.DXSound.DSound);
 
FBuffer.LoadFromWave(FWave);
2830,7 → 2360,7
if not FInitialized then Exit;
 
FBuffer.Stop;
for i := 0 to FBufferList.Count - 1 do
for i:=0 to FBufferList.Count-1 do
TDirectSoundBuffer(FBufferList[i]).Stop;
end;
 
2843,7 → 2373,7
 
procedure TWaveCollectionItem.SetLooped(Value: Boolean);
begin
if FLooped <> Value then
if FLooped<>Value then
begin
Stop;
FLooped := Value;
2854,15 → 2384,15
var
i: Integer;
begin
if Value < 0 then Value := 0;
if Value<0 then Value := 0;
 
if FMaxPlayingCount <> Value then
if FMaxPlayingCount<>Value then
begin
FMaxPlayingCount := Value;
 
if FInitialized then
begin
for i := 0 to FBufferList.Count - 1 do
for i:=0 to FBufferList.Count-1 do
TDirectSoundBuffer(FBufferList[i]).Free;
FBufferList.Clear;
end;
2911,7 → 2441,7
i: Integer;
begin
i := IndexOf(Name);
if i = -1 then
if i=-1 then
raise EWaveCollectionError.CreateFmt(SWaveNotFound, [Name]);
Result := Items[i];
end;
2920,7 → 2450,7
var
i: Integer;
begin
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Finalize;
FDXSound := nil;
end;
2931,13 → 2461,13
begin
Finalize;
FDXSound := DXSound;
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Initialize;
end;
 
function TWaveCollection.Initialized: Boolean;
begin
Result := (FDXSound <> nil) and (FDXSound.Initialized);
Result := (FDXSound<>nil) and (FDXSound.Initialized);
end;
 
procedure TWaveCollection.Restore;
2944,7 → 2474,7
var
i: Integer;
begin
for i := 0 to Count - 1 do
for i:=0 to Count-1 do
Items[i].Restore;
end;
 
3031,7 → 2561,7
procedure TCustomDXWaveList.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (DXSound = AComponent) then
if (Operation=opRemove) and (DXSound=AComponent) then
DXSound := nil;
end;
 
3041,19 → 2571,19
case NotifyType of
dsntDestroying: DXSound := nil;
dsntInitialize: FItems.Initialize(Sender);
dsntFinalize: FItems.Finalize;
dsntRestore: FItems.Restore;
dsntFinalize : FItems.Finalize;
dsntRestore : FItems.Restore;
end;
end;
 
procedure TCustomDXWaveList.SetDXSound(Value: TCustomDXSound);
begin
if FDXSound <> nil then
if FDXSound<>nil then
FDXSound.UnRegisterNotifyEvent(DXSoundNotifyEvent);
 
FDXSound := Value;
 
if FDXSound <> nil then
if FDXSound<>nil then
FDXSound.RegisterNotifyEvent(DXSoundNotifyEvent);
end;
 
3062,379 → 2592,6
FItems.Assign(Value);
end;
 
{(c) 2006 Jaro Benes, Play midi from memory module}
 
{ TMusicDataProp }
 
type
TMidiDataHeader = packed record
Size: Integer;
end;
 
procedure TMusicDataProp.DefineProperties(Filer: TFiler);
begin
inherited DefineProperties(Filer);
Filer.DefineBinaryProperty('Midi', ReadMidiData, WriteMidiData, Length(Self.FMusicData) <> 0);
end;
 
function TMusicDataProp.GetMusicData: string;
begin
SetLength(Result, Length(FMusicData));
if Length(FMusicData) <> 0 then
Move(FMusicData[1], Result[1], Length(FMusicData));
end;
 
procedure TMusicDataProp.ReadMidiData(Stream: TStream);
var
Header: TMidiDataHeader;
begin
Stream.ReadBuffer(Header, SizeOf(Header));
SetLength(FMusicData, Header.Size);
Stream.ReadBuffer(FMusicData[1], Header.Size);
end;
 
procedure TMusicDataProp.SetMusicData(const Value: string);
begin
SetLength(FMusicData, Length(Value));
if Length(Value) <> 0 then
Move(Value[1], FMusicData[1], Length(Value));
end;
 
procedure TMusicDataProp.WriteMidiData(Stream: TStream);
var
Header: TMidiDataHeader;
begin
Header.Size := Length(FMusicData);
Stream.WriteBuffer(Header, SizeOf(Header));
Stream.WriteBuffer(FMusicData[1], Header.Size);
end;
 
{ TMusicListCollectionItem }
 
procedure TMusicListCollectionItem.Load;
var
MidiFilelength: Integer;
begin
// kdyby nahodou uz nejaky existoval tak ho znic
if FDirectMusicSegment <> nil then
FDirectMusicSegment := nil;
ZeroMemory(@FMusicObjDesc, SizeOf(TDMUS_OBJECTDESC));
// tohle je popisek parametru - chceme hrat z pameti
with FMusicObjDesc do
begin
dwsize := SizeOf(TDMUS_OBJECTDESC);
guidclass := CLSID_DirectMusicSegment;
//tohle jen pokud je to ze souboru
//dwvaliddata := DMUS_OBJ_CLASS or DMUS_OBJ_FULLPATH or DMUS_OBJ_FILENAME;
dwvaliddata := DMUS_OBJ_CLASS or DMUS_OBJ_MEMORY or DMUS_OBJ_LOADED;
pbMemData := @FMusicDataProp.FMusicData[1];
llMemLength := Length(FMusicDataProp.FMusicData);
end;
if FDirectMusicLoader.GetObject(FMusicObjDesc, IID_IDirectMusicSegment, FDirectMusicSegment) <> dm_ok then
raise EDXMusicError.Create('Failed to Get object for Direct music'); ;
if FDirectMusicSegment.setParam(GUID_StandardMidiFile, $FFFFFFFF, 0, 0, Pointer(FDirectMusicPerformance)) <> dm_ok then
raise EDXMusicError.Create('Failed to Set param for Direct music'); ;
if FDirectMusicSegment.setParam(GUID_Download, $FFFFFFFF, 0, 0, Pointer(FDirectMusicPerformance)) <> dm_ok then
raise EDXMusicError.Create('Failed to Set param for Direct music'); ;
FDirectMusicSegment.GetLength(MidiFilelength);
if (FActualDuration < MidiFilelength) and (FActualDuration > 0) then
FDirectMusicSegment.SetLength(FActualDuration);
if FActualStartPoint < MidiFilelength - FActualDuration then
FDirectMusicSegment.SetStartpoint(FActualStartPoint);
// jak opakovat
FDirectMusicSegment.Setrepeats(repeats - 1);
end;
 
constructor TMusicListCollectionItem.Create(Collection: TCollection);
begin
inherited Create(Collection);
CoInitialize(nil);
FMusicDataProp := TMusicDataProp.Create;
SetLength(FMusicDataProp.FMusicData, 0);
FDirectMusicPerformance := nil;
FDirectMusic := nil;
FDirectSound := nil;
FDirectMusicSegment := nil;
FDirectMusicLoader := nil;
FIsInitialized := False;
end;
 
procedure TMusicListCollectionItem.Stop;
begin
if FDirectMusicPerformance <> nil then
FDirectMusicPerformance.Stop(nil, nil, 0, 0);
end;
 
function TMusicListCollectionItem.GetDisplayName: string;
begin
Result := inherited GetDisplayName
end;
 
procedure TMusicListCollectionItem.Play;
begin
if not FIsInitialized then
Init;
Load;
if FDirectMusicPerformance <> nil then
FDirectMusicPerformance.PlaySegment(FDirectMusicSegment, 0, 0, @FDirectMusicSegmentState);
end;
 
function TMusicListCollectionItem.IsPlaying: Boolean;
begin
Result := False;
if FDirectMusicPerformance <> nil then
Result := FDirectMusicPerformance.IsPlaying(FDirectMusicSegment, FDirectMusicSegmentState) = DM_OK;
end;
 
destructor TMusicListCollectionItem.Destroy;
begin
FDirectMusicPerformance := nil;
FDirectMusic := nil;
FDirectSound := nil;
FDirectMusicSegment := nil;
FDirectMusicLoader := nil;
FMusicDataProp.Free;
CoUninitialize;
inherited Destroy;
end;
 
procedure TMusicListCollectionItem.SetRepeats(const Value: Cardinal);
begin
Frepeats := Value;
end;
 
procedure TMusicListCollectionItem.SetStartPoint(const Value: integer);
begin
FStartPoint := Value;
end;
 
procedure TMusicListCollectionItem.SetDuration(const Value: integer);
begin
FDuration := Value;
end;
 
procedure TMusicListCollectionItem.Init;
var OK: Boolean;
begin
FIsInitialized := False;
OK := False;
// vytvor FDirectMusicPerformance pokud uz neni vytvoreno
if FDirectMusicPerformance = nil then
OK := CoCreateInstance(CLSID_DirectMusicPerformance, nil, CLSCTX_INPROC,
IID_IDirectMusicperformance, FDirectMusicPerformance) = DM_OK;
if not OK then Exit;
if FDirectSound <> nil then
OK := FDirectMusicPerformance.Init({$IFDEF DX7}@{$ENDIF}FDirectMusic, FDirectSound, 0) = DM_OK
else
OK := FDirectMusicPerformance.Init({$IFDEF DX7}@{$ENDIF}FDirectMusic, nil, 0) = dm_OK;
if not OK then Exit;
// vychozi midi port
// pridej pokud neni nastaven
if FDirectMusicPerformance.Addport(nil) <> DM_OK then Exit;
// zkus vytvorit loader
OK := CoCreateInstance(CLSID_DirectMusicLoader, nil, CLSCTX_Inproc,
IID_IDirectMusicLoader, FDirectMusicLoader) = DM_OK;
FIsInitialized := OK;
end;
 
function TMusicListCollectionItem.GetMusicListCollection: TMusicListCollection;
begin
Result := Collection as TMusicListCollection;
end;
 
procedure TMusicListCollectionItem.SaveToFile(const MidiFileName: string);
var F: file; BakFileMode: integer;
begin
BakFileMode := FileMode;
FileMode := 1; // Read/Write
try
AssignFile(F, MidiFileName);
Rewrite(F, 1);
try
BlockWrite(F, FMusicDataProp.FMusicData[1], Length(FMusicDataProp.FMusicData));
finally
CloseFile(F);
end;
finally
FileMode := BakFileMode;
end;
end;
 
procedure TMusicListCollectionItem.LoadFromFile(const MidiFileName: string);
var F: file; S: string; I: Integer; BakFileMode: integer;
begin
BakFileMode := FileMode;
FileMode := 0; // Read only
try
AssignFile(F, MidiFileName);
Reset(F, 1);
try
SetLength(FMusicDataProp.FMusicData, FileSize(F));
BlockRead(F, FMusicDataProp.FMusicData[1], FileSize(F));
S := ExtractFileName(MidiFileName);
I := Pos(ExtractFileExt(S), S);
if I > 0 then S := Copy(S, 1, I - 1);
FMusicDataProp.Midiname := S;
finally
CloseFile(F);
end;
Name := ExtractFileName(MidiFileName);
finally
FileMode := BakFileMode;
end;
end;
 
function TMusicListCollectionItem.Size: Integer;
begin
Result := Length(FMusicDataProp.FMusicData);
end;
 
{ TMusicListCollection }
 
constructor TMusicListCollection.Create(AOwner: TComponent);
begin
inherited Create(TMusicListCollectionItem);
FOwner := AOwner;
end;
 
function TMusicListCollection.Add: TMusicListCollectionItem;
begin
Result := TMusicListCollectionItem(inherited Add);
Result.FDirectSound := Self.FDirectSound;
end;
 
function TMusicListCollection.GetItem(Index: Integer): TMusicListCollectionItem;
begin
Result := TMusicListCollectionItem(inherited GetItem(Index));
end;
 
procedure TMusicListCollection.SetItem(Index: Integer;
Value: TMusicListCollectionItem);
begin
inherited SetItem(Index, Value);
end;
 
procedure TMusicListCollection.Update(Item: TCollectionItem);
begin
inherited Update(Item);
end;
 
function TMusicListCollection.Find(
const Name: string): TMusicListCollectionItem;
var
i: Integer;
begin
i := IndexOf(Name);
if i = -1 then
raise EDXMusicError.CreateFmt('The midi document does not exist: %s.', [Name]);
Result := Items[i];
end;
 
{$IFDEF VER4UP}
function TMusicListCollection.Insert(Index: Integer): TMusicListCollectionItem;
begin
Result := TMusicListCollectionItem(inherited Insert(Index));
end;
{$ENDIF}
 
function TMusicListCollection.GetOwner: TPersistent;
begin
Result := FOwner;
end;
 
procedure TMusicListCollection.Restore;
begin
 
end;
 
procedure TMusicListCollection.SaveToFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmCreate);
try
SaveToStream(Stream);
finally
Stream.Free;
end;
end;
 
procedure TMusicListCollection.LoadFromFile(const FileName: string);
var
Stream: TFileStream;
begin
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
try
LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
 
type
TMidiCollectionComponent = class(TComponent)
private
FList: TMusicListCollection;
published
property List: TMusicListCollection read FList write FList;
end;
 
procedure TMusicListCollection.SaveToStream(Stream: TStream);
var
Component: TMidiCollectionComponent;
begin
Component := TMidiCollectionComponent.Create(nil);
try
Component.FList := Self;
Stream.WriteComponentRes('DelphiXMidiCollection', Component);
finally
Component.Free;
end;
end;
 
procedure TMusicListCollection.LoadFromStream(Stream: TStream);
var
Component: TMidiCollectionComponent;
begin
Clear;
Component := TMidiCollectionComponent.Create(nil);
try
Component.FList := Self;
Stream.ReadComponentRes(Component);
Restore;
finally
Component.Free;
end;
end;
 
{ TDXMusic }
 
constructor TDXMusic.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FMidis := TMusicListCollection.Create(Self);
if Assigned(FDXSound) then
FMidis.FDirectSound := FDXSound.DSound.IDSound;
end;
 
procedure TDXMusic.SetMidis(const value: TMusicListCollection);
begin
FMidis.Assign(Value);
end;
 
destructor TDXMusic.Destroy;
begin
FMidis.Free;
inherited Destroy;
end;
 
procedure TDXMusic.SetDXSound(const Value: TDXSound);
begin
FDXSound := Value;
if Assigned(FDXSound) then
FMidis.FDirectSound := FDXSound.DSound.IDSound;
end;
 
initialization
finalization
DirectSoundDrivers.Free;
/VCL_DELPHIX_D6/DXReg.pas
1,1302 → 1,53
unit DXReg;
 
 
interface
 
{$I DelphiXcfg.inc}
{$WARNINGS OFF}
 
uses
Windows, SysUtils, Classes, Forms, Dialogs, Graphics, TypInfo,
Controls, StdCtrls, ExtCtrls, Buttons,
{$IFDEF D3DRM}Colli3DX, {$ENDIF}
{$IFNDEF VER6UP}DsgnIntf,
{$ELSE}Designintf, DesignEditors, VCLEditors, PropertyCategories,
{$ENDIF}
DXDraws, DXSounds, DIB, DXWave, DXInput, DXPlay, DXSprite, DXClass;
DXDraws, DXSounds, DIB, Wave, DXInput, DXPlay, DXSprite,
DXClass;
 
type
 
{ TDXDrawDisplayProperty }
procedure Register;
 
TDXDrawDisplayProperty = class(TClassProperty)
public
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
procedure GetValues(Proc: TGetStrProc); override;
procedure SetValue(const Value: string); override;
end;
 
{ TDIBProperty }
 
TDIBProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXDIBEditor }
 
TDXDIBEditor = class(TComponentEditor)
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TPictureCollectionItem_PictureProperty }
 
TPictureCollectionItem_PictureProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXImageListEditor }
 
TDXImageListEditor = class(TComponentEditor)
private
procedure ListBox1DblClick(Sender: TObject);
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TDXSpriteEngineEditor}
 
TDXSpriteEngineEditor = class(TComponentEditor)
private
procedure ListBox1DblClick(Sender: TObject);
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TWaveProperty }
 
TWaveProperty = class(TPropertyEditor)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXWaveEditor }
 
TDXWaveEditor = class(TComponentEditor)
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TDXWaveListEditor }
 
TDXWaveListEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TForceFeedbackEffectsProperty }
 
TForceFeedbackEffectsProperty = class(TClassProperty)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TDXInputEditor }
 
TDXInputEditor = class(TComponentEditor)
public
procedure Edit; override;
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ TGUIDProperty }
 
TGUIDProperty = class(TStringProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TSpriteProperty }
 
TSpriteProperty = class(TClassProperty)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
{ TMidiProperty }
 
TMidiProperty = class(TClassProperty)
public
procedure Edit; override;
function GetValue: string; override;
function GetAttributes: TPropertyAttributes; override;
end;
 
TMidiEditor = class(TDefaultEditor)
public
{$IFDEF VER6UP}
procedure EditProperty(const Prop: IProperty; var Continue: Boolean); override;
{$ELSE}
procedure EditProperty(PropertyEditor: TPropertyEditor;
var continue, FreeEditor: Boolean); override;
{$ENDIF}
end;
 
{ TDXMidiListEditor }
 
TDXMidiListEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
{ Trace editor}
 
TDXDrawEditor = class(TComponentEditor)
public
procedure ExecuteVerb(Index: Integer); override;
function GetVerb(Index: Integer): string; override;
function GetVerbCount: Integer; override;
end;
 
procedure Register;
 
implementation
 
uses DXPictEdit, DXWaveEdit, DXFFBEdit, DXInptEdit, DXGUIDEdit, DXSpriteEdit,
DXMidiEdit, DXDIBEffectEdit, {$IFDEF VER4UP}DXGlueItEdit,{$ENDIF} DXPathEdit;
 
const
SNone = '(None)';
 
SSettingImage = '&Image...';
SSettingWave = '&Wave...';
SDXGFileFilter = 'DXG file(*.dxg)|*.dxg|All files(*.*)|*.*';
SDXGOpenFileFilter = 'DXG file(*.dxg)|*.dxg|Bitmap file(*.bmp)|*.bmp|All files(*.*)|*.*';
SDXWFileFilter = 'DXW file(*.dxw)|*.dxg|All files(*.*)|*.*';
SDXWFileFilter = 'DXW file(*.dxw)|*.dxw|All files(*.*)|*.*';
SDXWOpenFileFilter = 'DXW file(*.dxw)|*.dxw|Wave file(*.wav)|*.wav|All files(*.*)|*.*';
SDXMFileFilter = 'DXM file(*.dxm)|*.dxm|All files(*.*)|*.*';
SDXMOpenFileFilter = 'DXM file(*.dxm)|*.dxm|Midi file(*.mid)|*.mid|All files(*.*)|*.*';
 
SSinglePlayer = '&Single player';
SMultiPlayer1 = 'Multi player &1';
SMultiPlayer2 = 'Multi player &2';
 
SOpen = '&Open...';
SSave = '&Save...';
SSave = '&Save..';
 
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TDXDrawDisplay), nil, '',
TDXDrawDisplayProperty);
 
RegisterPropertyEditor(TypeInfo(TDIB), nil, '', TDIBProperty);
RegisterComponentEditor(TCustomDXDIB, TDXDIBEditor);
 
RegisterPropertyEditor(TypeInfo(TPicture), TPictureCollectionItem, 'Picture', TPictureCollectionItem_PictureProperty);
RegisterComponentEditor(TCustomDXImageList, TDXImageListEditor);
 
RegisterPropertyEditor(TypeInfo(TWave), nil, '', TWaveProperty);
RegisterComponentEditor(TCustomDXWave, TDXWaveEditor);
 
RegisterComponentEditor(TCustomDXWaveList, TDXWaveListEditor);
 
RegisterPropertyEditor(TypeInfo(TForceFeedbackEffects), nil, '', TForceFeedbackEffectsProperty);
 
RegisterComponentEditor(TCustomDXInput, TDXInputEditor);
 
{$IFDEF UseDirectPlay}
RegisterPropertyEditor(TypeInfo(string), TCustomDXPlay, 'GUID', TGUIDProperty);
{$ENDIF} // UseDirectPlay
 
RegisterPropertyEditor(TypeInfo(TImageSprite), NIL, '', TSpriteProperty);
RegisterPropertyEditor(TypeInfo(TImageSpriteEx), NIL, '', TSpriteProperty);
RegisterPropertyEditor(TypeInfo(TSprite), NIL, '', TSpriteProperty);
RegisterPropertyEditor(TypeInfo(TBackgroundSprite), NIL, '', TSpriteProperty);
 
RegisterPropertyEditor(TypeInfo(TMusicDataProp), nil, 'MIDI', TMidiProperty);
RegisterComponentEditor(TDXMusic, TDXMidiListEditor);
RegisterComponentEditor(TDXSpriteEngine, TDXSpriteEngineEditor);
 
RegisterComponents('DelphiX',
[TDXDraw,
TDXDIB,
TDXImageList,
{$IFDEF DX3D_deprecated}
TDX3D,
{$ENDIF}
TDXSound,
TDXWave,
TDXWaveList,
TDXInput,
{$IFDEF UseDirectPlay}
TDXPlay,
{$ENDIF} // UseDirectPlay
TDXSpriteEngine,
TDXTimer,
TDXPaintBox,
TDXFont,
TDXPowerFont,
TDXMusic
]);
RegisterComponentEditor(TCustomDXDraw, TDXDrawEditor);
TDXDIB,
TDXImageList,
TDX3D,
TDXSound,
TDXWave,
TDXWaveList,
TDXInput,
TDXPlay,
TDXSpriteEngine,
TDXTimer,
TDXPaintBox]);
end;
 
{ TDXDrawDisplayProperty }
end.
 
function TDXDrawDisplayProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paValueList] - [paReadOnly];
end;
 
const
SDisplayMode = '%dx%dx%d';
 
function TDXDrawDisplayProperty.GetValue: string;
begin
with TDXDrawDisplay(GetOrdValue) do
Result := Format(SDisplayMode, [Width, Height, BitCount]);
end;
 
procedure TDXDrawDisplayProperty.GetValues(Proc: TGetStrProc);
const
List: array[0..2] of TPoint = (
(X: 640; Y: 480),
(X: 800; Y: 600),
(X: 1024; Y: 768));
var
BitCount, i: Integer;
begin
for i := Low(List) to High(List) do
for BitCount := 1 to 3 do
Proc(Format(SDisplayMode, [List[i].x, List[i].y, BitCount * 8]));
end;
 
procedure TDXDrawDisplayProperty.SetValue(const Value: string);
var
s: string;
i, AWidth, AHeight, ABitCount: Integer;
begin
s := Value;
 
i := Pos('x', s);
AWidth := StrToInt(Copy(s, 1, i - 1));
s := Copy(s, i + 1, Length(s));
 
i := Pos('x', s);
AHeight := StrToInt(Copy(s, 1, i - 1));
s := Copy(s, i + 1, Length(s));
 
ABitCount := StrToInt(s);
 
with TDXDrawDisplay(GetOrdValue) do
begin
Width := AWidth;
Height := AHeight;
BitCount := ABitCount;
end;
 
SetOrdValue(GetOrdValue);
end;
 
{ TDIBProperty }
 
procedure TDIBProperty.Edit;
var
Form: TDelphiXPictureEditForm;
begin
Form := TDelphiXPictureEditForm.Create(nil);
try
Form.ViewBox.Picture.Assign(TDIB(GetOrdValue));
Form.DIBClassOnly := True;
Form.ShowModal;
if Form.Tag <> 0 then
begin
SetOrdValue(Integer(Form.ViewBox.Picture.Graphic));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TDIBProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TDIBProperty.GetValue: string;
begin
if TDIB(GetOrdValue).Size = 0 then
Result := SNone
else
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TDXDIBEditor }
 
procedure TDXDIBEditor.Edit;
var
Form: TDelphiXPictureEditForm;
begin
Form := TDelphiXPictureEditForm.Create(nil);
try
Form.ViewBox.Picture.Assign(TCustomDXDIB(Component).DIB);
Form.DIBClassOnly := True;
Form.ShowModal;
if Form.Tag <> 0 then
begin
TCustomDXDIB(Component).DIB.Assign(TGraphic(Form.ViewBox.Picture.Graphic));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
procedure TDXDIBEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: Edit;
end;
end;
 
function TDXDIBEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SSettingImage;
end;
end;
 
function TDXDIBEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
{ TPictureCollectionItem_PictureProperty }
 
procedure TPictureCollectionItem_PictureProperty.Edit;
var
Form: TDelphiXPictureEditForm;
Item: TPictureCollectionItem;
TempDIB: TDIB;
begin
Form := TDelphiXPictureEditForm.Create(nil);
try
Form.ViewBox.Picture := TPicture(GetOrdValue);
Form.ShowModal;
if Form.Tag <> 0 then
begin
SetOrdValue(Integer(Form.ViewBox.Picture));
 
Item := GetComponent(0) as TPictureCollectionItem;
if Item.Picture.Graphic <> nil then
begin
TempDIB := TDIB.Create;
try
TempDIB.SetSize(1, 1, 24);
TempDIB.Canvas.Draw(0, 0, Item.Picture.Graphic);
Item.TransparentColor := TempDIB.Pixels[0, 0];
finally
TempDIB.Free;
end;
end;
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TPictureCollectionItem_PictureProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TPictureCollectionItem_PictureProperty.GetValue: string;
begin
if (TPicture(GetOrdValue).Graphic = nil) or (TPicture(GetOrdValue).Graphic.Empty) then
Result := SNone
else
Result := Format('(%s)', [TPicture(GetOrdValue).Graphic.ClassName]);
end;
 
{ dialog }
function CreateListBox(DblClck: TNotifyEvent; out lstbx: TListBox): TForm;
var
Panel1: TPanel;
Panel2: TPanel;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
begin
Result := TForm.Create(nil);
Panel1 := TPanel.Create(Result);
lstbx := TListBox.Create(Result);
Panel2 := TPanel.Create(Result);
BitBtn1 := TBitBtn.Create(Result);
BitBtn2 := TBitBtn.Create(Result);
with Result do
begin
Name := 'Form12';
Left := 0;
Top := 0;
BorderStyle := bsDialog;
Caption := 'Select Item';
ClientHeight := 206;
ClientWidth := 228;
Color := clBtnFace;
Font.Charset := DEFAULT_CHARSET;
Font.Color := clWindowText;
Font.Height := -11;
Font.Name := 'Tahoma';
Font.Style := [];
Position := poScreenCenter;
PixelsPerInch := 96;
end;
with Panel1 do
begin
Name := 'Panel1';
Parent := Result;
Left := 0;
Top := 0;
Width := 228;
Height := 165;
Align := alClient;
BevelOuter := bvNone;
BorderWidth := 4;
Caption := '';
TabOrder := 0;
end;
with lstbx do
begin
Name := 'ListBox1';
Parent := Panel1;
Left := 4;
Top := 4;
Width := 220;
Height := 157;
Align := alClient;
ItemHeight := 13;
TabOrder := 0;
OnDblClick := DblClck;
end;
with Panel2 do
begin
Name := 'Panel2';
Parent := Result;
Left := 0;
Top := 165;
Width := 228;
Height := 41;
Align := alBottom;
BevelOuter := bvNone;
Caption := '';
TabOrder := 1;
end;
with BitBtn1 do
begin
Name := 'BitBtn1';
Parent := Panel2;
Left := 24;
Top := 8;
Width := 75;
Height := 25;
TabOrder := 0;
Kind := bkOK;
end;
with BitBtn2 do
begin
Name := 'BitBtn2';
Parent := Panel2;
Left := 128;
Top := 8;
Width := 75;
Height := 25;
TabOrder := 1;
Kind := bkCancel;
end;
end;
function Alter(const str, altstr: string): string;
begin
if str = '' then Result := altstr
else Result := str;
end;
 
{ TDXImageListEditor }
 
procedure TDXImageListEditor.ExecuteVerb(Index: Integer);
var
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
DelphiXDIBEffectEditForm: TTDelphiXDIBEffectEditForm;
{$IFDEF VER4UP}
DXGlueItEditForm: TDXGlueItEditor;
{$ENDIF}
Q: TPictureCollectionItem;
I, N: Integer;
S, Z: string;
{$IFDEF VER4UP}
QQ: TCustomDXImageList;
FrmListBox: TForm;
ListBox1: TListBox;
{$ENDIF}
begin
case Index of
0: begin
OpenDialog := TOpenDialog.Create(nil);
try
OpenDialog.DefaultExt := 'dxg';
OpenDialog.Filter := SDXGOpenFileFilter;
OpenDialog.Options := [ofPathMustExist, ofFileMustExist, ofAllowMultiSelect];
if OpenDialog.Execute then
begin
if OpenDialog.FilterIndex = 2 then
begin
for i := 0 to OpenDialog.Files.Count - 1 do
with TPictureCollectionItem.Create(TCustomDXImageList(Component).Items) do
begin
try
Picture.LoadFromFile(OpenDialog.Files[i]);
Name := ExtractFileName(OpenDialog.Files[i]);
except
Free;
raise;
end;
end;
end else
TCustomDXImageList(Component).Items.LoadFromFile(OpenDialog.FileName);
Designer.Modified;
end;
finally
OpenDialog.Free;
end;
end;
1: begin
SaveDialog := TSaveDialog.Create(nil);
try
SaveDialog.DefaultExt := 'dxg';
SaveDialog.Filter := SDXGFileFilter;
SaveDialog.Options := [ofOverwritePrompt, ofPathMustExist];
if SaveDialog.Execute then
TCustomDXImageList(Component).Items.SaveToFile(SaveDialog.FileName);
finally
SaveDialog.Free;
end;
end;
2:
begin {Create shine effect...}
{special effect}
DelphiXDIBEffectEditForm := TTDelphiXDIBEffectEditForm.Create(nil);
try
DelphiXDIBEffectEditForm.ShowModal;
if DelphiXDIBEffectEditForm.Tag = 1 then begin
{check all names in list of images}
N := 0;
Z := DelphiXDIBEffectEditForm.eName.Text; S := Z;
I := TCustomDXImageList(Component).Items.IndexOf(Z);
{hleda jmeno}
while I <> -1 do begin
S := Format('%s_%d', [Z, N]); {new name}
I := TCustomDXImageList(Component).Items.IndexOf(S);
Inc(N);
end;
{add item}
Q := TPictureCollectionItem(TCustomDXImageList(Component).Items.Add);
Q.Picture.Assign(DelphiXDIBEffectEditForm.ResultDIB);
Q.Name := S; {it has to name!}
Q.Transparent := False; {transparend will be set in future}
Designer.Modified;
end;
finally
DelphiXDIBEffectEditForm.Free;
end;
end;
{$IFDEF VER4UP}
3: {Glue-it editor}
begin
DXGlueItEditForm := TDXGlueItEditor.Create(nil);
try
QQ := TCustomDXImageList(Component); Q := nil;
 
if QQ.Items.Count > 0 then begin
FrmListBox := CreateListBox(ListBox1DblClick, ListBox1);
try
for I := 0 to QQ.Items.Count - 1 do begin
S := QQ.Items[I].Name;
ListBox1.Items.Add(Alter(S, '(unnamed).' + IntToStr(I)));
end;
 
case FrmListBox.ShowModal of
mrOk: //when select one
begin
//when image selected
if ListBox1.ItemIndex <> -1 then begin
Q := QQ.Items[ListBox1.ItemIndex];
//load one image into editor
DXGlueItEditForm.LoadImageFromList(Q.Name, Q.Picture, Q.Width,
Q.Height, Q.Transparent, Q.TransparentColor);
//image loadet, noe se up edit mode
DXGlueItEditForm.Operation := ogiEdit;
end;
end;
mrCancel: DXGlueItEditForm.Operation := ogiNew;
else
Exit
end {case};
finally
FrmListBox.Free;
end;
end
else
DXGlueItEditForm.Operation := ogiNew;
DXGlueItEditForm.ShowModal;
if DXGlueItEditForm.Tag = 1 then begin
//when image as new. it has to create new item
if DXGlueItEditForm.Operation = ogiNew then
Q := TPictureCollectionItem(TCustomDXImageList(Component).Items.Add);
//and store edited image into
if Assigned(Q) then
DXGlueItEditForm.SaveImageIntoList(Q);
//signal to designer that anything was changed;
Designer.Modified;
end;
finally
DXGlueItEditForm.Free;
end;
end;
{$ENDIF}
end;
end;
 
function TDXImageListEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SOpen;
1: Result := SSave;
2: Result := 'Shine effect...';
{$IFDEF VER4UP}
//fix bug by Pásztor Károly [fenistil@hu.hu]
3: Result := 'Glue it...';
{$ENDIF}
end;
end;
 
function TDXImageListEditor.GetVerbCount: Integer;
begin
Result := {$IFDEF VER4UP}4{$ELSE}3{$ENDIF};
end;
 
procedure TDXImageListEditor.ListBox1DblClick(Sender: TObject);
begin
if Sender is TListBox then with (Sender as TListBox) do
if ItemIndex <> -1 then
(Owner as TForm).ModalResult := mrOk;
end;
 
{ TWaveProperty }
 
procedure TWaveProperty.Edit;
var
Form: TDelphiXWaveEditForm;
begin
Form := TDelphiXWaveEditForm.Create(nil);
try
Form.Wave := TWave(GetOrdValue);
Form.ShowModal;
if Form.Tag <> 0 then
begin
SetOrdValue(Integer(Form.Wave));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TWaveProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TWaveProperty.GetValue: string;
begin
if TWave(GetOrdValue).Size = 0 then
Result := SNone
else
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TDXWaveEditor }
 
procedure TDXWaveEditor.Edit;
var
Form: TDelphiXWaveEditForm;
begin
Form := TDelphiXWaveEditForm.Create(nil);
try
Form.Wave := TCustomDXWave(Component).Wave;
Form.ShowModal;
if Form.Tag <> 0 then
begin
TCustomDXWave(Component).Wave := Form.Wave;
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
procedure TDXWaveEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: Edit;
end;
end;
 
function TDXWaveEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SSettingWave;
end;
end;
 
function TDXWaveEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
{ TDXWaveListEditor }
 
procedure TDXWaveListEditor.ExecuteVerb(Index: Integer);
var
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
i: Integer;
begin
case Index of
0: begin
OpenDialog := TOpenDialog.Create(nil);
try
OpenDialog.DefaultExt := 'dxw';
OpenDialog.Filter := SDXWOpenFileFilter;
OpenDialog.Options := [ofPathMustExist, ofFileMustExist, ofAllowMultiSelect];
if OpenDialog.Execute then
begin
if OpenDialog.FilterIndex = 2 then
begin
for i := 0 to OpenDialog.Files.Count - 1 do
with TWaveCollectionItem.Create(TCustomDXWaveList(Component).Items) do
begin
try
Wave.LoadFromFile(OpenDialog.Files[i]);
Name := ExtractFileName(OpenDialog.Files[i]);
except
Free;
raise;
end;
end;
end else
TCustomDXWaveList(Component).Items.LoadFromFile(OpenDialog.FileName);
Designer.Modified;
end;
finally
OpenDialog.Free;
end;
end;
1: begin
SaveDialog := TSaveDialog.Create(nil);
try
SaveDialog.DefaultExt := 'dxw';
SaveDialog.Filter := SDXWFileFilter;
SaveDialog.Options := [ofOverwritePrompt, ofPathMustExist];
if SaveDialog.Execute then
TCustomDXWaveList(Component).Items.SaveToFile(SaveDialog.FileName);
finally
SaveDialog.Free;
end;
end;
end;
end;
 
function TDXWaveListEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SOpen;
1: Result := SSave;
end;
end;
 
function TDXWaveListEditor.GetVerbCount: Integer;
begin
Result := 2;
end;
 
{ TForceFeedbackEffectsProperty }
 
procedure TForceFeedbackEffectsProperty.Edit;
var
Form: TDelphiXFFEditForm;
Effects: TForceFeedbackEffects;
begin
Effects := TForceFeedbackEffects(GetOrdValue);
 
Form := TDelphiXFFEditForm.Create(nil);
try
if Effects.Input is TJoystick then
Form.Effects := Form.DXInput.Joystick.Effects
else if Effects.Input is TKeyboard then
Form.Effects := Form.DXInput.Keyboard.Effects
else if Effects.Input is TMouse then
Form.Effects := Form.DXInput.Mouse.Effects
else Exit;
 
Form.Effects.Assign(TForceFeedbackEffects(GetOrdValue));
Form.ShowModal;
if Form.Tag <> 0 then
begin
SetOrdValue(Integer(Form.Effects));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TForceFeedbackEffectsProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog, paReadOnly];
end;
 
function TForceFeedbackEffectsProperty.GetValue: string;
begin
if TForceFeedbackEffects(GetOrdValue).Count = 0 then
Result := SNone
else
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TDXInputEditor }
 
procedure TDXInputEditor.Edit;
var
Form: TDelphiXInputEditForm;
begin
Form := TDelphiXInputEditForm.Create(nil);
try
Form.DXInput := TCustomDXInput(Component);
Form.ShowModal;
if Form.Tag <> 0 then
Designer.Modified;
finally
Form.Free;
end;
end;
 
procedure TDXInputEditor.ExecuteVerb(Index: Integer);
begin
case Index of
0: begin
with TCustomDXInput(Component) do
begin
Joystick.ID := 0;
Keyboard.KeyAssigns := DefKeyAssign;
end;
Designer.Modified;
end;
1: begin
with TCustomDXInput(Component) do
begin
Joystick.ID := 0;
Keyboard.KeyAssigns := DefKeyAssign2_1;
end;
Designer.Modified;
end;
2: begin
with TCustomDXInput(Component) do
begin
Joystick.ID := 1;
Keyboard.KeyAssigns := DefKeyAssign2_2;
end;
Designer.Modified;
end;
end;
end;
 
function TDXInputEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SSinglePlayer;
1: Result := SMultiPlayer1;
2: Result := SMultiPlayer2;
end;
end;
 
function TDXInputEditor.GetVerbCount: Integer;
begin
Result := 3;
end;
 
{ TGUIDProperty }
 
procedure TGUIDProperty.Edit;
var
Form: TDelphiXGUIDEditForm;
begin
Form := TDelphiXGUIDEditForm.Create(nil);
try
Form.GUID := GetStrValue;
Form.ShowModal;
if Form.Tag <> 0 then
begin
SetStrValue(Form.GUID);
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TGUIDProperty.GetAttributes: TPropertyAttributes;
begin
Result := inherited GetAttributes + [paDialog];
end;
 
{ TSpriteProperty }
 
procedure TSpriteProperty.Edit;
var
DirectAccessToSprite: TSprite;
Form: TDelphiXSpriteEditForm;
//FormDesigner: IDesigner;
begin
DirectAccessToSprite := TSprite(GetOrdValue);
//FormDesigner := Designer;
Form := TDelphiXSpriteEditForm.Create(nil);
{FormDesigner.GetComponentNames(GetTypeData(GetPropType), Proc);}
try
Form.LoadDataToForm(DirectAccessToSprite);
//Form.Sprite.AsSign(TPersistent(GetOrdValue));
Form.ShowModal;
if Form.Tag <> 0 then
begin
DirectAccessToSprite := TSprite(Form.SaveDataFromForm);
SetOrdValue(Integer(DirectAccessToSprite));
Designer.Modified;
end;
finally
Form.Free;
end;
end;
 
function TSpriteProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
 
function TSpriteProperty.GetValue: string;
begin
Result := Format('(%s)', [TObject(GetOrdValue).ClassName]);
end;
 
{ TMidiProperty }
 
procedure TMidiProperty.Edit;
var
DelphiXMidiEditForm: TDelphiXMidiEditForm;
DirectAccessToMidiData: TMusicDataProp;
S: string; I: Integer;
begin
DirectAccessToMidiData := TMusicDataProp(GetOrdValue);
DelphiXMidiEditForm := TDelphiXMidiEditForm.Create(nil);
try
DelphiXMidiEditForm.MidiData := DirectAccessToMidiData.MusicData;
DelphiXMidiEditForm.MidiFileName := DirectAccessToMidiData.MidiName;
DelphiXMidiEditForm.Showmodal;
if DelphiXMidiEditForm.Tag = 1 then begin
DirectAccessToMidiData.MusicData := DelphiXMidiEditForm.MidiData;
S := '';
if DelphiXMidiEditForm.MidiFileName <> '' then begin
S := ExtractFileName(DelphiXMidiEditForm.MidiFileName);
I := Pos(ExtractFileExt(S), S);
if I > 0 then S := Copy(S, 1, I - 1);
end;
DirectAccessToMidiData.MidiName := S;
Designer.Modified;
end;
finally
DelphiXMidiEditForm.Free;
end;
end;
 
function TMidiProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paDialog];
end;
 
function TMidiProperty.GetValue: string;
var
S: string;
begin
S := TMusicDataProp(GetOrdValue).MusicData;
if Length(S) = 0 then
Result := SNone
else
Result := '(Midi)';
end;
 
{$IFDEF VER6UP}
procedure TMidiEditor.EditProperty(const Prop: IProperty; var Continue: Boolean);
{$ELSE}
procedure TMidiEditor.EditProperty(PropertyEditor: TPropertyEditor;
var continue, FreeEditor: Boolean);
{$ENDIF}
var
PropName: string;
begin
PropName := {$IFDEF VER6UP}Prop{$ELSE}PropertyEditor{$ENDIF}.GetName;
if (CompareText(PropName, 'Midi') = 0) then
begin
{$IFDEF VER6UP}Prop{$ELSE}PropertyEditor{$ENDIF}.edit;
continue := false;
end;
end;
 
{ TDXMidiListEditor }
 
procedure TDXMidiListEditor.ExecuteVerb(Index: Integer);
var
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
i: Integer;
begin
case Index of
0: begin
OpenDialog := TOpenDialog.Create(nil);
try
OpenDialog.DefaultExt := 'dxm';
OpenDialog.Filter := SDXMOpenFileFilter;
OpenDialog.Options := [ofPathMustExist, ofFileMustExist, ofAllowMultiSelect];
if OpenDialog.Execute then
begin
if OpenDialog.FilterIndex = 2 then
begin
for i := 0 to OpenDialog.Files.Count - 1 do
with TMusicListCollectionItem.Create(TDXMusic(Component).Midis) do
begin
try
LoadFromFile(OpenDialog.Files[i]);
Name := ExtractFileName(OpenDialog.Files[i]);
except
Free;
raise;
end;
end;
end
else
TDXMusic(Component).Midis.LoadFromFile(OpenDialog.FileName);
Designer.Modified;
end;
finally
OpenDialog.Free;
end;
end;
1: begin
SaveDialog := TSaveDialog.Create(nil);
try
SaveDialog.DefaultExt := 'dxm';
SaveDialog.Filter := SDXMFileFilter;
SaveDialog.Options := [ofOverwritePrompt, ofPathMustExist];
if SaveDialog.Execute then
TCustomDXWaveList(Component).Items.SaveToFile(SaveDialog.FileName);
finally
SaveDialog.Free;
end;
end;
end;
end;
 
function TDXMidiListEditor.GetVerbCount: Integer;
begin
Result := 2;
end;
 
function TDXMidiListEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := SOpen;
1: Result := SSave;
end;
end;
 
{ TDXSpriteEngineEditor }
 
procedure TDXSpriteEngineEditor.ListBox1DblClick(Sender: TObject);
begin
if Sender is TListBox then with (Sender as TListBox) do
if ItemIndex <> -1 then
(Owner as TForm).ModalResult := mrOk;
end;
 
procedure TDXSpriteEngineEditor.ExecuteVerb(Index: Integer);
var
FrmListBox: TForm;
ListBox1: TListBox;
DelphiXSpriteEditForm: TDelphiXSpriteEditForm;
ASprite: TSprite;
I, Z: Integer;
S: string;
Q: TCustomDXSpriteEngine;
begin
case Index of
0: begin
FrmListBox := nil;
Z := 0; //default value
DelphiXSpriteEditForm := TDelphiXSpriteEditForm.Create(nil);
try
Q := TCustomDXSpriteEngine(Component);
case Q.Items.Count of
0: begin
ShowMessage('You must create any item of sprite first!');
Exit;
end;
1: ASprite := Q.Items[Z].Sprite;
else
FrmListBox := CreateListBox(ListBox1DblClick, ListBox1);
for I := 0 to Q.Items.Count - 1 do begin
S := Q.Items[I].Name;
ListBox1.Items.Add(Alter(S, '(unnamed).' + IntToStr(I)));
end;
if FrmListBox.ShowModal <> mrOk then Exit;
Z := ListBox1.ItemIndex;
if Z = -1 then Exit;
ASprite := Q.Items[Z].Sprite;
{synchronize of names}
if ASprite.Caption = '' then
if Q.Items[ListBox1.ItemIndex].Name <> '' then
ASprite.Caption := Q.Items[Z].Name;
end {case};
DelphiXSpriteEditForm.LoadDataToForm(ASprite);
DelphiXSpriteEditForm.ShowModal;
if DelphiXSpriteEditForm.Tag <> 0 then begin
ASprite := TSprite(DelphiXSpriteEditForm.SaveDataFromForm);
if Q.Items[Z].Name = '' then
if ASprite.Caption <> '' then
Q.Items[Z].Name := ASprite.Caption;
Designer.Modified;
end;
finally
if Assigned(FrmListBox) then FrmListBox.Free;
DelphiXSpriteEditForm.Free;
end;
end;
end;
end;
 
function TDXSpriteEngineEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
function TDXSpriteEngineEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := 'Sprite Editor';
end;
end;
 
{ TDXDrawEditor }
 
procedure TDXDrawEditor.ExecuteVerb(Index: Integer);
var
ediform: TDelphiXPathsEditForm;
Q: TCustomDXDraw;
I: Integer;
S: string;
T: TTrace;
{$IFNDEF VER4UP}
H: TTrace;
J: Integer;
{$ENDIF}
begin
case Index of
0: begin
Q := TCustomDXDraw(Component);
{paths editor}
ediform := TDelphiXPathsEditForm.Create(nil);
try
ediform.Pane.Width := Q.Display.Width;
ediform.Pane.Height := Q.Display.Width;
for I := 0 to Q.Traces.Count - 1 do begin
S := Q.Traces.Items[I].Name;
T := ediform.PrivateTraces.Add;
T.Name := S;
{$IFDEF VER4UP}
T.Assign(Q.Traces.Items[I]);
{$ELSE}
T.Blit := Q.Traces.Items[I].Blit;
{$ENDIF}
if Trim(S) = '' then S := Format('(unnamed[%d])', [I]);
ediform.cbListOfTraces.Items.Add(S);
end;
ediform.ShowTracesOnPane;
 
ediform.ShowModal;
 
if ediform.Tag = 1 then begin
{clear traces}
Q.Traces.Clear;
{rewrite backward}
for i := 0 to ediform.PrivateTraces.Count -1 do begin
T := Q.Traces.Add;
T.Name := ediform.PrivateTraces.Items[I].Name;
{$IFDEF VER4UP}
T.Assign(ediform.PrivateTraces.Items[i]);
{$ELSE}
H := ediform.PrivateTraces.Items[i];
T.Blit := H.Blit;
T.Blit.SetPathLen(H.Blit.GetPathCount);
for J := 0 to H.Blit.GetPathCount - 1 do begin
T.Blit.Path[J] := H.Blit.Path[J]
end
{$ENDIF}
end;
{prepis zmeny}
Designer.Modified;
end;
finally
ediform.Free;
end;
end;
end;
end;
 
function TDXDrawEditor.GetVerbCount: Integer;
begin
Result := 1;
end;
 
function TDXDrawEditor.GetVerb(Index: Integer): string;
begin
case Index of
0: Result := 'Traces Editor';
end;
end;
 
end.
/VCL_DELPHIX_D6/DXRender.pas
5,18 → 5,7
{$INCLUDE DelphiXcfg.inc}
 
uses
Windows,
{$IfDef StandardDX}
DirectDraw,
{$ifdef DX7}
Direct3D;
{$endif}
{$IfDef DX9}
Direct3D9, Direct3D, D3DX9, {Direct3D8,} DX7toDX8;
{$EndIf}
{$Else}
DirectX;
{$EndIf}
Windows, DirectX;
 
const
DXR_MAXTEXTURE = 4;
27,15 → 16,6
TDXR_Color = DWORD;
TDXR_SurfaceColor = DWORD;
 
{ TDXR_Option }
 
PDXR_Option = ^TDXR_Option;
TDXR_Option = (
DXR_OPTION_VERSION,
DXR_OPTION_MMXENABLE,
DXR_OPTION_RENDERPRIMITIVES
);
 
{ TDXR_ShadeMode }
 
TDXR_ShadeMode = (
54,6 → 34,7
DXR_BLEND_ONE1_SUB_ONE2, // r=c1-c2
DXR_BLEND_ONE2_SUB_ONE1, // r=c2-c1
DXR_BLEND_ONE1_MUL_ONE2, // r=c1*c2
 
DXR_BLEND_SRCALPHA1, // r=c1*a1
DXR_BLEND_SRCALPHA1_ADD_ONE2, // r=c1*a1+c2
DXR_BLEND_ONE2_SUB_SRCALPHA1, // r=c2-c1*a1
60,10 → 41,8
DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2, // r=c1*a1+c2*(1-a2)
DXR_BLEND_INVSRCALPHA1_ADD_SRCALPHA2, // r=c1*(1-a1)+c2*a2
// for lighting
DXR_BLEND_DECAL, // r=c1
DXR_BLEND_DECALALPHA, // r=c1 ra=a2
DXR_BLEND_MODULATE, // r=c1*c2 ra=a2
DXR_BLEND_MODULATEALPHA, // r=c1*c2
DXR_BLEND_ADD // r=c1+c2 ra=a2
);
 
71,9 → 50,7
 
TDXR_TextureFilter = (
DXR_TEXTUREFILTER_NEAREST,
DXR_TEXTUREFILTER_LINEAR,
DXR_TEXTUREFILTER_MIPMAP_NEAREST,
DXR_TEXTUREFILTER_MIPMAP_LINEAR
DXR_TEXTUREFILTER_LINEAR
);
 
{ TDXR_TextureAddress }
83,19 → 60,6
DXR_TEXTUREADDRESS_DONOTCLIP // tx=tx ty=ty
);
 
{ TDXR_CmpFunc }
 
TDXR_CmpFunc = (
DXR_CMPFUNC_NEVER,
DXR_CMPFUNC_LESS,
DXR_CMPFUNC_EQUAL,
DXR_CMPFUNC_LESSEQUAL,
DXR_CMPFUNC_GREATER,
DXR_CMPFUNC_NOTEQUAL,
DXR_CMPFUNC_GREATEREQUAL,
DXR_CMPFUNC_ALWAYS
);
 
{ TDXR_ColorType }
 
TDXR_ColorType = (
125,7 → 89,6
Bits: Pointer; // Pointer to pixeldata(x:0 y:0)
Pitch: Integer; // Offset of next scanline
PitchBit: Integer; // Offset of next scanline (Number of bit)
MipmapChain: PDXR_Surface;
case Integer of
0: (
{ Indexed color }
150,7 → 113,6
sx: TDXR_Value; // Screen coordinates
sy: TDXR_Value;
sz: TDXR_Value;
rhw: TDXR_Value; // 1/sz
color: TDXR_Color;
specular: TDXR_Color;
tu, tv: array[0..DXR_MAXTEXTURE-1] of TDXR_Value;
183,7 → 145,6
ColorKeyEnable: Boolean;
ColorKey: TDXR_SurfaceColor;
TextureAddress: TDXR_TextureAddress;
BumpTexture: Integer;
end;
 
{ TDXR_Cull }
206,26 → 167,19
TextureEnable: Boolean;
TextureList: array[0..DXR_MAXTEXTURE-1] of TDXR_TextureLayer;
TextureFilter: TDXR_TextureFilter;
ZBuffer: PDXR_Surface;
ZFunc: TDXR_CmpFunc;
ZWriteEnable: Boolean;
EnableDrawLine: Integer;
EnableDrawLine: DWORD;
end;
 
function dxrGetOption(Option: TDXR_Option): DWORD;
procedure dxrSetOption(Option: TDXR_Option; Value: DWORD);
 
procedure dxrMakeIndexedSurface(var Surface: TDXR_Surface; Width, Height, BitCount: DWORD;
Bits: Pointer; pitch: Integer; idx_index, idx_alpha: DWORD);
procedure dxrMakeRGBSurface(var Surface: TDXR_Surface; Width, Height, BitCount: DWORD;
Bits: Pointer; pitch: Integer; rgb_red, rgb_green, rgb_blue, rgb_alpha: DWORD);
function dxrScanLine(const Surface: TDXR_Surface; y: DWORD): Pointer;
procedure dxrZBufferClear(const Surface: TDXR_Surface);
 
function dxrDDSurfaceLock(DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF}; var Surface: TDXR_Surface): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
function dxrDDSurfaceLock2(DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF}; var ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
var Surface: TDXR_Surface): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
procedure dxrDDSurfaceUnLock(DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF}; const Surface: TDXR_Surface); {$IFDEF VER9UP}inline;{$ENDIF}
function dxrDDSurfaceLock(DDSurface: IDirectDrawSurface; var Surface: TDXR_Surface): Boolean;
function dxrDDSurfaceLock2(DDSurface: IDirectDrawSurface; var ddsd: TDDSurfaceDesc;
var Surface: TDXR_Surface): Boolean;
procedure dxrDDSurfaceUnLock(DDSurface: IDirectDrawSurface; const Surface: TDXR_Surface);
 
procedure dxrDefRenderStates(var States: TDXR_RenderStates);
 
261,11 → 215,24
 
ColorFloatBit = 8;
ColorFloat = 1 shl ColorFloatBit;
 
type
 
PInteger = ^Integer;
 
{ TDXR_CmpFunc }
 
TDXR_CmpFunc = (
DXR_CMPFUNC_NEVER,
DXR_CMPFUNC_LESS,
DXR_CMPFUNC_EQUAL,
DXR_CMPFUNC_LESSEQUAL,
DXR_CMPFUNC_GREATER,
DXR_CMPFUNC_NOTEQUAL,
DXR_CMPFUNC_GREATEREQUAL,
DXR_CMPFUNC_ALWAYS
);
 
{ TDXRMachine }
 
TDXRMachine_TreeType = (
273,9 → 240,6
DXR_TREETYPE_LOADCOLOR, // Load vertex color
DXR_TREETYPE_LOADCONSTCOLOR, // Load constant color
DXR_TREETYPE_LOADTEXTURE, // Load texel
DXR_TREETYPE_LOADBUMPTEXTURE,// Load texel with Bump mapping
// dx := nx + (BumpTexture[nx-1, ny]-BumpTexture[nx+1, ny]);
// dy := ny + (BumpTexture[nx, ny-1]-BumpTexture[nx, ny+1]);
DXR_TREETYPE_LOADDESTPIXEL, // Load dest pixel
DXR_TREETYPE_BLEND // Blend color
);
320,23 → 284,10
DefaultColor: TDXRMachine_Color;
end;
 
TDXRMachine_Reg_RHW = record
Enable: Boolean;
nRHW: TDXRMachine_Int64;
iRHW: TDXRMachine_Int64;
end;
 
TDXRMachine_Reg_Dither = record
Enable: Boolean;
end;
 
TDXRMachine_Reg_ZBuffer = record
Enable: Boolean;
Surface: PDXR_Surface;
CmpFunc: TDXR_CmpFunc;
WriteEnable: Boolean;
end;
 
TDXRMachine_Reg_Axis = record
Axis: TDXRMachine_Axis;
IncEnable: Boolean;
358,10 → 309,6
DXR_TREETYPE_LOADTEXTURE: (
Texture: Integer
);
DXR_TREETYPE_LOADBUMPTEXTURE: (
_Texture: Integer;
BumpTexture: Integer;
);
DXR_TREETYPE_LOADDESTPIXEL: (
);
DXR_TREETYPE_BLEND: (
379,15 → 326,11
FTreeCount: Integer;
FTreeList: array[0..127] of TDXRMachine_Tree;
FMMXUsed: Boolean;
F_ZBuf: Pointer;
F_BiLinearAxis: TDXRMachine_Axis;
F_BiLinearCol1: TDXRMachine_Color;
F_BiLinearCol2: TDXRMachine_Color;
F_BiLinearCol3: TDXRMachine_Color;
F_BiLinearCol4: TDXRMachine_Color;
F_BumpAxis: TDXRMachine_Axis;
F_BumpAxis2: TDXRMachine_Axis;
F_BumpTempCol: DWORD;
FStack: array[0..255] of TDXRMachine_Color;
procedure GenerateCode(var Code: Pointer; Tree: PDXRMachine_Tree);
public
399,19 → 342,16
TextureIndex: array[0..7] of Integer;
TextureIndexCount: Integer;
Dither: TDXRMachine_Reg_Dither;
ZBuffer: TDXRMachine_Reg_ZBuffer;
Axis: TDXRMachine_Reg_Axis;
RHW: TDXRMachine_Reg_RHW;
constructor Create;
destructor Destroy; override;
function CreateTree: PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree2(Typ: TDXRMachine_TreeType): PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree_LoadColor(Color: DWORD): PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree_LoadConstColor(R, G, B, A: Byte): PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree_LoadTexture(Texture: DWORD): PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree_LoadBumpTexture(Texture, BumpTexture: DWORD): PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree_Blend(Blend: TDXR_Blend; BlendTree1, BlendTree2: PDXRMachine_Tree): PDXRMachine_Tree; {$IFDEF VER9UP}inline;{$ENDIF}
procedure Initialize; {$IFDEF VER9UP}inline;{$ENDIF}
function CreateTree: PDXRMachine_Tree;
function CreateTree2(Typ: TDXRMachine_TreeType): PDXRMachine_Tree;
function CreateTree_LoadColor(Color: DWORD): PDXRMachine_Tree;
function CreateTree_LoadConstColor(R, G, B, A: Byte): PDXRMachine_Tree;
function CreateTree_LoadTexture(Texture: DWORD): PDXRMachine_Tree;
function CreateTree_Blend(Blend: TDXR_Blend; BlendTree1, BlendTree2: PDXRMachine_Tree): PDXRMachine_Tree;
procedure Initialize;
procedure Compile(Tree: PDXRMachine_Tree);
procedure Run(Count: Integer);
property Compiled: Boolean read FCompiled write FCompiled;
442,7 → 382,7
 
RenderPrimitiveCount: Integer;
 
procedure ReadCPUID;
procedure ReadCPUID;
begin
asm
push ebx
478,42 → 418,10
@@exit:
pop ebx
end;
 
UseMMX := CPUIDFeatures and CPUIDF_MMX<>0;
end;
 
function dxrGetOption(Option: TDXR_Option): DWORD;
begin
Result := 0;
case Option of
DXR_OPTION_VERSION:
begin
Result := 1*100 + 0;
end;
DXR_OPTION_MMXENABLE:
begin
Result := DWORD(LongBool(UseMMX));
end;
DXR_OPTION_RENDERPRIMITIVES:
begin
Result := RenderPrimitiveCount;
end;
end;
end;
 
procedure dxrSetOption(Option: TDXR_Option; Value: DWORD);
begin
case Option of
DXR_OPTION_MMXENABLE:
begin
UseMMX := LongBool(Value) and (CPUIDFeatures and CPUIDF_MMX<>0);
end;
DXR_OPTION_RENDERPRIMITIVES:
begin
RenderPrimitiveCount := Value;
end;
end;
end;
 
function GetBitCount(B: Integer): DWORD;
begin
Result := 31;
630,14 → 538,14
Result := False;
end;
 
function dxrDDSurfaceLock(DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF}; var Surface: TDXR_Surface): Boolean;
function dxrDDSurfaceLock(DDSurface: IDirectDrawSurface; var Surface: TDXR_Surface): Boolean;
var
ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
ddsd: TDDSurfaceDesc;
begin
Result := dxrDDSurfaceLock2(DDSurface, ddsd, Surface);
end;
function dxrDDSurfaceLock2(DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF}; var ddsd: {$IFDEF D3D_deprecated}TDDSurfaceDesc{$ELSE}TDDSurfaceDesc2{$ENDIF};
 
function dxrDDSurfaceLock2(DDSurface: IDirectDrawSurface; var ddsd: TDDSurfaceDesc;
var Surface: TDXR_Surface): Boolean;
const
DDPF_PALETTEINDEXED = DDPF_PALETTEINDEXED1 or DDPF_PALETTEINDEXED2 or
654,22 → 562,22
ddsd.lpSurface, ddsd.lPitch, (1 shl ddsd.ddpfPixelFormat.dwRGBBitCount)-1, 0);
end else
begin
if ddsd.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS<>0 then
{if ddsd.ddpfPixelFormat.dwFlags and DDPF_ALPHAPIXELS<>0 then
begin
dxrMakeRGBSurface(Surface, ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount,
ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRBitMask, ddsd.ddpfPixelFormat.dwGBitMask,
ddsd.ddpfPixelFormat.dwBBitMask, ddsd.ddpfPixelFormat.dwRGBAlphaBitMask);
end else
end else}
begin
dxrMakeRGBSurface(Surface, ddsd.dwWidth, ddsd.dwHeight, ddsd.ddpfPixelFormat.dwRGBBitCount,
ddsd.lpSurface, ddsd.lPitch, ddsd.ddpfPixelFormat.dwRBitMask, ddsd.ddpfPixelFormat.dwGBitMask,
ddsd.ddpfPixelFormat.dwBBitMask, 0);
end;
end;
end;
end;
end;
 
procedure dxrDDSurfaceUnLock(DDSurface: {$IFDEF D3D_deprecated}IDirectDrawSurface{$ELSE}IDirectDrawSurface7{$ENDIF}; const Surface: TDXR_Surface);
procedure dxrDDSurfaceUnLock(DDSurface: IDirectDrawSurface; const Surface: TDXR_Surface);
begin
DDSurface.Unlock(Surface.Bits);
end;
679,14 → 587,6
Result := Pointer(Integer(Surface.Bits)+Surface.Pitch*Integer(y));
end;
 
procedure dxrZBufferClear(const Surface: TDXR_Surface);
var
i: Integer;
begin
for i:=0 to Surface.Height-1 do
FillChar(dxrScanLine(Surface, i)^, Abs(Surface.Pitch), $FF);
end;
 
{ TDXRMachine }
 
constructor TDXRMachine.Create;
716,9 → 616,7
FillChar(ColorList, SizeOf(ColorList), 0);
FillChar(TextureList, SizeOf(TextureList), 0);
FillChar(Dither, SizeOf(Dither), 0);
FillChar(ZBuffer, SizeOf(ZBuffer), 0);
FillChar(Axis, SizeOf(Axis), 0);
FillChar(RHW, SizeOf(RHW), 0);
end;
 
function TDXRMachine.CreateTree: PDXRMachine_Tree;
758,14 → 656,6
Result.Texture := Texture;
end;
 
function TDXRMachine.CreateTree_LoadBumpTexture(Texture, BumpTexture: DWORD): PDXRMachine_Tree;
begin
Result := CreateTree;
Result.Typ := DXR_TREETYPE_LOADBUMPTEXTURE;
Result.Texture := Texture;
Result.BumpTexture := BumpTexture;
end;
 
function TDXRMachine.CreateTree_Blend(Blend: TDXR_Blend; BlendTree1, BlendTree2: PDXRMachine_Tree): PDXRMachine_Tree;
begin
Result := CreateTree;
820,7 → 710,10
Col2_1 := [chRed, chGreen, chBlue, chAlpha];
Col2_2 := [];
end;
DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE1_SUB_ONE2:
DXR_BLEND_ONE1_ADD_ONE2,
DXR_BLEND_ONE1_SUB_ONE2,
DXR_BLEND_ONE2_SUB_ONE1,
DXR_BLEND_ONE1_MUL_ONE2:
begin
Col1_1 := [chRed, chGreen, chBlue, chAlpha];
Col1_2 := [];
827,13 → 720,6
Col2_1 := [chRed, chGreen, chBlue, chAlpha];
Col2_2 := [];
end;
DXR_BLEND_ONE2_SUB_ONE1, DXR_BLEND_ONE1_MUL_ONE2:
begin
Col1_1 := [chRed, chGreen, chBlue, chAlpha];
Col1_2 := [];
Col2_1 := [chRed, chGreen, chBlue, chAlpha];
Col2_2 := [];
end;
DXR_BLEND_SRCALPHA1:
begin
Col1_1 := [chRed, chGreen, chBlue];
870,13 → 756,6
Col2_2 := [];
end;
 
DXR_BLEND_DECAL:
begin
Col1_1 := [chRed, chGreen, chBlue, chAlpha];
Col1_2 := [];
Col2_1 := [];
Col2_2 := [];
end;
DXR_BLEND_DECALALPHA:
begin
Col1_1 := [chRed, chGreen, chBlue];
886,13 → 765,6
end;
DXR_BLEND_MODULATE:
begin
Col1_1 := [chRed, chGreen, chBlue, chAlpha];
Col1_2 := [];
Col2_1 := [chRed, chGreen, chBlue, chAlpha];
Col2_2 := [];
end;
DXR_BLEND_MODULATEALPHA:
begin
Col1_1 := [chRed, chGreen, chBlue];
Col1_2 := [chAlpha];
Col2_1 := [chRed, chGreen, chBlue];
925,10 → 797,6
begin
// Load texel
end;
DXR_TREETYPE_LOADBUMPTEXTURE:
begin
// Load texel with Bump mapping
end;
DXR_TREETYPE_LOADDESTPIXEL:
begin
// Load dest pixel
948,7 → 816,7
begin
c := Tree.Channels; Tree^.Typ := DXR_TREETYPE_LOADBLACK; Tree.Channels := c;
end else
if (Tree.Blend in [DXR_BLEND_ONE1, DXR_BLEND_DECAL]) then
if (Tree.Blend in [DXR_BLEND_ONE1]) then
begin
c := Tree.Channels; Tree := Tree.BlendTree1; Tree.Channels := c;
end else
956,12 → 824,12
begin
c := Tree.Channels; Tree := Tree.BlendTree2; Tree.Channels := c;
end else
if (Tree.Blend in [DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE2_SUB_ONE1]) and
if (Tree.Blend in [DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE1_SUB_ONE2]) and
(Tree.BlendTree2.Typ=DXR_TREETYPE_LOADBLACK) then
begin
c := Tree.Channels; Tree := Tree.BlendTree1; Tree.Channels := c;
end else
if (Tree.Blend in [DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE2_SUB_ONE1]) and
if (Tree.Blend in [DXR_BLEND_ONE1_ADD_ONE2, DXR_BLEND_ONE1_SUB_ONE2]) and
(Tree.BlendTree1.Typ=DXR_TREETYPE_LOADBLACK) then
begin
c := Tree.Channels; Tree := Tree.BlendTree2; Tree.Channels := c;
994,14 → 862,6
Tree.Channels*GetSurfaceChannels(TextureList[Tree.Texture].Surface^);
TextureList[Tree.Texture].Enable := TextureList[Tree.Texture].EnableChannels<>[];
end;
DXR_TREETYPE_LOADBUMPTEXTURE:
begin
// Load texel with Bump mapping
TextureList[Tree.Texture].EnableChannels := TextureList[Tree.Texture].EnableChannels +
Tree.Channels*GetSurfaceChannels(TextureList[Tree.Texture].Surface^);
TextureList[Tree.Texture].Enable := TextureList[Tree.Texture].EnableChannels<>[];
TextureList[Tree.BumpTexture].Enable := True;
end;
DXR_TREETYPE_LOADDESTPIXEL:
begin
// Load dest pixel
1040,9 → 900,6
Inc(TextureIndexCount);
end;
 
ZBuffer.Enable := ZBuffer.Surface<>nil;
 
RHW.Enable := ZBuffer.Enable;
Axis.IncEnable := Dither.Enable;
 
{ Generate X86 code }
1279,230 → 1136,6
end;
end;
 
procedure genInitZBuffer(var Code: Pointer);
var
_Axis: Pointer;
ByteCount, Pitch: DWORD;
Bits, _ZBuf: Pointer;
begin
if not ZBuffer.Enable then Exit;
 
_Axis := @Axis.Axis;
 
ByteCount := ZBuffer.Surface.BitCount div 8;
Pitch := ZBuffer.Surface.Pitch;
Bits := ZBuffer.Surface.Bits;
 
_ZBuf := @F_ZBuf;
 
asm
jmp @@EndCode
@@StartCode:
mov edx,dword ptr [offset _null]{}@@AxisX:
imul edx,$11{} @@ByteCount: // States.ZBuffer.BitCount div 8
mov eax,dword ptr [offset _null]{}@@AxisY:
imul eax,$11111111{} @@Pitch: // States.ZBuffer.pitch
add eax,$11111111{} @@Bits: // States.ZBuffer.Bits
add eax,edx
mov dword ptr [offset _null],eax{}@@_ZBuf:
@@EndCode:
{$I DXRender.inc}
{ @@AxisX }
mov eax,_Axis; add eax,TDXRMachine_Axis.X
mov edx,offset @@AxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisY }
mov eax,_Axis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@AxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@ByteCount }
mov eax,ByteCount
mov edx,offset @@ByteCount-1
sub edx,offset @@StartCode
mov byte ptr [ecx+edx],al
 
{ @@Pitch }
mov eax,Pitch
mov edx,offset @@Pitch-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Bits }
mov eax,Bits
mov edx,offset @@Bits-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_ZBuf }
mov eax,_ZBuf
mov edx,offset @@_ZBuf-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
procedure genZBufferTest(var Code: Pointer);
var
_ZBuf, _RHW: Pointer;
begin
if not ZBuffer.Enable then Exit;
 
_ZBuf := @F_ZBuf;
_RHW := @RHW.nRHW;
 
asm
jmp @@EndCode
@@StartCode:
mov edx,dword ptr [offset _null]{}@@_ZBuf:
mov ebx,dword ptr [offset _null]{}@@_RHW:
@@EndCode:
{$I DXRender.inc}
{ @@_ZBuf }
mov eax,_ZBuf
mov edx,offset @@_ZBuf-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_RHW }
mov eax,_RHW; add eax,4
mov edx,offset @@_RHW-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
if ZBuffer.CmpFunc<>DXR_CMPFUNC_ALWAYS then
begin
case ZBuffer.Surface.BitCount of
8: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,byte ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
16: begin
asm
jmp @@EndCode
@@StartCode:
movzx eax,word ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
24: begin
asm
jmp @@EndCode
@@StartCode:
movzx ax,byte ptr [edx+2]
shl eax,16
mov ax,word ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
32: begin
asm
jmp @@EndCode
@@StartCode:
mov eax,dword ptr [edx]
@@EndCode:
{$I DXRender.inc}
end;
end;
end;
 
asm
jmp @@EndCode
@@StartCode:
cmp eax,ebx
@@EndCode:
{$I DXRender.inc}
end;
genCmpFunc(Code, ZBuffer.CmpFunc, SkipAddress);
end;
 
if ZBuffer.WriteEnable then
begin
case ZBuffer.Surface.BitCount of
8: begin
asm
jmp @@EndCode
@@StartCode:
mov byte ptr [edx],bl
@@EndCode:
{$I DXRender.inc}
end;
end;
16: begin
asm
jmp @@EndCode
@@StartCode:
mov word ptr [edx],bx
@@EndCode:
{$I DXRender.inc}
end;
end;
24: begin
asm
jmp @@EndCode
@@StartCode:
mov word ptr [edx],bx
bswap ebx
mov byte ptr [edx+2],bh
@@EndCode:
{$I DXRender.inc}
end;
end;
32: begin
asm
jmp @@EndCode
@@StartCode:
mov dword ptr [edx],ebx
@@EndCode:
{$I DXRender.inc}
end;
end;
end;
end;
end;
 
procedure genUpdateZBufferAddress(var Code: Pointer);
var
ByteCount: DWORD;
_ZBuf: Pointer;
begin
if not ZBuffer.Enable then Exit;
 
ByteCount := ZBuffer.Surface.BitCount shr 3;
 
_ZBuf := @F_ZBuf;
 
asm
jmp @@EndCode
@@StartCode:
add dword ptr [offset _null],$11{}@@_ZBuf:
@@EndCode:
{$I DXRender.inc}
{ @@_ZBuf }
mov eax,ByteCount
mov edx,offset @@_ZBuf-1
sub edx,offset @@StartCode
mov byte ptr [ecx+edx],al
 
{ @@_ZBuf }
mov eax,_ZBuf
mov edx,offset @@_ZBuf-5
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
procedure genReadDestPixel(var Code: Pointer);
begin
case Dest.BitCount of
2990,19 → 2623,19
mov dword ptr [ecx+edx],eax
 
{ @@DestR }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@DestR-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@DestG }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@DestG-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@DestB }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@DestB-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3045,19 → 2678,19
mov dword ptr [ecx+edx],eax
 
{ @@DestR }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@DestR-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@DestG }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@DestG-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@DestB }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@DestB-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3099,19 → 2732,19
mov dword ptr [ecx+edx],eax
 
{ @@DestR }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@DestR-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@DestG }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@DestG-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@DestB }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@DestB-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3128,7 → 2761,7
@@EndCode:
{$I DXRender.inc}
{ @@DestR }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R)
mov edx,offset @@DestR-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3139,7 → 2772,7
mov word ptr [ecx+edx],ax
 
{ @@DestG }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G)
mov edx,offset @@DestG-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3150,7 → 2783,7
mov word ptr [ecx+edx],ax
 
{ @@DestB }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B)
mov edx,offset @@DestB-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3192,7 → 2825,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3221,7 → 2854,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3236,7 → 2869,7
@@EndCode:
{$I DXRender.inc}
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A)
mov edx,offset @@Dest-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3279,7 → 2912,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3308,7 → 2941,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3323,7 → 2956,7
@@EndCode:
{$I DXRender.inc}
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R)
mov edx,offset @@Dest-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3365,7 → 2998,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3394,7 → 3027,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3409,7 → 3042,7
@@EndCode:
{$I DXRender.inc}
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G)
mov edx,offset @@Dest-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3451,7 → 3084,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3480,7 → 3113,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3495,7 → 3128,7
@@EndCode:
{$I DXRender.inc}
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B)
mov edx,offset @@Dest-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3537,7 → 3170,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3566,7 → 3199,7
mov byte ptr [ecx+edx],al
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3581,7 → 3214,7
@@EndCode:
{$I DXRender.inc}
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A)
mov edx,offset @@Dest-6
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3621,7 → 3254,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3650,7 → 3283,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3685,7 → 3318,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3714,7 → 3347,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3749,7 → 3382,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3778,7 → 3411,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3813,7 → 3446,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3842,7 → 3475,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3902,7 → 3535,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
3992,7 → 3625,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4082,7 → 3715,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4172,7 → 3805,7
@@EndCode:
{$I DXRender.inc}
{ @@Src }
mov eax,Src; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Src; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Src-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4256,12 → 3889,9
procedure genEncodeColor2(var Code: Pointer; const Surface: TDXR_Surface; Src: PDXRMachine_Color; EnableChannels: TDXRColorChannels);
begin
if Dither.Enable then
begin
genEncodeColor_with_Dither(Code, Surface, Src, @Axis.Axis, EnableChannels)
end else
begin
else
genEncodeColor(Code, Surface, Src, EnableChannels);
end;
end;
 
procedure genColorKey(var Code: Pointer; const Texture: TDXRMachine_Reg_Texture);
4608,25 → 4238,25
@@EndCode:
{$I DXRender.inc}
{ @@_BiLinearCol1 }
mov eax,_BiLinearCol1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@_BiLinearCol1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol2 }
mov eax,_BiLinearCol2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@_BiLinearCol2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol3 }
mov eax,_BiLinearCol3; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@_BiLinearCol3-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol4 }
mov eax,_BiLinearCol4; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@_BiLinearCol4-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4644,7 → 4274,7
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4684,25 → 4314,25
@@EndCode:
{$I DXRender.inc}
{ @@_BiLinearCol1 }
mov eax,_BiLinearCol1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@_BiLinearCol1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol2 }
mov eax,_BiLinearCol2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@_BiLinearCol2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol3 }
mov eax,_BiLinearCol3; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@_BiLinearCol3-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol4 }
mov eax,_BiLinearCol4; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@_BiLinearCol4-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4720,7 → 4350,7
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4760,25 → 4390,25
@@EndCode:
{$I DXRender.inc}
{ @@_BiLinearCol1 }
mov eax,_BiLinearCol1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@_BiLinearCol1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol2 }
mov eax,_BiLinearCol2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@_BiLinearCol2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol3 }
mov eax,_BiLinearCol3; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@_BiLinearCol3-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol4 }
mov eax,_BiLinearCol4; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@_BiLinearCol4-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4796,7 → 4426,7
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4836,25 → 4466,25
@@EndCode:
{$I DXRender.inc}
{ @@_BiLinearCol1 }
mov eax,_BiLinearCol1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,_BiLinearCol1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@_BiLinearCol1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol2 }
mov eax,_BiLinearCol2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,_BiLinearCol2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@_BiLinearCol2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol3 }
mov eax,_BiLinearCol3; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,_BiLinearCol3; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@_BiLinearCol3-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@_BiLinearCol4 }
mov eax,_BiLinearCol4; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,_BiLinearCol4; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@_BiLinearCol4-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4872,7 → 4502,7
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
4884,252 → 4514,12
procedure genReadTexture(var Code: Pointer; Dest: PDXRMachine_Color;
const Texture: TDXRMachine_Reg_Texture; EnableChannels: TDXRColorChannels);
begin
if Texture.Filter in [DXR_TEXTUREFILTER_LINEAR, DXR_TEXTUREFILTER_MIPMAP_LINEAR] then
if Texture.Filter in [DXR_TEXTUREFILTER_LINEAR] then
genReadTexture_BiLinear(Code, Dest, Texture, Texture.nAxis, EnableChannels)
else
genReadTexture_Nearest(Code, Dest, Texture, Texture.nAxis, EnableChannels);
end;
 
procedure genReadBumpTexture_Nearest(var Code: Pointer; Dest: PDXRMachine_Color;
const Texture, BumpTexture: TDXRMachine_Reg_Texture; EnableChannels: TDXRColorChannels);
var
_Axis, _Axis2, _iAxis, _BumpAxis, _BumpAxis2: PDXRMachine_Axis;
_BumpTempCol: Pointer;
begin
if EnableChannels=[] then Exit;
 
_Axis := @BumpTexture.nAxis;
_Axis2 := @Texture.nAxis;
_iAxis := @BumpTexture.iAxis;
_BumpAxis := @F_BumpAxis;
_BumpAxis2 := @F_BumpAxis2;
_BumpTempCol := @F_BumpTempCol;
 
{ X }
asm
jmp @@EndCode
@@StartCode:
mov eax,dword ptr [offset _null]{}@@TexX:
mov edx,dword ptr [offset _null]{}@@TexY:
sub eax,dword ptr [offset _null]{}@@iTexX:
mov dword ptr [offset _null],edx{}@@AxisY:
mov dword ptr [offset _null],eax{}@@AxisX:
@@EndCode:
{$I DXRender.inc}
{ @@TexX }
mov eax,_Axis; add eax,TDXRMachine_Axis.X
mov edx,offset @@TexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@TexY }
mov eax,_Axis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@TexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@iTexX }
mov eax,_iAxis; add eax,TDXRMachine_Axis.X
mov edx,offset @@iTexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisX }
mov eax,_BumpAxis; add eax,TDXRMachine_Axis.X
mov edx,offset @@AxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisY }
mov eax,_BumpAxis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@AxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
genReadSurfacePixel(Code, BumpTexture, _BumpAxis);
 
asm
jmp @@EndCode
@@StartCode:
mov dword ptr [offset _null],eax{}@@BumpTempCol:
@@EndCode:
{$I DXRender.inc}
{ @@BumpTempCol }
mov eax,_BumpTempCol
mov edx,offset @@BumpTempCol-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
asm
jmp @@EndCode
@@StartCode:
mov edx,dword ptr [offset _null]{}@@iAxisX:
add dword ptr [offset _null],edx{}@@AxisX:
@@EndCode:
{$I DXRender.inc}
{ @@iAxisX }
mov eax,_iAxis; add eax,TDXRMachine_Axis.X
mov edx,offset @@iAxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisX }
mov eax,_BumpAxis; add eax,TDXRMachine_Axis.X
mov edx,offset @@AxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
genReadSurfacePixel(Code, BumpTexture, _BumpAxis);
 
asm
jmp @@EndCode
@@StartCode:
sub eax,dword ptr [offset _null]{}@@BumpTempCol:
sal eax,16
add eax,dword ptr [offset _null]{}@@TexX:
mov dword ptr [offset _null],eax{}@@AxisX:
@@EndCode:
{$I DXRender.inc}
{ @@BumpTempCol }
mov eax,_BumpTempCol
mov edx,offset @@BumpTempCol-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@TexX }
mov eax,_Axis2; add eax,TDXRMachine_Axis.X
mov edx,offset @@TexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisX }
mov eax,_BumpAxis2; add eax,TDXRMachine_Axis.X
mov edx,offset @@AxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
{ Y }
asm
jmp @@EndCode
@@StartCode:
mov eax,dword ptr [offset _null]{}@@TexX:
mov edx,dword ptr [offset _null]{}@@TexY:
sub edx,dword ptr [offset _null]{}@@iTexY:
mov dword ptr [offset _null],eax{}@@AxisX:
mov dword ptr [offset _null],edx{}@@AxisY:
@@EndCode:
{$I DXRender.inc}
{ @@TexX }
mov eax,_Axis; add eax,TDXRMachine_Axis.X
mov edx,offset @@TexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@TexY }
mov eax,_Axis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@TexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@iTexY }
mov eax,_iAxis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@iTexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisX }
mov eax,_BumpAxis; add eax,TDXRMachine_Axis.X
mov edx,offset @@AxisX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisY }
mov eax,_BumpAxis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@AxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
genReadSurfacePixel(Code, BumpTexture, _BumpTempCol);
 
asm
jmp @@EndCode
@@StartCode:
mov dword ptr [offset _null],eax{}@@BumpTempCol:
@@EndCode:
{$I DXRender.inc}
{ @@BumpTempCol }
mov eax,_BumpTempCol
mov edx,offset @@BumpTempCol-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
asm
jmp @@EndCode
@@StartCode:
mov edx,dword ptr [offset _null]{}@@iAxisY:
sal edx,1
sub dword ptr [offset _null],edx{}@@AxisY:
@@EndCode:
{$I DXRender.inc}
{ @@iAxisY }
mov eax,_iAxis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@iAxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisY }
mov eax,_BumpAxis; add eax,TDXRMachine_Axis.Y
mov edx,offset @@AxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
genReadSurfacePixel(Code, BumpTexture, _BumpAxis);
 
asm
jmp @@EndCode
@@StartCode:
sub eax,dword ptr [offset _null]{}@@BumpTempCol:
sal eax,16
add eax,dword ptr [offset _null]{}@@TexY:
mov dword ptr [offset _null],eax{}@@AxisY:
@@EndCode:
{$I DXRender.inc}
{ @@BumpTempCol }
mov eax,_BumpTempCol
mov edx,offset @@BumpTempCol-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@TexX }
mov eax,_Axis2; add eax,TDXRMachine_Axis.Y
mov edx,offset @@TexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@AxisX }
mov eax,_BumpAxis2; add eax,TDXRMachine_Axis.Y
mov edx,offset @@AxisY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
 
genReadTexture_Nearest(Code, Dest, Texture, _BumpAxis2^, EnableChannels);
end;
 
procedure genReadBumpTexture(var Code: Pointer; Dest: PDXRMachine_Color;
const Texture, BumpTexture: TDXRMachine_Reg_Texture; EnableChannels: TDXRColorChannels);
begin
{if Texture.Filter in [DXR_TEXTUREFILTER_LINEAR, DXR_TEXTUREFILTER_MIPMAP_LINEAR] then
genReadBumpTexture_BiLinear(Code, Dest, Texture, BumpTexture, EnableChannels)
else }
genReadBumpTexture_Nearest(Code, Dest, Texture, BumpTexture, EnableChannels);
end;
 
procedure genUpdateAxis(var Code: Pointer);
var
_Axis: Pointer;
5137,7 → 4527,6
if not Axis.IncEnable then Exit;
 
_Axis := @Axis.Axis;
 
asm
jmp @@EndCode
@@StartCode:
5172,11 → 4561,11
asm
jmp @@EndCode
@@StartCode:
db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111]
db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111]
@@_nColor:
db $0F,$FD,$05,$11,$11,$11,$11///paddw mm0,qword ptr [$11111111]
db $0F,$FD,$05,$11,$11,$11,$11/// paddw mm0,qword ptr [$11111111]
@@_iColor:
db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0
db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0
@@_nColor2:
@@EndCode:
{$I DXRender.inc}
5266,87 → 4655,53
nTex := @Texture.nAxis;
iTex := @Texture.iAxis;
 
if UseMMX then
if Texture.iAxisConstant then
begin
FMMXUsed := True;
asm
jmp @@EndCode
@@StartCode:
db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111]
@@nTex:
db $0F,$FE,$05,$11,$11,$11,$11///paddd mm0,qword ptr [$11111111]
@@iTex:
db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0
@@nTex2:
@@EndCode:
{$I DXRender.inc}
{ @@nTex }
mov eax,nTex
mov edx,offset @@nTex-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
if Texture.iAxis.X<>0 then
begin
asm
jmp @@EndCode
@@StartCode:
add dword ptr [offset _Null],$11111111{}@@nTexX:
@@EndCode:
{$I DXRender.inc}
{ @@nTexX }
mov eax,iTex; add eax,TDXRMachine_Axis.X; mov eax,dword ptr [eax]
mov edx,offset @@nTexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@nTex2 }
mov eax,nTex
mov edx,offset @@nTex2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
mov eax,nTex; add eax,TDXRMachine_Axis.X
mov edx,offset @@nTexX-8
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
{ @@iTex }
mov eax,iTex
mov edx,offset @@iTex-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
if Texture.iAxis.Y<>0 then
begin
asm
jmp @@EndCode
@@StartCode:
add dword ptr [offset _Null],$11111111{}@@nTexY:
@@EndCode:
{$I DXRender.inc}
{ @@nTexY }
mov eax,iTex; add eax,TDXRMachine_Axis.Y; mov eax,dword ptr [eax]
mov edx,offset @@nTexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
mov eax,nTex; add eax,TDXRMachine_Axis.Y
mov edx,offset @@nTexY-8
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
end else
begin
if Texture.iAxisConstant then
if UseMMX then
begin
if Texture.iAxis.X<>0 then
begin
asm
jmp @@EndCode
@@StartCode:
add dword ptr [offset _Null],$11111111{}@@nTexX:
@@EndCode:
{$I DXRender.inc}
{ @@nTexX }
mov eax,iTex; add eax,TDXRMachine_Axis.X; mov eax,dword ptr [eax]
mov edx,offset @@nTexX-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
mov eax,nTex; add eax,TDXRMachine_Axis.X
mov edx,offset @@nTexX-8
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
if Texture.iAxis.Y<>0 then
begin
asm
jmp @@EndCode
@@StartCode:
add dword ptr [offset _Null],$11111111{}@@nTexY:
@@EndCode:
{$I DXRender.inc}
{ @@nTexY }
mov eax,iTex; add eax,TDXRMachine_Axis.Y; mov eax,dword ptr [eax]
mov edx,offset @@nTexY-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
mov eax,nTex; add eax,TDXRMachine_Axis.Y
mov edx,offset @@nTexY-8
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
end else
//begin
if UseMMX then
begin
FMMXUsed := True;
asm
jmp @@EndCode
5377,9 → 4732,8
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end else
begin
 
end else
begin
asm
jmp @@EndCode
@@StartCode:
5418,51 → 4772,6
end;
end;
 
procedure genUpdateRHW(var Code: Pointer);
var
nRHW, iRHW: Pointer;
begin
if not RHW.Enable then Exit;
 
nRHW := @RHW.nRHW;
iRHW := @RHW.iRHW;
 
asm
jmp @@EndCode
@@StartCode:
// 64 bit addition
mov eax,dword ptr [offset _null]{}@@iRHW:
mov edx,dword ptr [offset _null]{}@@iRHW2:
add dword ptr [offset _null],eax{}@@nRHW:
adc dword ptr [offset _null],edx{}@@nRHW2:
@@EndCode:
{$I DXRender.inc}
{ @@nRHW }
mov eax,nRHW
mov edx,offset @@nRHW-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@nRHW2 }
mov eax,nRHW; add eax,4
mov edx,offset @@nRHW2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@iRHW }
mov eax,iRHW
mov edx,offset @@iRHW-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@iRHW }
mov eax,iRHW; add eax,4
mov edx,offset @@iRHW2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
procedure genBlend(var Code: Pointer; Blend: TDXR_Blend;
Dest, Col1, Col2: PDXRMachine_Color; EnableChannels: TDXRColorChannels;
ConstChannels1, ConstChannels2: TDXRColorChannels);
5619,7 → 4928,7
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
5628,7 → 4937,7
 
procedure genBlend_ZERO(var Code: Pointer; Dest: PDXRMachine_Color);
begin
asm
asm
jmp @@EndCode
@@StartCode:
mov dword ptr [offset _null],0{}@@Dest:
5654,15 → 4963,15
begin
if Dest=Col1 then Exit;
 
if UseMMX then //False then//UseMMX then
if UseMMX then
begin
FMMXUsed := True;
asm
jmp @@EndCode
@@StartCode:
db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111]
db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111]
@@Col:
db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0
db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0
@@Dest:
@@EndCode:
{$I DXRender.inc}
5761,12 → 5070,11
asm
jmp @@EndCode
@@StartCode:
db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111]
db $0F,$6F,$05,$11,$11,$11,$11/// movq mm0,qword ptr [$11111111]
@@Col1:
db $0F,$6F,$0D,$11,$11,$11,$11///movq mm1,qword ptr [$11111111]
db $0F,$DD,$05,$11,$11,$11,$11/// paddusw mm0,qword ptr [$11111111]
@@Col2:
db $0F,$DD,$C1 ///paddusw mm0,mm1
db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0
db $0F,$7F,$05,$11,$11,$11,$11/// movq qword ptr [$11111111],mm0
@@Dest:
@@EndCode:
{$I DXRender.inc}
5848,102 → 5156,6
end;
end;
 
procedure genBlend_ONE2_SUB_ONE1(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color;
ConstChannels1, ConstChannels12: TDXRColorChannels);
begin
if UseMMX then
begin
FMMXUsed := True;
asm
jmp @@EndCode
@@StartCode:
db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111]
@@Col1:
db $0F,$6F,$0D,$11,$11,$11,$11///movq mm1,qword ptr [$11111111]
@@Col2:
db $0F,$D9,$C8 ///psubusw mm1,mm0
db $0F,$7F,$0D,$11,$11,$11,$11///movq qword ptr [$11111111],mm1
@@Dest:
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end else
begin
{ Red Channel }
if chRed in EnableChannels then
begin
if chRed in ConstChannels1 then
begin
Func_col1_Sub_const2(Code, @Dest.R, @Col2.R, @Col1.R);
end else
if chRed in ConstChannels2 then
begin
Func_const1_Sub_col2(Code, @Dest.R, @Col1.R, @Col2.R);
end else
Func_col1_Sub_col2(Code, @Dest.R, @Col2.R, @Col1.R);
end;
 
{ Green Channel }
if chRed in EnableChannels then
begin
if chRed in ConstChannels1 then
begin
Func_col1_Sub_const2(Code, @Dest.G, @Col2.G, @Col1.G);
end else
if chRed in ConstChannels2 then
begin
Func_const1_Sub_col2(Code, @Dest.G, @Col1.G, @Col2.G);
end else
Func_col1_Sub_col2(Code, @Dest.G, @Col2.G, @Col1.G);
end;
 
{ Blue Channel }
if chRed in EnableChannels then
begin
if chRed in ConstChannels1 then
begin
Func_col1_Sub_const2(Code, @Dest.B, @Col2.B, @Col1.B);
end else
if chRed in ConstChannels2 then
begin
Func_const1_Sub_col2(Code, @Dest.B, @Col1.B, @Col2.B);
end else
Func_col1_Sub_col2(Code, @Dest.B, @Col2.B, @Col1.B);
end;
 
{ Alpha Channel }
if chRed in EnableChannels then
begin
if chRed in ConstChannels1 then
begin
Func_col1_Sub_const2(Code, @Dest.A, @Col2.A, @Col1.A);
end else
if chRed in ConstChannels2 then
begin
Func_const1_Sub_col2(Code, @Dest.A, @Col1.A, @Col2.A);
end else
Func_col1_Sub_col2(Code, @Dest.A, @Col2.A, @Col1.A);
end;
end;
end;
 
procedure genBlend_ONE1_SUB_ONE2(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color;
ConstChannels1, ConstChannels12: TDXRColorChannels);
begin
6091,19 → 5303,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6121,19 → 5333,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6151,19 → 5363,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6181,19 → 5393,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6212,7 → 5424,7
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6255,13 → 5467,13
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6279,13 → 5491,13
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6330,13 → 5542,13
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6354,13 → 5566,13
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6379,7 → 5591,7
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6399,19 → 5611,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6432,19 → 5644,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6465,19 → 5677,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6498,19 → 5710,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6528,7 → 5740,7
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6549,19 → 5761,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6583,19 → 5795,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6617,19 → 5829,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6651,19 → 5863,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6683,7 → 5895,7
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6741,19 → 5953,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6775,19 → 5987,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6847,19 → 6059,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6881,19 → 6093,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6914,7 → 6126,7
@@EndCode:
{$I DXRender.inc}
{ @@Col1A }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1A-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
6972,19 → 6184,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7006,19 → 6218,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7078,19 → 6290,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7112,19 → 6324,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7210,13 → 6422,13
@@EndCode:
{$I DXRender.inc}
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7224,7 → 6436,7
end;
end;
 
procedure genBlend_MODULATE(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color;
procedure genBlend_MODULATE_RGBONLY(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color;
ConstChannels1, ConstChannels12: TDXRColorChannels);
begin
if chRed in EnableChannels then
7238,19 → 6450,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7268,19 → 6480,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7298,19 → 6510,19
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7327,13 → 6539,13
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col1; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7341,166 → 6553,6
end;
end;
 
procedure genBlend_MODULATEALPHA(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color;
ConstChannels1, ConstChannels12: TDXRColorChannels);
begin
if UseMMX then
begin
FMMXUsed := True;
asm
jmp @@EndCode
@@StartCode:
db $0F,$6F,$05,$11,$11,$11,$11///movq mm0,qword ptr [$11111111]
@@Col1:
db $0F,$6F,$0D,$11,$11,$11,$11///movq mm1,qword ptr [$11111111]
@@Col2:
db $0F,$E5,$C1 ///pmulhw mm0,mm1
db $0F,$7F,$05,$11,$11,$11,$11///movq qword ptr [$11111111],mm0
@@Dest:
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,offset Dest
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end else
begin
if chRed in EnableChannels then
begin
asm
jmp @@EndCode
@@StartCode:
mov al,byte ptr [offset offset _null]{}@@Col1:
mul byte ptr [offset offset _null] {}@@Col2:
mov byte ptr [offset offset _null],ah{}@@Dest:
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.R+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.R+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.R+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
if chGreen in EnableChannels then
begin
asm
jmp @@EndCode
@@StartCode:
mov al,byte ptr [offset offset _null]{}@@Col1:
mul byte ptr [offset offset _null] {}@@Col2:
mov byte ptr [offset offset _null],ah{}@@Dest:
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.G+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.G+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.G+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
if chBlue in EnableChannels then
begin
asm
jmp @@EndCode
@@StartCode:
mov al,byte ptr [offset offset _null]{}@@Col1:
mul byte ptr [offset offset _null] {}@@Col2:
mov byte ptr [offset offset _null],ah{}@@Dest:
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.B+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.B+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.B+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
 
if chAlpha in EnableChannels then
begin
asm
jmp @@EndCode
@@StartCode:
mov al,byte ptr [offset offset _null]{}@@Col1:
mul byte ptr [offset offset _null] {}@@Col2:
mov byte ptr [offset offset _null],ah{}@@Dest:
@@EndCode:
{$I DXRender.inc}
{ @@Col1 }
mov eax,Col1; add eax,Byte(TDXRMachine_Color.A+1)
mov edx,offset @@Col1-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
end;
end;
end;
end;
 
procedure genBlend_ADD(var Code: Pointer; Dest, Col1, Col2: PDXRMachine_Color;
ConstChannels1, ConstChannels12: TDXRColorChannels);
begin
7549,13 → 6601,13
@@EndCode:
{$I DXRender.inc}
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7616,13 → 6668,13
@@EndCode:
{$I DXRender.inc}
{ @@Col2 }
mov eax,Col2; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Col2; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Col2-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
 
{ @@Dest }
mov eax,Dest; add eax,Byte(TDXRMachine_Color.A+1)
mov eax,Dest; add eax,BYTE(TDXRMachine_Color.A+1)
mov edx,offset @@Dest-4
sub edx,offset @@StartCode
mov dword ptr [ecx+edx],eax
7633,7 → 6685,7
 
begin
if EnableChannels=[] then Exit;
 
case Blend of
DXR_BLEND_ZERO : genBlend_ZERO(Code, Dest);
DXR_BLEND_ONE1 : genBlend_ONE1(Code, Dest, Col1, ConstChannels1);
7640,7 → 6692,7
DXR_BLEND_ONE2 : genBlend_ONE1(Code, Dest, Col2, ConstChannels2);
DXR_BLEND_ONE1_ADD_ONE2 : genBlend_ONE1_ADD_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_ONE1_SUB_ONE2 : genBlend_ONE1_SUB_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_ONE2_SUB_ONE1 : genBlend_ONE2_SUB_ONE1(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_ONE2_SUB_ONE1 : genBlend_ONE1_SUB_ONE2(Code, Dest, Col2, Col1, ConstChannels2, ConstChannels1);
DXR_BLEND_ONE1_MUL_ONE2 : genBlend_ONE1_MUL_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_SRCALPHA1 : genBlend_SRCALPHA1(Code, Dest, Col1, ConstChannels1);
DXR_BLEND_SRCALPHA1_ADD_ONE2 : genBlend_SRCALPHA1_ADD_ONE2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
7647,12 → 6699,10
DXR_BLEND_ONE2_SUB_SRCALPHA1 : genBlend_ONE2_SUB_SRCALPHA1(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_SRCALPHA1_ADD_INVSRCALPHA2: genBlend_SRCALPHA1_ADD_INVSRCALPHA2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_INVSRCALPHA1_ADD_SRCALPHA2: genBlend_INVSRCALPHA1_ADD_SRCALPHA2(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_DECAL : genBlend_ONE1(Code, Dest, Col1, ConstChannels1);
DXR_BLEND_DECALALPHA : genBlend_DECALALPHA(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_MODULATE : genBlend_MODULATE(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_MODULATEALPHA : genBlend_MODULATEALPHA(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_MODULATE : genBlend_MODULATE_RGBONLY(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
DXR_BLEND_ADD : genBlend_ADD(Code, Dest, Col1, Col2, ConstChannels1, ConstChannels2);
end;
end;
end;
 
var
7688,10 → 6738,6
begin
genReadTexture(Code, Result, TextureList[Tree.Texture], Tree.Channels);
end;
DXR_TREETYPE_LOADBUMPTEXTURE:
begin
genReadBumpTexture(Code, Result, TextureList[Tree.Texture], TextureList[Tree.BumpTexture], Tree.Channels);
end;
DXR_TREETYPE_LOADDESTPIXEL:
begin
genReadDestPixel(Code);
7757,7 → 6803,7
 
if chBlue in ConstChannels1 then
Col1.B := TextureList[Tree.BlendTree1.Texture].DefaultColor.B;
 
if chAlpha in ConstChannels1 then
Col1.A := TextureList[Tree.BlendTree1.Texture].DefaultColor.A;
end else
7837,7 → 6883,7
Col: PDXRMachine_Color;
begin
if (Tree.Typ=DXR_TREETYPE_LOADCOLOR) and (not ColorList[Tree.Color].Gouraud) and
(not ZBuffer.Enable) and (not Dither.Enable) and (Dest.BitCount in [16, 32]) then
(not Dither.Enable) and (Dest.BitCount in [16, 32]) then
begin
FCall := Code;
genInitDestAddress(Code);
7926,9 → 6972,7
genUpdateAxis(Code);
genUpdateColor(Code);
genUpdateTextureAxis(Code);
genUpdateRHW(Code);
genUpdateDestAddress(Code);
genUpdateZBufferAddress(Code);
 
asm
jmp @@EndCode
7942,8 → 6986,6
{ ----------- Main ----------- }
MainCode := Code;
 
genZBufferTest(Code);
 
if Tree.Typ=DXR_TREETYPE_LOADCOLOR then
begin
genEncodeColor2(Code, Dest^, @ColorList[Tree.Color].nColor, Tree.Channels);
7950,7 → 6992,7
genWriteDestPixel(Code);
end else
if (Tree.Typ=DXR_TREETYPE_LOADTEXTURE) and (not Dither.Enable) and
(TextureList[Tree.Texture].Filter in [DXR_TEXTUREFILTER_NEAREST, DXR_TEXTUREFILTER_MIPMAP_NEAREST]) and
(TextureList[Tree.Texture].Filter in [DXR_TEXTUREFILTER_NEAREST]) and
(dxrCompareSurface(Dest^, TextureList[Tree.Texture].Surface^)) then
begin
genReadSurfacePixel(Code, TextureList[Tree.Texture], @TextureList[Tree.Texture].nAxis);
7969,7 → 7011,6
FCall := Code;
 
genInitDestAddress(Code);
genInitZBuffer(Code);
 
genCmpFunc(Code, DXR_CMPFUNC_ALWAYS, MainCode);
end;
8034,11 → 7075,8
TexBlend := DXR_BLEND_MODULATE;
Blend := DXR_BLEND_ONE1;
TextureFilter := DXR_TEXTUREFILTER_NEAREST;
ZBuffer := nil;
ZFunc := DXR_CMPFUNC_LESSEQUAL;
ZWriteEnable := True;
EnableDrawLine := 0;
end;
EnableDrawLine := $FFFFFFFF;
end;
 
for i:=0 to DXR_MAXTEXTURE-1 do
with States.TextureList[i] do
8049,7 → 7087,6
ColorKeyEnable := False;
ColorKey := 0;
TextureAddress := DXR_TEXTUREADDRESS_TILE;
BumpTexture := -1;
end;
end;
 
8071,10 → 7108,7
 
function InitGenerator_MakeTree_LoadTexture(Texture: Integer): PDXRMachine_Tree;
begin
if States.TextureList[Texture].BumpTexture>=0 then
Result := DXRMachine.CreateTree_LoadBumpTexture(Texture, States.TextureList[Texture].BumpTexture)
else
Result := DXRMachine.CreateTree_LoadTexture(Texture);
Result := DXRMachine.CreateTree_LoadTexture(Texture);
end;
 
function InitGenerator_MakeTree: PDXRMachine_Tree;
8134,17 → 7168,11
var
i: Integer;
Layer: PDXR_TextureLayer;
Mipmap1, Mipmap2, Mipmap3: Integer;
TmpSurface2: PDXR_Surface;
begin
DXRMachine.Initialize;
 
{ Parameter setting }
DXRMachine.Dest := @Dest;
DXRMachine.ZBuffer.Enable := States.ZBuffer<>nil;
DXRMachine.ZBuffer.Surface := States.ZBuffer;
DXRMachine.ZBuffer.CmpFunc := States.ZFunc;
DXRMachine.ZBuffer.WriteEnable := States.ZWriteEnable;
DXRMachine.Dither.Enable := States.DitherEnable;
 
DXRMachine.ColorList[0].Gouraud := States.Shade=DXR_SHADEMODE_GOURAUD;
8164,31 → 7192,6
Surface := Layer.Surface;
Filter := States.TextureFilter;
TextureAddress := Layer.TextureAddress;
 
if (Filter in [DXR_TEXTUREFILTER_MIPMAP_NEAREST, DXR_TEXTUREFILTER_MIPMAP_LINEAR]) and
(Surface.MipmapChain<>nil) then
begin
{ Mipmap }
Mipmap1 := MaxInt;
Mipmap3 := Trunc(Abs(Hypot(Tri[2].sx-Tri[1].sx, Tri[2].sy-Tri[1].sy))*
Abs(Hypot(Tri[1].sx-Tri[0].sx, Tri[1].sy-Tri[0].sy))*
Abs(Hypot(Tri[2].sx-Tri[0].sx, Tri[2].sy-Tri[0].sy))/9);
 
TmpSurface2 := Surface;
 
while TmpSurface2<>nil do
begin
Mipmap2 := TmpSurface2.Width2*TmpSurface2.Height2;
 
if (Abs(Mipmap3-Mipmap2)<Abs(Mipmap3-Mipmap1)) then
begin
Surface := TmpSurface2;
Mipmap1 := Mipmap2;
end;
 
TmpSurface2 := TmpSurface2.MipmapChain;
end;
end;
end;
end;
end;
8232,15 → 7235,9
Result := Comp2DWORD(d*TexYFloat[i]);
end;
 
function FloatToRHWFloat(d: Extended): Comp;
begin
Result := d*Int32Value;
end;
 
procedure drawline(x1, x2, y: Integer;
const x_ntex1, x_ntex2: T2DAxis64Array;
const x_nc1, x_nc2: TCol64Array;
const x_nRHW1, x_nRHW2: Comp);
const x_nc1, x_nc2: TCol64Array);
var
i, xcount, xcount2, ofs: Integer;
begin
8314,17 → 7311,6
end;
end;
 
with DXRMachine.RHW do
begin
if Enable then
begin
nRHW := x_nRHW1;
iRHW := (x_nRHW2-x_nRHW1) / xcount;
if ofs<>0 then
nRHW := nRHW + iRHW*ofs;
end;
end;
 
DXRMachine.Run(xcount2);
end;
 
8335,7 → 7321,6
y_nx1, y_nx2, y_ix1, y_ix2: Comp;
y_ntex1, y_ntex2, y_itex1, y_itex2: T2DAxis64Array;
y_nc1, y_nc2, y_ic1, y_ic2: TCol64Array;
y_nRHW1, y_nRHW2, y_iRHW1, y_iRHW2: Comp;
begin
if ycount<=0 then Exit;
if y1=0 then Exit;
8451,40 → 7436,15
end;
end;
 
if DXRMachine.RHW.Enable then
begin
y_nRHW1 := FloatToRHWFloat(p1.rhw);
y_nRHW2 := FloatToRHWFloat(p2.rhw);
y_iRHW1 := FloatToRHWFloat((pt1.rhw-p1.rhw)/y1);
y_iRHW2 := FloatToRHWFloat((pt2.rhw-p2.rhw)/y2);
 
if ofs1<>0 then
begin
y_nRHW1 := y_nRHW1 + y_iRHW1*ofs1;
end;
 
if ofs2<>0 then
begin
y_nRHW2 := y_nRHW2 + y_iRHW2*ofs2;
end;
end else
begin
y_nRHW1 := 0;
y_nRHW2 := 0;
y_iRHW1 := 0;
y_iRHW2 := 0;
end;
 
for y:=starty to starty+ycount-1 do
begin
if (States.EnableDrawLine=0) or ((States.EnableDrawLine-1)=y mod 2) then
if States.EnableDrawLine and (1 shl (y and 31))<>0 then
if PInteger(Integer(@y_nx1)+4)^<PInteger(Integer(@y_nx2)+4)^ then
begin
drawline(
PInteger(Integer(@y_nx1)+4)^, PInteger(Integer(@y_nx2)+4)^, y,
y_ntex1, y_ntex2,
y_nc1, y_nc2,
y_nRHW1, y_nRHW2
y_nc1, y_nc2
);
end else if PInteger(Integer(@y_nx1)+4)^>PInteger(Integer(@y_nx2)+4)^ then
begin
8491,8 → 7451,7
drawline(
PInteger(Integer(@y_nx2)+4)^, PInteger(Integer(@y_nx1)+4)^, y,
y_ntex2, y_ntex1,
y_nc2, y_nc1,
y_nRHW2, y_nRHW1
y_nc2, y_nc1
);
end;
 
8523,12 → 7482,6
y_nc2[i].A := y_nc2[i].A + y_ic2[i].A;
end;
end;
 
if DXRMachine.RHW.Enable then
begin
y_nRHW1 := y_nRHW1 + y_iRHW1;
y_nRHW2 := y_nRHW2 + y_iRHW2;
end;
end;
end;
 
8568,9 → 7521,6
if (p[0].sx>=Dest.Width) and (p[1].sx>=Dest.Width) and (p[2].sx>=Dest.Width) then Exit;
 
{ Generate code }
if States.TextureFilter in [DXR_TEXTUREFILTER_MIPMAP_NEAREST, DXR_TEXTUREFILTER_MIPMAP_LINEAR] then
DXRMachine.Compiled := False;
 
if not DXRMachine.Compiled then
InitGenerator;
 
8722,30 → 7672,25
end;
end;
 
//function MulDiv64(a, b, c: Integer): Integer; assembler;
//asm
// mov eax, a
// imul b
// idiv c
//end;
 
function MulDiv64(a, b, c: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
begin
Result := a * b div c;
function MulDiv64(a, b, c: Integer): Integer; assembler;
asm
mov eax, a
imul b
idiv c
end;
 
function Max(B1, B2: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function Max(B1, B2: Integer): Integer;
begin
if B1>=B2 then Result := B1 else Result := B2;
end;
 
function Min(B1, B2: Integer): Integer; {$IFDEF VER9UP}inline;{$ENDIF}
function Min(B1, B2: Integer): Integer;
begin
if B1<=B2 then Result := B1 else Result := B2;
end;
 
function BltClipX(const Dest, Src: TDXR_Surface;
var StartX, EndX, StartSrcX: Integer): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
var StartX, EndX, StartSrcX: Integer): Boolean;
begin
if StartX<0 then
begin
8759,7 → 7704,7
end;
 
function BltClipY(const Dest, Src: TDXR_Surface;
var StartY, EndY, StartSrcY: Integer): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
var StartY, EndY, StartSrcY: Integer): Boolean;
begin
if StartY<0 then
begin
8773,7 → 7718,7
end;
 
function BltClip(const Dest, Src: TDXR_Surface;
var StartX, StartY, EndX, EndY, StartSrcX, StartSrcY: Integer): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
var StartX, StartY, EndX, EndY, StartSrcX, StartSrcY: Integer): Boolean;
begin
Result := BltClipX(Dest, Src, StartX, EndX, StartSrcX) and
BltClipY(Dest, Src, StartY, EndY, StartSrcY);
8780,7 → 7725,7
end;
 
function FillClip(const Dest: TDXR_Surface;
var StartX, StartY, EndX, EndY: Integer): Boolean; {$IFDEF VER9UP}inline;{$ENDIF}
var StartX, StartY, EndX, EndY: Integer): Boolean;
begin
StartX := Max(StartX, 0);
StartY := Max(StartY, 0);
8793,7 → 7738,7
var
CosinTable: array[0..255] of Double;
 
procedure InitCosinTable; {$IFDEF VER9UP}inline;{$ENDIF}
procedure InitCosinTable;
var
i: Integer;
begin
8801,12 → 7746,12
CosinTable[i] := Cos((i/256)*2*PI);
end;
 
function Cos256(i: Integer): Double; {$IFDEF VER9UP}inline;{$ENDIF}
function Cos256(i: Integer): Double;
begin
Result := CosinTable[i and 255];
end;
 
function Sin256(i: Integer): Double; {$IFDEF VER9UP}inline;{$ENDIF}
function Sin256(i: Integer): Double;
begin
Result := CosinTable[(i+192) and 255];
end;
8913,7 → 7858,7
 
IncX := MulDiv64(SrcRect.Right-SrcRect.Left, TextureAxisFloat, DestRect.Right-DestRect.Left);
IncY := MulDiv64(SrcRect.Bottom-SrcRect.Top, TextureAxisFloat, DestRect.Bottom-DestRect.Top);
 
sx := StartSrcX * IncX + SrcRect.Left*TextureAxisFloat;
sy := StartSrcY * IncY + SrcRect.Top*TextureAxisFloat;
 
9127,23 → 8072,10
end;
end;
 
//var TextureSurface, DestSurface: TDXR_Surface; RenderStates: TDXR_RenderStates;
//
//dxrDefRenderStates(RenderStates);
//if dxrDDSurfaceLock(Surf.ISurface, DestSurface then begin
// dxrDDSurfaceLock(TextureSurface as IDirectDrawSurface, TextureSurface);
// RenderStates.TextureList<0>.Surface:=@TextureSurface;
// dxrDrawPrimitive(DestSurface, RenderStates, DXR_PRIMITIVETYPE_TRIANGLELIST, @VertexList, 36);
// dxrDDSurfaceUnlock(SurfaceTexture as IDirectDrawSurface, TextureSurface);
// dxrDDSurfaceUnlock(Surf.ISurface, DestSurface);
//end;
 
initialization
ReadCPUID;
Init;
InitCosinTable;
 
dxrSetOption(DXR_OPTION_MMXENABLE, 1);
finalization
FDXRMachine.Free;
end.
end.
/VCL_DELPHIX_D6/DShow.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXGUIDEdit.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DelphiX.dcr
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DShow.pas
22,9 → 22,7
 
{$Z4}
{$A+}
{$IfNDef D7UP}
{$WEAKPACKAGEUNIT}
{$EndIf}
 
uses Windows, ActiveX, DirectX, MMSystem;
 
1889,10 → 1887,10
 
IDirectDrawMediaStream = interface(IMediaStream)
['{F4104FCE-9A70-11d0-8FDE-00C04FD9189D}']
function GetFormat(var pDDSDCurrent: TDDSURFACEDESC;
function GetFormat(var pDDSDCurrent: DDSURFACEDESC;
out ppDirectDrawPalette: IDirectDrawPalette;
var pDDSDDesired: TDDSURFACEDESC; var pdwFlags: DWORD): HResult; stdcall;
function SetFormat(const pDDSurfaceDesc: TDDSURFACEDESC;
var pDDSDDesired: DDSURFACEDESC; var pdwFlags: DWORD): HResult; stdcall;
function SetFormat(const pDDSurfaceDesc: DDSURFACEDESC;
pDirectDrawPalette: IDirectDrawPalette): HResult; stdcall;
function GetDirectDraw(out ppDirectDraw: IDirectDraw): HResult; stdcall;
function SetDirectDraw(pDirectDraw: IDirectDraw): HResult; stdcall;
2622,9 → 2620,9
// IDirectDrawVideo methods
function GetSwitches(var pSwitches: DWORD): HResult; stdcall;
function SetSwitches(pSwitches: DWORD): HResult; stdcall;
function GetCaps(var pCaps: TDDCAPS): HResult; stdcall;
function GetEmulatedCaps(var pCaps: TDDCAPS): HResult; stdcall;
function GetSurfaceDesc(var pSurfaceDesc: TDDSURFACEDESC): HResult; stdcall;
function GetCaps(var pCaps: DDCAPS): HResult; stdcall;
function GetEmulatedCaps(var pCaps: DDCAPS): HResult; stdcall;
function GetSurfaceDesc(var pSurfaceDesc: DDSURFACEDESC): HResult; stdcall;
function GetFourCCCodes(var pCount, pCodes: DWORD): HResult; stdcall;
function SetDirectDraw(pDirectDraw: IDirectDraw): HResult; stdcall;
function GetDirectDraw(out ppDirectDraw: IDirectDraw): HResult; stdcall;
3003,23 → 3001,23
// of structures. If the pointer to the array is NULL, first parameter
// returns the total number of formats supported.
function GetVideoFormats(var lpNumFormats: DWORD;
const lpddpfFormats: TDDPIXELFORMAT): HResult; stdcall;
const lpddpfFormats: DDPIXELFORMAT): HResult; stdcall;
 
// retrives maximum pixels per second rate expected for a given
// format and a given scaling factor. If decoder does not support
// those scaling factors, then it gives the rate and the nearest
// scaling factors.
function GetMaxPixelRate(const ddpfFormat: TDDPIXELFORMAT;
function GetMaxPixelRate(const ddpfFormat: DDPIXELFORMAT;
lpdwZoomHeight, lpdwZoomWidth: DWORD;
var lpdwMaxPixelsPerSecond: DWORD): HResult; stdcall;
 
// retrives various properties of the decoder for a given format
function GetVideoSignalInfo(const ddpfFormat: TDDPIXELFORMAT;
function GetVideoSignalInfo(const ddpfFormat: DDPIXELFORMAT;
var lpAMVideoSignalInfo: TAMVideoSignalInfo): HResult; stdcall;
 
// asks the decoder to ouput in this format. Return value should give
// appropriate error code
function SetVideoFormat(const ddpfFormat: TDDPIXELFORMAT): HResult; stdcall;
function SetVideoFormat(const ddpfFormat: DDPIXELFORMAT): HResult; stdcall;
 
// asks the decoder to treat even fields like odd fields and visa versa
function SetInvertPolarity: HResult; stdcall;
3187,13 → 3185,13
 
// informs the callee of the videoformats supported by the videoport
function InformVPInputFormats(dwNumFormats: DWORD;
const pDDPixelFormats: TDDPIXELFORMAT): HResult; stdcall;
const pDDPixelFormats: DDPIXELFORMAT): HResult; stdcall;
 
// gets the various formats supported by the decoder in an array
// of structures. If the pointer to the array is NULL, first parameter
// returns the total number of formats supported.
function GetVideoFormats(var pdwNumFormats: DWORD;
var pddPixelFormats: TDDPIXELFORMAT): HResult; stdcall;
var pddPixelFormats: DDPIXELFORMAT): HResult; stdcall;
 
// sets the format entry chosen (0, 1, .. ,(dwNumProposedEntries-1))
function SetVideoFormat(dwChosenEntry: DWORD): HResult; stdcall;
3271,10 → 3269,10
// this function gets the overlay surface that the mixer is using
function GetOverlaySurface(out ppOverlaySurface: IDirectDrawSurface): HResult; stdcall;
// this functions sets the color-controls, if the chip supports it.
function SetColorControls(const pColorControl: TDDCOLORCONTROL): HResult; stdcall;
function SetColorControls(const pColorControl: DDCOLORCONTROL): HResult; stdcall;
// this functions also returns the capability of the hardware in the dwFlags
// value of the struct.
function GetColorControls(var pColorControl: TDDCOLORCONTROL): HResult; stdcall;
function GetColorControls(var pColorControl: DDCOLORCONTROL): HResult; stdcall;
end;
 
// interface IVPVBINotify
/VCL_DELPHIX_D6/DXPictEdit.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DIB.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXFFBEdit.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXWaveEdit.dfm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/VCL_DELPHIX_D6/DXClass.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DXSprite.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/DirectX.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6/Wave.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_DELPHIX_D6
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/Levels/Level 3.lev
1,18 → 1,55
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 3
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 1 624 64 1
Enemy 1 624 192 1
Enemy 1 624 256 1
Enemy 1 624 384 1
Enemy 5 1104 128 1
Enemy 5 1104 160 1
Enemy 5 1104 288 1
Enemy 5 1104 320 1
Enemy 1 1584 160 1
Enemy 1 1584 256 1
Enemy 6 2160 160 2
Enemy 6 2160 224 2
Enemy 6 2160 288 2
; SpaceMission 1.0
; LEV-File
1200
1
624
64
1
1
624
192
1
1
624
256
1
1
624
384
1
5
1104
160
1
5
1104
320
1
5
1104
128
1
5
1104
288
1
1
1584
160
1
1
1584
256
1
6
2160
160
2
6
2160
288
2
6
2160
224
2
/Levels/Level 4.lev
1,20 → 1,63
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 4
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 1 480 224 1
Enemy 1 528 160 1
Enemy 5 528 192 1
Enemy 5 528 256 1
Enemy 1 528 288 1
Enemy 6 1248 96 2
Enemy 6 1248 352 2
Enemy 1 1872 96 2
Enemy 1 1872 224 2
Enemy 1 1872 352 2
Enemy 5 2400 64 2
Enemy 5 2400 384 2
Enemy 1 2976 192 4
Enemy 1 2976 224 4
Enemy 1 2976 256 4
; SpaceMission 1.0
; LEV-File
1200
1
480
224
1
1
528
160
1
1
528
288
1
5
528
192
1
5
528
256
1
6
1248
96
2
6
1248
352
2
1
1872
96
2
1
1872
352
2
1
1872
224
2
5
2400
64
2
5
2400
384
2
1
2976
224
4
1
2976
192
4
1
2976
256
4
/Levels/Level 5.lev
1,25 → 1,83
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 5
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 5 336 96 1
Enemy 5 336 384 1
Enemy 5 912 352 1
Enemy 5 1152 384 1
Enemy 5 1200 64 1
Enemy 6 1392 320 2
Enemy 6 1632 384 2
Enemy 6 1680 32 2
Enemy 1 1968 64 1
Enemy 3 2352 64 1
Enemy 2 2736 128 1
Enemy 6 2832 128 2
Enemy 6 2976 448 2
Enemy 6 3072 352 2
Enemy 6 3408 32 2
Enemy 1 3504 384 1
Enemy 1 3648 448 1
Enemy 6 3696 32 2
Enemy 3 3936 64 2
Enemy 7 4608 256 5
; SpaceMission 1.0
; LEV-File
1200
5
336
96
1
5
336
384
1
5
912
352
1
5
1152
384
1
5
1200
64
1
6
1392
320
2
6
1632
384
2
6
1680
32
2
1
1968
64
1
3
2352
64
1
2
2736
128
1
6
2832
128
2
6
2976
448
2
6
3072
352
2
6
3408
32
2
1
3504
384
1
1
3648
448
1
6
3696
32
2
3
3936
64
2
7
4608
256
5
/Levels/Level 6.lev
1,44 → 1,159
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 6
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 1 576 64 1
Enemy 1 576 160 1
Enemy 1 576 224 1
Enemy 1 576 288 1
Enemy 1 576 384 1
Enemy 1 624 64 1
Enemy 1 624 160 1
Enemy 1 624 224 1
Enemy 1 624 288 1
Enemy 1 624 384 1
Enemy 5 912 160 1
Enemy 5 912 224 1
Enemy 5 912 288 1
Enemy 5 960 160 1
Enemy 5 960 224 1
Enemy 5 960 288 1
Enemy 5 1008 160 1
Enemy 5 1008 224 1
Enemy 5 1008 288 1
Enemy 2 1104 160 1
Enemy 2 1104 224 1
Enemy 2 1104 288 1
Enemy 2 1152 160 1
Enemy 2 1152 224 1
Enemy 2 1152 288 1
Enemy 2 1200 160 1
Enemy 2 1200 224 1
Enemy 2 1200 288 1
Enemy 6 1296 160 1
Enemy 6 1296 224 1
Enemy 6 1296 288 1
Enemy 6 1344 160 1
Enemy 6 1344 224 1
Enemy 6 1344 288 1
Enemy 6 1392 160 1
Enemy 6 1392 224 1
Enemy 6 1392 288 1
Enemy 3 2064 192 5
Enemy 3 2064 256 5
; SpaceMission 1.0
; LEV-File
1200
1
576
64
1
1
576
384
1
1
576
288
1
1
576
160
1
1
576
224
1
1
624
64
1
1
624
160
1
1
624
224
1
1
624
288
1
1
624
384
1
5
912
160
1
5
912
288
1
5
912
224
1
5
960
160
1
5
960
288
1
5
960
224
1
5
1008
224
1
5
1008
160
1
5
1008
288
1
2
1104
160
1
2
1104
224
1
2
1104
288
1
2
1152
288
1
2
1152
224
1
2
1152
160
1
2
1200
288
1
2
1200
224
1
2
1200
160
1
6
1296
160
1
6
1296
224
1
6
1296
288
1
6
1344
288
1
6
1344
224
1
6
1344
160
1
6
1392
288
1
6
1392
224
1
6
1392
160
1
3
2064
192
5
3
2064
256
5
/Levels/Level 7.lev
1,63 → 1,235
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 7
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 1 48 256 1
Enemy 1 144 416 1
Enemy 1 192 96 1
Enemy 1 240 160 1
Enemy 1 288 256 1
Enemy 1 336 288 1
Enemy 1 480 224 1
Enemy 1 480 320 1
Enemy 5 1056 160 1
Enemy 2 1056 416 1
Enemy 1 1104 64 1
Enemy 2 1152 96 1
Enemy 5 1248 160 1
Enemy 5 1248 416 1
Enemy 3 1488 224 1
Enemy 5 1536 384 1
Enemy 2 1680 160 1
Enemy 2 1968 320 1
Enemy 2 1968 448 1
Enemy 1 2016 96 2
Enemy 1 2112 384 5
Enemy 1 2160 128 5
Enemy 6 2208 352 1
Enemy 6 2256 320 1
Enemy 6 2256 384 1
Enemy 6 2304 64 1
Enemy 1 2304 256 5
Enemy 6 2352 192 1
Enemy 1 2400 128 1
Enemy 2 2400 416 1
Enemy 2 2448 256 1
Enemy 6 2496 128 1
Enemy 1 2496 192 1
Enemy 2 2544 64 1
Enemy 1 2544 352 5
Enemy 1 2592 256 5
Enemy 6 2688 64 1
Enemy 6 2688 288 1
Enemy 1 2880 96 1
Enemy 1 2928 416 1
Enemy 2 3120 416 1
Enemy 5 3168 256 1
Enemy 1 3216 320 1
Enemy 6 3312 384 1
Enemy 5 3408 64 1
Enemy 2 3456 256 1
Enemy 1 3552 256 1
Enemy 6 3600 192 1
Enemy 5 3600 416 1
Enemy 5 3696 128 1
Enemy 5 3792 256 1
Enemy 2 3936 32 1
Enemy 5 3984 320 1
Enemy 5 4080 64 1
Enemy 2 4080 288 1
Enemy 2 4128 416 1
Enemy 1 4176 224 2
Enemy 7 4560 224 7
; SpaceMission 1.0
; LEV-File
1200
1
48
256
1
1
144
416
1
1
192
96
1
1
240
160
1
1
288
256
1
1
336
288
1
1
480
224
1
1
480
320
1
5
1056
160
1
2
1056
416
1
1
1104
64
1
2
1152
96
1
5
1248
416
1
5
1248
160
1
3
1488
224
1
5
1536
384
1
2
1680
160
1
2
1968
320
1
2
1968
448
1
1
2016
96
2
1
2112
384
5
1
2160
128
5
6
2208
352
1
6
2256
320
1
6
2256
384
1
6
2304
64
1
1
2304
256
5
6
2352
192
1
2
2400
416
1
1
2400
128
1
2
2448
256
1
6
2496
128
1
1
2496
192
1
2
2544
64
1
1
2544
352
5
1
2592
256
5
6
2688
288
1
6
2688
64
1
1
2880
96
1
1
2928
416
1
2
3120
416
1
5
3168
256
1
1
3216
320
1
6
3312
384
1
5
3408
64
1
2
3456
256
1
1
3552
256
1
6
3600
192
1
5
3600
416
1
5
3696
128
1
5
3792
256
1
2
3936
32
1
5
3984
320
1
5
4080
64
1
2
4080
288
1
2
4128
416
1
1
4176
224
2
7
4560
224
7
/Levels/Level 8.lev
1,28 → 1,95
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 8
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 240 288 0
Enemy 4 336 64 0
Enemy 1 432 160 2
Enemy 2 432 192 2
Enemy 3 432 224 2
Enemy 2 432 256 2
Enemy 1 432 288 2
Enemy 4 576 352 0
Enemy 4 672 224 0
Enemy 4 768 320 0
Enemy 3 960 224 2
Enemy 2 1008 192 2
Enemy 2 1008 256 2
Enemy 1 1056 160 2
Enemy 6 1056 224 2
Enemy 1 1056 288 2
Enemy 2 1104 192 2
Enemy 2 1104 256 2
Enemy 3 1152 224 2
Enemy 5 1776 224 5
Enemy 5 1776 256 5
Enemy 6 1824 224 5
Enemy 6 1824 256 5
; SpaceMission 1.0
; LEV-File
1200
4
240
288
 
4
336
64
 
3
432
224
2
2
432
192
2
2
432
256
2
1
432
160
2
1
432
288
2
4
576
352
 
4
672
224
 
4
768
320
 
3
960
224
2
2
1008
192
2
2
1008
256
2
1
1056
160
2
1
1056
288
2
6
1056
224
2
2
1104
192
2
2
1104
256
2
3
1152
224
2
5
1776
224
5
5
1776
256
5
6
1824
224
5
6
1824
256
5
/Levels/Level 9.lev
1,43 → 1,155
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 9
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 240 128 0
Enemy 4 288 352 0
Enemy 1 384 64 2
Enemy 1 384 224 2
Enemy 1 384 384 2
Enemy 2 432 64 2
Enemy 2 432 224 2
Enemy 2 432 384 2
Enemy 3 480 64 2
Enemy 3 480 224 2
Enemy 3 480 384 2
Enemy 4 624 128 0
Enemy 4 768 64 0
Enemy 4 864 224 0
Enemy 4 864 416 0
Enemy 4 912 32 0
Enemy 5 1104 96 2
Enemy 5 1104 224 2
Enemy 5 1104 352 2
Enemy 4 1296 192 0
Enemy 4 1440 64 0
Enemy 6 1536 320 2
Enemy 6 1680 96 2
Enemy 4 1728 160 0
Enemy 4 1824 320 0
Enemy 6 2016 64 2
Enemy 6 2112 384 2
Enemy 6 2208 128 2
Enemy 6 2352 288 2
Enemy 4 2400 64 0
Enemy 4 2544 416 0
Enemy 4 2592 128 0
Enemy 4 2880 64 0
Enemy 4 2880 320 0
Enemy 4 2976 160 0
Enemy 3 3456 160 7
Enemy 3 3456 192 7
Enemy 3 3456 224 7
; SpaceMission 1.0
; LEV-File
1200
4
240
128
 
4
288
352
 
1
384
64
2
1
384
384
2
1
384
224
2
2
432
64
2
2
432
224
2
2
432
384
2
3
480
64
2
3
480
224
2
3
480
384
2
4
624
128
 
4
768
64
 
4
864
224
 
4
864
416
 
4
912
32
 
5
1104
96
2
5
1104
352
2
5
1104
224
2
4
1296
192
 
4
1440
64
 
6
1536
320
2
6
1680
96
2
4
1728
160
 
4
1824
320
 
6
2016
64
2
6
2112
384
2
6
2208
128
2
6
2352
288
2
4
2400
64
 
4
2544
416
 
4
2592
128
 
4
2880
64
 
4
2880
320
 
4
2976
160
 
3
3456
160
7
3
3456
192
7
3
3456
224
7
/Levels/Level 10.lev
1,41 → 1,147
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 10
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 192 32 0
Enemy 4 336 288 0
Enemy 4 384 96 0
Enemy 5 480 32 3
Enemy 6 480 128 3
Enemy 5 480 224 3
Enemy 6 480 320 3
Enemy 5 480 416 3
Enemy 4 624 64 0
Enemy 4 720 352 0
Enemy 1 864 64 3
Enemy 1 864 192 3
Enemy 1 864 224 3
Enemy 1 864 352 3
Enemy 4 1008 32 0
Enemy 4 1056 256 0
Enemy 4 1200 64 0
Enemy 4 1248 288 0
Enemy 6 1392 64 3
Enemy 6 1392 192 1
Enemy 6 1392 224 1
Enemy 6 1392 352 3
Enemy 4 1536 64 0
Enemy 4 1536 384 0
Enemy 4 1584 256 0
Enemy 4 1680 128 0
Enemy 5 1728 64 1
Enemy 5 1728 352 1
Enemy 4 2016 32 0
Enemy 4 2016 320 0
Enemy 4 2112 128 0
Enemy 4 2304 32 0
Enemy 4 2352 288 0
Enemy 1 2688 192 8
Enemy 3 2688 224 8
Enemy 1 2688 256 8
; SpaceMission 1.0
; LEV-File
1200
4
192
32
 
4
336
288
 
4
384
96
 
5
480
416
3
5
480
224
3
5
480
32
3
6
480
128
3
6
480
320
3
4
624
64
 
4
720
352
 
1
864
64
3
1
864
352
3
1
864
224
3
1
864
192
3
4
1008
32
 
4
1056
256
 
4
1200
64
 
4
1248
288
 
6
1392
64
3
6
1392
352
3
6
1392
192
1
6
1392
224
1
4
1536
64
 
4
1536
384
 
4
1584
256
 
4
1680
128
 
5
1728
64
1
5
1728
352
1
4
2016
32
 
4
2016
320
 
4
2112
128
 
4
2304
32
 
4
2352
288
 
3
2688
224
8
1
2688
192
8
1
2688
256
8
/Levels/Level 20.lev
1,53 → 1,195
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 20
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 1 96 352 1
Enemy 1 240 224 1
Enemy 1 528 32 1
Enemy 1 576 416 1
Enemy 1 624 448 8
Enemy 1 960 0 8
Enemy 1 1008 448 8
Enemy 1 1104 256 8
Enemy 1 1296 448 8
Enemy 1 1344 0 8
Enemy 5 1632 416 8
Enemy 5 1776 32 8
Enemy 5 1872 224 8
Enemy 5 2064 64 8
Enemy 5 2064 448 8
Enemy 5 2112 288 8
Enemy 2 2160 96 1
Enemy 2 2448 288 1
Enemy 2 2544 96 1
Enemy 2 2640 448 1
Enemy 6 2880 0 8
Enemy 6 2880 448 8
Enemy 4 3024 32 0
Enemy 6 3024 96 8
Enemy 6 3024 384 8
Enemy 4 3120 416 0
Enemy 4 3408 64 0
Enemy 6 3456 256 8
Enemy 3 3696 160 5
Enemy 1 4080 352 5
Enemy 1 4224 64 5
Enemy 1 4320 288 5
Enemy 1 4464 160 5
Enemy 1 4608 448 5
Enemy 1 4704 288 1
Enemy 1 4848 96 1
Enemy 3 4992 64 1
Enemy 3 4992 384 6
Enemy 3 5088 256 1
Enemy 6 5472 416 6
Enemy 4 5616 224 0
Enemy 6 5616 448 6
Enemy 4 5712 32 0
Enemy 6 5712 416 6
Enemy 4 5808 416 0
Enemy 6 5952 96 6
Enemy 6 6000 128 6
Enemy 7 6000 224 6
; SpaceMission 1.0
; LEV-File
1200
1
96
352
1
1
240
224
1
1
528
32
1
1
576
416
1
1
624
448
8
1
960
 
8
1
1008
448
8
1
1104
256
8
1
1296
448
8
1
1344
 
8
5
1632
416
8
5
1776
32
8
5
1872
224
8
5
2064
448
8
5
2064
64
8
5
2112
288
8
2
2160
96
1
2
2448
288
1
2
2544
96
1
2
2640
448
1
6
2880
 
8
6
2880
448
8
6
3024
384
8
6
3024
96
8
4
3024
32
 
4
3120
416
 
4
3408
64
 
6
3456
256
8
3
3696
160
5
1
4080
352
5
1
4224
64
5
1
4320
288
5
1
4464
160
5
1
4608
448
5
1
4704
288
1
1
4848
96
1
3
4992
64
1
3
4992
384
6
3
5088
256
1
6
5472
416
6
4
5616
224
 
6
5616
448
6
4
5712
32
 
6
5712
416
6
4
5808
416
 
6
5952
96
6
7
6000
224
6
6
6000
128
6
/Levels/Level 11.lev
1,39 → 1,139
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 11
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 1 48 192 1
Enemy 1 96 256 1
Enemy 5 240 128 3
Enemy 5 240 160 1
Enemy 5 240 288 6
Enemy 5 288 32 1
Enemy 3 432 256 1
Enemy 5 480 352 3
Enemy 3 528 64 3
Enemy 5 528 128 3
Enemy 5 816 32 4
Enemy 2 864 384 4
Enemy 2 1008 96 4
Enemy 5 1008 160 4
Enemy 3 1152 32 4
Enemy 1 1152 384 4
Enemy 1 1296 192 4
Enemy 6 1344 160 4
Enemy 6 1392 64 4
Enemy 6 1392 320 4
Enemy 3 1488 256 4
Enemy 6 1584 384 4
Enemy 2 1824 192 4
Enemy 2 1872 384 4
Enemy 2 1968 32 4
Enemy 2 2208 416 4
Enemy 2 2352 288 4
Enemy 1 2496 384 1
Enemy 2 2544 32 4
Enemy 2 2736 352 4
Enemy 6 2784 64 5
Enemy 1 2784 192 1
Enemy 6 3024 352 5
Enemy 7 3360 256 7
; SpaceMission 1.0
; LEV-File
1200
1
48
192
1
1
96
256
1
5
240
160
1
5
240
288
6
5
240
128
3
5
288
32
1
3
432
256
1
5
480
352
3
5
528
128
3
3
528
64
3
5
816
32
4
2
864
384
4
2
1008
96
4
5
1008
160
4
3
1152
32
4
1
1152
384
4
1
1296
192
4
6
1344
160
4
6
1392
64
4
6
1392
320
4
3
1488
256
4
6
1584
384
4
2
1824
192
4
2
1872
384
4
2
1968
32
4
2
2208
416
4
2
2352
288
4
1
2496
384
1
2
2544
32
4
2
2736
352
4
6
2784
64
5
1
2784
192
1
6
3024
352
5
7
3360
256
7
/Levels/Level 12.lev
1,37 → 1,131
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 12
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 288 32 0
Enemy 4 384 416 0
Enemy 1 480 96 3
Enemy 1 480 128 3
Enemy 2 480 160 3
Enemy 3 480 192 3
Enemy 3 480 224 3
Enemy 2 480 256 3
Enemy 1 480 288 3
Enemy 1 480 320 3
Enemy 4 528 64 0
Enemy 4 672 288 0
Enemy 4 912 64 0
Enemy 4 1008 384 0
Enemy 5 1056 160 3
Enemy 6 1056 192 3
Enemy 5 1056 224 3
Enemy 4 1104 96 0
Enemy 4 1296 32 0
Enemy 4 1392 384 0
Enemy 1 1536 192 3
Enemy 1 1536 224 3
Enemy 4 1632 64 0
Enemy 4 1680 320 0
Enemy 4 1872 32 0
Enemy 4 1872 416 0
Enemy 4 2160 384 0
Enemy 4 2256 96 0
Enemy 6 2256 192 9
Enemy 3 2256 224 9
Enemy 6 2256 256 9
Enemy 4 2448 352 0
; SpaceMission 1.0
; LEV-File
1200
4
288
32
 
4
384
416
 
1
480
96
3
1
480
320
3
2
480
160
3
2
480
256
3
3
480
224
3
3
480
192
3
1
480
128
3
1
480
288
3
4
528
64
 
4
672
288
 
4
912
64
 
4
1008
384
 
5
1056
160
3
6
1056
192
3
5
1056
224
3
4
1104
96
 
4
1296
32
 
4
1392
384
 
1
1536
224
3
1
1536
192
3
4
1632
64
 
4
1680
320
 
4
1872
32
 
4
1872
416
 
4
2160
384
 
4
2256
96
 
3
2256
224
9
6
2256
256
9
6
2256
192
9
4
2448
352
 
/Levels/Level 21.lev
1,50 → 1,183
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 21
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 6 96 64 10
Enemy 6 240 320 10
Enemy 4 432 32 0
Enemy 6 432 224 10
Enemy 4 528 352 0
Enemy 5 768 384 14
Enemy 5 816 128 14
Enemy 5 816 320 14
Enemy 5 816 384 14
Enemy 5 864 352 14
Enemy 5 960 384 14
Enemy 5 960 416 14
Enemy 5 1104 96 14
Enemy 3 1104 256 14
Enemy 5 1104 384 14
Enemy 3 1824 416 7
Enemy 3 2016 96 7
Enemy 3 2016 256 7
Enemy 3 2304 32 7
Enemy 3 2304 128 7
Enemy 3 2304 352 1
Enemy 2 2592 224 7
Enemy 2 2640 192 7
Enemy 2 2640 256 7
Enemy 2 2688 192 7
Enemy 2 2688 256 7
Enemy 2 2736 224 7
Enemy 3 2928 448 1
Enemy 2 3120 448 6
Enemy 2 3456 448 6
Enemy 2 3504 32 6
Enemy 5 3504 128 6
Enemy 2 3600 448 6
Enemy 2 3696 384 6
Enemy 2 3696 448 6
Enemy 5 3744 128 6
Enemy 6 3792 256 3
Enemy 6 3840 288 3
Enemy 6 3936 224 3
Enemy 6 4128 192 3
Enemy 3 4272 32 3
Enemy 3 4272 160 3
Enemy 3 4464 416 3
Enemy 3 4608 192 3
Enemy 3 4656 352 3
; SpaceMission 1.0
; LEV-File
1200
6
96
64
10
6
240
320
10
6
432
224
10
4
432
32
 
4
528
352
 
5
768
384
14
5
816
128
14
5
816
320
14
5
816
384
14
5
864
352
14
5
960
416
14
5
960
384
14
5
1104
384
14
5
1104
96
14
3
1104
256
14
3
1824
416
7
3
2016
96
7
3
2016
256
7
3
2304
32
7
3
2304
128
7
3
2304
352
1
2
2592
224
7
2
2640
192
7
2
2640
256
7
2
2688
256
7
2
2688
192
7
2
2736
224
7
3
2928
448
1
2
3120
448
6
2
3456
448
6
2
3504
32
6
5
3504
128
6
2
3600
448
6
2
3696
448
6
2
3696
384
6
5
3744
128
6
6
3792
256
3
6
3840
288
3
6
3936
224
3
6
4128
192
3
3
4272
32
3
3
4272
160
3
3
4464
416
3
3
4608
192
3
3
4656
352
3
/Levels/Level 30.lev
1,280 → 1,1103
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 30
Author Daniel Marschall
Width 1200
; Type XCoord YCoord Lives
Enemy 3 48 0 1
Enemy 3 48 448 1
Enemy 3 96 32 1
Enemy 3 96 416 1
Enemy 3 144 64 1
Enemy 3 144 384 1
Enemy 3 192 96 1
Enemy 3 192 352 1
Enemy 3 240 128 1
Enemy 3 240 320 1
Enemy 3 288 160 1
Enemy 3 288 288 1
Enemy 5 336 64 1
Enemy 3 336 192 1
Enemy 3 336 256 1
Enemy 5 336 384 1
Enemy 6 384 224 1
Enemy 4 432 32 0
Enemy 4 432 160 0
Enemy 4 480 192 0
Enemy 4 480 224 0
Enemy 1 480 448 1
Enemy 4 528 96 0
Enemy 4 528 416 0
Enemy 4 576 32 0
Enemy 7 576 224 99
Enemy 4 624 96 0
Enemy 4 624 416 0
Enemy 4 672 32 0
Enemy 1 672 64 1
Enemy 1 672 416 1
Enemy 4 672 448 0
Enemy 4 720 64 0
Enemy 4 720 128 0
Enemy 4 768 160 0
Enemy 4 768 224 0
Enemy 4 768 384 0
Enemy 1 816 448 99
Enemy 4 864 32 0
Enemy 4 864 96 0
Enemy 4 912 288 0
Enemy 4 960 64 0
Enemy 4 960 320 0
Enemy 4 1008 416 0
Enemy 1 1056 224 1
Enemy 4 1056 448 0
Enemy 4 1104 128 0
Enemy 4 1104 192 0
Enemy 4 1152 320 0
Enemy 4 1152 416 0
Enemy 4 1200 224 0
Enemy 4 1296 64 0
Enemy 1 1296 384 1
Enemy 4 1392 256 0
Enemy 4 1440 32 0
Enemy 1 1488 224 1
Enemy 4 1536 448 0
Enemy 4 1584 96 0
Enemy 4 1584 256 0
Enemy 1 1728 32 1
Enemy 4 1728 352 0
Enemy 4 1776 160 0
Enemy 4 1920 32 0
Enemy 1 1920 320 1
Enemy 4 1920 416 0
Enemy 4 2064 0 0
Enemy 4 2064 256 0
Enemy 4 2208 64 0
Enemy 1 2208 192 1
Enemy 4 2256 320 0
Enemy 1 2352 32 1
Enemy 4 2352 128 0
Enemy 4 2400 320 0
Enemy 1 2400 384 1
Enemy 2 2448 160 1
Enemy 4 2496 64 0
Enemy 4 2496 416 0
Enemy 3 2592 32 1
Enemy 4 2592 224 0
Enemy 2 2592 384 1
Enemy 4 2640 416 0
Enemy 4 2688 128 0
Enemy 4 2688 352 0
Enemy 5 2736 32 4
Enemy 5 2736 192 4
Enemy 5 2736 352 4
Enemy 4 2784 32 0
Enemy 4 2784 64 0
Enemy 4 2784 256 0
Enemy 5 2784 416 4
Enemy 4 2832 128 0
Enemy 4 2832 192 0
Enemy 4 2832 320 0
Enemy 4 2880 128 0
Enemy 4 2880 384 0
Enemy 4 2880 416 0
Enemy 4 2880 448 0
Enemy 4 2928 256 0
Enemy 1 2976 320 5
Enemy 4 3024 64 0
Enemy 4 3024 384 0
Enemy 2 3072 96 3
Enemy 4 3072 224 0
Enemy 3 3120 416 4
Enemy 4 3216 64 0
Enemy 4 3216 352 0
Enemy 4 3264 160 0
Enemy 3 3360 128 5
Enemy 4 3408 32 0
Enemy 4 3408 224 0
Enemy 4 3408 352 0
Enemy 3 3456 384 5
Enemy 4 3552 160 0
Enemy 3 3552 224 5
Enemy 4 3600 384 0
Enemy 4 3696 0 0
Enemy 4 3696 224 0
Enemy 1 3744 352 5
Enemy 1 3792 96 5
Enemy 4 3840 352 0
Enemy 4 3936 64 0
Enemy 3 4032 0 5
Enemy 4 4032 192 0
Enemy 4 4032 416 0
Enemy 4 4128 64 0
Enemy 1 4176 0 5
Enemy 4 4176 288 0
Enemy 4 4224 160 0
Enemy 3 4272 256 5
Enemy 4 4272 384 0
Enemy 2 4320 96 3
Enemy 4 4368 224 0
Enemy 4 4368 352 0
Enemy 4 4416 64 0
Enemy 1 4464 320 5
Enemy 4 4512 160 0
Enemy 4 4512 320 0
Enemy 4 4512 448 0
Enemy 4 4608 32 0
Enemy 4 4656 128 0
Enemy 4 4656 416 0
Enemy 4 4704 256 0
Enemy 3 4752 0 5
Enemy 4 4800 96 0
Enemy 4 4800 384 0
Enemy 4 4848 160 0
Enemy 3 4848 256 5
Enemy 4 4896 352 0
Enemy 4 4944 32 0
Enemy 3 4944 128 5
Enemy 4 4944 192 0
Enemy 1 5040 0 5
Enemy 4 5040 96 0
Enemy 4 5040 256 0
Enemy 4 5040 384 0
Enemy 4 5088 64 0
Enemy 1 5088 160 5
Enemy 4 5184 0 0
Enemy 4 5184 352 0
Enemy 4 5232 224 0
Enemy 4 5280 96 0
Enemy 4 5280 320 0
Enemy 4 5376 64 0
Enemy 4 5376 192 0
Enemy 4 5424 416 0
Enemy 1 5520 64 5
Enemy 4 5520 224 0
Enemy 4 5568 384 0
Enemy 4 5616 64 0
Enemy 2 5616 128 3
Enemy 4 5664 224 0
Enemy 3 5664 320 5
Enemy 4 5760 32 0
Enemy 1 5760 288 5
Enemy 4 5760 384 0
Enemy 4 5808 96 0
Enemy 3 5808 192 5
Enemy 1 5904 32 5
Enemy 4 5904 352 0
Enemy 4 5952 192 0
Enemy 4 6000 64 0
Enemy 4 6000 352 0
Enemy 3 6096 32 5
Enemy 4 6096 160 0
Enemy 4 6096 320 0
Enemy 3 6144 64 5
Enemy 1 6144 256 5
Enemy 4 6144 352 0
Enemy 3 6192 96 5
Enemy 1 6192 416 5
Enemy 4 6240 32 0
Enemy 4 6288 192 0
Enemy 4 6288 288 0
Enemy 4 6336 416 0
Enemy 4 6384 0 0
Enemy 1 6384 128 5
Enemy 4 6384 288 0
Enemy 4 6432 96 0
Enemy 1 6432 352 5
Enemy 4 6432 416 0
Enemy 1 6528 0 5
Enemy 4 6528 128 0
Enemy 4 6528 320 0
Enemy 1 6576 416 5
Enemy 4 6624 64 0
Enemy 4 6624 256 0
Enemy 4 6624 416 0
Enemy 3 6672 448 5
Enemy 4 6720 32 0
Enemy 4 6720 128 0
Enemy 3 6768 320 5
Enemy 1 6816 96 5
Enemy 4 6864 224 0
Enemy 4 6864 352 0
Enemy 4 6912 32 0
Enemy 1 6960 352 5
Enemy 2 7008 160 3
Enemy 4 7056 0 0
Enemy 4 7104 64 0
Enemy 4 7104 192 0
Enemy 4 7104 288 0
Enemy 4 7152 416 0
Enemy 1 7200 64 5
Enemy 4 7200 128 0
Enemy 4 7200 384 0
Enemy 1 7248 224 5
Enemy 1 7248 416 5
Enemy 4 7296 32 0
Enemy 4 7344 128 0
Enemy 4 7344 288 0
Enemy 4 7344 384 0
Enemy 3 7392 0 5
Enemy 4 7440 224 0
Enemy 4 7488 64 0
Enemy 1 7488 128 5
Enemy 4 7488 352 0
Enemy 1 7584 320 5
Enemy 4 7632 192 0
Enemy 1 7680 0 5
Enemy 4 7680 64 0
Enemy 3 7728 384 5
Enemy 4 7776 288 0
Enemy 3 7824 32 5
Enemy 4 7824 160 0
Enemy 1 7872 416 5
Enemy 4 7920 64 0
Enemy 1 7920 192 5
Enemy 4 7968 352 0
Enemy 4 8064 192 0
Enemy 1 8160 0 5
Enemy 1 8160 32 5
Enemy 1 8160 64 5
Enemy 1 8160 96 5
Enemy 1 8160 128 5
Enemy 1 8160 160 5
Enemy 2 8304 352 3
Enemy 1 8400 288 5
Enemy 1 8448 256 5
Enemy 1 8448 448 5
Enemy 1 8496 224 5
Enemy 1 8496 416 5
Enemy 1 8544 192 5
Enemy 1 8544 384 5
Enemy 1 8592 160 5
Enemy 1 8592 352 5
Enemy 1 8640 128 5
Enemy 1 8640 320 5
Enemy 1 8688 96 5
Enemy 1 8688 288 5
Enemy 1 8736 64 5
Enemy 1 8736 256 5
Enemy 1 8784 32 5
Enemy 1 8784 224 5
Enemy 1 8832 0 5
Enemy 1 8832 192 5
; SpaceMission 1.0
; LEV-File
1200
3
48
 
1
3
48
448
1
3
96
32
1
3
96
416
1
3
144
384
1
3
144
64
1
3
192
352
1
3
192
96
1
3
240
320
1
3
240
128
1
3
288
288
1
3
288
160
1
3
336
256
1
3
336
192
1
5
336
64
1
5
336
384
1
6
384
224
1
4
432
32
 
4
432
160
 
4
480
192
 
4
480
224
 
1
480
448
1
4
528
96
 
4
528
416
 
4
576
32
 
7
576
224
99
4
624
96
 
4
624
416
 
4
672
32
 
4
672
448
 
1
672
64
1
1
672
416
1
4
720
64
 
4
720
128
 
4
768
384
 
4
768
160
 
4
768
224
 
1
816
448
99
4
864
32
 
4
864
96
 
4
912
288
 
4
960
320
 
4
960
64
 
4
1008
416
 
4
1056
448
 
1
1056
224
1
4
1104
192
 
4
1104
128
 
4
1152
416
 
4
1152
320
 
4
1200
224
 
4
1296
64
 
1
1296
384
1
4
1392
256
 
4
1440
32
 
1
1488
224
1
4
1536
448
 
4
1584
96
 
4
1584
256
 
4
1728
352
 
1
1728
32
1
4
1776
160
 
4
1920
32
 
4
1920
416
 
1
1920
320
1
4
2064
256
 
4
2064
 
 
4
2208
64
 
1
2208
192
1
4
2256
320
 
1
2352
32
1
4
2352
128
 
1
2400
384
1
4
2400
320
 
2
2448
160
1
4
2496
64
 
4
2496
416
 
2
2592
384
1
3
2592
32
1
4
2592
224
 
4
2640
416
 
4
2688
128
 
4
2688
352
 
5
2736
32
4
5
2736
192
4
5
2736
352
4
4
2784
256
 
5
2784
416
4
4
2784
64
 
4
2784
32
 
4
2832
128
 
4
2832
320
 
4
2832
192
 
4
2880
384
 
4
2880
448
 
4
2880
128
 
4
2880
416
 
4
2928
256
 
1
2976
320
5
4
3024
64
 
4
3024
384
 
4
3072
224
 
2
3072
96
3
3
3120
416
4
4
3216
64
 
4
3216
352
 
4
3264
160
 
3
3360
128
5
4
3408
32
 
4
3408
352
 
4
3408
224
 
3
3456
384
5
4
3552
160
 
3
3552
224
5
4
3600
384
 
4
3696
224
 
4
3696
 
 
1
3744
352
5
1
3792
96
5
4
3840
352
 
4
3936
64
 
4
4032
416
 
4
4032
192
 
3
4032
 
5
4
4128
64
 
4
4176
288
 
1
4176
 
5
4
4224
160
 
4
4272
384
 
3
4272
256
5
2
4320
96
3
4
4368
352
 
4
4368
224
 
4
4416
64
 
1
4464
320
5
4
4512
160
 
4
4512
320
 
4
4512
448
 
4
4608
32
 
4
4656
416
 
4
4656
128
 
4
4704
256
 
3
4752
 
5
4
4800
96
 
4
4800
384
 
4
4848
160
 
3
4848
256
5
4
4896
352
 
4
4944
32
 
4
4944
192
 
3
4944
128
5
4
5040
256
 
4
5040
96
 
4
5040
384
 
1
5040
 
5
4
5088
64
 
1
5088
160
5
4
5184
352
 
4
5184
 
 
4
5232
224
 
4
5280
96
 
4
5280
320
 
4
5376
64
 
4
5376
192
 
4
5424
416
 
4
5520
224
 
1
5520
64
5
4
5568
384
 
4
5616
64
 
2
5616
128
3
4
5664
224
 
3
5664
320
5
4
5760
384
 
4
5760
32
 
1
5760
288
5
4
5808
96
 
3
5808
192
5
4
5904
352
 
1
5904
32
5
4
5952
192
 
4
6000
64
 
4
6000
352
 
4
6096
160
 
4
6096
320
 
3
6096
32
5
4
6144
352
 
3
6144
64
5
1
6144
256
5
3
6192
96
5
1
6192
416
5
4
6240
32
 
4
6288
192
 
4
6288
288
 
4
6336
416
 
4
6384
288
 
4
6384
 
 
1
6384
128
5
4
6432
96
 
4
6432
416
 
1
6432
352
5
4
6528
128
 
4
6528
320
 
1
6528
 
5
1
6576
416
5
4
6624
416
 
4
6624
64
 
4
6624
256
 
3
6672
448
5
4
6720
128
 
4
6720
32
 
3
6768
320
5
1
6816
96
5
4
6864
352
 
4
6864
224
 
4
6912
32
 
1
6960
352
5
2
7008
160
3
4
7056
 
 
4
7104
192
 
4
7104
288
 
4
7104
64
 
4
7152
416
 
4
7200
384
 
4
7200
128
 
1
7200
64
5
1
7248
224
5
1
7248
416
5
4
7296
32
 
4
7344
128
 
4
7344
288
 
4
7344
384
 
3
7392
 
5
4
7440
224
 
4
7488
352
 
4
7488
64
 
1
7488
128
5
1
7584
320
5
4
7632
192
 
4
7680
64
 
1
7680
 
5
3
7728
384
5
4
7776
288
 
4
7824
160
 
3
7824
32
5
1
7872
416
5
4
7920
64
 
1
7920
192
5
4
7968
352
 
4
8064
192
 
1
8160
160
5
1
8160
128
5
1
8160
96
5
1
8160
64
5
1
8160
32
5
1
8160
 
5
2
8304
352
3
1
8400
288
5
1
8448
448
5
1
8448
256
5
1
8496
416
5
1
8496
224
5
1
8544
384
5
1
8544
192
5
1
8592
352
5
1
8592
160
5
1
8640
128
5
1
8640
320
5
1
8688
96
5
1
8688
288
5
1
8736
64
5
1
8736
256
5
1
8784
32
5
1
8784
224
5
1
8832
 
5
1
8832
192
5
/Levels/Level 31.lev
1,193 → 1,755
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 31
Author Daniel Marschall
Width 1200
; Type XCoord YCoord Lives
Enemy 4 48 32 0
Enemy 4 48 64 0
Enemy 4 48 96 0
Enemy 4 48 128 0
Enemy 4 48 160 0
Enemy 4 48 192 0
Enemy 4 96 160 0
Enemy 4 144 128 0
Enemy 4 192 160 0
Enemy 4 240 32 0
Enemy 4 240 64 0
Enemy 4 240 96 0
Enemy 4 240 128 0
Enemy 4 240 160 0
Enemy 4 240 192 0
Enemy 4 336 32 0
Enemy 4 336 64 0
Enemy 4 336 96 0
Enemy 4 336 128 0
Enemy 4 336 160 0
Enemy 4 336 192 0
Enemy 4 384 32 0
Enemy 4 384 96 0
Enemy 4 384 128 0
Enemy 4 384 192 0
Enemy 4 432 32 0
Enemy 4 432 96 0
Enemy 4 432 128 0
Enemy 4 432 192 0
Enemy 4 528 32 0
Enemy 4 528 64 0
Enemy 4 528 96 0
Enemy 4 528 128 0
Enemy 4 528 160 0
Enemy 4 528 192 0
Enemy 4 576 192 0
Enemy 4 624 192 0
Enemy 4 720 32 0
Enemy 4 720 64 0
Enemy 4 720 96 0
Enemy 4 720 128 0
Enemy 4 720 160 0
Enemy 4 720 192 0
Enemy 4 768 192 0
Enemy 4 816 192 0
Enemy 4 960 32 0
Enemy 4 960 64 0
Enemy 4 960 96 0
Enemy 4 960 128 0
Enemy 4 960 160 0
Enemy 4 960 192 0
Enemy 4 1008 32 0
Enemy 4 1008 192 0
Enemy 4 1056 64 0
Enemy 4 1056 96 0
Enemy 4 1056 128 0
Enemy 4 1056 160 0
Enemy 4 1152 64 0
Enemy 4 1152 96 0
Enemy 4 1152 128 0
Enemy 4 1152 160 0
Enemy 4 1200 32 0
Enemy 4 1200 192 0
Enemy 4 1248 64 0
Enemy 4 1248 96 0
Enemy 4 1248 128 0
Enemy 4 1248 160 0
Enemy 4 1344 32 0
Enemy 4 1344 64 0
Enemy 4 1344 96 0
Enemy 4 1344 128 0
Enemy 4 1344 160 0
Enemy 4 1344 192 0
Enemy 4 1392 64 0
Enemy 4 1392 96 0
Enemy 4 1392 128 0
Enemy 4 1440 128 0
Enemy 4 1440 160 0
Enemy 4 1440 192 0
Enemy 4 1488 32 0
Enemy 4 1488 64 0
Enemy 4 1488 96 0
Enemy 4 1488 128 0
Enemy 4 1488 160 0
Enemy 4 1488 192 0
Enemy 4 1584 32 0
Enemy 4 1584 64 0
Enemy 4 1584 96 0
Enemy 4 1584 128 0
Enemy 4 1584 160 0
Enemy 4 1584 192 0
Enemy 4 1632 32 0
Enemy 4 1632 96 0
Enemy 4 1632 128 0
Enemy 4 1632 192 0
Enemy 4 1680 32 0
Enemy 4 1680 96 0
Enemy 4 1680 128 0
Enemy 4 1680 192 0
Enemy 4 1776 32 0
Enemy 4 1776 64 0
Enemy 4 1776 96 0
Enemy 4 1776 128 0
Enemy 4 1776 192 0
Enemy 4 1872 32 0
Enemy 4 1872 64 0
Enemy 4 1872 96 0
Enemy 4 1872 128 0
Enemy 4 1872 192 0
Enemy 4 1968 32 0
Enemy 4 1968 64 0
Enemy 4 1968 96 0
Enemy 4 1968 128 0
Enemy 4 1968 192 0
Enemy 1 2064 0 1
Enemy 1 2064 448 1
Enemy 1 2112 32 1
Enemy 1 2112 416 1
Enemy 1 2160 0 1
Enemy 1 2160 448 1
Enemy 1 2208 32 1
Enemy 1 2208 416 1
Enemy 1 2256 0 1
Enemy 1 2256 448 1
Enemy 1 2304 32 1
Enemy 1 2304 416 1
Enemy 1 2352 0 1
Enemy 1 2352 448 1
Enemy 1 2400 32 1
Enemy 1 2400 416 1
Enemy 1 2448 0 1
Enemy 1 2448 448 1
Enemy 1 2496 32 1
Enemy 1 2496 416 1
Enemy 1 2544 0 1
Enemy 1 2544 448 1
Enemy 1 2592 32 1
Enemy 1 2592 416 1
Enemy 1 2640 0 1
Enemy 1 2640 448 1
Enemy 1 2688 32 1
Enemy 1 2688 416 1
Enemy 1 2736 0 1
Enemy 1 2736 448 1
Enemy 1 2784 32 1
Enemy 1 2784 416 1
Enemy 1 2832 0 1
Enemy 1 2832 448 1
Enemy 1 2880 32 1
Enemy 1 2880 416 1
Enemy 1 2928 0 1
Enemy 1 2928 448 1
Enemy 1 2976 32 1
Enemy 1 2976 416 1
Enemy 1 3024 64 1
Enemy 1 3024 384 1
Enemy 4 3072 32 0
Enemy 1 3072 96 1
Enemy 1 3072 352 1
Enemy 4 3072 416 0
Enemy 4 3120 64 0
Enemy 4 3120 384 0
Enemy 4 3168 32 0
Enemy 4 3168 96 0
Enemy 4 3168 352 0
Enemy 4 3168 416 0
Enemy 4 3216 96 0
Enemy 4 3216 352 0
Enemy 6 3264 32 1
Enemy 4 3264 96 0
Enemy 4 3264 352 0
Enemy 6 3264 416 1
Enemy 4 3312 96 0
Enemy 4 3312 352 0
Enemy 4 3360 96 0
Enemy 4 3360 352 0
Enemy 4 3408 96 0
Enemy 4 3408 352 0
Enemy 4 3456 96 0
Enemy 4 3456 352 0
Enemy 3 3504 64 1
Enemy 3 3504 384 1
Enemy 3 3552 32 1
Enemy 3 3552 416 1
Enemy 3 3600 0 1
Enemy 3 3600 448 1
Enemy 5 3696 32 1
Enemy 5 3696 416 1
; SpaceMission 1.0
; LEV-File
1200
4
48
32
 
4
48
64
 
4
48
96
 
4
48
128
 
4
48
160
 
4
48
192
 
4
96
160
 
4
144
128
 
4
192
160
 
4
240
192
 
4
240
160
 
4
240
128
 
4
240
64
 
4
240
32
 
4
240
96
 
4
336
32
 
4
336
64
 
4
336
96
 
4
336
128
 
4
336
160
 
4
336
192
 
4
384
192
 
4
384
32
 
4
384
96
 
4
384
128
 
4
432
192
 
4
432
32
 
4
432
128
 
4
432
96
 
4
528
32
 
4
528
64
 
4
528
96
 
4
528
128
 
4
528
160
 
4
528
192
 
4
576
192
 
4
624
192
 
4
720
192
 
4
720
160
 
4
720
128
 
4
720
96
 
4
720
64
 
4
720
32
 
4
768
192
 
4
816
192
 
4
960
192
 
4
960
160
 
4
960
96
 
4
960
128
 
4
960
64
 
4
960
32
 
4
1008
32
 
4
1008
192
 
4
1056
160
 
4
1056
128
 
4
1056
96
 
4
1056
64
 
4
1152
96
 
4
1152
64
 
4
1152
128
 
4
1152
160
 
4
1200
192
 
4
1200
32
 
4
1248
160
 
4
1248
128
 
4
1248
96
 
4
1248
64
 
4
1344
192
 
4
1344
160
 
4
1344
128
 
4
1344
96
 
4
1344
64
 
4
1344
32
 
4
1392
64
 
4
1392
96
 
4
1392
128
 
4
1440
192
 
4
1440
160
 
4
1440
128
 
4
1488
192
 
4
1488
160
 
4
1488
128
 
4
1488
96
 
4
1488
64
 
4
1488
32
 
4
1584
32
 
4
1584
64
 
4
1584
96
 
4
1584
128
 
4
1584
160
 
4
1584
192
 
4
1632
192
 
4
1632
32
 
4
1632
96
 
4
1632
128
 
4
1680
192
 
4
1680
32
 
4
1680
96
 
4
1680
128
 
4
1776
32
 
4
1776
96
 
4
1776
64
 
4
1776
128
 
4
1776
192
 
4
1872
192
 
4
1872
128
 
4
1872
96
 
4
1872
64
 
4
1872
32
 
4
1968
32
 
4
1968
64
 
4
1968
96
 
4
1968
128
 
4
1968
192
 
1
2064
448
1
1
2064
 
1
1
2112
416
1
1
2112
32
1
1
2160
448
1
1
2160
 
1
1
2208
416
1
1
2208
32
1
1
2256
448
1
1
2256
 
1
1
2304
416
1
1
2304
32
1
1
2352
448
1
1
2352
 
1
1
2400
416
1
1
2400
32
1
1
2448
448
1
1
2448
 
1
1
2496
32
1
1
2496
416
1
1
2544
 
1
1
2544
448
1
1
2592
32
1
1
2592
416
1
1
2640
448
1
1
2640
 
1
1
2688
416
1
1
2688
32
1
1
2736
448
1
1
2736
 
1
1
2784
416
1
1
2784
32
1
1
2832
448
1
1
2832
 
1
1
2880
416
1
1
2880
32
1
1
2928
448
1
1
2928
 
1
1
2976
416
1
1
2976
32
1
1
3024
384
1
1
3024
64
1
1
3072
352
1
1
3072
96
1
4
3072
416
 
4
3072
32
 
4
3120
64
 
4
3120
384
 
4
3168
32
 
4
3168
416
 
4
3168
352
 
4
3168
96
 
4
3216
352
 
4
3216
96
 
4
3264
352
 
4
3264
96
 
6
3264
32
1
6
3264
416
1
4
3312
352
 
4
3312
96
 
4
3360
96
 
4
3360
352
 
4
3408
96
 
4
3408
352
 
4
3456
96
 
4
3456
352
 
3
3504
64
1
3
3504
384
1
3
3552
32
1
3
3552
416
1
3
3600
 
1
3
3600
448
1
5
3696
416
1
5
3696
32
1
/Levels/Level 22.lev
1,68 → 1,255
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 22
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 1 384 32 1
Enemy 1 384 64 1
Enemy 1 384 96 1
Enemy 5 384 192 1
Enemy 5 384 224 1
Enemy 5 384 256 1
Enemy 1 384 352 1
Enemy 1 384 384 1
Enemy 1 384 416 1
Enemy 2 432 32 1
Enemy 2 432 64 1
Enemy 2 432 96 1
Enemy 6 432 192 1
Enemy 6 432 224 1
Enemy 6 432 256 1
Enemy 2 432 352 1
Enemy 2 432 384 1
Enemy 2 432 416 1
Enemy 3 480 32 1
Enemy 3 480 64 1
Enemy 3 480 96 1
Enemy 5 480 192 1
Enemy 5 480 224 1
Enemy 5 480 256 1
Enemy 3 480 352 1
Enemy 3 480 384 1
Enemy 3 480 416 1
Enemy 1 576 32 1
Enemy 1 576 64 1
Enemy 1 576 96 1
Enemy 5 576 192 1
Enemy 5 576 224 1
Enemy 5 576 256 1
Enemy 1 576 352 1
Enemy 1 576 384 1
Enemy 1 576 416 1
Enemy 2 624 32 1
Enemy 2 624 64 1
Enemy 2 624 96 1
Enemy 6 624 192 1
Enemy 6 624 224 1
Enemy 6 624 256 1
Enemy 2 624 352 1
Enemy 2 624 384 1
Enemy 2 624 416 1
Enemy 3 672 32 1
Enemy 3 672 64 1
Enemy 3 672 96 1
Enemy 5 672 192 1
Enemy 5 672 224 1
Enemy 5 672 256 1
Enemy 3 672 352 1
Enemy 3 672 384 1
Enemy 3 672 416 1
Enemy 4 960 96 0
Enemy 4 1056 32 0
Enemy 4 1056 320 0
Enemy 4 1200 256 0
Enemy 4 1248 384 0
Enemy 4 1392 288 0
Enemy 4 1488 64 0
Enemy 4 1680 384 0
Enemy 3 1728 224 10
; SpaceMission 1.0
; LEV-File
1200
1
384
32
1
1
384
64
1
1
384
96
1
1
384
416
1
1
384
384
1
1
384
352
1
5
384
192
1
5
384
224
1
5
384
256
1
6
432
192
1
6
432
224
1
6
432
256
1
2
432
32
1
2
432
64
1
2
432
96
1
2
432
352
1
2
432
384
1
2
432
416
1
5
480
192
1
5
480
224
1
5
480
256
1
3
480
32
1
3
480
96
1
3
480
64
1
3
480
352
1
3
480
384
1
3
480
416
1
1
576
32
1
1
576
64
1
1
576
96
1
1
576
352
1
1
576
384
1
1
576
416
1
5
576
192
1
5
576
224
1
5
576
256
1
6
624
192
1
6
624
224
1
6
624
256
1
2
624
32
1
2
624
64
1
2
624
96
1
2
624
352
1
2
624
384
1
2
624
416
1
3
672
32
1
3
672
64
1
3
672
96
1
3
672
352
1
3
672
384
1
3
672
416
1
5
672
192
1
5
672
224
1
5
672
256
1
4
960
96
 
4
1056
32
 
4
1056
320
 
4
1200
256
 
4
1248
384
 
4
1392
288
 
4
1488
64
 
4
1680
384
 
3
1728
224
10
/Levels/Level 13.lev
1,31 → 1,107
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 13
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 1 336 32 4
Enemy 1 336 224 4
Enemy 4 336 256 0
Enemy 1 336 416 4
Enemy 4 384 160 0
Enemy 2 432 32 4
Enemy 2 432 224 4
Enemy 2 432 416 4
Enemy 3 528 32 4
Enemy 3 528 224 4
Enemy 4 528 352 0
Enemy 3 528 416 4
Enemy 4 672 32 0
Enemy 4 720 320 0
Enemy 4 960 256 0
Enemy 4 1056 32 0
Enemy 6 1104 160 4
Enemy 6 1104 224 4
Enemy 6 1104 288 4
Enemy 4 1248 320 0
Enemy 4 1392 64 0
Enemy 1 1680 160 10
Enemy 5 1680 192 10
Enemy 1 1680 224 10
Enemy 4 1824 96 0
Enemy 4 1920 320 0
; SpaceMission 1.0
; LEV-File
1200
1
336
32
4
1
336
224
4
1
336
416
4
4
336
256
 
4
384
160
 
2
432
32
4
2
432
224
4
2
432
416
4
3
528
32
4
3
528
224
4
3
528
416
4
4
528
352
 
4
672
32
 
4
720
320
 
4
960
256
 
4
1056
32
 
6
1104
160
4
6
1104
288
4
6
1104
224
4
4
1248
320
 
4
1392
64
 
1
1680
160
10
5
1680
192
10
1
1680
224
10
4
1824
96
 
4
1920
320
 
/Levels/Level 23.lev
1,67 → 1,251
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 23
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 7 432 224 12
Enemy 3 768 64 40
Enemy 3 816 256 40
Enemy 3 864 384 40
Enemy 5 1056 96 40
Enemy 5 1248 416 15
Enemy 5 1296 32 40
Enemy 5 1296 128 40
Enemy 2 1440 256 15
Enemy 2 2160 128 15
Enemy 2 2208 352 15
Enemy 2 2256 64 15
Enemy 2 2304 288 15
Enemy 2 2352 0 15
Enemy 2 2352 224 15
Enemy 2 2496 352 15
Enemy 6 2928 128 3
Enemy 6 2928 160 3
Enemy 6 2928 192 3
Enemy 6 2928 224 3
Enemy 6 2928 256 3
Enemy 6 2928 288 3
Enemy 6 2928 320 3
Enemy 6 2976 128 3
Enemy 6 2976 224 3
Enemy 6 3024 128 3
Enemy 6 3024 224 3
Enemy 6 3072 128 3
Enemy 6 3072 160 3
Enemy 6 3072 192 3
Enemy 6 3072 224 3
Enemy 6 3072 256 3
Enemy 6 3072 288 3
Enemy 6 3072 320 3
Enemy 6 3216 192 3
Enemy 6 3216 224 3
Enemy 6 3216 256 3
Enemy 6 3216 288 3
Enemy 6 3216 320 3
Enemy 6 3264 224 3
Enemy 6 3312 224 3
Enemy 6 3312 256 3
Enemy 6 3312 288 3
Enemy 6 3312 320 3
Enemy 6 3408 224 3
Enemy 6 3408 256 3
Enemy 6 3408 288 3
Enemy 6 3408 320 3
Enemy 6 3456 224 3
Enemy 6 3456 320 3
Enemy 6 3504 128 3
Enemy 6 3504 160 3
Enemy 6 3504 192 3
Enemy 6 3504 224 3
Enemy 6 3504 256 3
Enemy 6 3504 288 3
Enemy 6 3504 320 3
Enemy 6 3600 160 3
Enemy 6 3600 224 3
Enemy 6 3600 256 3
Enemy 6 3600 288 3
Enemy 6 3600 320 3
; SpaceMission 1.0
; LEV-File
1200
7
432
224
12
3
768
64
40
3
816
256
40
3
864
384
40
5
1056
96
40
5
1248
416
15
5
1296
32
40
5
1296
128
40
2
1440
256
15
2
2160
128
15
2
2208
352
15
2
2256
64
15
2
2304
288
15
2
2352
 
15
2
2352
224
15
2
2496
352
15
6
2928
320
3
6
2928
256
3
6
2928
224
3
6
2928
288
3
6
2928
192
3
6
2928
160
3
6
2928
128
3
6
2976
128
3
6
2976
224
3
6
3024
128
3
6
3024
224
3
6
3072
128
3
6
3072
160
3
6
3072
192
3
6
3072
224
3
6
3072
288
3
6
3072
256
3
6
3072
320
3
6
3216
192
3
6
3216
224
3
6
3216
256
3
6
3216
288
3
6
3216
320
3
6
3264
224
3
6
3312
224
3
6
3312
256
3
6
3312
288
3
6
3312
320
3
6
3408
224
3
6
3408
256
3
6
3408
320
3
6
3408
288
3
6
3456
224
3
6
3456
320
3
6
3504
224
3
6
3504
320
3
6
3504
128
3
6
3504
160
3
6
3504
192
3
6
3504
256
3
6
3504
288
3
6
3600
224
3
6
3600
256
3
6
3600
288
3
6
3600
320
3
6
3600
160
3
/Levels/Level 14.lev
1,60 → 1,223
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 14
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 1 96 224 4
Enemy 1 240 384 4
Enemy 1 336 32 4
Enemy 1 576 160 4
Enemy 5 672 128 4
Enemy 5 768 320 4
Enemy 5 864 128 4
Enemy 5 1104 32 4
Enemy 3 1104 224 4
Enemy 5 1152 416 4
Enemy 1 1296 96 3
Enemy 1 1392 352 3
Enemy 6 1440 192 3
Enemy 6 1632 32 3
Enemy 5 1632 416 4
Enemy 3 1680 128 4
Enemy 3 1776 224 4
Enemy 3 1824 32 4
Enemy 5 1872 320 4
Enemy 2 1968 96 4
Enemy 5 1968 320 4
Enemy 2 2112 160 4
Enemy 6 2256 384 4
Enemy 6 2256 416 4
Enemy 3 2352 32 4
Enemy 3 2352 192 4
Enemy 6 2400 384 4
Enemy 6 2400 448 4
Enemy 3 2544 96 4
Enemy 3 2688 384 4
Enemy 2 2736 64 4
Enemy 2 2832 160 4
Enemy 2 3024 32 4
Enemy 5 3072 224 4
Enemy 5 3264 352 5
Enemy 6 3312 64 4
Enemy 6 3408 384 4
Enemy 5 3504 160 5
Enemy 6 3552 224 4
Enemy 6 3648 64 4
Enemy 6 3648 384 4
Enemy 6 3744 256 4
Enemy 6 3840 448 4
Enemy 5 3888 64 5
Enemy 5 4032 352 5
Enemy 5 4128 192 5
Enemy 6 4176 448 4
Enemy 5 4224 32 5
Enemy 2 4272 160 5
Enemy 1 4416 320 3
Enemy 1 4464 32 3
Enemy 2 4608 416 1
Enemy 2 4656 64 1
Enemy 2 4656 256 1
Enemy 7 5184 224 8
; SpaceMission 1.0
; LEV-File
1200
1
96
224
4
1
240
384
4
1
336
32
4
1
576
160
4
5
672
128
4
5
768
320
4
5
864
128
4
5
1104
32
4
3
1104
224
4
5
1152
416
4
1
1296
96
3
1
1392
352
3
6
1440
192
3
6
1632
32
3
5
1632
416
4
3
1680
128
4
3
1776
224
4
3
1824
32
4
5
1872
320
4
2
1968
96
4
5
1968
320
4
2
2112
160
4
6
2256
416
4
6
2256
384
4
3
2352
32
4
3
2352
192
4
6
2400
384
4
6
2400
448
4
3
2544
96
4
3
2688
384
4
2
2736
64
4
2
2832
160
4
2
3024
32
4
5
3072
224
4
5
3264
352
5
6
3312
64
4
6
3408
384
4
5
3504
160
5
6
3552
224
4
6
3648
384
4
6
3648
64
4
6
3744
256
4
6
3840
448
4
5
3888
64
5
5
4032
352
5
5
4128
192
5
6
4176
448
4
5
4224
32
5
2
4272
160
5
1
4416
320
3
1
4464
32
3
2
4608
416
1
2
4656
256
1
2
4656
64
1
7
5184
224
8
/Levels/Level 15.lev
1,55 → 1,203
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 15
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 3 0 64 6
Enemy 3 192 224 6
Enemy 3 432 96 6
Enemy 3 432 352 6
Enemy 4 528 64 0
Enemy 4 624 288 0
Enemy 3 672 256 6
Enemy 4 768 32 0
Enemy 4 768 416 0
Enemy 3 1008 160 6
Enemy 3 1056 352 6
Enemy 3 1152 96 9
Enemy 3 1152 320 9
Enemy 1 1344 128 9
Enemy 6 1440 64 9
Enemy 1 1440 352 9
Enemy 6 1632 32 9
Enemy 6 1776 160 9
Enemy 6 1872 64 9
Enemy 6 2064 416 9
Enemy 6 2112 128 9
Enemy 6 2160 320 9
Enemy 3 2208 32 9
Enemy 3 2256 416 9
Enemy 2 2448 160 9
Enemy 4 2496 96 0
Enemy 2 2640 160 9
Enemy 2 2640 192 9
Enemy 4 2688 416 0
Enemy 5 2832 160 9
Enemy 2 2880 64 9
Enemy 4 2976 448 0
Enemy 5 3120 288 9
Enemy 5 3216 96 9
Enemy 6 3216 384 9
Enemy 6 3360 64 9
Enemy 6 3408 192 9
Enemy 6 3456 384 9
Enemy 1 3648 64 9
Enemy 1 3696 384 9
Enemy 1 3744 128 9
Enemy 1 3936 64 9
Enemy 1 3936 256 9
Enemy 6 4128 160 9
Enemy 6 4272 96 9
Enemy 6 4272 448 9
Enemy 1 4368 320 9
Enemy 1 4416 32 14
Enemy 1 4464 224 9
Enemy 7 5232 224 14
; SpaceMission 1.0
; LEV-File
1200
3
 
64
6
3
192
224
6
3
432
96
6
3
432
352
6
4
528
64
 
4
624
288
 
3
672
256
6
4
768
416
 
4
768
32
 
3
1008
160
6
3
1056
352
6
3
1152
96
9
3
1152
320
9
1
1344
128
9
1
1440
352
9
6
1440
64
9
6
1632
32
9
6
1776
160
9
6
1872
64
9
6
2064
416
9
6
2112
128
9
6
2160
320
9
3
2208
32
9
3
2256
416
9
2
2448
160
9
4
2496
96
 
2
2640
160
9
2
2640
192
9
4
2688
416
 
5
2832
160
9
2
2880
64
9
4
2976
448
 
5
3120
288
9
5
3216
96
9
6
3216
384
9
6
3360
64
9
6
3408
192
9
6
3456
384
9
1
3648
64
9
1
3696
384
9
1
3744
128
9
1
3936
64
9
1
3936
256
9
6
4128
160
9
6
4272
96
9
6
4272
448
9
1
4368
320
9
1
4416
32
14
1
4464
224
9
7
5232
224
14
/Levels/Level 24.lev
1,105 → 1,403
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 24
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 1 192 64 1
Enemy 1 288 64 1
Enemy 1 288 192 1
Enemy 1 288 352 1
Enemy 1 336 256 1
Enemy 1 384 160 1
Enemy 1 432 352 1
Enemy 1 816 384 16
Enemy 1 864 352 16
Enemy 1 864 384 16
Enemy 1 912 288 16
Enemy 1 912 320 16
Enemy 1 960 288 16
Enemy 1 1008 288 16
Enemy 1 1056 256 16
Enemy 1 1104 192 16
Enemy 1 1152 96 16
Enemy 1 1152 160 16
Enemy 1 1296 448 16
Enemy 4 1968 0 0
Enemy 4 2016 128 0
Enemy 6 2016 352 8
Enemy 4 2016 416 0
Enemy 6 2064 224 8
Enemy 6 2064 352 8
Enemy 4 2112 128 0
Enemy 4 2160 32 0
Enemy 4 2160 96 0
Enemy 4 2160 160 0
Enemy 6 2160 288 8
Enemy 4 2208 32 0
Enemy 4 2208 416 0
Enemy 6 2256 320 8
Enemy 4 2304 192 0
Enemy 6 2304 288 8
Enemy 6 2304 352 8
Enemy 4 2304 416 0
Enemy 4 2352 96 0
Enemy 6 2496 192 8
Enemy 6 2544 64 8
Enemy 6 2544 160 8
Enemy 6 2544 320 8
Enemy 6 2592 128 8
Enemy 6 2640 128 8
Enemy 6 2640 192 8
Enemy 6 2688 128 8
Enemy 6 2736 256 8
Enemy 6 2784 384 8
Enemy 6 2880 96 8
Enemy 6 2880 128 8
Enemy 6 2880 352 8
Enemy 6 2928 224 8
Enemy 6 2976 64 8
Enemy 6 2976 384 8
Enemy 6 3168 32 12
Enemy 6 3216 32 12
Enemy 6 3264 32 12
Enemy 6 3312 32 12
Enemy 6 3360 32 12
Enemy 6 3360 96 12
Enemy 6 3360 160 12
Enemy 6 3408 288 12
Enemy 6 3456 352 12
Enemy 6 3456 384 12
Enemy 6 3456 448 12
Enemy 6 3504 416 12
Enemy 6 3552 416 12
Enemy 6 3552 448 12
Enemy 6 3600 448 12
Enemy 1 3936 352 12
Enemy 1 3936 416 12
Enemy 1 3984 128 12
Enemy 1 3984 288 12
Enemy 1 4032 64 12
Enemy 1 4080 160 12
Enemy 6 4128 0 2
Enemy 6 4128 32 2
Enemy 6 4128 256 2
Enemy 6 4128 352 2
Enemy 6 4128 384 2
Enemy 6 4128 416 2
Enemy 6 4176 96 2
Enemy 6 4176 160 2
Enemy 6 4176 224 2
Enemy 6 4176 384 2
Enemy 6 4224 224 2
Enemy 5 4320 64 3
Enemy 5 4320 128 3
Enemy 5 4368 0 3
Enemy 5 4368 192 3
Enemy 5 4368 288 3
Enemy 5 4368 352 3
Enemy 5 4368 416 3
Enemy 2 4752 96 9
Enemy 2 4752 192 9
Enemy 2 4800 32 9
Enemy 2 4800 288 9
Enemy 2 4896 352 9
Enemy 2 4992 32 9
Enemy 2 4992 352 9
; SpaceMission 1.0
; LEV-File
1200
1
192
64
1
1
288
192
1
1
288
352
1
1
288
64
1
1
336
256
1
1
384
160
1
1
432
352
1
1
816
384
16
1
864
384
16
1
864
352
16
1
912
320
16
1
912
288
16
1
960
288
16
1
1008
288
16
1
1056
256
16
1
1104
192
16
1
1152
160
16
1
1152
96
16
1
1296
448
16
4
1968
 
 
4
2016
128
 
4
2016
416
 
6
2016
352
8
6
2064
352
8
6
2064
224
8
4
2112
128
 
4
2160
96
 
4
2160
32
 
4
2160
160
 
6
2160
288
8
4
2208
32
 
4
2208
416
 
6
2256
320
8
4
2304
192
 
4
2304
416
 
6
2304
288
8
6
2304
352
8
4
2352
96
 
6
2496
192
8
6
2544
64
8
6
2544
160
8
6
2544
320
8
6
2592
128
8
6
2640
192
8
6
2640
128
8
6
2688
128
8
6
2736
256
8
6
2784
384
8
6
2880
352
8
6
2880
96
8
6
2880
128
8
6
2928
224
8
6
2976
384
8
6
2976
64
8
6
3168
32
12
6
3216
32
12
6
3264
32
12
6
3312
32
12
6
3360
32
12
6
3360
96
12
6
3360
160
12
6
3408
288
12
6
3456
352
12
6
3456
384
12
6
3456
448
12
6
3504
416
12
6
3552
416
12
6
3552
448
12
6
3600
448
12
1
3936
352
12
1
3936
416
12
1
3984
288
12
1
3984
128
12
1
4032
64
12
1
4080
160
12
6
4128
 
2
6
4128
32
2
6
4128
256
2
6
4128
352
2
6
4128
416
2
6
4128
384
2
6
4176
96
2
6
4176
384
2
6
4176
224
2
6
4176
160
2
6
4224
224
2
5
4320
64
3
5
4320
128
3
5
4368
 
3
5
4368
192
3
5
4368
288
3
5
4368
352
3
5
4368
416
3
2
4752
96
9
2
4752
192
9
2
4800
32
9
2
4800
288
9
2
4896
352
9
2
4992
352
9
2
4992
32
9
/Levels/Level 25.lev
1,34 → 1,119
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 25
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 240 32 0
Enemy 1 336 96 5
Enemy 4 384 288 0
Enemy 4 528 64 0
Enemy 4 528 192 0
Enemy 4 528 384 0
Enemy 1 672 32 5
Enemy 1 672 416 5
Enemy 4 768 352 0
Enemy 1 816 192 5
Enemy 2 864 64 5
Enemy 4 912 160 0
Enemy 1 1008 352 5
Enemy 4 1152 32 0
Enemy 2 1296 288 5
Enemy 4 1440 320 0
Enemy 2 1488 64 5
Enemy 4 1680 96 0
Enemy 6 1680 384 5
Enemy 5 1776 64 5
Enemy 4 1776 320 0
Enemy 4 2064 64 0
Enemy 4 2064 288 0
Enemy 4 2352 64 0
Enemy 4 2352 320 0
Enemy 5 2496 64 5
Enemy 5 2496 384 5
Enemy 3 2880 192 14
Enemy 3 2880 224 14
; SpaceMission 1.0
; LEV-File
1200
4
240
32
 
1
336
96
5
4
384
288
 
4
528
64
 
4
528
384
 
4
528
192
 
1
672
32
5
1
672
416
5
4
768
352
 
1
816
192
5
2
864
64
5
4
912
160
 
1
1008
352
5
4
1152
32
 
2
1296
288
5
4
1440
320
 
2
1488
64
5
4
1680
96
 
6
1680
384
5
4
1776
320
 
5
1776
64
5
4
2064
64
 
4
2064
288
 
4
2352
320
 
4
2352
64
 
5
2496
64
5
5
2496
384
5
3
2880
224
14
3
2880
192
14
/Levels/Level 16.lev
1,80 → 1,303
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 16
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 192 64 0
Enemy 4 192 384 0
Enemy 4 240 256 0
Enemy 1 384 32 1
Enemy 1 384 160 1
Enemy 1 384 224 1
Enemy 1 384 288 1
Enemy 1 384 416 1
Enemy 1 432 64 1
Enemy 1 432 192 1
Enemy 1 432 224 1
Enemy 1 432 256 1
Enemy 1 432 384 1
Enemy 4 576 160 0
Enemy 4 576 416 0
Enemy 4 624 32 0
Enemy 2 768 32 1
Enemy 2 768 160 1
Enemy 2 768 224 1
Enemy 2 768 288 1
Enemy 2 768 416 1
Enemy 2 816 64 1
Enemy 2 816 192 1
Enemy 2 816 224 1
Enemy 2 816 256 1
Enemy 2 816 384 1
Enemy 4 912 64 0
Enemy 4 960 384 0
Enemy 4 1152 160 0
Enemy 3 1200 32 1
Enemy 3 1200 160 1
Enemy 3 1200 224 1
Enemy 3 1200 288 1
Enemy 3 1200 416 1
Enemy 3 1248 64 1
Enemy 3 1248 192 1
Enemy 3 1248 224 1
Enemy 3 1248 256 1
Enemy 3 1248 384 1
Enemy 4 1488 32 0
Enemy 4 1536 256 0
Enemy 4 1584 352 0
Enemy 5 1776 32 1
Enemy 5 1776 160 1
Enemy 5 1776 224 1
Enemy 5 1776 288 1
Enemy 5 1776 416 1
Enemy 5 1824 64 1
Enemy 5 1824 192 1
Enemy 5 1824 224 1
Enemy 5 1824 256 1
Enemy 5 1824 384 1
Enemy 4 1968 32 0
Enemy 4 2064 96 0
Enemy 4 2112 224 0
Enemy 4 2112 288 0
Enemy 6 2256 32 1
Enemy 6 2256 160 1
Enemy 6 2256 224 1
Enemy 6 2256 288 1
Enemy 6 2256 416 1
Enemy 6 2304 64 1
Enemy 6 2304 192 1
Enemy 6 2304 224 1
Enemy 6 2304 256 1
Enemy 6 2304 384 1
Enemy 4 2496 64 0
Enemy 4 2496 384 0
Enemy 4 2640 224 0
Enemy 5 2832 160 15
Enemy 5 2832 192 15
Enemy 5 2832 224 15
Enemy 5 2832 256 15
Enemy 5 2832 288 15
Enemy 5 2832 320 15
; SpaceMission 1.0
; LEV-File
1200
4
192
64
 
4
192
384
 
4
240
256
 
1
384
32
1
1
384
416
1
1
384
224
1
1
384
288
1
1
384
160
1
1
432
64
1
1
432
384
1
1
432
224
1
1
432
256
1
1
432
192
1
4
576
160
 
4
576
416
 
4
624
32
 
2
768
32
1
2
768
160
1
2
768
224
1
2
768
288
1
2
768
416
1
2
816
64
1
2
816
192
1
2
816
224
1
2
816
256
1
2
816
384
1
4
912
64
 
4
960
384
 
4
1152
160
 
3
1200
32
1
3
1200
160
1
3
1200
288
1
3
1200
224
1
3
1200
416
1
3
1248
64
1
3
1248
192
1
3
1248
224
1
3
1248
256
1
3
1248
384
1
4
1488
32
 
4
1536
256
 
4
1584
352
 
5
1776
32
1
5
1776
160
1
5
1776
288
1
5
1776
224
1
5
1776
416
1
5
1824
64
1
5
1824
192
1
5
1824
224
1
5
1824
256
1
5
1824
384
1
4
1968
32
 
4
2064
96
 
4
2112
224
 
4
2112
288
 
6
2256
32
1
6
2256
160
1
6
2256
288
1
6
2256
224
1
6
2256
416
1
6
2304
64
1
6
2304
192
1
6
2304
224
1
6
2304
256
1
6
2304
384
1
4
2496
64
 
4
2496
384
 
4
2640
224
 
5
2832
192
15
5
2832
224
15
5
2832
256
15
5
2832
288
15
5
2832
320
15
5
2832
160
15
/Levels/Level 17.lev
1,47 → 1,171
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 17
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 3 144 128 1
Enemy 3 336 352 1
Enemy 4 432 128 0
Enemy 4 480 0 0
Enemy 3 528 224 12
Enemy 3 768 64 12
Enemy 4 768 192 0
Enemy 3 864 416 12
Enemy 3 912 96 12
Enemy 4 912 192 0
Enemy 5 1152 160 12
Enemy 5 1200 384 12
Enemy 3 1248 256 12
Enemy 3 1296 64 12
Enemy 4 1392 64 0
Enemy 4 1392 320 0
Enemy 4 1536 224 0
Enemy 5 1536 416 12
Enemy 4 1584 32 0
Enemy 3 1632 192 12
Enemy 3 1632 352 12
Enemy 3 1872 160 12
Enemy 3 2064 320 12
Enemy 1 2304 64 12
Enemy 1 2400 448 12
Enemy 1 2496 224 12
Enemy 5 2592 32 14
Enemy 5 2784 32 14
Enemy 5 2784 256 12
Enemy 5 2832 384 12
Enemy 2 2976 384 16
Enemy 2 3024 256 16
Enemy 4 3072 96 0
Enemy 4 3216 320 0
Enemy 4 3312 96 0
Enemy 4 3360 288 0
Enemy 2 3408 32 16
Enemy 2 3504 448 16
Enemy 3 3648 32 12
Enemy 2 3648 192 12
Enemy 2 3648 320 12
Enemy 7 4368 256 16
; SpaceMission 1.0
; LEV-File
1200
3
144
128
1
3
336
352
1
4
432
128
 
4
480
 
 
3
528
224
12
3
768
64
12
4
768
192
 
3
864
416
12
3
912
96
12
4
912
192
 
5
1152
160
12
5
1200
384
12
3
1248
256
12
3
1296
64
12
4
1392
320
 
4
1392
64
 
4
1536
224
 
5
1536
416
12
4
1584
32
 
3
1632
352
12
3
1632
192
12
3
1872
160
12
3
2064
320
12
1
2304
64
12
1
2400
448
12
1
2496
224
12
5
2592
32
14
5
2784
256
12
5
2784
32
14
5
2832
384
12
2
2976
384
16
2
3024
256
16
4
3072
96
 
4
3216
320
 
4
3312
96
 
4
3360
288
 
2
3408
32
16
2
3504
448
16
2
3648
192
12
2
3648
320
12
3
3648
32
12
7
4368
256
16
/Levels/Level 26.lev
1,55 → 1,203
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 26
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 5 240 128 1
Enemy 5 240 160 1
Enemy 5 240 192 1
Enemy 5 240 224 1
Enemy 5 240 256 1
Enemy 5 240 288 1
Enemy 5 240 320 1
Enemy 5 288 128 1
Enemy 5 288 320 1
Enemy 5 336 160 1
Enemy 5 336 192 1
Enemy 5 336 224 1
Enemy 5 336 256 1
Enemy 5 336 288 1
Enemy 5 432 128 1
Enemy 5 432 160 1
Enemy 5 432 192 1
Enemy 5 432 224 1
Enemy 5 432 256 1
Enemy 5 432 288 1
Enemy 5 432 320 1
Enemy 5 480 160 1
Enemy 5 528 192 1
Enemy 5 576 224 1
Enemy 5 624 192 1
Enemy 5 672 160 1
Enemy 5 720 128 1
Enemy 5 720 160 1
Enemy 5 720 192 1
Enemy 5 720 224 1
Enemy 5 720 256 1
Enemy 5 720 288 1
Enemy 5 720 320 1
Enemy 5 816 160 1
Enemy 5 816 192 1
Enemy 5 816 224 1
Enemy 5 816 256 1
Enemy 5 816 288 1
Enemy 5 864 128 1
Enemy 5 864 320 1
Enemy 5 960 160 1
Enemy 5 960 192 1
Enemy 5 960 224 1
Enemy 5 960 320 1
Enemy 5 1008 128 1
Enemy 5 1008 224 1
Enemy 5 1008 320 1
Enemy 5 1056 128 1
Enemy 5 1056 256 1
Enemy 5 1056 288 1
; SpaceMission 1.0
; LEV-File
1200
5
240
320
1
5
240
288
1
5
240
256
1
5
240
224
1
5
240
192
1
5
240
160
1
5
240
128
1
5
288
128
1
5
288
320
1
5
336
160
1
5
336
192
1
5
336
224
1
5
336
256
1
5
336
288
1
5
432
320
1
5
432
288
1
5
432
256
1
5
432
224
1
5
432
192
1
5
432
160
1
5
432
128
1
5
480
160
1
5
528
192
1
5
576
224
1
5
624
192
1
5
672
160
1
5
720
128
1
5
720
160
1
5
720
192
1
5
720
224
1
5
720
256
1
5
720
288
1
5
720
320
1
5
816
160
1
5
816
192
1
5
816
224
1
5
816
256
1
5
816
288
1
5
864
128
1
5
864
320
1
5
960
160
1
5
960
192
1
5
960
224
1
5
960
320
1
5
1008
128
1
5
1008
224
1
5
1008
320
1
5
1056
128
1
5
1056
256
1
5
1056
288
1
/Levels/Level 27.lev
1,27 → 1,91
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 27
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 4 48 32 0
Enemy 4 288 384 0
Enemy 4 480 288 0
Enemy 1 528 224 10
Enemy 4 576 64 0
Enemy 4 768 96 0
Enemy 4 960 96 0
Enemy 4 960 320 0
Enemy 4 1104 352 0
Enemy 4 1200 128 0
Enemy 2 1200 224 10
Enemy 4 1344 288 0
Enemy 4 1440 192 0
Enemy 4 1584 96 0
Enemy 4 1584 192 0
Enemy 4 1632 384 0
Enemy 5 1680 32 10
Enemy 4 1680 224 0
Enemy 6 1680 416 10
Enemy 4 1776 352 0
Enemy 4 1824 96 0
Enemy 3 1920 224 10
; SpaceMission 1.0
; LEV-File
1200
4
48
32
 
4
288
384
 
4
480
288
 
1
528
224
10
4
576
64
 
4
768
96
 
4
960
96
 
4
960
320
 
4
1104
352
 
4
1200
128
 
2
1200
224
10
4
1344
288
 
4
1440
192
 
4
1584
192
 
4
1584
96
 
4
1632
384
 
4
1680
224
 
5
1680
32
10
6
1680
416
10
4
1776
352
 
4
1824
96
 
3
1920
224
10
/Levels/Level 18.lev
1,68 → 1,255
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 18
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 6 144 160 1
Enemy 6 192 384 1
Enemy 6 240 32 1
Enemy 6 336 160 1
Enemy 6 384 384 1
Enemy 6 480 192 1
Enemy 2 672 96 1
Enemy 2 720 32 1
Enemy 3 1008 352 3
Enemy 3 1248 448 3
Enemy 3 1392 128 3
Enemy 5 1536 352 5
Enemy 5 1584 64 5
Enemy 5 1632 416 5
Enemy 5 1680 352 5
Enemy 5 1728 64 5
Enemy 5 1824 448 5
Enemy 6 2064 32 6
Enemy 6 2064 128 6
Enemy 6 2064 256 6
Enemy 3 2976 64 5
Enemy 3 3024 160 5
Enemy 3 3024 288 5
Enemy 3 3120 384 5
Enemy 2 3456 32 5
Enemy 2 3456 128 5
Enemy 2 3552 416 5
Enemy 5 3744 160 3
Enemy 5 3936 96 3
Enemy 5 3984 384 3
Enemy 1 4368 256 3
Enemy 1 4416 32 3
Enemy 1 4416 416 3
Enemy 6 4800 448 9
Enemy 6 4896 128 3
Enemy 6 5040 32 6
Enemy 6 5040 448 6
Enemy 3 5328 64 2
Enemy 3 5472 160 1
Enemy 3 5472 256 1
Enemy 3 5472 320 1
Enemy 1 5904 288 8
Enemy 1 5904 320 8
Enemy 1 5904 352 8
Enemy 1 5904 384 8
Enemy 1 5904 416 8
Enemy 1 5904 448 8
Enemy 1 6000 288 8
Enemy 1 6000 320 8
Enemy 1 6000 352 8
Enemy 1 6000 384 8
Enemy 1 6000 416 8
Enemy 1 6000 448 8
Enemy 1 6048 288 8
Enemy 1 6048 352 8
Enemy 1 6048 384 8
Enemy 1 6048 448 8
Enemy 1 6096 288 8
Enemy 1 6096 320 8
Enemy 1 6096 352 8
Enemy 1 6096 384 8
Enemy 1 6096 416 8
Enemy 1 6096 448 8
; SpaceMission 1.0
; LEV-File
1200
6
144
160
1
6
192
384
1
6
240
32
1
6
336
160
1
6
384
384
1
6
480
192
1
2
672
96
1
2
720
32
1
3
1008
352
3
3
1248
448
3
3
1392
128
3
5
1536
352
5
5
1584
64
5
5
1632
416
5
5
1680
352
5
5
1728
64
5
5
1824
448
5
6
2064
32
6
6
2064
128
6
6
2064
256
6
3
2976
64
5
3
3024
160
5
3
3024
288
5
3
3120
384
5
2
3456
32
5
2
3456
128
5
2
3552
416
5
5
3744
160
3
5
3936
96
3
5
3984
384
3
1
4368
256
3
1
4416
32
3
1
4416
416
3
6
4800
448
9
6
4896
128
3
6
5040
448
6
6
5040
32
6
3
5328
64
2
3
5472
256
1
3
5472
160
1
3
5472
320
1
1
5904
448
8
1
5904
416
8
1
5904
384
8
1
5904
320
8
1
5904
352
8
1
5904
288
8
1
6000
320
8
1
6000
352
8
1
6000
384
8
1
6000
416
8
1
6000
448
8
1
6000
288
8
1
6048
448
8
1
6048
288
8
1
6048
352
8
1
6048
384
8
1
6096
320
8
1
6096
352
8
1
6096
384
8
1
6096
416
8
1
6096
448
8
1
6096
288
8
/Levels/Level 19.lev
1,70 → 1,263
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 19
Author Andreas Kübelsbeck
Width 1200
; Type XCoord YCoord Lives
Enemy 1 240 128 1
Enemy 1 288 64 1
Enemy 1 480 288 1
Enemy 1 528 64 1
Enemy 5 720 128 7
Enemy 5 864 320 7
Enemy 5 912 416 7
Enemy 5 960 32 7
Enemy 6 1200 352 7
Enemy 6 1296 0 7
Enemy 6 1296 256 7
Enemy 6 1392 416 7
Enemy 6 1488 96 7
Enemy 2 1728 384 7
Enemy 2 1824 224 7
Enemy 2 1872 448 7
Enemy 4 2304 128 0
Enemy 4 2304 352 0
Enemy 2 2688 352 7
Enemy 4 2736 64 0
Enemy 6 2832 0 7
Enemy 6 2832 448 7
Enemy 3 3072 320 7
Enemy 3 3168 160 7
Enemy 3 3168 384 7
Enemy 5 3456 32 7
Enemy 5 3600 416 7
Enemy 4 3696 224 0
Enemy 4 3792 416 0
Enemy 4 3840 64 0
Enemy 3 4032 320 7
Enemy 3 4032 448 7
Enemy 3 4080 96 7
Enemy 4 4176 448 0
Enemy 1 4416 192 7
Enemy 1 4608 96 7
Enemy 1 4608 416 7
Enemy 3 4704 288 5
Enemy 5 4896 64 5
Enemy 1 4944 448 5
Enemy 3 4992 416 5
Enemy 5 5184 32 5
Enemy 5 5184 96 5
Enemy 5 5232 224 5
Enemy 2 5952 64 5
Enemy 2 5952 96 5
Enemy 2 5952 224 5
Enemy 2 5952 416 5
Enemy 2 6048 416 5
Enemy 6 6240 128 5
Enemy 6 6240 192 5
Enemy 6 6240 416 5
Enemy 6 6288 384 5
Enemy 6 6288 416 5
Enemy 4 6384 64 0
Enemy 4 6480 128 0
Enemy 4 6528 256 0
Enemy 6 6576 32 7
Enemy 6 6672 96 7
Enemy 6 6672 256 7
Enemy 5 6816 0 7
Enemy 5 6864 96 7
Enemy 5 6960 384 7
Enemy 5 7104 416 7
Enemy 7 7296 256 16
; SpaceMission 1.0
; LEV-File
1200
1
240
128
1
1
288
64
1
1
480
288
1
1
528
64
1
5
720
128
7
5
864
320
7
5
912
416
7
5
960
32
7
6
1200
352
7
6
1296
 
7
6
1296
256
7
6
1392
416
7
6
1488
96
7
2
1728
384
7
2
1824
224
7
2
1872
448
7
4
2304
128
 
4
2304
352
 
2
2688
352
7
4
2736
64
 
6
2832
448
7
6
2832
 
7
3
3072
320
7
3
3168
160
7
3
3168
384
7
5
3456
32
7
5
3600
416
7
4
3696
224
 
4
3792
416
 
4
3840
64
 
3
4032
320
7
3
4032
448
7
3
4080
96
7
4
4176
448
 
1
4416
192
7
1
4608
96
7
1
4608
416
7
3
4704
288
5
5
4896
64
5
1
4944
448
5
3
4992
416
5
5
5184
32
5
5
5184
96
5
5
5232
224
5
2
5952
64
5
2
5952
96
5
2
5952
224
5
2
5952
416
5
2
6048
416
5
6
6240
128
5
6
6240
192
5
6
6240
416
5
6
6288
416
5
6
6288
384
5
4
6384
64
 
4
6480
128
 
4
6528
256
 
6
6576
32
7
6
6672
96
7
6
6672
256
7
5
6816
 
7
5
6864
96
7
5
6960
384
7
5
7104
416
7
7
7296
256
16
/Levels/Level 28.lev
1,24 → 1,79
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 28
Author Daniel Marschall
Width 1200
; Type XCoord YCoord Lives
Enemy 5 96 128 1
Enemy 2 240 224 30
Enemy 4 288 352 0
Enemy 1 336 64 30
Enemy 4 336 224 0
Enemy 4 384 128 0
Enemy 4 384 352 0
Enemy 1 432 320 30
Enemy 1 528 224 30
Enemy 1 528 384 30
Enemy 1 672 128 30
Enemy 4 816 288 0
Enemy 6 912 128 30
Enemy 6 960 416 30
Enemy 6 1104 224 30
Enemy 5 1200 96 30
Enemy 3 1536 192 30
Enemy 3 1632 128 30
Enemy 3 1632 288 30
; SpaceMission 1.0
; LEV-File
1200
5
96
128
1
2
240
224
30
4
288
352
 
4
336
224
 
1
336
64
30
4
384
128
 
4
384
352
 
1
432
320
30
1
528
384
30
1
528
224
30
1
672
128
30
4
816
288
 
6
912
128
30
6
960
416
30
6
1104
224
30
5
1200
96
30
3
1536
192
30
3
1632
128
30
3
1632
288
30
/Levels/Level 29.lev
1,48 → 1,175
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 29
Author Daniel Marschall
Width 1200
; Type XCoord YCoord Lives
Enemy 1 96 0 1
Enemy 1 96 64 1
Enemy 1 144 32 1
Enemy 1 144 96 1
Enemy 5 384 32 1
Enemy 5 528 320 1
Enemy 5 624 96 1
Enemy 5 720 352 1
Enemy 3 1008 96 1
Enemy 1 1008 288 1
Enemy 1 1056 448 1
Enemy 1 1104 192 1
Enemy 1 1152 416 1
Enemy 1 1200 32 1
Enemy 1 1248 128 1
Enemy 1 1248 320 1
Enemy 4 1392 192 0
Enemy 1 1392 288 1
Enemy 1 1440 64 1
Enemy 1 1440 224 1
Enemy 1 1440 416 1
Enemy 4 1536 32 0
Enemy 1 1536 96 1
Enemy 4 1536 160 0
Enemy 4 1536 384 0
Enemy 4 1584 224 0
Enemy 1 1584 320 1
Enemy 4 1632 96 0
Enemy 1 1632 160 1
Enemy 4 1680 256 0
Enemy 1 1728 64 1
Enemy 1 1728 352 1
Enemy 1 1776 160 1
Enemy 4 1872 160 0
Enemy 4 1920 64 0
Enemy 4 1920 288 0
Enemy 6 1968 224 1
Enemy 6 2064 96 1
Enemy 6 2064 288 1
Enemy 6 2112 384 1
Enemy 5 2160 32 1
Enemy 2 2256 192 1
Enemy 7 2496 192 30
; SpaceMission 1.0
; LEV-File
1200
1
96
 
1
1
96
64
1
1
144
32
1
1
144
96
1
5
384
32
1
5
528
320
1
5
624
96
1
5
720
352
1
3
1008
96
1
1
1008
288
1
1
1056
448
1
1
1104
192
1
1
1152
416
1
1
1200
32
1
1
1248
320
1
1
1248
128
1
1
1392
288
1
4
1392
192
1
1
1440
64
1
1
1440
224
1
1
1440
416
1
1
1536
96
1
4
1536
160
1
4
1536
32
1
4
1536
384
1
1
1584
320
1
4
1584
224
1
1
1632
160
1
4
1632
96
1
4
1680
256
1
1
1728
64
1
1
1728
352
1
1
1776
160
1
4
1872
160
1
4
1920
64
1
4
1920
288
1
6
1968
224
1
6
2064
288
1
6
2064
96
1
6
2112
384
1
5
2160
32
1
2
2256
192
1
7
2496
192
30
/Levels/Level 1.lev
1,29 → 1,99
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 1
Author Daniel Marschall
Width 1200
; Type XCoord YCoord Lives
Enemy 5 144 32 1
Enemy 5 144 384 1
Enemy 5 240 128 1
Enemy 5 336 288 1
Enemy 1 576 64 1
Enemy 1 672 448 1
Enemy 1 768 256 1
Enemy 1 864 64 1
Enemy 1 960 384 1
Enemy 5 1104 128 1
Enemy 5 1296 32 1
Enemy 5 1296 192 1
Enemy 1 1392 416 1
Enemy 1 1440 384 1
Enemy 1 1488 352 1
Enemy 1 1536 320 1
Enemy 1 1584 320 1
Enemy 4 1632 32 0
Enemy 1 1632 320 1
Enemy 1 1680 320 1
Enemy 4 1872 32 0
Enemy 4 1968 256 0
Enemy 4 1968 384 0
Enemy 4 2112 96 0
; SpaceMission 1.0
; LEV-File
1200
5
144
32
1
5
144
384
1
5
240
128
1
5
336
288
1
1
576
64
1
1
672
448
1
1
768
256
1
1
864
64
1
1
960
384
1
5
1104
128
1
5
1296
32
1
5
1296
192
1
1
1392
416
1
1
1440
384
1
1
1488
352
1
1
1536
320
1
1
1584
320
1
1
1632
320
1
4
1632
32
 
1
1680
320
1
4
1872
32
 
4
1968
256
 
4
1968
384
 
4
2112
96
 
/Levels/Level 2.lev
1,24 → 1,79
[1.3.6.1.4.1.37476.2.8.1.1]
Name Level 2
Author Patrick Büssecker
Width 1200
; Type XCoord YCoord Lives
Enemy 1 432 64 1
Enemy 1 432 224 1
Enemy 1 432 384 1
Enemy 1 912 64 1
Enemy 1 912 224 1
Enemy 1 912 384 1
Enemy 1 1392 64 1
Enemy 1 1392 224 1
Enemy 1 1392 384 1
Enemy 1 1872 64 1
Enemy 1 1872 224 1
Enemy 1 1872 384 1
Enemy 5 2256 128 1
Enemy 5 2400 320 1
Enemy 5 2496 64 1
Enemy 5 2544 256 1
Enemy 3 3120 192 3
Enemy 3 3120 224 3
Enemy 3 3120 256 3
; SpaceMission 1.0
; LEV-File
1200
1
432
64
1
1
432
384
1
1
432
224
1
1
912
64
1
1
912
384
1
1
912
224
1
1
1392
64
1
1
1392
224
1
1
1392
384
1
1
1872
64
1
1
1872
224
1
1
1872
384
1
5
2256
128
1
5
2400
320
1
5
2496
64
1
5
2544
256
1
3
3120
192
3
3
3120
224
3
3
3120
256
3
/Levels
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/SplSplash.pas
0,0 → 1,35
unit SplSplash;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
jpeg, ExtCtrls, StdCtrls;
 
type
TSplashForm = class(TForm)
SplashImage: TImage;
procedure FormCreate(Sender: TObject);
end;
 
var
SplashForm: TSplashForm;
 
implementation
 
uses
SplMain;
 
{$R *.DFM}
 
procedure TSplashForm.FormCreate(Sender: TObject);
var
FDirectory: string;
begin
if copy(extractfiledir(application.ExeName), length(extractfiledir(application.ExeName))-1, 2) = ':\' then FDirectory := ''
else FDirectory := extractfiledir(application.ExeName)+'\';
SplashImage.Picture.loadfromfile(FDirectory+'Bilder/SplSplash.jpg');
end;
 
end.
 
/SplInfo.pas
0,0 → 1,75
unit SplInfo;
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ShellAPI, ExtCtrls;
 
type
TInfoForm = class(TForm)
ElPopupButton1: TButton;
HomeLbl: TLabel;
Image: TImage;
FirmaLbl: TLabel;
NameLbl: TLabel;
VersionLbl: TLabel;
EMailLbl: TLabel;
CopyrightLbl: TLabel;
Copyright2Lbl: TLabel;
URL2: TLabel;
URL1: TLabel;
procedure ElPopupButton1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure URL2Click(Sender: TObject);
procedure URL1Click(Sender: TObject);
end;
 
var
InfoForm: TInfoForm;
 
implementation
 
uses
SplMain;
 
{$R *.DFM}
 
procedure TInfoForm.ElPopupButton1Click(Sender: TObject);
begin
close;
end;
 
procedure TInfoForm.FormCreate(Sender: TObject);
begin
VersionLbl.caption := 'Version ' + mainform.fengineversion;
CopyrightLbl.caption := mainform.versioninfo.LegalCopyright + '.';
FirmaLbl.caption := mainform.versioninfo.CompanyName;
NameLbl.caption := 'SpaceMission';
image.picture.loadfromfile(mainform.FDirectory + 'Bilder\Delphi.bmp');
end;
 
procedure TInfoForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
end;
 
procedure TInfoForm.FormHide(Sender: TObject);
begin
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
end;
 
procedure TInfoForm.URL2Click(Sender: TObject);
begin
shellexecute(application.Handle, 'open', pchar('http://'+url2.caption+'/'), nil, nil, SW_SHOW);
end;
 
procedure TInfoForm.URL1Click(Sender: TObject);
begin
shellexecute(application.Handle, 'open', pchar('mailto:'+url1.Caption+'?subject=SpaceMission ' + mainform.fengineversion), nil, nil, SW_SHOW);
end;
 
end.
 
/Compiler.dpr
0,0 → 1,30
program Compiler;
 
uses
SysUtils,
Windows,
Forms,
Dialogs,
ComMain in 'ComMain.pas' {MainForm};
 
{$Description 'SpaceMission 1.1 Compiler'}
 
var
Sem: THandle;
 
{$R *.RES}
 
begin
{ Programm schon gestartet? }
Sem := CreateSemaphore(nil, 0, 1, 'SpaceMission Compiler');
if (Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
begin
CloseHandle(Sem);
MessageDlg('Das Programm wurde bereits gestartet.', mtInformation, [mbOK], 0);
exit;
end;
Application.Initialize;
Application.Title := 'Levelcompiler';
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
/VCL_PJVERSIONINFO/PJVersionInfo.htm
0,0 → 1,282
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
 
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>PJSoft Info Sheet: TPJVersionInfo Component (32 bit)</TITLE>
<BASE target="_blank">
</HEAD>
 
<BODY>
<h1>TPJVersionInfo Component (32 bit)</h1>
<p></P>
 
<P>
<HR noshade>
<p></P>
 
<H2>Contents</H2>
 
<UL>
<LI><A HREF="#Description" target="_self">Description</A>
<LI><A HREF="#Compatibility" target="_self">Compatibility</A>
<LI><A HREF="#Installation" target="_self">Installation</A>
<LI><A HREF="#Issues" target="_self">Known Issues</A>
<LI><A HREF="#Update" target="_self">Update History</A>
<LI><A HREF="#License" target="_self">License and Disclaimer</A>
<LI><A HREF="#Author" target="_self">About the Author</A>
</UL>
 
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="Description"></A>Description</H2>
 
<P>This is a 32 bit non-visual component for Delphi 2 to 6 that encapsulates file
version resource information contained in a file.</P>
 
<P>The component reads information from the file's VERSIONINFO resource. If the
file has no such resource then this component returns no information. The HaveInfo
property informs whether the component has been able to get version information
from the file. The 32 bit version of TPJVersionInfo can access variable file
information for each language provided in the resource.</P>
 
<P>The file from which resource information is gleaned is determined by the FileName
property. Setting the file name property to the empty string makes the component
read information from the executable file in which it embedded. Apart from the
usual Name and Tag properties the FileName property is the only design-time
property of the component. With the exception of the property that selects the
language for which variable file information is to be returned, all other properties
are read only. These properties present the information from the VERSIONINFO
resource to the user. See the help file for further information.</P>
<P>The component introduces no new methods and it has no events.</P>
 
<H3>Limitations</H3>
 
<P>This version of the component makes calls to the 32 bit Windows API. It is
not suitable for compilation using the 16 bit Delphi 1 compiler.</P>
 
<H3>Further information</H3>
 
<P>For detailed information about file version information refer to the Win32
SDK.</P>
 
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="Compatibility"></A>Compatibility</H2>
 
<P>This version of the component works only with 32 bit versions of Delphi. It
has been tested with Delphi versions 2, 3, 4 and 6. It is assumed to work correctly
with Delphi 5. A separate version of the component is available for 16 bit Delphi
1.</P>
 
<P>The unit name has changed to <code>PJVersionInfo</code> in this release of
the code - this means that programs using earlier versions will need to be modified
(or to have an alias set in Delphi's Project Options) before being recompiled
using the new version.</P>
<P>This component is backward compatible with previous 32 bit releases. In previous
releases the help file was designed for integration with the Delphi 2 IDE but
was not compatible with the OpenHelp system used from Delphi 3 onwards. From
this release the help file has been updated to integrate with the Delphi 3 and
later IDE. It is no longer compatible with the Delphi 2 IDE, although can be
used separately.</P>
 
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="Installation"></A>Installation</H2>
 
<P>In these instructions <CODE><STRONG>$(DELPHI)</STRONG></CODE> is to be taken to represent the path where your 32 bit version of Delphi was installed. For example, if you have Delphi 4 installed on the path <CODE>C:\Program&nbsp;Files\Borland\Delphi4</CODE> then <CODE>$(DELPHI)</CODE> represents that path.</P>
 
<H3>Installation with Delphi 2</H3>
 
<p>Note that although the provided help file gives information about using the
component it cannot be linked into the Delphi 2 environment.</p>
<OL>
<LI>Unzip the component's <code>.zip</code> file into a folder, preserving the
directory structure.
<li>Copy the files <CODE>PJVersionInfo.pas</CODE> and <CODE>PJVersionInfo.dcr</CODE>
to the folder from where you wish to install the component into the Delphi
Component Palette. This will probably be an existing folder where you keep
the library components - say the default <CODE>$(DELPHI)\lib</CODE> folder.
</li>
<li>Start Delphi. Select the <EM>Options | Install Components</EM> menu option.
Click the <EM>Add</EM> button, then the <EM>Browse</EM> button and navigate
to the <CODE>PJVersionInfo.pas</CODE> file in the folder where you placed
it. Click <EM>OK</EM> to recompile the components library. </li>
<LI>You can now delete <code>PJVersionInfo.pas</code> from the place where you
copied it if you wish. The component will appear on a palette called <EM>PJ
Stuff</EM>. You can move the component to a different palette as required,
or hack the source code (before installing the component) by finding the <CODE>Register</CODE>
procedure at the end of the code and changing the string <CODE>'PJ stuff'</CODE>
to the name of the required palette.
</OL>
 
<H3>Installation with Delphi 3 and later</H3>
 
<OL>
<LI>Unzip the component's <code>.zip</code> file into a folder, preserving the
directory structure.
<li>Copy the files <CODE>PJVersionInfo.pas</CODE> and <CODE>PJVersionInfo.dcr</CODE>
to the folder from where you wish to install the component into the Delphi
Component Palette. This will probably be a sub-folder of the <CODE>$(DELPHI)\lib</CODE>
folder. </li>
<LI>Install the component into the palette by choosing the <EM>Component | Install
Component</EM> menu option. The following instructions assume you are installing
into the default "users components" package:
<UL>
<LI>Select the "Into existing package" page of the <EM>Install Components</EM>
dialogue box.
<LI>Browse to the folder where you saved <CODE>PJVersionInfo.pas</CODE>
and select the file.
<LI>Ensure that the "Package file name" edit box contains <CODE>$(DELPHI)\lib\dclusrX0.dpk</CODE>
(where X is the version number of Delphi).
<LI>Accept that the package will be rebuilt.
<LI>A dialogue box should be displayed saying that <em>TPJVersionInfo</em>
has been added to the component palette.
</UL>
<LI>You can now delete <CODE>PJVersionInfo.pas</CODE> from the place where you
copied it if you wish. The component will appear on a palette called <EM>PJ
Stuff</EM>. You can move the component to a different palette as required,
or hack the source code (before installing the program) by finding the <CODE>Register</CODE>
procedure at the end of the code and changing the string <CODE>'PJ stuff'</CODE>
to the name of the required palette.
<li>The simplest way to install the help file is to use the <em>PJSoft Component
Help Installer Expert,</em> available from my website. To install manually,
proceed as follows (replace X is your version of Delphi): </li>
<ul>
<li>Copy <code>PJVersionInfo.hlp</code> to whichever folder you wish to install
it to. </li>
<li>Create a text file named <code>PJVersionInfo.cfg</code> in your Delphi
Help folder. Enter the following two lines:<code><br>
&nbsp;&nbsp;&nbsp;:Index PJSoft Version Info Component=PJVersionInfo.hlp<br>
&nbsp;&nbsp;&nbsp;:Link PJVersionInfo.hlp</code><br>
</li>
<li>Edit the <code>DelphiX.cnt</code> file (where is is your Delphi version)
and add the line:<br>
<code>&nbsp;&nbsp;&nbsp;:Include PJVersionInfo.cfg </code></li>
<li>Using RegEdit open the key <code>HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Help</code>
and add a new string value named <code>PJVersionInfo.hlp</code> whose value
is the path where you copied the help file (probably <code>($DELPHI)\Help</code>).
</li>
</ul>
</OL>
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="Issues"></A>Known Issues</H2>
 
<UL>
<LI>None known.
</UL>
 
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="Update"></A>Update History</H2>
 
<P><STRONG>Unreleased</STRONG><BR>
<EM>VerInfo v1.0 of 26/04/1998</EM></P>
<UL>
<LI>Original version - 16 bit only.
</UL>
 
<P><STRONG>Unreleased</STRONG><BR>
<EM>VerInfo v2.0 of 06/12/1998</EM></P>
<UL>
<LI>Revised for use with Win32. Not compatible with v1.0 which continued to
be used with 16 bit Delphi (see <CODE>vinfo16.htm</CODE> for continued update
history of v1).
</UL>
 
<P><STRONG>Release 2.0.1 of 08/07/1999</STRONG><BR>
<EM>VerInfo v2.0.1 of 09/04/1999</EM> <BR>
(This release also included Release 1.0 of 16 bit VerInfo v1.0.1 - see <CODE>vinfo16.htm</CODE> for details).</P>
<UL>
<LI>Changed palette where component installs to "PJ Stuff" from "Own".
<LI>Added HTML documentation (shared documentation with Release 1.0.1).
</UL>
 
<P><STRONG>Release 2.1 of 28/11/1999</STRONG><BR><EM>VInfo v2.1 of 28/11/1999</EM>
<BR>(Separated 16 bit and 32 bits versions into separate releases).</P>
<UL>
<LI>Changed unit name from VerInfo to VInfo to allow component to install under Delphi 3 &amp; 4
(VerInfo clashes with an existing unit in these versions).
<LI>Removed superfluous conditional compilation directives.
<LI>Updated HTML documentation to separate 16 bit from 32 bit version, to to include
installation notes for Delphi 3/4 and to include update history.
</UL>
 
<P><strong>Release 3.0 of 17/02/2002</strong><br>
<em>PJVersionInfo v3.0 of 17/02/2002</em>
<ul>
<li>Added ability to access all "translations" stored in a file's version information,
rather than just first one. This has been done so that code using earlier
versions of this component should continue to work unchanged.
<li>Added new property to expose fixed file information record.
<li>Added new "string array" property to give access to string information by
name: this property can access any custom string information if the name is
known.
<li>Added properties to return number of "translations" and to select index
of "translation" to be used.
<li>Added properties to return language and character set codes in addition
to descriptive strings.
<li>All string info, language and character set properties now return values
from the currently selected translation (which defaults to the first translation
maintaining backward compatibilty).
<li>Empty FileName property now accesses name of host application per command
line rather than using Application.ExeName.
<li>CharSet property now returns '' for unknown value rather than 'Unknown'.
<li>Renamed TVersionNumber record to TPJVersionNumber.
<li>Replaced Tvs_FixedFileInfo record with use of Windows unit defined type
TVSFixedFileInfo
<li>Renamed unit to PJVersionInfo.
<li>Changed component palette from PJ Stuff to PJSoft.
</ul>
<p>
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="License"></A>License &amp; Disclaimer</H2>
 
<P>This component is copyright &copy; P.D.Johnson, 1998-2002.</P>
 
<P>The source code and help files can be freely distributed on a not-for-profit basis providing that:</P>
 
<OL>
<LI>the source code is not altered.
<LI>this readme file is distributed with it unchanged
</OL>
 
<P>By not-for-profit I mean that you may recover out of pocket expenses incurred in distributing the code, but should not make a profit from this.</P>
 
<P>If you discover any bugs in this implementation, or if you have any update suggestions, please contact me on <A HREF="mailto:peter.johnson@openlink.org">peter.johnson@openlink.org</A>.</P>
 
<P>Please do modify the code for you own use. I'd like to see any changes you make - I could incorporate them into future versions. Please notify me of changes on at the above e-mail address.</P>
 
<P>This software is provided as is - no warranty is given as to its suitability for any purposes to which you may wish to put it.</P>
 
<P>
<HR noshade>
<p></P>
 
<H2><A NAME="Author"></A>About the Author</H2>
 
<P>I'm Peter Johnson - a hobbyist programmer living in Ceredigion in West Wales,
UK, writing mainly in Delphi. My programs are available for download on my
website: <a href="http://www.pjsoft.contactbox.co.uk/">http://www.pjsoft.contactbox.co.uk/</a>.</P>
 
<P>I can be contacted by e-mail on <A HREF="mailto:peter.johnson@openlink.org">peter.johnson@openlink.org</A>.
 
</BODY>
 
</HTML>
 
 
/VCL_PJVERSIONINFO/PJVersionInfo.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/VCL_PJVERSIONINFO/PJVersionInfo.pas
0,0 → 1,582
{ ##
@FILE PJVersionInfo.pas
@COMMENTS Version Information Component (32 bit) source code
(development split from 16 bit version after v1.0).
@PROJECT_NAME Version Information Component
@PROJECT_DESC Component that reads version information from files.
@OTHER_NAMES + Original unit name was VerInfo.pas
+ Changed to VInfo.pas at v2.1
+ Changed to PJVersionInfo.pas at v3.0
@AUTHOR Peter Johnson, LLANARTH, Ceredigion, Wales, UK
@EMAIL peter.johnson@openlink.org
@WEBSITE http://www.pjsoft.contactbox.co.uk/
@COPYRIGHT © 1998-2002, Peter D Johnson.
@LEGAL_NOTICE This component is placed in the public domain. It
may be freely copied and circulated on a not for
profit basis providing that the code is unmodified
and this notice and information about the author and
his copyright remains attached to the source code.
@CREDITS In producing this component some techniques were
used which were learned from FVersion by PJ Veger,
Best, The Netherlands (Feb/96). In particular the
method of accessing language and char-set tables was
taken from PJ Veger's code.
@HISTORY(
@REVISION(
@VERSION 1.0
@DATE 25/04/1998
@COMMENTS Original version - 16 bit only.
)
@REVISION(
@VERSION 2.0
@DATE 06/12/1998
@COMMENTS Revised for use with 32 bit Windows. Not compatible
with v1.
)
@REVISION(
@VERSION 2.0.1
@DATE 09/04/1999
@COMMENTS Changed installation palette from "Own" to "PJ
Stuff".
)
@REVISION(
@VERSION 2.1
@DATE 28/11/1999
@COMMENTS + Changed unit name to VInfo from VerInfo to allow
component to install under Delphi 3 & 4 (VerInfo
clashes with an existing unit in these versions).
+ Removed superfluous conditional compilation
directives.
)
@REVISION(
@VERSION 3.0
@DATE 17/02/2002
@COMMENTS Major update:
+ Added ability to access all "translations" stored
in a file's version information, rather than just
first one. This has been done so that code using
earlier versions of this component should continue
to work unchanged.
+ Added new property to expose fixed file
information record.
+ Added new "string array" property to give access
to string information by name: this property can
access any custom string information if the name
is known.
+ Added properties to return number of
"translations" and to select index of
"translation" to be used.
+ Added properites to return language and character
set codes in addition to descriptive strings.
+ All string info, language and character set
properties now return values from the currently
selected translation (which defaults to the first
translation maintaining backward compatibilty).
+ Empty file name string now accesses name of host
application per command line rather than using
Application.ExeName. This enables this code to
work correctly even if user changes name of
executable file.
+ CharSet property now returns '' for unknown value
rather than 'Unknown'
+ Renamed unit to PJVersionInfo from VInfo.
+ Renamed TVersionNumber record to TPJVersionNumber
+ Replaced Tvs_FixedFileInfo record with use of
Windows unit defined type TVSFixedFileInfo.
+ Changed component palette from PJ Stuff to PJSoft
)
)
}
 
 
unit PJVersionInfo;
 
interface
 
uses
// Delphi
Windows, Classes;
 
type
 
{
TPJVersionNumber:
Record holding version numbers.
}
TPJVersionNumber = record
V1, V2, V3, V4: WORD;
end;
 
{
TPJVersionInfo:
Component that exposes the version information embedded in an executable
file and exposed the detail as properties.
}
TPJVersionInfo = class(TComponent)
private // properties
fFileName: string;
fHaveInfo: Boolean;
fNumTranslations: Integer;
fCurrentTranslation: Integer;
fFixedFileInfo: TVSFixedFileInfo;
procedure SetFileName(AName: string);
function GetProductVersionNumber: TPJVersionNumber;
function GetFileVersionNumber: TPJVersionNumber;
function GetLanguage: string;
function GetCharSet: string;
function GetCharSetCode: WORD;
function GetLanguageCode: WORD;
function GetCurrentTranslation: Integer;
procedure SetCurrentTranslation(const Value: Integer);
function GetStringFileInfo(const Name: string): string;
function GetStringFileInfoByIdx(Index: Integer): string;
private
fPInfoBuffer: PChar;
{Pointer to info buffer}
fPTransBuffer: Pointer;
{Pointer to translation buffer}
procedure GetInfoBuffer(Len: DWORD);
{Creates an info buffer of required size}
procedure GetTransBuffer(Len: UINT);
{Creates a translation table buffer of required size}
function GetTransStr: string;
{Translation info encoded in string: takes into account current
translation}
protected
procedure ClearProperties; virtual;
{Forces properties to return cleared values}
procedure ReadVersionInfo; virtual;
{Reads version info from file}
public
constructor Create(AOwner: TComponent); override;
{Class constructor: sets default values}
destructor Destroy; override;
{Class destructor: frees allocated memory}
{Properties}
property HaveInfo: Boolean
read fHaveInfo;
{Property true if file version info for the file per FileName property has
been successfully read}
property FixedFileInfo: TVSFixedFileInfo
read fFixedFileInfo;
{Exposes the whole fixed file info record: following properties expose
the various fields of it}
property FileVersionNumber: TPJVersionNumber read
GetFileVersionNumber;
{Version number of file, in numeric format, from fixed file info}
property ProductVersionNumber: TPJVersionNumber
read GetProductVersionNumber;
{Version number of product, in numeric format, from fixed file info}
property FileOS: DWORD
read fFixedFileInfo.dwFileOS;
{Code describing operating system to be used by file}
property FileType: DWORD
read fFixedFileInfo.dwFileType;
{Code descibing type of file}
property FileSubType: DWORD
read fFixedFileInfo.dwFileSubType;
{Code describing sub-type of file - only used for certain values of
FileType property}
property FileFlagsMask: DWORD
read fFixedFileInfo.dwFileFlagsMask;
{Code describing which FileFlags are valid}
property FileFlags: DWORD
read fFixedFileInfo.dwFileFlags;
{Flags describing file state}
property Comments: string index 0
read GetStringFileInfoByIdx;
{String file info property giving user defined comments for current
translation}
property CompanyName: string index 1
read GetStringFileInfoByIdx;
{String file info property giving name of company for current translation}
property FileDescription: string index 2
read GetStringFileInfoByIdx;
{String file info property giving description of file for current
translation}
property FileVersion: string index 3
read GetStringFileInfoByIdx;
{String file info property giving version number of file in string format
for current translation}
property InternalName: string index 4
read GetStringFileInfoByIdx;
{String file info property giving internal name of file for current
translation}
property LegalCopyright: string index 5
read GetStringFileInfoByIdx;
{String file info property giving copyright message for current
translation}
property LegalTrademarks: string index 6
read GetStringFileInfoByIdx;
{String file info property giving trademark info for current translation}
property OriginalFileName: string index 7
read GetStringFileInfoByIdx;
{String file info property giving original name of file for current
translation}
property PrivateBuild: string index 8
read GetStringFileInfoByIdx;
{String file info property giving information about a private build of
file for current translation}
property ProductName: string index 9
read GetStringFileInfoByIdx;
{String file info property giving name of product for current translation}
property ProductVersion: string index 10
read GetStringFileInfoByIdx;
{String file info property giving version number of product in string
format for current translation}
property SpecialBuild: string index 11
read GetStringFileInfoByIdx;
{String file info property giving information about a special build of
file for current translation}
property StringFileInfo[const Name: string]: string
read GetStringFileInfo;
{Returns the value for string file info with given name for current
translation. This property can return both standard and custom string
info}
property Language: string
read GetLanguage;
{Name of language in use in current translation}
property CharSet: string
read GetCharSet;
{Name of character set in use in current translation}
property LanguageCode: WORD
read GetLanguageCode;
{Code of laguage in use in current translation}
property CharSetCode: WORD
read GetCharSetCode;
{Character set code in use in current translation}
property NumTranslations: Integer
read fNumTranslations;
{The number of difference translations (ie languages and char sets) in
the version information}
property CurrentTranslation: Integer
read GetCurrentTranslation write SetCurrentTranslation;
{Zero-based index of the current translation: this is 0 when a file is
first accessed. Set to a value in range 0..NumTranslations-1 to access
other translations. All string info, language and char set properties
return information for the current translation}
published
property FileName: string read fFileName write SetFileName;
{Name of file to which version information relates}
end;
 
procedure Register;
{Register this component}
 
implementation
 
uses
// Delphi
SysUtils;
 
{ Component registration routine }
 
procedure Register;
{Register this component}
begin
RegisterComponents('PJSoft', [TPJVersionInfo]);
end;
 
{ TPJVersionInfo }
 
type
{
TTransRec:
Record of language code and char set codes that are returned from version
information.
}
TTransRec = packed record // record to hold translation information
Lang, CharSet: Word;
end;
{
TTransRecs:
Type used to type cast translation data into an array of translation
records.
}
TTransRecs = array[0..1000] of TTransRec;
{
PTransRecs:
Pointer to an array of translation records.
}
PTransRecs = ^TTransRecs;
 
procedure TPJVersionInfo.ClearProperties;
{Forces properties to return cleared values}
begin
// Record that we haven't read ver info: this effectively clears properties
// since each property read access method checks this flag before returning
// result
fHaveInfo := False;
end;
 
constructor TPJVersionInfo.Create(AOwner: TComponent);
{Class constructor: sets default values}
begin
inherited Create(AOwner);
// Default is no file name - refers to executable file for application
FileName := '';
end;
 
destructor TPJVersionInfo.Destroy;
{Class destructor: frees allocated memory}
begin
// Ensure that info buffer is freed if allocated
if fPInfoBuffer <> nil then
StrDispose(fPInfoBuffer);
// Ensure that translation buffer is free if allocated
if fPTransBuffer <> nil then
FreeMem(fPTransBuffer);
inherited Destroy;
end;
 
function TPJVersionInfo.GetCharSet: string;
{Read access method for CharSet property: return string describing character
set if we have some version info and empty string if we haven't}
const
// Map code numbers to char-set names
cCharSets: array[0..11] of record
Code: Word; // char set code
Str: string; // associated name of char set
end = (
( Code: 0; Str: '7-bit ASCII' ),
( Code: 932; Str: 'Windows, Japan (Shift - JIS X-0208)'),
( Code: 949; Str: 'Windows, Korea (Shift - KSC 5601)' ),
( Code: 950; Str: 'Windows, Taiwan (GB5)' ),
( Code: 1200; Str: 'Unicode' ),
( Code: 1250; Str: 'Windows, Latin-2 (Eastern European)'),
( Code: 1251; Str: 'Windows, Cyrillic' ),
( Code: 1252; Str: 'Windows, Multilingual' ),
( Code: 1253; Str: 'Windows, Greek' ),
( Code: 1254; Str: 'Windows, Turkish' ),
( Code: 1255; Str: 'Windows, Hebrew' ),
( Code: 1256; Str: 'Windows, Arabic' )
);
var
I: Integer; // loop control
begin
Result := '';
if fHaveInfo then
begin
// We've have ver info: scan table of codes looking for required entry
for I := Low(cCharSets) to High(cCharSets) do
if GetCharSetCode = cCharSets[I].Code then
begin
// found one - record its name
Result := cCharSets[I].Str;
Exit;
end;
end;
end;
 
function TPJVersionInfo.GetCharSetCode: WORD;
{Read access for CharSetCode property: returns char set code for current
translation or 0 if there is no translation or we have no version info}
begin
if fHaveInfo and (GetCurrentTranslation >= 0) then
Result := PTransRecs(fPTransBuffer)^[GetCurrentTranslation].CharSet
else
Result := 0;
end;
 
function TPJVersionInfo.GetCurrentTranslation: Integer;
{Read access method for CurrentTranslation property: returns index to current
translation if we have version info or -1 if no version info}
begin
if fHaveInfo then
Result := fCurrentTranslation
else
Result := -1;
end;
 
function TPJVersionInfo.GetFileVersionNumber: TPJVersionNumber;
{Read access method for FileVersionNumber property: fill version info
structure and return it - if there's no version info all values will be zero}
begin
Result.V1 := HiWord(fFixedFileInfo.dwFileVersionMS);
Result.V2 := LoWord(fFixedFileInfo.dwFileVersionMS);
Result.V3 := HiWord(fFixedFileInfo.dwFileVersionLS);
Result.V4 := LoWord(fFixedFileInfo.dwFileVersionLS);
end;
 
procedure TPJVersionInfo.GetInfoBuffer(Len: DWORD);
{Creates an info buffer of required size}
begin
// Clear any existing buffer
if fPInfoBuffer <> nil then
StrDispose(fPInfoBuffer);
// Create the new one
fPInfoBuffer := StrAlloc(Len);
end;
 
function TPJVersionInfo.GetLanguage: string;
{Read access method for Language property: return string describing language
if we have some version info and empty string if we haven't}
var
Buf: array[0..255] of char; // stores langauge string from API call
begin
// Assume failure
Result := '';
// Try to get language name from Win API if we have ver info
if fHaveInfo and (VerLanguageName(GetLanguageCode, Buf, 255) > 0) then
Result := Buf;
end;
 
function TPJVersionInfo.GetLanguageCode: WORD;
{Read access for LanguageCode property: returns language code for current
translation or 0 if there is no translation or we have no version info}
begin
if fHaveInfo and (GetCurrentTranslation >= 0) then
Result := PTransRecs(fPTransBuffer)^[GetCurrentTranslation].Lang
else
Result := 0;
end;
 
function TPJVersionInfo.GetProductVersionNumber: TPJVersionNumber;
{Read access method for ProductVersionNumber property: fill version info
structure and return it - if there's no version info all values will be zero}
begin
Result.V1 := HiWord(fFixedFileInfo.dwProductVersionMS);
Result.V2 := LoWord(fFixedFileInfo.dwProductVersionMS);
Result.V3 := HiWord(fFixedFileInfo.dwProductVersionLS);
Result.V4 := LoWord(fFixedFileInfo.dwProductVersionLS);
end;
 
function TPJVersionInfo.GetStringFileInfo(const Name: string): string;
{Read access method for StringFileInfo array property: returns string
associated with given name or empty string if we have no version info}
var
CommandBuf: array[0..255] of char; // buffer to build API call command str
Ptr: Pointer; // pointer to result of API call
Len: UINT; // length of structure returned from API
begin
// Set default failure result to empty string
Result := '';
// Check if we have valid information recorded in info buffer - exit if not
if fHaveInfo then
begin
// Build API call command string for reading string file info:
// this uses info string + language and character set
StrPCopy(CommandBuf, '\StringFileInfo\' + GetTransStr + '\' + Name);
// Call API to get required string and return it if successful
if VerQueryValue(fPInfoBuffer, CommandBuf, Ptr, Len) then
Result := PChar(Ptr);
end;
end;
 
function TPJVersionInfo.GetStringFileInfoByIdx(Index: Integer): string;
{Read access method for all string file info properties: returns appropriate
string for the given property or empty string if we have no version info}
const
cNames: array[0..11] of string =
('Comments', 'CompanyName', 'FileDescription', 'FileVersion',
'InternalName', 'LegalCopyright', 'LegalTrademarks', 'OriginalFileName',
'PrivateBuild', 'ProductName', 'ProductVersion', 'SpecialBuild');
{names of predefined string file info strings}
begin
Result := GetStringFileInfo(cNames[Index]);
end;
 
procedure TPJVersionInfo.GetTransBuffer(Len: UINT);
{Creates a translation table buffer of required size}
begin
// Clear any existing buffer
if fPTransBuffer <> nil then
FreeMem(fPTransBuffer);
// Create the new one
GetMem(fPTransBuffer, Len);
end;
 
function TPJVersionInfo.GetTransStr: string;
{Translation info encoded in string: takes into account current translation}
var
TransRec: TTransRec; // translation record in array of translations
begin
if GetCurrentTranslation >= 0 then
begin
// There is a valid current translation: return hex string related to it
TransRec := PTransRecs(fPTransBuffer)^[GetCurrentTranslation];
Result := Format('%4.4x%4.4x', [TransRec.Lang, TransRec.CharSet]);
end
else
// No valid translation string: return empty string
Result := '';
end;
 
procedure TPJVersionInfo.ReadVersionInfo;
{Reads version info from file}
var
Len: UINT; // length of structs returned from API calls
Ptr: Pointer; // points to version info structures
InfoSize: DWORD; // size of info buffer
Dummy: DWORD; // stores 0 in call to GetFileVersionInfoSize
begin
// Record default value of HaveInfo property - no info read
fHaveInfo := False;
// Store zeros in fixed file info structure: this is used when no info
FillChar(fFixedFileInfo, SizeOf(fFixedFileInfo), 0);
// Set NumTranslations property to 0: this is value if no info
fNumTranslations := 0;
// Record required size of version info buffer
InfoSize := GetFileVersionInfoSize(PChar(fFileName), Dummy);
// Check that there was no error
if InfoSize > 0 then
begin
// Found info size OK
// Ensure we have a sufficiently large buffer allocated
GetInfoBuffer(InfoSize);
// Read file version info into storage and check success
if GetFileVersionInfo(PChar(fFileName), Dummy, InfoSize, fPInfoBuffer) then
begin
// Success: we've read file version info to storage OK
fHaveInfo := True;
// Get fixed file info & copy to own storage
VerQueryValue(fPInfoBuffer, '\', Ptr, Len);
fFixedFileInfo := PVSFixedFileInfo(Ptr)^;
// Get first translation table info from API
VerQueryValue(fPInfoBuffer, '\VarFileInfo\Translation', Ptr, Len);
// Ptr is to block of translation records each of size Len:
// work out number of translations
fNumTranslations := Len div SizeOf(TTransRec);
// store translation array in a buffer
GetTransBuffer(Len);
Move(Ptr^, fPTransBuffer^, Len);
// make first translation in block current one (-1 if no translations)
SetCurrentTranslation(0); // adjusts value to -1 if no translations
end;
end;
end;
 
procedure TPJVersionInfo.SetCurrentTranslation(const Value: Integer);
{Write accees method for CurrentTranslation property: if value is out of
translation range then it is set to -1 to indicate no translation}
begin
if (Value >= 0) and (Value < NumTranslations) then
fCurrentTranslation := Value
else
fCurrentTranslation := -1
end;
 
procedure TPJVersionInfo.SetFileName(AName: string);
{Write access method for FileName property: action at design time is different
to run time. At design time we simply record value while at run time we store
value - using actual name of program for '' string - and read the version
information}
begin
if csDesigning in ComponentState then
// We are designing, simply record the required name
fFileName := AName
else
begin
// It's run-time
// use Application exec file name if name is ''
if AName = '' then
fFileName := ParamStr(0)
else
fFileName := AName;
// clear all properties and read file version info for new file
ClearProperties;
ReadVersionInfo;
end;
end;
 
end.
/LevMain.dfm
4,8 → 4,8
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Leveleditor'
ClientHeight = 517
ClientWidth = 741
ClientHeight = 536
ClientWidth = 753
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
14,7 → 14,8
Font.Style = []
KeyPreview = True
Menu = MainMenu
Position = poScreenCenter
OldCreateOrder = True
Position = poDesktopCenter
Scaled = False
OnClose = FormClose
OnCloseQuery = FormCloseQuery
22,6072 → 23,306
OnDestroy = FormDestroy
OnMouseMove = DXDrawMouseMove
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Bevel1: TBevel
Left = 648
Top = 200
Width = 97
Height = 2
Shape = bsBottomLine
end
object Bevel2: TBevel
Left = 648
Top = 392
Width = 97
Height = 2
Shape = bsBottomLine
end
object SelLabel: TLabel
Left = 648
Top = 0
Width = 43
Height = 13
Caption = 'Auswahl:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object Bevel3: TBevel
Left = 648
Top = 320
Width = 97
Height = 2
Shape = bsBottomLine
end
object SLabel1a: TLabel
Left = 652
Top = 424
Width = 47
Height = 13
Caption = 'Einheiten:'
OnMouseMove = DXDrawMouseMove
end
object SLabel2a: TLabel
Left = 652
Top = 440
Width = 26
Height = 13
Caption = 'Boss:'
OnMouseMove = DXDrawMouseMove
end
object SLabel1b: TLabel
Left = 720
Top = 424
Width = 6
Height = 13
Caption = '0'
OnMouseMove = DXDrawMouseMove
end
object SLabel2b: TLabel
Left = 720
Top = 440
Width = 22
Height = 13
Caption = 'Nein'
OnMouseMove = DXDrawMouseMove
end
object SLabel0: TLabel
Left = 648
Top = 400
Width = 84
Height = 13
Caption = 'Level-Information:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object SLabel3a: TLabel
Left = 652
Top = 456
Width = 32
Height = 13
Caption = 'Gr'#246#223'e:'
OnMouseMove = DXDrawMouseMove
end
object SLabel3b: TLabel
Left = 720
Top = 456
Width = 24
Height = 13
Caption = '1200'
OnMouseMove = DXDrawMouseMove
end
object SLabel4a: TLabel
Left = 652
Top = 480
Width = 60
Height = 13
Caption = 'Gespeichert:'
Font.Charset = DEFAULT_CHARSET
Font.Color = 150
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object SLabel4b: TLabel
Left = 720
Top = 480
Width = 22
Height = 13
Caption = 'Nein'
Font.Charset = DEFAULT_CHARSET
Font.Color = 150
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object LivesLabel: TLabel
Left = 648
Top = 332
Width = 33
Height = 13
Caption = 'Leben:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object Enemy1: TRadioButton
Left = 652
Top = 24
Width = 73
Height = 17
Caption = 'Attackierer'
Checked = True
TabOrder = 0
TabStop = True
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy2: TRadioButton
Left = 652
Top = 48
Width = 82
Height = 17
Caption = 'Attackierer 2'
TabOrder = 1
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy3: TRadioButton
Left = 652
Top = 72
Width = 82
Height = 17
Caption = 'Attackierer 3'
TabOrder = 2
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy4: TRadioButton
Left = 652
Top = 96
Width = 55
Height = 17
Caption = 'Meteor'
TabOrder = 3
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy5: TRadioButton
Left = 652
Top = 120
Width = 44
Height = 17
Caption = 'UFO'
TabOrder = 4
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy6: TRadioButton
Left = 652
Top = 144
Width = 53
Height = 17
Caption = 'UFO 2'
TabOrder = 5
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy7: TRadioButton
Left = 652
Top = 168
Width = 45
Height = 17
Caption = 'Boss'
TabOrder = 6
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object ScrollBar: TScrollBar
Left = 0
Top = 480
Width = 632
Width = 640
Height = 17
Max = 1200
PageSize = 0
TabOrder = 0
TabOrder = 7
OnScroll = ScrollBarScroll
end
object SelPanel: TPanel
Left = 652
Top = 216
Width = 89
Height = 89
Color = clWhite
TabOrder = 8
OnMouseMove = DXDrawMouseMove
object Image1: TImage
Left = 1
Top = 1
Width = 610
Height = 88
AutoSize = True
OnMouseMove = DXDrawMouseMove
end
end
object StatusBar: TStatusBar
Left = 0
Top = 498
Width = 741
Top = 517
Width = 753
Height = 19
Panels = <>
SimplePanel = True
SimpleText =
' Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigens' +
'chaften anzuzeigen...'
OnMouseMove = DXDrawMouseMove
end
object SidePanel: TPanel
Left = 632
Top = 0
Width = 109
Height = 498
Align = alRight
BevelOuter = bvNone
TabOrder = 2
object Bevel1: TBevel
Left = 4
Top = 200
Width = 97
Height = 2
Shape = bsBottomLine
end
object Bevel2: TBevel
Left = 4
Top = 392
Width = 97
Height = 2
Shape = bsBottomLine
end
object Bevel3: TBevel
Left = 4
Top = 320
Width = 97
Height = 2
Shape = bsBottomLine
end
object LivesLabel: TLabel
Left = 8
Top = 332
Width = 33
Height = 13
Caption = 'Leben:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object SelLabel: TLabel
Left = 8
Top = 4
Width = 43
Height = 13
Caption = 'Auswahl:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object SLabel0: TLabel
Left = 8
Top = 400
Width = 84
Height = 13
Caption = 'Level-Information:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object SLabel1a: TLabel
Left = 8
Top = 424
Width = 47
Height = 13
Caption = 'Einheiten:'
OnMouseMove = DXDrawMouseMove
end
object SLabel1b: TLabel
Left = 76
Top = 424
Width = 6
Height = 13
Caption = '0'
OnMouseMove = DXDrawMouseMove
end
object SLabel2a: TLabel
Left = 8
Top = 440
Width = 26
Height = 13
Caption = 'Boss:'
OnMouseMove = DXDrawMouseMove
end
object SLabel2b: TLabel
Left = 76
Top = 440
Width = 22
Height = 13
Caption = 'Nein'
OnMouseMove = DXDrawMouseMove
end
object SLabel3a: TLabel
Left = 8
Top = 456
Width = 32
Height = 13
Caption = 'Gr'#246#223'e:'
OnMouseMove = DXDrawMouseMove
end
object SLabel3b: TLabel
Left = 76
Top = 456
Width = 24
Height = 13
Caption = '1200'
OnMouseMove = DXDrawMouseMove
end
object SLabel4a: TLabel
Left = 8
Top = 480
Width = 60
Height = 13
Caption = 'Gespeichert:'
Font.Charset = DEFAULT_CHARSET
Font.Color = 150
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object SLabel4b: TLabel
Left = 76
Top = 480
Width = 22
Height = 13
Caption = 'Nein'
Font.Charset = DEFAULT_CHARSET
Font.Color = 150
Font.Height = -12
Font.Name = 'MS Sans Serif'
Font.Style = []
ParentFont = False
OnMouseMove = DXDrawMouseMove
end
object Enemy1: TRadioButton
Left = 8
Top = 24
Width = 93
Height = 17
Caption = 'Angreifer Typ 1'
Checked = True
TabOrder = 0
TabStop = True
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy2: TRadioButton
Left = 8
Top = 44
Width = 93
Height = 17
Caption = 'Angreifer Typ 2'
TabOrder = 1
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy3: TRadioButton
Left = 8
Top = 64
Width = 93
Height = 17
Caption = 'Angreifer Typ 3'
TabOrder = 2
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy4: TRadioButton
Left = 8
Top = 84
Width = 55
Height = 17
Caption = 'Meteor'
TabOrder = 3
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy5: TRadioButton
Left = 8
Top = 104
Width = 44
Height = 17
Caption = 'UFO'
TabOrder = 4
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy6: TRadioButton
Left = 8
Top = 124
Width = 53
Height = 17
Caption = 'UFO 2'
TabOrder = 5
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object Enemy7: TRadioButton
Left = 8
Top = 144
Width = 45
Height = 17
Caption = 'Boss'
TabOrder = 6
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object SelPanel: TPanel
Left = 8
Top = 216
Width = 89
Height = 89
Color = clWhite
TabOrder = 7
OnMouseMove = DXDrawMouseMove
object Image1: TImage
Left = 1
Top = 1
Width = 697
Height = 88
AutoSize = True
Picture.Data = {
07544269746D617056CF0200424D56CF0200000000003600000028000000B902
000058000000010018000000000020CF0200120B0000120B0000000000000000
0000FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFCFFD0D9FF93A9FF5B7A
FF3258FF1844FF113DFF113EFF113EFF113EFF113EFF113EFF113DFF113DFF23
4CFF4266FF728CFFA9BAFFF3F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF4F7FFA2B5
FF4D71FF0E3EFF0135FF0032FF0032FF0135FF0236FF0236FF0236FF0236FF02
36FF0236FF0236FF0236FF0034FF0033FF002FFF0538FF2A56FF7491FFC5D2FF
FCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFE9495A500003300003300003300003300003300003300
00330000330000330000330000330000330000330000339495A5FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFECF1FF8AA5FF3360FF0038FF0036FF003AFF013BFF023BFF023BFF023BFF02
3BFF023BFF023BFF023BFF023BFF023BFF023BFF023BFF023BFF023BFF023BFF
013AFF0038FF0033FF0C42FF557BFFB8C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEADADBB58587A58587A58587A31315A00003300003300
0033000048000048000048000048000048000048000048000048000048000048
00004831316358587A58587A58587A58587A757489FEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFE6B98730042080042080042080042080042084A
7B52FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE689AFF0052FA0052FA0052FA0052
FA0052FA4384FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFEFFFFC9D6FF557FFF013FFF003BFF0140FF0241FF0240FF02
40FF0240FF0240FF0240FF0240FF0240FF0240FF0240FF0240FF0240FF0240FF
0240FF0240FF0240FF0240FF0240FF0241FF0241FF003EFF003AFF0743FF88A5
FFECF1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE86899600003300003300
0033000033000033000033000048000048000048000048000048000048000048
0000480000480000480000480000480000480000330000330000330000332929
52FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEEDEDEDA5B58CA5B58CA5B58CA5B58C45744600420800
42080042080042080042082963318CAD948CAD948CAD948CAD94DADADBFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEAEEFA8CB5FF8CB5FF8CB5FF8CB5FF3377
FE0052FA0052FA0052FA0052FA0052FA266AFE8CB5FF8CB5FF8CB5FF8CB5FFD9
E7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9FBFF7EA2FF0D4EFF0043FF0146FF02
47FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF
0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247FF0247
FF0247FF0247FF0045FF0041FF346AFFD7E2FFFEFEFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFE868996000033000033000033000033000033000033000048000048000048
0000480000480000480000480000480000480000480000480000480000480000
48000048000033000033292952FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECAD6C831520031520031
5200315200174A00004208004208004208004208004208004208004208004208
004208004208A5BAA7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECADBFE0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FAA5BDFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9F0FF6492FF00
45FF004CFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF
024EFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF024E
FF024EFF024EFF024EFF024EFF024EFF024EFF024EFF024EFF0048FF1056FFA0
BDFFFCFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEDADADB000033000033000048000048000048000033000033000048
0000480000480000480000480000580000580000580000580000580000580000
58000058000058000058000048000048000048000048000048000033DADADBFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE526B2249631049631049
6310425A16315200315200315200315200174A00004208004208004208004208
0042080042080042080042080042080042080852181853211853211853211853
21F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE266AFE1663
FE1663FE1663FE1663FE0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA105AFE1663FE1663FE
1663FE1663FEEFF7FCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFE3EDFF2D72FF0050FF0254FF0255FF0255FF0255FF0255FF0255FF0255FF
0255FF0255FF0254FF0052FF0052FF0052FF0052FF0052FF0052FF0052FF0052
FF0052FF0052FF0052FF0053FF0255FF0255FF0255FF0255FF0255FF0255FF02
55FF0255FF0255FF0051FF0152FF8FB5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEADADBB58587A000048000048000048000048
0000480000480000480000480000480000480000580000580000580000580000
5800005800005800005800005800005800005800005800005800005800005800
005800004800003358587AADADBBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBC6A6BBC6A6BB
C6A6315200315200315200315200315200315200315200315200315200174A00
0042080042080042080042080042080042080042080042080042080042080042
080042080042082963315A8463F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEA9C6
FFA9C6FFA9C6FF105AFE0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA266AFE538CFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFEEF4FF4084FF0057FF005BFF015CFF015CFF015CFF
015CFF015CFF015CFF015CFF015CFF015BFF025CFF1065FF1065FF1065FF1065
FF1065FF1065FF1065FF1065FF1065FF1065FF1065FF0961FF015BFF015CFF01
5CFF015CFF015CFF015CFF015CFF015CFF015CFF015CFF0059FF065CFF95BBFF
FEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEC6C8D658587A000033
0000580000580000580000580000580000480000480000480000480000480000
5800005800005800005800005800005800005800006D00006D00006D00006D00
006D00006D00005800005800005800004800003300003358587ACACACACACACA
EAEEFAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEF7F7EF315200315200315200315200315200315200315200315200315200
315200315200315200174A000042080042080042080042080042080042080042
080042080042080042080042080042080042087BA984FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEEFF7FC0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA77A5FFFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECF4FF5798FF005EFF0163FF
0163FF0163FF0163FF0163FF0163FF0163FF0163FF0163FF0163FF0060FF0F6C
FFE2EDFFF0F5FFF0F5FFF0F5FFF0F5FFF0F5FFF0F5FFF0F5FFF0F5FFF0F5FFF0
F5FF78ADFF0059FF0163FF0163FF0163FF0163FF0163FF0163FF0163FF0163FF
0163FF0163FF0061FF0260FFA5C8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFE1818420000480000480000580000580000580000580000580000480000
4800004800004800005800005800005800005800005800005800005800005800
006D00006D00006D00006D00006D00006D000058000058000058000048000033
000033000033000033000033CACACAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFE9CA584547331315200315200315200315200315200
315200315200315200315200315200315200315200174A000042080042080042
080042080042080042080042080042080042080042080042080042080C2B0511
4816326639F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE77A5FF3377FE0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA004A
F7004AE9125AED3377FEEFF7FCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFEFF
72ADFF0063FF016AFF016BFF016BFF016BFF016BFF016BFF016BFF016BFF016B
FF016BFF016BFF0068FF1074FFF4F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFF82B6FF0060FF016BFF016BFF016BFF016BFF
016BFF016BFF016BFF016BFF016BFF016BFF016BFF0067FF056BFFE1EDFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE948C8C5A635A
5A635A4E4E4E4E4E4E948C8CFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE94
8C8C5A635A5A635A4E4E4E4E4E4E948C8CFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFE948C8C5A635A5A635A4E4E4E4E4E4E948C8CFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFE1818420000480000480000580000580000
5800005800005800004800004800004800004800005800005800005800005800
005800005800005800005800006D00006D00006D00006D00006D00006D000058
000058000058000048000048000033000033000033000033CACACAFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB7DBB96B8B38255A00315200
3152003152003152003152003152003152003152003152003152003152003152
00174A0000420800420800420800420800420800420800420800420800420800
42080042080042080C2B05004208004208B5C6B5D8EAD9FEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECADBFE538CFE10
5AFE0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA004AF7004AE9004AE90052FAB5CEFFD9E7FEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFB5D7FF0573FF0072FF0173FF0173FF0173FF0173FF0173
FF0173FF0173FF0173FF0173FF0173FF0173FF0071FF107CFFF0F7FFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80B9FF0069FF
0173FF0173FF0173FF0173FF0173FF0173FF0173FF0173FF0173FF0173FF0173
FF0173FF006EFF3D95FFF5FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
8686865A635A6E6E6E6E6E6E5A635A4E4E4E969696F7F7EFFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFE8686865A635A6E6E6E6E6E6E5A635A4E4E4E969696F7F7EFFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFE8686865A635A6E6E6E6E6E6E5A635A4E4E4E969696F7
F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADADBB73739473739400104A0000
4800005800006D00006D00006D00005800005800005800005800004800004800
005800005800005800005800005800005800005800006D00006D00006D00006D
00006D00006D00006D0000580000580000580000580000480000480000330000
3300003358587AADADBBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECEDED6
0084000084000084003152003152003152003152003152003152003152003152
00315200315200315200315200174A0000420800420800420800420800420800
42080042080042080042080042080042080042080C2B05004208004208004208
638C65FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFED9E7FE266AFE266AFE266AFE0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA004AF7004AE9004AE900
52FA0052FA689AFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBF5FF1C89FF0077FF017BFF017B
FF017BFF017BFF017BFF017BFF017BFF017BFF017BFF017BFF017BFF017BFF00
79FF1083FFF0F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF80BDFF0072FF017BFF017BFF017BFF017BFF017BFF017BFF017B
FF017BFF017BFF017BFF017BFF017BFF017BFF0076FF92C7FFFCFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFE6E6E6E8686868686866E6E6E6E6E6E6E6E6E5A635A5A635AA8A8A8F7F7
EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFE6E6E6E8686868686866E6E6E6E6E6E6E6E6E5A635A5A635A
A8A8A8F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFE6E6E6E8686868686866E6E6E6E6E6E6E6E6E5A
635A5A635AA8A8A8F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB5858
7A00003300003300004800005800006D00006D00006D00006D00006D00005800
005800005800004800004800005800005800006D00005800005800005800006D
00006D00006D00006D00006D00006D00006D0000580000580000580000580000
5800004800004800004800003300003300003358587ADADADBFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFE75AF7442A542008400008400008400087401255A003152003152
00315200315200315200315200315200315200315200315200244A00244A0000
42080042080042080042080042080042080042080042080042080042080C2B05
0042080042080042080042081853214A7B52D8EAD9FEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFE8CB5FF5A94FF266AFE266AFE266AFE1663FE105AFE
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
4AE9004AE9004AE9004AF70052FA0052FA1663FE4384FED9E7FEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF83C2
FF007BFF0183FF0183FF0183FF0183FF0183FF0183FF0183FF0183FF0183FF01
83FF0183FF0183FF0183FF0081FF108AFFF0F8FFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80C1FF0079FF0183FF0183FF0183
FF0183FF0183FF0183FF0183FF0183FF0183FF0183FF0183FF0183FF0183FF00
81FF0483FFCEE7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEEDEDED7B847B948C8C6E6E6E7B847B7B847B7B847B5A635A5A63
5A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEEDEDED7B847B948C8C6E6E6E7B847B7B847B7B847B
5A635A5A635A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDED7B847B948C8C6E6E6E7B847B7B
847B7B847B5A635A5A635A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE00003300004800004800004800005800006D00006D00006D00
006D00006D00006D00005800005800005800005800005800005800006D00006D
00005800005800006D00006D00005800006D00006D00006D0000580000580000
5800005800005800005800005800005800004800004800004800004800004800
0048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED8EAD92E962E0084000084000084000084
00008400087401255A0031520031520031520031520031520031520031520031
5200315200315200315200004208004208004208004208004208004208004208
0042080042080C2B050C2B05004208004208004208004208004208004208ADC6
B5EDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEFF7FCD9E7FE538CFE266AFE266AFE
266AFE266AFE266AFE1663FE105AFE0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA004AE9004AE90052FA0052FA0052FA0052FA0052FA
0052FAA9C6FFEAEEFAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEF7F7EFCACACA7B847B7B847B0E0F0E0E0F0E0E0F0E
0E0F0E0E0F0E1018212118212118212118212118210E0F0E0E0F0E0E0F0E0E0F
0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E
0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E6E6E6EB5ADADFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFE4F2FF1D96FF0088FF018AFF018AFF018AFF018AFF018AFF01
8AFF018AFF018AFF018AFF018AFF018AFF018AFF018AFF0088FF1091FFF0F8FF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80C5
FF0082FF018AFF018AFF018AFF018AFF018AFF018AFF018AFF018AFF018AFF01
8AFF018AFF018AFF018AFF018AFF0085FF59B2FFFDFEFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEEDEDED969696948C8C6E6E6E7B847B7B847B7B84
7B8686866E6E6E5A635A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDED969696948C8C6E6E6E7B847B
7B847B7B847B8686866E6E6E5A635A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDED969696948C8C6E
6E6E7B847B7B847B7B847B8686866E6E6E5A635A5A635AB5ADADEDEDEDFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD29295200004800005800005800005800
006D00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D
00006D00006D00006D00006D00005800005800006D00006D0000580000580000
6D00006D00005800005800004800004800004800005800005800005800005800
0058000058000058000058000058000048292952292952757489FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEA7D6AA0084000084
0000840000840000840000840000840000840000840031520031520031520031
5200315200315200315200315200315200315200315200004208004208004208
0042080042080042080042080042080042080C2B050C2B050042080042080042
08004208004208004208004208397342FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBDD6FF
266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE0052FA0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA004AE9004AE90052FA
0052FA0052FA0052FA0052FA0052FA0052FA3377FEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEEDEDEDDADADB6E6E6E6E6E6E4E4E4E0E0F0E0E0F0E0E0F0E
1018212118212118213030304239424239424239424239424239424239423030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030211821211821211821211821211821
2118210E0F0E303030B5ADADF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFEFF60BBFF008DFF0192FF0191FF01
91FF0191FF0191FF0191FF0191FF0191FF0191FF0191FF0191FF0191FF0191FF
0191FF008FFF1098FFF0F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFF80C9FF008AFF0191FF0191FF0191FF0191FF0191FF01
91FF0191FF0191FF0191FF0191FF0191FF0191FF0191FF0191FF0090FF0792FF
D4EDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB9696966E6E6E7B84
7B7B847B8686868686868686866E6E6E5A635A5A635AB5ADADEDEDEDFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB969696
6E6E6E7B847B7B847B8686868686868686866E6E6E5A635A5A635AB5ADADEDED
EDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDA
DADB9696966E6E6E7B847B7B847B8686868686868686866E6E6E5A635A5A635A
B5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD00003300
004800005800005800005800006D00006D00006D00005800005800006D00006D
00006D00006D00006D00006D00006D00006D00006D00006D0000580000580000
6D00006D00005800005800005800005800005800005800004800004800004800
0058000058000058000058000058000058000058000058000058000048000033
00003358587AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FE75AF7442A54200840000840000840000840000840000840000840000840000
8400087401255A00315200315200315200315200315200315200315200315200
3152000042080042080042080042080042080042080042080042080C2B050042
08004208004208004208004208004208004208004208004208185321638C65CE
DED6FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFE8CB5FF689AFF266AFE266AFE266AFE266AFE266AFE266AFE266A
FE266AFE266AFE1663FE105AFE0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA004AF7
004AE9004AE9004AE90052FA0052FA0052FA0052FA0052FA0052FA0052FA1663
FE689AFFCADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEF7F7EFEDEDED9696966E6E6E5A635A0E0F0E0E0F0E101821211821
3030303030304239424239424239424239424239424239424239424239424239
4242394242394230303042394230303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030302118210E0F0E423942B5ADADFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1F3FF05
99FF0097FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF
0198FF0198FF0198FF0198FF0198FF0096FF109EFFF0F9FFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80CCFF0091FF0198FF01
98FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF0198FF
0198FF0198FF0198FF0093FF79C9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADA
DB9696967B847B7B847B8686868686868686868686866E6E6E5A635A5A635AB5
ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEDADADB9696967B847B7B847B8686868686868686868686866E6E6E5A63
5A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEDADADB9696967B847B7B847B868686868686868686868686
6E6E6E5A635A5A635AB5ADADEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEB3B3CD00003300004800005800005800005800006D00006D00006D
00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D0000
6D00006D00006D00006D00006D00006D00005800005800005800005800005800
005800004800004800004800005800005800005800005800005800006D00006D
00005800005800004800004800003358587AFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFE2E962E00840000840000840000840000840000
8400008400008400008400008400008400087401315200315200315200315200
3152003152003152003152003152000042080042080042080042080042080042
080042080042080C2B0500420800420800420800420800420800420800420800
4208004208004208004208A5BAA7F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE427BFE266AFE266AFE266AFE266A
FE266AFE266AFE266AFE266AFE266AFE266AFE266AFE1663FE0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA004AF7004AE9004AE90052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA0052FAA9C6FFEFF7FCFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEEDEDEDDADADBA8A8A85A635A4239420E0F0E211821303030303030
4239424E4E4E4239424239424239424E4E4E4239424239424239424239424239
4242394242394242394242394242394242394242394242394242394230303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
303030301018210E0F0E5A635AA8A8A8F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFA5DDFF009DFF019FFF019FFF019FFF019FFF019FFF019FFF
019FFF019FFF019FFF019FFF019FFF019FFF019FFF019FFF019FFF009DFF10A5
FFF0F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFF80D0FF0098FF019FFF019FFF019FFF019FFF019FFF019FFF019FFF019FFF
019FFF019FFF019FFF019FFF019FFF019FFF019FFF009DFF27ADFFF5FBFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEDADADB9696967B847B8686868686868686868686868686866E
6E6E5A635A5A635AA8A8A8EDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEDADADB9696967B847B8686868686868686868686
868686866E6E6E5A635A5A635AA8A8A8EDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB9696967B847B868686868686
8686868686868686866E6E6E5A635A5A635AA8A8A8EDEDEDFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD000033000048000058000058
00005800005800006D00006D00006D00006D00006D00005800005800006D0000
6D00006D00006D00006D00006D00005800006D00006D00006D00005800005800
0058000058000058000058000058000048000048000048000048000048000058
00005800006D00006D00006D00006D00005800004800004800003358587AFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE637A2D2D6B0900
8400008400008400008400008400008400008400008400008400008400008400
008400255A003152003152003152003152003152003152003152000042080042
080042080042080042080042080042080042080C2B0500420800420800420800
42080042080042080042080042080042080042080042080042082A542AFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE266A
FE105AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE26
6AFE266AFE266AFE105AFE0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA004AF7004AE9004AE90052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA26
6AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEBBBBBB423942211821303030423942423942
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4239424239424239424E4E4E4239424239
4242394242394242394242394242394242394242394242394242394242394242
3942423942303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
303030303030303030303030303030303030303030301018210E0F0E4239426E
6E6EDADADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6FCFF3BBAFF00A3FF01A5FF01A5FF
01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5
FF01A5FF01A5FF00A3FF10ABFFF0FAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFF80D3FF009FFF01A5FF01A5FF01A5FF01A5FF
01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5FF01A5
FF00A5FF04A5FFB2E4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECACACA86868686868686868686
8686868686857B7A6E6E6E5A635A5A635A5A635AEDEDEDFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECACACA8686868686
86868686868686868686857B7A6E6E6E5A635A5A635A5A635AEDEDEDFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECACACA
868686868686868686868686868686857B7A6E6E6E5A635A5A635A5A635AEDED
EDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD
00003300004800005800005800005800005800006D00006D00006D00006D0000
6D00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D00
006D00006D000058000058000058000058000058000058000048000048000033
00003300004800004800004800005800006D00006D00006D00006D0000580000
4800004800003358587AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDA
DECEA5AD84526B222D6B092D6B092D6B09087401008400008400008400008400
008400008400008400008400008400087401255A003152003152003152003152
0031520031520000420800420800420800420800420800420800420800420800
4208004208004208004208004208004208004208004208004208004208004208
004208004208085218779C7BCAD6C8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFECADBFE77A5FF105AFE105AFE1663FE1663FE1663FE266AFE266AFE26
6AFE266AFE266AFE266AFE266AFE266AFE266AFE1663FE105AFE0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA004A
E9004AE9004AE9004AF70052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA105AFE77A5FFCADBFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADB5B54E4E4E
1018212118213030304239424239424E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4239
4242394242394242394242394242394242394242394242394242394242394242
3942423942423942423942423942303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
30303030302118210E0F0E0E0F0E1018216E6E6EDADADBFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDBF3FF
05ACFF00A9FF00AAFF00AAFF00AAFF00AAFF00AAFF00A7FF00A4FF00A4FF00A4
FF00A4FF00A4FF00A4FF00A4FF00A4FF00A4FF00A3FF00AAFFEFFAFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF77D2FF009EFF
00A4FF00A4FF00A4FF00A4FF00A4FF00A4FF00A4FF00A4FF00A4FF00A5FF00AA
FF00AAFF00AAFF00AAFF00AAFF00AAFF00A7FF75D1FFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDA
DADBA8A8A88686864E4E4E4E4E4E5A635A857B7A5A635A5A635A5A635A33444A
DE8484FF9494FF9494FF9494FF9494FF9494FF9494FF9494FFABABFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEDADADBA8A8A88686864E4E4E4E4E4E5A635A857B7A5A635A5A635A5A
635A33444A8484B99292D19292D19292D19292D19292D19292D19292D1B3B3CD
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEDADADBA8A8A88686864E4E4E4E4E4E5A635A857B7A5A63
5A5A635A5A635A33444A84DEDE94F6F994F6F994F6F994F6F994F6F994F6F994
F6F9ABFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFE9495A59495A56363840000330000580000580000580000580000580000
6D00006D00006D00006D00006D00006D00006D00006D00006D00005800005800
005800006D00006D00006D00006D00006D00006D000058000058000058000058
00005800004800004800003300003300004800004800005800005800006D0000
6D00006D00006D0000580000580000480000483131639495A5FEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEAABD9C4963104963104963104963104963102D6B09
0084000084000084000084000084000084000084000084000084000084000874
0131520031520031520031520031520031520000420800420800420800420800
42080042080C2B050C2B05004208004208004208004208004208004208004208
0042080042080042080042080042080042080042080042088CAD94FEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE98B9FF0052FA0052FA0052FA0052FA00
52FA105AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE
266AFE1663FE0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA004AE9004AE90052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA8CB5FF
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFECACACA5A635A5A635A1018213030304239423030302118213030302118
2121182142394242394242394242394242394242394242394242394242394242
3942423942423942423942423942423942423942303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
30303030303030303030303030303030303030303030302118210E0F0E0E0F0E
1018215A635ADADADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFBFEBFF00B0FF00AFFF00AFFF00AFFF00AFFF00AFFF00AD
FF40C3FF80D7FF80D7FF80D7FF80D7FF80D7FF80D7FF80D7FF80D7FF80D7FF80
D6FF87D9FFF8FDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFC0EBFF80D4FF80D7FF80D7FF80D7FF80D7FF80D7FF80D7FF80D7
FF80D7FF80D7FF78D4FF08B2FF00AFFF00AFFF00AFFF00AFFF00AFFF00AEFF47
C6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEDADADBBBBBBB9696964239420E0F0E101821525A63
5A635A5A635A5A635A052136B51808D81605D81605D81605D81605D81605D816
05D81605E74A39FFABABFFABABFFABABFFABABFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADBBBBBBB9696964239420E0F0E10
1821525A635A635A5A635A5A635A05213600006D212184212184212184212184
21218421218421218455499994ADCE94ADCE94ADCEB3B3CDFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADBBBBBBB9696964239
420E0F0E101821525A635A635A5A635A5A635A05213600B1B100D8D800D8D800
D8D800D8D800D8D800D8D800D8D831E7E7ABFFFFABFFFFABFFFFABFFFFFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000330000330000330000480000580000
5800005800005800005800006D00006D00006D00006D00006D00006D00005800
005800005800005800005800005800005800005800006D00006D00006D00006D
0000580000580000580000580000580000580000480000480000480000480000
4800005800005800006D00006D00006D00006D00006D00005800004800004800
0048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEA5BAA72A542A425A16
4963104963104963104963104963104963104963100084000084000084000084
00008400008400008400008400008400255A003152003152000C2B050E0F0E0E
0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0C2B050C2B05004208004208004208
0042080042080042080042080042080042080042080042080042080042080042
080042088CAD94FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEA5BDFF26
6AFE105AFE0052FA0052FA0052FA0052FA0052FA0052FA0052FA266AFE266AFE
266AFE266AFE266AFE266AFE266AFE266AFE266AFE105AFE0052FA0052FA0529
6F0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0035AF004AE90052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA8CB5FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEEDEDED9696964E4E4E4239425A635A5A635A4239424E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E42394242394242394230303021182121182110182110
1821303030303030303030423942423942423942423942423942423942423942
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030301018210E0F0E0E0F0E1018215A635AF7F7EFFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9DE2FF00B4FF00B4FF00B4
FF00B4FF00B4FF00B4FF00AFFF89DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF10B9FF00B3FF00B4FF00
B4FF00B4FF00B4FF00B3FF1ABDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADBBBBBBBBBBBBB
8689960017330017330017335A635A5A635A4E4E4E0C2849895A26A56B29A56B
29A56B29A56B29A56B29A56B29A56B29B55221D81605D81605D81605DE2110FF
ABABFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADBBB
BBBBBBBBBB8689960017330017330017335A635A5A635A4E4E4E0C28494A358C
5549995549995549995549995549995549995549994A358C0404850404850404
85212184B3B3CDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEDADADBBBBBBBBBBBBB8689960017330017330017335A635A5A635A4E4E4E0C
28490C737306878706878706878706878706878706878706878706878700D8D8
00D8D800D8D800D8D8ABFFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000330000
4800004800004800005800005800005800005800005800006D00006D00006D00
006D00006D00006D000058000058000058000058000058000058000058000058
00006D00006D00006D00006D0000580000580000580000580000580000580000
4800004800004800004800004800005800005800006D00006D00006D00006D00
006D000058000048000048000048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEAABD9C2A542A425A164963104963104963104963104963104963104963
1008740108740108740100840000840000840000840000840000840008740125
5A002431090E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E
0E0F0E0C2B050042080042080042080042080042080042080042080042080042
080042080042080042080042080042088CAD94FEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFE98B9FF1663FE0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA1663FE1663FE1663FE266AFE266AFE266AFE266AFE266AFE266A
FE1663FE105AFE002D9400185200173300173300173300173300173300173300
173305296F002D94002D940243CC0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA8CB5FFFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFECACACA5A635A4E4E4E4E4E4E5A635A6E6E6E6E6E
6E5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E423942423942423942303030211821211821211821101821211821
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030301018210E0F
0E0E0F0E303030423942CACACAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF84DDFF00B4FF00B8FF00B8FF00B8FF00B8FF00B8FF00B3FF80DBFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0
FBFF0FBCFF00B7FF00B8FF00B8FF00B8FF00B8FF00B8FF0FBCFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEDADADBBBBBBBBBBBBB9495A52139520017330521364E4E4E4E4E4E0C28
49001733B79670DAB587DAB587DAB587DAB587D6AD7BC69C6BC69C6BB1865089
5A267B52188B51128B5112FF0202FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEDADADBBBBBBBBBBBBB9495A52139520017330521364E4E4E
4E4E4E0C28490017335256B56F68D76F68D76F68D76F68D7847BEF9292D19292
D18484B952427B432A7A432A7A432A7A040485FEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEDADADBBBBBBBBBBBBB9495A521395200173305
21364E4E4E4E4E4E0C28490017334E8E8952A59C52A59C52A59C52A59C52A59C
4E8E894E8E894E8E890687870C737306878706878702FFFFFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE00003300004800004800004800005800006D00006D00006D00
006D00006D00006D00006D00006D00006D00006D000058000058000058000058
00005800005800005800005800006D00006D00006D00006D0000580000580000
5800005800005800005800004800004800004800005800005800005800006D00
006D00006D00006D00006D00006D000058000048000048000048000033FEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEAABD9C4963104963104963104963104963
1049631049631049631049631049631049631049631000840000840000840000
84000084000084000084000874010E0F0E0E0F0E0C2B050C2B050C2B050C2B05
0C2B050C2B050C2B050E0F0E0E0F0E0E0F0E0C2B050042080042080042080042
080042080042080042080042080042080042080042080042080042088CAD94FE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE98B9FF0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA266AFE266A
FE266AFE266AFE266AFE266AFE266AFE2965D60E0F0E0521360D468D0D468D0D
468D0D468D0D468D0D468D0D468D0013280E0F0E0E0F0E002D940052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA8CB5FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFECACACA9696964239424239425A635A6E6E
6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4239424E4E4E423942423942
4239424239423030303030303030301018212118211018210E0F0E1018212118
2130303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030302118211018210E0F0E0E0F
0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E101821303030969696FE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF3ECCFF00B9FF00BBFF00BBFF00BBFF00BBFF00
BBFF00B6FF80DEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFF0FBFF0FBFFF00BAFF00BBFF00BBFF00BBFF00BBFF
00BBFF0FBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDCACACACACACACACACA99A8AF2139
520521360013280017330C28490C2849C6C8D6EDEDEDEDEDEDEDEDEDEDEDEDC6
BDBD9C948C9C948C9C948C857B7A5242298B51128B5112FF0202FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDCACACACACACACACACA
99A8AF2139520521360013280017330C28490C284905296F0404850404850404
850404855549999495A59495A59495A575748939314A432A7A432A7A040485FE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDCACACACA
CACACACACA99A8AF2139520521360013280017330C28490C28497BC6D694F6F9
94F6F994F6F994F6F994ADCE8494948494948494947B847B2139520687870687
8702FFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE00003300004800004800004800
005800006D00006D00006D00006D00006D00006D00006D00006D00006D000058
0000580000580000580000480000480000580000580000580000580000580000
6D00006D00006D00006D00005800005800005800005800005800005800005800
005800005800006D00006D00006D00006D00006D00006D000058000058000048
000048000048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBC6A65973
2849631044692532663944692549631059732859732859732859732844733632
66394963104963104963100874010084000084000C2B050E0F0E0C2B05214718
3266393266393266393266397BA98486BC8A86BC8A2A542A0C2B050E0F0E0C2B
0500420800420800420800420800420800420800420800420800420800420800
42080042080042088CAD94FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
98B9FF105AFE0052FA105AFE266AFE105AFE0052FA105AFE105AFE105AFE105A
FE1663FE266AFE266AFE266AFE266AFE266AFE266AFE266AFE05296F00132805
296F0035AF0243CC0243CC0243CC0243CC1863EF216BEF216BEF0243CC002D94
0E0F0E002D940052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA8CB5FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9696965A635A4239425A63
5A5A635A6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4239424239424239424239424239424239424239424239424239424239
424239423030303030302118212118212118211018210E0F0E0E0F0E0E0F0E0E
0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E
0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E1018212118212118212118212118
2121182121182121182121182121182121182121182121182121182121182110
18210E0F0E0E0F0E0E0F0E211821FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF23C6FF00BCFF00
BDFF00BDFF00BDFF00BDFF00BDFF00B8FF80DEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FBFF0FC1FF00BCFF
00BDFF00BDFF00BDFF00BDFF00BDFF0FC1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7EFEDEDEDEDEDEDED
EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDDADADBCACA
CACACACACACACACACACAADADBB2139520C28490C2849213952213952857B7A94
8C8C948C8C948C8C948C8CB79670CE9C5ACE9C5AB186508B51128B51128B5112
8B5112FF0202FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7EFEDED
EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
DADADBCACACACACACACACACACACACAADADBB2139520C28490C28492139522139
527574898689968689968689968689968484B9847BEF847BEF6F68D7432A7A43
2A7A432A7A432A7A212184FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
F7F7EFEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
EDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDEDED
EDEDEDEDEDDADADBCACACACACACACACACACACACAADADBB2139520C28490C2849
2139522139527792858494948494948494948494944E8E89318C84318C84318C
8406878706878706878706878702FFFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE00
003300004800004800004800005800006D00006D00006D00006D00006D00006D
0000580000580000580000580000480000480000480000480000480000480000
5800005800005800005800006D00006D00006D00006D00005800005800005800
005800005800005800005800005800006D00006D00006D00006D000058000058
000058000058000058000048000048000048000033FEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFED1D4B69CA584597328526B18446925447336446925526B1859732859
7328597328597328547331447336526B184469254469252D6B09087401005800
0C2B050E0F0E1148162A542A397342779C7B779C7B779C7BB7DBB9ADDEB59CCE
A55487563266390E0F0E0C2B0504461000420800420800420800420800420800
4208004208004208004208004208004208004208638C65ADC6B5FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEB5CEFF689AFF105AFE105AFE105AFE1663FE105AFE105A
FE105AFE105AFE105AFE105AFE1663FE1663FE1663FE266AFE266AFE266AFE18
63EF0944B70018520017330D468D0944B70243CC5284E75284E75284E7689AFF
538CFE266AFE125AED0243CC00104A0035AF004AE90052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA689AFFA9C6FFFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9696963030
304E4E4E5A635A6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E
6E6E6E6E6E6E6E6E5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4239424239424239424239424239
4242394242394242394242394242394242394230303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
30303030303030303030303030303030301018210E0F0E0E0F0EFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF14C4FF00BEFF00BEFF00BEFF00BEFF00BEFF00BEFF00B9FF80DFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFF0FBFF0FC2FF00BDFF00BEFF00BEFF00BEFF00BEFF00BEFF0FC2FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFE6E6E6E5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A
5A635A5A635A5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E868686CACACACACACACACACACACACACACACA96969696969696
9696969696969696895A268B51128B51128B51128B51128B51128B51128B5112
B53910FF0202FF0202FF0202FF0202FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE6E6E6E5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A
635A5A635A5A635A5A635A5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E868686CACACACACACACACACACACACACACACA9696
969696969696969696969696964A358C432A7A432A7A432A7A432A7A432A7A43
2A7A432A7A31217B040485040485040485040485FEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFE6E6E6E5A635A5A635A5A635A5A635A5A635A5A63
5A5A635A5A635A5A635A5A635A5A635A5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E868686CACACACACACACACACACACACA
CACACA9696969696969696969696969696960687870687870687870687870687
8706878706878706878700B1B102FFFF02FFFF02FFFF02FFFFFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFE00003300004800004800004800005800006D00006D
00006D00006D00006D0000580000580000580000580000480000480000330000
3300004800004800004800004800004800005800005800005800005800006D00
006D00006D00006D00005800005800005800005800005800006D00006D00006D
00006D00006D0000580000580000580000580000580000480000480000480000
33FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE59732859732859732859732859732859
7328597328597328597328597328597328597328597328597328597328547331
397342597328425A160E0F0E0C2B05044610397342397342397342FEFEFEFEFE
FEFEFEFEFEFEFEDEE9ED9CCEA59CCEA586BC8A11481611481611481600420800
4208004208004208004208004208004208004208004208004208004208004208
004208004208FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE105AFE105AFE105AFE105A
FE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE10
5AFE1663FE266AFE105AFE0944B70E0F0E0018520D468D0243CC0243CC0243CC
FEFEFEFEFEFEFEFEFEFEFEFEBDD6FF266AFE266AFE266AFE004AE9004AE9004A
E90052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE5A635A6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E
6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E5A635A4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E42394242394242394242394242394242394242394230303042
3942303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
303030101821FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF11C3FF00BEFF00BEFF00BEFF00BEFF
00BEFF00BEFF00B9FF80DFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FBFF0FC2FF00BDFF00BEFF00BEFF00BE
FF00BEFF00BEFF0FC2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFE5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A
5A635A5A635A5A635A5A635A5A635A5A635A5A635A4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E868686CACACAADB5B596969696
9696969696948C8C2118212118210C28490C2849D81605FF0202FF0202FF0202
FF0202FF0202FF0202FF0202FF5252FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFE5A635A5A635A5A635A5A635A5A635A5A635A5A
635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E868686CACACAADB5
B5969696969696969696948C8C2118212118210C28490C284904048504048504
04850404850404850404850404850404855256B5FEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE5A635A5A635A5A635A5A635A5A63
5A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E868686
CACACAADB5B5969696969696969696948C8C2118212118210C28490C284900DE
E702FFFF02FFFF02FFFF02FFFF02FFFF02FFFF02FFFF52FFFFFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE000033000048000048
00004800005800006D00006D00006D00006D00006D0000580000580000580000
5800004800004800003300003300004800004800004800004800004800005800
005800005800005800006D00006D00006D00006D000058000058000058000058
00005800006D00006D00006D00006D00006D0000580000580000580000580000
58000048000048000048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE59732859
7328597328597328597328597328597328597328597328597328597328597328
597328597328597328597328597328597328425A160E0F0E0C2B050C2B050446
10779C7BDADADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEECF7EC8CB5945487560C
2B05114816114816004208004208004208004208004208004208004208004208
004208004208004208004208004208004208FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE10
5AFE105AFE105AFE105AFE105AFE105AFE1663FE105AFE0944B70E0F0E05296F
002D940243CC6B94E7CADBFEFEFEFEFEFEFEFEFEFEFEFEFEEFF7FCCADBFE689A
FF3773EF0035AF0243CC004AE90052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FAFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE3030304239425A635A5A635A5A
635A6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E
6E6E6E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E42
3942423942303030423942303030423942303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030305A635AFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1CC4FF
00BCFF00BDFF00BDFF00BDFF00BDFF00BDFF00B8FF80DEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FBFF0FC1
FF00BCFF00BDFF00BDFF00BDFF00BDFF00BDFF0FC1FFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9663238B51128B5112
655A565A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A63
5A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E86868696969696969696969696969696
96969696966E6E6E4E4E4EBBBBBBBBBBBBB5ADAD0E0F0E0E0F0EEDEDEDFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE2556930D
468D0D468D4A5A6B5A635A5A635A5A635A5A635A5A635A5A635A5A635A5A635A
5A635A5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E8686869696969696969696
969696969696969696966E6E6E4E4E4EBBBBBBBBBBBBB5ADAD0E0F0E0E0F0EED
EDEDFEFEFEEFF7FCEFF7FCEFF7FCEFF7FCEFF7FCEFF7FCEFF7FCEFF7FCFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FE0404850404850404854242635A635A5A635A5A635A5A635A5A635A5A635A5A
635A5A635A5A635A5A635A4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E868686969696
9696969696969696969696969696966E6E6E4E4E4EBBBBBBBBBBBBB5ADAD0E0F
0E0E0F0EEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFE00003300004800004800004800005800006D00006D00006D00006D0000
6D00005800005800005800005800004800004800003300003300004800004800
004800004800005800005800005800005800005800006D00006D00006D00006D
00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D0000
58000058000058000058000058000048000048000048000033FEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFE597328597328637A2D637A2D637A2D637A2D637A2D637A2D
637A2D637A2D637A2D637A2D637A2D637A2D637A2D637A2D637A2D597328425A
160E0F0E0E0F0E0C2B050042088CAD94FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFE8CAD8C5487560C2B05114816114816004208004208004208004208
004208004208004208004208004208004208004208004208004208004208FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFE105AFE105AFE105AFE105AFE105AFE105AFE10
5AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE105AFE
105AFE0944B70E0F0E05296F002D940243CC8CADE7FEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFE77A5FF3773EF002D940243CC004AE90052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFE948C8C4E4E4E2118213030304239424E4E4E4E4E4E5A635A5A635A6E6E6E
6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E423942423942423942303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030302118210E0F0E868686FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF2FC7FF00B9FF00BBFF00BBFF00BBFF00BBFF00BBFF00B6
FF80DDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFF0FBFF0FBFFF00BAFF00BBFF00BBFF00BBFF00BBFF00BBFF0F
BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEF7EFEDA57B42A56B29895A267B52187B52187B52187B52187B52187B52
187B52187B52187B5218895A26B5ADAD0E0F0E0E0F0E21182110182110182110
18211018211018211018211018211018212118213030304239424E4E4EADB5B5
001328001328F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEEAEEFA4A73AF2963A5255693255693255693255693255693
255693255693255693255693255693255693B5ADAD0E0F0E0E0F0E2118211018
211018211018211018211018211018211018211018212118213030304239424E
4E4EADB5B5001328001328F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEEAEEFA0303EC0303EC0000AD04048504048504
0485040485040485040485040485040485040485212184B5ADAD0E0F0E0E0F0E
2118211018211018211018211018211018211018211018211018212118213030
304239424E4E4EADB5B5001328001328F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000330000480000480000480000580000
6D00006D00006D00006D00006D00005800005800005800005800004800004800
0048000048000033000033000048000058000058000058000058000058000058
00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D0000
6D00006D00006D00005800005800005800005800005800005800004800004800
0048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE597328637A2D6B8B386B8B38
6B8B386B8B386B8B386B8B386B8B386B8B386B8B386B8B386B8B386B8B386B8B
386B8B386B8B38637A2D425A160E0F0E0E0F0E0C2B050042088CAD94FEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8CAD8C5487560C2B05114816114816
0042080042080042080042080042080042080042080042080042080042080042
08004208004208004208FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE105AFE1663FE26
6AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE266AFE
266AFE266AFE266AFE266AFE105AFE0944B70E0F0E05296F002D940243CC8CAD
E7FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE77A5FF3773EF002D9402
43CC004AE90052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7F7EF9696964E4E4E303030
3030304239424E4E4E4E4E4E4E4E4E4E4E4E5A635A5A635A5A635A4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E4E
4E4E4E4E4E4E4E4E4E4239424239424239424239423030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030301018214E4E
4E969696FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF61D3FF00B4FF00B7FF00B7
FF00B7FF00B7FF00B7FF00B2FF80DCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FBFF0FBBFF00B6FF00B7FF00
B7FF00B7FF00B7FF00B7FF0FBBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7EFEDEDE9DEB186509663238B51
128B51128B51128B51128B51128B51128B51128B51128B5112895A2630303021
18210E0F0E0E0F0E0E0F0E211821303030303030303030303030303030303030
4E4E4EADB5B5ADB5B5CACACAA8A8A8001328F7F7EFFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEAEEFADEE9ED5A84B5
2556932556930D468D0D468D0D468D0D468D0D468D0D468D0D468D2556932556
933030302118210E0F0E0E0F0E0E0F0E21182130303030303030303030303030
30303030304E4E4EADB5B5ADB5B5CACACAA8A8A8001328F7F7EFFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED8D8FFD8
D8FF3535EF0303EC0000AD040485040485040485040485040485040485040485
0404852121843030302118210E0F0E0E0F0E0E0F0E2118213030303030303030
303030303030303030304E4E4EADB5B5ADB5B5CACACAA8A8A8001328F7F7EFFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000330000
4800004800004800005800006D00006D00006D00006D00006D00006D00005800
0058000058000058000048000048000048000048000048000048000058000058
00005800005800006D00006D00006D00006D00006D00006D0000580000580000
5800005800005800006D00006D00006D00006D00006D00005800005800005800
0058000058000048000048000048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
6B8B386B8B386B8B38769147769147769147769147769147769147849C4E8CAA
578CAA5777A55A739C63739C63739C63739C63849C4E5A73420E0F0E0E0F0E0C
2B05004208296331548756FEFEFEFEFEFEFEFEFEFEFEFED8EAD994B59C6B9873
5487560C2B051148161148160042080042080042080042080042080042080042
08004208004208004208004208004208004208004208FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFE1663FE1663FE266AFE2973FE2973FE2973FE2973FE2973FE2973FE
3377FE3377FE3377FE3377FE2973FE2973FE2973FE2973FE266AFE295AB50E0F
0E05296F002D940243CC2965D6527BDEFEFEFEFEFEFEFEFEFEFEFEFED9E7FE84
ADFF538CFE3773EF002D940243CC004AE90052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FAFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEEDEDED8686863030303030304239424239424E4E4E4E4E
4E4E4E4E4E4E4E42394230303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030423942423942423942
4239424239424239424239424239424239424239424239424239424239424239
4230303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030302118212118
21303030868686C6BDBDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF9BE2FF00B1FF00B3FF00B3FF00B3FF00B3FF00B3FF00AEFF81DAFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF2
FBFF0FB8FF00B2FF00B3FF00B3FF00B3FF00B3FF00B3FF14B9FFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEEDE9DEE8D7C7B796709663239663239663239663239663238B51128B
51128B51128B5112A8A8A8969696303030303030303030303030303030303030
3030304E4E4E5A635A5A635A7B847BCACACACACACACACACACACACA99A8AFFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEDEE9EDD6DEEF6B8CBD2556932556932556932556932556
930D468D0D468D0D468D255693A8A8A896969630303030303030303030303030
30303030303030304E4E4E5A635A5A635A7B847BCACACACACACACACACACACACA
99A8AFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFED8D8FFC6C6FF4A4AEF0303EC0303EC0303EC
0303EC0000D9040485040485040485040485A8A8A89696963030303030303030
303030303030303030303030304E4E4E5A635A5A635A7B847BCACACACACACACA
CACACACACA99A8AFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE00003300004800004800004800005800006D00006D00006D00
006D00006D00006D00006D00006D00006D000058000058000048000058000058
00005800005800005800005800006D00006D00006D00006D00006D00006D0000
6D00006D00005800005800005800005800005800006D00006D00006D00006D00
006D00006D00006D00006D000058000058000048000048000048000033FEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFE849C4E7691476B8B38849C4E849C4E849C4E849C
4E849C4E849C4E8CAA5792B26D92B26D92B26D75AF7475AF7475AF7475AF7492
B26D7691470E0F0E0C2B050C2B05004208004208004208D8EAD9EDEDEDEDEDED
EDEDEDB7DBB963946B5487564574460C2B051148161148160042080042080042
080042080042080042080042080042080042080042080042080042081052182A
542AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE3377FE3377FE266AFE3377FE3377FE
3377FE3377FE3377FE3377FE427BFE4384FE4384FE3377FE3377FE3377FE3377
FE3377FE3377FE2965D600082505296F002D940944B70243CC0243CCD9E7FED9
E7FED9E7FED9E7FEB5CEFF4384FE3377FE2965D6002D940035AF004AE90052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA105AFE266AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBBB
BB7B847B4239423030304239424239424E4E4E42394230303030303030303030
3030303030303030303030303030303030303030423942423942423942423942
4239424239424239424239424239424239424239424239424239423030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030301018211018211018211018210E0F0E0E0F
0E0E0F0E0E0F0E4E4E4EBBBBBBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFB0E6FF00AEFF00AEFF00AEFF00AEFF00AEFF00
AEFF00A8FF81D7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFF1FBFF0FB3FF00ADFF00AEFF00AEFF00AEFF00AEFF
00ADFF31BEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDE9DEE8D7C7E8D7C7E8
D7C7E8D7C7DAB587966323966323966323966323B18650BBBBBB969696423942
3030304E4E4E5A635A5A635A5A635A5A635A6E6E6E948C8CCACACACACACACACA
CACACACACACACACACACADADADBB5ADADF7EFEDFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDEE9EDC6D6
E7C6D6E7C6D6E7C6D6E794ADCE2556932556932556932556935A84B5BBBBBB96
96964239423030304E4E4E5A635A5A635A5A635A5A635A6E6E6E948C8CCACACA
CACACACACACACACACACACACACACACADADADBB5ADADF7EFEDFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
D8D8FFB5B5FFB5B5FFB5B5FFB5B5FF7B7BF70000D90000D90000D90000D93535
EFBBBBBB9696964239423030304E4E4E5A635A5A635A5A635A5A635A6E6E6E94
8C8CCACACACACACACACACACACACACACACACACACADADADBB5ADADF7EFEDFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE00003300004800004800004800
005800006D00006D00006D00006D00006D00006D00006D00006D00006D00006D
00005800005800005800005800005800006D00006D00006D00006D00006D0000
6D00006D00006D00006D00005800005800005800005800005800005800005800
005800006D00006D00006D00006D00006D00006D00006D00006D000058000048
000048000048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1D4B6849C
4E849C4E849C4E92B26D92B26D8CAA5775AF7492B26D92B26D92B26D92B26D86
BC8AA5C674ADD08C9CCEA5A5C674A5C6749CCEA53030300E0F0E0C2B05004208
00420800420818532139734239734245744663946B2147180C2B050E0F0E0C2B
0500420800420800420800420800420800420800420800420800420800420800
42080042080042088CAD94FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
A9C6FF3377FE3377FE2973FE266AFE266AFE266AFE3377FE427BFE4384FE4384
FE4384FE4384FE4384FE538CFE689AFF689AFF5A94FF2973FE0C28490E0F0E0D
468D0035AF0243CC0243CC0243CC0243CC0243CC125AED4384FE0944B705296F
0E0F0E002D940052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA8CB5FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBBBBB7B847B42394230303030
3030303030303030423942423942423942423942423942423942423942423942
4E4E4E4239424239424239424239424239424239424239424239424239424239
4242394230303042394230303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030302118211018211018211018210E0F0E0E0F0E0E0F0E0E0F0E1018211018
211018213030301018210E0F0E868686BBBBBBFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD0EFFF02A9FF00
A8FF00A9FF00A9FF00A9FF00A9FF00A7FF24B4FF48C0FF48C0FF48C0FF48C0FF
48C0FF48C0FF48C0FF48C0FF48C0FF48BFFF52C4FFF4FCFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA4E0FF48BCFF48C0FF48
C0FF48C0FF48C0FF48C0FF48C0FF48C0FF48C0FF48C0FF43BFFF04AAFF00A8FF
00A9FF00A9FF00A9FF00A9FF00A6FF63CBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEF7EFEDD1D4B6D1D4B6D1D4B6D1D4B6
D1D4B6BBBBBBBBBBBB9696965A635A6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E6E
6E948C8CBBBBBBDADADBCACACACACACACACACACACACACACACAADB5B5DADADBF7
F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEAEEFAB6C8DAB6C8DAB6
C8DAB6C8DAB6C8DABBBBBBBBBBBB9696965A635A6E6E6E6E6E6E6E6E6E6E6E6E
6E6E6E6E6E6E948C8CBBBBBBDADADBCACACACACACACACACACACACACACACAADB5
B5DADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEAEEFAA5A5
FFA5A5FFA5A5FFA5A5FFA5A5FFBBBBBBBBBBBB9696965A635A6E6E6E6E6E6E6E
6E6E6E6E6E6E6E6E6E6E6E948C8CBBBBBBDADADBCACACACACACACACACACACACA
CACACAADB5B5DADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE00
003300004800004800004800005800006D00006D00006D00006D00006D00006D
00006D00006D00006D00006D00005800005800005800005800005800006D0000
6D00006D00005800005800006D00006D00005800005800005800005800004800
004800004800004800004800005800005800005800006D00006D00006D00006D
00006D00006D000058000048000048000048000033FEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFED1D4B6849C4E77A55A8CAA5792B26D92B26D92B26D92B26D92
B26D95BD8492B26DA5BD77A5BD7798CA94ADD08CADD08CADD08C98CA94ADD08C
739C635667350E0F0E0C2B050C2B050C2B050C2B052147182147182147182A54
2A0C2B050E0F0E0E0F0E0C2B0500420800420800420800420800420800420800
42080042080042080042080042080042080042088CAD94FEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEA9C6FF3377FE3377FE2973FE266AFE266AFE266A
FE266AFE3377FE4384FE4384FE4384FE4384FE5A94FF538CFE4384FE689AFF68
9AFF538CFE4A73AF25569300173305296F0035AF0035AF0035AF0035AF0035AF
0944B7295AB50018520017330E0F0E002D940052FA0052FA0052FA0052FA0052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA8CB5FFFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEBBBBBB7B847B3030300E0F0E423942423942423942423942
4239424239424239424239424239424239424239424239424239424239424239
4242394242394242394242394242394242394230303030303030303030303030
3030303030303030303030303030303030303030303030211821101821101821
1018210E0F0E0E0F0E0E0F0E0E0F0E1018211018211018212118213030303030
303030303030303030303030302118213030304E4E4ECACACAFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFEEF9FF1AABFF00A0FF00A2FF00A2FF00A2FF00A2FF00A2FF00A0FF
009EFF009EFF009EFF009EFF009EFF009EFF009EFF009EFF009EFF009CFF04A4
FFEFF9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFF7ACFFF0097FF009EFF009EFF009EFF009EFF009EFF009EFF009EFF009EFF
009EFF009EFF00A1FF00A2FF00A2FF00A2FF00A2FF00A2FF02A0FF94D9FFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDEDEDEDBBBBBBA8A8A87B847B6E6E
6EA8A8A8CACACACACACA9696966E6E6E948C8CB5ADADCACACACACACACACACACA
CACACACACACACACACACACADADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDEDEDEDBBBBBBA8A8A8
7B847B6E6E6EA8A8A8CACACACACACA9696966E6E6E948C8CB5ADADCACACACACA
CACACACACACACACACACACACACACACACADADADBF7F7EFFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDEDEDEDBB
BBBBA8A8A87B847B6E6E6EA8A8A8CACACACACACA9696966E6E6E948C8CB5ADAD
CACACACACACACACACACACACACACACACACACACACACADADADBF7F7EFFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFE00003300003300003300004800005800006D00006D
00006D00006D00006D00006D00006D00006D00006D00006D0000580000580000
5800005800005800006D00006D00006D00005800005800006D00006D00005800
0058000058000058000048000048000048000048000048000058000058000058
00006D00006D00006D00006D00006D00006D0000580000480000480000480000
33FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1D4B6849C4E75AF7475AF7492
B26D92B26D92B26D92B26D95BD8486BC8AA5C674A5C674A5C6749CCEA5ADD08C
ADD08C9CCEA598CA94A5C674A5C67492B26D0E0F0E0E0F0E0C2B050C2B050C2B
050C2B050C2B050C2B050C2B050E0F0E0E0F0E0E0F0E0C2B0500420800420800
4208004208004208004208004208004208004208004208004208004208004208
8CAD94FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEA9C6FF3377FE3377
FE2973FE266AFE266AFE266AFE266AFE3377FE3377FE4384FE4384FE4384FE68
9AFF538CFE3377FE5A94FF689AFF689AFF689AFF5A84DE0E0F0E001852002D94
002D94002D94002D94002D94002D94002D940008250E0F0E0E0F0E002D940052
FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA8CB5FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBBBBB2118210E0F0E
0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F
0E0E0F0E10182110182110182110182110182110182110182110182110182110
18211018211018211018211018211018211018210E0F0E0E0F0E0E0F0E0E0F0E
0E0F0E1018211018211018212118213030303030303030303030303030303030
303030303030303030303030303030303030301018214E4E4E948C8CEDEDEDFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCFEFF74C9FF0099FF009BFF009CFF
009CFF009CFF009CFF009CFF009CFF009CFF009CFF009CFF009CFF009CFF009C
FF009CFF009CFF009AFF0FA1FFF0F9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFF80CEFF0095FF009CFF009CFF009CFF009CFF
009CFF009CFF009CFF009CFF009CFF009CFF009CFF009CFF009CFF009CFF009C
FF009BFF0FA1FFD8F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEEDEDEDDADADBCACACABBBBBBEDEDEDFEFEFEFEFEFEDADADB9696965A635A6E
6E6E969696A8A8A8CACACACACACACACACACACACACACACACACACADADADBDADADB
F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEEDEDEDDADADBCACACABBBBBBEDEDEDFEFEFEFEFEFEDADADB9696
965A635A6E6E6E969696A8A8A8CACACACACACACACACACACACACACACACACACADA
DADBDADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEEDEDEDDADADBCACACABBBBBBEDEDEDFEFEFEFEFEFE
DADADB9696965A635A6E6E6E969696A8A8A8CACACACACACACACACACACACACACA
CACACACADADADBDADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9495A59495A5636384
00003300005800005800006D00006D00006D00006D00006D00006D00006D0000
6D00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D00
006D00006D00006D000058000058000058000058000048000048000048000048
00004800005800005800005800006D00006D00006D00006D00006D0000580000
580000480000483131639495A5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1
D4B692B26D92B26D92B26D86BC8AA5BD77A5C674A5C674A5C674A5C6749CCEA5
ADD08CADD08CADD08CADD08C9CCEA5A5C674A5BD7786BC8A92B26D92B26D86BC
8A3266390E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0C2B0500420831
5200315200315200004208004208004208004208004208004208004208004208
0042080042080042080042088CAD94FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFE98B9FF266AFE266AFE266AFE427BFE3377FE2973FE2973FE2973FE29
73FE2973FE2973FE2973FE2973FE4384FE689AFF4384FE4384FE4384FE4384FE
4384FE427BFE21397B0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E0035
AF004AE90052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA8CB5FFFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFE0E0F0E1018213030304239423030302118212118212118212118212118
212118212118212118211018211018211018211018211018211018211018210E
0F0E0E0F0E0E0F0E0E0F0E0E0F0E0E0F0E101821101821101821211821211821
3030303030303030303030303030303030303030303030303030303030303030
303030303030303030303030303030303030303030302118210E0F0E4E4E4ECA
CACAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
C7E8FF0093FF0093FF0094FF0094FF0094FF0094FF0094FF0094FF0094FF0094
FF0094FF0094FF0094FF0094FF0094FF0094FF0092FF0F9BFFF0F9FFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80CAFF008DFF
0094FF0094FF0094FF0094FF0094FF0094FF0094FF0094FF0094FF0094FF0094
FF0094FF0094FF0094FF0094FF0090FF4AB3FFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEDADADB9696969696964E4E4E5A635A969696CACACACACACACACACA
CACACACACACACACACACACACADADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEDADADB9696969696964E4E4E5A635A969696CACACACA
CACACACACACACACACACACACACACACACACADADADBF7F7EFFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB9696969696964E4E4E5A635A9696
96CACACACACACACACACACACACACACACACACACACACACADADADBF7F7EFFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEB3B3CD00003300004800005800005800005800006D0000
6D00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D00
006D00006D00005800006D00006D00006D00006D000058000058000058000058
00004800003300003300004800004800004800004800005800005800006D0000
6D00006D00006D00005800004800004800003358587AFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEEDE9DEBDD6A595BD8495BD8495BD8495BD84ADD08C
ADD08CADD08CA5C6749CCEA59CCEA5ADD08CADD08CADD08C98CA9495BD8495BD
8495BD8492B26D92B26D95BD845A73423142182431092431092431092431090C
2B05004208005800005800174A00244A00315200174A00004208004208004208
004208004208004208004208004208004208085218779C7BCAD6C8FEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECADBFE8CB5FF3377FE2973FE427BFE33
77FE2973FE2973FE3377FE4384FE2973FE2973FE2973FE4384FE538CFE689AFF
4384FE4384FE4384FE4384FE4384FE4384FE295AB521397B21397B05296F0529
6F05296F05296F21397B2965D6125AED004AF70052FA0052FA0052FA0052FA00
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA105AFE77A5FFCADBFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADBCAD6C85A635A5A635A1018213030
304239424239424E4E4E4E4E4E4E4E4E42394242394242394242394242394242
3942423942423942423942303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303021182130
3030948C8CDADADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFF4FAFF2EA0FF0087FF008BFF008BFF008BFF008B
FF008BFF008BFF008BFF008BFF008BFF008BFF008BFF008BFF008BFF008BFF00
89FF0F92FFF0F8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFF80C5FF0083FF008BFF008BFF008BFF008BFF008BFF008BFF008B
FF008BFF008BFF008BFF008BFF008BFF008BFF008BFF008BFF0288FFB4DDFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDED7B847B4E4E4E
423942969696A8A8A8CACACACACACACACACACACACACACACABBBBBBDADADBF7F7
EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDED7B
847B4E4E4E423942969696A8A8A8CACACACACACACACACACACACACACACABBBBBB
DADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEEDEDED7B847B4E4E4E423942969696A8A8A8CACACACACACACACACACACACACA
CACABBBBBBDADADBF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD0000330000480000
5800005800005800006D00006D00006D00006D00006D00006D00006D00006D00
006D00006D00006D00006D00006D00005800005800006D00006D00006D000058
0000580000580000480000480000480000330000330000480000480000480000
4800005800005800006D00006D00006D00006D00005800004800004800003358
587AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE98CA94
95BD84A5C67498CA949CCEA59CCEA5ADD08CADD08C9CCEA59CCEA59CCEA5A5C6
74A5C674A5C67486BC8A86BC8A92B26D92B26D92B26D92B26D849C4E6B8B3859
7328526B224963104963102D6B09008400008400087401004208244A00315200
315200174A000042080042080042080042080042080042080042080042082A54
2AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFE4384FE3377FE427BFE3377FE2973FE2973FE538CFE689AFF2973FE2973FE
2973FE689AFF689AFF689AFF4384FE4384FE4384FE4384FE4384FE4384FE3377
FE3377FE4384FE266AFE0052FA0052FA1663FE4384FE4384FE3377FE004AE900
52FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA
0052FA266AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEDADADBCACACA5A635A30303021182130303042394242394242
3942423942423942423942423942423942423942423942423942423942303030
3030303030303030303030303030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
30300E0F0E4E4E4E948C8CEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0E0FF0383
FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF00
83FF0083FF0083FF0083FF0081FF0F8BFFF0F8FFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80C2FF007AFF0083FF0083FF0083
FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF0083FF00
84FF0080FF2998FFF9FCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEEDEDED8686866E6E6E4239424E4E4E969696969696B5ADADBBBB
BBCACACABBBBBBBBBBBBCACACAEDEDEDEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEEDEDED8686866E6E6E4239424E4E4E969696969696
B5ADADBBBBBBCACACABBBBBBBBBBBBCACACAEDEDEDEDEDEDFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDED8686866E6E6E4239424E4E4E96
9696969696B5ADADBBBBBBCACACABBBBBBBBBBBBCACACAEDEDEDEDEDEDFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEB3B3CD00003300004800005800005800005800006D00006D00006D00006D00
006D00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D
00006D00006D00006D0000580000580000580000480000480000480000480000
4800004800004800005800005800005800006D00006D00006D00006D00006D00
005800004800004800003358587AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEADD08CA5C674A5C67498CA949CCEA5ADD08CADD08CADD0
8C9CCEA598CA94A5C674A5C674A5C674A5C674A5C674A5BD7786BC8A92B26D8C
AA57849C4E7691476B8B384963104963104963104963102D6B09008400008400
0084000084000058000042083152003152003152000042080042080042080042
080042080042080042082A542AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFE538CFE3377FE427BFE3377FE3377FE689AFF
689AFF689AFF2973FE4384FE689AFF689AFF689AFF689AFF689AFF538CFE2973
FE3377FE4384FE3377FE3377FE3377FE105AFE0052FA0052FA0052FA1663FE43
84FE4384FE3377FE3377FE125AED004AE90052FA0052FA0052FA0052FA0052FA
0052FA0052FA0052FA0052FA0052FA266AFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEDEDEDED
EDED948C8C4E4E4E211821423942423942423942423942423942423942423942
4239424239424239424239423030303030303030303030303030303030303030
3030303030303030303030303030303030303030303030303030303030303030
30302118211018212118216E6E6ECACACAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFBFDFF4CA4FF0078FF007DFF007DFF007DFF007DFF007DFF00
7DFF007DFF007DFF007DFF007DFF007DFF007DFF007DFF007BFF0F85FFF0F7FF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80BE
FF0073FF007DFF007DFF007DFF007DFF007DFF007DFF007DFF007DFF007DFF00
7DFF007DFF007DFF007DFF007CFF0079FF9BCCFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE6E6E6E6E6E
6E6E6E6E4E4E4E6E6E6E969696969696B5ADADBBBBBBBBBBBBBBBBBBCACACAF7
F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
6E6E6E6E6E6E6E6E6E4E4E4E6E6E6E969696969696B5ADADBBBBBBBBBBBBBBBB
BBCACACAF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFE6E6E6E6E6E6E6E6E6E4E4E4E6E6E6E969696969696B5ADADBBBBBB
BBBBBBBBBBBBCACACAF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD00003300004800005800005800005800
005800005800005800005800005800006D00006D00006D00006D00006D00006D
00006D00006D00006D00006D00006D00006D00006D0000580000580000580000
4800004800004800004800004800004800004800005800005800005800006D00
006D00006D00006D00006D00005800004800003300003358587AFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADD08CADD08CA5C67498CA
949CCEA5ADD08CADD08CADD08C98CA94ADD08CA5C674A5C674A5BD77A5BD77A5
C674A5BD7786BC8A92B26D8CAA577691476B8B386B8B38446925446925496310
4963102D6B090084000084000084000084000058000042083152003152003152
00174A00004208004208004208004208004208457446779C7BFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE538CFE4384FE
538CFE3377FE3377FE538CFE538CFE538CFE4384FE538CFE689AFF689AFF689A
FF5A94FF689AFF5A94FF2973FE3377FE4384FE3377FE2973FE266AFE105AFE10
5AFE0052FA0052FA1663FE4384FE4384FE4384FE4384FE125AED004AE90052FA
0052FA0052FA0052FA0052FA0052FA0052FA0052FA0052FA427BFE77A5FFFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFECACACA6E6E6E211821211821
4239424239424239424239424239424239424239424239424239423030304239
4230303030303030303030303030303030303030303010182110182110182110
18214239427B847B7B847B7B847B948C8CEDEDEDF7F7EFFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD7E9FF0173FF0074FF00
75FF0075FF0075FF0075FF0075FF0075FF0075FF0075FF0075FF0075FF0075FF
0075FF0073FF0F7DFFF0F7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFF80BAFF006BFF0075FF0075FF0075FF0075FF0075FF00
75FF0075FF0075FF0075FF0075FF0075FF0075FF0075FF0070FF5EA8FFF8FBFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE6E6E6E5A635A4239423030306E6E6E96
9696B5ADADADB5B5BBBBBBCACACAEDEDEDFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE6E6E6E5A635A4239423030
306E6E6E969696B5ADADADB5B5BBBBBBCACACAEDEDEDFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE6E6E6E5A635A
4239423030306E6E6E969696B5ADADADB5B5BBBBBBCACACAEDEDEDFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB3B3CD29295200
004800005800005800005800005800005800005800005800005800006D00006D
00006D00006D00006D00006D00006D00006D00006D00006D00006D00006D0000
6D00006D00005800005800004800004800004800004800004800004800004800
005800005800006D00006D00006D00006D00006D000058000058000048292952
292952757489FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEA7D6AA9CCEA5ADD08C9CCEA59CCEA59CCEA59CCEA59CCEA5A5C674A5C674A5
C674A5C674A5BD7786BC8AA5BD77A5BD7786BC8A92B26D8CAA576B8B38637A2D
5973283973424469254963104963102D6B090084000084000084000084000058
00004208315200315200315200315200244A00004208004208004208004208AD
C6B5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFE538CFE4384FE689AFF3377FE2973FE2973FE2973FE3377FE689A
FF689AFF689AFF689AFF5A94FF4384FE689AFF5A94FF2973FE3377FE4384FE33
77FE266AFE105AFE266AFE1663FE0052FA0052FA1663FE4384FE4384FE4384FE
4384FE125AED004AE90052FA0052FA0052FA0052FA0052FA0052FA0052FA0052
FA0052FAB5CEFFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEF7F7EFCACACA4E4E4E1018211018211018211018211018211018
211018211018211018211018211018211018210E0F0E5A635A7B847B7B847B7B
847BEDEDEDF7F7EFF7F7EFF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF62A6FF0069FF006EFF006EFF006EFF006EFF006EFF006EFF006EFF
006EFF006EFF006EFF006EFF006EFF006BFF0F77FFF0F6FFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80B7FF0064FF006EFF00
6EFF006EFF006EFF006EFF006EFF006EFF006EFF006EFF006EFF006EFF006EFF
006CFF0772FFD9E9FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFE8686864E4E4E5A635A4E4E4E6E6E6EA8A8A8B5ADADB5ADADA8A8A8F7F7EF
F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE8686864E4E4E5A635A4E4E4E6E6E6EA8A8A8B5ADADB5ADADA8
A8A8F7F7EFF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFE8686864E4E4E5A635A4E4E4E6E6E6EA8A8A8B5AD
ADB5ADADA8A8A8F7F7EFF7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFE000033000048000048000048000058000058000058
0000580000580000580000580000580000580000580000580000580000580000
6D00006D00006D00006D00006D00006D00005800005800005800005800004800
004800004800005800005800005800006D00006D00006D00006D000058000058
000058000048000033FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEF7F7EFD8EAD99CCEA59CCEA59CCEA59CCEA59C
CEA59CCEA5A5C674A5C674A5C67486BC8A86BC8A86BC8A86BC8A86BC8A92B26D
849C4E7691476B8B38637A2D5973283973424469254963104963104963102D6B
09087401008400008400008400087401004208244A0031520031520031520024
4A00004208326639D8EAD9F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEAEEFAA9C6FF3377FE3377FE2973
FE2973FE2973FE3377FE689AFF689AFF689AFF538CFE4384FE4384FE4384FE43
84FE2973FE3377FE3377FE3377FE266AFE105AFE266AFE1663FE0052FA0052FA
0052FA105AFE3377FE4384FE4384FE3377FE3377FE004AE90052FA0052FA0052
FA0052FA0052FA0052FA3377FED9E7FEEFF7FCFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBF3FF277EFF0060FF0067FF0067FF
0067FF0067FF0067FF0067FF0067FF0067FF0067FF0067FF0067FF0064FF0F70
FFF0F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFF80B3FF005CFF0067FF0067FF0067FF0067FF0067FF0067FF0067FF0067FF
0067FF0067FF0067FF0066FF005EFF9BC3FFFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9696964E4E4E4E4E4E
655A56969696969696A8A8A8A8A8A8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9696964E
4E4E4E4E4E655A56969696969696A8A8A8A8A8A8FEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FE9696964E4E4E4E4E4E655A56969696969696A8A8A8A8A8A8FEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB58587A000033
0000330000480000580000580000580000580000580000580000580000580000
5800005800005800006D00006D00006D00006D00006D00006D00006D00006D00
006D00005800005800005800005800005800005800005800006D00006D00006D
00006D00005800004800004800003358587ADADADBFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEECF7ECB7
DBB9A7D6AA9CCEA59CCEA59CCEA59CCEA5A5C674A5C674A5C67486BC8A86BC8A
86BC8A86BC8A86BC8A8CAA577691476B8B386B8B38637A2D5973283973424469
2549631049631049631049631008740100840000840000840000840000420817
4A00315200315200315200315200457446779C7BFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FED9E7FE689AFF3377FE2973FE2973FE2973FE3377FE689AFF689AFF689AFF43
84FE4384FE4384FE4384FE3377FE2973FE3377FE3377FE3377FE266AFE105AFE
266AFE1663FE0052FA0052FA0052FA0052FA3377FE4384FE4384FE4384FE3377
FE004AE9004AF70052FA0052FA0052FA0052FA3377FE77A5FFFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
CDE0FF1F71FF005CFF005FFF005FFF005FFF005FFF005FFF005FFF005FFF005F
FF005FFF005FFF005CFF106AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFF89B5FF0053FF005FFF005FFF005FFF005FFF
005FFF005FFF005FFF005FFF005FFF005FFF005FFF0059FF5F9BFFFDFEFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEBBBBBB3030304E4E4EA8A8A8A8A8A8A8A8A8FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBBBBB3030304E4E4EA8A8A8A8A8A8
A8A8A8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEBBBBBB3030304E4E4EA8
A8A8A8A8A8A8A8A8FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEADADBB73739473739400104A0000480000580000580000580000
5800005800005800005800006D00006D00006D00006D00006D00006D00006D00
006D00006D00006D00006D00006D00006D00006D00005800005800005800006D
00006D00006D00006D00006D00005800004800004800004858587AADADBBFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEB7DBB99CCEA59CCEA59CCEA59CCEA5A5C674
A5C674A5C67486BC8A86BC8A86BC8A86BC8A86BC8A849C4E7691476B8B386B8B
38637A2D59732839734244692549631049631049631049631008740100840000
8400008400008400004208174A00315200315200315200315200DADECEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE689AFF2973FE2973FE2973FE33
77FE689AFF689AFF689AFF4384FE4384FE4384FE4384FE3377FE2973FE3377FE
3377FE3377FE266AFE105AFE266AFE1663FE0052FA0052FA0052FA0052FA3377
FE4384FE4384FE4384FE3377FE004AE9004AF70052FA0052FA0052FA0052FACA
DBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCBDEFF0358FF0055FF0058FF0058FF0058
FF0058FF0058FF0058FF0058FF0058FF0058FF0056FF085DFF78A6FF80ABFF80
ABFF80ABFF80ABFF80ABFF80ABFF80ABFF80ABFF80ABFF80ABFF4082FF0052FF
0058FF0058FF0058FF0058FF0058FF0058FF0058FF0058FF0058FF0058FF0053
FF2E75FFF0F5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE1818420000
4800004800004800004800004800004800005800005800006D00006D00006D00
006D00006D00006D00005800005800005800005800006D00006D00006D00006D
00005800005800006D00006D00006D00006D00006D0000580000480000480000
33000033CACACAFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEECF7ECECF7EC
ECF7ECBDD6A5A5C674A5C674A5BD7786BC8A86BC8A86BC8A92B26D92B26D8CAA
57849C4E7691476B8B386B8B38637A2D59732839734244692549631049631049
63104963102D6B092D6B09008400008400008400087401005800044610315200
769147D1D4B6F7F7EFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED9
E7FECADBFECADBFE84ADFF5A94FF689AFF5A94FF538CFE4384FE3377FE3377FE
3377FE3377FE2973FE3377FE3377FE3377FE266AFE105AFE266AFE1663FE0052
FA0052FA0052FA0052FA105AFE1663FE4384FE4384FE3377FE2973FE105AFE00
4AE90052FA4384FEBDD6FFEFF7FCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFA0BF
FF0453FF004EFF0052FF0052FF0052FF0052FF0052FF0052FF0052FF0052FF00
52FF0051FF0047FF0046FF0046FF0046FF0046FF0046FF0046FF0046FF0046FF
0046FF0046FF004CFF0052FF0052FF0052FF0052FF0052FF0052FF0052FF0052
FF0052FF0051FF004CFF407DFFE5EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFE18184200004800004800004800004800004800004800005800
005800006D00006D00006D00006D00006D00006D000058000058000058000058
00006D00006D00006D00006D00005800005800006D00006D00006D00006D0000
6D000058000048000048000033000033CACACAFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1D4B6ADD08CA5C67495BD8486BC8A86BC
8A95BD8492B26D92B26D8CAA57849C4E7691476B8B386B8B38637A2D59732839
73424469254963104963104963104963104963102D6B09008400008400008400
0084000058000042085667359CA584FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEB5CEFF84ADFF689AFF538CFE
4384FE4384FE3377FE2973FE2973FE2973FE2973FE3377FE3377FE3377FE266A
FE105AFE266AFE1663FE0052FA0052FA0052FA0052FA0052FA105AFE4384FE43
84FE4384FE4384FE266AFE004AE93377FE84ADFFFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFC3D5FF1E5EFF0045FF004AFF004BFF004BFF00
4BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF
004BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF004BFF004B
FF004BFF004BFF004BFF004BFF0049FF0046FF5284FFE8F0FFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEC6C8D658587A00003300003300
004800004800004800005800005800005800006D00006D00006D00006D00006D
00006D00006D00006D00005800006D00006D00006D00006D00006D00006D0000
5800006D00006D00006D00005800005800003358587ACACACACACACAEAEEFAFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEA5C67495BD8486BC8A86BC8A95BD8492B26D92B26D8CAA57849C4E7691476B
8B386B8B38637A2D597328397342446925496310496310496310496310496310
2D6B09008400008400008400008400005800004208EFF7FCFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFE689AFF538CFE4384FE4384FE3377FE2973FE2973FE2973FE2973
FE3377FE3377FE3377FE266AFE105AFE266AFE1663FE0052FA0052FA0052FA00
52FA0052FA105AFE4384FE4384FE4384FE4384FE266AFE004AE9EFF7FCFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC3D4FF1C
57FF0042FF0044FF0045FF0045FF0045FF0045FF0045FF0045FF0045FF0045FF
0045FF0045FF0045FF0045FF0045FF0045FF0045FF0045FF0045FF0045FF0045
FF0045FF0045FF0045FF0045FF0045FF0045FF0045FF0041FF0547FF6992FFE8
EEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEADADBB58587A000033000033000048000048000048000048000058000058
00005800006D00006D00006D00006D00006D00006D0000580000580000580000
5800005800006D00005800004800005800005800005800005800004858587AAD
ADBBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFE95BD8486BC8A86BC8A86BC8A95BD8492B26D8C
AA57849C4E7691476B8B386B8B386B8B38637A2D597328547331446925496310
4963104963104963104963104963102D6B090874010084000084000874010874
01ECF7ECFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEEFF7FC538CFE4384FE4384FE4384FE3377
FE2973FE2973FE2973FE3377FE3377FE3377FE3377FE266AFE105AFE1663FE10
5AFE0052FA0052FA0052FA0052FA0052FA105AFE1663FE3377FE4384FE4384FE
3377FE266AFEEFF7FCFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFD6E1FF6188FF0641FF003BFF003DFF003FFF003FFF
003FFF003FFF003FFF003FFF003FFF003FFF003FFF003FFF003FFF003FFF003F
FF003FFF003FFF003FFF003FFF003FFF003FFF003FFF003FFF003FFF003CFF00
37FF1C51FFA7BDFFFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEDADADB000033000033000048000048
0000480000480000480000480000480000580000580000580000580000580000
5800005800005800005800005800005800005800004800003300004800004800
0048000048000033DADADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE98CA9498CA9498
CA9486BC8A95BD8492B26D849C4E7691476B8B386B8B386B8B386B8B38637A2D
597328597328526B224963104963104963104963104963104963104963100874
01008400008400008400008400D8EAD9ECF7ECFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE538C
FE538CFE538CFE4384FE3377FE2973FE2973FE2973FE3377FE3377FE3377FE33
77FE266AFE105AFE105AFE105AFE0052FA0052FA0052FA0052FA0052FA0052FA
0052FA2973FE4384FE4384FE4384FE4384FEEAEEFAEFF7FCFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFEFFBECDFF
4771FF083EFF0034FF0039FF0039FF003AFF003AFF003AFF003AFF003AFF003A
FF003AFF003AFF003AFF003AFF003AFF003AFF003AFF003AFF003AFF003AFF00
39FF0037FF0035FF1347FF7291FFE1E8FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFE8689960000330000330000330000330000480000480000480000
4800004800004800004800004800004800004800004800004800004800004800
0033000033000033000033000033292952FEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFE92B26D92B26D75AF74849C4E849C4E849C4E
7691476B8B386B8B38637A2D597328597328526B224963104963104963104963
1049631049631049631008740100840000840000840000840000840075AF74FE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE3377FE3377FE427BFE2973FE29
73FE2973FE3377FE3377FE3377FE266AFE105AFE105AFE105AFE0052FA0052FA
0052FA0052FA0052FA0052FA0052FA2973FE4384FE4384FE4384FE4384FE4384
FE8CB5FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFF7F9FFB9C8FF2C57FF0334FF0031FF0032FF0034
FF0034FF0035FF0035FF0035FF0035FF0035FF0035FF0035FF0035FF0035FF00
34FF0034FF0034FF0030FF0033FF0738FF6382FFDCE3FFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE8689960000330000330000330000
3300003300003300004800004800004800004800004800004800004800004800
0048000048000048000048000033000033000033000033000033292952FEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFED1D4B6D1D4B6
CAD6C8D1D4B6BDD6A5BDD6A58CAA576B8B386B8B38637A2D597328597328526B
2249631049631049631049631049631049631049631077A55A86BC8A86BC8A86
BC8A86BC8A86BC8AB7DBB9FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEA9
C6FFA9C6FFA9C6FFA5BDFF98B9FF98B9FF538CFE3377FE3377FE266AFE105AFE
105AFE105AFE0052FA0052FA0052FA0052FA0052FA0052FA0052FA689AFFA9C6
FFA9C6FFA9C6FFA9C6FFA9C6FFCADBFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFECF0
FFBDCAFF6D89FF214BFF0332FF0031FF0030FF0028FF002DFF002FFF0031FF00
30FF002EFF002AFF002CFF0132FF0031FF0735FF385DFFA3B4FFD9E1FFFAFBFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEADAD
BB58587A58587A58587A31315A00003300003300003300004800004800004800
004800004800004800004800004800004800004800004831316358587A58587A
58587A58587A757489FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9CA5846B8B386B8B
38637A2D597328597328526B2249631049631049631049631049631049631049
6310BBC6A6FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE77A5FF
3377FE3377FE266AFE105AFE105AFE105AFE0052FA0052FA0052FA0052FA0052
FA0052FA0052FAA9C6FFFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBEEFFC6D1FFAFBDFF899FFF5B
78FF375AFF254BFF113BFF1B44FF2A50FF4F6EFF6984FF99ABFFB7C4FFD5DDFF
F4F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE9495A500003300003300
0033000033000033000033000033000033000033000033000033000033000033
0000339495A5FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE
FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FF00}
OnMouseMove = DXDrawMouseMove
end
end
object LivesEdit: TSpinEdit
Left = 8
Top = 355
Width = 81
Height = 22
MaxValue = 0
MinValue = 0
TabOrder = 8
Value = 1
end
object Enemy8: TRadioButton
Left = 8
Top = 164
Width = 65
Height = 17
Caption = 'Medikit'
TabOrder = 9
OnClick = EnemyClick
OnMouseMove = DXDrawMouseMove
end
object LivesEdt: TEdit
Left = 648
Top = 360
Width = 73
Height = 21
TabOrder = 10
Text = '1'
OnChange = LivesEdtChange
OnKeyPress = LivesEdtKeyPress
OnMouseMove = DXDrawMouseMove
end
object Lives: TUpDown
Left = 720
Top = 360
Width = 17
Height = 19
Min = 1
Max = 999
Position = 1
TabOrder = 11
OnClick = LivesClick
OnMouseMove = DXDrawMouseMove
end
object MainMenu: TMainMenu
Left = 32
Top = 16
Left = 8
Top = 8
object Spiel: TMenuItem
Caption = '&Datei'
object Neu: TMenuItem
Caption = '&Neu'
ShortCut = 16462
OnClick = NeuClick
end
object N2: TMenuItem
Caption = '-'
end
object Level: TMenuItem
Caption = '&Laden/Speichern...'
ShortCut = 16463
Caption = '&Verwaltung...'
ShortCut = 115
OnClick = LevelClick
end
object AlleLeveldateienaktualisieren1: TMenuItem
Caption = 'Alle Leveldateien aktualisieren'
Visible = False
OnClick = AlleLeveldateienaktualisieren1Click
object Quelltext1: TMenuItem
Caption = '&Quelltext...'
ShortCut = 116
OnClick = Quelltext1Click
end
object Leveltesten1: TMenuItem
Caption = 'Level testen'
OnClick = Leveltesten1Click
end
object N1: TMenuItem
Caption = '-'
end
object Neu: TMenuItem
Caption = '&Neu'
ShortCut = 117
OnClick = NeuClick
end
object Spielfelderweitern1: TMenuItem
Caption = 'Leveleigenschaften...'
ShortCut = 118
OnClick = Spielfelderweitern1Click
end
object Leer1: TMenuItem
6101,34 → 336,19
end
object Hilfe: TMenuItem
Caption = '&Hilfe'
object Hilfe1: TMenuItem
Caption = 'Allgemeines'
GroupIndex = 1
Hint = 'Help\DE_General.md'
OnClick = HilfeTopicClick
object Mitarbeiter: TMenuItem
Caption = '&Mitwirkende...'
ShortCut = 120
OnClick = MitarbeiterClick
end
object WasgibtesNeues1: TMenuItem
Caption = 'Was gibt es Neues?'
GroupIndex = 1
Hint = 'Help\DE_Changelog.md'
OnClick = HilfeTopicClick
end
object N4: TMenuItem
object Leer2: TMenuItem
Caption = '-'
GroupIndex = 1
end
object AufUpdatesprfen1: TMenuItem
Caption = 'Auf Updates pr'#252'fen'
GroupIndex = 1
OnClick = AufUpdatesprfen1Click
end
object N3: TMenuItem
Caption = '-'
GroupIndex = 1
end
object Informationen: TMenuItem
Caption = '&Informationen...'
GroupIndex = 1
ShortCut = 121
OnClick = InformationenClick
end
end
/DirectX/Music.dxm
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/DirectX/Graphics.dxg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Deleted: svn:mime-type
-application/octet-stream
\ No newline at end of property
/DirectX/Sound.dxw
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
/DirectX/Graphic.dxg
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/DirectX
Property changes:
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
/SplCheat.dfm
0,0 → 1,102
object CheatForm: TCheatForm
Left = 275
Top = 165
BorderIcons = [biSystemMenu]
BorderStyle = bsSingle
Caption = 'Cheatverwaltung'
ClientHeight = 233
ClientWidth = 313
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 8
Width = 152
Height = 13
Caption = 'Bitte geben Sie einen Cheat ein!'
end
object Label3: TLabel
Left = 200
Top = 8
Width = 106
Height = 13
Caption = 'Herausgeber anfragen'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnClick = Label3Click
end
object CheatEdit: TEdit
Left = 8
Top = 32
Width = 297
Height = 21
Cursor = crIBeam
Ctl3D = True
ParentCtl3D = False
PasswordChar = '*'
TabOrder = 0
OnKeyPress = CheatEditKeyPress
end
object OKBtn: TButton
Left = 192
Top = 200
Width = 115
Height = 25
Caption = 'OK'
TabOrder = 1
OnClick = OKBtnClick
end
object AbbBtn: TButton
Left = 8
Top = 200
Width = 113
Height = 25
Caption = 'Abbrechen'
TabOrder = 2
OnClick = AbbBtnClick
end
object GroupBox1: TGroupBox
Left = 8
Top = 64
Width = 297
Height = 129
Caption = 'Aktivierte Cheats'
TabOrder = 3
object Label2: TLabel
Left = 8
Top = 104
Width = 83
Height = 13
Caption = 'Cheat deaktiviren'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnClick = Label2Click
end
object CheatBox: TListBox
Left = 8
Top = 24
Width = 281
Height = 73
ItemHeight = 13
TabOrder = 0
end
end
end
/LevSplash.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevOptions.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/Compiler.bdsproj
0,0 → 1,176
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<PersonalityInfo>
<Option>
<Option Name="Personality">Delphi.Personality</Option>
<Option Name="ProjectType">VCLApplication</Option>
<Option Name="Version">1.0</Option>
<Option Name="GUID">{99DF80C5-B3F5-4637-8685-0C3B4D0CA5B6}</Option>
</Option>
</PersonalityInfo>
<Delphi.Personality>
<Source>
<Source Name="MainSource">Compiler.dpr</Source>
</Source>
<FileVersion>
<FileVersion Name="Version">7.0</FileVersion>
</FileVersion>
<Compiler>
<Compiler Name="A">8</Compiler>
<Compiler Name="B">0</Compiler>
<Compiler Name="C">1</Compiler>
<Compiler Name="D">1</Compiler>
<Compiler Name="E">0</Compiler>
<Compiler Name="F">0</Compiler>
<Compiler Name="G">1</Compiler>
<Compiler Name="H">1</Compiler>
<Compiler Name="I">1</Compiler>
<Compiler Name="J">1</Compiler>
<Compiler Name="K">0</Compiler>
<Compiler Name="L">1</Compiler>
<Compiler Name="M">0</Compiler>
<Compiler Name="N">1</Compiler>
<Compiler Name="O">1</Compiler>
<Compiler Name="P">1</Compiler>
<Compiler Name="Q">0</Compiler>
<Compiler Name="R">0</Compiler>
<Compiler Name="S">0</Compiler>
<Compiler Name="T">0</Compiler>
<Compiler Name="U">0</Compiler>
<Compiler Name="V">1</Compiler>
<Compiler Name="W">0</Compiler>
<Compiler Name="X">1</Compiler>
<Compiler Name="Y">1</Compiler>
<Compiler Name="Z">1</Compiler>
<Compiler Name="ShowHints">True</Compiler>
<Compiler Name="ShowWarnings">True</Compiler>
<Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
<Compiler Name="NamespacePrefix"></Compiler>
<Compiler Name="GenerateDocumentation">False</Compiler>
<Compiler Name="DefaultNamespace"></Compiler>
<Compiler Name="SymbolDeprecated">True</Compiler>
<Compiler Name="SymbolLibrary">True</Compiler>
<Compiler Name="SymbolPlatform">True</Compiler>
<Compiler Name="SymbolExperimental">True</Compiler>
<Compiler Name="UnitLibrary">True</Compiler>
<Compiler Name="UnitPlatform">True</Compiler>
<Compiler Name="UnitDeprecated">True</Compiler>
<Compiler Name="UnitExperimental">True</Compiler>
<Compiler Name="HResultCompat">True</Compiler>
<Compiler Name="HidingMember">True</Compiler>
<Compiler Name="HiddenVirtual">True</Compiler>
<Compiler Name="Garbage">True</Compiler>
<Compiler Name="BoundsError">True</Compiler>
<Compiler Name="ZeroNilCompat">True</Compiler>
<Compiler Name="StringConstTruncated">True</Compiler>
<Compiler Name="ForLoopVarVarPar">True</Compiler>
<Compiler Name="TypedConstVarPar">True</Compiler>
<Compiler Name="AsgToTypedConst">True</Compiler>
<Compiler Name="CaseLabelRange">True</Compiler>
<Compiler Name="ForVariable">True</Compiler>
<Compiler Name="ConstructingAbstract">True</Compiler>
<Compiler Name="ComparisonFalse">True</Compiler>
<Compiler Name="ComparisonTrue">True</Compiler>
<Compiler Name="ComparingSignedUnsigned">True</Compiler>
<Compiler Name="CombiningSignedUnsigned">True</Compiler>
<Compiler Name="UnsupportedConstruct">True</Compiler>
<Compiler Name="FileOpen">True</Compiler>
<Compiler Name="FileOpenUnitSrc">True</Compiler>
<Compiler Name="BadGlobalSymbol">True</Compiler>
<Compiler Name="DuplicateConstructorDestructor">True</Compiler>
<Compiler Name="InvalidDirective">True</Compiler>
<Compiler Name="PackageNoLink">True</Compiler>
<Compiler Name="PackageThreadVar">True</Compiler>
<Compiler Name="ImplicitImport">True</Compiler>
<Compiler Name="HPPEMITIgnored">True</Compiler>
<Compiler Name="NoRetVal">True</Compiler>
<Compiler Name="UseBeforeDef">True</Compiler>
<Compiler Name="ForLoopVarUndef">True</Compiler>
<Compiler Name="UnitNameMismatch">True</Compiler>
<Compiler Name="NoCFGFileFound">True</Compiler>
<Compiler Name="ImplicitVariants">True</Compiler>
<Compiler Name="UnicodeToLocale">True</Compiler>
<Compiler Name="LocaleToUnicode">True</Compiler>
<Compiler Name="ImagebaseMultiple">True</Compiler>
<Compiler Name="SuspiciousTypecast">True</Compiler>
<Compiler Name="PrivatePropAccessor">True</Compiler>
<Compiler Name="UnsafeType">False</Compiler>
<Compiler Name="UnsafeCode">False</Compiler>
<Compiler Name="UnsafeCast">False</Compiler>
<Compiler Name="OptionTruncated">True</Compiler>
<Compiler Name="WideCharReduced">True</Compiler>
<Compiler Name="DuplicatesIgnored">True</Compiler>
<Compiler Name="UnitInitSeq">True</Compiler>
<Compiler Name="LocalPInvoke">True</Compiler>
<Compiler Name="MessageDirective">True</Compiler>
<Compiler Name="CodePage"></Compiler>
</Compiler>
<Linker>
<Linker Name="MapFile">0</Linker>
<Linker Name="OutputObjs">0</Linker>
<Linker Name="GenerateHpps">False</Linker>
<Linker Name="ConsoleApp">1</Linker>
<Linker Name="DebugInfo">False</Linker>
<Linker Name="RemoteSymbols">False</Linker>
<Linker Name="GenerateDRC">False</Linker>
<Linker Name="MinStackSize">16384</Linker>
<Linker Name="MaxStackSize">1048576</Linker>
<Linker Name="ImageBase">4194304</Linker>
<Linker Name="ExeDescription">Levelcompiler 1.1</Linker>
</Linker>
<Directories>
<Directories Name="OutputDir"></Directories>
<Directories Name="UnitOutputDir"></Directories>
<Directories Name="PackageDLLOutputDir"></Directories>
<Directories Name="PackageDCPOutputDir"></Directories>
<Directories Name="SearchPath"></Directories>
<Directories Name="Packages">Vcl50;Vclx50;VclSmp50;Vcldb50;vclado50;ibevnt50;Vclbde50;vcldbx50;Qrpt50;TeeUI50;TeeDB50;Tee50;Dss50;TeeQR50;VCLIB50;Vclmid50;vclie50;Inetdb50;Inet50;NMFast50;webmid50;dclocx50;dclaxserver50;DelphiX_for5;pielib</Directories>
<Directories Name="Conditionals"></Directories>
<Directories Name="DebugSourceDirs"></Directories>
<Directories Name="UsePackages">False</Directories>
</Directories>
<Parameters>
<Parameters Name="RunParams"></Parameters>
<Parameters Name="HostApplication"></Parameters>
<Parameters Name="Launcher"></Parameters>
<Parameters Name="UseLauncher">False</Parameters>
<Parameters Name="DebugCWD"></Parameters>
<Parameters Name="Debug Symbols Search Path"></Parameters>
<Parameters Name="LoadAllSymbols">True</Parameters>
<Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
</Parameters>
<Language>
<Language Name="ActiveLang"></Language>
<Language Name="ProjectLang">$00000000</Language>
<Language Name="RootDir"></Language>
</Language>
<VersionInfo>
<VersionInfo Name="IncludeVerInfo">True</VersionInfo>
<VersionInfo Name="AutoIncBuild">False</VersionInfo>
<VersionInfo Name="MajorVer">1</VersionInfo>
<VersionInfo Name="MinorVer">1</VersionInfo>
<VersionInfo Name="Release">0</VersionInfo>
<VersionInfo Name="Build">0</VersionInfo>
<VersionInfo Name="Debug">False</VersionInfo>
<VersionInfo Name="PreRelease">False</VersionInfo>
<VersionInfo Name="Special">False</VersionInfo>
<VersionInfo Name="Private">False</VersionInfo>
<VersionInfo Name="DLL">False</VersionInfo>
<VersionInfo Name="Locale">1031</VersionInfo>
<VersionInfo Name="CodePage">1252</VersionInfo>
</VersionInfo>
<VersionInfoKeys>
<VersionInfoKeys Name="CompanyName">ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="FileDescription">Umwandlungssoftware...</VersionInfoKeys>
<VersionInfoKeys Name="FileVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="InternalName">SpaceMission Compiler</VersionInfoKeys>
<VersionInfoKeys Name="LegalCopyright">© Copyright 2001 - 2007 ViaThinkSoft</VersionInfoKeys>
<VersionInfoKeys Name="LegalTrademarks">Keine</VersionInfoKeys>
<VersionInfoKeys Name="OriginalFilename">Compiler.exe</VersionInfoKeys>
<VersionInfoKeys Name="ProductName">SpaceMission 1.1</VersionInfoKeys>
<VersionInfoKeys Name="ProductVersion">1.1.0.0</VersionInfoKeys>
<VersionInfoKeys Name="Homepage">www.viathinksoft.de</VersionInfoKeys>
<VersionInfoKeys Name="Projektleiter">Daniel Marschall - www.daniel-marschall.de</VersionInfoKeys>
</VersionInfoKeys>
</Delphi.Personality>
</BorlandProject>
/LevInfo.dcu
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/LevSource.dfm
0,0 → 1,97
object SourceForm: TSourceForm
Left = 197
Top = 104
BorderIcons = [biSystemMenu, biMinimize]
BorderStyle = bsSingle
Caption = 'Levelquelltext'
ClientHeight = 392
ClientWidth = 489
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poMainFormCenter
OnHide = FormHide
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object ElLabel1: TLabel
Left = 8
Top = 8
Width = 82
Height = 13
Caption = 'Tempo'#228'rer Code:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
end
object ElLabel2: TLabel
Left = 248
Top = 8
Width = 84
Height = 13
Caption = 'Endg'#252'ltiger Code:'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
end
object Label1: TLabel
Left = 8
Top = 368
Width = 104
Height = 13
Cursor = crHandPoint
Caption = 'Weitere Informationen'
Font.Charset = DEFAULT_CHARSET
Font.Color = clBlue
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = [fsUnderline]
ParentFont = False
OnClick = Label1Click
end
object Label2: TLabel
Left = 116
Top = 368
Width = 165
Height = 13
Caption = #252'ber den Aufbau von Quelltexten...'
end
object ElPopupButton1: TButton
Left = 392
Top = 360
Width = 89
Height = 25
Cancel = True
Caption = 'Schlie'#223'en'
Default = True
TabOrder = 0
OnClick = ElPopupButton1Click
end
object ListBox1: TListBox
Left = 8
Top = 32
Width = 233
Height = 321
ItemHeight = 13
TabOrder = 1
end
object Memo1: TMemo
Left = 248
Top = 32
Width = 233
Height = 321
ReadOnly = True
ScrollBars = ssVertical
TabOrder = 2
end
end
/LevText.pas
0,0 → 1,44
unit LevText;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
 
type
TTextForm = class(TForm)
ElPopupButton1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormHide(Sender: TObject);
end;
var
TextForm: TTextForm;
 
implementation
 
uses
LevMain;
 
{$R *.DFM}
 
procedure TTextForm.Button1Click(Sender: TObject);
begin
close;
end;
 
procedure TTextForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
end;
 
procedure TTextForm.FormHide(Sender: TObject);
begin
mainform.dxtimer.enabled := true;
end;
 
end.
 
/SplSpeicherung.pas
0,0 → 1,339
unit SplSpeicherung;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Spin;
 
type
TSpeicherungForm = class(TForm)
Bevel1: TBevel;
LadenBtn: TButton;
LoeschenBtn: TButton;
AktualisierenBtn: TButton;
SpeichernBtn: TButton;
AbbrechenBtn: TButton;
LevelListBox: TListBox;
Label2: TLabel;
Label3: TLabel;
Label1: TLabel;
LevelName: TEdit;
ElPanel1: TPanel;
li4a: TLabel;
li1: TLabel;
li3b: TLabel;
li3a: TLabel;
li4b: TLabel;
liu: TLabel;
liw: TLabel;
li2a: TLabel;
li2b: TLabel;
procedure LoeschenBtnClick(Sender: TObject);
procedure LadenBtnClick(Sender: TObject);
procedure SpeichernBtnClick(Sender: TObject);
procedure LevelListBoxClick(Sender: TObject);
procedure LevelNameChange(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure DsFancyButton2Click(Sender: TObject);
procedure AbbrechenBtnClick(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure LevelListBoxDblClick(Sender: TObject);
public
procedure SearchSaves;
end;
 
var
SpeicherungForm: TSpeicherungForm;
 
const
FCompVersion = '1.0';
 
implementation
 
uses
SplMain;
 
{$R *.DFM}
 
procedure TSpeicherungForm.SearchSaves;
var
sr: TSearchRec;
res: integer;
begin
LevelName.text := '';
LevelListBox.items.clear;
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := true;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
res := FindFirst(mainform.fdirectory+'Spielstände\*.sav', 0, sr);
try
while (res = 0) do
begin
if (sr.name <> '.') and (sr.name <> '..') then
LevelListBox.items.Add(copy(sr.Name, 0, length(sr.name)-4));
res := FindNext(sr);
end;
finally
FindClose(sr);
end;
end;
 
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
var
Markiert: boolean;
i: integer;
begin
Markiert := false;
for i := 0 to LevelListBox.items.Count-1 do
begin
if LevelListBox.Selected[i] then Markiert := true;
end;
if not Markiert then exit;
if MessageDlg('Diesen Spielstand wirklich löschen?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes then
begin
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := false;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
deletefile(mainform.FDirectory+'Spielstände\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
searchsaves;
end;
end;
 
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
var
Markiert: boolean;
i: integer;
SavGame: textfile;
begin
Markiert := false;
for i := 0 to LevelListBox.items.Count-1 do
begin
if LevelListBox.Selected[i] then Markiert := true;
end;
if not Markiert then exit;
if LevelListBox.items.count = 0 then
begin
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := false;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
LadenBtn.enabled := false;
LoeschenBtn.enabled := false;
end;
{if liu.visible or (LevelListBox.items.count=0) then
exit;}
AssignFile(SavGame, mainform.FDirectory+'Spielstände\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
Reset(SavGame);
ReadLN(SavGame);
ReadLN(SavGame);
ReadLN(SavGame, mainform.FScore);
ReadLN(SavGame, mainform.FLife);
ReadLN(SavGame, mainform.Flevel);
ReadLN(SavGame, mainform.FMenuItem);
CloseFile(SavGame);
mainform.playsound('SceneMov', false);
mainform.FNextScene := gsNewLevel;
mainform.FCheat := false;
close;
end;
 
procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
var
SavGame: textfile;
i: integer;
begin
if Levelname.text = '' then
begin
MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
LevelName.setfocus;
exit;
end;
for i := 0 to length(LevelName.text) do
begin
if (copy(LevelName.text, i, 1) = '\') or
(copy(LevelName.text, i, 1) = '/') or
(copy(LevelName.text, i, 1) = ':') or
(copy(LevelName.text, i, 1) = '*') or
(copy(LevelName.text, i, 1) = '?') or
(copy(LevelName.text, i, 1) = '"') or
(copy(LevelName.text, i, 1) = '<') or
(copy(LevelName.text, i, 1) = '>') or
(copy(LevelName.text, i, 1) = '|') then
begin
MessageDlg('Dies ist kein gültiger Spielstandname!', mtError, [mbOK], 0);
LevelName.setfocus;
exit;
end;
end;
if LevelListBox.items.IndexOf(LevelName.text) > -1 then
begin
if MessageDlg('Spielstand ist bereits vorhanden. Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
exit;
end;
AssignFile(SavGame, mainform.FDirectory+'Spielstände\'+LevelName.text+'.sav');
Rewrite(SavGame);
WriteLN(SavGame, '; SpaceMission '+FCompVersion);
WriteLN(SavGame, '; SAV-File');
WriteLN(SavGame, mainform.FScore);
WriteLN(SavGame, mainform.FLife);
WriteLN(SavGame, mainform.FLevel);
WriteLN(SavGame, mainform.FMenuItem);
CloseFile(SavGame);
SearchSaves;
end;
 
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
var
Ergebniss: String;
SavGame: textfile;
Punkte, Leben, Level, Art: integer;
begin
ladenbtn.enabled := true;
loeschenbtn.enabled := true;
li1.visible := false;
li2a.visible := false;
li2b.visible := false;
li3a.visible := false;
li3b.visible := false;
li4a.visible := false;
li4b.visible := false;
liu.visible := false;
liw.visible := false;
li1.caption := 'n/a';
li2b.caption := 'n/a';
li3b.caption := 'n/a';
li4b.caption := 'n/a';
if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
begin
ladenbtn.enabled := false;
loeschenbtn.enabled := false;
liw.visible := true;
exit;
end;
LevelName.Text := LevelListBox.Items.strings[LevelListBox.itemindex];
AssignFile(SavGame, mainform.FDirectory+'Spielstände\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.sav');
Reset(SavGame);
ReadLN(SavGame, Ergebniss);
if Ergebniss <> '; SpaceMission '+FCompVersion then
begin
liu.visible := true;
ladenbtn.enabled := false;
CloseFile(SavGame);
exit;
end;
ReadLN(SavGame, Ergebniss);
if Ergebniss <> '; SAV-File' then
begin
liu.visible := true;
ladenbtn.enabled := false;
CloseFile(SavGame);
exit;
end;
ReadLN(SavGame, Punkte);
ReadLN(SavGame, Leben);
ReadLN(SavGame, Level);
ReadLN(SavGame, Art);
CloseFile(SavGame);
li1.visible := true;
li2a.visible := true;
li2b.visible := true;
li3a.visible := true;
li3b.visible := true;
li4a.visible := true;
li4b.visible := true;
if Art = 1 then
li1.caption := 'Das Level ist ein normales Level.'
else
li1.caption := 'Das Level ist ein Zufallslevel.';
li3b.caption := inttostr(Level);
li4b.caption := inttostr(Leben);
li2b.caption := inttostr(Punkte);
end;
 
procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
begin
//listbox1.Items.indexof('Level '+spinedit1.text);
end;
 
procedure TSpeicherungForm.Button4Click(Sender: TObject);
begin
mainform.dxtimer.enabled := not mainform.gamepause.checked;
close;
end;
 
procedure TSpeicherungForm.FormShow(Sender: TObject);
begin
mainform.dxtimer.enabled := false;
SearchSaves;
if mainform.FNotSave then
begin
label1.enabled := false;
LevelName.enabled := false;
SpeichernBtn.enabled := false;
end
else
begin
label1.enabled := true;
LevelName.enabled := true;
SpeichernBtn.enabled := true;
end;
end;
 
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
begin
SearchSaves;
end;
 
procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
begin
close;
end;
 
procedure TSpeicherungForm.FormHide(Sender: TObject);
begin
if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
end;
 
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
begin
LadenBtn.click;
end;
 
end.
 
/_Projektgruppe.bdsgroup.local
0,0 → 1,7
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<Transactions/>
<Default.Personality>
<Projects ActiveProject="SpaceMission.exe"/>
</Default.Personality>
</BorlandProject>
/SplSplash.dfm
0,0 → 1,28
object SplashForm: TSplashForm
Left = 241
Top = 158
BorderIcons = []
BorderStyle = bsNone
Caption = 'Bitte warten...'
ClientHeight = 497
ClientWidth = 658
Color = clBlack
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
Position = poDesktopCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object SplashImage: TImage
Left = 8
Top = 8
Width = 640
Height = 480
AutoSize = True
Transparent = True
end
end
/.
Property changes:
Deleted: svn:global-ignores
-__recovery
-*.otares
Deleted: svn:ignore
-*.local
-*.dcu
-*.~*
-*.identcache
-*.tvsconfig
-__history
-*.exe
-TODO.bak
-*.drc
-*.ENU