Beispiel #1
0
        private void miGDIPerlin_Click(object sender, System.EventArgs e)
        {
            if (m_spProcedural == null)
            {
                #region Procedural noise bitmap

                Random rnd = new Random();
                Endogine.Procedural.Noise procedural = null;
                switch (rnd.Next(4))
                {
                case 0:
                    procedural           = new Endogine.Procedural.Plasma();
                    procedural.Decay     = 0.5f;
                    procedural.Frequency = 0.1f;
                    procedural.Octaves   = 3;
                    break;

                case 1:
                    procedural           = new Endogine.Procedural.Wood();
                    procedural.Decay     = 0.5f;
                    procedural.Frequency = 0.1f;
                    procedural.Octaves   = 3;
                    ((Endogine.Procedural.Wood)procedural).NumCircles = 5;
                    ((Endogine.Procedural.Wood)procedural).Turbulence = 0.3f;
                    break;

                case 2:
                    procedural           = new Endogine.Procedural.Marble();
                    procedural.Decay     = 0.5f;
                    procedural.Frequency = 0.1f;
                    procedural.Octaves   = 3;
                    ((Endogine.Procedural.Marble)procedural).Periods    = new EPointF(15, 30);
                    ((Endogine.Procedural.Marble)procedural).Turbulence = 3.3f;
                    break;

                case 3:
                    procedural           = new Endogine.Procedural.Noise();
                    procedural.Decay     = 0.5f;
                    procedural.Frequency = 1f;
                    procedural.Octaves   = 3;
                    break;
                }


                Bitmap   bmp;
                Graphics g;
                bmp = new Bitmap(200, 200);
                Endogine.BitmapHelpers.Canvas canvas = Endogine.BitmapHelpers.Canvas.Create(bmp);

                //create a color table that makes it look like lakes and mountains:
                System.Collections.SortedList aColors = new System.Collections.SortedList();
                aColors.Add(0.0, Color.FromArgb(0, 0, 190));
                aColors.Add(0.1, Color.FromArgb(0, 0, 255));
                aColors.Add(0.11, Color.FromArgb(0, 200, 0));
                aColors.Add(0.5, Color.FromArgb(150, 100, 0));
                aColors.Add(1.0, Color.FromArgb(255, 255, 255));
                procedural.SetColors(aColors);
                //write pixels to bitmap:
                canvas.Locked = true;
                procedural.WriteToBitmap(canvas);
                canvas.Locked = false;
                #endregion

                #region Create gradient bitmap
                //Create two gradients using GDI+, and merge them with my CopyPixels for special effects
                Bitmap bmpGradient = new Bitmap(200, 200);
                g = Graphics.FromImage(bmpGradient);
                LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(4, 0, bmpGradient.Width, bmpGradient.Height), Color.FromArgb(255, 0, 0), Color.FromArgb(0, 255, 0), 0f);
                g.FillRectangle(brush, brush.Rectangle);

                Bitmap bmp2 = new Bitmap(bmpGradient.Width, bmpGradient.Height);
                brush = new LinearGradientBrush(new Rectangle(0, 0, bmp2.Width, bmp2.Height), Color.FromArgb(0, 0, 255), Color.FromArgb(0, 0, 0), (float)90);
                Graphics g2 = Graphics.FromImage(bmp2);
                g2.FillRectangle(brush, brush.Rectangle);

                RasterOps.CopyPixels(bmpGradient, bmp2, (int)RasterOps.ROPs.AddPin, 255);
                RasterOps.CopyPixels(bmp, bmpGradient, (int)RasterOps.ROPs.Lightest, 255);
                g.Dispose();
                #endregion

                MemberSpriteBitmap mb = new MemberSpriteBitmap(bmp);

                m_spProcedural         = new Sprite();
                m_spProcedural.Name    = "Procedural";
                m_spProcedural.Member  = mb;
                m_spProcedural.Scaling = new EPointF(2, 2);
                m_spProcedural.Ink     = 0;
            }
            else
            {
                //TODO: the bitmap will still remain in memory, should have an "autodispose" option,
                //so that resources gets disposed when no sprites are using them
                m_spProcedural.Dispose();
                m_spProcedural = null;
            }
        }
Beispiel #2
0
        public override void SubDraw()
        {
            ERectangleF rctDraw = _sp.CalcRectInDrawTarget();

            //attribs.SetColorMatrix(new ColorMatrix(), ColorMatrixFlag.Default, ColorAdjustType.Bitmap);


            if (_sp.Ink == RasterOps.ROPs.Copy || _sp.Ink == RasterOps.ROPs.BgTransparent || _sp.DrawToSprite == null)             //TODO: allow RasterOps on root sprite.
            //if (false)
            {
                if (_sp.Rect.Width <= 0 || _sp.Rect.Height <= 0)
                {
                    return;
                }

                PointF   ulCorner1 = new PointF(rctDraw.X, rctDraw.Y);
                PointF   urCorner1 = new PointF(rctDraw.OppositeX, rctDraw.Y);
                PointF   llCorner1 = new PointF(rctDraw.X, rctDraw.OppositeY);
                PointF[] destPara1 = { ulCorner1, urCorner1, llCorner1 };

                ERectangle rctSrc = _sp.SourceRect;                 //m_sp.Member.GetRectForFrame(m_sp.MemberAnimationFrame);
                //RectangleF rctfCropped = m_sp.GetPortionOfMemberToDisplay();

                //g.FillRectangle(new SolidBrush(Color.Red), rctDraw);

                Graphics        g       = Graphics.FromImage(_sp.DrawToSprite.Member.Bitmap);
                ImageAttributes attribs = new ImageAttributes();
                attribs.SetWrapMode(WrapMode.Tile);
                if (_sp.Ink == RasterOps.ROPs.BgTransparent)
                {
                    attribs.SetColorKey(_sp.Member.ColorKey, _sp.Member.ColorKey);
                }

                g.SmoothingMode      = SmoothingMode.None;
                g.CompositingMode    = CompositingMode.SourceOver;
                g.CompositingQuality = CompositingQuality.Invalid;
                g.DrawImage(_sp.Member.Bitmap, destPara1, rctSrc.ToRectangleF(), GraphicsUnit.Pixel, attribs);
                g.Dispose();
            }
            else
            {
                //since it's difficult to write a RasterOp algorithm that both does effects and scales/interpolates properly,
                //I cheat by creating a temporary scaled bitmap
                if (_sp.Rect.ToERectangle().Width <= 0 || _sp.Rect.ToERectangle().Height <= 0)
                {
                    return;
                }

                Bitmap     bmp    = _sp.Member.Bitmap;
                ERectangle rctSrc = _sp.SourceRect;
                if (_sp.Scaling.X != 1 || _sp.Scaling.Y != 1 || _sp.Color != Color.White)
                {
                    //TODO: other/faster resizing algorithms at
                    //http://www.codeproject.com/csharp/ImgResizOutperfGDIPlus.asp
                    rctSrc = _sp.Rect.ToERectangle();
                    rctSrc.Offset(-rctSrc.X, -rctSrc.Y);
                    bmp = new Bitmap(_sp.Rect.ToERectangle().Width, _sp.Rect.ToERectangle().Height, _sp.Member.Bitmap.PixelFormat);                     //m_sp.Member.Bitmap, new Size(m_sp.RectInt.Width, m_sp.RectInt.Height));
                    Graphics        g       = Graphics.FromImage(bmp);
                    ImageAttributes attribs = new ImageAttributes();

                    ColorMatrix colorMatrix = new ColorMatrix();
                    colorMatrix.Matrix00 = (float)_sp.Color.R / 255;
                    colorMatrix.Matrix11 = (float)_sp.Color.G / 255;
                    colorMatrix.Matrix22 = (float)_sp.Color.B / 255;
                    colorMatrix.Matrix33 = 1.00f;                     // alpha
                    colorMatrix.Matrix44 = 1.00f;                     // w
                    attribs.SetColorMatrix(colorMatrix);

                    g.DrawImage(_sp.Member.Bitmap, rctSrc.ToRectangle(),
                                _sp.SourceRect.X, _sp.SourceRect.Y, _sp.SourceRect.Width, _sp.SourceRect.Height,
                                GraphicsUnit.Pixel, attribs);
                    g.Dispose();
                }

                RasterOps.CopyPixels(_sp.DrawToSprite.Member.Bitmap, bmp,
                                     rctDraw, rctSrc, _sp.DrawToSprite.SourceRect, (int)_sp.Ink, _sp.Blend);
            }
        }