476 lines
11 KiB
Text
476 lines
11 KiB
Text
VERSION DVX 1.00
|
|
Begin Form IconEd
|
|
Caption = "DVX Icon Editor"
|
|
Layout = VBox
|
|
AutoSize = True
|
|
Resizable = False
|
|
Centered = True
|
|
|
|
Begin Menu mnuFile
|
|
Caption = "&File"
|
|
Begin Menu mnuNew
|
|
Caption = "&New"
|
|
End
|
|
Begin Menu mnuOpen
|
|
Caption = "&Open..."
|
|
End
|
|
Begin Menu mnuSave
|
|
Caption = "&Save..."
|
|
End
|
|
Begin Menu mnuSep1
|
|
Caption = "-"
|
|
End
|
|
Begin Menu mnuExit
|
|
Caption = "E&xit"
|
|
End
|
|
End
|
|
|
|
Begin Menu mnuTools
|
|
Caption = "&Tools"
|
|
Begin Menu mnuPencil
|
|
Caption = "&Pencil"
|
|
Checked = True
|
|
RadioCheck = True
|
|
End
|
|
Begin Menu mnuEraser
|
|
Caption = "&Eraser"
|
|
RadioCheck = True
|
|
End
|
|
Begin Menu mnuPicker
|
|
Caption = "Color Pic&ker"
|
|
RadioCheck = True
|
|
End
|
|
End
|
|
|
|
Begin Menu mnuSize
|
|
Caption = "&Size"
|
|
Begin Menu mnuSize16
|
|
Caption = "16 x 16"
|
|
RadioCheck = True
|
|
End
|
|
Begin Menu mnuSize24
|
|
Caption = "24 x 24"
|
|
RadioCheck = True
|
|
End
|
|
Begin Menu mnuSize32
|
|
Caption = "32 x 32"
|
|
Checked = True
|
|
RadioCheck = True
|
|
End
|
|
End
|
|
|
|
Begin Frame fraMain
|
|
Caption = ""
|
|
Layout = HBox
|
|
Weight = 100
|
|
|
|
Begin PictureBox cvEditor
|
|
Width = 256
|
|
Height = 256
|
|
Weight = 0
|
|
End
|
|
|
|
Begin Frame fraSidebar
|
|
Caption = ""
|
|
Layout = VBox
|
|
Width = 100
|
|
Weight = 0
|
|
|
|
Begin Label lblPreview
|
|
Caption = "Preview:"
|
|
End
|
|
|
|
Begin PictureBox cvPreview
|
|
Width = 32
|
|
Height = 32
|
|
Weight = 0
|
|
End
|
|
|
|
Begin Label lblColor
|
|
Caption = "Color:"
|
|
End
|
|
|
|
Begin PictureBox cvSelColor
|
|
Width = 32
|
|
Height = 20
|
|
Weight = 0
|
|
End
|
|
|
|
Begin Label lblPalette
|
|
Caption = "Palette:"
|
|
End
|
|
|
|
Begin PictureBox cvPalette
|
|
Width = 80
|
|
Height = 80
|
|
Weight = 0
|
|
End
|
|
End
|
|
End
|
|
|
|
Begin Label lblStatus
|
|
Caption = "Ready. (0, 0)"
|
|
Height = 16
|
|
Weight = 0
|
|
End
|
|
End
|
|
|
|
OPTION EXPLICIT
|
|
|
|
CONST CANVAS_SIZE = 256
|
|
CONST BG_COLOR = &H00C0C0C0
|
|
CONST GRID_COLOR = &H00808080
|
|
CONST EDGE_COLOR = &H00404040
|
|
CONST TOOL_PENCIL = 0
|
|
CONST TOOL_ERASER = 1
|
|
CONST TOOL_PICKER = 2
|
|
CONST PAL_COLS = 8
|
|
CONST PAL_ROWS = 4
|
|
CONST PAL_CELL = 10
|
|
|
|
DIM pixels(31, 31) AS LONG
|
|
DIM palette(31) AS LONG
|
|
DIM iconW AS INTEGER
|
|
DIM iconH AS INTEGER
|
|
DIM pixelSize AS INTEGER
|
|
DIM curTool AS INTEGER
|
|
DIM curColor AS LONG
|
|
DIM drawing AS BOOLEAN
|
|
DIM dirty AS BOOLEAN
|
|
DIM filePath AS STRING
|
|
|
|
SUB InitPalette
|
|
palette(0) = &H00000000
|
|
palette(1) = &H00FFFFFF
|
|
palette(2) = &H00C0C0C0
|
|
palette(3) = &H00808080
|
|
palette(4) = &H00FF0000
|
|
palette(5) = &H00800000
|
|
palette(6) = &H00FF8000
|
|
palette(7) = &H00804000
|
|
palette(8) = &H00FFFF00
|
|
palette(9) = &H00808000
|
|
palette(10) = &H0000FF00
|
|
palette(11) = &H00008000
|
|
palette(12) = &H0000FFFF
|
|
palette(13) = &H00008080
|
|
palette(14) = &H0000FF80
|
|
palette(15) = &H00004040
|
|
palette(16) = &H000000FF
|
|
palette(17) = &H00000080
|
|
palette(18) = &H008000FF
|
|
palette(19) = &H00800080
|
|
palette(20) = &H00FF00FF
|
|
palette(21) = &H00FF0080
|
|
palette(22) = &H00FF80C0
|
|
palette(23) = &H004040FF
|
|
palette(24) = &H00404040
|
|
palette(25) = &H00A0A0A0
|
|
palette(26) = &H00E0E0E0
|
|
palette(27) = &H00FFE0C0
|
|
palette(28) = &H00C0FFE0
|
|
palette(29) = &H00C0E0FF
|
|
palette(30) = &H00FFC0C0
|
|
palette(31) = &H00C0C0FF
|
|
END SUB
|
|
|
|
SUB ClearPixels
|
|
DIM x AS INTEGER
|
|
DIM y AS INTEGER
|
|
FOR y = 0 TO 31
|
|
FOR x = 0 TO 31
|
|
pixels(x, y) = BG_COLOR
|
|
NEXT x
|
|
NEXT y
|
|
dirty = False
|
|
END SUB
|
|
|
|
SUB SetIconSize(w AS INTEGER)
|
|
iconW = w
|
|
iconH = w
|
|
pixelSize = CANVAS_SIZE \ w
|
|
END SUB
|
|
|
|
SUB DrawEditorGrid
|
|
DIM x AS INTEGER
|
|
DIM y AS INTEGER
|
|
DIM edgeW AS INTEGER
|
|
cvEditor.Clear BG_COLOR
|
|
FOR y = 0 TO iconH - 1
|
|
FOR x = 0 TO iconW - 1
|
|
cvEditor.FillRect x * pixelSize, y * pixelSize, pixelSize, pixelSize, pixels(x, y)
|
|
NEXT x
|
|
NEXT y
|
|
FOR x = 0 TO iconW
|
|
cvEditor.DrawLine x * pixelSize, 0, x * pixelSize, iconH * pixelSize, GRID_COLOR
|
|
NEXT x
|
|
FOR y = 0 TO iconH
|
|
cvEditor.DrawLine 0, y * pixelSize, iconW * pixelSize, y * pixelSize, GRID_COLOR
|
|
NEXT y
|
|
edgeW = iconW * pixelSize
|
|
cvEditor.DrawRect 0, 0, edgeW, edgeW, EDGE_COLOR
|
|
cvEditor.Refresh
|
|
END SUB
|
|
|
|
SUB DrawPreview
|
|
DIM x AS INTEGER
|
|
DIM y AS INTEGER
|
|
cvPreview.Clear BG_COLOR
|
|
FOR y = 0 TO iconH - 1
|
|
FOR x = 0 TO iconW - 1
|
|
cvPreview.SetPixel x, y, pixels(x, y)
|
|
NEXT x
|
|
NEXT y
|
|
cvPreview.Refresh
|
|
END SUB
|
|
|
|
SUB DrawPalette
|
|
DIM i AS INTEGER
|
|
DIM px AS INTEGER
|
|
DIM py AS INTEGER
|
|
cvPalette.Clear BG_COLOR
|
|
FOR i = 0 TO 31
|
|
px = (i MOD PAL_COLS) * PAL_CELL
|
|
py = (i \ PAL_COLS) * PAL_CELL
|
|
cvPalette.FillRect px, py, PAL_CELL, PAL_CELL, palette(i)
|
|
cvPalette.DrawRect px, py, PAL_CELL, PAL_CELL, &H00000000
|
|
NEXT i
|
|
cvPalette.Refresh
|
|
END SUB
|
|
|
|
SUB DrawSelectedColor
|
|
cvSelColor.Clear curColor
|
|
cvSelColor.Refresh
|
|
END SUB
|
|
|
|
SUB RefreshAll
|
|
DrawEditorGrid
|
|
DrawPreview
|
|
DrawSelectedColor
|
|
END SUB
|
|
|
|
SUB UpdateTitle
|
|
DIM t AS STRING
|
|
t = "DVX Icon Editor - " + STR$(iconW) + "x" + STR$(iconH)
|
|
IF filePath <> "" THEN
|
|
t = t + " - " + filePath
|
|
END IF
|
|
IF dirty THEN
|
|
t = t + " *"
|
|
END IF
|
|
IconEd.Caption = t
|
|
END SUB
|
|
|
|
SUB SetIconPixel(x AS INTEGER, y AS INTEGER)
|
|
DIM c AS LONG
|
|
IF x < 0 OR x >= iconW OR y < 0 OR y >= iconH THEN
|
|
EXIT SUB
|
|
END IF
|
|
IF curTool = TOOL_ERASER THEN
|
|
c = BG_COLOR
|
|
ELSE
|
|
c = curColor
|
|
END IF
|
|
IF pixels(x, y) <> c THEN
|
|
pixels(x, y) = c
|
|
dirty = True
|
|
UpdateTitle
|
|
cvEditor.FillRect x * pixelSize, y * pixelSize, pixelSize, pixelSize, c
|
|
cvEditor.DrawLine x * pixelSize, y * pixelSize, (x + 1) * pixelSize, y * pixelSize, GRID_COLOR
|
|
cvEditor.DrawLine x * pixelSize, y * pixelSize, x * pixelSize, (y + 1) * pixelSize, GRID_COLOR
|
|
cvEditor.DrawLine (x + 1) * pixelSize, y * pixelSize, (x + 1) * pixelSize, (y + 1) * pixelSize, GRID_COLOR
|
|
cvEditor.DrawLine x * pixelSize, (y + 1) * pixelSize, (x + 1) * pixelSize, (y + 1) * pixelSize, GRID_COLOR
|
|
cvPreview.SetPixel x, y, c
|
|
END IF
|
|
END SUB
|
|
|
|
SUB SelectTool(t AS INTEGER)
|
|
curTool = t
|
|
IF t = TOOL_PENCIL THEN
|
|
mnuPencil.Checked = True
|
|
lblStatus.Caption = "Tool: Pencil"
|
|
ELSEIF t = TOOL_ERASER THEN
|
|
mnuEraser.Checked = True
|
|
lblStatus.Caption = "Tool: Eraser"
|
|
ELSEIF t = TOOL_PICKER THEN
|
|
mnuPicker.Checked = True
|
|
lblStatus.Caption = "Tool: Picker"
|
|
END IF
|
|
END SUB
|
|
|
|
SUB ChangeSize(newSize AS INTEGER)
|
|
DIM ans AS INTEGER
|
|
IF newSize = iconW THEN
|
|
EXIT SUB
|
|
END IF
|
|
IF dirty THEN
|
|
ans = MsgBox("Unsaved changes will be lost. Change size?", vbYesNo)
|
|
IF ans = vbNo THEN
|
|
EXIT SUB
|
|
END IF
|
|
END IF
|
|
SetIconSize newSize
|
|
ClearPixels
|
|
filePath = ""
|
|
IF newSize = 16 THEN
|
|
mnuSize16.Checked = True
|
|
ELSEIF newSize = 24 THEN
|
|
mnuSize24.Checked = True
|
|
ELSE
|
|
mnuSize32.Checked = True
|
|
END IF
|
|
UpdateTitle
|
|
RefreshAll
|
|
lblStatus.Caption = STR$(iconW) + "x" + STR$(iconH) + " - Ready."
|
|
END SUB
|
|
|
|
SUB IconEd_Load
|
|
InitPalette
|
|
SetIconSize 32
|
|
ClearPixels
|
|
curTool = TOOL_PENCIL
|
|
curColor = &H00000000
|
|
drawing = False
|
|
filePath = ""
|
|
DrawPalette
|
|
RefreshAll
|
|
UpdateTitle
|
|
END SUB
|
|
|
|
SUB mnuNew_Click
|
|
DIM ans AS INTEGER
|
|
IF dirty THEN
|
|
ans = MsgBox("Unsaved changes. Start new icon?", vbYesNo)
|
|
IF ans = vbNo THEN
|
|
EXIT SUB
|
|
END IF
|
|
END IF
|
|
ClearPixels
|
|
filePath = ""
|
|
UpdateTitle
|
|
RefreshAll
|
|
END SUB
|
|
|
|
SUB mnuOpen_Click
|
|
DIM ans AS INTEGER
|
|
DIM path AS STRING
|
|
DIM x AS INTEGER
|
|
DIM y AS INTEGER
|
|
IF dirty THEN
|
|
ans = MsgBox("Unsaved changes. Open another file?", vbYesNo)
|
|
IF ans = vbNo THEN
|
|
EXIT SUB
|
|
END IF
|
|
END IF
|
|
path = InputBox$("Open BMP file:", "Open Icon", filePath)
|
|
IF path = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
cvPreview.Load path
|
|
FOR y = 0 TO iconH - 1
|
|
FOR x = 0 TO iconW - 1
|
|
pixels(x, y) = cvPreview.GetPixel(x, y)
|
|
NEXT x
|
|
NEXT y
|
|
filePath = path
|
|
dirty = False
|
|
UpdateTitle
|
|
RefreshAll
|
|
END SUB
|
|
|
|
SUB mnuSave_Click
|
|
DIM path AS STRING
|
|
IF filePath = "" THEN
|
|
path = InputBox$("Save BMP file:", "Save Icon", "ICON.BMP")
|
|
ELSE
|
|
path = InputBox$("Save BMP file:", "Save Icon", filePath)
|
|
END IF
|
|
IF path = "" THEN
|
|
EXIT SUB
|
|
END IF
|
|
DrawPreview
|
|
cvPreview.Save path
|
|
filePath = path
|
|
dirty = False
|
|
UpdateTitle
|
|
lblStatus.Caption = "Saved: " + path
|
|
END SUB
|
|
|
|
SUB mnuExit_Click
|
|
Unload IconEd
|
|
END SUB
|
|
|
|
SUB mnuPencil_Click
|
|
SelectTool TOOL_PENCIL
|
|
END SUB
|
|
|
|
SUB mnuEraser_Click
|
|
SelectTool TOOL_ERASER
|
|
END SUB
|
|
|
|
SUB mnuPicker_Click
|
|
SelectTool TOOL_PICKER
|
|
END SUB
|
|
|
|
SUB mnuSize16_Click
|
|
ChangeSize 16
|
|
END SUB
|
|
|
|
SUB mnuSize24_Click
|
|
ChangeSize 24
|
|
END SUB
|
|
|
|
SUB mnuSize32_Click
|
|
ChangeSize 32
|
|
END SUB
|
|
|
|
SUB cvEditor_MouseDown(button AS INTEGER, x AS INTEGER, y AS INTEGER)
|
|
DIM px AS INTEGER
|
|
DIM py AS INTEGER
|
|
px = x \ pixelSize
|
|
py = y \ pixelSize
|
|
IF curTool = TOOL_PICKER THEN
|
|
IF px >= 0 AND px < iconW AND py >= 0 AND py < iconH THEN
|
|
curColor = pixels(px, py)
|
|
DrawSelectedColor
|
|
SelectTool TOOL_PENCIL
|
|
END IF
|
|
EXIT SUB
|
|
END IF
|
|
drawing = True
|
|
SetIconPixel px, py
|
|
lblStatus.Caption = "(" + STR$(px) + "," + STR$(py) + ")"
|
|
END SUB
|
|
|
|
SUB cvEditor_MouseMove(button AS INTEGER, x AS INTEGER, y AS INTEGER)
|
|
DIM px AS INTEGER
|
|
DIM py AS INTEGER
|
|
px = x \ pixelSize
|
|
py = y \ pixelSize
|
|
IF px >= 0 AND px < iconW AND py >= 0 AND py < iconH THEN
|
|
lblStatus.Caption = "(" + STR$(px) + "," + STR$(py) + ")"
|
|
END IF
|
|
IF drawing THEN
|
|
SetIconPixel px, py
|
|
END IF
|
|
END SUB
|
|
|
|
SUB cvEditor_MouseUp(button AS INTEGER, x AS INTEGER, y AS INTEGER)
|
|
drawing = False
|
|
END SUB
|
|
|
|
SUB cvPalette_MouseDown(button AS INTEGER, x AS INTEGER, y AS INTEGER)
|
|
DIM col AS INTEGER
|
|
DIM row AS INTEGER
|
|
DIM idx AS INTEGER
|
|
col = x \ PAL_CELL
|
|
row = y \ PAL_CELL
|
|
IF col >= 0 AND col < PAL_COLS AND row >= 0 AND row < PAL_ROWS THEN
|
|
idx = row * PAL_COLS + col
|
|
curColor = palette(idx)
|
|
DrawSelectedColor
|
|
IF curTool = TOOL_PICKER THEN
|
|
SelectTool TOOL_PENCIL
|
|
END IF
|
|
END IF
|
|
END SUB
|