GitHub
Tests: 12 • Commercial: 2 • Pet projects: 4 • Legacy: 4
Total: 22

.NET Framework

Test
2021

Project Request

ASP.NET MVC • C# • SQL Server
Idea of the project: if someone wants to order a project development, here you can send an application.
Test
2020

ProjectC

ASP.NET MVC • C# • JSON • jQuery
JSON data processing.
Test
2020

Vehicle Maintenance

ASP.NET MVC • VB.NET • JSON
Idea of the project: if someone wants to order a project development, here you can send an application.
Test
2019

Movie Navigator

ASP.NET MVC • VB.NET
Request information about movie from IMDB.
Test
2018

Customers Exchange

ASP.NET MVC • C# • SQL Server
Automated teller machine emulation.
Test
2016

ATM

ASP.NET MVC • C#
Automated teller machine emulation.

.NET Core

Pet project
2022

Mail Daemon

.NET 9 • Console • JSON
Utility to send mails with customizable settings.

Custom

Code
2024

Buns of code

.NET Framework • C# • JavaScript
Code snippets from my projects, ready to use; tiny tests; code examples.

PHP

Test
2024

Mediabox

PHP 8 • Laravel 11 • Vue.js • Composer • SQLite
Test project for media files management.
Test
2020

Loan Castle

PHP • MariaDB
Jums jāizstrādā kāda lielāk projekta prototips. Izstrādājot prototipu, paturiet prātā, ka projektam attīstoties, šo prototipu varētu vajadzēt pilnveidot.
Test
2020

Content Management

PHP • MySQL • AJAX
Создать простой сайт, где будет страница с формой для авторизации и страница для авторизованного пользователя.
Test
2019

Laravel

PHP • Laravel • Vue.js • Composer • SQLite
Izveidot aplikāciju, kura ik pēc noteikta intervāla (60 sekundes) veic ierakstu datubāzē izmantojot Laravel freimworka iebūvēto funkcionalitāti.
Test
2019

Phone Check

PHP • JavaScript • JSON • Docker
Implement application to detect country by phone number.

Frontend

Test
2021

Forex Wall

npm • React
For this exercise, what we need is a simple live wall for tracking currencies.

Business projects

Commercial
2008

Certification Center

.NET Framework 4.8 • ASP.NET Web Forms • C# • LINQ • SQL Server • ADO.NET • Dapper • JavaScript • jQuery • Git
Transport registration and certification services in Latvia, Customer Relationship Management.
Commercial
2000

Amerikas Auto

.NET Framework 4.8 • ASP.NET Web Forms • C# • LINQ • SQL Server • ADO.NET • Entity Framework • JavaScript • jQuery • Git
Car service and spare parts for all USA and European car models, Customer Relationship Management.

Pet projects

Pet project
2023

Geolocation Assistant

.NET 8 • ASP.NET Core • C# • Web API • JSON • Git
Website for determining geolocation by IP or geotagged photo.
Pet project
2008

Web Dynamics

.NET Framework 4.8 • ASP.NET Web Forms • C# • LINQ • Web API • JSON • SQL Server • Dapper • JavaScript • jQuery • SVG • Git
Software development blog. Articles, books, videos, content management.
Pet project
2000

Blackball

.NET Framework 4.8 • ASP.NET Web Forms • C# • LINQ • Web API • JSON • XML • SQL Server • Dapper • JavaScript • jQuery • SVG • Git
My entertainment portal created from scratch.

Good old times

Legacy
2000

DOS Clock

Turbo Pascal • Assembler
Digital clock.
Legacy
2000

BrainOut

Turbo Pascal • Assembler
Tank battle game.
Legacy
1999

Airport Administrator

Turbo Pascal
Курсовая работа в институте.
Legacy
1998

Atomizer

Turbo Pascal • Assembler
Atomizer, aka «Studio2D». Graphic raster editor. AGI is my own «Atomizer Generated Image» file format.

BrainOut

2000 Legacy

Tank battle game.

Turbo Pascal Assembler
Information
Source code
Root / SERVICE.PAS
{$A+,B+,D+,E-,F-,G+,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+,Y+} {$M 16000,0,400000} Unit Service; Interface Uses crt, graph, dos, globals, mouse, buttons, menus, general; Const MENU_ITEM_LIST_MainMenu : array [ 0..2 ] of String = ( 'File', 'Edit', 'Help' ); MENU_ITEM_LIST_ClosedImage : array [ 0..4 ] of String = ( 'New', 'Open', 'Paste', 'Put', 'Move' ); MENU_ITEM_LIST_OpenedImage : array [ 0..8 ] of String = ( 'New', 'Open', 'Save', 'Close', 'Smart edit', 'Copy', 'Paste', 'Put', 'Move' ); MENU_MAXITEMS_MainMenu = 3; MENU_MAXITEMS_ClosedImage = 5; MENU_MAXITEMS_OpenedImage = 9; { MENU_ITEM_MAP_NewProject : array[0..MENU_MAXITEMS_ClosedImage-1] of Byte=( 1, 1, 1, 0, 0, 1); } PhantomColor = 14; PhantomColorNum = 255; PhantomColorStyle = 9; PATH_TO_SHELL = 'SHELL\'; PATH_TO_POINTERS = 'POINTERS\'; Type ImageBitType = record BitX : Byte; BitY : Byte; BitSize : Byte; BitColor : Byte; BitStyle : Byte; end; TriggerType = record Palette : Boolean; Grid : Boolean; FillMode : Boolean; BorrowColor : Boolean; end; ColorType = record Foreground : Byte; Background : Byte; CustomForeground : Byte; CustomBackground : Byte; BorrowLEFT : Byte; BorrowRIGHT : Byte; end; GridType = record GridClip : Byte; GridColor : Byte; PutGrid : procedure; end; MainPaletteType = array[ 0..15, 0..15 ] of Byte; CustomPaletteType = array[ 0..29, 0..5 ] of Byte; OpNameType = ( Copy, Paste, Put, Move ); ClipboardType = array [ 0..50, 0..50 ] of Byte; ResizableImage = array [ 0..0 ] of Byte; ResImageP = ^ResizableImage; ImageBox = record Flag : Boolean; Data : ResImageP; end; Var VERSION_NUMBER : Byte; ImagesByX : Word; ImagesByY : Word; ImageCageX : Byte; ImageCageY : Byte; OldImageCageX : Byte; OldImageCageY : Byte; PutCustCol : Boolean; CustColManager : Integer; Color : ColorType; Trigger : TriggerType; Button : ButtonType; MainPalette : ^MainPaletteType; CustPal : ^CustomPaletteType; Grid : GridType; iSizeX : Byte; iSizeY : Byte; iBit : ImageBitType; AxisX : Byte; AxisY : Byte; OldAxisX : Byte; OldAxisY : Byte; OldManager : Byte; Manager : Byte; FrInMan : LongInt; ManagerA : Byte; NewProjectFlag : Boolean; SelectImX : Byte; SelectImY : Byte; OldSelectImX : Byte; OldSelectImY : Byte; SelectedImage : Word; Image : array[ 0..69, 0..69 ] of ImageBox; Clipboard : ^ClipboardType; { C } Procedure ClosedMainImage; Procedure CloseImage; Procedure CopyImage; { D } Procedure DrawDesktop; { E } Procedure EditImage(Color:Byte); { F } Procedure FillCustomPalette; { G } Procedure GetCustomColor; Procedure GetInfo(MsgNum:Byte); Function GetMainColor : Word; Procedure GridColorManager(GridColManX,GridColManY:Integer); { I } Procedure ImageCage( ImCageXstart, ImCageYstart : Integer ); Procedure ImageSizeManager(PosX,PosY:Integer); { L } Procedure LoadCustomPalette; Procedure LoadImage; Procedure LMBOpsWithImages; { M } Procedure MoveImage; { O } Procedure OpenNewImage; pROCEDURE Operation( OpName : OpNameType ); { P } Procedure PasteImage; Procedure PutIcon(PosX,PosY:Word;IconName:String); Procedure PutSpinner(SpinX,SpinY:Integer); { R } Procedure RefreshCustomPalette; Procedure RefreshCurrentImage; Procedure RMBOpsWithImages; { S } Procedure SaveCustomPalette; Procedure SaveImage; Procedure ShowCurrentImageBit; Procedure ShowCurrentImageSize; Procedure SetNewProject(WinCoordX,WinCoordY:Integer); Implementation {----------------------------------------------------------------------------} Procedure CloseImage; begin Image[ SelectImX, SelectImY ].Flag := False; FreeMem( Image[ SelectImX, SelectImY ].Data, iSizeX * iSizeY ); ImageCage( 276 + SelectImX * iSizeX, 58 + SelectImY * iSizeY); ClosedMainImage; end;{of 'CloseImage'} {----------------------------------------------------------------------------} Procedure ClosedMainImage; begin BarDeluxe( 11, 59, iSizeX * iBit.BitSize - 2, iSizeY * iBit.BitSize - 2, 1, 0 ); SetColor( 31 ); Line( 11, 59, 11 + iSizeX * iBit.BitSize - 2, 59 + iSizeY * iBit.BitSize - 2 ); Line( 11 + iSizeX * iBit.BitSize - 2, 59, 11, 59 + iSizeY * iBit.BitSize - 2 ); end;{of 'ClosedMainImage'} {----------------------------------------------------------------------------} Procedure CopyImage; begin { for CntY := 0 to iSizeY - 1 do for CntX := 0 to iSizeX - 1 do Clipboard^[ CntX, CntY ] := Image[ SelectImX, SelectImY ].Data^[ CntX + CntY * iSizeY ]; }end; {----------------------------------------------------------------------------} Procedure EditImage; Var StartX : Word; StartY : Word; GetImageElement_X : Byte; GetImageElement_Y : Byte; begin MouseHide; GetImageElement_X := ( m_X_coord - 10 ) div iBit.BitSize; GetImageElement_Y := ( m_Y_coord - 58 ) div iBit.BitSize; Image[ SelectImX, SelectImY ].Data^[ GetImageElement_X + GetImageElement_Y * iSizeX ] := Color; if Color = PhantomColorNum then BarDeluxe( 11 + GetImageElement_X * iBit.BitSize, 59 + GetImageElement_Y * iBit.BitSize, iBit.BitSize - 2, iBit.BitSize - 2, PhantomColorStyle, PhantomColor ) else BarDeluxe( 11 + GetImageElement_X * iBit.BitSize, 59 + GetImageElement_Y * iBit.BitSize, iBit.BitSize - 2, iBit.BitSize - 2, 1, Color ); StartX := 276 + SelectImx * iSizeX; StartY := 58 + SelectImy * iSizeY; PutPixel( StartX + GetImageElement_X, StartY + GetImageElement_Y, Image[ SelectImX, SelectImY ].Data^[ GetImageElement_X + GetImageElement_Y * iSizeX ] ); MouseShow; end; {----------------------------------------------------------------------------} Procedure FillCustomPalette; Var PalX : Byte; PalY : Byte; FillColor : Byte; begin if m_BUTTON=1 then FillColor:=Color.Foreground else FillColor:=Color.Background; PalX:=(m_X_coord-312) div 16; PalY:=(m_Y_coord-495) div 16; CustPal^[PalX,PalY]:=FillColor; BarDeluxe(313+PalX*16,497+PalY*16,12,12,1,FillColor); end; {----------------------------------------------------------------------------} Procedure GetCustomColor; Var PalX : Byte; PalY : Byte; begin PalX:=(m_X_coord-312) div 16; PalY:=(m_Y_coord-495) div 16; if m_BUTTON=1 then begin Color.CustomForeground:=CustPal^[PalX,PalY]; BarDeluxe(277,497,22,16,1,Color.CustomForeground); end else begin Color.CustomBackground:=CustPal^[PalX,PalY]; BarDeluxe(277,535,22,16,1,Color.CustomBackground); end; end; {----------------------------------------------------------------------------} Procedure GetInfo; Const MessageBox : array [0..13] of String =( '', {1} 'Here you can draw image', {2} 'Click here to select color', {3} 'Color of left mouse button', {4} 'Color of middle mouse button', {5} 'Color of right mouse button', {6} 'Click here to create', {7} 'Custom color bar for left mouse button', {8} 'Custom color bar for middle mouse button', {9} 'Custom color bar for right mouse button', {10} 'Click here to create custom palette', {11} '', {12} '', {13} ''); begin SetColor(40); SetTextStyle(0,0,0); OutTextXY(281,310,MessageBox[MsgNum]); end;{of 'GetInfo'} {----------------------------------------------------------------------------} Function GetMainColor; Var Color : Byte; SiteX : Word; SiteY : Word; begin SiteX := ( m_X_coord - 10 ) div 14; SiteY := ( m_Y_coord - 324 ) div 14; Color := MainPalette^[ SiteX, SiteY ]; if Color = PhantomColorNum then if m_BUTTON = 1 then BarDeluxe( 11, 553, 106, 18, PhantomColorStyle, PhantomColor ) else BarDeluxe( 125, 553, 106, 18, PhantomColorStyle, PhantomColor ); if Color <> PhantomColorNum then if m_BUTTON = 1 then BarDeluxe( 11, 553, 106, 18, 1, Color ) else BarDeluxe( 125, 553, 106, 18, 1, Color ); GetMainColor := MainPalette^[ SiteX, SiteY ]; end; {----------------------------------------------------------------------------} Procedure GridColorManager; Const WinWidth = 305; WinHeight = 260; Palette : array[0..29] of Byte=( 0 ,104 , 2 , 3 , 4 , 6, 7 , 8 ,140 , 150, 1 , 1, 1 , 1 , 1 , 1 , 1 , 1, 1 , 1 , 1 , 1 , 1 , 1, 1 , 1 , 1 , 1 , 1 , 1 ); Var OldColor : Byte; WorkColor : Byte; begin OldColor:=Grid.GridColor; WorkColor:=Grid.GridColor; PutIcon(304,32,PATH_TO_SHELL+'gridpal1'); { *** Grid color icon *** } CreateWindow(GridColManX,GridColManY,WinWidth,WinHeight,'Grid color manager'); Area(GridColManX+10,GridColManY+40,115,110,'Palette'); { *** Draw palette *** } for AxisY:=0 to 4 do for AxisX:=0 to 5 do Panel(GridColManX+20+AxisX*16,GridColManY+60+AxisY*16,14,14,22,Palette[AxisX+AxisY*5],31); Area(GridColManX+10,GridColManY+170,135,75,'Selected color'); Panel(GridColManX+20,GridColManY+189,115,46,COLOR_3,{Color}0,COLOR_1); SetColor(OldColor); for AxisY:=0 to 7 do for AxisX:=0 to 18 do begin Line(GridColManX+23+AxisX*6,GridColManY+190,GridColManX+23+AxisX*6,GridColManY+234);{V} Line(GridColManX+21,GridColManY+191+AxisY*6,GridColManX+134,GridColManY+191+AxisY*6);{H} end; Area(GridColManX+160,GridColManY+150,135,95,'Current color'); Panel(GridColManX+170,GridColManY+170,115,65,COLOR_3,0,COLOR_1); SetColor(Grid.GridColor); for AxisY:=0 to 10 do for AxisX:=0 to 18 do begin Line(GridColManX+172+AxisX*6,GridColManY+171,GridColManX+172+AxisX*6,GridColManY+234);{V} Line(GridColManX+171,GridColManY+172+AxisY*6,GridColManX+285,GridColManY+172+AxisY*6);{H} end; InitButton(GridColManX+160,GridColManY+40,0,0,'OK',OK); InitButton(GridColManX+160,GridColManY+70,0,0,'Cancel',Cancel); InitButton(GridColManX+160,GridColManY+100,0,0,'Apply',Apply); repeat Old_m_X_coord:=m_X_coord; Old_m_Y_coord:=m_Y_coord; MouseRead(m_X_coord,m_Y_coord,m_BUTTON); if (m_X_coord<>Old_m_X_coord) or (m_Y_coord<>Old_m_Y_coord) then MouseDraw; if m_BUTTON=1 then if not disableLMB then begin disableLMB:=True; if ((m_X_coord>GridColManX+20) and (m_X_coord<GridColManX+114)) and ((m_Y_coord>GridColManY+40) and (m_Y_coord<GridColManY+130)) then begin AxisX:=(m_X_coord-GridColManX-20) div 16; AxisY:=(m_Y_coord-GridColManY-60) div 16; WorkColor:=Palette[AxisX+AxisY*5]; SetColor(WorkColor); for AxisY:=0 to 7 do for AxisX:=0 to 18 do begin Line(GridColManX+23+AxisX*6,GridColManY+190,GridColManX+23+AxisX*6,GridColManY+234);{V} Line(GridColManX+21,GridColManY+191+AxisY*6,GridColManX+134,GridColManY+191+AxisY*6);{H} end; end; (* case GetButton(m_X_coord,m_Y_coord) of OK : begin Grid.GridColor:=WorkColor; if Trigger.Grid then begin SetColor(Grid.GridColor); for AxisY:=1 to iSizeY do for AxisX:=1 to iSizeX do Rectangle(10+AxisX*iBit.BitSize-iBit.BitSize, 40+AxisY*iBit.BitSize-iBit.BitSize, 10+AxisX*iBit.BitSize,40+AxisY*iBit.BitSize); end; ClearWindow(GridColManX,GridColManY,WinWidth,WinHeight); PutIcon(296,6,PATH_TO_SHELL+'gridpal0'); {Grid color icon} Exit; end; Cancel : begin Grid.GridColor:=OldColor; ClearWindow(GridColManX,GridColManX,WinWidth,WinHeight); PutIcon(296,6,PATH_TO_SHELL+'gridpal0'); {Grid color icon} Exit; end; Apply : begin Grid.GridColor:=WorkColor; SetColor(Grid.GridColor); for AxisY:=0 to 10 do for AxisX:=0 to 10 do begin Line(GridColManX+142+AxisX*6,GridColManY+121,GridColManX+142+AxisX*6,GridColManY+184);{V} Line(GridColManX+141,GridColManY+122+AxisY*6,GridColManX+205,GridColManY+122+AxisY*6);{H} end; end; end;{case} *) end else disableLMB:=False;{ of LEFT button } if KeyPressed then { *** Keyboard control *** } begin Key:=ReadKey; if Key=#27 then begin Exit; end; end; until m_BUTTON=2; Grid.GridColor:=WorkColor; PutIcon(304,32,PATH_TO_SHELL+'gridpal0'); { *** Grid color icon *** } end;{of 'GridColorManager'} {----------------------------------------------------------------------------} Procedure ImageCage; begin BarDeluxe( ImCageXstart, ImCageYstart, iSizeX - 2, iSizeY - 2, 1, 0 ); SetColor( 28 ); Rectangle( ImCageXstart, ImCageYstart, ImCageXstart + iSizeX - 1, ImCageYstart + iSizeY - 1 ); Line( ImCageXstart + 1, ImCageYstart + 1, ImCageXstart + iSizeX - 2, ImCageYstart + iSizeY - 2); Line( ImCageXstart + iSizeX - 2, ImCageYstart + 1, ImCageXstart + 1, ImCageYstart + iSizeY - 2); end; {----------------------------------------------------------------------------} Procedure ImageSizeManager; begin end;{of 'ImageSizeManager'} {----------------------------------------------------------------------------} Procedure DrawDesktop; var tmpX : integer; tmpY : integer; begin { *** Set image bit size *** } if iSizeX>iSizeY then iBit.BitSize:= 256 div iSizeX; if iSizeY>iSizeX then iBit.BitSize:= 256 div iSizeY; if iSizeX=iSizeY then iBit.BitSize:= 256 div iSizeX; if iBit.BitSize>14 then iBit.BitSize:=14; { *** Init all images *** } for AxisY := 0 to ImagesByY do for AxisX := 0 to ImagesByX do begin Image[ AxisX, AxisY ].Flag := False; for tmpY := 0 to iSizeY - 1 do for tmpX := 0 to iSizeX - 1 do Image[ AxisX, AxisY ].Data^[ tmpX + tmpY * iSizeX ] := 0; end; { Initialize main palette } for AxisY := 0 to 15 do for AxisX := 0 to 15 do MainPalette^[ AxisX, AxisY ] := AxisX + 16 * AxisY; MainPalette^[ 7, 15 ] := 22; MainPalette^[ 8, 15 ] := 23; MainPalette^[ 9, 15 ] := 24; MainPalette^[ 10, 15 ] := 25; MainPalette^[ 11, 15 ] := 26; MainPalette^[ 12, 15 ] := COLOR_2; MainPalette^[ 13, 15 ] := 28; MainPalette^[ 14, 15 ] := 29; MainPalette^[ 15, 15 ] := PhantomColorNum; CreateWindow( 0, 0, GetMaxX, GetMaxY, 'Atomizer' ); Area( 4, 24, 204, 22, '' ); BarDeluxe( 8, 28, 30, 14, 1, 105 ); SetColor( 15 ); {SetStandardFont;} OutTextXY( 13, 29, 'File' ); {Main image window} {Here you can draw image} Panel( 10, 58, iSizeX * iBit.BitSize, iSizeY * iBit.BitSize, COLOR_3, 0, COLOR_1 ); ClosedMainImage; for AxisY := 0 to 15 do { *** Draw palette box *** } for AxisX := 0 to 15 do Panel( 10 + AxisX * 14, 324 + AxisY * 14, 12, 12, 22, MainPalette^[ AxisX, AxisY ], 31 ); BarDeluxe( 221, 535, 10, 10, PhantomColorStyle, PhantomColor ); Panel(10,552,108,20,22,Color.Foreground,31); {Color of LEFT mouse button} Panel(124,552,108,20,22,Color.Background,31); {Color of RIGHT mouse button} (* Panel(280,496,23,18,22,27,31); {Custom color bar of LEFT mouse button} Panel(280,520,23,18,22,27,31); {Custom color bar of RIGHT mouse button} *) (* Panel(276,338,515,21,22,27,31); { Message box } SetColor(0); OutTextXY(282,345,'Click here to call closed image operating menu'); *) { DRAW IMAGES BLOCK } for AxisY := 0 to ImagesByY - 1 do for AxisX := 0 to ImagesByX - 1 do ImageCage( 276 + AxisX * iSizeX, 58 + AxisY * iSizeY ); {----------------------------} {DRAW CUSTOM PALETTE BOX} (* for AxisY:=1 to 6 do for AxisX:=1 to 30 do begin Panel(296+AxisX*16,480+AxisY*16,14,14,22,COLOR_2,31); BarDeluxe(297+AxisX*16,481+AxisY*16,12,12,1,27); end; *) { Status bar } Panel( 5, 578, GetMaxX - 10, 16, COLOR_3, COLOR_2, COLOR_1 ); Panel( 216, 30, 50, 16, COLOR_3, COLOR_2, COLOR_1 ); { SetColor( 0 ); SetStandardFont; OutTextXY( 10, 580, 'Status string of Atomizer' ); } ShowCurrentImageSize; end;{of 'DrawDesktop'} {----------------------------------------------------------------------------} Procedure MoveImage; begin { Image[ OldSelectImX, OldSelectImY ].Flag := False; Image[ SelectImX, SelectImY ].Flag := True; for CntY := 0 to iSizeY - 1 do for CntX := 0 to iSizeX - 1 do Clipboard^[ CntX, CntY ] := Image[ SelectImX, SelectImY ].Data^[ CntX + CntY * iSizeY ]; ClosedMainImage; } end; {----------------------------------------------------------------------------} Procedure LoadCustomPalette; Var FileName : String; F : File; Color : Byte; begin BarDeluxe(0,0,200,20,1,0); SetColor(10); OutTextXY(0,10,'Load custom palette:'); ReadLn(FileName); FileName:=FileName+'.cpf'; Assign(F,FileName); {$I-} Reset(F,1); {$I+} for AxisY:=0 to 5 do for AxisX:=0 to 29 do begin BlockRead(F,Color,1); CustPal^[AxisX,AxisY]:=Color; end; Close(F); BarDeluxe(0,0,200,20,1,0); RefreshCustomPalette; end;{of 'Load custom palette'} {----------------------------------------------------------------------------} Procedure LoadImage; Var PalettePresent : Byte; FileName : String; Color : Byte; begin BarDeluxe(0,0,70,20,1,0); SetTextStyle(2,0,0); SetColor(10); OutTextXY(0,10,'Load image'); ReadLn( FileName ); FileName := FileName + '.agi'; Assign( F, FileName ); {$I-} Reset( F, 1 ); {$I+} if IOResult <> 0 then Exit; BlockRead( F, VERSION_NUMBER, 1 ); BlockRead( F, iSizeX, 1 ); BlockRead( F, iSizeY, 1 ); for AxisY := 0 to iSizeY - 1 do for AxisX := 0 to iSizeX - 1 do BlockRead( F, Image[ SelectImX, SelectImY ].Data^[ AxisX + AxisY * iSizeX ], 1 ); { BlockRead( F, PalettePresent,1); if PalettePresent=1 then if PaletteFlag then begin for AxisY:=0 to 5 do for AxisX:=0 to 29 do begin BlockRead(F,CustPal^[AxisX,AxisY],1); end; RefreshCustomPalette; end; } Close(F); RefreshCurrentImage; BarDeluxe(0,0,70,20,1,27); end;{of 'LoadImage'} {----------------------------------------------------------------------------} Procedure LMBOpsWithImages; begin { OldSelectImX := SelectImX; OldSelectImY := SelectImY; } SelectImX := ( m_X_coord - 276 ) div iSizeX; SelectImY := ( m_Y_coord - 58 ) div iSizeY; if not Image[ SelectImX, SelectImY ].Flag then { Image now is CLOSED } ClosedMainImage else { Image already is OPENED } begin { Selected other image } SelectImX := ( m_X_coord - 276 ) div iSizeX; SelectImY := ( m_Y_coord - 58 ) div iSizeY; RefreshCurrentImage; end; end; {----------------------------------------------------------------------------} Procedure OpenNewImage; Var ReadPixel : byte; tmpX : integer; tmpY : integer; begin NewProjectFlag := False; { Allocate memory for new image } Image[ SelectImX, SelectImY ].Flag := True; GetMem( Image[ SelectImX, SelectImY ].Data, iSizeX * iSizeY ); for tmpY := 0 to iSizeY - 1 do for tmpX := 0 to iSizeX - 1 do Image[ SelectImX, SelectImY ].Data^[ tmpX + tmpY * iSizeX ] := Color.Background; RefreshCurrentImage; BarDeluxe( 276 + SelectImX * iSizeX, 58 + SelectImY * iSizeY, iSizeX - 1, iSizeY - 1, 1, Color.Background ); {OutTextXY( 400,400, inttostr());} end;{ of 'OpenNewImage' } {----------------------------------------------------------------------------} Procedure Operation; Var StartX : Integer; StartY : Integer; tmpX : integer; tmpY : integer; begin case OpName of {---------------------------------------------------------} Copy : { Copy image to clipboard } begin for tmpY := 0 to iSizeY - 1 do for tmpX := 0 to iSizeX - 1 do Clipboard^[ tmpX, tmpY ] := Image[ SelectImX, SelectImY ].Data^[ tmpX + tmpY * iSizeY ]; end; {---------------------------------------------------------} Paste : { Paste image from clipboard } begin StartX := 276 + SelectImX * iSizeX; StartY := 58 + SelectImY * iSizeY; if Image[ SelectImX, SelectImY ].Flag = False then { Closed } begin Image[ SelectImX, SelectImY ].Flag := True; { Open } GetMem( Image[ SelectImX, SelectImY ].Data, iSizeX * iSizeY ); end; for tmpY := 0 to iSizeY - 1 do for tmpX := 0 to iSizeX - 1 do begin PutPixel( StartX + tmpX, StartY + tmpY, Clipboard^[ tmpX, tmpY ] ); Image[ SelectImX, SelectImY ].Data^[ tmpX + tmpY * iSizeX ] := Clipboard^[ tmpX, tmpY ]; end; Image[ SelectImX, SelectImY ].Flag := True; RefreshCurrentImage; end; {---------------------------------------------------------} Put : { Put image with transparency } begin StartX := 276 + SelectImX * iSizeX; StartY := 58 + SelectImY * iSizeY; if Image[ SelectImX, SelectImY ].Flag = False then { Closed } begin Image[ SelectImX, SelectImY ].Flag := True; { Open } GetMem( Image[ SelectImX, SelectImY ].Data, iSizeX * iSizeY ); end; for tmpY := 0 to iSizeY - 1 do for tmpX := 0 to iSizeX - 1 do begin if Clipboard^[ tmpX, tmpY ] <> PhantomColorNum then { Not phantom } PutPixel( StartX + tmpX, StartY + tmpY, Clipboard^[ tmpX, tmpY ] ); {if Image[ SelectImX, SelectImY ].Flag = True then if Image[ SelectImX, SelectImY ].Flag = True then Image[ SelectImX, SelectImY ].Data^[ CntX + CntY * iSizeX ] := Clipboard^[ CntX, CntY ]; else } Image[ SelectImX, SelectImY ].Data^[ tmpX + tmpY * iSizeX ] := Clipboard^[ tmpX, tmpY ]; end; Image[ SelectImX, SelectImY ].Flag := True; RefreshCurrentImage; end; end; end; {----------------------------------------------------------------------------} Procedure PasteImage; Var StartX : Integer; StartY : Integer; tmpX : integer; tmpY : integer; begin StartX := 276 + SelectImX * iSizeX; StartY := 58 + SelectImY * iSizeY; Image[ SelectImX, SelectImY ].Flag := True; GetMem( Image[ SelectImX, SelectImY ].Data, iSizeX * iSizeY ); for tmpY := 0 to iSizeY - 1 do for tmpX := 0 to iSizeX - 1 do begin PutPixel( StartX + tmpX, StartY + tmpY, Clipboard^[ tmpX, tmpY ] ); Image[ SelectImX, SelectImY ].Data^[ tmpX + tmpY * iSizeX ] := Clipboard^[ tmpX, tmpY ]; end; Image[ SelectImX, SelectImY ].Flag := True; RefreshCurrentImage; end; {----------------------------------------------------------------------------} Procedure PutIcon; Var IconSizeX : Byte; IconSizeY : Byte; Pixel : Byte; begin Assign(F,IconName+'.agi'); {$i-} Reset(F,1); {$i+} if IOResult <>0 then Exit; BlockRead(F,VERSION_NUMBER,1); BlockRead(F,IconSizeX,1); BlockRead(F,IconSizeY,1); for AxisY:=0 to IconSizeY-1 do for AxisX:=0 to IconSizeX-1 do begin BlockRead(F,Pixel,1); PutPixel(PosX+AxisX,PosY+AxisY,Pixel); end; Close(F); end;{of 'PutIcon'} {----------------------------------------------------------------------------} Procedure PutSpinner; begin Panel(SpinX,SpinY,28,18,COLOR_3,COLOR_1,28); PutIcon(SpinX+30,SpinY,PATH_TO_SHELL+'spininc0'); PutIcon(SpinX+30,SpinY+10,PATH_TO_SHELL+'spindec0'); end; {----------------------------------------------------------------------------} Procedure RefreshCustomPalette; Var Color : Byte; begin for AxisY:=0 to 5 do for AxisX:=0 to 29 do begin Color:=CustPal^[AxisX,AxisY]; if Color<>PhantomColorNum then BarDeluxe(313+AxisX*16,497+AxisY*16,12,12,1,Color) else BarDeluxe(313+AxisX*16,497+AxisY*16,12,12,PhantomColorStyle,PhantomColor); end; end;{of 'RefreshCustomPalette'} {----------------------------------------------------------------------------} Procedure RefreshCurrentImage; Var Color : Byte; begin { Delete lines when open new image } SetColor( 0 ); Line( 11, 59, 11 + iSizeX * iBit.BitSize - 2, 59 + iSizeY * iBit.BitSize - 2 ); Line( 11 + iSizeX * iBit.BitSize - 2 , 59, 11, 59 + iSizeY * iBit.BitSize - 2 ); for AxisY := 0 to iSizeY - 1 do for AxisX := 0 to iSizeX - 1 do begin Color := Image[ SelectImX, SelectImY ].Data^[ AxisX + AxisY * iSizeX ]; if Color = PhantomColorNum then BarDeluxe( 11 + AxisX * iBit.BitSize , 59 + AxisY * iBit.BitSize, iBit.BitSize - 2, iBit.BitSize - 2, PhantomColorStyle, PhantomColor ) else BarDeluxe( 11 + AxisX * iBit.BitSize,59 + AxisY * iBit.BitSize, iBit.BitSize - 2, iBit.BitSize - 2, 1, Color ); end; end;{of 'RefreshCurrentImage'} {----------------------------------------------------------------------------} Procedure RMBOpsWithImages; begin OldSelectImX := SelectImX; OldSelectImY := SelectImY; SelectImX := ( m_X_coord - 276 ) div iSizeX; SelectImY := ( m_Y_coord - 58 ) div iSizeY; if not Image[ SelectImX, SelectImY ].Flag then { Image now is CLOSED } begin case VerticalGraphMenu( m_X_coord, m_Y_coord, MENU_ITEM_LIST_ClosedImage, MENU_MAXITEMS_ClosedImage ) of 0 : OpenNewImage; 2 : Operation( Paste ); 3 : Operation( Put ); end { of case } end else { Image already is OPENED } if ( OldSelectImX = SelectImX ) and ( OldSelectImY = SelectImY ) then { Selected current image } begin case VerticalGraphMenu(m_X_coord,m_Y_coord,MENU_ITEM_LIST_OpenedImage,MENU_MAXITEMS_OpenedImage) of 0 : OpenNewImage; { NEW image } 1 : begin end; 2 : begin end; 3 : CloseImage; 5 : Operation( Copy ); 6 : Operation( Paste ); 7 : Operation( Put ); 8 : MoveImage; end;{ of case } end; end; {----------------------------------------------------------------------------} Procedure SaveCustomPalette; Var FileName : String; F : File; Color : Byte; begin BarDeluxe(0,0,200,20,1,0); SetColor(10); OutTextXY(0,10,'Save custom palette:'); ReadLn(FileName); FileName:=FileName+'.cpf'; Assign(F,FileName); Rewrite(F,1); for AxisY:=0 to 5 do for AxisX:=0 to 29 do begin Color:=CustPal^[AxisX,AxisY]; BlockWrite(F,Color,1); end; Close(F); BarDeluxe(0,0,200,20,1,0); end;{of 'Save custom palette'} {----------------------------------------------------------------------------} Procedure SaveImage; Var FileName : String; DefaultFilename : Byte; PalettePresent : Byte; begin BarDeluxe(0,0,70,20,1,0); SetColor(10); SetTextStyle(2,0,0); OutTextXY(0,10,'Save image'); { if PaletteFlag then OutTextXY(0,10,'Save image with palette:') else OutTextXY(0,10,'Save image:');} ReadLn( FileName ); FileName := FileName + '.agi'; Assign( F, FileName ); Rewrite( F, 1 ); BlockWrite( F, VERSION_NUMBER, 1 ); BlockWrite( F, iSizeX, 1 ); BlockWrite( F, iSizeY, 1 ); for AxisY := 0 to ISizeY - 1 do for AxisX := 0 to ISizeX - 1 do BlockWrite( F, Image[ SelectImX, SelectImY ].Data^[ AxisX + AxisY * iSizeX ], 1 ); { if PaletteFlag then begin PalettePresent:=1; BlockWrite(F,PalettePresent,1); for AxisY:=0 to 5 do for AxisX:=0 to 29 do begin BlockWrite(F,CustPal^[AxisX,AxisY],1); end; end else begin PalettePresent:=0; BlockWrite(F,PalettePresent,1); end; } Close(F); BarDeluxe(0,0,70,20,1,27); end;{of 'SaveImage'} {----------------------------------------------------------------------------} Procedure ShowCurrentImageBit; begin {SetStandardFont;} SetColor( COLOR_2 ); OutTextXY( 222, 32, IntToStr( OldImageCageX ) ); OutTextXY( 244, 32, IntToStr( OldImageCageY ) ); OldImageCageX := ImageCageX; OldImageCageY := ImageCageY; ImageCageX := ( m_X_coord - 11 ) div iBit.BitSize + 1; ImageCageY := ( m_Y_coord - 59 ) div iBit.BitSize + 1; SetColor( 0 ); OutTextXY( 222, 32, IntToStr( OldImageCageX ) ); OutTextXY( 244, 32, IntToStr( OldImageCageY ) ); end;{of 'ShowCurrentImageBit'} {----------------------------------------------------------------------------} Procedure ShowCurrentImageSize; begin {SetStandardFont;} SetColor( 0 ); OutTextXY( 10, 580, 'Image: ' ); OutTextXY( 45, 580, IntToStr( iSizeX ) ); OutTextXY( 65, 580, 'x' ); OutTextXY( 73, 580, IntToStr( iSizeY ) ); end;{of 'ShowCurrentImageSize'} {----------------------------------------------------------------------------} Procedure SetNewProject; Const WinWidth = 160; WinHeight = 185; begin PutIcon(280,32,PATH_TO_SHELL+'newprj0'); CreateWindow(WinCoordX,WinCoordY,WinWidth,WinHeight,'New project'); Area(WinCoordX+10,WinCoordY+40,140,90,'Image Size'); {SetStandardFont;} SetColor(0); OutTextXY(WinCoordX+25,WinCoordY+65,'Horizontal'); OutTextXY(WinCoordX+25,WinCoordY+95,'Vertical'); PutSpinner(WinCoordX+90,WinCoordY+62); PutSpinner(WinCoordX+90,WinCoordY+92); InitButton(WinCoordX+10,WinCoordY+150,65,20,'OK',OK); InitButton(WinCoordX+85,WinCoordY+150,65,20,'Cancel',Cancel); end; {----------------------------------------------------------------------------} End.{ of unit 'Service' written by Sergeant at 26.03.99 }