Casting the result of these calls to malloc should be all that is required to make cabi compilable as C++.
Without these casts cabi won't compile as C++ because in C++ `void *` is not implicitly convertible to other data types.
LodePNG already has C++ compatibility.
The project’s images have been run through lossless optimization.
It will not affect the project but saves a few bytes for each
download of the repository.
See: https://github.com/ace-dent/pngslim
The major version number has been incremented only because there's a
chance that a sketch that sets text wrap on will behave differently,
due to the changes in the way wrapping is now handled.
An image converted using the cabi utility must have a height that is
a multiple of 8 pixels. An error is now reported if not.
Also, the README.md file for cabi was updated with this requirement.
Files arduboy_logo.png and arduboy_screen.png had some pixels that
were a dark gray color instead of fully black. The images now contain
only fully black and fully white pixels.
The variables currentButtonState and previousButtonState used by
pollButtons(), justPressed() and justReleased() have been made public.
This allows them to be manipulated if circumstances require it.
The documentation added for previousButtonState includes an example.
This is mainly to reduce code size.
The write() function in class Arduboy2 has to remain virtual,
so functions that result in it eventually being called could
not be made static.
The members of the Point and Rect structures could not be made static
due to their intended use as having multiple instances.
Also to reduce code size, bootLogoExtra() was made non-virtual.
This meant that the begin() and bootLogo...() functions in the
Arduboy2Base class had to have duplicate or equivalent functions
added to the Arduboy2 class.
Related documentation was updated and some minor changes were made to
non-related documentation.
The library functions to get the dimensions of text characters replace
values hard coded in the sketch.
Also changed some #define constants to constexpr variables.
The actual operation of the sketch is unchanged.
- Functions write() and drawChar() were refactored for smaller code
size and to make text wrapping operate more like what would normally
be expected.
- A new flag variable, textRaw, has been added, along with functions
setTextRawMode() and getTextRawMode() to set and read it.
When set, the write() function will render the value \n (0x0a) as
an "inverse white circle" instead of handling it as a newline and
render value \r (0x0d) as a "musical eighth note" instead of
ignoring it.
- Spacing added at the end of each character is no longer factored in
when determining if a character will fit on screen at the end of
a line.
- Checking if line wrap is neccessary is done before drawing a
character, instead of doing it after drawing to prepare for the
next character. This fixed a problem with requested line feeds
interacting with wrapping, resulting in unexpected blank lines.
- Fixed a bug that caused the drawing of characters with a transparent
background to not work properly. (This is selected by setting the
background color to be the same as the text color.)
- Added new functions getCharacterWidth() getCharacterHeight()
getCharacterSpacing() getLineSpacing() to programmatically get
the dimensions of a character, given the desired text size.
- Functions write() and drawChar() are now able to render a font of
any character size, and with any character and line spacing, by
setting variables characterWidth characterHeight characterSpacing
and lineSpacing, and providing a matching font array. This doesn't
affect their use with this library but has been done for the sake
of code portability.
(Compiled output is identical to previous)
- Made enumerations scoped
- Changed all type byte to uint8_t
- Changed all type boolean to bool
- Changed some type unsigned int to uint16_t
- Changed C-style casts to static_cast
Recent releases of Doxygen have problems with using markdown within
markdown headers. Headers in README.md containing emphasis were
changed to only plain text.
Suggested by @yyyc514 (Josh Goebel)
The generateRandomSeed() function was moved from the Arduboy2Base class
to the Arduboy2Core class, since it deals directly with hardware.
It was also made static.
Some related documentation was changed.
- Use precomputed constant values directly usable by the Beep class
for tone generation arguments.
This reduces program size significantly.
- Use the constexpr specifier for all constants.
No actual code changes.
- Changed colors hardcoded as 0 and 1 to BLACK and WHITE.
- Added a comment describing EEPROM space used.
- Made placement of braces and else statements consistent.
- Added spaces between some function call arguments.
- Fixed some spelling mistakes in comments.
- Removed commented out diagnostic code.
- Updated "modifications" comment.
Issues discovered and fixes developed by @Pharap
The Sprites classes relied on the behavior of 16 bit integer arithmetic
for operations that cause an overflow; specifically (ofs + WIDTH)
calculations for an index into the screen buffer. This would cause
problems if the code was ported to an environment in which the basic
integer type (i.e. "int") is larger than 16 bits.
Also, there was code that assumed little endianness for a technique
used to retrieve the high byte a 16 bit value. This would cause
problems if the code was ported to a big endian architecture.
The changes made are strictly for the sake of improved portability and
better programming practices. They don’t affect code compiled for the
Arduboy in any way.
Suggested by @MrBlinky
Same as SPItransfer() but also returns the byte received.
Provided for use with homemade or expanded units that have had
additional peripherals added to the SPI bus that are capable of
sending data.
Changed the writeUnitName() parameter from
"char* name" to "const char* name".
This will prevent warnings or errors when a string literal or
an array of type "const char" is passed to it.
The lcdBootProgram[] array, containing the commands to initialize
the OLED display, isn't considered to be part of the API.
To enforce this, and to avoid the possibility of conflicts from
other code using the same name, it has been changed from being a
global variable to a protected member of the Arduboy2Core class.
Suggested and developed by @Pharap
The mainNoUSB() function was never intended to be used directly in
sketches. To help prevent this, it has been made a private member of
a new class, Arduboy2NoUSB, which declares main() as a friend.
The ARDUBOY_NO_USB macro has been modified appropriately.
The Arduboy2Core class now inherits Arduboy2NoUSB, for sketches that
improperly have their own main() which calls the old version of
mainNoUSB() instead of using the ARDUBOY_NO_USB macro.
Also added file sample.png in the cabi directory, which is used
for the example sketch in the Cabi README.md file
Also added a note referring to Cabi in the documentation for
drawCompressed()
Compiler warnings generated by cabi.c were mostly due to
signed/unsigned mismatches and unused variables. Unused variables
were removed and most type int variables were changed to unsigned,
since there is no signed math or negative numbers required.
More detailed error messages are reported by using the LodePNG
capability to provide text descriptions for its error codes.
The default output array name prefix was changed
from "out" to "compressed_image".
Changed the on/off opaque/transparent thresholds from 128 to 127,
the half way point, because it makes more sense.
Added a program description to the usage output given when no
arguments are provided.
Other unused code was removed and some code was refactored.
Added lodepng.c (renamed from lodepng.cpp), lodepng.h and LICENSE from
the LodePNG project by Lode Vandevenne.
https://github.com/lvandeve/lodepng
Since this code is licensed separately from the cabi code, it has been
placed in its own subdirectory named lodepng.
cabi.c and README.md have been modified for the LodePNG file location.
cabi is a command line program written in C. Its purpose is to read
a PNG file containing a bitmap image and convert it to C/C++ code
suitable for use with the drawCompressed() function.
cabi was published by the Team A.R.G. organization. This organization
has been dissolved and its presence on the internet has been removed,
thus public access to cabi from them is no longer available.
A copy of the relevant cabi files has been added under the extras
directory to maintain a method of creating drawCompressed() compatible
bitmaps.