From abd95bcf709dad8d88c0992aa44cfa1cb858db31 Mon Sep 17 00:00:00 2001 From: martinwork Date: Wed, 6 Mar 2019 14:27:02 +0000 Subject: [PATCH] MicroBitDisplay::animate - Support negative stride startingPosition refers to the leading edge. --- source/drivers/MicroBitDisplay.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/source/drivers/MicroBitDisplay.cpp b/source/drivers/MicroBitDisplay.cpp index d0d7b844..1dfbbd81 100644 --- a/source/drivers/MicroBitDisplay.cpp +++ b/source/drivers/MicroBitDisplay.cpp @@ -393,7 +393,10 @@ void MicroBitDisplay::updateScrollImage() void MicroBitDisplay::updateAnimateImage() { //wait until we have rendered the last position to give a continuous animation. - if (scrollingImagePosition <= -scrollingImage.getWidth() + (MICROBIT_DISPLAY_WIDTH + scrollingImageStride) && scrollingImageRendered) + if ( ( scrollingImageStride <= 0 + ? scrollingImagePosition <= -scrollingImage.getWidth() + (MICROBIT_DISPLAY_WIDTH + scrollingImageStride) + : scrollingImagePosition >= scrollingImageStride) + && scrollingImageRendered) { if (animationMode == ANIMATION_MODE_ANIMATE_IMAGE_WITH_CLEAR) this->clear(); @@ -404,8 +407,16 @@ void MicroBitDisplay::updateAnimateImage() return; } - if(scrollingImagePosition > 0) - image.shiftLeft(-scrollingImageStride); + if ( scrollingImageStride <= 0) + { + if(scrollingImagePosition > 0) + image.shiftLeft(-scrollingImageStride); + } + else + { + if ( scrollingImagePosition + scrollingImage.getWidth() < MICROBIT_DISPLAY_WIDTH) + image.shiftRight( scrollingImageStride); + } image.paste(scrollingImage, scrollingImagePosition, 0, 0); @@ -931,7 +942,11 @@ int MicroBitDisplay::animateAsync(MicroBitImage image, int delay, int stride, in stride = -stride; //calculate starting position which is offset by the stride - scrollingImagePosition = (startingPosition == MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS) ? MICROBIT_DISPLAY_WIDTH + stride : startingPosition; + if ( stride <= 0) + scrollingImagePosition = (startingPosition == MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS) ? MICROBIT_DISPLAY_WIDTH + stride : startingPosition; + else + scrollingImagePosition = (startingPosition == MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS) ? stride - image.getWidth() : startingPosition - image.getWidth() + 1; + scrollingImageStride = stride; scrollingImage = image; scrollingImageRendered = false;