blob: 2a53dcbfa3ce47e7f42c0cdc615b694de0f3d642 [file] [log] [blame]
import '../color.dart';
import '../image.dart';
import '../filter/gaussian_blur.dart';
import '../filter/remap_colors.dart';
import '../filter/scale_rgba.dart';
import '../transform/copy_into.dart';
/// Create a drop-shadow effect for the image.
Image dropShadow(Image src, int hShadow, int vShadow, int blur,
{int shadowColor = 0xa0000000}) {
if (blur < 0) {
blur = 0;
}
int shadowWidth = src.width + blur * 2;
int shadowHeight = src.height + blur * 2;
int shadowOffsetX = -blur;
int shadowOffsetY = -blur;
int newImageWidth = shadowWidth;
int newImageHeight = shadowHeight;
int imageOffsetX = 0;
int imageOffsetY = 0;
if (shadowOffsetX + hShadow < 0) {
imageOffsetX = -(shadowOffsetX + hShadow);
shadowOffsetX = -shadowOffsetX;
newImageWidth = imageOffsetX;
}
if (shadowOffsetY + vShadow < 0) {
imageOffsetY = -(shadowOffsetY + vShadow);
shadowOffsetY = -shadowOffsetY;
newImageHeight += imageOffsetY;
}
if (shadowWidth + shadowOffsetX + hShadow > newImageWidth) {
newImageWidth = shadowWidth + shadowOffsetX + hShadow;
}
if (shadowHeight + shadowOffsetY + vShadow > newImageHeight) {
newImageHeight = shadowHeight + shadowOffsetY + vShadow;
}
Image dst = Image(newImageWidth, newImageHeight);
dst.fill(0x00ffffff);
copyInto(dst, src, dstX: shadowOffsetX, dstY: shadowOffsetY);
remapColors(dst, red: ALPHA, green: ALPHA, blue: ALPHA);
scaleRGBA(dst, getRed(shadowColor), getGreen(shadowColor),
getBlue(shadowColor), getAlpha(shadowColor));
gaussianBlur(dst, blur);
copyInto(dst, src, dstX: imageOffsetX, dstY: imageOffsetY);
return dst;
}