From: <tw...@us...> - 2021-06-20 13:39:41
|
Revision: 3552 http://sourceforge.net/p/gexperts/code/3552 Author: twm Date: 2021-06-20 13:39:40 +0000 (Sun, 20 Jun 2021) Log Message: ----------- synced with dzlib from OSDN Modified Paths: -------------- trunk/ExternalSource/dzlib/u_dzDateUtils.pas trunk/ExternalSource/dzlib/u_dzFileUtils.pas trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas Modified: trunk/ExternalSource/dzlib/u_dzDateUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzDateUtils.pas 2021-06-20 13:11:41 UTC (rev 3551) +++ trunk/ExternalSource/dzlib/u_dzDateUtils.pas 2021-06-20 13:39:40 UTC (rev 3552) @@ -126,6 +126,7 @@ /// (I had to decide between the sane UK format or the brain dead US format, i chose the UK format.) /// </summary> function TryStr2DateTime(const _s: string; out _DateTime: TDateTime): Boolean; +function Str2DateTime(const _s: string): TDateTime; {$IFEND} {$IF Declared(TFormatSettings)} @@ -448,6 +449,12 @@ Result := False; end; end; + +function Str2DateTime(const _s: string): TDateTime; +begin + if not TryStr2DateTime(_s, Result) then + raise EdzDateUtilsException.CreateFmt(_('Cannot interpret "%s" as a date and time value'), [_s]); +end; {$IFEND} {$IF Declared(TFormatSettings)} Modified: trunk/ExternalSource/dzlib/u_dzFileUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzFileUtils.pas 2021-06-20 13:11:41 UTC (rev 3551) +++ trunk/ExternalSource/dzlib/u_dzFileUtils.pas 2021-06-20 13:39:40 UTC (rev 3552) @@ -90,6 +90,9 @@ /// number of matching files found FMatchCount: Integer; public + type + TOnEnumCallback = procedure(_Sender: TObject; const _Filename: string) of object; + public /// <summary> /// Creates a TSimpleDirEnumerator, sets the Mask, MayHaveAttr and MustHaveAttr /// properties. @@ -123,6 +126,10 @@ _IncludePath: Boolean = False; _Sort: Boolean = True): Integer; overload; class function EnumFilesOnly(const _Mask: string; _IncludePath: Boolean = False; _Sort: Boolean = True): TStringArray; overload; + ///<summary> + /// Calls the given callback for all files matching the mask. To Abort, raise EAbort. </summary> + class procedure EnumFilesOnly(const _Mask: string; _Callback: TOnEnumCallback; + _IncludePath: Boolean = False; _Sort: Boolean = True); overload; /// <summary> /// creates a TSimpleDirEnumerator, calls its FindAll method and frees it /// @param List is a string list to which the files will be appended, may be nil @@ -1060,10 +1067,20 @@ ///<summary> /// Replaces filename, but not extension(s) with the given filename </summary> procedure ReplaceFilenameOnly(const _FilenameOnly: string); + ///<summary> + /// Replaces the full extension with the given one. + /// @param Extension is the new extension including the leading dot e.g. '.txt' </summary> procedure ReplaceExtension(const _Extension: string); ///<summary> - /// Replaces the whole extension with the given array of textensions </summary> + /// Replaces the whole extension with the given array of extensions + /// Example: ['.bla', '.blub', '.tmp'] will change the extension to '.bla.blub.tmp' </summary> procedure ReplaceExtensions(const _Extensions: TStringArray); + ///<summary> + /// Replaces the last extension of the filename with the given one + /// @param Extension is the new extension including the leading dot e.g. '.txt' + /// Example: + /// Given the file name 'c:\bla\file.bla.txt' + /// ReplaceLastExtension('.doc') will change the file name to 'c:\bla\file.bla.doc' </summary> procedure ReplaceLastExtension(const _Extension: string); ///<summary> /// @returns true, if the filename contains either a drive letter or is a UNC, false otherwise @@ -1081,7 +1098,7 @@ /// Parts(-2) = 'c:' /// Parts(<=-3) = '' /// Note that every call will parse the filename again, so you should buffer this - /// value if you need it multpile times. If you need all parts, consider using GetParts </summary> + /// value if you need it multiple times. If you need all parts, consider using Split </summary> function Parts(_Depth: Integer): string; ///<summary> /// Returns the number of parts separated by PathDelim characters. @@ -1103,6 +1120,8 @@ ///<summary> /// Same as Full </summary> class operator Implicit(_a: TFilename): string; + class operator Add(const _a: TFilename; const _b: string): string; + class operator Add(const _a: string; const _b: TFilename): string; end; type @@ -1293,6 +1312,30 @@ end; end; +class procedure TSimpleDirEnumerator.EnumFilesOnly(const _Mask: string; _Callback: TOnEnumCallback; + _IncludePath: Boolean = False; _Sort: Boolean = True); +var + enum: TSimpleDirEnumerator; + List: TStringList; + i: Integer; +begin + enum := TSimpleDirEnumerator.CreateForFilesOnly(_Mask); + try + List := TStringList.Create; + try + enum.FindAll(List, _IncludePath); + if _Sort then + List.Sort; + for i := 0 to List.Count - 1 do + _Callback(enum, List[i]); + finally + FreeAndNil(List); + end; + finally + FreeAndNil(enum); + end; +end; + class function TSimpleDirEnumerator.EnumFilesOnly(const _Mask: string; _IncludePath, _Sort: Boolean): TStringArray; var @@ -1521,6 +1564,7 @@ // I can't be bothered to add lots of ifdefs, so I turn this warning off for the rest of the unit. {$WARN SYMBOL_DEPRECATED OFF} {$ENDIF} + class function TFileSystem.CreateDir(const _DirectoryName: string; _RaiseException: Boolean): Boolean; begin Result := Self.CreateDir(_DirectoryName, re2ehe(_RaiseException)); @@ -3252,6 +3296,16 @@ {$IFDEF SUPPORTS_ENHANCED_RECORDS} { TFilename } +class operator TFilename.Add(const _a: TFilename; const _b: string): string; +begin + Result := _a.Full + _b; +end; + +class operator TFilename.Add(const _a: string; const _b: TFilename): string; +begin + Result := _a + _b.Full; +end; + class operator TFilename.Implicit(const _s: string): TFilename; begin Result.Init(_s); Modified: trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas 2021-06-20 13:11:41 UTC (rev 3551) +++ trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas 2021-06-20 13:39:40 UTC (rev 3552) @@ -1516,10 +1516,15 @@ end; procedure TBitmap_AssignBgr8(_Buffer: PByte; _bmp: TBitmap; _YIsReversed: Boolean); +const + BytesPerPixel = 3; var y: Integer; ScanLine: PdzRgbTripleArray; - BytesPerLine: Integer; + BufferBytesPerLine: Integer; + BitmapBytesPerLine: Integer; + h: Integer; + w: Integer; // ms: TMemoryStream; // bfh: TBitmapFileHeader; // bih: TBitmapInfoHeader; @@ -1526,8 +1531,14 @@ begin Assert(_bmp.PixelFormat = pf24bit, 'unexpected PixelFormat (expected pf24bit)'); - BytesPerLine := 3 * _bmp.Width; + h := _bmp.Height; + w := _bmp.Width; + BufferBytesPerLine := BytesPerPixel * w; + + BitmapBytesPerLine := ((w * 8 * BytesPerPixel + 31) and not 31) div 8; + Assert(BitmapBytesPerLine = Graphics.BytesPerScanline(w, BytesPerPixel * 8, 32)); + // bfh.bfType := $4D42; // 'BM' // bfh.bfSize := BytesPerLine * _Bmp.Height; // bfh.bfReserved1 := 0; @@ -1554,14 +1565,15 @@ // So we can only copy the whole picture in one go, if the buffer is also upside down // (many cameras have this feature). If not, we have to copy it one line at a time. if _YIsReversed then begin - ScanLine := _bmp.ScanLine[_bmp.Height - 1]; - Move(_Buffer^, ScanLine^, _bmp.Height * BytesPerLine); + ScanLine := _bmp.ScanLine[h - 1]; + Move(_Buffer^, ScanLine^, h * BufferBytesPerLine); end else begin // At least with GBR8 the bytes have the right order so we can copy the whole line in one go - for y := 0 to _bmp.Height - 1 do begin - ScanLine := _bmp.ScanLine[y]; - Move(_Buffer^, ScanLine^, BytesPerLine); - Inc(_Buffer, BytesPerLine); + ScanLine := _bmp.ScanLine[0]; + for y := 0 to h - 1 do begin + Move(_Buffer^, ScanLine^, BufferBytesPerLine); + Inc(_Buffer, BufferBytesPerLine); + Dec(PByte(ScanLine), BitmapBytesPerLine); end; end; end; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |