|
@@ -6,10 +6,10 @@
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
*
|
|
|
* 1. Redistributions of source code must retain the above copyright notice, this
|
|
|
- * list of conditions and the following disclaimer.
|
|
|
+ * list of conditions and the following disclaimer.
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
- * this list of conditions and the following disclaimer in the documentation
|
|
|
- * and/or other materials provided with the distribution.
|
|
|
+ * this list of conditions and the following disclaimer in the documentation
|
|
|
+ * and/or other materials provided with the distribution.
|
|
|
*
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
@@ -23,105 +23,96 @@
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
******************************************************************************/
|
|
|
|
|
|
-using System;
|
|
|
-using System.IO;
|
|
|
-using Microsoft.Xna.Framework;
|
|
|
-using Microsoft.Xna.Framework.Graphics;
|
|
|
-
|
|
|
+using System;
|
|
|
+using System.IO;
|
|
|
+using Microsoft.Xna.Framework;
|
|
|
+using Microsoft.Xna.Framework.Graphics;
|
|
|
+
|
|
|
#if WINDOWS_STOREAPP
|
|
|
using System.Threading.Tasks;
|
|
|
using Windows.Storage;
|
|
|
-#endif
|
|
|
-
|
|
|
+#endif
|
|
|
+
|
|
|
namespace Spine {
|
|
|
|
|
|
- static public class Util {
|
|
|
+ static public class Util {
|
|
|
#if WINDOWS_STOREAPP
|
|
|
- private static async Task<Texture2D> LoadFile(GraphicsDevice device, String path)
|
|
|
- {
|
|
|
- var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
|
|
|
-
|
|
|
- var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false);
|
|
|
+ private static async Task<Texture2D> LoadFile(GraphicsDevice device, String path) {
|
|
|
+ var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
|
|
|
+ var file = await folder.GetFileAsync(path).AsTask().ConfigureAwait(false);
|
|
|
+ try {
|
|
|
+ return Util.LoadTexture(device, await file.OpenStreamForReadAsync().ConfigureAwait(false));
|
|
|
+ } catch (Exception ex) {
|
|
|
+ throw new Exception("Error reading texture file: " + path, ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- try
|
|
|
- {
|
|
|
- return Util.LoadTexture(device, await file.OpenStreamForReadAsync().ConfigureAwait(false));
|
|
|
- }
|
|
|
- catch (Exception ex)
|
|
|
- {
|
|
|
- throw new Exception("Error reading texture file: " + path, ex);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- static public Texture2D LoadTexture (GraphicsDevice device, String path)
|
|
|
- {
|
|
|
- return LoadFile(device, path).Result;
|
|
|
- }
|
|
|
-#else
|
|
|
- static public Texture2D LoadTexture (GraphicsDevice device, String path) {
|
|
|
- using (Stream input = new FileStream(path, FileMode.Open, FileAccess.Read)) {
|
|
|
- try {
|
|
|
- return Util.LoadTexture(device, input);
|
|
|
- } catch (Exception ex) {
|
|
|
- throw new Exception("Error reading texture file: " + path, ex);
|
|
|
- }
|
|
|
- }
|
|
|
+ static public Texture2D LoadTexture (GraphicsDevice device, String path) {
|
|
|
+ return LoadFile(device, path).Result;
|
|
|
}
|
|
|
-
|
|
|
+#else
|
|
|
+ static public Texture2D LoadTexture (GraphicsDevice device, String path) {
|
|
|
+ using (Stream input = new FileStream(path, FileMode.Open, FileAccess.Read)) {
|
|
|
+ try {
|
|
|
+ return Util.LoadTexture(device, input);
|
|
|
+ } catch (Exception ex) {
|
|
|
+ throw new Exception("Error reading texture file: " + path, ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
#endif
|
|
|
- static public Texture2D LoadTexture (GraphicsDevice device, Stream input) {
|
|
|
- Texture2D file = Texture2D.FromStream(device, input);
|
|
|
-
|
|
|
- // Setup a render target to hold our final texture which will have premulitplied alpha values
|
|
|
- RenderTarget2D result = new RenderTarget2D(device, file.Width, file.Height);
|
|
|
- device.SetRenderTarget(result);
|
|
|
- device.Clear(Color.Black);
|
|
|
-
|
|
|
- // Multiply each color by the source alpha, and write in just the color values into the final texture
|
|
|
- BlendState blendColor = new BlendState();
|
|
|
- blendColor.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue;
|
|
|
- blendColor.AlphaDestinationBlend = Blend.Zero;
|
|
|
- blendColor.ColorDestinationBlend = Blend.Zero;
|
|
|
- blendColor.AlphaSourceBlend = Blend.SourceAlpha;
|
|
|
- blendColor.ColorSourceBlend = Blend.SourceAlpha;
|
|
|
-
|
|
|
- SpriteBatch spriteBatch = new SpriteBatch(device);
|
|
|
- spriteBatch.Begin(SpriteSortMode.Immediate, blendColor);
|
|
|
- spriteBatch.Draw(file, file.Bounds, Color.White);
|
|
|
- spriteBatch.End();
|
|
|
-
|
|
|
- // Now copy over the alpha values from the PNG source texture to the final one, without multiplying them
|
|
|
- BlendState blendAlpha = new BlendState();
|
|
|
- blendAlpha.ColorWriteChannels = ColorWriteChannels.Alpha;
|
|
|
- blendAlpha.AlphaDestinationBlend = Blend.Zero;
|
|
|
- blendAlpha.ColorDestinationBlend = Blend.Zero;
|
|
|
- blendAlpha.AlphaSourceBlend = Blend.One;
|
|
|
- blendAlpha.ColorSourceBlend = Blend.One;
|
|
|
-
|
|
|
- spriteBatch.Begin(SpriteSortMode.Immediate, blendAlpha);
|
|
|
- spriteBatch.Draw(file, file.Bounds, Color.White);
|
|
|
- spriteBatch.End();
|
|
|
-
|
|
|
- // Release the GPU back to drawing to the screen
|
|
|
- device.SetRenderTarget(null);
|
|
|
|
|
|
+ static public Texture2D LoadTexture (GraphicsDevice device, Stream input) {
|
|
|
+ Texture2D file = Texture2D.FromStream(device, input);
|
|
|
+
|
|
|
+ // Setup a render target to hold our final texture which will have premulitplied alpha values
|
|
|
+ RenderTarget2D result = new RenderTarget2D(device, file.Width, file.Height);
|
|
|
+ device.SetRenderTarget(result);
|
|
|
+ device.Clear(Color.Black);
|
|
|
+
|
|
|
+ // Multiply each color by the source alpha, and write in just the color values into the final texture
|
|
|
+ BlendState blendColor = new BlendState();
|
|
|
+ blendColor.ColorWriteChannels = ColorWriteChannels.Red | ColorWriteChannels.Green | ColorWriteChannels.Blue;
|
|
|
+ blendColor.AlphaDestinationBlend = Blend.Zero;
|
|
|
+ blendColor.ColorDestinationBlend = Blend.Zero;
|
|
|
+ blendColor.AlphaSourceBlend = Blend.SourceAlpha;
|
|
|
+ blendColor.ColorSourceBlend = Blend.SourceAlpha;
|
|
|
+
|
|
|
+ SpriteBatch spriteBatch = new SpriteBatch(device);
|
|
|
+ spriteBatch.Begin(SpriteSortMode.Immediate, blendColor);
|
|
|
+ spriteBatch.Draw(file, file.Bounds, Color.White);
|
|
|
+ spriteBatch.End();
|
|
|
+
|
|
|
+ // Now copy over the alpha values from the PNG source texture to the final one, without multiplying them
|
|
|
+ BlendState blendAlpha = new BlendState();
|
|
|
+ blendAlpha.ColorWriteChannels = ColorWriteChannels.Alpha;
|
|
|
+ blendAlpha.AlphaDestinationBlend = Blend.Zero;
|
|
|
+ blendAlpha.ColorDestinationBlend = Blend.Zero;
|
|
|
+ blendAlpha.AlphaSourceBlend = Blend.One;
|
|
|
+ blendAlpha.ColorSourceBlend = Blend.One;
|
|
|
+
|
|
|
+ spriteBatch.Begin(SpriteSortMode.Immediate, blendAlpha);
|
|
|
+ spriteBatch.Draw(file, file.Bounds, Color.White);
|
|
|
+ spriteBatch.End();
|
|
|
+
|
|
|
+ // Release the GPU back to drawing to the screen.
|
|
|
+ device.SetRenderTarget(null);
|
|
|
+ spriteBatch.Dispose();
|
|
|
+ file.Dispose();
|
|
|
+
|
|
|
#if IOS
|
|
|
return result as Texture2D;
|
|
|
-#else
|
|
|
- // RenderTarget2D are volatile and will be lost on screen resolution changes.
|
|
|
- // So instead of using this directly, we create a non-voliate Texture2D.
|
|
|
- // This is computationally slower, but should be safe as long as it is done
|
|
|
- // on load.
|
|
|
- Texture2D resultTexture = new Texture2D(device, file.Width, file.Height);
|
|
|
- Color[] resultContent = new Color[Convert.ToInt32(file.Width * file.Height)];
|
|
|
- result.GetData(resultContent);
|
|
|
- resultTexture.SetData(resultContent);
|
|
|
-
|
|
|
- // Dispose of the RenderTarget2D immediately.
|
|
|
- result.Dispose();
|
|
|
-
|
|
|
- return resultTexture;
|
|
|
-#endif
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+#else
|
|
|
+ // RenderTarget2D are volatile and will be lost on screen resolution changes.
|
|
|
+ // So instead of using this directly, we create a non-voliate Texture2D.
|
|
|
+ // This is computationally slower, but should be safe as long as it is done on load.
|
|
|
+ Texture2D resultTexture = new Texture2D(device, file.Width, file.Height);
|
|
|
+ Color[] resultContent = new Color[Convert.ToInt32(file.Width * file.Height)];
|
|
|
+ result.GetData(resultContent);
|
|
|
+ resultTexture.SetData(resultContent);
|
|
|
+ result.Dispose(); // Dispose of the RenderTarget2D immediately.
|
|
|
+ return resultTexture;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|