| 
				
			 | 
			
			
				@@ -10,12 +10,13 @@ namespace RNViewShot 
			 | 
		
	
		
			
			| 
				10
			 | 
			
				10
			 | 
			
			
				 { 
			 | 
		
	
		
			
			| 
				11
			 | 
			
				11
			 | 
			
			
				     public class ViewShot : IUIBlock 
			 | 
		
	
		
			
			| 
				12
			 | 
			
				12
			 | 
			
			
				     { 
			 | 
		
	
		
			
			| 
				13
			 | 
			
				
			 | 
			
			
				-        private const string ErrorUnableToSnapshot = "E_UNABLE_TO_SNAPSHOT"; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				13
			 | 
			
			
				+        public const string ErrorUnableToSnapshot = "E_UNABLE_TO_SNAPSHOT"; 
			 | 
		
	
		
			
			| 
				14
			 | 
			
				14
			 | 
			
			
				         private int tag; 
			 | 
		
	
		
			
			| 
				15
			 | 
			
				15
			 | 
			
			
				         private string extension; 
			 | 
		
	
		
			
			| 
				16
			 | 
			
				16
			 | 
			
			
				         private double quality; 
			 | 
		
	
		
			
			| 
				17
			 | 
			
				17
			 | 
			
			
				         private int? width; 
			 | 
		
	
		
			
			| 
				18
			 | 
			
				18
			 | 
			
			
				         private int? height; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				19
			 | 
			
			
				+        private string path; 
			 | 
		
	
		
			
			| 
				19
			 | 
			
				20
			 | 
			
			
				         private string result; 
			 | 
		
	
		
			
			| 
				20
			 | 
			
				21
			 | 
			
			
				         private IPromise promise; 
			 | 
		
	
		
			
			| 
				21
			 | 
			
				22
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -25,6 +26,7 @@ namespace RNViewShot 
			 | 
		
	
		
			
			| 
				25
			 | 
			
				26
			 | 
			
			
				             double quality, 
			 | 
		
	
		
			
			| 
				26
			 | 
			
				27
			 | 
			
			
				             int? width, 
			 | 
		
	
		
			
			| 
				27
			 | 
			
				28
			 | 
			
			
				             int? height, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				29
			 | 
			
			
				+            string path, 
			 | 
		
	
		
			
			| 
				28
			 | 
			
				30
			 | 
			
			
				             string result, 
			 | 
		
	
		
			
			| 
				29
			 | 
			
				31
			 | 
			
			
				             IPromise promise) 
			 | 
		
	
		
			
			| 
				30
			 | 
			
				32
			 | 
			
			
				         { 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -33,6 +35,7 @@ namespace RNViewShot 
			 | 
		
	
		
			
			| 
				33
			 | 
			
				35
			 | 
			
			
				             this.quality = quality; 
			 | 
		
	
		
			
			| 
				34
			 | 
			
				36
			 | 
			
			
				             this.width = width; 
			 | 
		
	
		
			
			| 
				35
			 | 
			
				37
			 | 
			
			
				             this.height = height; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				38
			 | 
			
			
				+            this.path = path; 
			 | 
		
	
		
			
			| 
				36
			 | 
			
				39
			 | 
			
			
				             this.result = result; 
			 | 
		
	
		
			
			| 
				37
			 | 
			
				40
			 | 
			
			
				             this.promise = promise; 
			 | 
		
	
		
			
			| 
				38
			 | 
			
				41
			 | 
			
			
				         } 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -45,60 +48,107 @@ namespace RNViewShot 
			 | 
		
	
		
			
			| 
				45
			 | 
			
				48
			 | 
			
			
				                 promise.Reject(ErrorUnableToSnapshot, "No view found with reactTag: " + tag); 
			 | 
		
	
		
			
			| 
				46
			 | 
			
				49
			 | 
			
			
				                 return; 
			 | 
		
	
		
			
			| 
				47
			 | 
			
				50
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				48
			 | 
			
				
			 | 
			
			
				-            int width = (int)view.ActualWidth; 
			 | 
		
	
		
			
			| 
				49
			 | 
			
				
			 | 
			
			
				-            int height = (int)view.ActualHeight; 
			 | 
		
	
		
			
			| 
				50
			 | 
			
				51
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				51
			 | 
			
				
			 | 
			
			
				-            RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default); 
			 | 
		
	
		
			
			| 
				52
			 | 
			
				
			 | 
			
			
				-            renderTargetBitmap.Render(view); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+            try 
			 | 
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				+            { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				54
			 | 
			
			
				+                BitmapEncoder image = CaptureView(view); 
			 | 
		
	
		
			
			| 
				53
			 | 
			
				55
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				54
			 | 
			
				
			 | 
			
			
				-            BitmapEncoder image; 
			 | 
		
	
		
			
			| 
				55
			 | 
			
				
			 | 
			
			
				-            if (extension == "png") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				+                if ("file" == result) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				+                { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				+                    string filePath = GetFilePath(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				59
			 | 
			
			
				+                    Stream stream = File.Create(filePath); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				+                    image.Save(stream); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				+                    promise.Resolve(filePath); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				+                    stream.Close(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				63
			 | 
			
			
				+                } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				64
			 | 
			
			
				+                else if ("base64" == result) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				+                { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				+                    MemoryStream stream = new MemoryStream(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				+                    image.Save(stream); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+                    byte[] imageBytes = stream.ToArray(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				+                    string data = Convert.ToBase64String(imageBytes); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				70
			 | 
			
			
				+                    promise.Resolve(data); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				71
			 | 
			
			
				+                    stream.Close(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				72
			 | 
			
			
				+                } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				73
			 | 
			
			
				+                else if ("data-uri" == result) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				74
			 | 
			
			
				+                { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				75
			 | 
			
			
				+                    MemoryStream stream = new MemoryStream(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				76
			 | 
			
			
				+                    image.Save(stream); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				77
			 | 
			
			
				+                    byte[] imageBytes = stream.ToArray(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				78
			 | 
			
			
				+                    string data = Convert.ToBase64String(imageBytes); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				79
			 | 
			
			
				+                    data = "data:image/" + extension + ";base64," + data; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				80
			 | 
			
			
				+                    promise.Resolve(data); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				81
			 | 
			
			
				+                    stream.Close(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				82
			 | 
			
			
				+                } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				83
			 | 
			
			
				+                else 
			 | 
		
	
		
			
			| 
				
			 | 
			
				84
			 | 
			
			
				+                { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				85
			 | 
			
			
				+                    promise.Reject(ErrorUnableToSnapshot, "Unsupported result: " + result + ". Try one of: file | base64 | data-uri"); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				86
			 | 
			
			
				+                } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				87
			 | 
			
			
				+            } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				+            catch (Exception ex) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				89
			 | 
			
			
				+            { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				90
			 | 
			
			
				+                Console.WriteLine(ex.ToString()); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				91
			 | 
			
			
				+                promise.Reject(ErrorUnableToSnapshot, "Failed to capture view snapshot"); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				92
			 | 
			
			
				+            } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				93
			 | 
			
			
				+        } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				94
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				95
			 | 
			
			
				+        private BitmapEncoder CaptureView(FrameworkElement view) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				96
			 | 
			
			
				+        { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				97
			 | 
			
			
				+            int w = (int)view.ActualWidth; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				98
			 | 
			
			
				+            int h = (int)view.ActualHeight; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				99
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				100
			 | 
			
			
				+            if (w <= 0 || h <= 0) 
			 | 
		
	
		
			
			| 
				56
			 | 
			
				101
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				57
			 | 
			
				
			 | 
			
			
				-                image = new PngBitmapEncoder(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				102
			 | 
			
			
				+                throw new InvalidOperationException("Impossible to snapshot the view: view is invalid"); 
			 | 
		
	
		
			
			| 
				58
			 | 
			
				103
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				59
			 | 
			
				
			 | 
			
			
				-            else if (extension == "jpg" || extension == "jpeg") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				104
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				105
			 | 
			
			
				+            RenderTargetBitmap targetBitmap = new RenderTargetBitmap(w, h, 96, 96, PixelFormats.Default); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				106
			 | 
			
			
				+            targetBitmap.Render(view); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				107
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				108
			 | 
			
			
				+            BitmapSource bitmap; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				109
			 | 
			
			
				+            if (width != null && height != null && (width != w || height != h)) 
			 | 
		
	
		
			
			| 
				60
			 | 
			
				110
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				61
			 | 
			
				
			 | 
			
			
				-                image = new JpegBitmapEncoder(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				111
			 | 
			
			
				+                double scaleX = (double)width / targetBitmap.PixelWidth; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				112
			 | 
			
			
				+                double scaleY = (double)height / targetBitmap.PixelHeight; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				113
			 | 
			
			
				+                bitmap = new TransformedBitmap(targetBitmap, new ScaleTransform(scaleX, scaleY)); 
			 | 
		
	
		
			
			| 
				62
			 | 
			
				114
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				63
			 | 
			
				115
			 | 
			
			
				             else 
			 | 
		
	
		
			
			| 
				64
			 | 
			
				116
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				65
			 | 
			
				
			 | 
			
			
				-                promise.Reject(ErrorUnableToSnapshot, "Unsupported image format: " + extension + ". Try one of: png | jpg | jpeg"); 
			 | 
		
	
		
			
			| 
				66
			 | 
			
				
			 | 
			
			
				-                return; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				117
			 | 
			
			
				+                bitmap = targetBitmap; 
			 | 
		
	
		
			
			| 
				67
			 | 
			
				118
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				68
			 | 
			
				119
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				69
			 | 
			
				
			 | 
			
			
				-            // TODO: Allow setting quality 
			 | 
		
	
		
			
			| 
				70
			 | 
			
				
			 | 
			
			
				-            image.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				120
			 | 
			
			
				+            if (bitmap == null) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				121
			 | 
			
			
				+            { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				122
			 | 
			
			
				+                throw new InvalidOperationException("Impossible to snapshot the view"); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				123
			 | 
			
			
				+            } 
			 | 
		
	
		
			
			| 
				71
			 | 
			
				124
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				72
			 | 
			
				
			 | 
			
			
				-            if ("file" == result) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				125
			 | 
			
			
				+            if (extension == "png") 
			 | 
		
	
		
			
			| 
				73
			 | 
			
				126
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				74
			 | 
			
				
			 | 
			
			
				-                // TODO: Allow specifying path 
			 | 
		
	
		
			
			| 
				75
			 | 
			
				
			 | 
			
			
				-                string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "testing." + extension); 
			 | 
		
	
		
			
			| 
				76
			 | 
			
				
			 | 
			
			
				-                using (Stream fileStream = File.Create(path)) 
			 | 
		
	
		
			
			| 
				77
			 | 
			
				
			 | 
			
			
				-                { 
			 | 
		
	
		
			
			| 
				78
			 | 
			
				
			 | 
			
			
				-                    image.Save(fileStream); 
			 | 
		
	
		
			
			| 
				79
			 | 
			
				
			 | 
			
			
				-                } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				127
			 | 
			
			
				+                PngBitmapEncoder image = new PngBitmapEncoder(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				128
			 | 
			
			
				+                image.Frames.Add(BitmapFrame.Create(bitmap)); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				129
			 | 
			
			
				+                return image; 
			 | 
		
	
		
			
			| 
				80
			 | 
			
				130
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				81
			 | 
			
				
			 | 
			
			
				-            else if ("base64" == result) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				131
			 | 
			
			
				+            else 
			 | 
		
	
		
			
			| 
				82
			 | 
			
				132
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				83
			 | 
			
				
			 | 
			
			
				-                MemoryStream stream = new MemoryStream(); 
			 | 
		
	
		
			
			| 
				84
			 | 
			
				
			 | 
			
			
				-                image.Save(stream); 
			 | 
		
	
		
			
			| 
				85
			 | 
			
				
			 | 
			
			
				-                byte[] imageBytes = stream.ToArray(); 
			 | 
		
	
		
			
			| 
				86
			 | 
			
				
			 | 
			
			
				-                string data = Convert.ToBase64String(imageBytes); 
			 | 
		
	
		
			
			| 
				87
			 | 
			
				
			 | 
			
			
				-                promise.Resolve(data); 
			 | 
		
	
		
			
			| 
				88
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				
			 | 
			
				133
			 | 
			
			
				+                JpegBitmapEncoder image = new JpegBitmapEncoder(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				134
			 | 
			
			
				+                image.QualityLevel = (int)(100.0 * quality); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				135
			 | 
			
			
				+                image.Frames.Add(BitmapFrame.Create(bitmap)); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				136
			 | 
			
			
				+                return image; 
			 | 
		
	
		
			
			| 
				89
			 | 
			
				137
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				90
			 | 
			
				
			 | 
			
			
				-            else if ("data-uri" == result) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				138
			 | 
			
			
				+        } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				139
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				140
			 | 
			
			
				+        private string GetFilePath() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				141
			 | 
			
			
				+        { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				142
			 | 
			
			
				+            if (string.IsNullOrEmpty(path))  
			 | 
		
	
		
			
			| 
				91
			 | 
			
				143
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				92
			 | 
			
				
			 | 
			
			
				-                MemoryStream stream = new MemoryStream(); 
			 | 
		
	
		
			
			| 
				93
			 | 
			
				
			 | 
			
			
				-                image.Save(stream); 
			 | 
		
	
		
			
			| 
				94
			 | 
			
				
			 | 
			
			
				-                byte[] imageBytes = stream.ToArray(); 
			 | 
		
	
		
			
			| 
				95
			 | 
			
				
			 | 
			
			
				-                string data = Convert.ToBase64String(imageBytes); 
			 | 
		
	
		
			
			| 
				96
			 | 
			
				
			 | 
			
			
				-                data = "data:image/" + extension + ";base64," + data; 
			 | 
		
	
		
			
			| 
				97
			 | 
			
				
			 | 
			
			
				-                promise.Resolve(data); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				144
			 | 
			
			
				+                string tmpFilePath = Path.GetTempPath(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				145
			 | 
			
			
				+                string fileName = Guid.NewGuid().ToString(); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				146
			 | 
			
			
				+                fileName = Path.ChangeExtension(fileName, extension); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				147
			 | 
			
			
				+                return Path.Combine(tmpFilePath, fileName); 
			 | 
		
	
		
			
			| 
				98
			 | 
			
				148
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				99
			 | 
			
				149
			 | 
			
			
				             else 
			 | 
		
	
		
			
			| 
				100
			 | 
			
				150
			 | 
			
			
				             { 
			 | 
		
	
		
			
			| 
				101
			 | 
			
				
			 | 
			
			
				-                promise.Reject(ErrorUnableToSnapshot, "Unsupported result: " + result + ". Try one of: file | base64 | data-uri"); 
			 | 
		
	
		
			
			| 
				
			 | 
			
				151
			 | 
			
			
				+                return path; 
			 | 
		
	
		
			
			| 
				102
			 | 
			
				152
			 | 
			
			
				             } 
			 | 
		
	
		
			
			| 
				103
			 | 
			
				153
			 | 
			
			
				         } 
			 | 
		
	
		
			
			| 
				104
			 | 
			
				154
			 | 
			
			
				     } 
			 |