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; } }
public static extern bool StretchBlt(IntPtr hdc, int nXDest, int nYDest, int nWidthDest, int nHeightDest, IntPtr hdcSrc, int nXSrc, int nYSrc, int nWidthSrc, int nHeightSrc, RasterOps dwRop);
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); } }
public static extern bool BitBlt(IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, RasterOps dwRop);