Example #1
0
        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)));
        }
Example #2
0
        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();
            }
        }
Example #3
0
        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;
            }
        }
Example #4
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);
        }
Example #5
0
        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
            });
        }