|
From: Robert M. <mar...@us...> - 2004-01-27 14:00:30
|
Update of /cvsroot/jvcl/dev/JVCL3/run In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3443/JVCL3/run Modified Files: JvAni.pas JvAniFile.pas Log Message: example works with all ANIs now, also improved Index: JvAni.pas =================================================================== RCS file: /cvsroot/jvcl/dev/JVCL3/run/JvAni.pas,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -d -r1.16 -r1.17 *** JvAni.pas 23 Jan 2004 07:02:39 -0000 1.16 --- JvAni.pas 25 Jan 2004 05:37:33 -0000 1.17 *************** *** 74,77 **** --- 74,79 ---- procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle; APalette: HPALETTE); override; procedure SaveToClipboardFormat(var Format: Word; var Data: THandle; var APalette: HPALETTE); override; + procedure AssignToBitmap(Bitmap: TBitmap; BackColor: TColor; + DecreaseColors, Vertical: Boolean); {$ENDIF VCL} procedure Draw(ACanvas: TCanvas; const ARect: TRect); override; *************** *** 174,177 **** --- 176,185 ---- end; + procedure TJvAni.AssignToBitmap(Bitmap: TBitmap; BackColor: TColor; + DecreaseColors, Vertical: Boolean); + begin + FIconData.AssignToBitmap(Bitmap, Backcolor, DecreaseColors, Vertical); + end; + {$ENDIF VCL} Index: JvAniFile.pas =================================================================== RCS file: /cvsroot/jvcl/dev/JVCL3/run/JvAniFile.pas,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** JvAniFile.pas 23 Jan 2004 07:02:42 -0000 1.20 --- JvAniFile.pas 25 Jan 2004 05:37:33 -0000 1.21 *************** *** 60,71 **** end; - TAniName = array [0..255] of Char; - TJvAnimatedCursorImage = class(TPersistent) private - FData: TMemoryStream; FHeader: TJvAniHeader; ! FTitle: TAniName; ! FCreator: TAniName; FIcons: TList; FOriginalColors: Word; --- 60,68 ---- end; TJvAnimatedCursorImage = class(TPersistent) private FHeader: TJvAniHeader; ! FTitle: string; ! FCreator: string; FIcons: TList; FOriginalColors: Word; *************** *** 78,88 **** function GetIcon(Index: Integer): TIcon; function GetFrame(Index: Integer): TJvIconFrame; - function GetTitle: string; - function GetCreator: string; function GetDefaultRate: Longint; procedure SetIndex(Value: Integer); procedure ReadAniStream(Stream: TStream); ! procedure ReadStream(Size: Longint; Stream: TStream); ! procedure WriteStream(Stream: TStream; WriteSize: Boolean); protected procedure AssignTo(Dest: TPersistent); override; --- 75,82 ---- function GetIcon(Index: Integer): TIcon; function GetFrame(Index: Integer): TJvIconFrame; function GetDefaultRate: Longint; procedure SetIndex(Value: Integer); procedure ReadAniStream(Stream: TStream); ! procedure WriteAniStream(Stream: TStream); protected procedure AssignTo(Dest: TPersistent); override; *************** *** 104,109 **** property Icons[Index: Integer]: TIcon read GetIcon; property Frames[Index: Integer]: TJvIconFrame read GetFrame; ! property Title: string read GetTitle; ! property Creator: string read GetCreator; property OriginalColors: Word read FOriginalColors; property Header: TJvAniHeader read FHeader; --- 98,103 ---- property Icons[Index: Integer]: TIcon read GetIcon; property Frames[Index: Integer]: TJvIconFrame read GetFrame; ! property Title: string read FTitle write FTitle; ! property Creator: string read FCreator write FCreator; property OriginalColors: Word read FOriginalColors; property Header: TJvAniHeader read FHeader; *************** *** 156,179 **** { ReadTag, ReadChunk, SkipChunk. Some handy functions for reading RIFF files. } ! function ReadTag(S: TStream; pTag: PJvAniTag): Boolean; begin ! pTag^.ckID := #0#0#0#0; ! pTag^.ckSize := 0; ! Result := S.Read(pTag^, SizeOf(TJvAniTag)) = SizeOf(TJvAniTag); end; ! function ReadChunk(S: TStream; pTag: PJvAniTag; Data: Pointer): Boolean; begin ! Result := S.Read(Data^, pTag^.ckSize) = pTag^.ckSize; if Result then ! Result := S.Seek(pTag^.ckSize mod 2, soFromCurrent) <> -1; end; ! function ReadChunkN(S: TStream; pTag: PJvAniTag; Data: Pointer; cbMax: Longint): Boolean; var cbRead: Longint; begin ! cbRead := pTag^.ckSize; if cbMax < cbRead then cbRead := cbMax; --- 150,174 ---- { ReadTag, ReadChunk, SkipChunk. Some handy functions for reading RIFF files. } ! function ReadTag(S: TStream; var Tag: TJvAniTag): Boolean; begin ! Tag.ckID := #0#0#0#0; ! Tag.ckSize := 0; ! Result := S.Read(Tag, SizeOf(TJvAniTag)) = SizeOf(TJvAniTag); end; ! function ReadChunk(S: TStream; const Tag: TJvAniTag; Data: Pointer): Boolean; begin ! Result := S.Read(Data^, Tag.ckSize) = Tag.ckSize; if Result then ! Result := S.Seek(Tag.ckSize mod 2, soFromCurrent) <> -1; end; ! function ReadChunkN(S: TStream; const Tag: TJvAniTag; Data: Pointer; cbMax: Longint): Boolean; var cbRead: Longint; begin ! FillChar(Data^, cbMax, #0); ! cbRead := Tag.ckSize; if cbMax < cbRead then cbRead := cbMax; *************** *** 181,193 **** if Result then begin ! cbRead := PadUp(pTag^.ckSize) - cbRead; Result := S.Seek(cbRead, soFromCurrent) <> -1; end; end; ! function SkipChunk(S: TStream; pTag: PJvAniTag): Boolean; begin // Round pTag^.ckSize up to nearest word boundary to maintain alignment ! Result := S.Seek(PadUp(pTag^.ckSize), soFromCurrent) <> -1; end; --- 176,188 ---- if Result then begin ! cbRead := PadUp(Tag.ckSize) - cbRead; Result := S.Seek(cbRead, soFromCurrent) <> -1; end; end; ! function SkipChunk(S: TStream; const Tag: TJvAniTag): Boolean; begin // Round pTag^.ckSize up to nearest word boundary to maintain alignment ! Result := S.Seek(PadUp(Tag.ckSize), soFromCurrent) <> -1; end; *************** *** 294,298 **** inherited Create; FIcons := TList.Create; - FData := TMemoryStream.Create; FIndex := 0; end; --- 289,292 ---- *************** *** 302,306 **** NewImage; FIcons.Free; - FData.Free; inherited Destroy; end; --- 296,299 ---- *************** *** 318,323 **** TJvIconFrame(FIcons[I]).Free; FIcons.Clear; ! FillChar(FTitle, SizeOf(FTitle), 0); ! FillChar(FCreator, SizeOf(FCreator), 0); FillChar(FHeader, SizeOf(FHeader), 0); FOriginalColors := 0; --- 311,316 ---- TJvIconFrame(FIcons[I]).Free; FIcons.Clear; ! FTitle := ''; ! FCreator := ''; FillChar(FHeader, SizeOf(FHeader), 0); FOriginalColors := 0; *************** *** 329,342 **** end; - function TJvAnimatedCursorImage.GetTitle: string; - begin - Result := FTitle; - end; - - function TJvAnimatedCursorImage.GetCreator: string; - begin - Result := FCreator; - end; - function TJvAnimatedCursorImage.GetIconCount: Integer; begin --- 322,325 ---- *************** *** 380,385 **** begin Move(FHeader, Self.FHeader, SizeOf(FHeader)); ! Self.FTitle := FTitle; ! Self.FCreator := FCreator; Self.FOriginalColors := FOriginalColors; for I := 0 to FIcons.Count - 1 do --- 363,368 ---- begin Move(FHeader, Self.FHeader, SizeOf(FHeader)); ! Self.FTitle := Title; ! Self.FCreator := Creator; Self.FOriginalColors := FOriginalColors; for I := 0 to FIcons.Count - 1 do *************** *** 505,516 **** animated cursors looks like this: ! RIFF('ACON' ! LIST('INFO' ! INAM(<name>) ! IART(<artist>)) ! anih(<anihdr>) ! [rate(<rateinfo>)] ! ['seq '( <seq_info>)] ! LIST('fram' icon(<icon_file>))) } --- 488,503 ---- animated cursors looks like this: ! "RIFF" [Length of File] ! "ACON" ! "LIST" [Length of List] ! "INAM" [Length of Title] [Data] ! "IART" [Length of Author] [Data] ! "fram" ! "icon" [Length of Icon][Data] ; 1st in list ! ... ! "icon" [Length of Icon] [Data] ; Last in list (1 to cFrames) ! "anih" [Length of ANI header (36 bytes)] [Data] ; (see ANI Header TypeDef) ! "rate" [Length of rate block] [Data] ; ea. rate is a long (length is 1 to cSteps) ! "seq " [Length of sequence block] [Data] ; ea. seq is a long (length is 1 to cSteps) } *************** *** 524,527 **** --- 511,515 ---- bFound, IsIcon: Boolean; HotSpot: TPoint; + Buffer: array [0..255] of Char; begin iFrame := 0; *************** *** 529,533 **** iSeq := 0; { Make sure it's a RIFF ANI file } ! if not ReadTag(Stream, @Tag) or (Tag.ckID <> FOURCC_RIFF) then RiffReadError; if (Stream.Read(Tag.ckID, SizeOf(Tag.ckID)) < SizeOf(Tag.ckID)) or --- 517,521 ---- iSeq := 0; { Make sure it's a RIFF ANI file } ! if not ReadTag(Stream, Tag) or (Tag.ckID <> FOURCC_RIFF) then RiffReadError; if (Stream.Read(Tag.ckID, SizeOf(Tag.ckID)) < SizeOf(Tag.ckID)) or *************** *** 536,544 **** NewImage; { look for 'anih', 'rate', 'seq ', and 'icon' chunks } ! while ReadTag(Stream, @Tag) do begin if Tag.ckID = FOURCC_anih then begin ! if not ReadChunk(Stream, @Tag, @FHeader) then Break; if ((FHeader.dwFlags and AF_ICON) <> AF_ICON) or --- 524,532 ---- NewImage; { look for 'anih', 'rate', 'seq ', and 'icon' chunks } ! while ReadTag(Stream, Tag) do begin if Tag.ckID = FOURCC_anih then begin ! if not ReadChunk(Stream, Tag, @FHeader) then Break; if ((FHeader.dwFlags and AF_ICON) <> AF_ICON) or *************** *** 555,559 **** begin { If we find a rate chunk, read it into its preallocated space } ! if not ReadChunkN(Stream, @Tag, @Temp, SizeOf(Longint)) then Break; if iRate < FIcons.Count then --- 543,547 ---- begin { If we find a rate chunk, read it into its preallocated space } ! if not ReadChunkN(Stream, Tag, @Temp, SizeOf(Longint)) then Break; if iRate < FIcons.Count then *************** *** 565,569 **** begin { If we find a seq chunk, read it into its preallocated space } ! if not ReadChunkN(Stream, @Tag, @Temp, SizeOf(Longint)) then Break; if iSeq < FIcons.Count then --- 553,557 ---- begin { If we find a seq chunk, read it into its preallocated space } ! if not ReadChunkN(Stream, Tag, @Temp, SizeOf(Longint)) then Break; if iSeq < FIcons.Count then *************** *** 584,588 **** while cbChunk >= SizeOf(Tag) do begin ! if not ReadTag(Stream, @Tag) then Break; Dec(cbChunk, SizeOf(Tag)); --- 572,576 ---- while cbChunk >= SizeOf(Tag) do begin ! if not ReadTag(Stream, Tag) then Break; Dec(cbChunk, SizeOf(Tag)); *************** *** 618,622 **** else { Unknown chunk in fram list, just ignore it } ! SkipChunk(Stream, @Tag); Dec(cbChunk, PadUp(Tag.ckSize)); end; --- 606,610 ---- else { Unknown chunk in fram list, just ignore it } ! SkipChunk(Stream, Tag); Dec(cbChunk, PadUp(Tag.ckSize)); end; *************** *** 628,632 **** while cbChunk >= SizeOf(Tag) do begin ! if not ReadTag(Stream, @Tag) then Break; Dec(cbChunk, SizeOf(Tag)); --- 616,620 ---- while cbChunk >= SizeOf(Tag) do begin ! if not ReadTag(Stream, Tag) then Break; Dec(cbChunk, SizeOf(Tag)); *************** *** 634,640 **** begin if (cbChunk < Tag.ckSize) or ! not ReadChunkN(Stream, @Tag, @FTitle, SizeOf(TANINAME) - 1) then Break; Dec(cbChunk, PadUp(Tag.ckSize)); end else --- 622,629 ---- begin if (cbChunk < Tag.ckSize) or ! not ReadChunkN(Stream, Tag, @Buffer[0], SizeOf(Buffer)-1) then Break; Dec(cbChunk, PadUp(Tag.ckSize)); + FTitle := Buffer; end else *************** *** 642,652 **** begin if (cbChunk < Tag.ckSize) or ! not ReadChunkN(Stream, @Tag, @FCreator, SizeOf(TANINAME) - 1) then Break; Dec(cbChunk, PadUp(Tag.ckSize)); end else begin ! if not SkipChunk(Stream, @Tag) then Break; Dec(cbChunk, PadUp(Tag.ckSize)); --- 631,642 ---- begin if (cbChunk < Tag.ckSize) or ! not ReadChunkN(Stream, Tag, @Buffer[0], SizeOf(Buffer)-1) then Break; Dec(cbChunk, PadUp(Tag.ckSize)); + FCreator := Buffer; end else begin ! if not SkipChunk(Stream, Tag) then Break; Dec(cbChunk, PadUp(Tag.ckSize)); *************** *** 659,663 **** chunk. (Do not forget that we have already skipped one dword) } Tag.ckSize := cbChunk; ! SkipChunk(Stream, @Tag); end; end --- 649,653 ---- chunk. (Do not forget that we have already skipped one dword) } Tag.ckSize := cbChunk; ! SkipChunk(Stream, Tag); end; end *************** *** 665,669 **** begin { We are not interested in this chunk, skip it. } ! if not SkipChunk(Stream, @Tag) then Break; end; --- 655,659 ---- begin { We are not interested in this chunk, skip it. } ! if not SkipChunk(Stream, Tag) then Break; end; *************** *** 684,713 **** end; ! procedure TJvAnimatedCursorImage.ReadStream(Size: Longint; Stream: TStream); begin ! FData.SetSize(Size); ! Stream.ReadBuffer(FData.Memory^, Size); ! if Size > 0 then ! begin ! FData.Position := 0; ! ReadAniStream(FData); end; end; - procedure TJvAnimatedCursorImage.WriteStream(Stream: TStream; WriteSize: Boolean); - begin - if IconCount = 0 then - raise EInvalidGraphicOperation.Create(SInvalidImage); - Stream.Write(FData.Memory^, FData.Size) - end; - procedure TJvAnimatedCursorImage.LoadFromStream(Stream: TStream); begin ! ReadStream(Stream.Size - Stream.Position, Stream); end; procedure TJvAnimatedCursorImage.SaveToStream(Stream: TStream); begin ! WriteStream(Stream, False); end; --- 674,714 ---- end; ! procedure TJvAnimatedCursorImage.WriteAniStream(Stream: TStream); ! var ! Data: TMemoryStream; begin ! Data := TMemoryStream.Create; ! try ! Stream.CopyFrom(Data, 0); ! finally ! Data.Free; end; end; procedure TJvAnimatedCursorImage.LoadFromStream(Stream: TStream); + var + Data: TMemoryStream; + Size: Longint; begin ! Size := Stream.Size - Stream.Position; ! Data := TMemoryStream.Create; ! try ! Data.SetSize(Size); ! Stream.ReadBuffer(Data.Memory^, Size); ! if Size > 0 then ! begin ! Data.Position := 0; ! ReadAniStream(Data); ! end; ! finally ! Data.Free; ! end; end; procedure TJvAnimatedCursorImage.SaveToStream(Stream: TStream); begin ! if IconCount = 0 then ! raise EInvalidGraphicOperation.Create(SInvalidImage); ! WriteAniStream(Stream); end; *************** *** 732,736 **** begin if FIcons.Count > 0 then ! if not Icons[Index].Empty then {$IFDEF VCL} DrawRealSizeIcon(ACanvas, Icons[Index], ARect.Left, ARect.Top); --- 733,737 ---- begin if FIcons.Count > 0 then ! if (Icons[Index] <> nil) and not Icons[Index].Empty then {$IFDEF VCL} DrawRealSizeIcon(ACanvas, Icons[Index], ARect.Left, ARect.Top); *************** *** 746,749 **** --- 747,752 ---- I: Integer; Temp: TBitmap; + Idx: Integer; + R: TRect; begin Temp := TBitmap.Create; *************** *** 766,773 **** end; Canvas.FillRect(Bounds(0, 0, Width, Height)); for I := 0 to FIcons.Count - 1 do ! if Icons[I] <> nil then ! Canvas.Draw(Icons[I].Width * I * Ord(not Vertical), ! Icons[I].Height * I * Ord(Vertical), Icons[I]); end; if DecreaseColors then --- 769,781 ---- end; Canvas.FillRect(Bounds(0, 0, Width, Height)); + Idx := Index; for I := 0 to FIcons.Count - 1 do ! begin ! Index := I; ! R := Rect(Icons[I].Width * I * Ord(not Vertical), ! Icons[I].Height * I * Ord(Vertical), 0, 0); ! Draw(Canvas, R); ! end; ! Index := Idx; end; if DecreaseColors then |