void drawWithSpreadType(T_Rasterizer *ras, Bitmap<Pixel> *bitmap, BlendOp *blendOp, const PaintEngineState &state) { const Brush brush = state.brush; const float opacity = state.opacity; if (brush.type() == Malachite::BrushTypeColor) { ColorFiller filler(brush.pixel()); fill(ras, bitmap, blendOp, &filler, opacity); return; } QTransform fillShapeTransform = brush.transform() * state.shapeTransform; if (brush.type() == Malachite::BrushTypeImage) { if (transformIsIntegerTranslating(fillShapeTransform)) { QPoint offset(fillShapeTransform.dx(), fillShapeTransform.dy()); ImageFiller<T_SpreadType> filler(brush.image().constBitmap(), offset); fill(ras, bitmap, blendOp, &filler, opacity); return; } else { drawTransformedImageBrush<T_Rasterizer, T_SpreadType, Bitmap<Pixel> >(ras, bitmap, blendOp, brush.image().constBitmap(), opacity, fillShapeTransform.inverted(), state.imageTransformType); return; } } if (brush.type() == Malachite::BrushTypeSurface) { drawTransformedImageBrush<T_Rasterizer, T_SpreadType, Surface>(ras, bitmap, blendOp, brush.surface(), opacity, fillShapeTransform.inverted(), state.imageTransformType); return; } if (brush.type() == Malachite::BrushTypeLinearGradient) { LinearGradientShape info = brush.linearGradientShape(); if (info.transformable(fillShapeTransform)) { info.transform(fillShapeTransform); fillShapeTransform = QTransform(); } if (fillShapeTransform.isIdentity()) { LinearGradientMethod method(info.start, info.end); GradientGenerator<ColorGradient, LinearGradientMethod, T_SpreadType> gen(brush.gradient(), &method); Filler<GradientGenerator<ColorGradient, LinearGradientMethod, T_SpreadType>, false> filler(&gen); fill(ras, bitmap, blendOp, &filler, opacity); return; } else { LinearGradientMethod method(info.start, info.end); GradientGenerator<ColorGradient, LinearGradientMethod, T_SpreadType> gen(brush.gradient(), &method); Filler<GradientGenerator<ColorGradient, LinearGradientMethod, T_SpreadType>, true> filler(&gen, fillShapeTransform.inverted()); fill(ras, bitmap, blendOp, &filler, opacity); return; } } if (brush.type() == Malachite::BrushTypeRadialGradient) { RadialGradientShape info = brush.radialGradientShape(); if (info.transformable(fillShapeTransform)) { info.transform(fillShapeTransform); fillShapeTransform = QTransform(); } if (info.center == info.focal) { if (fillShapeTransform.isIdentity()) { RadialGradientMethod method(info.center, info.radius); GradientGenerator<ColorGradient, RadialGradientMethod, T_SpreadType> gen(brush.gradient(), &method); Filler<GradientGenerator<ColorGradient, RadialGradientMethod, T_SpreadType>, false> filler(&gen); fill(ras, bitmap, blendOp, &filler, opacity); return; } else { RadialGradientMethod method(info.center, info.radius); GradientGenerator<ColorGradient, RadialGradientMethod, T_SpreadType> gen(brush.gradient(), &method); Filler<GradientGenerator<ColorGradient, RadialGradientMethod, T_SpreadType>, true> filler(&gen, fillShapeTransform.inverted()); fill(ras, bitmap, blendOp, &filler, opacity); return; } } else { if (fillShapeTransform.isIdentity()) { FocalGradientMethod method(info.center, info.radius, info.focal); GradientGenerator<ColorGradient, FocalGradientMethod, T_SpreadType> gen(brush.gradient(), &method); Filler<GradientGenerator<ColorGradient, FocalGradientMethod, T_SpreadType>, false> filler(&gen); fill(ras, bitmap, blendOp, &filler, opacity); return; } else { FocalGradientMethod method(info.center, info.radius, info.focal); GradientGenerator<ColorGradient, FocalGradientMethod, T_SpreadType> gen(brush.gradient(), &method); Filler<GradientGenerator<ColorGradient, FocalGradientMethod, T_SpreadType>, true> filler(&gen, fillShapeTransform.inverted()); fill(ras, bitmap, blendOp, &filler, opacity); return; } } } }