示例#1
0
        public void PopLayer()
        {
            GDILayer           layer           = layerStack.First();
            GDILayerParameters layerParameters = paramStack.First();
            RectangleF         parentContentBound;
            RectangleF         clipRect;
            ScLayer            sclayer = layerParameters.sclayer;

            layerStack.RemoveFirst();
            paramStack.RemoveFirst();

            if (layerStack.Count > 0)
            {
                gdiGraph           = layerStack.First().graph;
                parentContentBound = paramStack.First().ContentBounds;
                clipRect           = paramStack.First().ClipRect;
            }
            else
            {
                gdiGraph           = rootGdiGraph;
                parentContentBound = new RectangleF(0, 0, w, h);
                clipRect           = layerParameters.parentClipRect;
            }


            float x = (float)Math.Round(layerParameters.ContentBounds.X - parentContentBound.X);
            float y = (float)Math.Round(layerParameters.ContentBounds.Y - parentContentBound.Y);

            Bitmap effectbmp = layer.bitmap;


            //后处理效果
            if (sclayer.UsePosttreatmentEffect)
            {
                effectbmp = sclayer.ScPostTreatmentEffectGDI(layer.bitmap);
            }

            //
            TextureBrush br = new TextureBrush(effectbmp, WrapMode.Clamp);

            br.TranslateTransform((int)x, (int)y);

            switch (layerParameters.MaskAntialiasMode)
            {
            case GDIAntialiasMode.PerPrimitive:
                gdiGraph.SmoothingMode = SmoothingMode.AntiAlias;
                break;

            case GDIAntialiasMode.Aliased:
                gdiGraph.SmoothingMode = SmoothingMode.None;
                break;
            }

            gdiGraph.Transform = new Matrix();

            gdiGraph.SetClip(clipRect);
            gdiGraph.FillPath(br, layerParameters.GeometricMask);
            gdiGraph.ResetClip();

            //后处理效果释放
            if (sclayer.UsePosttreatmentEffect)
            {
                sclayer.ScReleasePostTreatmentEffectGDI(effectbmp);
            }

            br.Dispose();
        }