public ThemeRenderResources(RenderGraphics g) { whiteBrush = g.CreateSolidBrush(Theme.WhiteColor); blackBrush = g.CreateSolidBrush(Theme.BlackColor); lightGreyFillBrush1 = g.CreateSolidBrush(Theme.LightGreyFillColor1); lightGreyFillBrush2 = g.CreateSolidBrush(Theme.LightGreyFillColor2); mediumGreyFillBrush1 = g.CreateSolidBrush(Theme.MediumGreyFillColor1); darkGreyLineBrush1 = g.CreateSolidBrush(Theme.DarkGreyLineColor1); darkGreyLineBrush2 = g.CreateSolidBrush(Theme.DarkGreyLineColor2); darkGreyLineBrush3 = g.CreateSolidBrush(Theme.DarkGreyLineColor3); darkGreyFillBrush1 = g.CreateSolidBrush(Theme.DarkGreyFillColor1); darkGreyFillBrush2 = g.CreateSolidBrush(Theme.DarkGreyFillColor2); lightRedFillBrush = g.CreateSolidBrush(Theme.LightRedFillColor); darkRedFillBrush = g.CreateSolidBrush(Theme.DarkRedFillColor); for (int j = 0; j < Theme.CustomColors.GetLength(1); j++) { for (int i = 0; i < Theme.CustomColors.GetLength(0); i++) { customColorBrushes[Theme.CustomColors[i, j]] = g.CreateSolidBrush(Theme.CustomColors[i, j]); } } for (int i = 0; i < FontDefinitions.Length; i++) { fonts[i] = g.CreateFontFromResource( FontDefinitions[i].Name, FontDefinitions[i].Bold, (int)(FontDefinitions[i].Size * g.FontScaling)); } }
protected override void OnRenderInitialized(RenderGraphics g) { Debug.Assert((int)ButtonImageIndices.Count == ButtonImageNames.Length); Debug.Assert(Note.EffectCount == EffectImageIndices.Length); Debug.Assert(EnvelopeType.Count == EnvelopeImageIndices.Length); bmpButtonAtlas = g.CreateBitmapAtlasFromResources(ButtonImageNames); scrollBarBrush = g.CreateSolidBrush(Color.FromArgb(64, Color.Black)); buttons[(int)ButtonType.Sequencer] = new Button { GetRenderInfo = GetSequencerRenderInfo, Click = OnSequencer, IsNavButton = true }; buttons[(int)ButtonType.PianoRoll] = new Button { GetRenderInfo = GetPianoRollRenderInfo, Click = OnPianoRoll, IsNavButton = true }; buttons[(int)ButtonType.Project] = new Button { GetRenderInfo = GetProjectExplorerInfo, Click = OnProjectExplorer, IsNavButton = true }; buttons[(int)ButtonType.Channel] = new Button { GetRenderInfo = GetChannelRenderInfo, Click = OnChannel, ListItemClick = OnChannelItemClick, ListItemLongPress = OnChannelItemLongPress }; buttons[(int)ButtonType.Instrument] = new Button { GetRenderInfo = GetInstrumentRenderingInfo, Click = OnInstrument, LongPress = OnInstrumentLongPress, ListItemClick = OnInstrumentItemClick, ListItemLongPress = OnInstrumentItemLongPress }; buttons[(int)ButtonType.Envelope] = new Button { GetRenderInfo = GetEnvelopeRenderingInfo, Click = OnEnvelope, ListItemClick = OnEnvelopeItemClick }; buttons[(int)ButtonType.Arpeggio] = new Button { GetRenderInfo = GetArpeggioRenderInfo, Click = OnArpeggio, LongPress = OnArpeggioLongPress, ListItemClick = OnArpeggioItemClick, ListItemLongPress = OnArpeggioItemLongPress }; buttons[(int)ButtonType.Snap] = new Button { GetRenderInfo = GetSnapRenderInfo, Click = OnSnap, ListItemClick = OnSnapItemClick }; buttons[(int)ButtonType.Effect] = new Button { GetRenderInfo = GetEffectRenderInfo, Click = OnEffect, ListItemClick = OnEffectItemClick }; buttons[(int)ButtonType.DPCMEffect] = new Button { GetRenderInfo = GetDPCMEffectRenderInfo, Click = OnDPCMEffect, ListItemClick = OnDPCMEffectItemClick }; buttons[(int)ButtonType.DPCMPlay] = new Button { GetRenderInfo = GetDPCMPlayRenderInfo, Click = OnDPCMPlay, LongPress = OnDPCMPlayLongPress }; var screenSize = PlatformUtils.GetScreenResolution(); var scale = Math.Min(screenSize.Width, screenSize.Height) / 1080.0f; buttonFont = scale > 1.2f ? ThemeResources.FontSmall : ThemeResources.FontVerySmall; buttonSize = ScaleCustom(DefaultButtonSize, scale); buttonSizeNav = ScaleCustom(DefaultNavButtonSize, scale); buttonIconPos1 = ScaleCustom(DefaultIconPos1, scale); buttonIconPos2 = ScaleCustom(DefaultIconPos2, scale); textPosTop = ScaleCustom(DefaultTextPosTop, scale); listItemSize = ScaleCustom(DefaultListItemSize, scale); listIconPos = ScaleCustom(DefaultListIconPos, scale); scrollBarSizeX = ScaleCustom(DefaultScrollBarSizeX, scale); iconScaleFloat = ScaleCustomFloat(DefaultIconSize / (float)bmpButtonAtlas.GetElementSize(0).Width, scale); }
protected void RenderDebug(RenderGraphics g) { #if DEBUG if (PlatformUtils.IsMobile) { var c = g.CreateCommandList(); c.FillRectangle(lastX - 30, lastY - 30, lastX + 30, lastY + 30, ThemeResources.WhiteBrush); g.DrawCommandList(c); } #endif }
protected override void OnRenderInitialized(RenderGraphics g) { Debug.Assert((int)ButtonImageIndices.Count == ButtonImageNames.Length); var screenSize = PlatformUtils.GetScreenResolution(); layoutSize = Math.Min(screenSize.Width, screenSize.Height) / 4; bmpButtonAtlas = g.CreateBitmapAtlasFromResources(ButtonImageNames); whiteKeyBrush = g.CreateVerticalGradientBrush(0, layoutSize, Theme.LightGreyFillColor1, Theme.LightGreyFillColor2); blackKeyBrush = g.CreateVerticalGradientBrush(0, layoutSize, Theme.DarkGreyFillColor1, Theme.DarkGreyFillColor2); whiteKeyPressedBrush = g.CreateVerticalGradientBrush(0, layoutSize, Theme.Darken(Theme.LightGreyFillColor1), Theme.Darken(Theme.LightGreyFillColor2)); blackKeyPressedBrush = g.CreateVerticalGradientBrush(0, layoutSize, Theme.Lighten(Theme.DarkGreyFillColor1), Theme.Lighten(Theme.DarkGreyFillColor2)); }
public RenderFont GetBestMatchingFontByHeight(RenderGraphics g, int desiredHeight, bool bold) { var lastIdx = 0; var foundIdx = 0; for (int i = 0; i < FontDefinitions.Length; i++) { var def = FontDefinitions[i]; if (def.Bold == bold) { if (def.Size * DpiScaling.Font > desiredHeight) { foundIdx = lastIdx; break; } lastIdx = i; } } return(fonts[Math.Max(0, foundIdx)]); }
protected override void OnRender(RenderGraphics g) { var c = g.CreateCommandList(); c.Transform.GetOrigin(out var ox, out var oy); // Background shadow. if (IsExpanded) { var fullscreenRect = new Rectangle(0, 0, ParentFormSize.Width, ParentFormSize.Height); fullscreenRect.Offset(-(int)ox, -(int)oy); c.FillRectangle(fullscreenRect, g.GetSolidBrush(Color.Black, 1.0f, popupRatio * 0.6f)); } // Clear BG. var navBgRect = Rectangle.Empty; for (int i = 0; i < (int)ButtonType.Count; i++) { var btn = buttons[i]; if (btn.Visible && btn.IsNavButton) { navBgRect = navBgRect.IsEmpty ? btn.Rect : Rectangle.Union(navBgRect, btn.Rect); } } var bgRect = new Rectangle(0, 0, Width, Height); var navBgBrush = IsLandscape ? g.GetHorizontalGradientBrush(Theme.DarkGreyLineColor1, buttonSize, 0.8f) : g.GetVerticalGradientBrush(Theme.DarkGreyLineColor1, buttonSize, 0.8f); var bgBrush = IsLandscape ? g.GetHorizontalGradientBrush(Theme.DarkGreyFillColor1, buttonSize, 0.8f) : g.GetVerticalGradientBrush(Theme.DarkGreyFillColor1, buttonSize, 0.8f); c.FillRectangle(bgRect, bgBrush); c.FillRectangle(navBgRect, navBgBrush); // Buttons for (int i = 0; i < (int)ButtonType.Count; i++) { var btn = buttons[i]; if (btn.Visible) { var image = btn.GetRenderInfo(out var text, out var tint); c.DrawBitmapAtlas(bmpButtonAtlas, (int)image, btn.IconX, btn.IconY, 1.0f, iconScaleFloat, tint); if (!string.IsNullOrEmpty(text)) { c.DrawText(text, buttonFont, btn.TextX, btn.TextY, ThemeResources.LightGreyFillBrush1, RenderTextFlags.Center | RenderTextFlags.Ellipsis, buttonSize, 0); } } } // Dividing line. if (IsLandscape) { c.DrawLine(0, 0, 0, Height, ThemeResources.BlackBrush); } else { c.DrawLine(0, 0, Width, 0, ThemeResources.BlackBrush); } g.DrawCommandList(c); // List items. if (popupButtonIdx >= 0) { c = g.CreateCommandList(); var rect = GetExpandedListRect(); c.PushTranslation(rect.Left, rect.Top - scrollY); for (int i = 0; i < listItems.Length; i++) { var item = listItems[i]; var brush = g.GetVerticalGradientBrush(item.Color, listItemSize, 0.8f); var opacity = item.GetImageOpacity != null?item.GetImageOpacity(item) : 1.0f; c.FillAndDrawRectangle(item.Rect, brush, ThemeResources.BlackBrush); c.DrawBitmapAtlas(bmpButtonAtlas, item.ImageIndex, item.IconX, item.IconY, opacity, iconScaleFloat, Color.Black); if (item.ExtraImageIndex >= 0) { var extraOpacity = item.GetExtraImageOpacity != null?item.GetExtraImageOpacity(item) : 1.0f; c.DrawBitmapAtlas(bmpButtonAtlas, item.ExtraImageIndex, item.ExtraIconX, item.ExtraIconY, extraOpacity, iconScaleFloat, Color.Black); } c.DrawText(item.Text, i == popupSelectedIdx ? ThemeResources.FontMediumBold : ThemeResources.FontMedium, item.TextX, item.TextY, ThemeResources.BlackBrush, RenderTextFlags.Middle, 0, listItemSize); } c.PopTransform(); var scrollBarRect = GetScrollBarRect(); if ((Math.Abs(flingVelY) > 0.0f || captureOperation == CaptureOperation.MobilePan) && !scrollBarRect.IsEmpty) { c.PushTranslation(rect.Left, rect.Top); c.FillRectangle(GetScrollBarRect(), scrollBarBrush); c.PopTransform(); } if (IsLandscape) { rect.Width = -rect.X; } else { rect.Height = -rect.Y; } rect.Offset((int)Math.Round(ox), (int)Math.Round(oy)); g.DrawCommandList(c, rect); } }
protected override void OnRender(RenderGraphics g) { RenderPiano(g); RenderDebug(g); }
protected void RenderPiano(RenderGraphics g) { int minVisibleOctave = Utils.Clamp((int)Math.Floor(scrollX / (float)octaveSizeX), 0, NumOctaves); int maxVisibleOctave = Utils.Clamp((int)Math.Ceiling((scrollX + Width) / (float)octaveSizeX), 0, NumOctaves); var cb = g.CreateCommandList(); var cp = g.CreateCommandList(); // Background (white keys) cb.FillRectangle(0, 0, Width, Height, whiteKeyBrush); // Highlighted note. var playOctave = Note.IsMusicalNote(highlightAbsNote) ? (highlightAbsNote - 1) / 12 : -1; var playNote = Note.IsMusicalNote(highlightAbsNote) ? (highlightAbsNote - 1) % 12 : -1; if (playNote >= 0 && !IsBlackKey(playNote)) { cp.FillRectangle(GetKeyRectangle(playOctave, playNote), whiteKeyPressedBrush); } var color = Color.Empty; // Early pass for DPCM white keys for (int i = minVisibleOctave; i < maxVisibleOctave; i++) { for (int j = 0; j < 12; j++) { if (!IsBlackKey(j) && GetDPCMKeyColor(i * 12 + j + 1, ref color)) { cp.FillRectangle(GetKeyRectangle(i, j), g.GetVerticalGradientBrush(Theme.Darken(color, 20), color, Height)); } } } // Black keys for (int i = minVisibleOctave; i < maxVisibleOctave; i++) { for (int j = 0; j < 12; j++) { if (IsBlackKey(j)) { var brush = playOctave == i && playNote == j ? blackKeyPressedBrush : blackKeyBrush; if (GetDPCMKeyColor(i * 12 + j + 1, ref color)) { brush = g.GetVerticalGradientBrush(Theme.Darken(color, 40), Theme.Darken(color, 20), Height / 2); } cp.FillRectangle(GetKeyRectangle(i, j), brush); } } } // Lines between white keys for (int i = minVisibleOctave; i < maxVisibleOctave; i++) { for (int j = 0; j < 12; j++) { if (!IsBlackKey(j)) { var groupStart = j == 0 || j == 5; var x = GetKeyRectangle(i, j).X; var y = groupStart ? 0 : Height / 2; var brush = groupStart ? ThemeResources.BlackBrush : ThemeResources.DarkGreyFillBrush2; cp.DrawLine(x, y, x, Height, brush); } } } // Top line cp.DrawLine(0, 0, Width, 0, ThemeResources.BlackBrush); // Octave labels for (int i = minVisibleOctave; i < maxVisibleOctave; i++) { var r = GetKeyRectangle(i, 0); cp.DrawText("C" + i, ThemeResources.FontSmall, r.X, r.Y, ThemeResources.BlackBrush, RenderTextFlags.BottomCenter, r.Width, r.Height - ThemeResources.FontSmall.Size); } // Drag images for (int i = minVisibleOctave; i < maxVisibleOctave; i++) { for (int j = 0; j < 2; j++) { var r = GetPanRectangle(i, j); if (!r.IsEmpty) { var size = bmpButtonAtlas.GetElementSize((int)ButtonImageIndices.MobilePianoDrag); var scale = Math.Min(r.Width, r.Height) / (float)Math.Min(size.Width, size.Height); var posX = r.X + r.Width / 2 - (int)(size.Width * scale / 2); var posY = r.Height / 2 - (int)(size.Height * scale / 2); var imageIndex = App.IsRecording && j == 1 ? (int)ButtonImageIndices.MobilePianoRest : (int)ButtonImageIndices.MobilePianoDrag; cp.DrawBitmapAtlas(bmpButtonAtlas, imageIndex, posX, posY, 0.25f, scale, Color.Black); } } } //if ((editMode == EditionMode.Channel || editMode == EditionMode.DPCMMapping) && ThemeResources.FontSmall.Size < noteSizeY) // r.cp.DrawText("C" + i, ThemeResources.FontSmall, r.g.WindowScaling, octaveBaseX - noteSizeY + 1, ThemeResources.BlackBrush, RenderTextFlags.Middle, whiteKeySizeX - r.g.WindowScaling * 2, noteSizeY - 1); //if ((i == playOctave && j == playNote) || (draggingNote && (i == dragOctave && j == dragNote))) // r.cp.FillRectangle(GetKeyRectangle(i, j), blackKeyPressedBrush); g.DrawCommandList(cb); g.DrawCommandList(cp, new Rectangle(0, 0, Width, Height)); }