/********************************************************************** *********************************************************************/ private static void DrawGrayArrow(int index, float relativeFragmentSize) { // determine position of fragment block List <FragmentBlock> allFragmentsList = AllocationStrategiesAlgorithm.GetAllFragmentsList(); float mX1 = 0.1f; // memory bound x1 int stepsSoFar = 0; FragmentBlock fragment = null; for (int i = 0; i <= index; i++) { fragment = allFragmentsList.ElementAt(i); stepsSoFar += fragment.GetSize(); } float fragmentStart = mX1 + (stepsSoFar * relativeFragmentSize) - (fragment.GetSize() * relativeFragmentSize); float fragmentEnd = mX1 + (stepsSoFar * relativeFragmentSize); float xPosition = fragmentEnd - (fragmentEnd - fragmentStart) / 2; // position of text in the middle of fragment // draw the arrow float arrowTip = 0.725f; canvas.DrawLine(xPercent(xPosition), yPercent(arrowTip + 0.125f), xPercent(xPosition), yPercent(arrowTip), sk_ArrowGray); SKPath arrow = new SKPath(); arrow.MoveTo(xPercent(xPosition), yPercent(arrowTip)); arrow.RLineTo(-yPercent(0.015f), +yPercent(0.03f)); arrow.RLineTo(+yPercent(0.03f), 0); arrow.RLineTo(-yPercent(0.015f), -yPercent(0.03f)); arrow.Close(); canvas.DrawPath(arrow, sk_ArrowGray); }
/********************************************************************** *********************************************************************/ private static void DrawRedArrow(float relativeFragmentSize) { // determine position of fragment block int index = AllocationStrategiesAlgorithm.GetCurrentIndex(); //TODO: nach merge könnte der index nicht mehr existieren List <FragmentBlock> allFragmentsList = AllocationStrategiesAlgorithm.GetAllFragmentsList(); float mX1 = 0.1f; // memory bound x1 int stepsSoFar = 0; FragmentBlock fragment = null; for (int i = 0; i <= index; i++) { fragment = allFragmentsList.ElementAt(i); stepsSoFar += fragment.GetSize(); } float fragmentStart = mX1 + (stepsSoFar * relativeFragmentSize) - (fragment.GetSize() * relativeFragmentSize); float fragmentEnd = mX1 + (stepsSoFar * relativeFragmentSize); float xPosition = fragmentEnd - (fragmentEnd - fragmentStart) / 2; // position of text in the middle of fragment // draw the arrow float arrowTip = 0.275f; canvas.DrawLine(xPercent(xPosition), yPercent(arrowTip - 0.125f), xPercent(xPosition), yPercent(arrowTip), sk_ArrowRed); SKPath arrow = new SKPath(); arrow.MoveTo(xPercent(xPosition), yPercent(arrowTip)); arrow.RLineTo(yPercent(0.015f), -yPercent(0.03f)); arrow.RLineTo(-yPercent(0.03f), 0); arrow.RLineTo(yPercent(0.015f), yPercent(0.03f)); arrow.Close(); canvas.DrawPath(arrow, sk_ArrowRed); }
/********************************************************************** *********************************************************************/ private static float DrawMemory() { // memory bounds in percent of the canvas float mX1 = 0.1f; float mX2 = 0.9f; float mY1 = 0.3f; float mY2 = 0.7f; float mWidth = mX2 - mX1; float mHeight = mY2 - mY1; int totalMemorySize = AllocationStrategiesAlgorithm.GetTotalMemorySize(); List <FragmentBlock> allFragmentsList = AllocationStrategiesAlgorithm.GetAllFragmentsList(); float relativeFragmentSize = mWidth / totalMemorySize; int stepsSoFar = 0; foreach (FragmentBlock fragment in allFragmentsList) { // fragment size of 1 gets displayed as a . String fragmentSize = fragment.GetSize().ToString(); if (fragmentSize == "1") { fragmentSize = "•"; } stepsSoFar += fragment.GetSize(); float fragmentStart = mX1 + (stepsSoFar * relativeFragmentSize) - (fragment.GetSize() * relativeFragmentSize); float fragmentEnd = mX1 + (stepsSoFar * relativeFragmentSize); float xText = fragmentEnd - (fragmentEnd - fragmentStart) / 2; // position of text in the middle of fragment if (fragment.IsFree()) { // draw size of fragment in the middle of memory canvas.DrawText(fragmentSize, xPercent(xText), yPercent(0.5f), sk_Text); } else { // draw size of fragment beneath the memory //canvas.DrawText(fragmentSize, xPercent(xText), yPercent(0.8f), sk_TextWhite); canvas.DrawText(fragmentSize, xPercent(xText), yPercent(0.8f), sk_Text); // fill in used space SKRect usedSpace = new SKRect(xPercent(fragmentStart), yPercent(mY1), xPercent(fragmentEnd), yPercent(mY2)); //left x1 top y1 right x2 bottom y2 canvas.DrawRect(usedSpace, sk_UsedSpace); } } // draw the outlines of the memory box SKRect sk_memory = new SKRect(xPercent(mX1), yPercent(mY1), xPercent(mX2), yPercent(mY2)); canvas.DrawRect(sk_memory, sk_Black); canvas.DrawText("free", xPercent(0.05f), yPercent(0.5f), sk_Text); //canvas.DrawText("used", xPercent(0.05f), yPercent(0.8f), sk_TextWhite); canvas.DrawText("used", xPercent(0.05f), yPercent(0.8f), sk_Text); return(relativeFragmentSize); }