pxt-calliope/libs/core/images.cpp

201 lines
5.0 KiB
C++
Raw Normal View History

2016-11-30 06:55:37 +01:00
#include "pxt.h"
2016-04-02 04:55:51 +02:00
PXT_VTABLE(RefMImage, ValType::Object)
2016-04-02 04:55:51 +02:00
RefMImage::RefMImage(ImageData *d) : PXT_VTABLE_INIT(RefMImage), img(d) {
img->incr();
2016-04-02 04:55:51 +02:00
}
void RefMImage::destroy(RefMImage *t) {
t->img->decr();
}
2016-04-13 02:10:37 +02:00
void RefMImage::print(RefMImage *t) {
DMESG("RefMImage %p size=%d x %d", t, t->img->width, t->img->height);
}
void RefMImage::makeWritable() {
if (img->isReadOnly()) {
MicroBitImage i(img);
img = i.clone().leakData();
2016-04-13 02:10:37 +02:00
}
}
void RefMImage::scan(RefMImage *t) {}
2016-04-02 04:55:51 +02:00
unsigned RefMImage::gcsize(RefMImage *t) {
return (sizeof(*t) + 3) >> 2;
}
2016-04-02 04:55:51 +02:00
/**
* Creation, manipulation and display of LED images.
*/
//% color=#7600A8 weight=31 icon="\uf03e"
//% advanced=true
namespace images {
/**
* Creates an image that fits on the LED screen.
*/
//% weight=75 help=images/create-image
//% blockId=device_build_image block="create image"
//% parts="ledmatrix"
Image createImage(ImageLiteral_ leds) {
return NEW_GC(RefMImage, imageBytes(leds));
}
2016-04-02 04:55:51 +02:00
/**
* Creates an image with 2 frames.
*/
//% weight=74 help=images/create-big-image
//% blockId=device_build_big_image block="create big image" imageLiteral=2
//% parts="ledmatrix"
Image createBigImage(ImageLiteral_ leds) {
return createImage(leds);
}
//%
Buffer charCodeBuffer(int charCode) {
if(charCode < MICROBIT_FONT_ASCII_START || charCode > MICROBIT_FONT_ASCII_END)
return NULL;
#if MICROBIT_CODAL
auto font = codal::BitmapFont::getSystemFont();
#else
auto font = MicroBitFont::getSystemFont();
#endif
const int offset = (charCode - MICROBIT_FONT_ASCII_START) * 5;;
const uint8_t* charBuffer = font.characters + offset;
return PXT_CREATE_BUFFER(charBuffer, 5);
}
} // namespace images
2016-04-02 04:55:51 +02:00
namespace ImageMethods {
/**
* Plots the image at a given column to the screen
*/
//% help=images/plot-image
//% parts="ledmatrix"
void plotImage(Image i, int xOffset = 0) {
uBit.display.print(MicroBitImage(i->img), -xOffset, 0, 0, 0);
}
2016-04-02 04:55:51 +02:00
/**
* Shows an frame from the image at offset ``x offset``.
* @param xOffset column index to start displaying the image
V4 updates for beta testing (#147) * change simulator svg * change radio image * Remove google fonts cdn * change color of 'advanced' button * font fix * font fix 2 * display fix * change fullsceen simulator bg * Continuous servo * handle continuous state * adding shims * update rendering for continuous servos * fixing sim * fix sig * typo * fix sim * bump pxt * bump pxt * rerun travis * Input blocks revision - add Button and Pin event types - merge onPinPressed & onPinReleased in new onPinEvent function - create new onButtonEvent function * update input blocks in docs and tests * remove device_pin_release block * Hide DAL.x behind Enum * bring back deprecated blocks, but hide them * shims and locales files * fix input.input. typing * remove buildpr * bump V3 * update simulator aspect ratio * add Loudness Block * revoke loudness block * Adds soundLevel To be replaced by pxt-common-packages when DAL is updated. * Remove P0 & P3 from AnalogPin * Fix Sound and replace AnalogPin.P0 * remove approved extensions * V4 Updates from remote Repo * locales * add storage functions * fix storage functions * fix int/float values * decrease decimal precision * reorder blocks * Update BLE Settings and Storage Blocks * Fetch MicroBit changes up to v4.0.18 * Update timing for LED Matrix usage * use 32kb ram (mini v2) * resize gatt table * Revert "use 32kb ram (mini v2)" This reverts commit 4b15592f0f0eacfc1a2e826f34682bc589faf16e. * fix missleading indentation * add support for 32kb and 16kb ram * only MIT extensions in preferredRepos * remove extensions without MIT License file * add updated extensions * add extensions with MIT license Co-authored-by: Juri <gitkraken@juriwolf.de> Co-authored-by: Juri <info@juriwolf.de>
2022-03-22 17:36:19 +01:00
* @param interval time in milliseconds to pause after drawing
*/
//% help=images/show-image weight=80 blockNamespace=images
V4 updates for beta testing (#147) * change simulator svg * change radio image * Remove google fonts cdn * change color of 'advanced' button * font fix * font fix 2 * display fix * change fullsceen simulator bg * Continuous servo * handle continuous state * adding shims * update rendering for continuous servos * fixing sim * fix sig * typo * fix sim * bump pxt * bump pxt * rerun travis * Input blocks revision - add Button and Pin event types - merge onPinPressed & onPinReleased in new onPinEvent function - create new onButtonEvent function * update input blocks in docs and tests * remove device_pin_release block * Hide DAL.x behind Enum * bring back deprecated blocks, but hide them * shims and locales files * fix input.input. typing * remove buildpr * bump V3 * update simulator aspect ratio * add Loudness Block * revoke loudness block * Adds soundLevel To be replaced by pxt-common-packages when DAL is updated. * Remove P0 & P3 from AnalogPin * Fix Sound and replace AnalogPin.P0 * remove approved extensions * V4 Updates from remote Repo * locales * add storage functions * fix storage functions * fix int/float values * decrease decimal precision * reorder blocks * Update BLE Settings and Storage Blocks * Fetch MicroBit changes up to v4.0.18 * Update timing for LED Matrix usage * use 32kb ram (mini v2) * resize gatt table * Revert "use 32kb ram (mini v2)" This reverts commit 4b15592f0f0eacfc1a2e826f34682bc589faf16e. * fix missleading indentation * add support for 32kb and 16kb ram * only MIT extensions in preferredRepos * remove extensions without MIT License file * add updated extensions * add extensions with MIT license Co-authored-by: Juri <gitkraken@juriwolf.de> Co-authored-by: Juri <info@juriwolf.de>
2022-03-22 17:36:19 +01:00
//% blockId=device_show_image_offset block="show image %sprite(myImage)|at offset %offset ||and interval (ms) %interval"
//% interval.defl=400
//% blockGap=8 parts="ledmatrix" async
void showImage(Image sprite, int xOffset, int interval = 400) {
uBit.display.print(MicroBitImage(sprite->img), -xOffset, 0, 0, interval);
}
2016-04-13 02:10:37 +02:00
/**
* Draws the ``index``-th frame of the image on the screen.
* @param xOffset column index to start displaying the image
*/
//% help=images/plot-frame weight=80
//% parts="ledmatrix"
void plotFrame(Image i, int xOffset) {
// TODO showImage() used in original implementation
plotImage(i, xOffset * i->img->height);
}
2016-04-13 02:10:37 +02:00
/**
* Scrolls an image .
* @param frameOffset x offset moved on each animation step, eg: 1, 2, 5
* @param interval time between each animation step in milli seconds, eg: 200
*/
//% help=images/scroll-image weight=79 async blockNamespace=images
//% blockId=device_scroll_image
//% block="scroll image %sprite(myImage)|with offset %frameoffset|and interval (ms) %delay"
//% blockGap=8 parts="ledmatrix"
void scrollImage(Image id, int frameOffset, int interval) {
MicroBitImage i(id->img);
uBit.display.animate(i, interval, frameOffset, MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS, 0);
}
2016-04-13 02:10:37 +02:00
/**
* Sets all pixels off.
*/
//% help=images/clear
//% parts="ledmatrix"
void clear(Image i) {
i->makeWritable();
MicroBitImage(i->img).clear();
}
2016-04-13 02:10:37 +02:00
/**
* Sets a specific pixel brightness at a given position
*/
//%
//% parts="ledmatrix"
void setPixelBrightness(Image i, int x, int y, int value) {
i->makeWritable();
MicroBitImage(i->img).setPixelValue(x, y, value);
}
2016-04-13 02:10:37 +02:00
/**
* Gets the pixel brightness ([0..255]) at a given position
*/
//%
//% parts="ledmatrix"
int pixelBrightness(Image i, int x, int y) {
int pix = MicroBitImage(i->img).getPixelValue(x, y);
if (pix < 0)
return 0;
return pix;
}
2016-04-13 02:10:37 +02:00
/**
* Gets the width in columns
*/
//% help=functions/width
int width(Image i) {
return i->img->width;
}
2016-04-13 02:10:37 +02:00
/**
* Gets the height in rows (always 5)
*/
//%
int height(Image i) {
return i->img->height;
}
/**
* Set a pixel state at position ``(x,y)``
* @param x pixel column
* @param y pixel row
* @param value pixel state
*/
//% help=images/set-pixel
//% parts="ledmatrix"
void setPixel(Image i, int x, int y, bool value) {
setPixelBrightness(i, x, y, value ? 255 : 0);
}
/**
* Get the pixel state at position ``(x,y)``
* @param x pixel column
* @param y pixel row
*/
//% help=images/pixel
//% parts="ledmatrix"
bool pixel(Image i, int x, int y) {
return pixelBrightness(i, x, y) > 0;
}
/**
* Show a particular frame of the image strip.
* @param frame image frame to show
*/
//% weight=70 help=images/show-frame
//% parts="ledmatrix"
void showFrame(Image i, int frame, int interval = 400) {
showImage(i, frame * i->img->height, interval);
2016-04-02 04:55:51 +02:00
}
} // namespace ImageMethods