84 lines
3.0 KiB
C++
84 lines
3.0 KiB
C++
/******************************************************************************
|
|
* Copyright (c) 2018(-2023) STMicroelectronics.
|
|
* All rights reserved.
|
|
*
|
|
* This file is part of the TouchGFX 4.21.2 distribution.
|
|
*
|
|
* This software is licensed under terms that can be found in the LICENSE file in
|
|
* the root directory of this software component.
|
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
|
*
|
|
*******************************************************************************/
|
|
|
|
#include <platform/driver/lcd/LCD2bpp.hpp>
|
|
#include <touchgfx/lcd/LCD.hpp>
|
|
#include <touchgfx/transforms/DisplayTransformation.hpp>
|
|
#include <touchgfx/widgets/canvas/PainterGRAY2Bitmap.hpp>
|
|
|
|
namespace touchgfx
|
|
{
|
|
void PainterGRAY2Bitmap::setBitmap(const Bitmap& bmp)
|
|
{
|
|
AbstractPainterBitmap::setBitmap(bmp);
|
|
assert((bitmap.getId() == BITMAP_INVALID || bitmap.getFormat() == Bitmap::GRAY2) && "PainterGRAY2Bitmap only works with GRAY2 bitmaps");
|
|
assert(bitmap.getId() == BITMAP_INVALID || bitmapData);
|
|
bitmapExtraData = bitmap.getExtraData();
|
|
}
|
|
|
|
void PainterGRAY2Bitmap::paint(uint8_t* destination, int16_t offset, int16_t widgetX, int16_t widgetY, int16_t count, uint8_t alpha) const
|
|
{
|
|
if (!adjustBitmapXY(widgetX, widgetY, offset, count))
|
|
{
|
|
return;
|
|
}
|
|
|
|
const int32_t rowSkip = widgetY * ((bitmapRect.width + 3) / 4);
|
|
const uint8_t* bitmapPointer = bitmapData + rowSkip;
|
|
if (bitmapExtraData)
|
|
{
|
|
const uint8_t* alphaPointer = bitmapExtraData + rowSkip;
|
|
do
|
|
{
|
|
const uint8_t bitmapGray = LCD2bpp::getPixel(bitmapPointer, widgetX);
|
|
const uint8_t a = LCD::div255(alpha * (LCD2bpp::getPixel(alphaPointer, widgetX) * 0x55));
|
|
|
|
if (a == 0xFF)
|
|
{
|
|
LCD2bpp::setPixel(destination, offset, bitmapGray);
|
|
}
|
|
else
|
|
{
|
|
const uint8_t framebufferGray = LCD2bpp::getPixel(destination, offset);
|
|
LCD2bpp::setPixel(destination, offset, LCD::div255((bitmapGray * a + framebufferGray * (0xFF - a)) * 0x55) >> 6);
|
|
}
|
|
widgetX++;
|
|
widgetX %= bitmapRect.width;
|
|
offset++;
|
|
} while (--count != 0);
|
|
}
|
|
else if (alpha == 0xFF)
|
|
{
|
|
do
|
|
{
|
|
const uint8_t bitmapGray = LCD2bpp::getPixel(bitmapPointer, widgetX);
|
|
LCD2bpp::setPixel(destination, offset, bitmapGray);
|
|
widgetX++;
|
|
widgetX %= bitmapRect.width;
|
|
offset++;
|
|
} while (--count != 0);
|
|
}
|
|
else
|
|
{
|
|
do
|
|
{
|
|
const uint8_t bitmapGray = LCD2bpp::getPixel(bitmapPointer, widgetX);
|
|
const uint8_t framebufferGray = LCD2bpp::getPixel(destination, offset);
|
|
LCD2bpp::setPixel(destination, offset, LCD::div255((bitmapGray * alpha + framebufferGray * (0xFF - alpha)) * 0x55) >> 6);
|
|
widgetX++;
|
|
widgetX %= bitmapRect.width;
|
|
offset++;
|
|
} while (--count != 0);
|
|
}
|
|
}
|
|
} // namespace touchgfx
|