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); }
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); }
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); }