Common Custom renderers
Common_CustomRenderers_CSharp\App_Code\Utility.cs
// Copyright 2011 ESRI
// 
// All rights reserved under the copyright laws of the United States
// and applicable international laws, treaties, and conventions.
// 
// You may freely redistribute and use this sample code, with or
// without modification, provided you include the original copyright
// notice and use restrictions.
// 
// See the use restrictions.
// 

namespace ESRI.ADF.Samples.Renderers
{
  /// <summary>
  /// Class containing various helper methods for rendering features
  /// </summary>
  internal class Utility
  {
    /// <summary>
    /// Converts a transparency percentage to a 0-255 alpha value
    /// </summary>
    /// <param name="percentage">Percentage to convert</param>
    /// <returns>Corresponding alpha value, as a byte</returns>
    public static byte TransparencyToAlpha(double percentage)
    {
      double value = 0;
      value = 100 - percentage;
      value = value / 100;
      value = value * 255;
      if (value < 0) value = 0;
      else if (value > 255) value = 255;
      return (byte)value;
    }

        /// <summary>
        /// Converts a Web ADF polygon to a GDI+ 2D graphics path
        /// </summary>
        /// <param name="adfPolygon">Polygon to convert</param>
        /// <returns>The corresponding graphics path</returns>
    public static System.Drawing.Drawing2D.GraphicsPath PolygonToPath(
            ESRI.ArcGIS.ADF.Web.Geometry.Polygon adfPolygon)
    {
      return Utility.PolygonToPath(adfPolygon, 0, 0);
    }
    
        /// <summary>
        /// Converts a Web ADF polygon to a GDI+ 2D graphics path, offset by the specified amounts
        /// </summary>
        /// <param name="adfPolygon"></param>
        /// <param name="offsetX"></param>
        /// <param name="offsetY"></param>
        /// <returns>The corresponding graphics path</returns>
    public static System.Drawing.Drawing2D.GraphicsPath PolygonToPath(
            ESRI.ArcGIS.ADF.Web.Geometry.Polygon adfPolygon, int offsetX, int offsetY)
    {
      System.Drawing.Drawing2D.GraphicsPath graphicsPath = 
                new System.Drawing.Drawing2D.GraphicsPath();

            // Loop through the polygon's rings, adding each to the graphics path
      foreach (ESRI.ArcGIS.ADF.Web.Geometry.Ring adfRing in adfPolygon.Rings)
      {
                // Add the current ring to the path
        graphicsPath.AddPolygon(pointCollectionToPointArray(adfRing.Points, offsetX, offsetY));

                // Add each of the current ring's holes to the path
        foreach (ESRI.ArcGIS.ADF.Web.Geometry.Hole ring in adfRing.Holes)
          graphicsPath.AddPolygon(pointCollectionToPointArray(ring.Points, offsetX, offsetY));
      }
      return graphicsPath;
    }
    
        /// <summary>
        /// Converts a Web ADF polyline to a GDI+ 2D graphics path
        /// </summary>
        /// <param name="polyline">The polyline to convert</param>
        /// <returns>The corresponding graphics path</returns>
    public static System.Drawing.Drawing2D.GraphicsPath PolylineToPath(ESRI.ArcGIS.ADF.Web.Geometry.Polyline adfPolyline)
    {
      System.Drawing.Drawing2D.GraphicsPath graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();

      // Loop through the paths in the passed-in polyline, adding each to the graphics path
            foreach (ESRI.ArcGIS.ADF.Web.Geometry.Path adfPath in adfPolyline.Paths)
      {
        graphicsPath.AddLines(pointCollectionToPointArray(adfPath.Points, 0, 0));
      }
      return graphicsPath;
    }

        /// <summary>
        /// Draws a GDI+ polygon on the specified surface corresponding to the specified Web ADF polygon.
        /// Applies a solid fill with the specified color and transparency and offsets the polygon by the
        /// specified amount.
        /// </summary>
    public static void FillPolygon(System.Drawing.Graphics graphics, 
            ESRI.ArcGIS.ADF.Web.Geometry.Polygon adfPolygon, System.Drawing.Color color, int transparency, 
            int offsetX, int offsetY)
    {
      if (adfPolygon == null) return;

            // Create a GDI+ graphics path from the passed-in polygon
      using (System.Drawing.Drawing2D.GraphicsPath graphicsPath = Utility.PolygonToPath(adfPolygon, offsetX, offsetY))
      {
                // Calculate the fill color after the specified transparency is applied
        System.Drawing.Color fillColor = 
                    System.Drawing.Color.FromArgb(Utility.TransparencyToAlpha(transparency), color);

                // Draw the polygon on the surface
        using (System.Drawing.SolidBrush solidBrush = new System.Drawing.SolidBrush(fillColor))
        {
          graphics.FillPath(solidBrush, graphicsPath);
        }
      }
    }

        /// <summary>
        /// Renders a Web ADF polygon on the specified GDI+ surface with the specified color and outline width
        /// </summary>
    public static void DrawPolygon(System.Drawing.Graphics graphics, ESRI.ArcGIS.ADF.Web.Geometry.Polygon adfPolygon, 
            System.Drawing.Color outlineColor, float outlineWidth)
    {
      Utility.DrawPolygon(graphics, adfPolygon, outlineColor, outlineWidth, 0, 0);
    }

        /// <summary>
        /// Renders a Web ADF polygon on the specified GDI+ surface with the specified color, outline width, and offset
        /// </summary>
        public static void DrawPolygon(System.Drawing.Graphics graphics, ESRI.ArcGIS.ADF.Web.Geometry.Polygon adfPolygon, 
            System.Drawing.Color outlineColor, float outlineWidth, int offsetX, int offsetY)
    {
      if (adfPolygon == null) return;

            // Create a GDI+ graphics path from the passed-in polygon
            using (System.Drawing.Drawing2D.GraphicsPath graphicsPath = Utility.PolygonToPath(adfPolygon, offsetX, offsetY))
      {
                // Draw the polygon on the surface
        using (System.Drawing.Pen pen = new System.Drawing.Pen(outlineColor,outlineWidth))
        {
          graphics.DrawPath(pen, graphicsPath);
        }
      }
    }

        /// <summary>
        /// Renders a Web ADF polyline on the specified GDI+ surface with the specified color and thickness
        /// </summary>
    public static void DrawPolyline(System.Drawing.Graphics graphics, ESRI.ArcGIS.ADF.Web.Geometry.Polyline adfPolyline, 
            System.Drawing.Color color, float width)
    {
      if (adfPolyline == null) return;

            // Convert the polyline to a GDI+ graphics path
      using (System.Drawing.Drawing2D.GraphicsPath path = Utility.PolylineToPath(adfPolyline))
      {
                // Draw the polyline on the GDI+ surface
        using (System.Drawing.Pen pen = new System.Drawing.Pen(color, width))
        {
          graphics.DrawPath(pen, path);
        }
      }
    }

        // Converts a Web ADF point collection to a screen point array, applying any specified offset
        // to each point
        private static System.Drawing.Point[] pointCollectionToPointArray(
            ESRI.ArcGIS.ADF.Web.Geometry.PointCollection points, int offsetX, int offsetY)
        {
            // Loop through each point in the point collection, creating a corresponding screen
            // point in the point array for each
            System.Drawing.Point[] pointArray = new System.Drawing.Point[points.Count];
            for (int i = 0; i < points.Count; i++)
            {
                pointArray[i] = new System.Drawing.Point(
                    System.Convert.ToInt32(points[i].X - offsetX),
                    System.Convert.ToInt32(points[i].Y - offsetY));
            }
            return pointArray;
        }

  }
}