void SetIdentify(bool enable) { ResponseObject.UseConfigureDisplay = enable; if (enable) { // Generate configuration image; SignRender r = new SignRender(); r.SetConfiguration(ResponseObject.Target.CurrentConfiguration()); r.Clear(); lock (Elements) { int index = 1; foreach (EditElement e in Elements) { string text = index.ToString(); SizeF sz = r.MeasureText(12, text); r.DrawTextAbsolute(12, text, Color.White, e.Location.X + (e.Location.Width - sz.Width) / 2, e.Location.Y + (e.Location.Height - sz.Height) / 2); index++; } } UpdateFrameInternal(r.SignOutput); ResponseObject.Target.SendImage(r.SignOutput); } }
void FrameTick(object context) { lock (this) { if (Render == null) { return; } Render.Clear(); if (ContentElements != null) { foreach (SignElement e in ContentElements) { e.SetContext(Render); } // Advance anmiation if (DelayTime > 0) { DelayTime--; } else { if (AnimateFirstElement >= ContentElements.Length) { DelayTime = RecycleDelay; AnimateFirstElement = 0; AnimateElementOffset = 0; } else { // Scrolling SignElement firstElement = ContentElements[AnimateFirstElement]; AnimateElementOffset--; int elementLocation = Render.Configuration.Width + AnimateElementOffset; if (elementLocation + firstElement.Width < 0) { // Advance to next element AnimateFirstElement++; AnimateElementOffset += firstElement.Width + ElementSpacing; } DelayTime = FramesPerScroll - 1; } } // Render ElementAnimation animMode = ElementAnimation.None; int offset = 0; for (int i = AnimateFirstElement; i < ContentElements.Length; i++) { SignElement curElement = ContentElements[i]; if (animMode == ElementAnimation.None) { animMode = curElement.Animation; } if (animMode != curElement.Animation) { break; } Render.ElementXOffset = Render.Configuration.Width + AnimateElementOffset + offset; Render.ElementYOffset = 0; if (Render.ElementXOffset >= Render.Configuration.Width) { break; } curElement.Render(Render); offset += curElement.Width + ElementSpacing; } } SendFrameComplete(); if (ContentElements != null) { // Rebuild content list if necessary. Do this after rendering to reduce jitter. // May not be that important. (measure later) bool needRebuild = false; foreach (ISignContent sc in ContentSources) { if (sc.HasUpdate) { needRebuild = true; } } if (needRebuild) { ContentElements = ContentSources.SelectMany((s) => s.GetElements()).ToArray(); } } } }