Add Images::GenerateShadow.
This commit is contained in:
parent
aa16cd0c16
commit
48ebd65323
2 changed files with 53 additions and 0 deletions
|
|
@ -878,6 +878,53 @@ QImage GenerateLinearGradient(
|
|||
return result;
|
||||
}
|
||||
|
||||
QImage GenerateShadow(
|
||||
int height,
|
||||
int topAlpha,
|
||||
int bottomAlpha,
|
||||
QColor color) {
|
||||
Expects(topAlpha >= 0 && topAlpha < 256);
|
||||
Expects(bottomAlpha >= 0 && bottomAlpha < 256);
|
||||
Expects(height * style::DevicePixelRatio() < 65536);
|
||||
|
||||
const auto base = (uint32(color.red()) << 16)
|
||||
| (uint32(color.green()) << 8)
|
||||
| uint32(color.blue());
|
||||
const auto premultiplied = (topAlpha == bottomAlpha) || !base;
|
||||
auto result = QImage(
|
||||
QSize(1, height * style::DevicePixelRatio()),
|
||||
(premultiplied
|
||||
? QImage::Format_ARGB32_Premultiplied
|
||||
: QImage::Format_ARGB32));
|
||||
if (topAlpha == bottomAlpha) {
|
||||
color.setAlpha(topAlpha);
|
||||
result.fill(color);
|
||||
return result;
|
||||
}
|
||||
constexpr auto kShift = 16;
|
||||
constexpr auto kMultiply = (1U << kShift);
|
||||
const auto values = std::abs(topAlpha - bottomAlpha);
|
||||
const auto rows = uint32(result.height());
|
||||
const auto step = (values * kMultiply) / (rows - 1);
|
||||
const auto till = rows * uint32(step);
|
||||
Assert(result.bytesPerLine() == sizeof(uint32));
|
||||
auto ints = reinterpret_cast<uint32*>(result.bits());
|
||||
if (topAlpha < bottomAlpha) {
|
||||
for (auto i = uint32(0); i != till; i += step) {
|
||||
*ints++ = base | ((topAlpha + (i >> kShift)) << 24);
|
||||
}
|
||||
} else {
|
||||
for (auto i = uint32(0); i != till; i += step) {
|
||||
*ints++ = base | ((topAlpha - (i >> kShift)) << 24);
|
||||
}
|
||||
}
|
||||
if (!premultiplied) {
|
||||
result = std::move(result).convertToFormat(
|
||||
QImage::Format_ARGB32_Premultiplied);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void prepareCircle(QImage &img) {
|
||||
Assert(!img.isNull());
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,12 @@ namespace Images {
|
|||
const std::vector<QColor> &colors,
|
||||
int rotation = 0);
|
||||
|
||||
[[nodiscard]] QImage GenerateShadow(
|
||||
int height,
|
||||
int topAlpha,
|
||||
int bottomAlpha,
|
||||
QColor color = QColor(0, 0, 0));
|
||||
|
||||
[[nodiscard]] const std::array<QImage, 4> &CornersMask(
|
||||
ImageRoundRadius radius);
|
||||
[[nodiscard]] std::array<QImage, 4> PrepareCorners(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue