private ResizedFrame(Frame orig, Size render) { OriginalFrame = orig; RenderSize = render; CreationTick = HighResTimer.GetCurrentTickCount(); // resize original Bitmap CreateResizedGDIBitmap(orig.Tilesheet, ref NewBmp, ref ResizedGraphics, ref hDC, ref hBmp); // resize Mask of original Bitmap if (OriginalFrame.Tilesheet.Mask != null) CreateResizedGDIBitmap(orig.Tilesheet.Mask, ref NewBmpMask, ref ResizedGraphicsMask, ref hDCMask, ref hBmpMask); // hook into Tilesheet Disposed event orig.Tilesheet.Disposed += Tilesheet_Disposed; ResizedFrameCache.Add(this.Id, this); }
public GridPoint SetGridPoint(int x, int y, Frame frame) { this[x, y].CurrentFrame = frame; return this[x, y]; }
internal static string GetId(Frame frame, Size renderSize) { return string.Format("{0}_{1}_{2}_{3}_{4}", frame.Tilesheet.Name, frame.XTile.ToString(), frame.YTile.ToString(), renderSize.Width.ToString(), renderSize.Height.ToString()); }
internal static ResizedFrame GetResizedFrame(Frame frame, Size renderSize) { var settings = EngineConfiguration.Open().Settings; ResizedFrame resizedFrame; if (ResizedFrameCache.TryGetValue(GetId(frame, renderSize), out resizedFrame) == false) { resizedFrame = new ResizedFrame(frame, renderSize); // check cache limit; if over, trim cache while (ResizedFrameCache.Count > settings.ResizedFrameCacheLimit) { var oldestInCache = ResizedFrameCache.OrderBy(kvp => kvp.Value.CreationTick).First(); var oldResizedFrame = oldestInCache.Value; ResizedFrameCache.Remove(oldestInCache.Key); oldResizedFrame.Dispose(); } } return resizedFrame; }