public void DrawTexture(TextureStylePainterParameters painterParams)
        {
            Rect      screenRect          = painterParams.rect;
            Rect      sourceRect          = painterParams.uv != Rect.zero ? painterParams.uv : new Rect(0, 0, 1, 1);
            Texture   texture             = painterParams.texture;
            Color     color               = painterParams.color;
            ScaleMode scaleMode           = painterParams.scaleMode;
            int       sliceLeft           = painterParams.sliceLeft;
            int       sliceTop            = painterParams.sliceTop;
            int       sliceRight          = painterParams.sliceRight;
            int       sliceBottom         = painterParams.sliceBottom;
            bool      usePremultiplyAlpha = painterParams.usePremultiplyAlpha;

            Rect textureRect = screenRect;

            /// Comparing aspects ratio is error-prone because the <c>screenRect</c> may end up being scaled by the
            /// transform and the corners will end up being pixel aligned, possibly resulting in blurriness.
            float srcAspect  = (texture.width * sourceRect.width) / (texture.height * sourceRect.height);
            float destAspect = screenRect.width / screenRect.height;

            switch (scaleMode)
            {
            case ScaleMode.StretchToFill:
                break;

            case ScaleMode.ScaleAndCrop:
                if (destAspect > srcAspect)
                {
                    float stretch = sourceRect.height * (srcAspect / destAspect);
                    float crop    = (sourceRect.height - stretch) * 0.5f;
                    sourceRect = new Rect(sourceRect.x, sourceRect.y + crop, sourceRect.width, stretch);
                }
                else
                {
                    float stretch = sourceRect.width * (destAspect / srcAspect);
                    float crop    = (sourceRect.width - stretch) * 0.5f;
                    sourceRect = new Rect(sourceRect.x + crop, sourceRect.y, stretch, sourceRect.height);
                }
                break;

            case ScaleMode.ScaleToFit:
                if (destAspect > srcAspect)
                {
                    float stretch = srcAspect / destAspect;
                    textureRect = new Rect(screenRect.xMin + screenRect.width * (1.0f - stretch) * .5f, screenRect.yMin, stretch * screenRect.width, screenRect.height);
                }
                else
                {
                    float stretch = destAspect / srcAspect;
                    textureRect = new Rect(screenRect.xMin, screenRect.yMin + screenRect.height * (1.0f - stretch) * .5f, screenRect.width, stretch * screenRect.height);
                }
                break;
            }

            var borderWidths   = painterParams.border.GetWidths();
            var borderRadiuses = painterParams.border.GetRadiuses();

            DrawTexture(textureRect, texture, sourceRect, color * m_OpacityColor, borderWidths, borderRadiuses, sliceLeft, sliceTop, sliceRight, sliceBottom, usePremultiplyAlpha);
        }
Beispiel #2
0
        public void DrawTexture(TextureStylePainterParameters painterParams)
        {
            Rect      rect                = painterParams.rect;
            Rect      sourceRect          = (!(painterParams.uv != Rect.zero)) ? new Rect(0f, 0f, 1f, 1f) : painterParams.uv;
            Texture   texture             = painterParams.texture;
            Color     color               = painterParams.color;
            ScaleMode scaleMode           = painterParams.scaleMode;
            int       sliceLeft           = painterParams.sliceLeft;
            int       sliceTop            = painterParams.sliceTop;
            int       sliceRight          = painterParams.sliceRight;
            int       sliceBottom         = painterParams.sliceBottom;
            bool      usePremultiplyAlpha = painterParams.usePremultiplyAlpha;
            Rect      screenRect          = rect;
            float     num  = (float)texture.width * sourceRect.width / ((float)texture.height * sourceRect.height);
            float     num2 = rect.width / rect.height;

            if (scaleMode != ScaleMode.StretchToFill)
            {
                if (scaleMode != ScaleMode.ScaleAndCrop)
                {
                    if (scaleMode == ScaleMode.ScaleToFit)
                    {
                        if (num2 > num)
                        {
                            float num3 = num / num2;
                            screenRect = new Rect(rect.xMin + rect.width * (1f - num3) * 0.5f, rect.yMin, num3 * rect.width, rect.height);
                        }
                        else
                        {
                            float num4 = num2 / num;
                            screenRect = new Rect(rect.xMin, rect.yMin + rect.height * (1f - num4) * 0.5f, rect.width, num4 * rect.height);
                        }
                    }
                }
                else if (num2 > num)
                {
                    float num5 = sourceRect.height * (num / num2);
                    float num6 = (sourceRect.height - num5) * 0.5f;
                    sourceRect = new Rect(sourceRect.x, sourceRect.y + num6, sourceRect.width, num5);
                }
                else
                {
                    float num7 = sourceRect.width * (num2 / num);
                    float num8 = (sourceRect.width - num7) * 0.5f;
                    sourceRect = new Rect(sourceRect.x + num8, sourceRect.y, num7, sourceRect.height);
                }
            }
            Vector4 widths   = painterParams.border.GetWidths();
            Vector4 radiuses = painterParams.border.GetRadiuses();

            this.DrawTexture_Internal(screenRect, texture, sourceRect, color * this.m_OpacityColor, widths, radiuses, sliceLeft, sliceTop, sliceRight, sliceBottom, usePremultiplyAlpha);
        }
Beispiel #3
0
        public void DrawTexture(TextureStylePainterParameters painterParams)
        {
            Rect      layout      = painterParams.layout;
            Texture   texture     = painterParams.texture;
            Color     color       = painterParams.color;
            ScaleMode scaleMode   = painterParams.scaleMode;
            int       sliceLeft   = painterParams.sliceLeft;
            int       sliceTop    = painterParams.sliceTop;
            int       sliceRight  = painterParams.sliceRight;
            int       sliceBottom = painterParams.sliceBottom;
            Rect      screenRect  = layout;
            Rect      sourceRect  = new Rect(0f, 0f, 1f, 1f);
            float     num         = (float)texture.width / (float)texture.height;
            float     num2        = layout.width / layout.height;

            if (scaleMode != ScaleMode.StretchToFill)
            {
                if (scaleMode != ScaleMode.ScaleAndCrop)
                {
                    if (scaleMode == ScaleMode.ScaleToFit)
                    {
                        if (num2 > num)
                        {
                            float num3 = num / num2;
                            screenRect = new Rect(layout.xMin + layout.width * (1f - num3) * 0.5f, layout.yMin, num3 * layout.width, layout.height);
                        }
                        else
                        {
                            float num4 = num2 / num;
                            screenRect = new Rect(layout.xMin, layout.yMin + layout.height * (1f - num4) * 0.5f, layout.width, num4 * layout.height);
                        }
                    }
                }
                else if (num2 > num)
                {
                    float num5 = num / num2;
                    sourceRect = new Rect(0f, (1f - num5) * 0.5f, 1f, num5);
                }
                else
                {
                    float num6 = num2 / num;
                    sourceRect = new Rect(0.5f - num6 * 0.5f, 0f, num6, 1f);
                }
            }
            Vector4 borderWidths   = new Vector4(painterParams.borderLeftWidth, painterParams.borderTopWidth, painterParams.borderRightWidth, painterParams.borderBottomWidth);
            Vector4 borderRadiuses = new Vector4(painterParams.borderTopLeftRadius, painterParams.borderTopRightRadius, painterParams.borderBottomRightRadius, painterParams.borderBottomLeftRadius);

            this.DrawTexture_Internal(screenRect, texture, sourceRect, color * this.m_OpacityColor, borderWidths, borderRadiuses, sliceLeft, sliceTop, sliceRight, sliceBottom);
        }