CodeWarrior SquirrelEDIT, the 1Bit pixel editor for C developers

DW1992

New Tinkerer
Jul 19, 2026
8
18
3
Ontario, Canada.. eh!
www.dsbbs.ca
Hi Everyone,

Quite some time ago, I made this little helper tool while working on my 1Bit game, OPERATION : PewPew (a side scrolling space shooter) to make it easier to draw the game's sprites. 👾:alien:🛸

It's been added to (badly hacked together) over time with different features I found useful for developing my little games, etc..

After spending a lot of time working on Generic Block Game and my 68K BBStro, I wanted to get back to fixing up some of the bugs and adding / properly refining a few of the features in my ol' 1Bit pixel editor.


I'm happy to present... SquirrelEDIT Version 2.5
🥳

icon.png

A few exciting (to me at least... :p) changes and additions...

Version 2.5 has some exciting improvements and new features...

Dedicated EXPORT menu
- C Array
- QuickDraw bitmap
- QuickDraw PICT
- ICN# 32x32 resource

1 bit pattern palette
- 6 selectable patterns to use for fills, etc..
- A groovy little selection indicator arrow :sneaky:

Drastically improved accuracy for the 'rubber-band preview' tools.
- Circle
- Line
- Square

Export name validation (I'm actually quite proud of this part) :geek:
- A dialog window will open, unique to the export type, and ask for the name
you want to use for the sprite export.
- Validation on the name you type occurs to ensure the name meets valid C
formatting and character limits.
DISALLOW: Enter / Return, non-alpha-numeric characters, symbols.
ACTIVE REPLACEMENT: A 'space' is instantly replaced with an underscore.

MAX LENGTH: 63 characters is the MAX length of the entered name.
- The name previews and validates in real time, as you type.

Screenshots previewing the various functions, etc... are included below.

Grab the latest version (.SIT) directly from my Demozoo profile
HERE.

Runs great in the Basilisk II emulator and on real System 7.x machines.

As always,any comments, requests, suggestions, etc.. please shout!
Aaron/DW
Dark Systems BBS

16x16.png32x32.pngExport_Naming.pngexport_QDbitmap.pngExports.pngTransforms.pngExample doodles.png
 
  • Like
Reactions: nilobject and Mu0n

Mu0n

Active Tinkerer
Oct 29, 2021
700
674
93
Quebec
www.youtube.com
@DW1992 I'm checking out your tool - nicely done! This is a good basis for graphics.

I'm wondering about the export to a bitmap structure. I'm guessing BitMap have more elements than in THINK C/Symantec C++, would you agree?

1789571367152.png


The last 2 elements aren't present in what I have over here.

Suggestions:
-I don't expect the rich selection rectangle + lasso functionality of Macpaint, but at least a simple displacement of the canvas in all 4 directions would go a long way
-custom sizes, but where a multiple of 32 (for width) is suggested
-sprite sheets
-animation tests with play forward once, loop, bounce
-automated mask graphic generation (I have source code on that if you want) that will detect the edges of your sprite and draw something 1 pixel larger in all directions
 
Last edited:
  • Like
Reactions: DW1992

nilobject

Tinkerer
Nov 21, 2023
43
31
18
great work.... what mu0n said... just 1 pixel to the right, just 1
- transparency when copying to clipboard so folder icons aren't square
- copy/paste/cut
1789581811194.png
1789582405313.png

1789582588340.png
 
Last edited:
  • Like
Reactions: DW1992

DW1992

New Tinkerer
Jul 19, 2026
8
18
3
Ontario, Canada.. eh!
www.dsbbs.ca
Hi Everyone,

Wow! I never expected so many people to fool around with SquirrelEDIT! 🥳
Awesome doodles!

Mu0n, I'm flattered you draw a portrait of me... 😜
Nilobject... I think I need to make the canvas height 12 pixels taller... poor guy! 🙈 Not a good time to loose your head... guess he'll never be the head of a major corporation... 😂

Mu0n, You're right! I didn't even notice the trailing 0,0 elements! No, they aren't suppose to be part of the structure!
Thanks for catching that type-o! I can't believe I missed it! Staring at the screen far too long. lol

C:
    sprintf(p,
            "static BitMap %s = {\r"
            "    %s,\r"
            "    %d,\r"
            "    {0, 0, %d, %d},\r"
            "    0,\r"
            "    0\r"
            "};\r",
            cName,
            bitsName,
            gSize / 8,
            gSize,
            gSize);

Should have been...

C:
sprintf(p,
        "static BitMap %s = {\r"
        "    %s,\r"
        "    %d,\r"
        "    {0, 0, %d, %d}\r"
        "};\r",
        cName,
        bitsName,
        gSize / 8,
        gSize,
        gSize);

All fixed. :giggle:

Screenshot 2026-09-17 at 2.20.59 PM.png

C:
static unsigned char MoonMespriteBits[] = {
  0xFF,   0xFF,   0xFF,   0xFF,
  0xFF,   0xFF,   0xFD,   0xFF,
  0xFF,   0xBF,   0xF8,   0xFF,
  0xF7,   0xFF,   0xFD,   0xFF,
  0xF7,   0xFF,   0xFF,   0xF7,
  0xE3,   0xF8,   0x1F,   0xFF,
  0xF7,   0xE0,   0x07,   0xFF,
  0xF7,   0x80,   0x01,   0xFF,
  0xFF,   0x14,   0x00,   0xFF,
  0xFE,   0xAA,   0x80,   0x7F,
  0xFF,   0x5D,   0xD0,   0x3F,
  0xFF,   0xF6,   0xA8,   0x3F,
  0xFF,   0xFF,   0xD4,   0x1F,
  0xFF,   0xFF,   0x5A,   0x1F,
  0xFF,   0xFD,   0xED,   0x0F,
  0xFF,   0xFF,   0xF7,   0x8F,
  0xFF,   0xFF,   0xFB,   0x0F,
  0xFF,   0xFF,   0xFE,   0x8F,
  0xFF,   0xFF,   0xFD,   0x0F,
  0xFF,   0xFF,   0xF6,   0x8F,
  0xFF,   0xFF,   0xFD,   0x1F,
  0xFF,   0xFF,   0xFE,   0x9F,
  0xFF,   0xFF,   0xFF,   0x3F,
  0xDF,   0xFF,   0xFE,   0x3F,
  0xFF,   0xFF,   0xFE,   0x7F,
  0xFF,   0x7F,   0xFF,   0xF7,
  0xFE,   0xBF,   0xFF,   0xFF,
  0xFF,   0x7F,   0xDF,   0xFF,
  0xFF,   0xFF,   0xFF,   0xFF,
  0xFF,   0xF3,   0xFF,   0xDF,
  0xF7,   0xF3,   0xFF,   0xFF,
  0xFF,   0xFF,   0xFF,   0xFF
};

static BitMap MoonMesprite = {
    MoonMespriteBits,
    4,
    {0, 0, 32, 32}
};



When you say, "a simple displacement of the canvas in all 4 directions", do you mean a nudge feature?
Using the arrow keys will nudge your canvas in the direction pushed, wrapping the image around to the opposite edge.
If you mean something else, please talk slowly and let me know, I'm happy to try and implement it! :)

Custom size would be pretty easy, especially is kept as a multiple of 32. Everything could just scale accordingly.
I'm picturing either a slider (16x16 at one end and 256x256 etc..) at the other?
Or a text box that does a validity check on the number entered, since it's square.

Copy / Cut / Paste would be useful.
Let me play with this... ;)

Animation sheets is ambitious... but I kinda have an idea about how to maybe do it...
Again, Let me play with this... ;)
It may become part of the colour version 3.0 (hint hint).. just need free time. ⏳🙈

Mu0n, if you don't mind sharing your mask generation code, I'd love to have a look at it!
That's a great idea I'd love to try and implement.

Thanks again for all the encouragement and trying out the program!
I'm excited to try and get some of these ideas implemented in the next version!

Aaron/DW
 

nilobject

Tinkerer
Nov 21, 2023
43
31
18
Yes! Masks! make sure you can invert the mask, some engines use white as transparent.
can you think about sprite sheets? like maybe a binary resource that records details about the order of sprites and the frame size. eg like an array of ICON ID's with delays between each frame. would help immensely with animation.
thanks again
 

Mu0n

Active Tinkerer
Oct 29, 2021
700
674
93
Quebec
www.youtube.com
When you say, "a simple displacement of the canvas in all 4 directions", do you mean a nudge feature?
Using the arrow keys will nudge your canvas in the direction pushed, wrapping the image around to the opposite edge.
If you mean something else, please talk slowly and let me know, I'm happy to try and implement it! :)

Yes, 4 direction nudges. 1 click = 1 pixel movement.

Custom size would be pretty easy, especially is kept as a multiple of 32. Everything could just scale accordingly.
I'm picturing either a slider (16x16 at one end and 256x256 etc..) at the other?
Or a text box that does a validity check on the number entered, since it's square.

It doesn't have to be a square. Many sprites are tall rectangles.
If you want to leverage the fastest CopyBits usage possible, use an integer multiple of 32 for the width. There's no special gain for height.
A smaller gain can be had if it's a multiple of 16, but some performance is left on the table.

Good:
32x32
32x48
64x50
16x14
etc

Bad:
30x30
20x64
100x60
9x16


Mu0n, if you don't mind sharing your mask generation code, I'd love to have a look at it!
That's a great idea I'd love to try and implement.

it's in MyCalcMask from this source file I have in my 1bitdreammachine repo https://raw.githubusercontent.com/Mu0n/1bitdreammachine/refs/heads/main/Graphics/Sprites.c

repo: https://github.com/Mu0n/1bitdreammachine