unit umain; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ieview, imageenview, ExtCtrls, StdCtrls, Buttons, hyieutils, imageenproc, hyiedefs, ComCtrls, iexBitmaps, iesettings, iexLayers, iexRulers; type TMainForm = class(TForm) Panel: TPanel; ImageEnView1: TImageEnView; Label1: TLabel; ScrollBar1: TScrollBar; ColorDialog1: TColorDialog; CheckBox1: TCheckBox; PageControl1: TPageControl; BrushTab: TTabSheet; RectangleButton: TSpeedButton; CircleButton: TSpeedButton; PointsButton: TSpeedButton; Label2: TLabel; Label3: TLabel; lblBrushTrans: TLabel; BrushSize: TEdit; BrushColor: TShape; edtBrushTrans: TEdit; chkAntialias: TCheckBox; Label5: TLabel; Operation: TComboBox; PaintTab: TTabSheet; PaintPoint: TSpeedButton; PaintLine: TSpeedButton; PaintColor: TShape; Label6: TLabel; PaintEllipse: TSpeedButton; Button1: TButton; UpDown1: TUpDown; updBrushTrans: TUpDown; lbllblPaintTrans: TLabel; edtPaintTrans: TEdit; updPaintTrans: TUpDown; procedure ScrollBar1Change(Sender: TObject); procedure FormCreate(Sender: TObject); procedure ImageEnView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure CreateBrush(Sender: TObject); procedure ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure CheckBox1Click(Sender: TObject); procedure PageControl1Change(Sender: TObject); procedure Button1Click(Sender: TObject); procedure PaintColorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure BrushColorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormShow(Sender: TObject); private { Private declarations } fStartX, fStartY:integer; fLastX, fLastY:integer; public { Public declarations } end; var MainForm: TMainForm; implementation {$R *.DFM} {$R WindowsTheme.res} procedure TMainForm.FormCreate(Sender: TObject); begin ImageEnView1.MinBitmapSize := 1; ImageEnView1.DisplayGrid := true; ImageEnView1.Proc.Fill( CreateRGB(255, 255, 255) ); ImageEnView1.Proc.AutoUndo := False; Operation.ItemIndex := 0; end; // Zoom procedure TMainForm.ScrollBar1Change(Sender: TObject); begin ImageEnView1.Zoom := ScrollBar1.Position; end; procedure TMainForm.ImageEnView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin fStartX := X; fStartY := Y; if (PageControl1.ActivePage = PaintTab) and PaintPoint.Down then begin // Paint Point X := ImageEnView1.XScr2Bmp(X); Y := ImageEnView1.YScr2Bmp(Y); ImageEnView1.IEBitmap.Canvas.Pixels[X, Y] := PaintColor.Brush.Color; ImageEnView1.Update; end else if (PageControl1.ActivePage = PaintTab) and PaintLine.Down then begin // Begin paint line ImageEnView1.Proc.SaveUndo(ieuImage); end else if (PageControl1.ActivePage = PaintTab) and PaintEllipse.Down then begin // Begin paint ellipse ImageEnView1.Proc.SaveUndo(ieuImage); end else if (PageControl1.ActivePage = BrushTab) then ImageEnView1MouseMove(self, Shift, X, Y); end; // moving mouse (move the brush layer) procedure TMainForm.ImageEnView1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var px, py:integer; bx, by:integer; op:TIERenderOperation; begin if (PageControl1.ActivePage = PaintTab) and PaintPoint.Down and ImageEnView1.MouseCapture then begin // Paint Point ImageEnView1.IEBitmap.Canvas.Pixels[ ImageEnView1.XScr2Bmp(X), ImageEnView1.YScr2Bmp(Y) ] := PaintColor.Brush.Color; // Paint point on alpha canvas if ImageEnView1.IEBitmap.HasAlphaChannel then ImageEnView1.IEBitmap.AlphaChannel.Pixels_ie8[ ImageEnView1.XScr2Bmp(X) , ImageEnView1.YScr2Bmp(Y) ] := StrToIntDef(edtPaintTrans.Text, 255); ImageEnView1.Update; end else if (PageControl1.ActivePage = PaintTab) and PaintLine.Down and ImageEnView1.MouseCapture then begin // Paint Line with ImageEnView1 do begin Proc.UndoRect(XScr2Bmp(fStartX), YScr2Bmp(fStartY), XScr2Bmp(fLastX), YScr2Bmp(fLastY)); IEBitmap.Canvas.Pen.Color := PaintColor.Brush.Color; IEBitmap.Canvas.MoveTo( XScr2Bmp(fStartX), YScr2Bmp(fStartY) ); IEBitmap.Canvas.LineTo( XScr2Bmp(X), YScr2Bmp(Y) ); // Draw line on alpha canvas if IEBitmap.HasAlphaChannel then begin IEBitmap.AlphaChannel.CanvasCurrentAlpha := StrToIntDef(edtPaintTrans.Text, 255); IEBitmap.AlphaChannel.Canvas.MoveTo( XScr2Bmp(fStartX), YScr2Bmp(fStartY) ); IEBitmap.AlphaChannel.Canvas.LineTo( XScr2Bmp(X), YScr2Bmp(Y) ); end; Update; end; end else if (PageControl1.ActivePage = PaintTab) and PaintEllipse.Down and ImageEnView1.MouseCapture then begin // Paint Ellipse with ImageEnView1 do begin Proc.UndoRect(XScr2Bmp(fStartX), YScr2Bmp(fStartY), XScr2Bmp(fLastX), YScr2Bmp(fLastY)); IEBitmap.Canvas.Pen.Color := PaintColor.Brush.Color; IEBitmap.Canvas.Ellipse(XScr2Bmp(fStartX), YScr2Bmp(fStartY), XScr2Bmp(X), YScr2Bmp(Y) ); // Draw ellipse on alpha canvas if IEBitmap.HasAlphaChannel then begin IEBitmap.AlphaChannel.CanvasCurrentAlpha := StrToIntDef(edtPaintTrans.Text, 255); IEBitmap.AlphaChannel.Canvas.Ellipse(XScr2Bmp(fStartX), YScr2Bmp(fStartY), XScr2Bmp(X), YScr2Bmp(Y) ); end; Update; end; end else if (PageControl1.ActivePage = BrushTab) then begin op := TIERenderOperation( self.Operation.ItemIndex ); with ImageEnView1 do if LayersCount=2 then begin if PointsButton.Down then CreateBrush(nil); // re-randomize points with Layers[1] do begin bx := Bitmap.Width; by := Bitmap.Height; if chkAntialias.Checked then begin Width := bx div 2; Height := by div 2; end; px := XScr2Bmp( X, False ) - Width div 2; py := YScr2Bmp( Y, False ) - Height div 2; PosX := px; PosY := py; Operation := op; end; if MouseCapture then // paint the layer (the brush...) begin if chkAntialias.Checked then Layers[1].Bitmap.RenderToTIEBitmapEx( Layers[0].Bitmap, px, py, bx div 2, by div 2, 0, 0, bx, by, True, 255, rfFastLinear, op ) else Layers[1].Bitmap.RenderToTIEBitmapEx( Layers[0].Bitmap, px, py, bx, by, 0, 0, bx, by, True, 255, rfNone, op ); Layers[1].Bitmap.MergeAlphaRectTo( Layers[0].Bitmap, 0, 0, px, py, bx, by); end; Update; end; end; fLastX := X; fLastY := Y; end; procedure TMainForm.CreateBrush(Sender: TObject); var brushsiz:integer; c:TColor; transpvalue:integer; i:integer; x, y:integer; begin if ImageEnView1.LayersCount=1 then ImageEnView1.LayersAdd; ImageEnView1.LayersCurrent := 1; brushsiz := StrToIntDef(BrushSize.Text, 1); if brushsiz=1 then chkAntialias.Checked := false; if chkAntialias.Checked then brushsiz := brushsiz*2; ImageEnView1.Proc.ImageResize(brushsiz, brushsiz, iehLeft, ievTop); // prepare main color ImageEnView1.IEBitmap.Canvas.Brush.Color := BrushColor.Brush.Color; ImageEnView1.IEBitmap.Canvas.Pen.Color := BrushColor.Brush.Color; // prepare alpha channel ImageEnView1.AlphaChannel.Fill(0); with ImageEnView1.AlphaChannel.Canvas do begin transpvalue := StrToIntDef(edtBrushTrans.Text, 255); c := $02000000 or (transpvalue) or (transpvalue shl 8) or (transpvalue shl 16); Brush.Color := c; Pen.Color := c; end; // draws a rectangle brush if RectangleButton.Down then begin // draw the shape ImageEnView1.IEBitmap.Canvas.Rectangle(0, 0, brushsiz+1, brushsiz+1); // draw the shape alpha channel ImageEnView1.AlphaChannel.Canvas.Rectangle(0, 0, brushsiz+1, brushsiz+1); end // draws a circle brush else if CircleButton.Down then begin // draw the shape ImageEnView1.IEBitmap.Canvas.Ellipse(0, 0, brushsiz+1, brushsiz+1); // draw the shape alpha channel ImageEnView1.AlphaChannel.Canvas.Ellipse(0, 0, brushsiz+1, brushsiz+1); end // draws random points brush (should be a "spray"...) else if PointsButton.Down and (brushsiz > 1) then begin for i := 0 to brushsiz * 2 do // change "2" to adjust the point sparcity begin repeat x := random(brushsiz); y := random(brushsiz); until sqr(x-brushsiz div 2)+sqr(y-brushsiz div 2) < sqr(brushsiz div 2); // repeat until (x, y) is inside a circle! ImageEnView1.IEBitmap.Canvas.Pixels[x, y] := BrushColor.Brush.Color; ImageEnView1.AlphaChannel.Canvas.Pixels[x, y] := c; end; end; if Sender <> nil then ImageEnView1MouseMove(self, [], 0, 0); // refresh current brush end; procedure TMainForm.CheckBox1Click(Sender: TObject); begin ImageEnView1.DisplayGrid := CheckBox1.Checked; end; procedure TMainForm.PageControl1Change(Sender: TObject); begin if PageControl1.ActivePage = PaintTab then ImageEnView1.LayersRemove(1) else if PageControl1.ActivePage = BrushTab then CreateBrush(self); end; // Open Image procedure TMainForm.Button1Click(Sender: TObject); begin ImageEnView1.LayersCurrent := 0; with ImageEnView1.IO do LoadFromFile( ExecuteOpenDialog('', '', false, 1, '') ); end; // select paint color procedure TMainForm.PaintColorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ColorDialog1.Color := PaintColor.Brush.Color; if ColorDialog1.Execute then PaintColor.Brush.Color := ColorDialog1.Color; end; // Select brush color procedure TMainForm.BrushColorMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin ColorDialog1.Color := BrushColor.Brush.Color; if ColorDialog1.Execute then BrushColor.Brush.Color := ColorDialog1.Color; CreateBrush(self); end; procedure TMainForm.FormShow(Sender: TObject); begin PageControl1Change(nil); end; end.