In this step of the Bitmap Painting tool development, we will add brush color and size controls.
NATURAL LANGUAGE
We will extend the existing MacroScript by adding new UI controls to the rollout to define the Ink color and the Brush Size.
The paintbrush function will be changed to use the color defined by the UI color picker.
The drawStroke function will be enhanced to draw a large rectangle based on the defined size.
SCRIPT:
macroScript MicroPaint category:"HowTo"
(
global MicroPaint_CanvasRollout
try(destroyDialog MicroPaint_CanvasRollout)catch()
local isDrawing = false
local bitmapX = bitmapY = 512
local theCanvasBitmap = bitmap bitmapX bitmapY color:white
local currentPos = lastPos = [0,0]
rollout MicroPaint_CanvasRollout "MicroPaint"
(
bitmap theCanvas pos:[0,0] width:bitmapX height:bitmapY bitmap:theCanvasBitmap
colorpicker inkColor height:16 modal:false color:black across:2
spinner BrushSize"Size"range:[1,50,10] type:#integer fieldwidth:40
fn paintBrush pos = (setPixels theCanvasBitmap pos #(inkColor.color))
fn drawStroke lastPos pos =
(
currentPos = lastPos
deltaX = pos.x - lastPos.x
deltaY = pos.y - lastPos.y
maxSteps = amax #(abs(deltaX),abs(deltaY))
deltaStepX = deltaX / maxSteps
deltaStepY = deltaY / maxSteps
for i = 0 to maxSteps do
(
for b = -BrushSize.value/2 to BrushSize.value/2 do
for c = -BrushSize.value/2 to BrushSize.value/2 do
paintBrush (currentPos + [c,b])
currentPos += [deltaStepX, deltaStepY]
)
theCanvas.bitmap = theCanvasBitmap
)
on MicroPaint_CanvasRollout lbuttondown pos do
(
lastPos = pos
isDrawing = true
drawStroke lastPos pos
)
on MicroPaint_CanvasRollout lbuttonup pos do isDrawing = false
on MicroPaint_CanvasRollout mousemove pos do
(
if isDrawing do drawStroke lastPos pos
lastPos = pos
)
)
createDialog MicroPaint_CanvasRollout bitmapX (bitmapY+30)
)
--Code in italic has no changes since the previous version. macroScript MicroPaint category:"HowTo"
(
global MicroPaint_CanvasRollout
try(destroyDialog CanvasRollout)catch()
local isDrawing = false
local bitmapX = bitmapY = 512
local theCanvasBitmap = bitmap bitmapX bitmapY color:white
rollout MicroPaint_CanvasRollout "MicroPaint"
(
bitmap theCanvas pos:[0,0] width:bitmapX height:bitmapY bitmap:theCanvasBitmap colorpicker inkColor height:16 modal:false color:black across:2
This is the color picker which will be used to define the color of the paintbrush.
spinner BrushSize "Size" range:[1,50,10] type:#integer fieldwidth:40
This spinner will define the size of the paintbrush.
fn paintBrush pos = (setPixels theCanvasBitmap pos)
fn drawAPoint lastPos pos =
(
currentPos = lastPos
deltaX = pos.x - lastPos.x
deltaY = pos.y - lastPos.y
maxSteps = amax #(abs(deltaX),abs(deltaY))
deltaStepX = deltaX / maxSteps
deltaStepY = deltaY / maxSteps
for i = 0 to maxSteps do
( for b = -BrushSize.value/2 to BrushSize.value/2 do
(
This new loop will define the vertical size of the brush. It counts from minus half the size to plus half the size, full size altogether.
for c = -BrushSize.value/2 to BrushSize.value/2 do
This second loop defines the width of the paintbrush. It also loops from minus half the size to plus half the size, full size altogether.
paintBrush (currentPos + [c,b])
After each iteration of the c loop, we call our paint Brush function, passing the current position in the stroke plus the offset based on half the size of the brush and the b loop.
)
currentPos += [deltaStepX, deltaStepY]
)
theCanvas.bitmap = theCanvasBitmap
)
on MicroPaint_CanvasRollout lbuttondown pos do
(
lastPos = pos
isDrawing = true
drawAPoint lastPos pos
)
on MicroPaint_CanvasRollout lbuttonup pos do isDrawing = false
on MicroPaint_CanvasRollout mousemove pos do
(
if isDrawing do drawAPoint lastPos pos
lastPos = pos
) createDialog MicroPaint_CanvasRollout bitmapX (bitmapY+30)
To accommodate the new User Interface controls for the color and brush size, we have to increase the vertical size of the dialog by 30 pixels.
)
Previous Tutorial:
How To ... Develop a Bitmap Painting Tool - Strokes Support
Next Tutorial:
How To ... Develop a Bitmap Painting Tool - Airbrush and Shapes