protected void drawShadow(mxGraphicsCanvas2D canvas, mxCellState state, double rotation, boolean flipH,
			boolean flipV, mxRectangle bounds, double alpha, boolean filled)
	{
		// Requires background in generic shape for shadow, looks like only one
		// fillAndStroke is allowed per current path, try working around that
		// Computes rotated shadow offset
		double rad = rotation * Math.PI / 180;
		double cos = Math.cos(-rad);
		double sin = Math.sin(-rad);
		mxPoint offset = mxUtils.getRotatedPoint(new mxPoint(mxConstants.SHADOW_OFFSETX, mxConstants.SHADOW_OFFSETY), cos, sin);
		
		if (flipH)
		{
			offset.setX(offset.getX() * -1);
		}
		
		if (flipV)
		{
			offset.setY(offset.getY() * -1);
		}
		
		// TODO: Use save/restore instead of negative offset to restore (requires fix for HTML canvas)
		canvas.translate(offset.getX(), offset.getY());
		
		// Returns true if a shadow has been painted (path has been created)
		if (drawShape(canvas, state, bounds, true))
		{
			canvas.setAlpha(mxConstants.STENCIL_SHADOW_OPACITY * alpha);
			// TODO: Implement new shadow
			//canvas.shadow(mxConstants.STENCIL_SHADOWCOLOR, filled);
		}

		canvas.translate(-offset.getX(), -offset.getY());
	}