private void RenderOscilloscope(RenderGraphics g) { if (!oscilloscopeVisible) { return; } var oscilloscopeSizeX = timecodeSizeX; var oscilloscopeSizeY = Height - timecodePosY * 2; g.FillRectangle(oscilloscopePosX, timecodePosY, oscilloscopePosX + oscilloscopeSizeX, Height - timecodePosY, theme.BlackBrush); var oscilloscopeGeometry = App.GetOscilloscopeGeometry(out lastOscilloscopeHadNonZeroSample); if (oscilloscopeGeometry != null && lastOscilloscopeHadNonZeroSample) { float scaleX = oscilloscopeSizeX; float scaleY = oscilloscopeSizeY / 2; RenderGeometry geo = g.CreateGeometry(oscilloscopeGeometry, false); g.PushTransform(oscilloscopePosX, timecodePosY + oscilloscopeSizeY / 2, scaleX, scaleY); g.AntiAliasing = true; g.DrawGeometry(geo, theme.LightGreyFillBrush2); g.AntiAliasing = false; g.PopTransform(); geo.Dispose(); } else { g.PushTranslation(oscilloscopePosX, timecodePosY + oscilloscopeSizeY / 2); g.AntiAliasing = true; g.DrawLine(0, 0, oscilloscopeSizeX, 0, theme.LightGreyFillBrush2); g.AntiAliasing = false; g.PopTransform(); } g.DrawRectangle(oscilloscopePosX, timecodePosY, oscilloscopePosX + oscilloscopeSizeX, Height - timecodePosY, theme.LightGreyFillBrush2); }
protected override void OnRender(RenderGraphics g) { g.Clear(ThemeBase.DarkGreyFillColor1); g.DrawLine(0, 0, 0, Height, theme.BlackBrush); int actualWidth = Width - scrollBarSizeX; int y = -scrollY; foreach (var button in buttons) { var icon = bmpButtonIcons[(int)button.type]; g.PushTranslation(0, y); g.FillAndDrawRectangle(0, 0, actualWidth, buttonSizeY, g.GetVerticalGradientBrush(button.GetColor(), buttonSizeY, 0.8f), theme.BlackBrush); g.DrawText(button.GetText(App.Project), button.GetFont(selectedSong, selectedInstrument), icon == null ? buttonTextNoIconPosX : buttonTextPosX, buttonTextPosY, theme.BlackBrush, actualWidth - buttonTextNoIconPosX * 2); if (icon != null) { g.DrawBitmap(icon, buttonIconPosX, buttonIconPosY); } var subButtons = button.GetSubButtons(out var active); if (subButtons != null) { for (int i = 0, x = actualWidth - subButtonSpacingX; i < subButtons.Length; i++, x -= subButtonSpacingX) { g.DrawBitmap(bmpSubButtonIcons[(int)subButtons[i]], x, subButtonPosY, active[i] ? 1.0f : 0.2f); } } g.PopTransform(); y += buttonSizeY; } if (needsScrollBar) { int virtualSizeY = this.virtualSizeY; int scrollBarSizeY = (int)Math.Round(Height * (Height / (float)virtualSizeY)); int scrollBarPosY = (int)Math.Round(Height * (scrollY / (float)virtualSizeY)); g.FillAndDrawRectangle(actualWidth, 0, Width - 1, Height, theme.DarkGreyFillBrush1, theme.BlackBrush); g.FillAndDrawRectangle(actualWidth, scrollBarPosY, Width - 1, scrollBarPosY + scrollBarSizeY, theme.LightGreyFillBrush1, theme.BlackBrush); } }
protected override void OnRender(RenderGraphics g) { g.Clear(ThemeBase.DarkGreyFillColor1); g.DrawLine(0, 0, 0, Height, theme.BlackBrush); int actualWidth = Width - scrollBarSizeX; int y = -scrollY; foreach (var button in buttons) { var icon = button.GetIcon(); g.PushTranslation(0, y); g.FillAndDrawRectangle(0, 0, actualWidth, buttonSizeY, g.GetVerticalGradientBrush(button.GetColor(), buttonSizeY, 0.8f), theme.BlackBrush); var leftPadding = 0; if (App.Project.NeedsExpansionInstruments && (button.type == ButtonType.Instrument || button.type == ButtonType.Song)) { var tabColor = button.instrument != null && button.instrument.IsExpansionInstrument ? ThemeBase.MediumGreyFillColor1 : ThemeBase.LightGreyFillColor1; g.FillRectangle(1, 1, 1 + expansionTypeSizeX, buttonSizeY, g.GetVerticalGradientBrush(tabColor, buttonSizeY, 0.8f)); g.PushTranslation(1 + expansionTypeSizeX, 0); g.DrawLine(0, 0, 0, buttonSizeY, theme.BlackBrush); leftPadding = expansionTypeSizeX; } g.DrawText(button.GetText(App.Project), button.GetFont(selectedSong, selectedInstrument), icon == null ? buttonTextNoIconPosX : buttonTextPosX, buttonTextPosY, theme.BlackBrush, actualWidth - buttonTextNoIconPosX * 2); if (icon != null) { g.DrawBitmap(icon, buttonIconPosX, buttonIconPosY); } var subButtons = button.GetSubButtons(out var active); if (subButtons != null) { for (int i = 0, x = actualWidth - subButtonSpacingX - leftPadding; i < subButtons.Length; i++, x -= subButtonSpacingX) { g.DrawBitmap(button.GetIcon(subButtons[i]), x, subButtonPosY, active[i] ? 1.0f : 0.2f); } } if (leftPadding != 0) { g.PopTransform(); } g.PopTransform(); y += buttonSizeY; } if (needsScrollBar) { int virtualSizeY = this.virtualSizeY; int scrollBarSizeY = (int)Math.Round(Height * (Height / (float)virtualSizeY)); int scrollBarPosY = (int)Math.Round(Height * (scrollY / (float)virtualSizeY)); g.FillAndDrawRectangle(actualWidth, 0, Width - 1, Height, theme.DarkGreyFillBrush1, theme.BlackBrush); g.FillAndDrawRectangle(actualWidth, scrollBarPosY, Width - 1, scrollBarPosY + scrollBarSizeY, theme.LightGreyFillBrush1, theme.BlackBrush); } }
protected override void OnRender(RenderGraphics g) { g.Clear(ThemeBase.DarkGreyFillColor1); int patternSizeX = PatternSizeX; int minVisiblePattern = Math.Max((int)Math.Floor(scrollX / (float)patternSizeX), 0); int maxVisiblePattern = Math.Min((int)Math.Ceiling((scrollX + Width) / (float)patternSizeX), Song.Length); // Track name background g.FillRectangle(0, 0, trackNameSizeX, Height, whiteKeyBrush); // Header g.DrawLine(0, 0, Width, 0, theme.BlackBrush); g.DrawLine(trackNameSizeX - 1, 0, trackNameSizeX - 1, headerSizeY, theme.DarkGreyLineBrush1); g.PushTranslation(trackNameSizeX, 0); g.PushClip(0, 0, Width, Height); for (int i = minVisiblePattern, x = minVisiblePattern * patternSizeX - scrollX; i <= maxVisiblePattern; i++, x += patternSizeX) { if (i != 0) { g.DrawLine(x, 0, x, Height, theme.DarkGreyLineBrush1); } } for (int i = minVisiblePattern, x = minVisiblePattern * patternSizeX - scrollX; i < maxVisiblePattern; i++, x += patternSizeX) { g.PushTranslation(x, 0); g.DrawText(i.ToString(), ThemeBase.FontMediumCenter, 0, barTextPosY, theme.LightGreyFillBrush1, patternSizeX); g.PopTransform(); } g.PopClip(); g.PopTransform(); g.PushTranslation(0, headerSizeY); // Icons for (int i = 0, y = 0; i < Song.Channels.Length; i++, y += trackSizeY) { g.DrawBitmap(bmpTracks[(int)Song.Channels[i].Type], trackIconPosX, y + trackIconPosY, RenderTheme.MainWindowScaling, (App.ChannelMask & (1 << i)) != 0 ? 1.0f : 0.2f); } // Track names for (int i = 0, y = 0; i < Song.Channels.Length; i++, y += trackSizeY) { g.DrawText(Song.Channels[i].Name, i == selectedChannel ? ThemeBase.FontMediumBold : ThemeBase.FontMedium, trackNamePosX, y + trackNamePosY, theme.BlackBrush); } // Ghost note icons for (int i = 0, y = 0; i < Song.Channels.Length; i++, y += trackSizeY) { g.DrawBitmap(bmpGhostNote, trackNameSizeX - ghostNoteOffsetX, y + trackSizeY - ghostNoteOffsetY - 1, RenderTheme.MainWindowScaling, (App.GhostChannelMask & (1 << i)) != 0 ? 1.0f : 0.2f); } // Vertical line seperating the track labels. g.DrawLine(trackNameSizeX - 1, 0, trackNameSizeX - 1, Height, theme.DarkGreyLineBrush1); // Grey background rectangles ever other pattern + vertical lines g.PushClip(trackNameSizeX, 0, Width, Height); g.PushTranslation(trackNameSizeX, 0); for (int i = minVisiblePattern, x = minVisiblePattern * patternSizeX - scrollX; i < maxVisiblePattern; i++, x += patternSizeX) { if ((i & 1) == 0) { g.FillRectangle(x, 0, x + patternSizeX, Height, theme.DarkGreyFillBrush2); } } for (int i = minVisiblePattern, x = minVisiblePattern * patternSizeX - scrollX; i <= maxVisiblePattern; i++, x += patternSizeX) { if (i != 0) { g.DrawLine(x, 0, x, Height, theme.DarkGreyLineBrush1); } } g.PopTransform(); g.PopClip(); // Horizontal lines for (int i = 0, y = 0; i < Song.Channels.Length; i++, y += trackSizeY) { g.DrawLine(0, y, Width, y, theme.DarkGreyLineBrush1); } g.PushClip(trackNameSizeX, 0, Width, Height); // Seek int xxx = ScaleForZoom(App.CurrentFrame) + trackNameSizeX - scrollX; g.DrawLine(xxx, -headerSizeY, xxx, Height, playPositionBrush); // Patterns for (int t = 0, y = 0; t < Song.Channels.Length; t++, y += trackSizeY) { for (int i = minVisiblePattern, x = minVisiblePattern * patternSizeX + trackNameSizeX - scrollX; i < maxVisiblePattern; i++, x += patternSizeX) { var pattern = Song.Channels[t].PatternInstances[i]; if (pattern != null) { var bmp = GetPatternBitmapFromCache(g, pattern); g.PushTranslation(x, y); g.FillRectangle(1, 1, patternSizeX, patternHeaderSizeY, g.GetVerticalGradientBrush(pattern.Color, patternHeaderSizeY - 1, 0.9f)); g.DrawLine(0, patternHeaderSizeY, patternSizeX, patternHeaderSizeY, theme.DarkGreyLineBrush1); if (IsPatternSelected(t, i)) { g.FillRectangle(1, 1 + patternHeaderSizeY, PatternSizeX, patternHeaderSizeY + bmp.Size.Height + 1, selectedPatternBrush); } g.DrawBitmap(bmp, 1, 1 + patternHeaderSizeY, PatternSizeX - 1, bmp.Size.Height, 1.0f); g.PushClip(0, 0, PatternSizeX, trackSizeY); g.DrawText(pattern.Name, ThemeBase.FontSmall, patternNamePosX, patternNamePosY, theme.BlackBrush); g.PopClip(); g.PopTransform(); } } } // Dragging selection if (isDraggingSelection) { var pt = this.PointToClient(Cursor.Position); //pt.X -= TrackNameSizeX; pt.Y -= headerSizeY; var drawX = pt.X - selectionDragAnchorX; var drawY = minSelectedChannelIdx * trackSizeY; var sizeX = (maxSelectedPatternIdx - minSelectedPatternIdx + 1) * patternSizeX; var sizeY = (maxSelectedChannelIdx - minSelectedChannelIdx + 1) * trackSizeY; g.FillRectangle(drawX, drawY, drawX + sizeX, drawY + sizeY, selectedPatternBrush); } g.PopClip(); g.PopTransform(); g.DrawLine(0, Height - 1, Width, Height - 1, theme.DarkGreyLineBrush1); }