public void draw(UShape ushape, double x, double y, ColorMapper mapper, UParam param, Graphics2D g2d) {
		g2d.setStroke(new BasicStroke((float) param.getStroke().getThickness()));
		final URectangle shape = (URectangle) ushape;
		final double rx = shape.getRx();
		final double ry = shape.getRy();
		final Shape rect;
		if (rx == 0 && ry == 0) {
			rect = new Rectangle2D.Double(x, y, shape.getWidth(), shape.getHeight());
		} else {
			rect = new RoundRectangle2D.Double(x, y, shape.getWidth(), shape.getHeight(), rx, ry);
		}

		visible.ensureVisible(x, y);
		visible.ensureVisible(x + shape.getWidth(), y + shape.getHeight());

		// Shadow
		if (shape.getDeltaShadow() != 0) {
			drawShadow(g2d, rect, shape.getDeltaShadow(), dpiFactor);
		}

		final HtmlColor back = param.getBackcolor();
		if (back instanceof HtmlColorGradient) {
			final GradientPaint paint = getPaintGradient(x, y, mapper, shape, back);
			g2d.setPaint(paint);
			g2d.fill(rect);

			if (param.getColor() != null && param.getColor() instanceof HtmlColorGradient == false) {
				g2d.setColor(mapper.getMappedColor(param.getColor()));
				DriverLineG2d.manageStroke(param, g2d);
				g2d.draw(rect);
			}

		} else {
			if (param.getBackcolor() != null) {
				g2d.setColor(mapper.getMappedColor(param.getBackcolor()));
				DriverLineG2d.manageStroke(param, g2d);
				managePattern(param, g2d);
				g2d.fill(rect);
			}
			if (param.getColor() != null && param.getColor().equals(param.getBackcolor()) == false) {
				g2d.setColor(mapper.getMappedColor(param.getColor()));
				DriverLineG2d.manageStroke(param, g2d);
				g2d.draw(rect);
			}
		}
	}