VPatch 2.0 final
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@2798 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
2449fbc6bd
commit
6dd280b24f
22 changed files with 3566 additions and 14 deletions
BIN
Contrib/VPatch/Source/GUI/AboutForm.dfm
Normal file
BIN
Contrib/VPatch/Source/GUI/AboutForm.dfm
Normal file
Binary file not shown.
31
Contrib/VPatch/Source/GUI/AboutForm.pas
Normal file
31
Contrib/VPatch/Source/GUI/AboutForm.pas
Normal file
|
@ -0,0 +1,31 @@
|
|||
unit AboutForm;
|
||||
|
||||
interface
|
||||
|
||||
uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls,
|
||||
Buttons, ExtCtrls;
|
||||
|
||||
type
|
||||
TfrmAbout = class(TForm)
|
||||
Panel1: TPanel;
|
||||
ProgramIcon: TImage;
|
||||
ProductName: TLabel;
|
||||
Version: TLabel;
|
||||
Copyright: TLabel;
|
||||
Comments: TLabel;
|
||||
OKButton: TButton;
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
frmAbout: TfrmAbout;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
end.
|
||||
|
53
Contrib/VPatch/Source/GUI/DLLWrapper.pas
Normal file
53
Contrib/VPatch/Source/GUI/DLLWrapper.pas
Normal file
|
@ -0,0 +1,53 @@
|
|||
unit DLLWrapper;
|
||||
|
||||
interface
|
||||
|
||||
uses Classes, SysUtils;
|
||||
|
||||
function DoGenerate(const Source, Target: String; Stream: TStream; Config: String): Integer; forward;
|
||||
|
||||
implementation
|
||||
|
||||
uses PatchGenerator;
|
||||
|
||||
function DoGenerate(const Source, Target: String; Stream: TStream; Config: String): Integer;
|
||||
var
|
||||
PG: TPatchGenerator;
|
||||
a: Integer;
|
||||
begin
|
||||
WriteLn('Generating '+ExtractFileName(Source)+' to '+ExtractFileName(Target)+'...');
|
||||
|
||||
PG:=TPatchGenerator.Create;
|
||||
PG.StartBlockSize:=512;
|
||||
PG.MinimumBlockSize:=512;
|
||||
PG.BlockDivider:=2;
|
||||
PG.StepSize:=256;
|
||||
try
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
PG.StartBlockSize:=StrToInt(Copy(Config,1,a-1));
|
||||
Config:=Copy(Config,a+1,Length(Config));
|
||||
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
PG.MinimumBlockSize:=StrToInt(Copy(Config,1,a-1));
|
||||
Config:=Copy(Config,a+1,Length(Config));
|
||||
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
PG.BlockDivider:=StrToInt(Copy(Config,1,a-1));
|
||||
Config:=Copy(Config,a+1,Length(Config));
|
||||
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
PG.StepSize:=StrToInt(Copy(Config,1,a-1));
|
||||
finally
|
||||
end;
|
||||
|
||||
Result:=PG.CreatePatch(Source,Target);
|
||||
PG.WriteToStream(Stream);
|
||||
PG.Free;
|
||||
WriteLn(ExtractFileName(Source)+' -> '+ExtractFileName(Target)+': '+IntToStr(Result)+' bytes');
|
||||
end;
|
||||
|
||||
end.
|
903
Contrib/VPatch/Source/GUI/MainForm.dfm
Normal file
903
Contrib/VPatch/Source/GUI/MainForm.dfm
Normal file
|
@ -0,0 +1,903 @@
|
|||
object frmMain: TfrmMain
|
||||
Left = 195
|
||||
Top = 93
|
||||
BorderIcons = [biSystemMenu, biMinimize]
|
||||
BorderStyle = bsSingle
|
||||
Caption = 'VG - VPatch GUI'
|
||||
ClientHeight = 361
|
||||
ClientWidth = 689
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
Menu = MainMenu
|
||||
OldCreateOrder = False
|
||||
Position = poScreenCenter
|
||||
ShowHint = True
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object Label1: TLabel
|
||||
Left = 8
|
||||
Top = 32
|
||||
Width = 77
|
||||
Height = 13
|
||||
Caption = 'New versions'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object butAdd: TSpeedButton
|
||||
Left = 24
|
||||
Top = 328
|
||||
Width = 89
|
||||
Height = 25
|
||||
Caption = 'Add &new version'
|
||||
Flat = True
|
||||
OnClick = butAddClick
|
||||
end
|
||||
object grpConfig: TGroupBox
|
||||
Left = 232
|
||||
Top = 43
|
||||
Width = 441
|
||||
Height = 278
|
||||
Enabled = False
|
||||
TabOrder = 0
|
||||
object Label2: TLabel
|
||||
Left = 16
|
||||
Top = 24
|
||||
Width = 71
|
||||
Height = 13
|
||||
Caption = 'New version'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object Label3: TLabel
|
||||
Left = 16
|
||||
Top = 80
|
||||
Width = 71
|
||||
Height = 13
|
||||
Caption = 'Old versions'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object butOldAdd: TSpeedButton
|
||||
Left = 368
|
||||
Top = 96
|
||||
Width = 49
|
||||
Height = 25
|
||||
Caption = '&Add'
|
||||
Flat = True
|
||||
OnClick = butOldAddClick
|
||||
end
|
||||
object butOldRemove: TSpeedButton
|
||||
Left = 368
|
||||
Top = 160
|
||||
Width = 49
|
||||
Height = 25
|
||||
Caption = '&Remove'
|
||||
Flat = True
|
||||
OnClick = butOldRemoveClick
|
||||
end
|
||||
object butNewEdit: TSpeedButton
|
||||
Left = 368
|
||||
Top = 40
|
||||
Width = 49
|
||||
Height = 25
|
||||
Caption = '&Edit'
|
||||
Flat = True
|
||||
OnClick = butNewEditClick
|
||||
end
|
||||
object Label4: TLabel
|
||||
Left = 16
|
||||
Top = 200
|
||||
Width = 176
|
||||
Height = 13
|
||||
Caption = 'Patch generation configuration'
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object Label5: TLabel
|
||||
Left = 32
|
||||
Top = 224
|
||||
Width = 48
|
||||
Height = 13
|
||||
Hint = 'Smaller gives smaller patch files, but decreased speed'
|
||||
Caption = 'Block size'
|
||||
end
|
||||
object Label6: TLabel
|
||||
Left = 32
|
||||
Top = 248
|
||||
Width = 91
|
||||
Height = 13
|
||||
Caption = 'Minimum block size'
|
||||
Visible = False
|
||||
end
|
||||
object Label7: TLabel
|
||||
Left = 232
|
||||
Top = 224
|
||||
Width = 61
|
||||
Height = 13
|
||||
Caption = 'Block divider'
|
||||
Visible = False
|
||||
end
|
||||
object Label8: TLabel
|
||||
Left = 232
|
||||
Top = 248
|
||||
Width = 43
|
||||
Height = 13
|
||||
Caption = 'Step size'
|
||||
Visible = False
|
||||
end
|
||||
object txtStartBlockSize: TLabel
|
||||
Left = 136
|
||||
Top = 224
|
||||
Width = 65
|
||||
Height = 17
|
||||
Alignment = taCenter
|
||||
AutoSize = False
|
||||
end
|
||||
object txtNew: TEdit
|
||||
Left = 32
|
||||
Top = 42
|
||||
Width = 321
|
||||
Height = 21
|
||||
ReadOnly = True
|
||||
TabOrder = 0
|
||||
end
|
||||
object lstOld: TListBox
|
||||
Left = 32
|
||||
Top = 96
|
||||
Width = 321
|
||||
Height = 89
|
||||
ItemHeight = 13
|
||||
TabOrder = 1
|
||||
end
|
||||
object txtMinimumBlockSize: TEdit
|
||||
Left = 136
|
||||
Top = 248
|
||||
Width = 65
|
||||
Height = 21
|
||||
TabOrder = 2
|
||||
Text = '16'
|
||||
Visible = False
|
||||
OnChange = txtMinimumBlockSizeChange
|
||||
end
|
||||
object UDMinimumBlockSize: TUpDown
|
||||
Left = 201
|
||||
Top = 248
|
||||
Width = 15
|
||||
Height = 21
|
||||
Associate = txtMinimumBlockSize
|
||||
Min = 16
|
||||
Max = 4096
|
||||
Increment = 16
|
||||
Position = 16
|
||||
TabOrder = 3
|
||||
Visible = False
|
||||
Wrap = False
|
||||
end
|
||||
object UDBlockDivider: TUpDown
|
||||
Left = 401
|
||||
Top = 224
|
||||
Width = 15
|
||||
Height = 21
|
||||
Associate = txtBlockDivider
|
||||
Min = 2
|
||||
Max = 512
|
||||
Increment = 2
|
||||
Position = 16
|
||||
TabOrder = 4
|
||||
Visible = False
|
||||
Wrap = False
|
||||
end
|
||||
object txtBlockDivider: TEdit
|
||||
Left = 336
|
||||
Top = 224
|
||||
Width = 65
|
||||
Height = 21
|
||||
TabOrder = 5
|
||||
Text = '16'
|
||||
Visible = False
|
||||
OnChange = txtBlockDividerChange
|
||||
end
|
||||
object UDStepSize: TUpDown
|
||||
Left = 401
|
||||
Top = 248
|
||||
Width = 15
|
||||
Height = 21
|
||||
Associate = txtStepSize
|
||||
Min = 16
|
||||
Max = 4096
|
||||
Increment = 16
|
||||
Position = 16
|
||||
TabOrder = 6
|
||||
Visible = False
|
||||
Wrap = False
|
||||
end
|
||||
object txtStepSize: TEdit
|
||||
Left = 336
|
||||
Top = 248
|
||||
Width = 65
|
||||
Height = 21
|
||||
TabOrder = 7
|
||||
Text = '16'
|
||||
Visible = False
|
||||
OnChange = txtStepSizeChange
|
||||
end
|
||||
object tbBlockSize: TTrackBar
|
||||
Left = 200
|
||||
Top = 224
|
||||
Width = 161
|
||||
Height = 25
|
||||
Max = 12
|
||||
Min = 4
|
||||
Orientation = trHorizontal
|
||||
Frequency = 1
|
||||
Position = 6
|
||||
SelEnd = 0
|
||||
SelStart = 0
|
||||
TabOrder = 8
|
||||
TickMarks = tmBottomRight
|
||||
TickStyle = tsAuto
|
||||
OnChange = tbBlockSizeChange
|
||||
end
|
||||
end
|
||||
object lstNew: TVirtualStringTree
|
||||
Left = 24
|
||||
Top = 48
|
||||
Width = 193
|
||||
Height = 273
|
||||
Header.AutoSizeIndex = 0
|
||||
Header.Font.Charset = DEFAULT_CHARSET
|
||||
Header.Font.Color = clWindowText
|
||||
Header.Font.Height = -11
|
||||
Header.Font.Name = 'MS Sans Serif'
|
||||
Header.Font.Style = []
|
||||
Header.MainColumn = -1
|
||||
Header.Options = [hoColumnResize, hoDrag]
|
||||
HintAnimation = hatNone
|
||||
Indent = 0
|
||||
TabOrder = 1
|
||||
TreeOptions.PaintOptions = [toHotTrack, toShowBackground, toShowButtons, toShowDropmark, toShowRoot, toThemeAware, toUseBlendedImages]
|
||||
TreeOptions.SelectionOptions = [toFullRowSelect]
|
||||
OnChange = lstNewChange
|
||||
OnGetText = lstNewGetText
|
||||
Columns = <>
|
||||
end
|
||||
object barCool: TCoolBar
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 689
|
||||
Height = 44
|
||||
AutoSize = True
|
||||
Bands = <
|
||||
item
|
||||
BorderStyle = bsSingle
|
||||
Control = barTool
|
||||
ImageIndex = -1
|
||||
MinHeight = 36
|
||||
Width = 689
|
||||
end>
|
||||
EdgeBorders = [ebTop, ebBottom]
|
||||
object barTool: TToolBar
|
||||
Left = 9
|
||||
Top = 2
|
||||
Width = 676
|
||||
Height = 36
|
||||
AutoSize = True
|
||||
ButtonHeight = 36
|
||||
ButtonWidth = 90
|
||||
Caption = 'barTool'
|
||||
EdgeBorders = []
|
||||
Flat = True
|
||||
Images = IL
|
||||
ShowCaptions = True
|
||||
TabOrder = 0
|
||||
object toolNew: TToolButton
|
||||
Left = 0
|
||||
Top = 0
|
||||
Caption = '&New'
|
||||
ImageIndex = 0
|
||||
MenuItem = mnuNew
|
||||
end
|
||||
object toolOpen: TToolButton
|
||||
Left = 90
|
||||
Top = 0
|
||||
Caption = '&Open'
|
||||
ImageIndex = 1
|
||||
MenuItem = mnuOpen
|
||||
end
|
||||
object toolSave: TToolButton
|
||||
Left = 180
|
||||
Top = 0
|
||||
Caption = '&Save'
|
||||
ImageIndex = 2
|
||||
MenuItem = mnuSave
|
||||
end
|
||||
object ToolButton1: TToolButton
|
||||
Left = 270
|
||||
Top = 0
|
||||
Width = 8
|
||||
Caption = 'ToolButton1'
|
||||
ImageIndex = 7
|
||||
Style = tbsSeparator
|
||||
end
|
||||
object toolGenGo: TToolButton
|
||||
Left = 278
|
||||
Top = 0
|
||||
Caption = '&Generate'
|
||||
ImageIndex = 3
|
||||
MenuItem = mnuGenGo
|
||||
end
|
||||
object toolCreateEXE: TToolButton
|
||||
Left = 368
|
||||
Top = 0
|
||||
Caption = 'Create &EXE'
|
||||
ImageIndex = 5
|
||||
MenuItem = mnuCreateEXE
|
||||
end
|
||||
object toolCreateDLL: TToolButton
|
||||
Left = 458
|
||||
Top = 0
|
||||
Caption = 'Create &DLL'
|
||||
ImageIndex = 6
|
||||
MenuItem = mnuCreateDLL
|
||||
end
|
||||
object toolCreatePAT: TToolButton
|
||||
Left = 548
|
||||
Top = 0
|
||||
Caption = 'Create &patch file'
|
||||
ImageIndex = 7
|
||||
MenuItem = mnuCreatePAT
|
||||
end
|
||||
end
|
||||
end
|
||||
object chkDebug: TCheckBox
|
||||
Left = 232
|
||||
Top = 336
|
||||
Width = 289
|
||||
Height = 17
|
||||
Caption = 'Show extended information during patch generation'
|
||||
TabOrder = 3
|
||||
OnClick = chkDebugClick
|
||||
end
|
||||
object MainMenu: TMainMenu
|
||||
Images = IL
|
||||
Left = 160
|
||||
Top = 328
|
||||
object mnuFile: TMenuItem
|
||||
Caption = '&File'
|
||||
object mnuNew: TMenuItem
|
||||
Caption = '&New'
|
||||
ImageIndex = 0
|
||||
ShortCut = 16462
|
||||
OnClick = mnuNewClick
|
||||
end
|
||||
object mnuOpen: TMenuItem
|
||||
Caption = '&Open'
|
||||
ImageIndex = 1
|
||||
ShortCut = 16463
|
||||
OnClick = mnuOpenClick
|
||||
end
|
||||
object mnuSave: TMenuItem
|
||||
Caption = '&Save'
|
||||
ImageIndex = 2
|
||||
ShortCut = 16467
|
||||
OnClick = mnuSaveClick
|
||||
end
|
||||
object mnuSaveas: TMenuItem
|
||||
Caption = 'Save &as...'
|
||||
OnClick = mnuSaveasClick
|
||||
end
|
||||
object N1: TMenuItem
|
||||
Caption = '-'
|
||||
end
|
||||
object mnuExit: TMenuItem
|
||||
Caption = 'E&xit'
|
||||
OnClick = mnuExitClick
|
||||
end
|
||||
end
|
||||
object mnuAction: TMenuItem
|
||||
Caption = '&Action'
|
||||
object mnuClearcachedpatches: TMenuItem
|
||||
Caption = 'Empty &cache'
|
||||
ImageIndex = 4
|
||||
OnClick = mnuClearcachedpatchesClick
|
||||
end
|
||||
object mnuGenGo: TMenuItem
|
||||
Caption = '&Generate'
|
||||
ImageIndex = 3
|
||||
OnClick = mnuGenGoClick
|
||||
end
|
||||
object mnuCreateEXE: TMenuItem
|
||||
Caption = 'Create &EXE'
|
||||
ImageIndex = 5
|
||||
OnClick = mnuCreateEXEClick
|
||||
end
|
||||
object mnuCreateDLL: TMenuItem
|
||||
Caption = 'Create &DLL'
|
||||
ImageIndex = 6
|
||||
OnClick = mnuCreateDLLClick
|
||||
end
|
||||
object mnuCreatePAT: TMenuItem
|
||||
Caption = 'Create &patch file'
|
||||
ImageIndex = 7
|
||||
OnClick = mnuCreatePATClick
|
||||
end
|
||||
end
|
||||
object mnuHelp: TMenuItem
|
||||
Caption = '&Help'
|
||||
object mnuAbout: TMenuItem
|
||||
Caption = '&About'
|
||||
OnClick = mnuAboutClick
|
||||
end
|
||||
end
|
||||
end
|
||||
object OD: TOpenDialog
|
||||
Filter = 'All files (*.*)|*.*'
|
||||
Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing, ofDontAddToRecent]
|
||||
Left = 128
|
||||
Top = 328
|
||||
end
|
||||
object dlgOpen: TOpenDialog
|
||||
DefaultExt = '.vpj'
|
||||
Filter = 'VPatch ProJects (*.vpj)|*.vpj|All files (*.*)|*.*'
|
||||
Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing]
|
||||
Left = 104
|
||||
Top = 24
|
||||
end
|
||||
object dlgSave: TSaveDialog
|
||||
DefaultExt = '.vpj'
|
||||
Filter = 'VPatch ProJects (*.vpj)|*.vpj|All files (*.*)|*.*'
|
||||
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing]
|
||||
Left = 136
|
||||
Top = 24
|
||||
end
|
||||
object IL: TImageList
|
||||
Left = 168
|
||||
Top = 24
|
||||
Bitmap = {
|
||||
494C010108000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
|
||||
0000000000003600000028000000400000003000000001002000000000000030
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF000000000000000000000000000000000000FF
|
||||
FF00000000000000000000000000000000000000000000000000000000000000
|
||||
000000FFFF000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000000000000000000000FFFF0000FF
|
||||
FF0000FFFF0000000000000000000000000000000000000000000000000000FF
|
||||
FF0000FFFF0000FFFF0000000000000000000000000000000000FF000000FF00
|
||||
0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
|
||||
0000FF000000FF000000FF00000000000000000000000000FF000000FF000000
|
||||
FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
|
||||
FF000000FF000000FF000000FF00000000000000000000000000008000000080
|
||||
0000008000000080000000800000008000000080000000800000008000000080
|
||||
00000080000000800000008000000000000000000000007F7F0000FFFF0000FF
|
||||
FF0000FFFF0000FFFF000000000000000000000000000000000000FFFF0000FF
|
||||
FF0000FFFF0000FFFF00007F7F00000000000000000000000000FF000000FFFF
|
||||
FF00FFFFFF00FFFFFF00FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
|
||||
FF00FFFFFF00FFFFFF00FF00000000000000000000000000FF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000FF000000FF00FFFFFF00FFFFFF00FFFFFF000000FF00FFFF
|
||||
FF00FFFFFF00FFFFFF000000FF0000000000000000000000000000800000FFFF
|
||||
FF00008000000080000000800000FFFFFF0000800000FFFFFF00008000000080
|
||||
0000FFFFFF000080000000800000000000000000000000FFFF0000FFFF0000FF
|
||||
FF0000FFFF0000FFFF00007F7F000000000000000000007F7F0000FFFF0000FF
|
||||
FF0000FFFF0000FFFF0000FFFF00000000000000000000000000FF000000FFFF
|
||||
FF00FF000000FF000000FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
|
||||
FF00FF000000FF000000FF00000000000000000000000000FF00FFFFFF000000
|
||||
FF000000FF00FFFFFF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
|
||||
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
|
||||
FF00008000000080000000800000FFFFFF0000800000FFFFFF00008000000080
|
||||
0000FFFFFF000080000000800000000000000000000000FFFF0000FFFF0000FF
|
||||
FF0000FFFF0000FFFF0000FFFF00000000000000000000FFFF0000FFFF0000FF
|
||||
FF0000FFFF0000FFFF0000FFFF00000000000000000000000000FF000000FFFF
|
||||
FF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FF000000FF000000FFFF
|
||||
FF00FFFFFF00FFFFFF00FF00000000000000000000000000FF00FFFFFF000000
|
||||
FF000000FF00FFFFFF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
|
||||
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
|
||||
FF00FFFFFF00FFFFFF0000800000FFFFFF00FFFFFF00FFFFFF00008000000080
|
||||
0000FFFFFF000080000000800000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000FF000000FFFF
|
||||
FF00FF000000FF000000FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
|
||||
FF00FF000000FF000000FF00000000000000000000000000FF00FFFFFF000000
|
||||
FF000000FF00FFFFFF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
|
||||
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
|
||||
FF0000800000FFFFFF0000800000FFFFFF0000800000FFFFFF00008000000080
|
||||
0000FFFFFF000080000000800000000000000000000000000000000000000000
|
||||
000000000000000000000000000000FFFF0000FFFF0000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000FF000000FFFF
|
||||
FF00FFFFFF00FFFFFF00FF000000FFFFFF00FF000000FFFFFF00FF000000FFFF
|
||||
FF00FFFFFF00FFFFFF00FF00000000000000000000000000FF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000FF000000FF00FFFFFF000000FF000000FF000000FF00FFFF
|
||||
FF000000FF000000FF000000FF0000000000000000000000000000800000FFFF
|
||||
FF00FFFFFF00FFFFFF0000800000FFFFFF00FFFFFF00FFFFFF0000800000FFFF
|
||||
FF00FFFFFF00FFFFFF0000800000000000000000000000000000000000000000
|
||||
000000000000000000000000000000FFFF0000FFFF0000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000FF000000FF00
|
||||
0000FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF00
|
||||
0000FF000000FF000000FF00000000000000000000000000FF000000FF000000
|
||||
FF000000FF000000FF000000FF000000FF000000FF000000FF000000FF000000
|
||||
FF000000FF000000FF000000FF00000000000000000000000000008000000080
|
||||
0000008000000080000000800000008000000080000000800000008000000080
|
||||
0000008000000080000000800000000000000000000000000000000000000000
|
||||
00000000000000000000007F7F0000FFFF0000FFFF00007F7F00000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000FFFF0000FFFF0000FFFF0000FFFF00000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
|
||||
00000000000000FFFF0000FFFF0000FFFF0000FFFF0000FFFF0000FFFF000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000000000000000000000
|
||||
000000000000007F7F0000FFFF0000FFFF0000FFFF0000FFFF00007F7F000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF0000000000C0C0C000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF0000000000C0C0C000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF0000000000C0C0C000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000080
|
||||
8000000000000000000000000000000000000000000000000000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000000000008080000080
|
||||
8000008080000080800000808000008080000080800000808000008080000000
|
||||
0000000000000000000000000000000000000000000000000000008080000080
|
||||
8000000000000000000000000000000000000000000000000000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000FFFF00000000000080
|
||||
8000008080000080800000808000008080000080800000808000008080000080
|
||||
8000000000000000000000000000000000000000000000000000008080000080
|
||||
8000000000000000000000000000000000000000000000000000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF0000000000000000000000000000000000FFFFFF0000FFFF000000
|
||||
0000008080000080800000808000008080000080800000808000008080000080
|
||||
8000008080000000000000000000000000000000000000000000008080000080
|
||||
8000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000FFFF00FFFFFF0000FF
|
||||
FF00000000000080800000808000008080000080800000808000008080000080
|
||||
8000008080000080800000000000000000000000000000000000008080000080
|
||||
8000008080000080800000808000008080000080800000808000008080000080
|
||||
8000008080000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF0000000000000000000000000000000000FFFFFF0000FFFF00FFFF
|
||||
FF0000FFFF000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000080
|
||||
8000000000000000000000000000000000000000000000000000000000000000
|
||||
0000008080000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000FFFF00FFFFFF0000FF
|
||||
FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000000
|
||||
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF0000000000000000000000000000000000FFFFFF0000FFFF00FFFF
|
||||
FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000000
|
||||
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
|
||||
FF00FFFFFF000000000000000000000000000000000000FFFF00FFFFFF0000FF
|
||||
FF00000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000000
|
||||
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000000
|
||||
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
|
||||
C000000000000080800000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFF
|
||||
FF00000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000000
|
||||
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
|
||||
C000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000008080000000
|
||||
0000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0C000C0C0
|
||||
C00000000000C0C0C00000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000424D3E000000000000003E000000
|
||||
2800000040000000300000000100010000000000800100000000000000000000
|
||||
000000000000000000000000FFFFFF0000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000F81FE000E000E000E007E000E000E000
|
||||
C003E000E000E000800180000000800080018000000080000000800000008000
|
||||
0000800000008000000080000000800000008000000080000000800000008000
|
||||
000080000000800080018000000080008001E000E000E000C003E000E000E000
|
||||
E007E001E001E001F81FE003E003E003FFFFFFFFFFFFFFFFFFFFFFFFC001FFFF
|
||||
E003001F8001FFFFE003000F8001FFFFE00300078001FDFFE00300038001FCFF
|
||||
E00300018001FC7FE00300008001FC3FE003001F8001FC1FE003001F8001FC3F
|
||||
E003001F8001FC7FE0038FF18001FCFFE007FFF98001FDFFE00FFF758001FFFF
|
||||
E01FFF8F8001FFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000
|
||||
000000000000}
|
||||
end
|
||||
object dlgSaveExe: TSaveDialog
|
||||
DefaultExt = '.exe'
|
||||
Filter = 'Executable files (*.exe)|*.exe|All files (*.*)|*.*'
|
||||
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing, ofDontAddToRecent]
|
||||
Left = 384
|
||||
Top = 56
|
||||
end
|
||||
object dlgSaveDLL: TSaveDialog
|
||||
DefaultExt = '.dll'
|
||||
Filter = 'DLL files (*.dll)|*.dll|All files (*.*)|*.*'
|
||||
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing, ofDontAddToRecent]
|
||||
Left = 416
|
||||
Top = 56
|
||||
end
|
||||
object dlgSavePAT: TSaveDialog
|
||||
DefaultExt = '.pat'
|
||||
Filter = 'Patch files (*.pat)|*.pat|All files (*.*)|*.*'
|
||||
Options = [ofOverwritePrompt, ofHideReadOnly, ofPathMustExist, ofNoReadOnlyReturn, ofNoDereferenceLinks, ofEnableSizing, ofDontAddToRecent]
|
||||
Left = 448
|
||||
Top = 56
|
||||
end
|
||||
end
|
539
Contrib/VPatch/Source/GUI/MainForm.pas
Normal file
539
Contrib/VPatch/Source/GUI/MainForm.pas
Normal file
|
@ -0,0 +1,539 @@
|
|||
unit MainForm;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, Buttons, StdCtrls, Menus, PatchClasses, VirtualTrees, VDSP_CRC,
|
||||
ToolWin, ComCtrls, ImgList, ExtCtrls, PatchGenerator, Math;
|
||||
|
||||
const
|
||||
UntitledFile='Untitled.vpj';
|
||||
|
||||
type
|
||||
TfrmMain = class(TForm)
|
||||
MainMenu: TMainMenu;
|
||||
mnuFile: TMenuItem;
|
||||
mnuNew: TMenuItem;
|
||||
mnuOpen: TMenuItem;
|
||||
mnuSave: TMenuItem;
|
||||
mnuSaveas: TMenuItem;
|
||||
N1: TMenuItem;
|
||||
mnuExit: TMenuItem;
|
||||
Label1: TLabel;
|
||||
grpConfig: TGroupBox;
|
||||
butAdd: TSpeedButton;
|
||||
OD: TOpenDialog;
|
||||
Label2: TLabel;
|
||||
txtNew: TEdit;
|
||||
Label3: TLabel;
|
||||
mnuHelp: TMenuItem;
|
||||
mnuAbout: TMenuItem;
|
||||
lstOld: TListBox;
|
||||
butOldAdd: TSpeedButton;
|
||||
butOldRemove: TSpeedButton;
|
||||
butNewEdit: TSpeedButton;
|
||||
Label4: TLabel;
|
||||
lstNew: TVirtualStringTree;
|
||||
dlgOpen: TOpenDialog;
|
||||
dlgSave: TSaveDialog;
|
||||
IL: TImageList;
|
||||
mnuAction: TMenuItem;
|
||||
mnuGenGo: TMenuItem;
|
||||
barTool: TToolBar;
|
||||
toolNew: TToolButton;
|
||||
toolOpen: TToolButton;
|
||||
toolSave: TToolButton;
|
||||
toolGenGo: TToolButton;
|
||||
mnuCreateEXE: TMenuItem;
|
||||
dlgSaveExe: TSaveDialog;
|
||||
toolCreateEXE: TToolButton;
|
||||
barCool: TCoolBar;
|
||||
Label5: TLabel;
|
||||
Label6: TLabel;
|
||||
txtMinimumBlockSize: TEdit;
|
||||
UDMinimumBlockSize: TUpDown;
|
||||
UDBlockDivider: TUpDown;
|
||||
txtBlockDivider: TEdit;
|
||||
Label7: TLabel;
|
||||
UDStepSize: TUpDown;
|
||||
txtStepSize: TEdit;
|
||||
Label8: TLabel;
|
||||
chkDebug: TCheckBox;
|
||||
tbBlockSize: TTrackBar;
|
||||
txtStartBlockSize: TLabel;
|
||||
mnuClearcachedpatches: TMenuItem;
|
||||
mnuCreateDLL: TMenuItem;
|
||||
mnuCreatePAT: TMenuItem;
|
||||
toolCreateDLL: TToolButton;
|
||||
ToolButton1: TToolButton;
|
||||
toolCreatePAT: TToolButton;
|
||||
dlgSaveDLL: TSaveDialog;
|
||||
dlgSavePAT: TSaveDialog;
|
||||
procedure butAddClick(Sender: TObject);
|
||||
procedure FormCreate(Sender: TObject);
|
||||
procedure FormDestroy(Sender: TObject);
|
||||
procedure mnuExitClick(Sender: TObject);
|
||||
procedure UpdateStates;
|
||||
procedure ReloadNewTree;
|
||||
procedure SelectInNewTree(PatchIndex: Integer);
|
||||
procedure butNewEditClick(Sender: TObject);
|
||||
procedure lstNewChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
|
||||
procedure butOldAddClick(Sender: TObject);
|
||||
procedure butOldRemoveClick(Sender: TObject);
|
||||
procedure mnuNewClick(Sender: TObject);
|
||||
procedure mnuOpenClick(Sender: TObject);
|
||||
procedure mnuSaveClick(Sender: TObject);
|
||||
procedure mnuSaveasClick(Sender: TObject);
|
||||
procedure mnuGenGoClick(Sender: TObject);
|
||||
procedure mnuAboutClick(Sender: TObject);
|
||||
procedure mnuCreateEXEClick(Sender: TObject);
|
||||
procedure lstNewGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
|
||||
Column: TColumnIndex; TextType: TVSTTextType;
|
||||
var CellText: WideString);
|
||||
procedure txtStartBlockSizeChange(Sender: TObject);
|
||||
procedure txtMinimumBlockSizeChange(Sender: TObject);
|
||||
procedure txtBlockDividerChange(Sender: TObject);
|
||||
procedure txtStepSizeChange(Sender: TObject);
|
||||
procedure chkDebugClick(Sender: TObject);
|
||||
procedure tbBlockSizeChange(Sender: TObject);
|
||||
procedure mnuClearcachedpatchesClick(Sender: TObject);
|
||||
procedure mnuCreateDLLClick(Sender: TObject);
|
||||
procedure mnuCreatePATClick(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
// MS: TModeSelector;
|
||||
dskName: String;
|
||||
function DoSave(const FileName: String; const Prompt: Boolean): String;
|
||||
procedure OpenAFile(FileName: String; AskSave: Boolean=True; PromptNew: Boolean=False);
|
||||
function CollectConfig: String;
|
||||
procedure SetConfigTextBoxes(Config: String);
|
||||
procedure PrintDebug(S: String);
|
||||
public
|
||||
{ Public declarations }
|
||||
end;
|
||||
|
||||
var
|
||||
frmMain: TfrmMain;
|
||||
PP: TPatchProject = nil;
|
||||
|
||||
implementation
|
||||
|
||||
uses AboutForm;
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TfrmMain.butAddClick(Sender: TObject);
|
||||
begin
|
||||
OD.Options:=OD.Options-[ofAllowMultiSelect];
|
||||
OD.Title:='Open the latest (new) version of a file...';
|
||||
OD.FileName:='';
|
||||
if OD.Execute then begin
|
||||
PP.AddNewVersion(OD.FileName);
|
||||
ReloadNewTree;
|
||||
SelectInNewTree(PP.PatchFile(OD.FileName).Index);
|
||||
butOldAdd.Click;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.FormCreate(Sender: TObject);
|
||||
begin
|
||||
grpConfig.Tag:=-1;
|
||||
dskName:=UntitledFile;
|
||||
lstNew.NodeDataSize:=SizeOf(Integer);
|
||||
OpenAFile('',False,False); //don't prompt for New! that'll bug things
|
||||
ReloadNewTree;
|
||||
UpdateStates;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.FormDestroy(Sender: TObject);
|
||||
begin
|
||||
PP.Free;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuExitClick(Sender: TObject);
|
||||
begin
|
||||
Close;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.UpdateStates;
|
||||
begin
|
||||
Self.Caption:='VG - VPatch GUI - '+dskName;
|
||||
// grpConfig.Enabled:=not (lstNew.Tag=-1);
|
||||
// if not grpConfig.Enabled then grpConfig.Caption:='Select a file first';
|
||||
grpConfig.Enabled:=(lstNew.SelectedCount>0);
|
||||
if grpConfig.Tag=-1 then begin
|
||||
txtNew.Enabled:=False;
|
||||
butNewEdit.Enabled:=False;
|
||||
butNewEdit.Font.Color:=clInactiveCaption;
|
||||
butOldAdd.Enabled:=False;
|
||||
butOldAdd.Font.Color:=clInactiveCaption;
|
||||
butOldRemove.Enabled:=False;
|
||||
butOldRemove.Font.Color:=clInactiveCaption;
|
||||
end else begin
|
||||
txtNew.Enabled:=True;
|
||||
butNewEdit.Enabled:=True;
|
||||
butNewEdit.Font.Color:=clWindowText;
|
||||
butOldAdd.Enabled:=True;
|
||||
butOldAdd.Font.Color:=clWindowText;
|
||||
// butOldEdit.Enabled:=True;
|
||||
butOldRemove.Enabled:=True;
|
||||
butOldRemove.Font.Color:=clWindowText;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.ReloadNewTree;
|
||||
var
|
||||
i: Integer;
|
||||
Node: PVirtualNode;
|
||||
begin
|
||||
lstNew.BeginUpdate;
|
||||
lstNew.Clear;
|
||||
for i:=0 to PP.GetPatchCount - 1 do begin
|
||||
Node:=lstNew.AddChild(nil);
|
||||
PInteger(lstNew.GetNodeData(Node))^:=i;
|
||||
end;
|
||||
lstNew.EndUpdate;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.butNewEditClick(Sender: TObject);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
OD.Options:=OD.Options-[ofAllowMultiSelect];
|
||||
OD.Title:='Select new version of file...';
|
||||
OD.FileName:=txtNew.Text;
|
||||
if OD.Execute then begin
|
||||
i:=grpConfig.Tag;
|
||||
PP.PatchFile(i).NewVersion:=OD.FileName;
|
||||
ReloadNewTree;
|
||||
lstNew.Selected[lstNew.GetFirstVisible]:=True;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.lstNewChange(Sender: TBaseVirtualTree;
|
||||
Node: PVirtualNode);
|
||||
var
|
||||
i,j: Integer;
|
||||
begin
|
||||
case lstNew.SelectedCount of
|
||||
0: Exit;
|
||||
1: begin
|
||||
if lstNew.Selected[Node] then begin
|
||||
i:=PInteger(lstNew.GetNodeData(Node))^;
|
||||
grpConfig.Caption:=ExtractFileName(PP.PatchFile(i).NewVersion);
|
||||
grpConfig.Tag:=i;
|
||||
txtNew.Text:=PP.PatchFile(i).NewVersion;
|
||||
lstOld.Clear;
|
||||
for j:=0 to PP.PatchFile(i).OldVersionCount - 1 do begin
|
||||
lstOld.Items.Add(PP.PatchFile(i).OldVersions[j]);
|
||||
end;
|
||||
SetConfigTextBoxes(PP.PatchFile(i).Config);
|
||||
end;
|
||||
end;
|
||||
else begin
|
||||
grpConfig.Tag:=-1; //multiple files selected - only allow config changes
|
||||
txtNew.Text:='(multiple files selected)';
|
||||
lstOld.Clear;
|
||||
end;
|
||||
end;
|
||||
UpdateStates;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.butOldAddClick(Sender: TObject);
|
||||
var
|
||||
i,j: Integer;
|
||||
begin
|
||||
OD.Options:=OD.Options+[ofAllowMultiSelect];
|
||||
OD.Title:='Select old versions of '+grpConfig.Caption+'...';
|
||||
OD.FileName:='';
|
||||
if OD.Execute then begin
|
||||
i:=grpConfig.Tag;
|
||||
for j:=0 to OD.Files.Count - 1 do begin
|
||||
PP.PatchFile(i).AddOldVersion(OD.Files[j]);
|
||||
lstOld.Items.Add(OD.Files.Strings[j]);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.SelectInNewTree(PatchIndex: Integer);
|
||||
var
|
||||
Node: PVirtualNode;
|
||||
begin
|
||||
Node:=lstNew.GetFirstSelected;
|
||||
while Node<>nil do begin
|
||||
lstNew.Selected[Node]:=False;
|
||||
Node:=lstNew.GetNextSelected(Node);
|
||||
end;
|
||||
Node:=lstNew.GetFirst;
|
||||
while Node<>nil do begin
|
||||
if PInteger(lstNew.GetNodeData(Node))^=PatchIndex then begin
|
||||
lstNew.Selected[Node]:=True;
|
||||
lstNewChange(lstNew,Node);
|
||||
Exit;
|
||||
end;
|
||||
Node:=lstNew.GetNext(Node);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.butOldRemoveClick(Sender: TObject);
|
||||
begin
|
||||
if lstOld.ItemIndex>=0 then begin
|
||||
PP.PatchFile(grpConfig.Tag).RemoveOldVersion(lstOld.ItemIndex);
|
||||
lstOld.Items.Delete(lstOld.ItemIndex);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.OpenAFile(FileName: String; AskSave: Boolean=True; PromptNew: Boolean=False);
|
||||
var
|
||||
fs: TFileStream;
|
||||
begin
|
||||
PP.Free; //confirm saving first?
|
||||
PP:=TPatchProject.Create;
|
||||
ReloadNewTree;
|
||||
if FileName<>'' then begin
|
||||
fs:=nil;
|
||||
try
|
||||
fs:=TFileStream.Create(FileName,fmOpenRead);
|
||||
PP.LoadFromStream(fs);
|
||||
finally
|
||||
dskName:=FileName;
|
||||
ReloadNewTree;
|
||||
fs.Free;
|
||||
end;
|
||||
end else begin
|
||||
dskName:=UntitledFile;
|
||||
if PromptNew then butAddClick(Self);
|
||||
end;
|
||||
|
||||
UpdateStates;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuNewClick(Sender: TObject);
|
||||
begin
|
||||
OpenAFile('',True,True);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuOpenClick(Sender: TObject);
|
||||
begin
|
||||
if dlgOpen.Execute then begin
|
||||
OpenAFile(dlgOpen.FileName,True);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuSaveClick(Sender: TObject);
|
||||
begin
|
||||
dskName:=DoSave(dskName,False);
|
||||
UpdateStates;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuSaveasClick(Sender: TObject);
|
||||
begin
|
||||
dskName:=DoSave(dskName,True);
|
||||
UpdateStates;
|
||||
end;
|
||||
|
||||
function TfrmMain.DoSave(const FileName: String; const Prompt: Boolean): String;
|
||||
var
|
||||
FN: String;
|
||||
fs: TFileStream;
|
||||
begin
|
||||
DoSave:='';
|
||||
FN:=FileName;
|
||||
if Prompt or (CompareText(FileName,UntitledFile)=0) then begin
|
||||
if dlgSave.Execute then begin
|
||||
FN:=dlgSave.FileName;
|
||||
if ExtractFileExt(FN)='' then
|
||||
FN:=FN+'.vpj';
|
||||
end else begin
|
||||
DoSave:=FileName;
|
||||
Exit;
|
||||
end;
|
||||
end;
|
||||
//do actual saving to this file...
|
||||
fs:=TFileStream.Create(FN,fmCreate);
|
||||
PP.SaveToStream(fs);
|
||||
fs.Free;
|
||||
DoSave:=FN;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuGenGoClick(Sender: TObject);
|
||||
begin
|
||||
Self.Visible:=False;
|
||||
Cursor:=crHourGlass;
|
||||
PP.Generate;
|
||||
Cursor:=crDefault;
|
||||
Self.Visible:=True;
|
||||
SelectInNewTree(0);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuAboutClick(Sender: TObject);
|
||||
var
|
||||
frmAbout: TfrmAbout;
|
||||
begin
|
||||
frmAbout:=TfrmAbout.Create(Self);
|
||||
frmAbout.ShowModal;
|
||||
frmAbout.Free;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuCreateEXEClick(Sender: TObject);
|
||||
var
|
||||
fs: TFileStream;
|
||||
fr: TFileStream;
|
||||
begin
|
||||
//first, select it on disk (where should the exe go?)
|
||||
if dlgSaveExe.FileName='' then dlgSaveExe.FileName:='VPatch.exe';
|
||||
if dlgSaveExe.Execute then begin
|
||||
fs:=nil;
|
||||
try
|
||||
fs:=TFileStream.Create(dlgSaveExe.FileName,fmCreate);
|
||||
fr:=nil;
|
||||
try
|
||||
fr:=TFileStream.Create(ExtractFilePath(Application.ExeName)+'vpatch.bin',fmOpenRead);
|
||||
fs.CopyFrom(fr,fr.Size);
|
||||
finally
|
||||
fr.Free;
|
||||
end;
|
||||
PP.WritePatches(fs);
|
||||
finally
|
||||
fs.Free;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuCreateDLLClick(Sender: TObject);
|
||||
var
|
||||
fs: TFileStream;
|
||||
fr: TFileStream;
|
||||
begin
|
||||
//first, select it on disk (where should the exe go?)
|
||||
if dlgSaveDLL.FileName='' then dlgSaveDLL.FileName:='VPatch.DLL';
|
||||
if dlgSaveDLL.Execute then begin
|
||||
fs:=nil;
|
||||
try
|
||||
fs:=TFileStream.Create(dlgSaveDLL.FileName,fmCreate);
|
||||
fr:=nil;
|
||||
try
|
||||
fr:=TFileStream.Create(ExtractFilePath(Application.ExeName)+'vpatchdll.bin',fmOpenRead);
|
||||
fs.CopyFrom(fr,fr.Size);
|
||||
finally
|
||||
fr.Free;
|
||||
end;
|
||||
PP.WritePatches(fs);
|
||||
finally
|
||||
fs.Free;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuCreatePATClick(Sender: TObject);
|
||||
var
|
||||
fs: TFileStream;
|
||||
begin
|
||||
//first, select it on disk (where should the exe go?)
|
||||
if dlgSavePAT.FileName='' then dlgSavePAT.FileName:='PatchData.pat';
|
||||
if dlgSavePAT.Execute then begin
|
||||
fs:=nil;
|
||||
try
|
||||
fs:=TFileStream.Create(dlgSavePAT.FileName,fmCreate);
|
||||
PP.WritePatches(fs);
|
||||
finally
|
||||
fs.Free;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.lstNewGetText(Sender: TBaseVirtualTree;
|
||||
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
|
||||
var CellText: WideString);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
i:=PInteger(lstNew.GetNodeData(Node))^;
|
||||
CellText:=ExtractFileName(PP.PatchFile(i).NewVersion);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.txtStartBlockSizeChange(Sender: TObject);
|
||||
begin
|
||||
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
|
||||
end;
|
||||
|
||||
function TfrmMain.CollectConfig: String;
|
||||
begin
|
||||
Result:=txtStartBlockSize.Caption+','+txtMinimumBlockSize.Text+','+txtBlockDivider.Text+','+txtStepSize.Text;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.txtMinimumBlockSizeChange(Sender: TObject);
|
||||
begin
|
||||
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.txtBlockDividerChange(Sender: TObject);
|
||||
begin
|
||||
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.txtStepSizeChange(Sender: TObject);
|
||||
begin
|
||||
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.SetConfigTextBoxes(Config: String);
|
||||
var
|
||||
a,i: Integer;
|
||||
begin
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
txtStartBlockSize.Caption:=Copy(Config,1,a-1);
|
||||
Config:=Copy(Config,a+1,Length(Config));
|
||||
|
||||
a:=StrToInt(txtStartBlockSize.Caption);
|
||||
i:=-1;
|
||||
while not (a=0) do begin
|
||||
a:=a shr 1;
|
||||
Inc(i);
|
||||
end;
|
||||
tbBlockSize.Position := i;
|
||||
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
txtMinimumBlockSize.Text:=Copy(Config,1,a-1);
|
||||
Config:=Copy(Config,a+1,Length(Config));
|
||||
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
txtBlockDivider.Text:=Copy(Config,1,a-1);
|
||||
Config:=Copy(Config,a+1,Length(Config));
|
||||
|
||||
a:=Pos(',',Config);
|
||||
if(a=0) then a:=Length(Config)+1;
|
||||
txtStepSize.Text:=Copy(Config,1,a-1);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.chkDebugClick(Sender: TObject);
|
||||
begin
|
||||
if chkDebug.State = cbUnchecked then
|
||||
PatchGenerator.DebugEvent:=nil
|
||||
else
|
||||
PatchGenerator.DebugEvent:=PrintDebug;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.PrintDebug(S: String);
|
||||
begin
|
||||
WriteLn(S);
|
||||
end;
|
||||
|
||||
procedure TfrmMain.tbBlockSizeChange(Sender: TObject);
|
||||
begin
|
||||
txtStartBlockSize.Caption:=IntToStr(1 shl tbBlockSize.Position);
|
||||
PP.PatchFile(grpConfig.Tag).Config:=CollectConfig;
|
||||
end;
|
||||
|
||||
procedure TfrmMain.mnuClearcachedpatchesClick(Sender: TObject);
|
||||
begin
|
||||
PP.ResetCache;
|
||||
end;
|
||||
|
||||
initialization
|
||||
PP:=TPatchProject.Create;
|
||||
end.
|
548
Contrib/VPatch/Source/GUI/PatchClasses.pas
Normal file
548
Contrib/VPatch/Source/GUI/PatchClasses.pas
Normal file
|
@ -0,0 +1,548 @@
|
|||
unit PatchClasses;
|
||||
|
||||
interface
|
||||
|
||||
uses Classes, sysutils, VDSP_CRC, DLLWrapper, Dialogs;
|
||||
|
||||
const
|
||||
DEFAULT_CONFIG = '64,64,2,32';
|
||||
|
||||
type
|
||||
TAbstractFile = record
|
||||
FileName: String;
|
||||
FriendlyName: String;
|
||||
CRC32: LongWord; //the longword/integer sign is going to give problems again...
|
||||
Size: Integer;
|
||||
//not sure about this one yet...
|
||||
Cached: Boolean; //True: we have cached the patch, using latest config
|
||||
//False: a) we have nothing cached (size and start are -1)
|
||||
// b) we still have cache (start>0 and size too), but it's not generated using the latest config (we can keep it of course because the new config might be worse)
|
||||
Cache: TMemoryStream;
|
||||
end;
|
||||
|
||||
TPatchFile = class (TObject)
|
||||
private
|
||||
FIndex: Integer;
|
||||
ConfigID: String;
|
||||
FNew: TAbstractFile;
|
||||
FOld: Array of TAbstractFile;
|
||||
protected
|
||||
procedure SetNewFN(Value: String);
|
||||
function GetNewFN: String;
|
||||
procedure SetOldFN(i: Integer; FileName: String);
|
||||
function GetOldFN(Index: Integer): String;
|
||||
function GetOldVersionCount: Integer;
|
||||
procedure ResetCache; overload;
|
||||
procedure ResetCache(OldIndex: Integer); overload;
|
||||
procedure InvalidateCache; overload;
|
||||
procedure InvalidateCache(Index: Integer); overload;
|
||||
function GetCached(Index: Integer): Boolean;
|
||||
function GetConfig: String;
|
||||
procedure SetConfig(Value: String);
|
||||
public
|
||||
constructor Create(Index: Integer; FileName: String); overload;
|
||||
constructor Create(Index: Integer; Stream: TStream); overload;
|
||||
destructor Destroy(); override;
|
||||
|
||||
procedure AddOldVersion(const FileName: String);
|
||||
procedure RemoveOldVersion(const Index: Integer);
|
||||
property OldVersions[Index: Integer]: String read GetOldFN write SetOldFN;
|
||||
|
||||
procedure Generate; overload;
|
||||
procedure Generate(const Index: Integer); overload;
|
||||
property Generated[Index: Integer]: Boolean read GetCached;
|
||||
function GetPatchSize(Index: Integer): Integer;
|
||||
|
||||
procedure WritePatch(Index: Integer; Stream: TStream);
|
||||
|
||||
// LoadFromStream not supported: Use Create(Index,Stream) instead!
|
||||
// procedure LoadFromStream(Stream: TStream);
|
||||
procedure SaveToStream(Stream: TStream);
|
||||
published
|
||||
property NewVersion: String read GetNewFN write SetNewFN;
|
||||
property OldVersionCount: Integer read GetOldVersionCount;
|
||||
property Index: Integer read FIndex;
|
||||
property Config: String read GetConfig write SetConfig;
|
||||
end;
|
||||
|
||||
TPatchProject = class (TObject)
|
||||
private
|
||||
FPat: Array of TPatchFile;
|
||||
public
|
||||
procedure LoadFromStream(Stream: TStream);
|
||||
procedure SaveToStream(Stream: TStream);
|
||||
constructor Create();
|
||||
destructor Destroy(); override;
|
||||
procedure AddNewVersion(FileName: String);
|
||||
function PatchFile(FileName: String): TPatchFile; overload;
|
||||
function PatchFile(Index: Integer): TPatchFile; overload;
|
||||
function GetPatchCount: Integer;
|
||||
procedure WritePatches(Stream: TStream);
|
||||
procedure Generate;
|
||||
procedure ResetCache;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
function ReadStreamString(Stream: TStream): String;
|
||||
var
|
||||
Buf: Array[0..512] of Char;
|
||||
i: LongInt;
|
||||
S: String;
|
||||
j: Integer;
|
||||
begin
|
||||
Stream.Read(i,SizeOf(i));
|
||||
if i>512 then raise Exception.Create('VPJ damaged: String too long (>512)');
|
||||
Stream.Read(Buf,i);
|
||||
for j:=1 to i do
|
||||
S:=S+Buf[j-1];
|
||||
ReadStreamString:=S;
|
||||
end;
|
||||
|
||||
//a private wrapper for the FileCRC function
|
||||
function CalcCRC(FileName: String): Integer;
|
||||
var
|
||||
fs: TFileStream;
|
||||
begin
|
||||
CalcCRC:=0;
|
||||
fs:=nil;
|
||||
try
|
||||
fs:=TFileStream.Create(FileName,fmOpenRead);
|
||||
CalcCRC:=FileCRC(fs);
|
||||
finally
|
||||
fs.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
function GetFileSize(FileName: String): Integer;
|
||||
var
|
||||
fs: TFileStream;
|
||||
begin
|
||||
GetFileSize:=0;
|
||||
fs:=nil;
|
||||
try
|
||||
fs:=TFileStream.Create(FileName,fmOpenRead);
|
||||
GetFileSize:=fs.Size;
|
||||
finally
|
||||
fs.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ TPatchFile }
|
||||
|
||||
procedure TPatchFile.AddOldVersion(const FileName: String);
|
||||
var
|
||||
i: Integer;
|
||||
// fs: TFileStream;
|
||||
begin
|
||||
i:=Length(FOld);
|
||||
SetLength(FOld,i+1);
|
||||
FOld[i].Cache:=TMemoryStream.Create;
|
||||
SetOldFN(i,FileName);
|
||||
end;
|
||||
|
||||
constructor TPatchFile.Create(Index: Integer; FileName: String);
|
||||
//var
|
||||
// fs: TFileStream;
|
||||
begin
|
||||
inherited Create();
|
||||
FIndex:=Index;
|
||||
SetLength(FOld,0);
|
||||
FNew.CRC32:=0;
|
||||
FNew.Size:=-1;
|
||||
SetNewFN(FileName);
|
||||
ConfigID:=DEFAULT_CONFIG;
|
||||
//just to be on the safe side
|
||||
//following is now done by SetNewFN :)
|
||||
//no it's not - because that one resets the cache!!!
|
||||
//doesn't matter, because we're not loading from stream!!!
|
||||
{ FNew.FileName:=FileName;
|
||||
FNew.FriendlyName:=ExtractFileName(FileName);
|
||||
FNew.CRC32:=CalcCRC(FileName);
|
||||
FNew.Size:=GetFileSize(FileName);}
|
||||
end;
|
||||
|
||||
constructor TPatchFile.Create(Index: Integer; Stream: TStream);
|
||||
var
|
||||
i,q: LongInt;
|
||||
CSize: Integer;
|
||||
j: Integer;
|
||||
begin
|
||||
inherited Create();
|
||||
FIndex:=Index;
|
||||
SetLength(FOld,0);
|
||||
FNew.CRC32:=0;
|
||||
FNew.Size:=-1; //just to be on the safe side
|
||||
|
||||
//read configuration
|
||||
ConfigID:=ReadStreamString(Stream);
|
||||
|
||||
//now load everything...
|
||||
FNew.FileName:=ReadStreamString(Stream);
|
||||
FNew.FriendlyName:=ReadStreamString(Stream);
|
||||
Stream.Read(FNew.CRC32,SizeOf(FNew.CRC32));
|
||||
Stream.Read(FNew.Size,SizeOf(FNew.Size));
|
||||
Stream.Read(i,SizeOf(i));
|
||||
SetLength(FOld,i);
|
||||
for j:=0 to i - 1 do begin
|
||||
FOld[j].FileName:=ReadStreamString(Stream);
|
||||
FOld[j].FriendlyName:=ReadStreamString(Stream);
|
||||
Stream.Read(FOld[j].CRC32,SizeOf(FOld[j].CRC32));
|
||||
Stream.Read(FOld[j].Size,SizeOf(FOld[j].Size));
|
||||
Stream.Read(q,SizeOf(q));
|
||||
FOld[j].Cached:=not (q=0);
|
||||
if FOld[j].Cached then begin
|
||||
Stream.Read(CSize,SizeOf(CSize));
|
||||
FOld[j].Cache:=TMemoryStream.Create;
|
||||
FOld[j].Cache.CopyFrom(Stream,CSize);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
destructor TPatchFile.Destroy;
|
||||
begin
|
||||
SetLength(FOld,0);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
function TPatchFile.GetNewFN: String;
|
||||
begin
|
||||
GetNewFN:=FNew.FileName;
|
||||
end;
|
||||
|
||||
function TPatchFile.GetOldFN(Index: Integer): String;
|
||||
begin
|
||||
Result:=FOld[Index].FileName;
|
||||
if FOld[Index].Cached then
|
||||
if FOld[Index].Cache.Size>0 then begin
|
||||
Result:=Result + ' ('+IntToStr(FOld[Index].Cache.Size)+' bytes)';
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPatchFile.GetOldVersionCount: Integer;
|
||||
begin
|
||||
GetOldVersionCount:=Length(FOld);
|
||||
end;
|
||||
|
||||
procedure TPatchFile.ResetCache;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i:=0 to Length(FOld)-1 do
|
||||
ResetCache(i);
|
||||
end;
|
||||
|
||||
procedure TPatchFile.RemoveOldVersion(const Index: Integer);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
FOld[Index].Cache.Free;
|
||||
for i:=Index to Length(FOld)-2 do begin
|
||||
FOld[i]:=FOld[i+1];
|
||||
end;
|
||||
SetLength(FOld,Length(FOld)-1);
|
||||
end;
|
||||
|
||||
procedure TPatchFile.ResetCache(OldIndex: Integer);
|
||||
begin
|
||||
FOld[OldIndex].Cached:=False;
|
||||
FOld[OldIndex].Size:=-1;
|
||||
FOld[OldIndex].Cache.Clear;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.SaveToStream(Stream: TStream);
|
||||
procedure WriteStreamString(Stream: TStream; const S: String);
|
||||
var
|
||||
i: LongInt;
|
||||
j: Integer;
|
||||
Buf: Array[0..512] of Char;
|
||||
begin
|
||||
i:=Length(S);
|
||||
Stream.Write(i,SizeOf(i));
|
||||
for j:=1 to i do
|
||||
Buf[j-1]:=S[j];
|
||||
Buf[i]:=#0;
|
||||
Stream.Write(Buf,i);
|
||||
end;
|
||||
var
|
||||
i,q: LongInt;
|
||||
j: Integer;
|
||||
tmp: Integer;
|
||||
begin
|
||||
//write config ID
|
||||
WriteStreamString(Stream,ConfigID);
|
||||
|
||||
WriteStreamString(Stream,FNew.FileName);
|
||||
WriteStreamString(Stream,FNew.FriendlyName);
|
||||
Stream.Write(FNew.CRC32,SizeOf(FNew.CRC32));
|
||||
Stream.Write(FNew.Size,SizeOf(FNew.Size));
|
||||
|
||||
i:=Length(FOld);
|
||||
Stream.Write(i,SizeOf(i));
|
||||
|
||||
for j:=0 to i - 1 do begin
|
||||
WriteStreamString(Stream,FOld[j].FileName);
|
||||
WriteStreamString(Stream,FOld[j].FriendlyName);
|
||||
Stream.Write(FOld[j].CRC32,SizeOf(FOld[j].CRC32));
|
||||
Stream.Write(FOld[j].Size,SizeOf(FOld[j].Size));
|
||||
if FOld[j].Cached then q:=1 else q:=0;
|
||||
Stream.Write(q,SizeOf(q));
|
||||
if FOld[j].Cached then begin
|
||||
tmp:=FOld[j].Cache.Size;
|
||||
Stream.Write(tmp,SizeOf(tmp));
|
||||
FOld[j].Cache.Seek(0,soFromBeginning);
|
||||
Stream.CopyFrom(FOld[j].Cache,tmp);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.SetNewFN(Value: String);
|
||||
var
|
||||
NewSize: Integer;
|
||||
NewCRC: LongWord;
|
||||
begin
|
||||
FNew.FileName:=Value;
|
||||
FNew.Friendlyname:=ExtractFileName(Value);
|
||||
NewCRC:=CalcCRC(Value);
|
||||
NewSize:=GetFileSize(Value);
|
||||
//if any changes, then reset cache :)
|
||||
if not ((FNew.CRC32=NewCRC) and (FNew.Size=NewSize)) then begin
|
||||
FNew.CRC32:=NewCRC;
|
||||
FNew.Size:=NewSize;
|
||||
ResetCache;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.SetOldFN(i: Integer; FileName: String);
|
||||
begin
|
||||
if((i>=0) and (i<Length(FOld))) then begin
|
||||
FOld[i].FileName:=FileName;
|
||||
FOld[i].FriendlyName:=ExtractFileName(FileName);
|
||||
FOld[i].CRC32:=CalcCRC(FileName);
|
||||
FOld[i].Size:=GetFileSize(FileName);
|
||||
ResetCache(i);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.Generate;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
//generate all of them into the cache?
|
||||
for i:=0 to OldVersionCount - 1 do
|
||||
Generate(i);
|
||||
end;
|
||||
|
||||
procedure TPatchFile.Generate(const Index: Integer);
|
||||
var
|
||||
Size: Integer;
|
||||
fm: TMemoryStream;
|
||||
begin
|
||||
fm:=TMemoryStream.Create;
|
||||
Size:=DoGenerate(FOld[Index].FileName,FNew.FileName,fm,ConfigID);
|
||||
if not (Size=-1) then begin
|
||||
if (FOld[Index].Cache.Size>Size) or (not FOld[Index].Cached) then begin //the new one is better
|
||||
FOld[Index].Cache.Clear;
|
||||
fm.Seek(8,soFromBeginning);
|
||||
FOld[Index].Cache.CopyFrom(fm,fm.Size-8);
|
||||
end;
|
||||
FOld[Index].Cached:=True;
|
||||
end;
|
||||
fm.Free;
|
||||
end;
|
||||
|
||||
function TPatchFile.GetCached(Index: Integer): Boolean;
|
||||
begin
|
||||
GetCached:=FOld[Index].Cached;
|
||||
end;
|
||||
|
||||
function TPatchFile.GetConfig: String;
|
||||
begin
|
||||
GetConfig:=ConfigID;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.SetConfig(Value: String);
|
||||
begin
|
||||
if not Assigned(Self) then Exit;
|
||||
if not SameText(Value,ConfigID) then begin
|
||||
InvalidateCache; //configuration changed, invalidate cache
|
||||
end;
|
||||
ConfigID:=Value;
|
||||
end;
|
||||
|
||||
function TPatchFile.GetPatchSize(Index: Integer): Integer;
|
||||
begin
|
||||
if Generated[Index] then begin
|
||||
GetPatchSize:=FOld[Index].Cache.Size;
|
||||
end else
|
||||
GetPatchSize:=-1;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.InvalidateCache;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i:=0 to Length(FOld)-1 do
|
||||
InvalidateCache(i);
|
||||
end;
|
||||
|
||||
procedure TPatchFile.InvalidateCache(Index: Integer);
|
||||
begin
|
||||
FOld[Index].Cached:=False;
|
||||
end;
|
||||
|
||||
procedure TPatchFile.WritePatch(Index: Integer; Stream: TStream);
|
||||
begin
|
||||
if not FOld[Index].Cached then
|
||||
Generate(Index);
|
||||
if not FOld[Index].Cached then
|
||||
raise Exception.Create('Writing of patch failed: Could not generate all patches');
|
||||
FOld[Index].Cache.Seek(0,soFromBeginning);
|
||||
Stream.CopyFrom(FOld[Index].Cache,FOld[Index].Cache.Size);
|
||||
end;
|
||||
|
||||
{ TPatchProject }
|
||||
|
||||
procedure TPatchProject.AddNewVersion(FileName: String);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
i:=Length(FPat);
|
||||
SetLength(FPat,i+1);
|
||||
FPat[i]:=TPatchFile.Create(i,FileName);
|
||||
FPat[i].SetConfig(DEFAULT_CONFIG);
|
||||
end;
|
||||
|
||||
constructor TPatchProject.Create;
|
||||
begin
|
||||
inherited;
|
||||
SetLength(FPat,0);
|
||||
end;
|
||||
|
||||
destructor TPatchProject.Destroy;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i:=0 to Length(FPat)-1 do begin
|
||||
FPat[i].Free;
|
||||
end;
|
||||
SetLength(FPat,0);
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure TPatchProject.Generate;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i:=0 to GetPatchCount - 1 do
|
||||
FPat[i].Generate;
|
||||
end;
|
||||
|
||||
function TPatchProject.GetPatchCount: Integer;
|
||||
begin
|
||||
GetPatchCount:=Length(FPat);
|
||||
end;
|
||||
|
||||
procedure TPatchProject.LoadFromStream(Stream: TStream);
|
||||
var
|
||||
i: LongInt;
|
||||
j: Integer;
|
||||
begin
|
||||
//first free all patchfiles
|
||||
for j:=0 to Length(FPat)-1 do begin
|
||||
FPat[j].Free;
|
||||
FPat[j]:=nil;
|
||||
end;
|
||||
Stream.Read(i,SizeOf(i));
|
||||
if(i=$1A4A5056) then begin //still read old files
|
||||
Stream.Read(i,SizeOf(i)); //16 dummy bytes
|
||||
Stream.Read(i,SizeOf(i));
|
||||
Stream.Read(i,SizeOf(i));
|
||||
Stream.Read(i,SizeOf(i));
|
||||
|
||||
Stream.Read(i,SizeOf(i));
|
||||
end;
|
||||
SetLength(FPat,i);
|
||||
for j:=0 to i - 1 do begin
|
||||
FPat[j]:=TPatchFile.Create(j,Stream);
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPatchProject.PatchFile(FileName: String): TPatchFile;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
PatchFile:=nil;
|
||||
for i:=0 to Length(FPat) - 1 do begin
|
||||
if(CompareText(FPat[i].FNew.FileName,FileName)=0) then begin
|
||||
PatchFile:=FPat[i];
|
||||
end;
|
||||
end;
|
||||
for i:=0 to Length(FPat) - 1 do begin
|
||||
if(CompareText(FPat[i].FNew.FriendlyName,FileName)=0) then begin
|
||||
PatchFile:=FPat[i];
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPatchProject.PatchFile(Index: Integer): TPatchFile;
|
||||
begin
|
||||
if (Index<Length(FPat)) and (Index>=0) then
|
||||
PatchFile:=FPat[Index]
|
||||
else
|
||||
PatchFile:=nil;
|
||||
end;
|
||||
|
||||
procedure TPatchProject.ResetCache;
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
for i:=0 to Pred(Length(FPat)) do
|
||||
FPat[i].ResetCache;
|
||||
end;
|
||||
|
||||
procedure TPatchProject.SaveToStream(Stream: TStream);
|
||||
var
|
||||
HeadID: Array[0..3] of Char;
|
||||
i: LongInt;
|
||||
j: Integer;
|
||||
begin
|
||||
HeadID:='VPJ'+#26;
|
||||
Stream.Write(HeadID,SizeOf(HeadID));
|
||||
//16 dummy bytes
|
||||
i:=0;
|
||||
Stream.Write(i,SizeOf(i));
|
||||
Stream.Write(i,SizeOf(i));
|
||||
Stream.Write(i,SizeOf(i));
|
||||
Stream.Write(i,SizeOf(i));
|
||||
i:=Length(FPat);
|
||||
Stream.Write(i,SizeOf(i));
|
||||
for j:=0 to i - 1 do begin
|
||||
FPat[j].SaveToStream(Stream);
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TPatchProject.WritePatches(Stream: TStream);
|
||||
var
|
||||
i,j,k,o: LongInt;
|
||||
begin
|
||||
k:=$54415056;
|
||||
o:=Stream.Position;
|
||||
Stream.Write(k,SizeOf(k));
|
||||
k:=0;
|
||||
Stream.Write(k,SizeOf(k));
|
||||
k:=0;
|
||||
for i:=0 to Length(FPat)-1 do begin
|
||||
for j:=0 to FPat[i].GetOldVersionCount - 1 do begin
|
||||
FPat[i].WritePatch(j,Stream);
|
||||
Inc(k);
|
||||
end;
|
||||
end;
|
||||
Stream.Seek(o+4,soFromBeginning);
|
||||
Stream.Write(k,SizeOf(k));
|
||||
Stream.Seek(Stream.Size,soFromBeginning);
|
||||
Stream.Write(o,SizeOf(o));
|
||||
end;
|
||||
|
||||
end.
|
||||
|
102
Contrib/VPatch/Source/GUI/ProgressForm.dfm
Normal file
102
Contrib/VPatch/Source/GUI/ProgressForm.dfm
Normal file
|
@ -0,0 +1,102 @@
|
|||
object frmProg: TfrmProg
|
||||
Left = 328
|
||||
Top = 266
|
||||
BorderIcons = [biSystemMenu, biMinimize]
|
||||
BorderStyle = bsSingle
|
||||
Caption = 'Progress...'
|
||||
ClientHeight = 193
|
||||
ClientWidth = 385
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
Position = poScreenCenter
|
||||
OnCreate = FormCreate
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object lblStatus: TLabel
|
||||
Left = 8
|
||||
Top = 8
|
||||
Width = 369
|
||||
Height = 17
|
||||
AutoSize = False
|
||||
Transparent = True
|
||||
end
|
||||
object lblSize: TLabel
|
||||
Left = 152
|
||||
Top = 8
|
||||
Width = 225
|
||||
Height = 17
|
||||
Alignment = taRightJustify
|
||||
AutoSize = False
|
||||
Transparent = True
|
||||
end
|
||||
object lblFile: TLabel
|
||||
Left = 8
|
||||
Top = 48
|
||||
Width = 369
|
||||
Height = 17
|
||||
AutoSize = False
|
||||
Caption = '(filename)'
|
||||
end
|
||||
object lblNewFile: TLabel
|
||||
Left = 8
|
||||
Top = 96
|
||||
Width = 369
|
||||
Height = 17
|
||||
AutoSize = False
|
||||
Caption = '(filename)'
|
||||
end
|
||||
object lblTotal: TLabel
|
||||
Left = 8
|
||||
Top = 144
|
||||
Width = 369
|
||||
Height = 17
|
||||
AutoSize = False
|
||||
Caption = 'Total progress'
|
||||
end
|
||||
object shpFull: TShape
|
||||
Left = 8
|
||||
Top = 24
|
||||
Width = 369
|
||||
Height = 17
|
||||
Brush.Color = clGray
|
||||
end
|
||||
object shpLeft: TShape
|
||||
Left = 8
|
||||
Top = 24
|
||||
Width = 369
|
||||
Height = 17
|
||||
Brush.Color = clRed
|
||||
end
|
||||
object prgFile: TProgressBar
|
||||
Left = 8
|
||||
Top = 64
|
||||
Width = 369
|
||||
Height = 25
|
||||
Min = 0
|
||||
Max = 100
|
||||
TabOrder = 0
|
||||
end
|
||||
object prgNewFile: TProgressBar
|
||||
Left = 8
|
||||
Top = 112
|
||||
Width = 369
|
||||
Height = 25
|
||||
Min = 0
|
||||
Max = 100
|
||||
TabOrder = 1
|
||||
end
|
||||
object prgAll: TProgressBar
|
||||
Left = 8
|
||||
Top = 160
|
||||
Width = 369
|
||||
Height = 25
|
||||
Min = 0
|
||||
Max = 100
|
||||
TabOrder = 2
|
||||
end
|
||||
end
|
74
Contrib/VPatch/Source/GUI/ProgressForm.pas
Normal file
74
Contrib/VPatch/Source/GUI/ProgressForm.pas
Normal file
|
@ -0,0 +1,74 @@
|
|||
unit ProgressForm;
|
||||
|
||||
interface
|
||||
|
||||
uses
|
||||
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
|
||||
Dialogs, StdCtrls, ComCtrls, ExtCtrls, Math;
|
||||
|
||||
type
|
||||
TfrmProg = class(TForm)
|
||||
prgFile: TProgressBar;
|
||||
lblFile: TLabel;
|
||||
lblNewFile: TLabel;
|
||||
prgNewFile: TProgressBar;
|
||||
lblTotal: TLabel;
|
||||
prgAll: TProgressBar;
|
||||
lblStatus: TLabel;
|
||||
shpFull: TShape;
|
||||
shpLeft: TShape;
|
||||
lblSize: TLabel;
|
||||
procedure GetStatusProc(S: PChar; Point, Total,
|
||||
CurrentSavings: Integer); stdcall;
|
||||
procedure FormCreate(Sender: TObject);
|
||||
private
|
||||
{ Private declarations }
|
||||
public
|
||||
{ Public declarations }
|
||||
FilePos,FileRange,AllPos,AllRange: Byte;
|
||||
CTotal: Integer;
|
||||
t2: TDateTime;
|
||||
end;
|
||||
|
||||
var
|
||||
frmProg: TfrmProg;
|
||||
|
||||
implementation
|
||||
|
||||
{$R *.dfm}
|
||||
|
||||
procedure TfrmProg.GetStatusProc(S: PChar; Point, Total, CurrentSavings: Integer); stdcall;
|
||||
var
|
||||
a,b: Integer;
|
||||
j: Single;
|
||||
begin
|
||||
if Length(S)>0 then
|
||||
lblStatus.Caption:=S;
|
||||
if (Total<0) then begin
|
||||
Total:=CTotal;
|
||||
if (Now-t2)*24*3600*10<8 then Exit; //update only every 800 milliseconds
|
||||
end;
|
||||
if (Total>=0) then CTotal:=Total;
|
||||
if (Total>=0) and (Point>=0) then begin
|
||||
a:=(Point*100) div Total;
|
||||
prgFile.Position:=a;
|
||||
b:=FilePos+(a*FileRange) div 100;
|
||||
prgNewFile.Position:=b;
|
||||
prgAll.Position:=AllPos+(b*AllRange) div 100;
|
||||
end;
|
||||
if (CurrentSavings>=0) and (Total>=0) then begin
|
||||
j:=(Total-CurrentSavings)*shpFull.Width/Total;
|
||||
shpLeft.Width:=Max(Round(j),3);
|
||||
lblSize.Caption:=IntToStr(Total-CurrentSavings)+' of '+IntToStr(Total)+' ('+IntToStr(CurrentSavings*100 div Total)+'%)';
|
||||
end;
|
||||
Refresh;
|
||||
t2:=Now;
|
||||
end;
|
||||
|
||||
procedure TfrmProg.FormCreate(Sender: TObject);
|
||||
begin
|
||||
FilePos:=0; FileRange:=100; AllPos:=0; AllRange:=100; CTotal:=-1;
|
||||
t2:=0;
|
||||
end;
|
||||
|
||||
end.
|
87
Contrib/VPatch/Source/GUI/VPatchGUI.dof
Normal file
87
Contrib/VPatch/Source/GUI/VPatchGUI.dof
Normal file
|
@ -0,0 +1,87 @@
|
|||
[FileVersion]
|
||||
Version=6.0
|
||||
[Compiler]
|
||||
A=8
|
||||
B=0
|
||||
C=1
|
||||
D=1
|
||||
E=0
|
||||
F=0
|
||||
G=1
|
||||
H=1
|
||||
I=1
|
||||
J=0
|
||||
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=0
|
||||
DebugInfo=0
|
||||
RemoteSymbols=0
|
||||
MinStackSize=16384
|
||||
MaxStackSize=1048576
|
||||
ImageBase=4194304
|
||||
ExeDescription=
|
||||
[Directories]
|
||||
OutputDir=
|
||||
UnitOutputDir=
|
||||
PackageDLLOutputDir=
|
||||
PackageDCPOutputDir=
|
||||
SearchPath=
|
||||
Packages=vcl;rtl;dbrtl;adortl;vcldb;vclx;bdertl;vcldbx;ibxpress;dsnap;cds;bdecds;qrpt;teeui;teedb;tee;dss;teeqr;visualclx;visualdbclx;dsnapcrba;dsnapcon;VclSmp;vclshlctrls;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;nmfast;webdsnap;websnap;dbexpress;dbxcds;indy;dclOffice2k;VirtualTreesD6;packageTib;inetdb
|
||||
Conditionals=
|
||||
DebugSourceDirs=
|
||||
UsePackages=0
|
||||
[Parameters]
|
||||
RunParams=
|
||||
HostApplication=
|
||||
Launcher=
|
||||
UseLauncher=0
|
||||
DebugCWD=
|
||||
[Language]
|
||||
ActiveLang=
|
||||
ProjectLang=
|
||||
RootDir=
|
||||
[Version Info]
|
||||
IncludeVerInfo=1
|
||||
AutoIncBuild=1
|
||||
MajorVer=2
|
||||
MinorVer=0
|
||||
Release=0
|
||||
Build=10
|
||||
Debug=0
|
||||
PreRelease=0
|
||||
Special=0
|
||||
Private=0
|
||||
DLL=0
|
||||
Locale=1043
|
||||
CodePage=1252
|
||||
[Version Info Keys]
|
||||
CompanyName=Van de Sande Productions
|
||||
FileDescription=VG - VPatch GUI
|
||||
FileVersion=2.0.0.10
|
||||
InternalName=VPatchGUI
|
||||
LegalCopyright=
|
||||
LegalTrademarks=
|
||||
OriginalFilename=
|
||||
ProductName=
|
||||
ProductVersion=2.0 final
|
||||
Comments=
|
19
Contrib/VPatch/Source/GUI/VPatchGUI.dpr
Normal file
19
Contrib/VPatch/Source/GUI/VPatchGUI.dpr
Normal file
|
@ -0,0 +1,19 @@
|
|||
program VPatchGUI;
|
||||
|
||||
uses
|
||||
Forms,
|
||||
MainForm in 'MainForm.pas' {frmMain},
|
||||
PatchClasses in 'PatchClasses.pas',
|
||||
VDSP_CRC in '..\VDSP_CRC.pas',
|
||||
DLLWrapper in 'DLLWrapper.pas',
|
||||
AboutForm in 'AboutForm.pas' {frmAbout},
|
||||
PatchGenerator in '..\PatchGenerator.pas',
|
||||
TreeCode in '..\TreeCode.pas';
|
||||
|
||||
{$R *.res}
|
||||
|
||||
begin
|
||||
Application.Initialize;
|
||||
Application.CreateForm(TfrmMain, frmMain);
|
||||
Application.Run;
|
||||
end.
|
BIN
Contrib/VPatch/Source/GUI/VPatchGUI.res
Normal file
BIN
Contrib/VPatch/Source/GUI/VPatchGUI.res
Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue