Пример #1
0
        // implemets abstract from base
        protected override void AddImageRenderGeometryToWindowImpl(Window srcWindow, Rectf destRect, ColourRect modColours, Rectf?clipper,
                                                                   bool clipToDisplay)
        {
            var   backgroundRect = destRect;
            Sizef imageSize;

            Lunatics.Mathematics.Vector2 imageOffsets;
            float leftfactor, rightfactor, topfactor, bottomfactor;
            bool  calcColoursPerImage;

            // vars we use to track what to do with the side pieces.
            float topOffset = 0, bottomOffset = 0, leftOffset = 0, rightOffset = 0;
            float topWidth, bottomWidth, leftHeight, rightHeight;

            topWidth   = bottomWidth = destRect.Width;
            leftHeight = rightHeight = destRect.Height;

            // calculate final overall colours to be used
            ColourRect renderSettingFinalColours;

            InitColoursRect(srcWindow, modColours, out renderSettingFinalColours);

            var renderSettings = new ImageRenderSettings(Rectf.Zero, clipper, !clipToDisplay, renderSettingFinalColours);

            //var renderSettingDestArea = renderSettings.destArea;
            //var renderSettingMultiplyColours = renderSettings.multiplyColours;

            calcColoursPerImage = !renderSettingFinalColours.IsMonochromatic();

            // top-left image
            var componentImage = GetImage(FrameImageComponent.TopLeftCorner, srcWindow);

            if (componentImage != null)
            {
                // calculate final destination area
                imageSize    = componentImage.GetRenderedSize();
                imageOffsets = componentImage.GetRenderedOffset();
                renderSettings.DestArea.d_min = destRect.d_min;
                renderSettings.DestArea.Size  = imageSize;
                renderSettings.DestArea       = destRect.GetIntersection(renderSettings.DestArea);

                // update adjustments required to edges do to presence of this element.
                topOffset  += imageSize.Width + imageOffsets.X;
                leftOffset += imageSize.Height + imageOffsets.Y;
                topWidth   -= topOffset;
                leftHeight -= leftOffset;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + imageOffsets.X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + imageOffsets.Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this element and append it to the Window's geometry
                var imageGeomBuffers = componentImage.CreateRenderGeometry(renderSettings);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // top-right image
            componentImage = GetImage(FrameImageComponent.TopRightCorner, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize    = componentImage.GetRenderedSize();
                imageOffsets = componentImage.GetRenderedOffset();
                renderSettings.DestArea.Left = destRect.Right - imageSize.Width;
                renderSettings.DestArea.Top  = destRect.Top;
                renderSettings.DestArea.Size = imageSize;
                renderSettings.DestArea      = destRect.GetIntersection(renderSettings.DestArea);

                // update adjustments required to edges do to presence of this element.
                rightOffset += imageSize.Height + imageOffsets.Y;
                topWidth    -= imageSize.Width - imageOffsets.X;
                rightHeight -= rightOffset;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + imageOffsets.X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + imageOffsets.Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this element and append it to the Window's geometry
                var imageGeomBuffers = componentImage.CreateRenderGeometry(renderSettings);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // bottom-left image
            componentImage = GetImage(FrameImageComponent.BottomLeftCorner, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize    = componentImage.GetRenderedSize();
                imageOffsets = componentImage.GetRenderedOffset();
                renderSettings.DestArea.Left = destRect.Left;
                renderSettings.DestArea.Top  = destRect.Bottom - imageSize.Height;
                renderSettings.DestArea.Size = imageSize;
                renderSettings.DestArea      = destRect.GetIntersection(renderSettings.DestArea);

                // update adjustments required to edges do to presence of this element.
                bottomOffset += imageSize.Width + imageOffsets.X;
                bottomWidth  -= bottomOffset;
                leftHeight   -= imageSize.Height - imageOffsets.Y;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + imageOffsets.X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + imageOffsets.Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this element and append it to the Window's geometry
                var imageGeomBuffers = componentImage.CreateRenderGeometry(renderSettings);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // bottom-right image
            componentImage = GetImage(FrameImageComponent.BottomRightCorner, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize    = componentImage.GetRenderedSize();
                imageOffsets = componentImage.GetRenderedOffset();
                renderSettings.DestArea.Left = destRect.Right - imageSize.Width;
                renderSettings.DestArea.Top  = destRect.Bottom - imageSize.Height;
                renderSettings.DestArea.Size = imageSize;
                renderSettings.DestArea      = destRect.GetIntersection(renderSettings.DestArea);

                // update adjustments required to edges do to presence of this element.
                bottomWidth -= imageSize.Width - imageOffsets.X;
                rightHeight -= imageSize.Height - imageOffsets.Y;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + componentImage.GetRenderedOffset().X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + componentImage.GetRenderedOffset().Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this element and append it to the Window's geometry
                var imageGeomBuffers = componentImage.CreateRenderGeometry(renderSettings);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // top image
            componentImage = GetImage(FrameImageComponent.TopEdge, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize = componentImage.GetRenderedSize();
                renderSettings.DestArea.Left   = destRect.Left + topOffset;
                renderSettings.DestArea.Right  = (renderSettings.DestArea.Left + topWidth);
                renderSettings.DestArea.Top    = destRect.Top;
                renderSettings.DestArea.Bottom = renderSettings.DestArea.Top + imageSize.Height;
                renderSettings.DestArea        = destRect.GetIntersection(renderSettings.DestArea);

                // adjust background area to miss this edge
                backgroundRect.d_min.Y += imageSize.Height + componentImage.GetRenderedOffset().Y;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + componentImage.GetRenderedOffset().X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + componentImage.GetRenderedOffset().Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this image and append it to the Window's geometry
                var imageGeomBuffers = CreateRenderGeometryForImage(componentImage,
                                                                    VerticalFormatting.TopAligned,
                                                                    TopEdgeFormatting.Get(srcWindow),
                                                                    renderSettings.DestArea,
                                                                    renderSettings.MultiplyColours,
                                                                    clipper,
                                                                    clipToDisplay);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // bottom image
            componentImage = GetImage(FrameImageComponent.BottomEdge, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize = componentImage.GetRenderedSize();
                renderSettings.DestArea.Left   = destRect.Left + bottomOffset;
                renderSettings.DestArea.Right  = renderSettings.DestArea.Left + bottomWidth;
                renderSettings.DestArea.Bottom = destRect.Bottom;
                renderSettings.DestArea.Top    = renderSettings.DestArea.Bottom - imageSize.Height;
                renderSettings.DestArea        = destRect.GetIntersection(renderSettings.DestArea);

                // adjust background area to miss this edge
                backgroundRect.d_max.Y -= imageSize.Height - componentImage.GetRenderedOffset().Y;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + componentImage.GetRenderedOffset().X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + componentImage.GetRenderedOffset().Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this image and append it to the Window's geometry
                var imageGeomBuffers = CreateRenderGeometryForImage(componentImage,
                                                                    VerticalFormatting.BottomAligned,
                                                                    BottomEdgeFormatting.Get(srcWindow),
                                                                    renderSettings.DestArea,
                                                                    renderSettings.MultiplyColours,
                                                                    clipper,
                                                                    clipToDisplay);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // left image
            componentImage = GetImage(FrameImageComponent.LeftEdge, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize = componentImage.GetRenderedSize();
                renderSettings.DestArea.Left   = destRect.Left;
                renderSettings.DestArea.Right  = renderSettings.DestArea.Left + imageSize.Width;
                renderSettings.DestArea.Top    = destRect.Top + leftOffset;
                renderSettings.DestArea.Bottom = renderSettings.DestArea.Top + leftHeight;
                renderSettings.DestArea        = destRect.GetIntersection(renderSettings.DestArea);

                // adjust background area to miss this edge
                backgroundRect.d_min.X += imageSize.Width + componentImage.GetRenderedOffset().X;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + componentImage.GetRenderedOffset().X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + componentImage.GetRenderedOffset().Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this image and append it to the Window's geometry
                var imageGeomBuffers = CreateRenderGeometryForImage(componentImage,
                                                                    LeftEdgeFormatting.Get(srcWindow),
                                                                    HorizontalFormatting.LeftAligned,
                                                                    renderSettings.DestArea,
                                                                    renderSettings.MultiplyColours,
                                                                    clipper,
                                                                    clipToDisplay);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            // right image
            componentImage = GetImage(FrameImageComponent.RightEdge, srcWindow);
            if (componentImage != null)
            {
                // calculate final destination area
                imageSize = componentImage.GetRenderedSize();
                renderSettings.DestArea.Top    = destRect.Top + rightOffset;
                renderSettings.DestArea.Bottom = renderSettings.DestArea.Top + rightHeight;
                renderSettings.DestArea.Right  = destRect.Right;
                renderSettings.DestArea.Left   = renderSettings.DestArea.Right - imageSize.Width;
                renderSettings.DestArea        = destRect.GetIntersection(renderSettings.DestArea);

                // adjust background area to miss this edge
                backgroundRect.d_max.X -= imageSize.Width - componentImage.GetRenderedOffset().X;

                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (renderSettings.DestArea.Left + componentImage.GetRenderedOffset().X) / destRect.Width;
                    rightfactor  = leftfactor + renderSettings.DestArea.Width / destRect.Width;
                    topfactor    = (renderSettings.DestArea.Top + componentImage.GetRenderedOffset().Y) / destRect.Height;
                    bottomfactor = topfactor + renderSettings.DestArea.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                // create render geometry for this image and append it to the Window's geometry
                var imageGeomBuffers = CreateRenderGeometryForImage(componentImage,
                                                                    RightEdgeFormatting.Get(srcWindow),
                                                                    HorizontalFormatting.RightAligned,
                                                                    renderSettings.DestArea,
                                                                    renderSettings.MultiplyColours,
                                                                    clipper,
                                                                    clipToDisplay);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }

            componentImage = GetImage(FrameImageComponent.Background, srcWindow);
            if (componentImage != null)
            {
                // calculate colours that are to be used to this component image
                if (calcColoursPerImage)
                {
                    leftfactor   = (backgroundRect.Left + componentImage.GetRenderedOffset().X) / destRect.Width;
                    rightfactor  = leftfactor + backgroundRect.Width / destRect.Width;
                    topfactor    = (backgroundRect.Top + componentImage.GetRenderedOffset().Y) / destRect.Height;
                    bottomfactor = topfactor + backgroundRect.Height / destRect.Height;

                    renderSettings.MultiplyColours = renderSettingFinalColours.GetSubRectangle(leftfactor, rightfactor, topfactor, bottomfactor);
                }

                var horzFormatting = BackgroundHorzFormatting.Get(srcWindow);
                var vertFormatting = BackgroundVertFormatting.Get(srcWindow);

                var imageGeomBuffers = CreateRenderGeometryForImage(componentImage,
                                                                    vertFormatting,
                                                                    horzFormatting,
                                                                    backgroundRect,
                                                                    renderSettings.MultiplyColours,
                                                                    clipper,
                                                                    clipToDisplay);
                srcWindow.AppendGeometryBuffers(imageGeomBuffers);
            }
        }
Пример #2
0
 /// <summary>
 /// Set the name of a property that will be used to obtain the horizontal
 /// formatting to use for the backdround image.
 /// </summary>
 /// <param name="propertyName"></param>
 public void SetBackgroundHorizontalFormattingPropertySource(string propertyName)
 {
     BackgroundHorzFormatting.SetPropertySource(propertyName);
 }
Пример #3
0
 /// <summary>
 /// Return the horizontal formatting to be used for the background image.
 /// </summary>
 /// <param name="wnd"></param>
 /// <returns>
 /// One of the HorizontalFormatting enumerated values.
 /// </returns>
 public HorizontalFormatting GetBackgroundHorizontalFormatting(Window wnd)
 {
     return(BackgroundHorzFormatting.Get(wnd));
 }
Пример #4
0
 /// <summary>
 /// Set the horizontal formatting to be used for the background image.
 /// </summary>
 /// <param name="fmt">
 /// One of the HorizontalFormatting enumerated values.
 /// </param>
 public void SetBackgroundHorizontalFormatting(HorizontalFormatting fmt)
 {
     BackgroundHorzFormatting.Set(fmt);
 }