public Present Evaluate(Present[] paramList)
        {
            D.Assert(paramList.Length == 4);
            MapRectangleParameter parameter  = (MapRectangleParameter)paramList[0];
            SizeParameter         parameter2 = (SizeParameter)paramList[1];
            Present present  = paramList[2];
            Present present2 = paramList[3];
            double  num      = Math.Min(parameter.value.LonExtent, parameter.value.LatExtent);
            int     num2     = Math.Max(parameter2.value.Width, parameter2.value.Height);

            if ((num > 1.0) && (num2 <= 0x400))
            {
                IFuture    future = this.prototype.Curry(new ParamDict(new object[] { TermName.ImageBounds, new MapRectangleParameter(this.unitRectangle), TermName.OutputSize, new SizeParameter(this.memoizedSize), TermName.UseDocumentTransparency, present, TermName.ExactColors, present2 }));
                StrongHash hash   = new StrongHash();
                future.AccumulateRobustHash(hash);
                D.Sayf(0, "Future {0} hashes to {1}", new object[] { RobustHashTools.DebugString(future), hash.ToString() });
                Present present3 = future.Realize("sourceImageDownsampler-memo");
                if (present3 is ImageRef)
                {
                    try
                    {
                        ImageRef          ref2  = (ImageRef)present3;
                        GDIBigLockedImage image = new GDIBigLockedImage(parameter2.value, "sourceImageDownsampler-downsample");
                        lock (ref2.image)
                        {
                            lock (image)
                            {
                                Graphics     graphics = image.IPromiseIAmHoldingGDISLockSoPleaseGiveMeTheGraphics();
                                MapRectangle region   = parameter.value.Intersect(this.unitRectangle);
                                if (!region.IsEmpty())
                                {
                                    RectangleF srcRect  = this.SelectSubRectangle(this.unitRectangle, region, this.memoizedSize);
                                    RectangleF destRect = this.SelectSubRectangle(parameter.value, region, parameter2.value);
                                    Image      image2   = ref2.image.IPromiseIAmHoldingGDISLockSoPleaseGiveMeTheImage();
                                    graphics.InterpolationMode = InterpolationMode.HighQualityBilinear;
                                    graphics.DrawImage(image2, destRect, srcRect, GraphicsUnit.Pixel);
                                }
                                graphics.Dispose();
                                return(new ImageRef(new ImageRefCounted(image)));
                            }
                        }
                    }
                    catch (ArgumentException)
                    {
                        return(new PresentFailureCode("Image processing overflow"));
                    }
                    catch (OverflowException)
                    {
                        return(new PresentFailureCode("Image processing overflow"));
                    }
                    catch (Exception exception)
                    {
                        return(new PresentFailureCode(exception));
                    }
                    finally
                    {
                        present3.Dispose();
                    }
                }
                return(present3);
            }
            return(this.prototype.Curry(new ParamDict(new object[] { TermName.ImageBounds, parameter, TermName.OutputSize, parameter2, TermName.UseDocumentTransparency, present, TermName.ExactColors, present2 })).Realize("sourceImageDownsampler-passthru"));
        }