internal void InternalDraw(Texture2D texture, Vector2 position, Rectangle?sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth) { byte r, g, b, a; switch (fixedBlendState) { default: case FixedBlendState.AlphaBlend: // One, 1-SrcAlpha r = color.cR; g = color.cG; b = color.cB; a = color.A; // TODO: Emit warning if premultiplied R,G or B is greater than A. // This would normally cause additive blending. Currently not handled by ExEnSilver. break; case FixedBlendState.NonPremultiplied: // SrcAlpha, 1-SrcAlpha r = color.R; g = color.G; b = color.B; a = color.A; break; case FixedBlendState.Additive: // SrcAlpha, One r = color.R; g = color.G; b = color.B; a = color.A; break; case FixedBlendState.Opaque: // One, Zero r = color.R; g = color.G; b = color.B; a = 255; break; } if (a == 0) // Nothing to draw { return; } // Dynamic rectangle only used if there's actually a source rectangle! bool dynamicRectangle = hintDynamicRectangle && sourceRectangle.HasValue; ImageSourceId id = new ImageSourceId(r, g, b, sourceRectangle, tintEffectMode, hintUseCache, hintDynamicColor, dynamicRectangle); ImageSprite sprite = texture.GetSprite(id); if (hintDynamicColor) { sprite.UpdateDynamicColor(r, g, b); } if (dynamicRectangle) { sprite.UpdateDynamicRectangle(sourceRectangle.Value); } Vector2 sourceSize = sourceRectangle.HasValue ? new Vector2(sourceRectangle.Value.Width, sourceRectangle.Value.Height) : new Vector2(texture.Width, texture.Height); Vector2 sourceOrigin = dynamicRectangle ? new Vector2(sourceRectangle.Value.X, sourceRectangle.Value.Y) : Vector2.Zero; sprite.Transform(position, scale, origin, sourceOrigin, sourceSize, rotation, effects, ref currentMatrix); sprite.SetOpacity(a / 255f); GraphicsDevice.DrawSprite(sprite); }
internal void InternalDraw(Texture2D texture, Vector2 position, Rectangle? sourceRectangle, Color color, float rotation, Vector2 origin, Vector2 scale, SpriteEffects effects, float layerDepth) { byte r, g, b, a; switch(fixedBlendState) { default: case FixedBlendState.AlphaBlend: // One, 1-SrcAlpha r = color.cR; g = color.cG; b = color.cB; a = color.A; // TODO: Emit warning if premultiplied R,G or B is greater than A. // This would normally cause additive blending. Currently not handled by ExEnSilver. break; case FixedBlendState.NonPremultiplied: // SrcAlpha, 1-SrcAlpha r = color.R; g = color.G; b = color.B; a = color.A; break; case FixedBlendState.Additive: // SrcAlpha, One r = color.R; g = color.G; b = color.B; a = color.A; break; case FixedBlendState.Opaque: // One, Zero r = color.R; g = color.G; b = color.B; a = 255; break; } if(a == 0) // Nothing to draw return; // Dynamic rectangle only used if there's actually a source rectangle! bool dynamicRectangle = hintDynamicRectangle && sourceRectangle.HasValue; ImageSourceId id = new ImageSourceId(r, g, b, sourceRectangle, tintEffectMode, hintUseCache, hintDynamicColor, dynamicRectangle); ImageSprite sprite = texture.GetSprite(id); if(hintDynamicColor) sprite.UpdateDynamicColor(r, g, b); if(dynamicRectangle) sprite.UpdateDynamicRectangle(sourceRectangle.Value); Vector2 sourceSize = sourceRectangle.HasValue ? new Vector2(sourceRectangle.Value.Width, sourceRectangle.Value.Height) : new Vector2(texture.Width, texture.Height); Vector2 sourceOrigin = dynamicRectangle ? new Vector2(sourceRectangle.Value.X, sourceRectangle.Value.Y) : Vector2.Zero; sprite.Transform(position, scale, origin, sourceOrigin, sourceSize, rotation, effects, ref currentMatrix); sprite.SetOpacity(a / 255f); GraphicsDevice.DrawSprite(sprite); }