public static Vector2 ClosestPointOnLine(Vector2 sourcePoint, Vector2 lineStart, Vector2 lineEnd) { var lineDelta = lineEnd - lineStart; var u = (((sourcePoint.X - lineStart.X) * lineDelta.X) + ((sourcePoint.Y - lineStart.Y) * lineDelta.Y)) / lineDelta.LengthSquared(); return(lineStart + (lineDelta * Arithmetic.Clamp(u, 0.0f, 1.0f))); }
protected override void Update(GameTime gameTime) { base.Update(gameTime); if (!IsActive) { return; } var ms = Mouse.GetState(); if (ms.LeftButton == ButtonState.Pressed) { BottomRight = new Vector2(ms.X, ms.Y); } else if (ms.RightButton == ButtonState.Pressed) { TopLeft = new Vector2(ms.X, ms.Y); } var ks = Keyboard.GetState(); Alignment.Update(ref ks); CharacterWrap.Update(ref ks); WordWrap.Update(ref ks); FreeType.Update(ref ks); ShowOutlines.Update(ref ks); Hinting.Update(ref ks); Which.Update(ref ks); Margin.Update(ref ks); Indent.Update(ref ks); var newSize = Arithmetic.Clamp(20 + (ms.ScrollWheelValue / 56f), 6, 200); newSize = Arithmetic.Clamp(9 + (ms.ScrollWheelValue / 100f), 4, 200); var font = ((FreeTypeFont)LatinFont); if (newSize != font.SizePoints) { font.SizePoints = newSize; Text.Invalidate(); Text2.Invalidate(); } }
static ColorSpace() { for (int i = 0; i < 256; i++) { double fv = i / 255.0; if (fv < 0.04045) { sRGBByteToLinearTable[i] = fv / 12.92; } else { sRGBByteToLinearTable[i] = Math.Pow((fv + 0.055) / 1.055, 2.4); } sRGBByteToLinearFloatTable[i] = (float)sRGBByteToLinearTable[i]; LinearByteTosRGBTable[i] = LinearTosRGB(i / 255.0); sRGBByteToLinearByteTable[i] = (byte)Arithmetic.Clamp(sRGBByteToLinearTable[i] * 255, 0f, 255f); LinearByteTosRGBByteTable[i] = (byte)(LinearTosRGB(i / 255.0) * 255); InverseAlphaTable[i] = (i > 0) ? 1.0 / i : 0; } }
private THardwareBuffer AllocateSuitablySizedHardwareBuffer(int vertexCount, int indexCount) { THardwareBuffer buffer; using (var e = _UnusedHardwareBuffers.GetEnumerator()) while (e.GetNext(out buffer)) { if ( (buffer.VertexCount >= vertexCount) && (buffer.IndexCount >= indexCount) ) { // This buffer is large enough, so return it. e.RemoveCurrent(); buffer.Age = Arithmetic.Clamp(buffer.Age - 2, 0, MaxBufferAge); return(buffer); } } if (MaxSoftwareBuffersPerHardwareBuffer > 1) { if (vertexCount < MinVerticesPerBuffer) { vertexCount = MinVerticesPerBuffer; } if (indexCount < MinIndicesPerBuffer) { indexCount = MinIndicesPerBuffer; } } // We didn't find a suitably large buffer. buffer = AllocateHardwareBuffer(vertexCount, indexCount); return(buffer); }
private void RasterizeAcceleratorOverlay( UIOperationContext context, ref ImperativeRenderer labelRenderer, ref ImperativeRenderer targetRenderer, Control control, AbstractString label, bool showFocused = false, Control forControl = null ) { if (control == null) { return; } if (!showFocused && (control == Focused) && !label.IsNull && (label.Length > 0)) { return; } if (label.Length <= 0) { return; } var box = control.GetRect(); if ((box.Width <= 1) || (box.Height <= 1)) { return; } var decorator = Decorations.AcceleratorTarget; var settings = new Decorations.DecorationSettings { Box = box, ContentBox = box }; decorator.Rasterize(ref context, ref targetRenderer, settings); var outlinePadding = 1f; decorator = Decorations.AcceleratorLabel; Color?textColor = null; decorator.GetTextSettings(ref context, default(ControlStates), out Material material, ref textColor, out _); var layout = decorator.GlyphSource.LayoutString(label, buffer: AcceleratorOverlayBuffer); var textScale = 1f; if (layout.Size.X > (box.Width - decorator.Padding.X)) { textScale = Math.Max(0.25f, (box.Width - decorator.Padding.X) / layout.Size.X); } var scaledSize = layout.Size * textScale; var labelTraits = new DenseList <string> { "above" }; var labelPosition = box.Position - new Vector2(0, scaledSize.Y + decorator.Padding.Y + outlinePadding); if (labelPosition.Y <= 0) { labelTraits[0] = "inside"; labelPosition = box.Position; } labelPosition.X = Arithmetic.Clamp(labelPosition.X, 0, CanvasSize.X - scaledSize.X); labelPosition.Y = Math.Max(0, labelPosition.Y); var labelBox = new RectF( labelPosition, scaledSize + decorator.Padding.Size ); if (IsObstructedByAnyPreviousBox(ref labelBox, forControl)) { labelBox.Left = box.Extent.X - labelBox.Width; } if (IsObstructedByAnyPreviousBox(ref labelBox, forControl)) { labelTraits[0] = "below"; labelBox.Left = labelPosition.X; labelBox.Top = box.Extent.Y + 1; // FIXME: Why the +1? } while (IsObstructedByAnyPreviousBox(ref labelBox, forControl)) { labelTraits[0] = "stacked"; labelBox.Left = box.Left; labelBox.Width = box.Width; labelBox.Top = labelBox.Extent.Y + 0.5f; } // HACK var labelContentBox = new RectF( labelBox.Position + new Vector2(decorator.Padding.Left, decorator.Padding.Top), scaledSize ); settings = new Decorations.DecorationSettings { Box = labelBox, ContentBox = box, Traits = labelTraits }; decorator.Rasterize(ref context, ref labelRenderer, settings); labelRenderer.DrawMultiple(layout.DrawCalls, offset: labelContentBox.Position.Floor(), scale: new Vector2(textScale), layer: 1); RasterizedOverlayBoxes.Add(new RasterizedOverlayBox { Control = forControl, ControlBox = box, LabelBox = labelBox }); }