added more "professional" way to "show transparency" :)

+ some bugfixes in renderMT and Fullscreen
This commit is contained in:
zueuk 2006-08-23 15:57:47 +00:00
parent 53e8c17ac2
commit 37a2bc7ad7
8 changed files with 191 additions and 153 deletions

View File

@ -109,9 +109,6 @@ begin
while Renderer <> nil do while Renderer <> nil do
Application.ProcessMessages; // HandleThreadTermination kinda should be called here...(?) Application.ProcessMessages; // HandleThreadTermination kinda should be called here...(?)
// Renderer.Free;
// Renderer := nil;
end; end;
assert(not assigned(renderer), 'Render thread is still running!?'); assert(not assigned(renderer), 'Render thread is still running!?');
@ -160,19 +157,6 @@ procedure TFullscreenForm.HandleThreadTermination(var Message: TMessage);
var var
bm: TBitmap; bm: TBitmap;
begin begin
if Assigned(Renderer) then begin
(*
if not Closing then begin
bm := TBitmap.Create;
bm.assign(Renderer.GetImage);
Image.SetBounds(imgLeft, imgTop, imgWidth, imgHeight);
Image.Picture.Graphic := bm;
bm.Free;
end;
*)
//Renderer.Free;
//Renderer := nil;
end;
RenderStop.Enabled := false; RenderStop.Enabled := false;
RenderMore.Enabled := false; RenderMore.Enabled := false;

View File

@ -3,7 +3,7 @@ unit ImageMaker;
interface interface
uses uses
Windows, Graphics, ControlPoint, RenderTypes; Windows, Graphics, ControlPoint, RenderTypes, PngImage;
type TPalette = record type TPalette = record
logpal : TLogPalette; logpal : TLogPalette;
@ -47,13 +47,13 @@ type
procedure Progress(value: double); procedure Progress(value: double);
function GetTransparentImage: TBitmap;
public public
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
function GetImage: TBitmap; function GetImage: TBitmap;
function GetTransparentImage: TPNGObject;
procedure SetCP(CP: TControlPoint); procedure SetCP(CP: TControlPoint);
procedure Init; procedure Init;
@ -74,7 +74,7 @@ type
implementation implementation
uses uses
Math, SysUtils, PngImage, JPEG, Global, Types; Math, SysUtils, JPEG, Global, Types;
{ TImageMaker } { TImageMaker }
@ -181,9 +181,9 @@ end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
function TImageMaker.GetImage: TBitmap; function TImageMaker.GetImage: TBitmap;
begin begin
if ShowTransparency then // if ShowTransparency then
Result := GetTransparentImage // Result := GetTransparentImage
else // else
Result := FBitmap; Result := FBitmap;
end; end;
@ -312,8 +312,6 @@ begin
//bucketpos := 0; //bucketpos := 0;
by := 0; by := 0;
for i := 0 to fcp.Height - 1 do begin for i := 0 to fcp.Height - 1 do begin
// if FStop then
// Break;
bx := 0; bx := 0;
Progress(i / fcp.Height); Progress(i / fcp.Height);
AlphaRow := PByteArray(FAlphaBitmap.scanline[YOffset + i]); AlphaRow := PByteArray(FAlphaBitmap.scanline[YOffset + i]);
@ -442,8 +440,7 @@ zero_alpha:
Row[j].red := ri; Row[j].red := ri;
Row[j].green := gi; Row[j].green := gi;
Row[j].blue := bi; Row[j].blue := bi;
AlphaRow[j] := ai;//?
AlphaRow[j] := ai; //?
end end
end; end;
@ -531,49 +528,25 @@ begin
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
function TImageMaker.GetTransparentImage: TBitmap; function TImageMaker.GetTransparentImage: TPngObject;
var var
x,y: integer; x, y: integer;
i,row: integer; i, row: integer;
PngObject: TPngObject;
rowbm, rowpng: PByteArray; rowbm, rowpng: PByteArray;
begin begin
if assigned(FTransparentImage) then FTransparentImage.Free; Result := TPngObject.Create;
Result.Assign(FBitmap);
FTransparentImage := TBitmap.Create;
FTransparentImage.Width := Fcp.Width;
FTransparentImage.Height := Fcp.Height;
FTransparentImage.Canvas.Brush.Color := $CCCCCC;
FTransparentImage.Canvas.FillRect(Rect(0, 0, Fcp.Width, Fcp.Height));
FTransparentImage.Canvas.Brush.Color := $FFFFFF;
for x := 0 to ((Fcp.Width - 1) div 8) do begin
for y := 0 to ((Fcp.Height - 1) div 8) do begin
if odd(x + y) then
FTransparentImage.Canvas.FillRect(Rect(x * 8, y * 8, x * 8 + 8, y * 8 + 8));
end;
end;
PngObject := TPngObject.Create;
PngObject.Assign(FBitmap);
if fcp.Transparency then begin if fcp.Transparency then begin
PngObject.CreateAlpha; Result.CreateAlpha;
for i:= 0 to FAlphaBitmap.Height - 1 do begin for i:= 0 to FAlphaBitmap.Height - 1 do begin
rowbm := PByteArray(FAlphaBitmap.scanline[i]); rowbm := PByteArray(FAlphaBitmap.scanline[i]);
rowpng := PByteArray(PngObject.AlphaScanline[i]); rowpng := PByteArray(Result.AlphaScanline[i]);
for row := 0 to FAlphaBitmap.Width - 1 do begin for row := 0 to FAlphaBitmap.Width - 1 do begin
rowpng[row] := rowbm[row]; rowpng[row] := rowbm[row];
end; end;
end; end;
end; end;
PngObject.Draw(FTransparentImage.Canvas, FTransparentImage.Canvas.ClipRect);
PngObject.Free;
Result := FTransparentImage;
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////

View File

@ -232,16 +232,25 @@ object MainForm: TMainForm
ImageIndex = 13 ImageIndex = 13
OnClick = mnuOptionsClick OnClick = mnuOptionsClick
end end
object ToolButton6: TToolButton object tbShowAlpha: TToolButton
Left = 448 Left = 448
Top = 0 Top = 0
Hint = 'Show transparency'
Caption = 'tbShowAlpha'
ImageIndex = 37
Style = tbsCheck
OnClick = tbShowAlphaClick
end
object ToolButton6: TToolButton
Left = 471
Top = 0
Width = 8 Width = 8
Caption = 'ToolButton6' Caption = 'ToolButton6'
ImageIndex = 42 ImageIndex = 42
Style = tbsSeparator Style = tbsSeparator
end end
object tbzoomwindow: TToolButton object tbzoomwindow: TToolButton
Left = 456 Left = 479
Top = 0 Top = 0
Hint = 'Zoom to rectangle' Hint = 'Zoom to rectangle'
Caption = 'tbzoomwindow' Caption = 'tbzoomwindow'
@ -251,7 +260,7 @@ object MainForm: TMainForm
OnClick = tbzoomwindowClick OnClick = tbzoomwindowClick
end end
object tbzoomoutwindow: TToolButton object tbzoomoutwindow: TToolButton
Left = 479 Left = 502
Top = 0 Top = 0
Hint = 'Zoom out using rectangle' Hint = 'Zoom out using rectangle'
Caption = 'tbzoomoutwindow' Caption = 'tbzoomoutwindow'
@ -261,7 +270,7 @@ object MainForm: TMainForm
OnClick = tbzoomoutwindowClick OnClick = tbzoomoutwindowClick
end end
object tbDrag: TToolButton object tbDrag: TToolButton
Left = 502 Left = 525
Top = 0 Top = 0
Hint = 'Translate image' Hint = 'Translate image'
Caption = 'tbDrag' Caption = 'tbDrag'
@ -272,7 +281,7 @@ object MainForm: TMainForm
OnClick = tbDragClick OnClick = tbDragClick
end end
object tbRotate: TToolButton object tbRotate: TToolButton
Left = 525 Left = 548
Top = 0 Top = 0
Hint = 'Rotate' Hint = 'Rotate'
Caption = 'tbRotate' Caption = 'tbRotate'
@ -309,7 +318,7 @@ object MainForm: TMainForm
Align = alClient Align = alClient
BevelInner = bvLowered BevelInner = bvLowered
BevelOuter = bvNone BevelOuter = bvNone
Color = clBlack Color = clAppWorkSpace
TabOrder = 2 TabOrder = 2
OnResize = BackPanelResize OnResize = BackPanelResize
object Image: TImage object Image: TImage
@ -320,7 +329,6 @@ object MainForm: TMainForm
Align = alClient Align = alClient
AutoSize = True AutoSize = True
PopupMenu = DisplayPopup PopupMenu = DisplayPopup
Stretch = True
OnDblClick = ImageDblClick OnDblClick = ImageDblClick
OnMouseDown = ImageMouseDown OnMouseDown = ImageMouseDown
OnMouseMove = ImageMouseMove OnMouseMove = ImageMouseMove
@ -347,7 +355,7 @@ object MainForm: TMainForm
Left = 8 Left = 8
Top = 56 Top = 56
Bitmap = { Bitmap = {
494C010135003600040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600 494C010135003600040010001000FFFFFFFFFF00FFFFFFFFFFFFFFFF424D3600
000000000000360000002800000040000000E0000000010020000000000000E0 000000000000360000002800000040000000E0000000010020000000000000E0
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000292B2F00000000002F3236000000 000000000000000000000000000000000000292B2F00000000002F3236000000
@ -661,7 +669,7 @@ object MainForm: TMainForm
2400FFEBE000FFE4D20000000000FFE3D200FFD6BE00FFD4BB00FFD6BE00FFDA 2400FFEBE000FFE4D20000000000FFE3D200FFD6BE00FFD4BB00FFD6BE00FFDA
C400FFDECA00FFE1CF00000000000000000010408F000F1F60003F7FB0003F70 C400FFDECA00FFE1CF00000000000000000010408F000F1F60003F7FB0003F70
B0002060A0003070AF001F509F00205F9F0010408F004F8FBF001F509F002F60 B0002060A0003070AF001F509F00205F9F0010408F004F8FBF001F509F002F60
A0003F70AF000000000010206F0000000000000000000000000000000000FD9C A0003F70AF000F103F0010206F0000000000000000000000000000000000FD9C
6900F98D5300F7854600F1824500EA834600E7834800F0854900FF8B4A00FF94 6900F98D5300F7854600F1824500EA834600E7834800F0854900FF8B4A00FF94
5000FFB37D0000000000000000000000000014131200251926002A2B2B004B44 5000FFB37D0000000000000000000000000014131200251926002A2B2B004B44
440097899500B49CB500B7A0B5006E61680086748C00A8B6D9005A5F7D001008 440097899500B49CB500B7A0B5006E61680086748C00A8B6D9005A5F7D001008
@ -676,8 +684,8 @@ object MainForm: TMainForm
050000000000000000000000000014131200A8604200FFEBE000FFE4D200733C 050000000000000000000000000014131200A8604200FFEBE000FFE4D200733C
2400FFE3D200FFD6BE0000000000FFDAC500FFCAAB00FFC7A500FFC7A5000000 2400FFE3D200FFD6BE0000000000FFDAC500FFCAAB00FFC7A500FFC7A5000000
00000000000000000000000000000000000010408F0060A0CF004F8FBF003F70 00000000000000000000000000000000000010408F0060A0CF004F8FBF003F70
B00000000000103F800000000000000F20000F1F5F00104F900060A0CF008FBF B0003070AF00103F80000F1F5F00000F20000F1F5F00104F900060A0CF008FBF
DF00102F70000000000010206F0000000000000000000000000000000000EBA5 DF00102F70000F103F0010206F0000000000000000000000000000000000EBA5
7C00E8A07600E79F7300E69D7300DF834D00DD7D4300DD733300E8733200FF9C 7C00E8A07600E79F7300E69D7300DF834D00DD7D4300DD733300E8733200FF9C
680000000000000000000000000000000000141312001610120094818B00C7B2 680000000000000000000000000000000000141312001610120094818B00C7B2
C6009C89920084718200776F7F005B4D5E0043304100493B5200505169001216 C6009C89920084718200776F7F005B4D5E0043304100493B5200505169001216
@ -685,7 +693,7 @@ object MainForm: TMainForm
2400FFDECB00FFD0B50000000000FFDAC400FFCBAC00FFC6A500FFC6A5000000 2400FFDECB00FFD0B50000000000FFDAC400FFCBAC00FFC6A500FFC6A5000000
0000F5A7790000000000000000000000000010408F000F1F5F003F7FB0003F70 0000F5A7790000000000000000000000000010408F000F1F5F003F7FB0003F70
AF001F509F0010408F002F60A00010307F00609FCF003F70B0005F9FC0004F80 AF001F509F0010408F002F60A00010307F00609FCF003F70B0005F9FC0004F80
BF000F1050000F103F0010206F00000000000000000000000000000000000000 BF000F1050000F10500010206F00000000000000000000000000000000000000
000000000000000000000000000000000000DD7D4500E0713200F3915B000000 000000000000000000000000000000000000DD7D4500E0713200F3915B000000
00000000000000000000000000000000000014131200030804007B7E8100E9D9 00000000000000000000000000000000000014131200030804007B7E8100E9D9
E400BBA3B000AA95A70073616E0022252A000C0A0E0024161F002B303B001313 E400BBA3B000AA95A70073616E0022252A000C0A0E0024161F002B303B001313
@ -879,97 +887,97 @@ object MainForm: TMainForm
E000F9E9E000F9EBE200F9ECE600F9EDE900F5ECE70000000000000000000000 E000F9E9E000F9EBE200F9ECE600F9EDE900F5ECE70000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000F0CAB400F4D5 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF
C300C1AB9F00BEB2AB00FFFBF900FFFFFF00B5B5B500B5B5B500FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A000A0A0A000A0A0A000A0A0
FF00B5B5B500B5B5B50000000000000000000000000000000000000000000000 A000A0A0A000A0A0A00000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000FFF0E700FFEA 0000000000000000000000000000000000000000000000000000FFF0E700FFEA
DD00FFE9DC00FFEBDF00FFEDE300FFEFE500FDEFE70000000000000000000000 DD00FFE9DC00FFEBDF00FFEDE300FFEFE500FDEFE70000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000EAB69700EFC2 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF
A600C8A48F00C6AFA000FEF0E800FFF9F600B7B6B600B5B5B500FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A000A0A0A000A0A0A000A0A0
FF00B5B5B500B5B5B500000000000000000000000000000000007B7B7B00FFFF A000A0A0A000A0A0A000000000000000000000000000000000007B7B7B00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF0000000000000000000000000000000000FEEBE000FFE4 FF00FFFFFF00FFFFFF0000000000000000000000000000000000FEEBE000FFE4
D200FFE2D100FFE4D400FFE6D700FFE8DA00FCE6DA0000000000000000000000 D200FFE2D100FFE4D400FFE6D700FFE8DA00FCE6DA0000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000CE8D6600CE92 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF
6E00F1BFA200F8D4BF00CEB6A800C9BBB300FFFAF600FFFEFD00B5B5B500B5B5 FF00A0A0A000A0A0A000A0A0A000A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF
B500FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B000000 FF00A0A0A000A0A0A000000000000000000000000000000000007B7B7B000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
000000000000FFFFFF0000000000000000000000000000000000FEE7D900FFDD 000000000000FFFFFF0000000000000000000000000000000000FEE7D900FFDD
C800FFDBC600FFDDC900FFDFCC00FFE0D000FCDFD00000000000000000000000 C800FFDBC600FFDDC900FFDFCC00FFE0D000FCDFD00000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000D4855500D48A 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF
5D00EDAE8900F6C6AA00D9B7A200D3BFB300FFF5EF00FFFCFB00BCBEC000B4B7 FF00A0A0A000A0A0A000A0A0A000A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF
B900FFFFFF00FEFFFF00000000000000000000000000000000007B7B7B000000 FF00A0A0A000A0A0A000000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000FFE4D300FFD6 FF0000000000FFFFFF0000000000000000000000000000000000FFE4D300FFD6
BE00FFD4BB00FFD6BE00FFDEC700FFE3CE00FCE2D00000000000000000000000 BE00FFD4BB00FFD6BE00FFDEC700FFE3CE00FCE2D00000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000D97D4500E089 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF
5200DD906300E0A48100FED1B700FFE2D200D8CAC100D1CDCA00F6FBFE00EBF6 FF00A0A0A000A0A0A000A0A0A000A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF
FE00ABB5BC00B1B4B700000000000000000000000000000000007B7B7B000000 FF00A0A0A000A0A0A000000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FFFFFF00FFFF 0000FFFFFF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000FFDFCD00FFD0 FF0000000000FFFFFF0000000000000000000000000000000000FFDFCD00FFD0
B500FFCDAF00FFD0B400F2CCB400EFD3C200ECD5C70000000000000000000000 B500FFCDAF00FFD0B400F2CCB400EFD3C200ECD5C70000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000D97D4500DD7C 0000000000000000000000000000000000000000000000000000FFFFFF00FFFF
4200E4895400EAA17600FDC6A600FFDCC700E3D0C400DCD6D300F2F9FE00DDF0 FF00A0A0A000A0A0A000A0A0A000A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF
FD009EB5C6009EB1BF00000000000000000000000000000000007B7B7B000000 FF00A0A0A000A0A0A000000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF 0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000FFDBC700FFCA FF0000000000FFFFFF0000000000000000000000000000000000FFDBC700FFCA
AB00FFC7A500FFD4B20000000000000000000000000000000000000000000000 AB00FFC7A500FFD4B20000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000D97D4500DD7D 0000000000000000000000000000000000000000000000000000A0A0A000A0A0
4200E6885100F19F6E00F8B89100F4C9B000FFE7DA00FFF8F300CFD9DF00AAC4 A000FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A000A0A0A000A0A0A000A0A0
D600BCE1FA00BDE0FA00000000000000000000000000000000007B7B7B000000 A000FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF 0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000FFDAC500FFCB FF0000000000FFFFFF0000000000000000000000000000000000FFDAC500FFCB
AC00FFC6A500FFD3B20000000000F5A779000000000000000000000000000000 AC00FFC6A500FFD3B20000000000F5A779000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000D97D4500DD7D 0000000000000000000000000000000000000000000000000000A0A0A000A0A0
4200E5885000F19F6E00FDB78F00FFCDAF00FFE3D300FFF6F000D5E2EA00A7C9 A000FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A000A0A0A000A0A0A000A0A0
E000A5D6F8009FD2F700000000000000000000000000000000007B7B7B000000 A000FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF 0000FFFFFF00FFFFFF00FF000000FFFFFF00FFFFFF00FF000000FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000FDE2D300FEDC FF0000000000FFFFFF0000000000000000000000000000000000FDE2D300FEDC
C600FED9C300FEE3CD003D2F2800000000000000000000000000000000000000 C600FED9C300FEE3CD003D2F2800000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000DA7D4600DD7C 0000000000000000000000000000000000000000000000000000A0A0A000A0A0
4100E6895200F19E6E00FDB88F00FFCDAF00FFE0CE00FDF2EC00E5F4FD00B3DD A000FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A000A0A0A000A0A0A000A0A0
F90078B6E10064A7DA00000000000000000000000000000000007B7B7B000000 A000FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FFFFFF00FFFF 0000FFFFFF00FFFFFF00FFFFFF00FF000000FF000000FFFFFF00FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000000000000000 FF0000000000FFFFFF0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000DA7F4800DE7F 0000000000000000000000000000000000000000000000000000A0A0A000A0A0
4600E68C5600F0A17300FCBA9300FFCEB100FFE1D000FFF4ED00E2F2FD00A8D7 A000FFFFFF00FFFFFF00FFFFFF00FFFFFF00A0A0A000A0A0A000A0A0A000A0A0
F8006EB8EA0055A6E200000000000000000000000000000000007B7B7B000000 A000FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B000000
0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF 0000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF0000000000FFFFFF0000000000000000000000000000000000000000000000 FF0000000000FFFFFF0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000DB834E00E087 0000000000000000000000000000000000000000000000000000A0A0A000A0A0
5200E8956300F3A97E00FDC09C00FFD2B800FFE4D400FFF5EF00E4F3FD00AAD9 A000A0A0A000A0A0A000A0A0A000A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF
F9006FBEF40059B1F200000000000000000000000000000000007B7B7B000000 FF00FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
000000000000FFFFFF0000000000000000000000000000000000000000000000 000000000000FFFFFF0000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000707A81002D3134002D31 00000000000000000000000000000000000000000000707A81002D3134002D31
34000B0C0D002D3134002D3134004F565B000000000000000000000000000000 34000B0C0D002D3134002D3134004F565B000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000DD8A5800E395 0000000000000000000000000000000000000000000000000000A0A0A000A0A0
6500ECA57A00F5B69200FDCAAB00FFD9C300FFE8DB00FFF7F200E8F5FD00B7DF A000A0A0A000A0A0A000A0A0A000A0A0A000FFFFFF00FFFFFF00FFFFFF00FFFF
FA0085C8F70063B6F200000000000000000000000000000000007B7B7B007B7B FF00FFFFFF00FFFFFF00000000000000000000000000000000007B7B7B007B7B
7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B 7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B7B007B7B
7B007B7B7B007B7B7B0000000000000000000000000000000000000000000000 7B007B7B7B007B7B7B0000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000
@ -2153,7 +2161,7 @@ object MainForm: TMainForm
EDB6C00FC00F8000CDB2C00FC00F8000D9B5C00FC00F800FE5B7E01FE01F800F EDB6C00FC00F8000CDB2C00FC00F8000D9B5C00FC00F800FE5B7E01FE01F800F
FD8FF03FF03F800FFE7FFFFFFFFF800FFFFF0000FFFFFFFFFFFF0000FC010001 FD8FF03FF03F800FFE7FFFFFFFFF800FFFFF0000FFFFFFFFFFFF0000FC010001
FE7F0000FC010001FE3F0000E0010001FE1F0000E0010001C00F000000010001 FE7F0000FC010001FE3F0000E0010001FE1F0000E0010001C00F000000010001
C007000000010001C003000000010001C003000000010805C007000000030001 C007000000010001C003000000010001C003000000010001C007000000030001
C00F000000070001FE1F0000000F0001FE3F0000003F0001FE7F0000007F0001 C00F000000070001FE1F0000000F0001FE3F0000003F0001FE7F0000007F0001
FFFF000001FF0001FFFF000003FF0001FFE7FFFFFFFFFFFFFFE7FFFF803FFFFF FFFF000001FF0001FFFF000003FF0001FFE7FFFFFFFFFFFFFFE7FFFF803FFFFF
FFE7F81F803FE7FFE000F3CF803FE1FFE000EFEF803FE07FE3E7CFFF800FE01F FFE7F81F803FE7FFE000F3CF803FE1FFE000EFEF803FE07FE3E7CFFF800FE01F
@ -2199,8 +2207,7 @@ object MainForm: TMainForm
C003000F80018000C003000780018000C003000380018000C003000180018000 C003000F80018000C003000780018000C003000380018000C003000180018000
C003000180018000C003001F80018000C003001F80018001C003001F80018001 C003000180018000C003001F80018000C003001F80018001C003001F80018001
C0038FF180018001C007FFF980018001C00FFF7580018001C01FFF8F80018001 C0038FF180018001C007FFF980018001C00FFF7580018001C01FFF8F80018001
C03FFFFF80018001FFFFFFFFFFFFFFFF00000000000000000000000000000000 C03FFFFF80018001FFFFFFFFFFFFFFFF}
000000000000}
end end
object SmallImages: TImageList object SmallImages: TImageList
Left = 40 Left = 40

View File

@ -28,7 +28,7 @@ uses
ToolWin, StdCtrls, Classes, Messages, ExtCtrls, ImgList, controlpoint, ToolWin, StdCtrls, Classes, Messages, ExtCtrls, ImgList, controlpoint,
Jpeg, SyncObjs, SysUtils, ClipBrd, Graphics, Math, Global, Jpeg, SyncObjs, SysUtils, ClipBrd, Graphics, Math, Global,
Registry, RenderThread, Cmap, ExtDlgs, AppEvnts, ShellAPI, Registry, RenderThread, Cmap, ExtDlgs, AppEvnts, ShellAPI,
LibXmlParser, LibXmlComps, Xform, XFormMan; LibXmlParser, LibXmlComps, Xform, XFormMan, PngImage;
const const
PixelCountMax = 32768; PixelCountMax = 32768;
@ -37,7 +37,7 @@ const
RS_XO = 2; RS_XO = 2;
RS_VO = 3; RS_VO = 3;
AppVersionString = 'Apophysis 2.05 pre-release 11'; AppVersionString = 'Apophysis 2.05 pre-release 12';
type type
TMouseMoveState = (msUsual, msZoomWindow, msZoomOutWindow, msZoomWindowMove, msZoomOutWindowMove, msDrag, msDragMove, msRotate, msRotateMove); TMouseMoveState = (msUsual, msZoomWindow, msZoomOutWindow, msZoomWindowMove, msZoomOutWindowMove, msDrag, msDragMove, msRotate, msRotateMove);
@ -174,6 +174,7 @@ type
ToolButton6: TToolButton; ToolButton6: TToolButton;
tbQualityBox: TComboBox; tbQualityBox: TComboBox;
View1: TMenuItem; View1: TMenuItem;
tbShowAlpha: TToolButton;
procedure tbzoomoutwindowClick(Sender: TObject); procedure tbzoomoutwindowClick(Sender: TObject);
procedure mnuimageClick(Sender: TObject); procedure mnuimageClick(Sender: TObject);
procedure mnuExitClick(Sender: TObject); procedure mnuExitClick(Sender: TObject);
@ -268,15 +269,20 @@ type
procedure tbQualityBoxKeyPress(Sender: TObject; var Key: Char); procedure tbQualityBoxKeyPress(Sender: TObject; var Key: Char);
procedure tbQualityBoxSet(Sender: TObject); procedure tbQualityBoxSet(Sender: TObject);
procedure ImageDblClick(Sender: TObject); procedure ImageDblClick(Sender: TObject);
procedure tbShowAlphaClick(Sender: TObject);
private private
Renderer: TRenderThread; Renderer: TRenderThread;
FMouseMoveState: TMouseMoveState; FMouseMoveState: TMouseMoveState;
FSelectRect: TRect; FSelectRect: TRect;
FRotateAngle: double; FRotateAngle: double;
FClickAngle: double; // --Z-- FClickAngle: double;
FViewBMP: Graphics.TBitmap; FViewImage: TPngObject;
FViewPos: TPoint;
FViewScale: double;
procedure DrawImageView;
procedure DrawZoomWindow(ARect: TRect); procedure DrawZoomWindow(ARect: TRect);
procedure DrawRotatelines(Angle: double); procedure DrawRotatelines(Angle: double);
@ -1679,17 +1685,18 @@ end;
{ ****************************** Display ************************************ } { ****************************** Display ************************************ }
procedure TMainForm.HandleThreadCompletion(var Message: TMessage); procedure TMainForm.HandleThreadCompletion(var Message: TMessage);
var
bm: TBitmap;
begin begin
if Assigned(Renderer) then begin if not Assigned(Renderer) then exit;
bm := TBitmap.Create;
bm.assign(Renderer.GetImage); if assigned(FViewImage) then FViewImage.Free;
Image.Picture.Graphic := bm; FViewPos.X := 0;
Renderer.Free; FViewPos.Y := 0;
Renderer := nil; FViewScale := 1;
bm.Free; FViewImage := Renderer.GetTransparentImage;
end; DrawImageView;
Renderer.Free;
Renderer := nil;
end; end;
procedure TMainForm.HandleThreadTermination(var Message: TMessage); procedure TMainForm.HandleThreadTermination(var Message: TMessage);
@ -1729,9 +1736,7 @@ begin
MainCp.sample_density := defSampleDensity; MainCp.sample_density := defSampleDensity;
Maincp.spatial_oversample := defOversample; Maincp.spatial_oversample := defOversample;
Maincp.spatial_filter_radius := defFilterRadius; Maincp.spatial_filter_radius := defFilterRadius;
MainCP.Transparency := true; // always generate transparency data
MainCP.Transparency := (PNGTransparency <> 0) and ShowTransparency;
StartTime := Now; StartTime := Now;
Remainder := 1; Remainder := 1;
try try
@ -1964,6 +1969,7 @@ begin
StopThread; StopThread;
RedrawTimer.Enabled := True; RedrawTimer.Enabled := True;
tbQualityBox.Text := FloatToStr(defSampleDensity); tbQualityBox.Text := FloatToStr(defSampleDensity);
tbShowAlpha.Down := ShowTransparency;
UpdateWindows; UpdateWindows;
end; end;
@ -2369,6 +2375,7 @@ begin
FillVariantMenu; FillVariantMenu;
tbQualityBox.Text := FloatToStr(defSampleDensity); tbQualityBox.Text := FloatToStr(defSampleDensity);
tbShowAlpha.Down := ShowTransparency;
end; end;
procedure TMainForm.FormShow(Sender: TObject); procedure TMainForm.FormShow(Sender: TObject);
@ -2514,7 +2521,8 @@ begin
if assigned(Renderer) then Renderer.Terminate; if assigned(Renderer) then Renderer.Terminate;
if assigned(Renderer) then Renderer.WaitFor; if assigned(Renderer) then Renderer.WaitFor;
if assigned(Renderer) then Renderer.Free; if assigned(Renderer) then Renderer.Free;
maincp.free; if assigned(FViewImage) then FViewImage.Free;
MainCP.free;
ParseCp.free; ParseCp.free;
Favorites.Free; Favorites.Free;
end; end;
@ -2531,6 +2539,7 @@ begin
StopThread; StopThread;
if CanDrawOnResize then if CanDrawOnResize then
reDrawTimer.Enabled := True; reDrawTimer.Enabled := True;
DrawImageView;
end; end;
procedure TMainForm.LoadXMLFlame(filename, name: string); procedure TMainForm.LoadXMLFlame(filename, name: string);
@ -4017,6 +4026,8 @@ begin
end; end;
msDrag: msDrag:
begin begin
if not assigned(FViewImage) then exit;
{
if not assigned(FViewBMP) then if not assigned(FViewBMP) then
FViewBMP := TBitmap.Create; FViewBMP := TBitmap.Create;
FViewBMP.Width := ClientWidth + 100; FViewBMP.Width := ClientWidth + 100;
@ -4040,7 +4051,7 @@ begin
DestRect.BottomRight.Y := DestRect.BottomRight.Y + 50; DestRect.BottomRight.Y := DestRect.BottomRight.Y + 50;
FViewBMP.Canvas.CopyRect(DestRect, Image.Canvas, SourceRect); FViewBMP.Canvas.CopyRect(DestRect, Image.Canvas, SourceRect);
}
FSelectRect.TopLeft := Point(x, y); FSelectRect.TopLeft := Point(x, y);
FSelectRect.BottomRight := Point(x, y); FSelectRect.BottomRight := Point(x, y);
FMouseMoveState := msDragMove; FMouseMoveState := msDragMove;
@ -4058,11 +4069,10 @@ begin
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Y: Integer);
var var
DestRect, SrcRect: TRect; DestRect: TRect;
FOffs : TPoint; dx, dy: integer;
begin begin
case FMouseMoveState of case FMouseMoveState of
msZoomWindowMove, msZoomWindowMove,
@ -4074,18 +4084,14 @@ begin
end; end;
msDragMove: msDragMove:
begin begin
FOffs.X := x - FSelectRect.TopLeft.x; assert(assigned(FviewImage));
FOffs.Y := y - FSelectRect.TopLeft.Y;
assert(FViewScale <> 0);
FViewPos.X := FViewPos.X + round( (x - FSelectRect.Right) / FViewScale);
FViewPos.Y := FViewPos.Y + round( (y - FSelectRect.Bottom) / FViewScale);
FSelectRect.BottomRight := Point(x, y); FSelectRect.BottomRight := Point(x, y);
DestRect := ClientRect; DrawImageView;
SrcRect.Left := -FOffs.X + 50;
SrcRect.Right := ClientRect.Right - FOffs.X + 50;;
SrcRect.Top := - FOffs.Y + 50;
SrcRect.Bottom := ClientRect.Bottom - FOffs.Y + 50;
Image.Canvas.CopyRect(DestRect, FViewBMP.Canvas, SrcRect);
end; end;
msRotateMove: msRotateMove:
begin begin
@ -4149,9 +4155,6 @@ begin
end; end;
msDragMove: msDragMove:
begin begin
FViewBMP.Free;
FViewBMP := nil;
FSelectRect.BottomRight := Point(x, y); FSelectRect.BottomRight := Point(x, y);
FMouseMoveState := msDrag; FMouseMoveState := msDrag;
@ -4185,6 +4188,48 @@ begin
end; end;
end; end;
///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.DrawImageView;
var
i, j: integer;
bm: TBitmap;
r: TRect;
begin
bm := TBitmap.Create;
bm.Width := Image.Width;
bm.Height := Image.Height;
with bm.Canvas do begin
if ShowTransparency then begin
Brush.Color := $F0F0F0;
FillRect(Rect(0, 0, bm.Width, bm.Height));
Brush.Color := $C0C0C0;
for i := 0 to ((bm.Width - 1) shr 3) do begin
for j := 0 to ((bm.Height - 1) shr 3) do begin
if odd(i + j) then
FillRect(Rect(i shl 3, j shl 3, (i+1) shl 3, (j+1) shl 3));
end;
end;
end
else begin
Brush.Color := MainCP.background[0] or (MainCP.background[1] shl 8) or (MainCP.background[2] shl 16);
FillRect(Rect(0, 0, bm.Width, bm.Height));
end;
end;
if assigned(FViewImage) then begin
FViewScale := Image.Width / FViewImage.Width;
r.Left := round(FViewScale * FViewPos.X);
r.Right := round(FViewScale * (FViewPos.X + FViewImage.Width));
r.Top := Image.Height div 2 + round(FViewScale * (FViewPos.Y - FViewImage.Height/2));
r.Bottom := Image.Height div 2 + round(FViewScale * (FViewPos.Y + FViewImage.Height/2));
FViewImage.Draw(bm.Canvas, r);
end;
Image.Picture.Graphic := bm;
Image.Refresh;
bm.Free;
end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.DrawRotateLines(Angle: double); procedure TMainForm.DrawRotateLines(Angle: double);
var var
@ -4364,5 +4409,14 @@ end;
{$ENDIF} {$ENDIF}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TMainForm.tbShowAlphaClick(Sender: TObject);
var
DestRect: TRect;
bm: TBitmap;
begin
ShowTransparency := tbShowAlpha.Down;
DrawImageView;
end;
end. end.

View File

@ -23,7 +23,7 @@ interface
uses uses
Windows, Graphics, Classes, Windows, Graphics, Classes,
Controlpoint, RenderTypes, ImageMaker; Controlpoint, RenderTypes, ImageMaker, PngImage;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// //
@ -102,6 +102,7 @@ type
procedure Render; virtual; procedure Render; virtual;
function GetImage: TBitmap; virtual; function GetImage: TBitmap; virtual;
function GetTransparentImage: TPngObject;
procedure UpdateImage(CP: TControlPoint); procedure UpdateImage(CP: TControlPoint);
procedure SaveImage(const FileName: String); procedure SaveImage(const FileName: String);
@ -251,13 +252,25 @@ end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
function TBaseRenderer.GetImage: TBitmap; function TBaseRenderer.GetImage: TBitmap;
begin begin
if FStop <> 0 then begin if FStop > 0 then begin
assert(false);
FImageMaker.OnProgress := OnProgress; FImageMaker.OnProgress := OnProgress;
FImageMaker.CreateImage; FImageMaker.CreateImage;
end; end;
Result := FImageMaker.GetImage; Result := FImageMaker.GetImage;
end; end;
///////////////////////////////////////////////////////////////////////////////
function TBaseRenderer.GetTransparentImage: TPngObject;
begin
if FStop > 0 then begin
assert(false);
FImageMaker.OnProgress := OnProgress;
FImageMaker.CreateImage;
end;
Result := FImageMaker.GetTransparentImage;
end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TBaseRenderer.UpdateImage(CP: TControlPoint); procedure TBaseRenderer.UpdateImage(CP: TControlPoint);
begin begin
@ -278,7 +291,7 @@ end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TBaseRenderer.SaveImage(const FileName: String); procedure TBaseRenderer.SaveImage(const FileName: String);
begin begin
if FStop <> 0 then begin if FStop > 0 then begin
if Assigned(strOutput) then if Assigned(strOutput) then
strOutput.Add(TimeToStr(Now) + Format(' : Creating image with quality = %f', [fcp.actual_density])); strOutput.Add(TimeToStr(Now) + Format(' : Creating image with quality = %f', [fcp.actual_density]));
FImageMaker.OnProgress := OnProgress; FImageMaker.OnProgress := OnProgress;
@ -476,7 +489,7 @@ begin
SetPixels; SetPixels;
RenderTime := Now - RenderTime; RenderTime := Now - RenderTime;
if FStop >= 0 then begin if FStop <= 0 then begin
if Assigned(strOutput) then begin if Assigned(strOutput) then begin
if fcp.sample_density = fcp.actual_density then if fcp.sample_density = fcp.actual_density then
strOutput.Add(TimeToStr(Now) + ' : Creating image') strOutput.Add(TimeToStr(Now) + ' : Creating image')

View File

@ -30,7 +30,6 @@ type
protected protected
Buckets: TBucket32Array; Buckets: TBucket32Array;
// ColorMap: TColorMapArray;
function GetBits: integer; override; function GetBits: integer; override;
function GetBucketsPtr: pointer; override; function GetBucketsPtr: pointer; override;
@ -100,8 +99,6 @@ procedure TRenderer32MT.AddPointsToBuckets(const points: TPointsArray);
var var
i: integer; i: integer;
px, py: double; px, py: double;
// R: double;
// V1, v2, v3: integer;
Bucket: PBucket32; Bucket: PBucket32;
MapColor: PColorMapColor; MapColor: PColorMapColor;
begin begin

View File

@ -24,7 +24,7 @@ interface
uses uses
Classes, Windows, Messages, Graphics, Classes, Windows, Messages, Graphics,
ControlPoint, Render, ControlPoint, Render,
Global, RenderTypes, Global, RenderTypes, PngImage,
Render64, Render64MT, Render64, Render64MT,
Render48, Render48MT, Render48, Render48MT,
Render32, Render32MT, Render32, Render32MT,
@ -65,6 +65,7 @@ type
procedure SetCP(CP: TControlPoint); procedure SetCP(CP: TControlPoint);
function GetImage: TBitmap; function GetImage: TBitmap;
function GetTransparentImage: TPngObject;
procedure SaveImage(const FileName: String); procedure SaveImage(const FileName: String);
procedure Execute; override; procedure Execute; override;
@ -126,6 +127,14 @@ begin
Result := FRenderer.GetImage; Result := FRenderer.GetImage;
end; end;
///////////////////////////////////////////////////////////////////////////////
function TRenderThread.GetTransparentImage: TPngObject;
begin
Result := nil;
if assigned(FRenderer) then
Result := FRenderer.GetTransparentImage;
end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure TRenderThread.SetCP(CP: TControlPoint); procedure TRenderThread.SetCP(CP: TControlPoint);
begin begin

View File

@ -307,7 +307,8 @@ function TVariationRadialBlur.ResetVariable(const Name: string): boolean;
begin begin
Result := False; Result := False;
if Name = var_a_name then begin if Name = var_a_name then begin
angle := 0; if angle <> 0 then angle := 0
else if angle = 0 then angle := 1;
Result := True; Result := True;
end; end;
end; end;