diff --git a/Microsoft.DotNet.Wpf.Test.sln b/Microsoft.DotNet.Wpf.Test.sln
index a058bd378..f9c4f3831 100644
--- a/Microsoft.DotNet.Wpf.Test.sln
+++ b/Microsoft.DotNet.Wpf.Test.sln
@@ -177,6 +177,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DrtColorAPI", "src\Test\mil
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DrtElement3D", "src\Test\mil\DRT\element3D\DrtElement3D.csproj", "{399E54FC-7ECF-4C92-AE25-E9A63CF109EF}"
 EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DrtImaging", "src\Test\mil\DRT\imaging\DrtImaging.csproj", "{8ADB9363-7D3A-4A27-8FCB-A0F3AF54D48F}"
+EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DrtLocalization", "src\Test\Globalization\DRT\Localization\DrtLocalization.csproj", "{16A69D79-437D-451F-A221-8F1F5E95EEAC}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Basic", "src\Test\Globalization\DRT\Localization\Basic\Basic.csproj", "{8EB83D62-0A0D-48DB-97A5-8AEF59E327C1}"
diff --git a/src/Test/BranchCommon/data/DrtList.xml b/src/Test/BranchCommon/data/DrtList.xml
index 86b338325..94204e80f 100644
--- a/src/Test/BranchCommon/data/DrtList.xml
+++ b/src/Test/BranchCommon/data/DrtList.xml
@@ -338,6 +338,12 @@ Rundrtlist
   
   
   
+  
+    
+      DrtImagingD3D.dll
+      DrtFiles\DrtImaging
+    
+  
   
   
   
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/071_256.jpg b/src/Test/mil/DRT/imaging/DrtFiles/071_256.jpg
new file mode 100644
index 000000000..ef902f17f
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/071_256.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyAI.png b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyAI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyAN.png b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyAN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0AlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0AlphaBigEndian.tif
new file mode 100644
index 000000000..93d651e0d
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0AlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0AlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0AlphaLittleEndian.tif
new file mode 100644
index 000000000..26981e102
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0AlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0NoAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0NoAlphaBigEndian.tif
new file mode 100644
index 000000000..7305faff4
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0NoAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0NoAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0NoAlphaLittleEndian.tif
new file mode 100644
index 000000000..211cee22d
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyB0NoAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyI.png b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyLazyAlphaI.png b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyLazyAlphaI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyLazyAlphaI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyLazyAlphaN.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyN.png b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyN.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0AlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0AlphaBigEndian.tif
new file mode 100644
index 000000000..dc3af5116
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0AlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0AlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0AlphaLittleEndian.tif
new file mode 100644
index 000000000..5fa4961bf
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0AlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0NoAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0NoAlphaBigEndian.tif
new file mode 100644
index 000000000..9d948dc00
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0NoAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0NoAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0NoAlphaLittleEndian.tif
new file mode 100644
index 000000000..3f9230efb
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/16bppGreyW0NoAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyB0UncompressedLittleEndian(WhiteOnBlack).tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyB0UncompressedLittleEndian(WhiteOnBlack).tif
new file mode 100644
index 000000000..becb28819
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyB0UncompressedLittleEndian(WhiteOnBlack).tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyG3B0LittleEndian(WhiteOnBlack).tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyG3B0LittleEndian(WhiteOnBlack).tif
new file mode 100644
index 000000000..e9f5c81ca
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyG3B0LittleEndian(WhiteOnBlack).tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyG3W0LittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyG3W0LittleEndian.tif
new file mode 100644
index 000000000..fdd8621fb
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyG3W0LittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyHuffmanB0LittleEndian(BkOnWhSpecial).tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyHuffmanB0LittleEndian(BkOnWhSpecial).tif
new file mode 100644
index 000000000..d1c788241
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyHuffmanB0LittleEndian(BkOnWhSpecial).tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyHuffmanW0LittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyHuffmanW0LittleEndian.tif
new file mode 100644
index 000000000..36943507f
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyHuffmanW0LittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyI.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLZWB0LittleEndian(WhiteOnBlack).tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLZWB0LittleEndian(WhiteOnBlack).tif
new file mode 100644
index 000000000..c61157c41
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLZWB0LittleEndian(WhiteOnBlack).tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLZWW0LittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLZWW0LittleEndian.tif
new file mode 100644
index 000000000..06a159984
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLZWW0LittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLazyAlphaI.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLazyAlphaI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLazyAlphaI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLazyAlphaN.png
new file mode 100644
index 000000000..c6d86e34c
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyN.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyN.png
new file mode 100644
index 000000000..c6d86e34c
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyPackBitsB0LittleEndian(WhiteOnBlack).tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyPackBitsB0LittleEndian(WhiteOnBlack).tif
new file mode 100644
index 000000000..69e2c86c2
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyPackBitsB0LittleEndian(WhiteOnBlack).tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyPackBitsW0LittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyPackBitsW0LittleEndian.tif
new file mode 100644
index 000000000..9ae62cdc2
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyPackBitsW0LittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyW0UncompressedLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyW0UncompressedLittleEndian.tif
new file mode 100644
index 000000000..6ef5c4187
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppGreyW0UncompressedLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexeAI.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexeAI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexeAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedAN.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedAN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedI.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedN.png b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/1bppIndexedN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBBigEndian.tif
new file mode 100644
index 000000000..f54988e06
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBI.png b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLazyAlphaI.png b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLazyAlphaI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLazyAlphaI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLazyAlphaN.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLittleEndian.tif
new file mode 100644
index 000000000..551638e16
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBN.png b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/24bppRGBN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/2bppGreyLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/2bppGreyLazyAlphaN.png
new file mode 100644
index 000000000..a27e1d345
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/2bppGreyLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/2bppGreyN.png b/src/Test/mil/DRT/imaging/DrtFiles/2bppGreyN.png
new file mode 100644
index 000000000..a27e1d345
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/2bppGreyN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppCMYKNoAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppCMYKNoAlphaBigEndian.tif
new file mode 100644
index 000000000..59429ebc3
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppCMYKNoAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppCMYKNoAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppCMYKNoAlphaLittleEndian.tif
new file mode 100644
index 000000000..5471055c5
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppCMYKNoAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyAI.png b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyAI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyAN.png b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyAN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyB0AlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyB0AlphaBigEndian.tif
new file mode 100644
index 000000000..a95c65e2e
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyB0AlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyB0AlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyB0AlphaLittleEndian.tif
new file mode 100644
index 000000000..9cf4f2698
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyB0AlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyW0AlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyW0AlphaBigEndian.tif
new file mode 100644
index 000000000..876d47c18
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyW0AlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyW0AlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyW0AlphaLittleEndian.tif
new file mode 100644
index 000000000..f0dd451c5
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppGreyW0AlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBABigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBABigEndian.tif
new file mode 100644
index 000000000..b58adca39
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBABigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBAI.png b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBAI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBALittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBALittleEndian.tif
new file mode 100644
index 000000000..e72f5efd0
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBALittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBAN.png b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBAN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/32bppRGBAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/40bppCMYKAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/40bppCMYKAlphaBigEndian.tif
new file mode 100644
index 000000000..bdb6f1683
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/40bppCMYKAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/40bppCMYKAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/40bppCMYKAlphaLittleEndian.tif
new file mode 100644
index 000000000..1e3247ffc
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/40bppCMYKAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48RGBBig.tif b/src/Test/mil/DRT/imaging/DrtFiles/48RGBBig.tif
new file mode 100644
index 000000000..7dbe013fa
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48RGBBig.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBBigEndian.tif
new file mode 100644
index 000000000..7ce18d89e
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBI.png b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBI.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLazyAlphaI.png b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLazyAlphaI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLazyAlphaI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLazyAlphaN.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLittleEndian.tif
new file mode 100644
index 000000000..c4f601516
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBN.png b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBN.png
new file mode 100644
index 000000000..1c64e7152
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/48bppRGBN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyI.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyLazyAlphaI.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyLazyAlphaI.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyLazyAlphaI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyLazyAlphaN.png
new file mode 100644
index 000000000..c68faad5a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyN.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyN.png
new file mode 100644
index 000000000..346536dad
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppGreyN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedAI.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedAI.png
new file mode 100644
index 000000000..6b26908a4
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedAN.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedAN.png
new file mode 100644
index 000000000..afca014cc
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedI.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedI.png
new file mode 100644
index 000000000..36d9f46bd
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedLZWLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedLZWLittleEndian.tif
new file mode 100644
index 000000000..ead052975
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedLZWLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedN.png b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedN.png
new file mode 100644
index 000000000..d0f9f761b
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedPackbitsLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedPackbitsLittleEndian.tif
new file mode 100644
index 000000000..19e493806
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedPackbitsLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedUncompressedLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedUncompressedLittleEndian.tif
new file mode 100644
index 000000000..4aa630482
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/4bppIndexedUncompressedLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/64bppCMYKNoAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/64bppCMYKNoAlphaBigEndian.tif
new file mode 100644
index 000000000..bc2814935
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/64bppCMYKNoAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/64bppCMYKNoAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/64bppCMYKNoAlphaLittleEndian.tif
new file mode 100644
index 000000000..0f9902ace
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/64bppCMYKNoAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBABigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBABigEndian.tif
new file mode 100644
index 000000000..d04f785df
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBABigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBAI.png b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBAI.png
new file mode 100644
index 000000000..ae4e692a3
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBALittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBALittleEndian.tif
new file mode 100644
index 000000000..f75f419af
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBALittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBAN.png b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBAN.png
new file mode 100644
index 000000000..ce5b6b39a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/64bppRGBAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/6BEERS.gif b/src/Test/mil/DRT/imaging/DrtFiles/6BEERS.gif
new file mode 100644
index 000000000..0062a9d97
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/6BEERS.gif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/6channel_noprof_noalpha.wdp b/src/Test/mil/DRT/imaging/DrtFiles/6channel_noprof_noalpha.wdp
new file mode 100644
index 000000000..007f91055
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/6channel_noprof_noalpha.wdp differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/80bppCMYKAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/80bppCMYKAlphaBigEndian.tif
new file mode 100644
index 000000000..71f360cef
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/80bppCMYKAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/80bppCMYKAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/80bppCMYKAlphaLittleEndian.tif
new file mode 100644
index 000000000..fec6b2b64
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/80bppCMYKAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyB0NoAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyB0NoAlphaBigEndian.tif
new file mode 100644
index 000000000..228d8a935
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyB0NoAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyB0NoAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyB0NoAlphaLittleEndian.tif
new file mode 100644
index 000000000..5328bc769
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyB0NoAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyI.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyI.png
new file mode 100644
index 000000000..ab77ebcc1
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyLazyAlphaI.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyLazyAlphaI.png
new file mode 100644
index 000000000..0547aac4b
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyLazyAlphaI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyLazyAlphaN.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyLazyAlphaN.png
new file mode 100644
index 000000000..e85b7aeca
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyLazyAlphaN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyN.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyN.png
new file mode 100644
index 000000000..a0eebb0cd
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyW0NoAlphaBigEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyW0NoAlphaBigEndian.tif
new file mode 100644
index 000000000..155811ec4
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyW0NoAlphaBigEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyW0NoAlphaLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyW0NoAlphaLittleEndian.tif
new file mode 100644
index 000000000..27c164151
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppGreyW0NoAlphaLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedAI.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedAI.png
new file mode 100644
index 000000000..2bb0635f9
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedAI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedAN.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedAN.png
new file mode 100644
index 000000000..e1ccc0445
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedAN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedI.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedI.png
new file mode 100644
index 000000000..83028c741
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedI.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedLZWLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedLZWLittleEndian.tif
new file mode 100644
index 000000000..d88fcfbea
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedLZWLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedN.png b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedN.png
new file mode 100644
index 000000000..73efdcd7f
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedN.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedUncompressedLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedUncompressedLittleEndian.tif
new file mode 100644
index 000000000..60ffd2982
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppIndexedUncompressedLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/8bppPackbitsLZWLittleEndian.tif b/src/Test/mil/DRT/imaging/DrtFiles/8bppPackbitsLZWLittleEndian.tif
new file mode 100644
index 000000000..422cf7674
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/8bppPackbitsLZWLittleEndian.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/A-B-2.TIF b/src/Test/mil/DRT/imaging/DrtFiles/A-B-2.TIF
new file mode 100644
index 000000000..4b8c6bb9a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/A-B-2.TIF differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/A-B-3.TIF b/src/Test/mil/DRT/imaging/DrtFiles/A-B-3.TIF
new file mode 100644
index 000000000..0448973ef
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/A-B-3.TIF differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/AMBROSIA.TIF b/src/Test/mil/DRT/imaging/DrtFiles/AMBROSIA.TIF
new file mode 100644
index 000000000..baa7ae24d
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/AMBROSIA.TIF differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/ColorProfileJPg.jpg b/src/Test/mil/DRT/imaging/DrtFiles/ColorProfileJPg.jpg
new file mode 100644
index 000000000..c1d22b449
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/ColorProfileJPg.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/Fountain.jpg b/src/Test/mil/DRT/imaging/DrtFiles/Fountain.jpg
new file mode 100644
index 000000000..53435d44f
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/Fountain.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/IMG_0002.JPG b/src/Test/mil/DRT/imaging/DrtFiles/IMG_0002.JPG
new file mode 100644
index 000000000..cccad0122
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/IMG_0002.JPG differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/Olympus.jpg b/src/Test/mil/DRT/imaging/DrtFiles/Olympus.jpg
new file mode 100644
index 000000000..da7e1ba92
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/Olympus.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/Protest_B_8.jpg b/src/Test/mil/DRT/imaging/DrtFiles/Protest_B_8.jpg
new file mode 100644
index 000000000..c110411a1
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/Protest_B_8.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/RGB24bppProfile.wdp b/src/Test/mil/DRT/imaging/DrtFiles/RGB24bppProfile.wdp
new file mode 100644
index 000000000..6df11f674
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/RGB24bppProfile.wdp differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/RGB48bppProfile.wdp b/src/Test/mil/DRT/imaging/DrtFiles/RGB48bppProfile.wdp
new file mode 100644
index 000000000..4dc2b8424
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/RGB48bppProfile.wdp differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/Siren_light_indicator_orange.tif b/src/Test/mil/DRT/imaging/DrtFiles/Siren_light_indicator_orange.tif
new file mode 100644
index 000000000..5b0df9ddc
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/Siren_light_indicator_orange.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/austin.gif b/src/Test/mil/DRT/imaging/DrtFiles/austin.gif
new file mode 100644
index 000000000..291b6ed9a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/austin.gif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/avalon.png b/src/Test/mil/DRT/imaging/DrtFiles/avalon.png
new file mode 100644
index 000000000..18c014233
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/avalon.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/cars.jpg b/src/Test/mil/DRT/imaging/DrtFiles/cars.jpg
new file mode 100644
index 000000000..9bea9e12e
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/cars.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/cars256.bmp b/src/Test/mil/DRT/imaging/DrtFiles/cars256.bmp
new file mode 100644
index 000000000..0ef5b417b
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/cars256.bmp differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/carst.jpg b/src/Test/mil/DRT/imaging/DrtFiles/carst.jpg
new file mode 100644
index 000000000..88d43cc5d
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/carst.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/cloud1.png b/src/Test/mil/DRT/imaging/DrtFiles/cloud1.png
new file mode 100644
index 000000000..c542cf538
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/cloud1.png differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/contact.ico b/src/Test/mil/DRT/imaging/DrtFiles/contact.ico
new file mode 100644
index 000000000..57c88ea76
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/contact.ico differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/dogfight.tif b/src/Test/mil/DRT/imaging/DrtFiles/dogfight.tif
new file mode 100644
index 000000000..f3d8756c7
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/dogfight.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/earth.bmp b/src/Test/mil/DRT/imaging/DrtFiles/earth.bmp
new file mode 100644
index 000000000..5c945cafa
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/earth.bmp differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/ff_pattern.bmp b/src/Test/mil/DRT/imaging/DrtFiles/ff_pattern.bmp
new file mode 100644
index 000000000..b9711f1fc
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/ff_pattern.bmp differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/ff_semitransparent.BMP b/src/Test/mil/DRT/imaging/DrtFiles/ff_semitransparent.BMP
new file mode 100644
index 000000000..d338b929a
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/ff_semitransparent.BMP differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/gps.jpg b/src/Test/mil/DRT/imaging/DrtFiles/gps.jpg
new file mode 100644
index 000000000..9f203b3dc
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/gps.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/graph.ico b/src/Test/mil/DRT/imaging/DrtFiles/graph.ico
new file mode 100644
index 000000000..400ce0889
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/graph.ico differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/lossless.jpg b/src/Test/mil/DRT/imaging/DrtFiles/lossless.jpg
new file mode 100644
index 000000000..d38726222
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/lossless.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/offinmay.tif b/src/Test/mil/DRT/imaging/DrtFiles/offinmay.tif
new file mode 100644
index 000000000..d43a4079b
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/offinmay.tif differ
diff --git a/src/Test/mil/DRT/imaging/DrtFiles/tulip.jpg b/src/Test/mil/DRT/imaging/DrtFiles/tulip.jpg
new file mode 100644
index 000000000..6513fad6f
Binary files /dev/null and b/src/Test/mil/DRT/imaging/DrtFiles/tulip.jpg differ
diff --git a/src/Test/mil/DRT/imaging/DrtImaging.cs b/src/Test/mil/DRT/imaging/DrtImaging.cs
new file mode 100644
index 000000000..aac0f1b55
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/DrtImaging.cs
@@ -0,0 +1,2401 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+//
+// Copyright (C) Microsoft Corporation.  All rights reserved.
+// Description: DRT for images 
+//
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Windows;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Media.Animation;
+using System.Runtime.InteropServices;
+using System.Security;
+using System.Security.Permissions;
+using System.Windows.Threading;
+using System.IO;
+using System.Diagnostics;
+using System.ComponentModel; // for typeconverter
+using System.Globalization;
+using System.Windows.Interop;
+
+namespace DRT
+{
+    public sealed class DrtImaging : DrtBase
+    {
+        [STAThread]
+        public static int Main(string[] args)
+        {
+            DrtBase drt = new DrtImaging();
+
+            int result = drt.Run(args);
+            drt = null;
+
+            // This is done so if leak detection is enabled we should have released everything on exit.
+            GC.Collect(GC.MaxGeneration);
+
+            return result;
+        }
+
+        private DrtImaging()
+        {
+            WindowTitle ="DrtImaging";
+            TeamContact ="WPF";
+            Contact ="Microsoft";
+            DrtName ="DrtImaging";
+            DelayOutput = false;
+
+            Suites = new DrtTestSuite[] {
+                new BitmapImageTests(),
+                null
+            };
+        }
+
+        internal static string DrtFiles
+        {
+            get { return @".\drtfiles\drtimaging\"; }
+        }
+    }
+
+    /// 
+    /// Non-seekable stream
+    /// 
+    internal class NonSeekableStream : Stream
+    {
+        Stream _baseStream;
+
+        internal NonSeekableStream(Stream baseStream)
+        {
+            _baseStream = baseStream;
+        }
+
+        public override bool CanRead  { get { return _baseStream.CanRead; } }
+        public override bool CanSeek  { get { return false; } }
+        public override bool CanWrite { get { return false; } }
+        public override long Length   { get { throw new NotImplementedException(); } }
+        public override long Position { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } }
+        public override void Flush()  { throw new NotImplementedException(); }
+        public override long Seek(long offset, SeekOrigin origin) { throw new NotImplementedException(); }
+        public override void SetLength(long newLength) { throw new NotImplementedException(); }
+
+        public override int Read(
+            byte[] buffer,
+            int offset,
+            int count)
+        {
+            return _baseStream.Read(buffer, offset, count);
+        }
+
+        public override void Write(
+           byte[] buffer,
+           int offset,
+           int count)
+        {
+            throw new NotImplementedException();
+        }
+
+        public override IAsyncResult BeginRead(
+           byte[] buffer,
+           int offset,
+           int count,
+           AsyncCallback callback,
+           object state)
+        {
+            return _baseStream.BeginRead(buffer, offset, count, callback, state);
+        }
+
+        public override int EndRead(
+            IAsyncResult asyncResult)
+        {
+            return _baseStream.EndRead(asyncResult);
+        }
+    }
+
+    public class MyBitmapSource : BitmapSource
+    {
+        public MyBitmapSource(int width, int height)
+        {
+            _pixelWidth = width;
+            _pixelHeight = height;
+        }
+
+        public override PixelFormat Format
+        {
+            get
+            {
+                return PixelFormats.Pbgra32;
+            }
+        }
+
+        public override int PixelWidth
+        {
+            get
+            {
+                return _pixelWidth;
+            }
+        }
+
+        public override int PixelHeight
+        {
+            get
+            {
+                return _pixelHeight;
+            }
+        }
+
+        public override double DpiX
+        {
+            get
+            {
+                return 96.0;
+            }
+        }
+
+        public override double DpiY
+        {
+            get
+            {
+                return 96.0;
+            }
+        }
+
+        public override BitmapPalette Palette
+        {
+            get
+            {
+                return null;
+            }
+        }
+
+        public override void CopyPixels(Int32Rect sourceRect, Array pixels, int stride, int offset)
+        {
+            byte [] bytes = (byte [])pixels;
+
+            if (sourceRect.Width == 0 || sourceRect.Height == 0)
+            {
+                sourceRect.X = 0;
+                sourceRect.Y = 0;
+                sourceRect.Width = PixelWidth;
+                sourceRect.Height = PixelHeight;
+            }
+
+            for (int y = 0; y < sourceRect.Height; ++y)
+            {
+                for (int x = 0; x < sourceRect.Width; ++x)
+                {
+                    byte a,r,g,b;
+
+                    GetColorAtPosition(sourceRect.X+x, sourceRect.Y+y, out a, out r, out g, out b);
+                    bytes[offset+4*x+y*stride+0] = a;
+                    bytes[offset+4*x+y*stride+1] = r;
+                    bytes[offset+4*x+y*stride+2] = g;
+                    bytes[offset+4*x+y*stride+3] = b;
+                }
+            }
+        }
+
+        protected override Freezable CreateInstanceCore()
+        {
+            return new MyBitmapSource(0, 0);
+        }
+
+        protected override void CloneCore(Freezable sourceFreezable)
+        {
+            MyBitmapSource sourceBitmapSource = (MyBitmapSource) sourceFreezable;
+            base.CloneCore(sourceFreezable);
+
+            _pixelWidth = sourceBitmapSource.PixelWidth;
+            _pixelHeight = sourceBitmapSource.PixelHeight;
+        }
+
+        protected override void CloneCurrentValueCore(Freezable sourceFreezable)
+        {
+            MyBitmapSource sourceBitmapSource = (MyBitmapSource) sourceFreezable;
+            base.CloneCurrentValueCore(sourceFreezable);
+
+            _pixelWidth = sourceBitmapSource.PixelWidth;
+            _pixelHeight = sourceBitmapSource.PixelHeight;
+        }
+
+        private void GetColorAtPosition(int x, int y, out byte a, out byte r, out byte g, out byte b)
+        {
+            float xf = ((float)x)/PixelWidth;
+            float yf = ((float)y)/PixelHeight;
+
+            float af = xf;
+            float rf = (1.0f-xf);
+            float gf = yf;
+            float bf = (1.0f-yf);
+
+            a = (byte)(af*255);
+            r = (byte)(rf*255);
+            g = (byte)(gf*255);
+            b = (byte)(bf*255);
+        }
+
+        private int _pixelWidth;
+        private int _pixelHeight;
+    }
+
+    public class ImageVisual: System.Windows.Media.DrawingVisual
+    {
+        public ImageVisual(ImageSource imageSource) : base()
+        {
+            _imageSource = imageSource;
+
+            using (System.Windows.Media.DrawingContext ctx = RenderOpen())
+            {
+                Render(ctx);
+            }
+        }
+
+        void Render (System.Windows.Media.DrawingContext ctx)
+        {
+            ctx.DrawImage(_imageSource, new Rect(0, 0, _imageSource.Width, _imageSource.Height));
+        }
+
+        private ImageSource _imageSource;
+    }
+
+    #region VectorPage : DrawingVisual
+    public class VectorPage : System.Windows.Media.DrawingVisual
+    {
+        public VectorPage () : base()
+        {
+            using (System.Windows.Media.DrawingContext ctx = RenderOpen())
+            {
+                Render(ctx);
+            }
+        }
+
+        void Render (System.Windows.Media.DrawingContext ctx)
+        {
+            const float inch = 96.0f;
+
+            if (null == ctx) return;
+
+            System.Windows.Media.Color gray = System.Windows.Media.Color.FromScRgb (1.0f, 0.5f, 0.5f, 0.5f);
+
+            ctx.DrawRectangle (new System.Windows.Media.SolidColorBrush (gray), null, new Rect (inch / 2, inch / 2, inch * 7.5f, inch * 10));
+
+            System.Windows.Media.Color blue = System.Windows.Media.Color.FromScRgb (1.0f, 0.0f, 0.0f, 1.0f);
+            System.Windows.Media.Color red = System.Windows.Media.Color.FromScRgb (1.0f, 1.0f, 0.0f, 0.0f);
+            System.Windows.Media.Color yellow = System.Windows.Media.Color.FromScRgb (1.0f, 1.0f, 1.0f, 0.0f);
+            System.Windows.Media.Brush colorBrush = new System.Windows.Media.SolidColorBrush (blue);
+            System.Windows.Media.Brush horGradientBrush = new System.Windows.Media.LinearGradientBrush (red, yellow, 0);
+            System.Windows.Media.Brush verGradientBrush = new System.Windows.Media.LinearGradientBrush (yellow, blue, 90);
+            System.Windows.Media.Brush radGradientBrush = new System.Windows.Media.RadialGradientBrush (blue, yellow);
+
+            // RectangleGeometry rectGeom = new RectangleGeometry (new Rect (10.0, 10.0, 100.0, 100.0), 10.0, 10.0);
+            // ctx.DrawGeometry (null, new Pen (Brushes.Black, 1), rectGeom);
+            float r = 1;
+
+            ctx.DrawRoundedRectangle (colorBrush, null, new Rect (inch, inch, inch * 1.5, inch * 1.5), r * inch / 8, r * inch / 8);
+            ctx.DrawRoundedRectangle (horGradientBrush, null, new Rect (inch, inch * 3, inch * 1.5, inch * 1.5), r * inch / 8, r * inch / 8);
+            ctx.DrawRoundedRectangle (verGradientBrush, null, new Rect (inch, inch * 5, inch * 1.5, inch * 1.5), r * inch / 8, r * inch / 8);
+            ctx.DrawRoundedRectangle (verGradientBrush, null, new Rect (inch * 3, inch, inch * 1.5, inch * 1.5), r * inch / 2, r * inch / 2);
+            ctx.DrawRoundedRectangle (radGradientBrush, null, new Rect (inch * 3, inch * 3, inch * 1.5, inch * 1.5), r * inch / 2, r * inch / 2);
+        }
+    }
+    #endregion
+
+    #region VectorPage2 : DrawingVisual
+    public class VectorPage2 : System.Windows.Media.DrawingVisual
+    {
+        public VectorPage2() : base()
+        {
+            using (System.Windows.Media.DrawingContext ctx = RenderOpen())
+            {
+                Render(ctx);
+            }
+        }
+
+        void Render(System.Windows.Media.DrawingContext ctx)
+        {
+            if (null == ctx) return;
+
+            System.Windows.Media.Color white = System.Windows.Media.Color.FromScRgb(1.0f, 1.0f, 1.0f, 1.0f);
+
+            ctx.DrawRectangle(new System.Windows.Media.SolidColorBrush(white), null, new Rect(0, 0, 800, 100));
+
+            System.Windows.Media.Color black = System.Windows.Media.Color.FromScRgb(1.0f, 0.0f, 0.0f, 0.0f);
+            System.Windows.Media.Brush blackBrush = new System.Windows.Media.SolidColorBrush(black);
+            System.Windows.Media.Pen blackPen = new System.Windows.Media.Pen(blackBrush, 1.0);
+
+            System.Windows.Media.PathGeometry pg = new System.Windows.Media.PathGeometry();
+            System.Windows.Media.PathFigure pf = new System.Windows.Media.PathFigure();
+
+            pf.StartPoint = new Point(-35, 20);
+            pf.Segments.Add(new LineSegment(new Point(-15, 30), true));
+            pf.Segments.Add(new LineSegment(new Point(15, 30), true));
+            pf.Segments.Add(new LineSegment(new Point(35, 20), true));
+            pf.Segments.Add(new LineSegment(new Point(35, -20), true));
+            pf.Segments.Add(new LineSegment(new Point(15, -30), true));
+            pf.Segments.Add(new LineSegment(new Point(-15, -30), true));
+            pf.Segments.Add(new LineSegment(new Point(-35, -20), true));
+            pf.IsClosed = true;
+            pg.Figures.Add(pf);
+
+            float translate = 40.41f;
+            for (float angle = 0; angle <= 90; angle += 10, translate += 80)
+            {
+                System.Windows.Media.TransformGroup grp = new System.Windows.Media.TransformGroup();
+                grp.Children.Add(new System.Windows.Media.RotateTransform(angle));
+                grp.Children.Add(new System.Windows.Media.TranslateTransform(translate, 50));
+                pg.Transform = grp;
+                ctx.DrawGeometry(null, blackPen, pg);
+            }
+        }
+    }
+    #endregion
+
+    public class BitmapImageTests : DrtTestSuite
+    {
+        public BitmapImageTests() : base("Imaging Tests")
+        {
+        }
+
+        public override DrtTest[] PrepareTests()
+        {
+            DrawingVisual visual = new DrawingVisual();
+
+            _rootVisual = visual;
+            DRT.RootElement = visual;
+            DRT.ShowRoot();
+
+            return new DrtTest[] {
+                new DrtTest(Test_D3DImage),
+                new DrtTest(Test_D3DImage_Force9),
+                new DrtTest(Test_MetadataPolicyComponent),
+                new DrtTest(Test_DecoderTest1),
+                new DrtTest(Test_DecoderTest2),
+                new DrtTest(Test_DecoderTest3),
+                new DrtTest(Test_DecoderTest4),
+                new DrtTest(Test_StreamRelease),
+                new DrtTest(Test_SaveGPS),
+                new DrtTest(Test_Metadata),
+                new DrtTest(Test_Metadata_Inplace),
+                new DrtTest(Test_ExtendedPfBitmap),
+                new DrtTest(Test_Thumbnail),
+                new DrtTest(Test_TiffThumbnail),
+                new DrtTest(Test_RegressionTifNewSubFileType),
+                new DrtTest(Test_UseEmbeddedColorContext),
+                new DrtTest(Test_LossLessRotation),
+                new DrtTest(Test_WriteableBitmap),
+                new DrtTest(Test_InteropBitmap),
+                new DrtTest(Test_AsyncDownload),
+                new DrtTest(Test_CroppedBitmap),
+                new DrtTest(Test_CustomLoader),
+                new DrtTest(Test_ImmediateModeRendering),
+                new DrtTest(Test_SaveTifAsGif),
+                new DrtTest(Test_SaveTifAsWmp),
+                new DrtTest(Test_SaveWmpAsTif),
+                new DrtTest(Test_64bppBMP),
+                new DrtTest(Test_LoadImageWithTypeConverter),
+                new DrtTest(Test_Palette),
+                new DrtTest(Test_Icons),
+                new DrtTest(Test_Sections),
+                new DrtTest(Test_Rotations),
+                new DrtTest(Test_Encoders),
+                new DrtTest(Test_DelayCreation),
+                new DrtTest(Test_CustomBitmapSource),
+                new DrtTest(Test_PixelFormats),
+                new DrtTest(Test_Cloning),
+                new DrtTest(Test_Cache),
+                new DrtTest(Test_Alpha),
+                new DrtTest(Test_WmpCanonical),
+                new DrtTest(Test_WmpSpecific),
+                new DrtTest(Test_BitmapWithoutMemoryPressure)
+            };
+        }
+
+        private void Test_BitmapWithoutMemoryPressure()
+        {
+            Console.WriteLine("Test Creating Bitmap with 0 Memory Pressure");
+
+            int width = 1;
+            int height = width;
+            PixelFormat pe = PixelFormats.Indexed1;
+            int stride = (width * pe.BitsPerPixel + 7) / 8;
+            byte[] pixels = new byte[height * stride];
+
+            // Try creating a new image with a custom palette.
+            List colors = new List();
+            colors.Add(System.Windows.Media.Colors.Red);
+            colors.Add(System.Windows.Media.Colors.Blue);
+            colors.Add(System.Windows.Media.Colors.Green);
+            BitmapPalette myPalette = new BitmapPalette(colors);
+
+            // Creates a new empty image with the pre-defined palette
+            BitmapSource image = BitmapSource.Create(
+                width,
+                height,
+                96,
+                96,
+                PixelFormats.Indexed1,
+                myPalette,
+                pixels,
+                stride);
+        }
+
+        private void Test_WmpCanonical()
+        {
+            Console.WriteLine("Test Wmp Canonical");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBBigEndian.tif", UriKind.RelativeOrAbsolute));
+            WmpBitmapEncoder wmpEncoder = new WmpBitmapEncoder();
+            wmpEncoder.ImageQualityLevel = 0.7f;
+            wmpEncoder.FlipVertical = true;
+
+            Stream imageStreamDest = new System.IO.FileStream("24bppRGBBigEndian.wdp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+            wmpEncoder.Frames.Add(BitmapFrame.Create(image));
+            wmpEncoder.Save(imageStreamDest);
+            imageStreamDest.Close();
+        }
+
+        private void Test_WmpSpecific()
+        {
+            Console.WriteLine("Test Wmp Specific");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\Siren_light_indicator_orange.tif", UriKind.RelativeOrAbsolute));
+            WmpBitmapEncoder wmpEncoder = new WmpBitmapEncoder();
+            wmpEncoder.UseCodecOptions = true;
+            wmpEncoder.QualityLevel = 13;
+            wmpEncoder.OverlapLevel = 2;
+            wmpEncoder.SubsamplingLevel = 2;
+            wmpEncoder.HorizontalTileSlices = 500;
+            wmpEncoder.VerticalTileSlices = 500;
+
+            Stream imageStreamDest = new System.IO.FileStream("Siren_light_indicator_orange.wdp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+            wmpEncoder.Frames.Add(BitmapFrame.Create(image));
+            wmpEncoder.Save(imageStreamDest);
+            imageStreamDest.Close();
+        }
+
+        private void Test_Alpha()
+        {
+            Console.WriteLine("Test Alpha");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\Siren_light_indicator_orange.tif", UriKind.RelativeOrAbsolute));
+            Debug.Assert(image.Format == PixelFormats.Bgra32, "Expected Pixel format is ARGB");
+
+            OpenContext();
+            RenderImage(image);
+            CloseContext();
+        }
+
+        private void Test_WriteableBitmap()
+        {
+            Console.WriteLine("Test WriteableBitmap");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+
+            WriteableBitmap bitmap = new WriteableBitmap(image);
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(bitmap);
+            CloseContext();
+
+            int width = 10;
+            int height = 10;
+            int stride = ((width * image.Format.BitsPerPixel) + 7) / 8;
+            int arraySize = stride * height;
+
+            // Fill the array with random values.
+            byte[] array = new byte[arraySize];
+            Random rand = new Random();
+            rand.NextBytes(array);
+
+            // Write the array to the bitmap using the old API.
+            Int32Rect destRect = new Int32Rect(50, 50, width, height);
+            bitmap.WritePixels(destRect, array, stride, 0);
+
+            // Read the array back from the bitmap.
+            byte[] chkArray = new byte[arraySize];
+            bitmap.CopyPixels(destRect, chkArray, stride, 0);
+
+            for (int i = 0; i < arraySize; i++)
+            {
+                DRT.Assert(array[i] == chkArray[i], "Back buffer contents do not match what was written using the old API.");
+            }
+
+            // Write the array to the bitmap using the new API.
+            Int32Rect sourceRect = new Int32Rect(0, 0, width, height);
+            bitmap.WritePixels(sourceRect, array, stride, 50, 50);
+
+            // Read the array back from the bitmap.
+            bitmap.CopyPixels(destRect, chkArray, stride, 0);
+
+            for (int i = 0; i < arraySize; i++)
+            {
+                DRT.Assert(array[i] == chkArray[i], "Back buffer contents do not match what was written using the new API.");
+            }
+        }
+
+        private void Test_InteropBitmap()
+        {
+            Console.WriteLine("Test InteropBitmap");
+
+            // Simple functional test for a fast pixel format.
+            {
+                WriteableInteropBitmap fastBitmap = new WriteableInteropBitmap(500,500,PixelFormats.Bgr32);
+                fastBitmap.FillQuadrant(0, Colors.Red, true);
+                fastBitmap.FillQuadrant(1, Colors.Green, false);
+                fastBitmap.FillQuadrant(2, Colors.Blue, true);
+                fastBitmap.FillQuadrant(3, Colors.White, false);
+
+                OpenContext();
+                RenderImage(fastBitmap.Bitmap);
+                CloseContext();
+
+                fastBitmap.Dispose();
+                fastBitmap = null;
+            }
+
+            // Simple functional test for a slow pixel format.
+            {
+                WriteableInteropBitmap slowBitmap = new WriteableInteropBitmap(500,500,PixelFormats.Cmyk32);
+                slowBitmap.FillQuadrant(0, Colors.Red, true);
+                slowBitmap.FillQuadrant(1, Colors.Green, false);
+                slowBitmap.FillQuadrant(2, Colors.Blue, true);
+                slowBitmap.FillQuadrant(3, Colors.White, false);
+
+                OpenContext();
+                RenderImage(slowBitmap.Bitmap);
+                CloseContext();
+
+                slowBitmap.Dispose();
+                slowBitmap = null;
+            }
+
+            // There are additional things to test that are not appropriate
+            // for DRTs:
+            //
+            // Memory usage pattern
+            // Using a slow pixel format will result in a large saw-tooth
+            // memory usage pattern because we allocate new bitmaps on
+            // every update.  The old bitmaps are kept alive until the GC
+            // kicks in and finalizes the managed owners. Using a fast pixel
+            // format avoids this problem because we just update the content
+            // of the existing bitmap.  But this is hard to verify from a
+            // DRT because it depends so heavily on the unpredictable
+            // timing of garbage collection.  This was actually the source
+            // of a regression from 3.5 to 4.0.
+            //
+            // Correctly updating the screen
+            // Writing new content into the bitmap and calling Invalidate
+            // should cause the screen to update.  Verifying this would
+            // require reading back from the screen, which can be very
+            // fragile due to different DPI, resolution, color depth,
+            // popups, etc.  This is better suited for our BVT tests which
+            // run in a more controlled environment and have lots of render
+            // output tests.  Note that this was actually the source of a
+            // bug in 4.0 where usage of an image brush where the image
+            // was an InteropBitmap would not update correctly due to a
+            // bug in the native composition code.
+        }
+
+        private void Test_AsyncDownload()
+        {
+            Console.WriteLine("Test AsyncDownload");
+            Stream s = new NonSeekableStream(new FileStream(@"drtfiles\drtimaging\contact.ico", FileMode.Open, FileAccess.Read, FileShare.Read));
+            BitmapFrame frame = BitmapFrame.Create(s, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
+
+            OpenContext();
+            RenderImage(frame);
+            CloseContext();
+
+            frame.DownloadCompleted += new EventHandler(OnDownloaded);
+        }
+
+        private void OnDownloaded(object sender, EventArgs e)
+        {
+            object o = ((BitmapFrame)sender).Metadata;
+            DRT.Assert(((BitmapFrame)sender).Decoder.Frames.Count == 9,
+                    String.Format("Expected contact.ico to have 9 frames, {0} found.", ((BitmapFrame)sender).Decoder.Frames.Count));
+        }
+
+        private void Test_DecoderTest1()
+        {
+            Console.WriteLine("Test DecoderTest1");
+
+            BitmapImage image1 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyAI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image2 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image3 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyB0AlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image4 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyB0AlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image5 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyB0NoAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image6 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyB0NoAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image7 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image8 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyLazyAlphaI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image9 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image10 = new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image11 = new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyW0AlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image12 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image13 = new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyW0AlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image14 = new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyW0NoAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image15 = new BitmapImage(new Uri("drtfiles\\drtimaging\\16bppGreyW0NoAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image16 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyB0UncompressedLittleEndian(WhiteOnBlack).tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image17 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyG3B0LittleEndian(WhiteOnBlack).tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image18 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyG3W0LittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image19 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyHuffmanB0LittleEndian(BkOnWhSpecial).tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image20 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyHuffmanW0LittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image21 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image22 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyLazyAlphaI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image23 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image24 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyLZWB0LittleEndian(WhiteOnBlack).tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image25 = new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyLZWW0LittleEndian.tif", UriKind.RelativeOrAbsolute));
+
+            OpenContext();
+            RenderImage(image1);
+            RenderImage(image2);
+            RenderImage(image3);
+            RenderImage(image4);
+            RenderImage(image5);
+            RenderImage(image6);
+            RenderImage(image7);
+            RenderImage(image8);
+            RenderImage(image9);
+            RenderImage(image10);
+            RenderImage(image11);
+            RenderImage(image12);
+            RenderImage(image13);
+            RenderImage(image14);
+            RenderImage(image15);
+            RenderImage(image16);
+            RenderImage(image17);
+            RenderImage(image18);
+            RenderImage(image19);
+            RenderImage(image20);
+            RenderImage(image21);
+            RenderImage(image22);
+            RenderImage(image23);
+            RenderImage(image24);
+            RenderImage(image25);
+            CloseContext();
+        }
+
+        private void Test_DecoderTest2()
+        {
+            Console.WriteLine("Test DecoderTest2");
+
+            BitmapImage image1 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyPackBitsB0LittleEndian(WhiteOnBlack).tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image2 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyPackBitsW0LittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image3 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppGreyW0UncompressedLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image4 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppIndexeAI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image5 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppIndexedAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image6 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppIndexedI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image7 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\1bppIndexedN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image8 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image9 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image10 = new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBLazyAlphaI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image11 = new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image12 = new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image13 = new BitmapImage(new Uri("drtfiles\\drtimaging\\24bppRGBN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image14 = new BitmapImage(new Uri("drtfiles\\drtimaging\\2bppGreyLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image15 = new BitmapImage(new Uri("drtfiles\\drtimaging\\2bppGreyN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image16 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppCMYKNoAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image17 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppCMYKNoAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image18 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppGreyAI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image19 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppGreyAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image20 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppGreyB0AlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image21 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppGreyB0AlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image22 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppGreyW0AlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image23 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppGreyW0AlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image24 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppRGBABigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image25 = new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppRGBAI.png", UriKind.RelativeOrAbsolute));
+
+            OpenContext();
+            RenderImage(image1);
+            RenderImage(image2);
+            RenderImage(image3);
+            RenderImage(image4);
+            RenderImage(image5);
+            RenderImage(image6);
+            RenderImage(image7);
+            RenderImage(image8);
+            RenderImage(image9);
+            RenderImage(image10);
+            RenderImage(image11);
+            RenderImage(image12);
+            RenderImage(image13);
+            RenderImage(image14);
+            RenderImage(image15);
+            RenderImage(image16);
+            RenderImage(image17);
+            RenderImage(image18);
+            RenderImage(image19);
+            RenderImage(image20);
+            RenderImage(image21);
+            RenderImage(image22);
+            RenderImage(image23);
+            RenderImage(image24);
+            RenderImage(image25);
+            CloseContext();
+        }
+
+        private void Test_DecoderTest3()
+        {
+            Console.WriteLine("Test DecoderTest3");
+
+            BitmapImage image1 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppRGBALittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image2 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\32bppRGBAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image3 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\40bppCMYKAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image4 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\40bppCMYKAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image5 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\48bppRGBBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image6 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\48bppRGBI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image7 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\48bppRGBLazyAlphaI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image8 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\48bppRGBLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image9 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\48bppRGBLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image10 = new BitmapImage(new Uri("drtfiles\\drtimaging\\48bppRGBN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image11 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppGreyI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image12 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppGreyLazyAlphaI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image13 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppGreyLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image14 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppGreyN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image15 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedAI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image16 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image17 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image18 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedLZWLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image19 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image20 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedPackbitsLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image21 = new BitmapImage(new Uri("drtfiles\\drtimaging\\4bppIndexedUncompressedLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image22 = new BitmapImage(new Uri("drtfiles\\drtimaging\\64bppCMYKNoAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image23 = new BitmapImage(new Uri("drtfiles\\drtimaging\\64bppCMYKNoAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image24 = new BitmapImage(new Uri("drtfiles\\drtimaging\\64bppRGBABigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image25 = new BitmapImage(new Uri("drtfiles\\drtimaging\\64bppRGBAI.png", UriKind.RelativeOrAbsolute));
+
+            OpenContext();
+            RenderImage(image1);
+            RenderImage(image2);
+            RenderImage(image3);
+            RenderImage(image4);
+            RenderImage(image5);
+            RenderImage(image6);
+            RenderImage(image7);
+            RenderImage(image8);
+            RenderImage(image9);
+            RenderImage(image10);
+            RenderImage(image11);
+            RenderImage(image12);
+            RenderImage(image13);
+            RenderImage(image14);
+            RenderImage(image15);
+            RenderImage(image16);
+            RenderImage(image17);
+            RenderImage(image18);
+            RenderImage(image19);
+            RenderImage(image20);
+            RenderImage(image21);
+            RenderImage(image22);
+            RenderImage(image23);
+            RenderImage(image24);
+            RenderImage(image25);
+            CloseContext();
+        }
+
+        private void Test_DecoderTest4()
+        {
+            Console.WriteLine("Test DecoderTest4");
+
+            BitmapImage image1 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\64bppRGBALittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image2 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\64bppRGBAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image3 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\80bppCMYKAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image4 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\80bppCMYKAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image5 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyB0NoAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image6 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyB0NoAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image7 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image8 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyLazyAlphaI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image9 =  new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyLazyAlphaN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image10 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image11 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyW0NoAlphaBigEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image12 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppGreyW0NoAlphaLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image13 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppIndexedAI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image14 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppIndexedAN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image15 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppIndexedI.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image16 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppIndexedLZWLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image17 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppIndexedN.png", UriKind.RelativeOrAbsolute));
+            BitmapImage image18 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppIndexedUncompressedLittleEndian.tif", UriKind.RelativeOrAbsolute));
+            BitmapImage image19 = new BitmapImage(new Uri("drtfiles\\drtimaging\\8bppPackbitsLZWLittleEndian.tif", UriKind.RelativeOrAbsolute));
+
+            OpenContext();
+            RenderImage(image1);
+            RenderImage(image2);
+            RenderImage(image3);
+            RenderImage(image4);
+            RenderImage(image5);
+            RenderImage(image6);
+            RenderImage(image7);
+            RenderImage(image8);
+            RenderImage(image9);
+            RenderImage(image10);
+            RenderImage(image11);
+            RenderImage(image12);
+            RenderImage(image13);
+            RenderImage(image14);
+            RenderImage(image15);
+            RenderImage(image16);
+            RenderImage(image17);
+            RenderImage(image18);
+            RenderImage(image19);
+            CloseContext();
+        }
+
+        private void Test_StreamRelease()
+        {
+            Console.WriteLine("Test StreamRelease");
+
+            File.Copy("drtfiles\\drtimaging\\tulip.jpg","foo.jpg", true);
+            BitmapFrame image = BitmapFrame.Create(new Uri("foo.jpg", UriKind.RelativeOrAbsolute), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
+            File.Delete("foo.jpg");
+
+            File.Copy("drtfiles\\drtimaging\\tulip.jpg","bar.jpg", true);
+            BitmapImage bitmap = new BitmapImage();
+            bitmap.BeginInit();
+            bitmap.UriSource = new Uri(Directory.GetCurrentDirectory() + @"\bar.jpg", UriKind.RelativeOrAbsolute);
+            bitmap.CacheOption = BitmapCacheOption.OnLoad;
+            bitmap.EndInit();
+            File.Delete("bar.jpg");
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(bitmap);
+            CloseContext();
+        }
+
+        private void Test_CroppedBitmap()
+        {
+            Console.WriteLine("Test CroppedBitmap");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+            CroppedBitmap crop = new CroppedBitmap();
+
+            Int32Rect rect = new Int32Rect(0, 0, 5, 5);
+
+            crop.BeginInit();
+            crop.SourceRect = rect;
+            crop.Source = image;
+            crop.EndInit();
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(crop);
+            CloseContext();
+
+            BitmapEncoder encoder = new BmpBitmapEncoder();
+
+            encoder.Frames.Add(BitmapFrame.Create(crop));
+
+            Stream imageStreamDest = new System.IO.FileStream("Cropped.bmp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+
+            encoder.Save(imageStreamDest);
+        }
+
+        private void Test_ExtendedPfBitmap()
+        {
+            Console.WriteLine("Test ExtendedPfBitmap");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+            FormatConvertedBitmap fmt = new FormatConvertedBitmap(image, PixelFormats.Cmyk32, null, 0.0);
+
+            CachedBitmap cache = new CachedBitmap(fmt, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
+
+            BitmapSource wdpPreservePF = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\6channel_noprof_noalpha.wdp", UriKind.RelativeOrAbsolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(fmt);
+            RenderImage(cache);
+            RenderImage(wdpPreservePF);
+            CloseContext();
+
+            DRT.Assert( cache.Format == PixelFormats.Cmyk32 );
+
+            BitmapSource cmyk = BitmapSource.Create(10, 10, 96, 96, PixelFormats.Cmyk32, null, new byte[10 * 10 * 4], 40);
+
+            DRT.Assert( cmyk.Format == PixelFormats.Cmyk32 );
+        }
+
+
+        private void Test_CustomLoader()
+        {
+            Console.WriteLine("Test CustomerLoader");
+            BitmapImage custom = new BitmapImage();
+
+            TypeConverter uriTypeConverter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(Uri));
+
+            custom.BeginInit();
+            custom.DecodePixelHeight = 400;
+            custom.DecodePixelWidth = 300;
+            custom.Rotation = System.Windows.Media.Imaging.Rotation.Rotate0;
+            custom.UriSource = (Uri)uriTypeConverter.ConvertFromInvariantString(null,"drtfiles\\drtimaging\\Fountain.jpg");
+            custom.EndInit();
+
+            OpenContext();
+            RenderImage(custom);
+            CloseContext();
+
+            int width = custom.PixelWidth;
+            int height = custom.PixelHeight;
+
+            DRT.Assert(width == 300,
+                    String.Format("Expected width == 300. Actual width == {0}", width));
+            DRT.Assert(height == 400,
+                    String.Format("Expected width == 400. Actual width == {0}", height));
+
+            BitmapEncoder encoder = new BmpBitmapEncoder();
+
+            encoder.Frames.Add(BitmapFrame.Create(custom));
+
+            Stream imageStreamDest = new System.IO.FileStream("TestCustom.bmp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+
+            encoder.Save(imageStreamDest);
+        }
+
+        // see if we can draw on an image
+        private void Test_ImmediateModeRendering ()
+        {
+            Console.WriteLine("Test ImmediateModeRendering");
+            RenderTargetBitmap id = new RenderTargetBitmap(300, 300, 96, 96, System.Windows.Media.PixelFormats.Pbgra32);
+            System.Windows.Media.Visual v = new VectorPage ();
+
+            id.Render (v);
+
+            OpenContext();
+            RenderImage(id);
+            RenderImage(id.Clone());
+            CloseContext();
+
+            BitmapEncoder encoder = new BmpBitmapEncoder();
+
+            encoder.Frames.Add (BitmapFrame.Create(id));
+
+            Stream imageStreamDest = new System.IO.FileStream ("Fountain.bmp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+
+            encoder.Save (imageStreamDest);
+        }
+
+        private void Test_SaveTifAsGif ()
+        {
+            Console.WriteLine("Test SaveTifAsGif");
+            Stream imageStreamSource = new System.IO.FileStream ("drtfiles\\drtimaging\\a-b-2.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
+            Stream imageStreamDest = new System.IO.FileStream ("a-b-2.gif", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+            BitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
+            GifBitmapEncoder encoder = new GifBitmapEncoder();
+
+            String tiffMimeType = decoder.CodecInfo.MimeTypes;
+            String gifMimeType = encoder.CodecInfo.MimeTypes;
+            String tiffExtensions = decoder.CodecInfo.FileExtensions;
+
+            DRT.Assert(tiffMimeType =="image/tiff,image/tif","Unexpected TIFF mime type.");
+            DRT.Assert(gifMimeType =="image/gif","Unexpected GIF mime type.");
+            DRT.Assert(tiffExtensions ==".tiff,.tif","Unexpected TIFF extensions");
+
+            encoder.Frames = decoder.Frames;
+
+            encoder.Save(imageStreamDest);
+
+            BitmapFrame frame = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\40bppCMYKAlphaBigEndian.tif", UriKind.RelativeOrAbsolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
+            GifBitmapEncoder gifEncoder = new GifBitmapEncoder();
+            gifEncoder.Frames.Add(frame);
+
+            Stream imageStreamDest2 = new System.IO.FileStream("output.gif", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+            gifEncoder.Save(imageStreamDest2);
+
+
+        }
+
+
+        private void Test_SaveTifAsWmp()
+        {
+            Console.WriteLine("Test SaveTifAsWmp");
+            Stream imageStreamSource = new System.IO.FileStream("drtfiles\\drtimaging\\a-b-3.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
+            Stream imageStreamDest = new System.IO.FileStream("a-b-3.wdp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+            BitmapDecoder decoder = new TiffBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
+            WmpBitmapEncoder encoder = new WmpBitmapEncoder();
+
+            String tiffMimeType = decoder.CodecInfo.MimeTypes;
+            String wmpMimeType = encoder.CodecInfo.MimeTypes;
+
+            DRT.Assert(tiffMimeType =="image/tiff,image/tif","Unexpected TIFF mime type.");
+
+            // Remove"image/wmphoto, image/wdp" once final codec is checked in
+            DRT.Assert(wmpMimeType =="image/wmphoto" || wmpMimeType =="image/vnd.ms-photo" || wmpMimeType =="image/wdp","Unexpected WMP mime type.");
+
+            encoder.Frames = decoder.Frames;
+            encoder.Save(imageStreamDest);
+
+            imageStreamDest.Close();
+        }
+
+
+        private void Test_SaveWmpAsTif()
+        {
+            Console.WriteLine("Test SaveWmpAsTif");
+            Stream imageStreamSource = new System.IO.FileStream("a-b-3.wdp", FileMode.Open, FileAccess.Read, FileShare.Read);
+            Stream imageStreamDest = new System.IO.FileStream("a-b-3.tif", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+
+            BitmapDecoder decoder = new WmpBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
+            TiffBitmapEncoder encoder = new TiffBitmapEncoder();
+
+            String wmpMimeType = decoder.CodecInfo.MimeTypes;
+            String tiffMimeType = encoder.CodecInfo.MimeTypes;
+
+            // Remove"image/wmphoto, image/wdp" once final codec is checked in
+            DRT.Assert(wmpMimeType =="image/wmphoto" || wmpMimeType =="image/vnd.ms-photo" || wmpMimeType =="image/wdp","Unexpected WMP mime type.");
+            DRT.Assert(tiffMimeType =="image/tiff,image/tif","Unexpected TIFF mime type.");
+
+            encoder.Frames = decoder.Frames;
+            encoder.Save(imageStreamDest);
+        }
+
+
+        private void Test_LoadImageWithTypeConverter()
+        {
+            Console.WriteLine("Test LoadImageWithTypeConverter");
+            TypeConverter bitmapImageTypeConverter = System.ComponentModel.TypeDescriptor.GetConverter(typeof(BitmapImage));
+            BitmapSource bitmapImage = (BitmapSource)bitmapImageTypeConverter.ConvertFromInvariantString (null,"drtfiles\\drtimaging\\Fountain.jpg");
+
+            int width = bitmapImage.PixelWidth;
+            int height = bitmapImage.PixelHeight;
+
+            DRT.Assert(width == 2560,
+                    String.Format("Actual width = {0}. Expected width = 2560.", width));
+            DRT.Assert(height == 1920,
+                    String.Format("Actual height = {0}. Expected height = 1920.", width));
+
+            double dpiX = bitmapImage.DpiX;
+            double dpiY = bitmapImage.DpiY;
+
+            string header ="Calling bitmapImageTypeConverter.ConvertFromInvarientString(null, \"Fountain.jpg\").";
+
+            /*
+            ** The below two asserts will fail in a normal setup and should pass in test environment.
+            ** In normal setup, dpiX and dpiY unit will be 72.
+            */
+            DRT.Assert(dpiX == 96,
+                    String.Format(header +"Actual dpiX = {0}. Expected dpiX = 96.", dpiX));
+            DRT.Assert(dpiY == 96,
+                    String.Format(header +"Actual dpiY = {0}. Expected dpiY = 96.", dpiY));
+
+            System.Windows.Media.PixelFormat format = bitmapImage.Format;
+
+            OpenContext();
+            RenderImage(bitmapImage);
+            CloseContext();
+        }
+
+        private void Test_UseEmbeddedColorContext()
+        {
+            Console.WriteLine("Test UseEmbeddedColorContext");
+
+            string jpegFile = "drtfiles\\drtimaging\\ColorProfileJPg.jpg";
+
+            Stream imageStream = new FileStream(jpegFile, FileMode.Open, FileAccess.Read, FileShare.Read);
+
+            BitmapFrame bsrcIgnoreColor = BitmapFrame.Create(new Uri(jpegFile, UriKind.RelativeOrAbsolute), BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.OnLoad);
+            DRT.Assert(bsrcIgnoreColor.ColorContexts.Count == 2);
+
+            foreach (ColorContext cc in bsrcIgnoreColor.ColorContexts)
+            {
+                using (Stream s = cc.OpenProfileStream())
+                {
+                    // All we're hoping for is that OpenProfileStream returns a stream without crashing
+                    DRT.Assert(s != null);
+                }
+            }
+
+            BitmapSource bsrc = BitmapFrame.Create(imageStream);
+            BitmapFrame bsrcFrame = (BitmapFrame)bsrc;
+            ColorContext sourceColorContext = bsrcFrame.ColorContexts[0];
+
+            ColorContext destColorContext = new ColorContext(System.Windows.Media.PixelFormats.Bgra32);
+
+            DRT.Assert((destColorContext != null) || (sourceColorContext != null),
+                String.Format("ColorContext is null"));
+
+            ColorConvertedBitmap ccb = new ColorConvertedBitmap(bsrc, sourceColorContext, destColorContext, PixelFormats.Pbgra32);
+
+            jpegFile = "drtfiles\\drtimaging\\Olympus.jpg";
+
+            Stream imageStreamNoColor = new FileStream(jpegFile, FileMode.Open, FileAccess.Read, FileShare.Read);
+            BitmapFrame bsrcNoColor = BitmapFrame.Create(imageStreamNoColor);
+            // WIC v1 returns 1 and WIC v2 returns 2
+            DRT.Assert(bsrcNoColor.ColorContexts.Count == 1 || bsrcNoColor.ColorContexts.Count == 2);
+            foreach (ColorContext cc in bsrcNoColor.ColorContexts)
+            {
+                using (Stream s = cc.OpenProfileStream())
+                {
+                    // All we're hoping for is that OpenProfileStream returns a stream without crashing
+                    DRT.Assert(s != null);
+                }
+            }
+
+            ReadOnlyCollection colorcontexts = new ReadOnlyCollection(bsrcFrame.ColorContexts);
+
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+
+            // image is being used for both the main frame and the thumbnail
+            //BitmapFrame frame = BitmapFrame.Create(image, image, null, colorcontexts);
+            BitmapFrame frame = BitmapFrame.Create(image, image, null, colorcontexts);
+
+            // Photon cases with embedded profiles
+            BitmapSource wdpIgnoreColor1 = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\RGB24bppProfile.wdp", UriKind.RelativeOrAbsolute), BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.OnLoad);
+            BitmapSource wdpIgnoreColor2 = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\RGB48bppProfile.wdp", UriKind.RelativeOrAbsolute), BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.OnLoad);
+            BitmapSource wdpUseColor1 = BitmapFrame.Create(new FileStream("drtfiles\\drtimaging\\RGB24bppProfile.wdp", FileMode.Open, FileAccess.Read, FileShare.Read));
+            BitmapSource wdpUseColor2 = BitmapFrame.Create(new FileStream("drtfiles\\drtimaging\\RGB48bppProfile.wdp", FileMode.Open, FileAccess.Read, FileShare.Read));
+
+            byte[] pixels = new byte[80];
+
+            wdpIgnoreColor1.CopyPixels(new Int32Rect(0,0,10,1), pixels, 80, 0);
+            DRT.Assert(pixels[0] >= 0xFD && pixels[1] >= 0xFD && pixels[2] >= 0xFD,
+                    String.Format("Background of this bitmap should be white."));
+            wdpIgnoreColor2.CopyPixels(new Int32Rect(0, 0, 10, 1), pixels, 80, 0);
+            DRT.Assert(pixels[0] >= 0xFD && pixels[1] >= 0xFD && pixels[2] >= 0xFD,
+                    String.Format("Background of this bitmap should be white."));
+            wdpUseColor1.CopyPixels(new Int32Rect(0, 0, 10, 1), pixels, 80, 0);
+            DRT.Assert(!(pixels[0] >= 0xFD && pixels[1] >= 0xFD && pixels[2] >= 0xFD),
+                    String.Format("Background of this bitmap should NOT be white."));
+            wdpUseColor2.CopyPixels(new Int32Rect(0, 0, 10, 1), pixels, 80, 0);
+            DRT.Assert(!(pixels[0] >= 0xFD && pixels[1] >= 0xFD && pixels[2] >= 0xFD),
+                    String.Format("Background of this bitmap should NOT be white."));
+
+            OpenContext();
+            RenderImage(bsrcIgnoreColor);
+            RenderImage(bsrc);
+            RenderImage(bsrcFrame);
+            RenderImage(ccb);
+            RenderImage(image);
+            RenderImage(wdpIgnoreColor1);
+            RenderImage(wdpIgnoreColor2);
+            RenderImage(wdpUseColor1);
+            RenderImage(wdpUseColor2);
+            CloseContext();
+
+            BitmapEncoder encoder = new TiffBitmapEncoder();
+
+            encoder.Frames.Add(frame);
+
+            Stream imageStreamDest = new System.IO.FileStream("colorcontexts.tiff", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+            encoder.Save(imageStreamDest);
+
+
+
+        }
+
+        private void Test_Palette()
+        {
+            Console.WriteLine("Test Palette");
+
+            // Try reading a palette from an image
+
+            Stream imageStreamSource = new System.IO.FileStream("drtfiles\\drtimaging\\Cars256.bmp", FileMode.Open, FileAccess.Read, FileShare.Read);
+            BitmapDecoder decoder = new BmpBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapSource bitmapSource = decoder.Frames[0];
+            BitmapPalette palette = bitmapSource.Palette;
+
+            OpenContext();
+            RenderImage(bitmapSource);
+
+            DRT.Assert(palette.Colors.Count == 256,
+                    String.Format("Expected Cars256.bmp to have a 256 color palette, {0} colors found", palette.Colors.Count));
+
+            IList palColor = palette.Colors;
+
+            DRT.Assert(palColor != null,
+                    String.Format("Call to palette.Colors returned null."));
+            DRT.Assert(palColor.Count == 256,
+                    String.Format("Call to palette.Colors produced array of {0} colors, 256 expected.", palColor.Count));
+
+
+            // Try creating a new image with a custom palette.
+
+            List colors = new List();
+            colors.Add(System.Windows.Media.Colors.Red);
+            colors.Add(System.Windows.Media.Colors.Blue);
+
+            int i;
+
+            palette = new BitmapPalette(colors);
+
+            int width = 128;
+            int height = width;
+            int stride = width/8;
+
+            byte[] pixels = new byte[height*stride];
+
+            for (i = 0; i < height*stride; ++i)
+            {
+                if (i < height*stride/2)
+                {
+                    pixels[i] = 0x00;
+                }
+                else
+                {
+                    pixels[i] = 0xff;
+                }
+            }
+
+            BitmapSource image = BitmapSource.Create(
+                width,
+                height,
+                96,
+                96,
+                System.Windows.Media.PixelFormats.Indexed1,
+                palette,
+                pixels,
+                stride);
+
+            RenderImage(image);
+
+            FileStream stream = new FileStream("newPalette.tiff", FileMode.Create);
+
+            TiffBitmapEncoder encoder = new TiffBitmapEncoder();
+            encoder.Frames.Add(BitmapFrame.Create(image));
+            encoder.Save(stream);
+
+            stream.Close();
+
+            // Try creating an image with a predefined palette.
+
+            palette = BitmapPalettes.WebPalette;
+
+            stride = width;
+
+            pixels = new byte[height*stride];
+            for (i = 0; i < height*stride; ++i)
+            {
+                if (i < height*stride/2)
+                {
+                    pixels[i] = 0x00;
+                }
+                else
+                {
+                    pixels[i] = 0x55;
+                }
+            }
+
+            image = BitmapSource.Create(
+                width,
+                height,
+                96,
+                96,
+                System.Windows.Media.PixelFormats.Indexed8,
+                palette,
+                pixels,
+                stride);
+
+            RenderImage(image);
+
+            stream = new FileStream("newPalette2.tiff", FileMode.Create);
+
+            encoder = new TiffBitmapEncoder();
+            encoder.Frames.Add(BitmapFrame.Create(image));
+            encoder.Save(stream);
+
+            stream.Close();
+
+
+            // Try creating a palette from a non-palettized image.
+
+            BitmapImage image2 = new BitmapImage();
+            image2.BeginInit();
+            image2.UriSource= new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute);
+            image2.EndInit();
+
+            RenderImage(image2);
+
+            palette = new BitmapPalette(image2, 111);
+
+            DRT.Assert(palette.Colors.Count == 111);
+            CloseContext();
+
+        }
+
+        private void Test_Icons()
+        {
+            Console.WriteLine("Test Icons");
+            Stream imageStreamSource = new FileStream(@"drtfiles\drtimaging\contact.ico", FileMode.Open, FileAccess.Read, FileShare.Read);
+            BitmapDecoder decoder = new IconBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
+
+            DRT.Assert(decoder != null,
+"Could not load image \"contact.ico\"");
+            DRT.Assert(decoder.Frames.Count == 9,
+                    String.Format("Expected contact.ico to have 9 frames, {0} found.", decoder.Frames.Count));
+
+            OpenContext();
+            for (int i = 0; i < decoder.Frames.Count; i++)
+            {
+                BitmapSource src = decoder.Frames[i];
+                RenderImage(src);
+
+                BitmapSource thumb = decoder.Frames[i].Thumbnail;
+                DRT.Assert(thumb != null,"Expected icon frame to have thumbnail");
+                PixelFormat fmt = thumb.Format;
+                RenderImage(thumb);
+            }
+            CloseContext();
+        }
+
+         private void Test_Sections()
+         {
+             Console.WriteLine("Test Sections");
+             uint width = 0xd0;
+             uint height = 0xcf;
+             uint size = width*height*3;
+
+             string filename = "DrtFiles\\DrtImaging\\earth.bmp";
+
+             IntPtr hFile = CreateFile(filename, 0x80000000, 1, IntPtr.Zero, 3, 0, IntPtr.Zero);
+             if (hFile == new IntPtr(-1))
+             {
+                 int lastError = Marshal.GetLastWin32Error();
+                 Console.WriteLine("   *** WARNING: Failed to get handle for {0}, error code {1}.  Skipping Sections test", filename, lastError);
+                 return;
+             }
+
+             IntPtr hSection = CreateFileMapping(hFile, IntPtr.Zero, 0x2, 0, 0, IntPtr.Zero);
+             if (hSection == IntPtr.Zero)
+             {
+                 int lastError = Marshal.GetLastWin32Error();
+                 Console.WriteLine("   *** WARNING: Failed to get handle for memory section.  Skipping Sections test", filename, lastError);
+                 CloseHandle(hFile);
+                 return;
+             }
+
+             BitmapSource image = System.Windows.Interop.Imaging.CreateBitmapSourceFromMemorySection(
+                 hSection,
+                 (int)width,
+                 (int)height,
+                 System.Windows.Media.PixelFormats.Bgr24,
+                 (int)width*3,
+                 0x36);
+
+             CloseHandle(hSection);
+             CloseHandle(hFile);
+
+             OpenContext();
+             RenderImage(image);
+             CloseContext();
+         }
+
+        private void Test_Rotations()
+        {
+            Console.WriteLine("Test Rotations");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+
+            Transform [] transforms =
+                new Transform[] {
+                    new RotateTransform(0.0),
+                    new RotateTransform(90.0),
+                    new RotateTransform(180.0),
+                    new RotateTransform(270.0)
+                };
+
+            string [] names = new string[] {
+"rotate0",
+"rotate1",
+"rotate2",
+"rotate3"
+            };
+
+            OpenContext();
+            RenderImage(image);
+            for (int i = 0; i < 4; ++i)
+            {
+                TransformedBitmap bitmap = new TransformedBitmap();
+                TransformGroup trans = new TransformGroup();
+                trans.Children.Add(new ScaleTransform(2.0, 1.0));
+                trans.Children.Add(transforms[i]);
+
+                bitmap.BeginInit();
+                bitmap.Transform = trans;
+                bitmap.Source = image;
+                bitmap.EndInit();
+
+                RenderImage(bitmap);
+                BitmapEncoder encoder = new BmpBitmapEncoder();
+
+                encoder.Frames.Add(BitmapFrame.Create(bitmap));
+
+                Stream imageStreamDest = new System.IO.FileStream(names[i] +".bmp", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+
+                encoder.Save(imageStreamDest);
+            }
+            CloseContext();
+        }
+
+        private void Test_Encoders()
+        {
+            Console.WriteLine("Test Encoders");
+            BitmapFrame frame = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+
+            BitmapEncoder [] encoders = new BitmapEncoder[] {
+                   new BmpBitmapEncoder(),
+                   new GifBitmapEncoder(),
+                   new JpegBitmapEncoder(),
+                   new PngBitmapEncoder(),
+                   new TiffBitmapEncoder()
+            };
+
+            string [] names = new string[] {
+"encode.bmp",
+"encode.gif",
+"encode.jpg",
+"encode.png",
+"encode.tif"
+            };
+
+            for (int i = 0; i < 5; ++i)
+            {
+                BitmapEncoder encoder = encoders[i];
+
+                encoder.Frames.Add(frame);
+
+                Stream imageStreamDest = new System.IO.FileStream(names[i], FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+                encoder.Save(imageStreamDest);
+
+                imageStreamDest.Close();
+            }
+
+            OpenContext();
+            for (int i = 0; i < 5; ++i)
+            {
+                BitmapImage image = new BitmapImage(new Uri(names[i], UriKind.RelativeOrAbsolute));
+                RenderImage(image);
+            }
+            CloseContext();
+        }
+
+        private void Test_DelayCreation()
+        {
+            Console.WriteLine("Test DelayCreation");
+            //
+            // Test 1: Ensure that DelayCreated bitmaps still work like regular bitmaps
+            //
+            BitmapFrame frame = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute),
+                BitmapCreateOptions.DelayCreation,
+                BitmapCacheOption.Default
+                );
+
+            DRT.Assert(frame.PixelWidth == 100);
+
+            BitmapEncoder encoder = new PngBitmapEncoder();
+
+            encoder.Frames.Add(frame);
+
+            Stream imageStreamDest = new System.IO.FileStream("delay.png", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+
+            encoder.Save(imageStreamDest);
+
+            imageStreamDest.Close();
+
+            OpenContext();
+            RenderImage(frame);
+            CloseContext();
+        }
+
+
+
+        private void Test_TiffThumbnail()
+        {
+            Console.WriteLine("Test TiffThumbnail");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\a-b-3.tif", UriKind.RelativeOrAbsolute));
+
+            // image is being used for both the main frame and the thumbnail
+            BitmapFrame frame = BitmapFrame.Create(image, image, null, null);
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(frame);
+
+            BitmapEncoder encoder = new TiffBitmapEncoder();
+
+            encoder.Frames.Add(frame);
+
+            Stream imageStreamDest = new System.IO.FileStream("thumbnail.tiff", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+            encoder.Save(imageStreamDest);
+
+            imageStreamDest.Close();
+
+            BitmapFrame frame2 = BitmapFrame.Create(new Uri("thumbnail.tiff", UriKind.RelativeOrAbsolute));
+
+            BitmapSource thumbnail = frame2.Thumbnail;
+
+            RenderImage(frame2);
+            RenderImage(thumbnail);
+
+            DRT.Assert(thumbnail != null);
+
+            CloseContext();
+        }
+
+        private void Test_RegressionTifNewSubFileType()
+        {
+            Console.WriteLine("Test RegressionTifNewSubFileType");
+
+            // this is the test case to handle Tif NewSubFileType
+            // add this test case will ensure the Tiff handle IFD thumbnail and primary frame well.
+            // recommened by Thomas Olson
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\offinmay.tif", UriKind.RelativeOrAbsolute));
+
+            BitmapFrame frame = BitmapFrame.Create(image, null, null, null);
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(frame);
+
+            BitmapEncoder encoder = new TiffBitmapEncoder();
+
+            encoder.Frames.Add(frame);
+
+            Stream imageStreamDest = new System.IO.FileStream("offinmay.tiff", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+            encoder.Save(imageStreamDest);
+
+            imageStreamDest.Close();
+
+            CloseContext();
+        }
+
+        private void Test_64bppBMP()
+        {
+            Console.WriteLine("Test BMP64");
+
+            OpenContext();
+
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\ff_semitransparent.bmp", UriKind.RelativeOrAbsolute));
+            RenderImage(image);
+
+            BitmapEncoder encoder = new BmpBitmapEncoder();
+            BitmapFrame frame = BitmapFrame.Create(image, image, null, null);
+            encoder.Frames.Add(frame);
+
+            Stream imageStreamDest = new System.IO.FileStream("foo99.bmp", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+            encoder.Save(imageStreamDest);
+
+            imageStreamDest.Close();
+
+            image = new BitmapImage(new Uri("foo99.bmp", UriKind.RelativeOrAbsolute));
+            RenderImage(image);
+
+            CloseContext();
+        }
+
+        private void Test_Thumbnail()
+        {
+            Console.WriteLine("Test Thumbnail");
+            BitmapImage image = new BitmapImage(new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute));
+
+            // image is being used for both the main frame and the thumbnail
+            BitmapFrame frame = BitmapFrame.Create(image, image, null, null);
+
+            OpenContext();
+            RenderImage(image);
+            RenderImage(frame);
+
+            BitmapEncoder encoder = new JpegBitmapEncoder();
+
+            encoder.Frames.Add(frame);
+
+            Stream imageStreamDest = new System.IO.FileStream("thumbnail.jpg", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+            encoder.Save(imageStreamDest);
+
+            imageStreamDest.Close();
+
+            BitmapFrame frame2 = BitmapFrame.Create(new Uri("thumbnail.jpg", UriKind.RelativeOrAbsolute));
+
+            BitmapSource thumbnail = frame2.Thumbnail;
+
+            RenderImage(frame2);
+            RenderImage(thumbnail);
+
+            DRT.Assert(thumbnail != null);
+
+            BitmapFrame frame3 = BitmapFrame.Create(
+                new Uri("drtfiles\\drtimaging\\a-b-2.tif", UriKind.RelativeOrAbsolute),
+                System.Windows.Media.Imaging.BitmapCreateOptions.PreservePixelFormat,
+                System.Windows.Media.Imaging.BitmapCacheOption.Default
+                );
+
+            BitmapSource thumbnail2 = frame3.Thumbnail;
+
+            DRT.Assert(thumbnail2 == null);
+
+            RenderImage(frame3);
+            RenderImage(thumbnail2);
+
+            BitmapFrame frame4 = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\Protest_B_8.jpg", UriKind.RelativeOrAbsolute));
+
+            BitmapSource thumbnail3 = frame4.Thumbnail;
+
+            RenderImage(frame4);
+            RenderImage(thumbnail3);
+
+            DRT.Assert(thumbnail3 != null);
+
+            CloseContext();
+        }
+
+        private void Test_CustomBitmapSource()
+        {
+            Console.WriteLine("Test CustomBitmapSource");
+            // Immediate mode rendering...
+            MyBitmapSource bitmapSource = new MyBitmapSource(100, 200);
+            Stream imageDest = new System.IO.FileStream("custom.jpg", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+            Stream imageWithBVMDest = new System.IO.FileStream("custom_withBVM.jpg", FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+            OpenContext();
+            RenderImage(bitmapSource);
+
+            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
+
+            encoder.Frames.Add(BitmapFrame.Create(bitmapSource));
+
+            encoder.Save(imageDest);
+
+            // Retained mode rendering...
+            RenderTargetBitmap id = new RenderTargetBitmap(100, 200, 96, 96, System.Windows.Media.PixelFormats.Pbgra32);
+            ImageVisual image = new ImageVisual(bitmapSource);
+
+            id.Render (image);
+
+            RenderImage(id);
+            RenderImage(id.Clone());
+            CloseContext();
+
+            BitmapEncoder encoder2 = new JpegBitmapEncoder();
+
+            encoder2.Frames.Add(BitmapFrame.Create(id));
+
+            encoder2.Save (imageWithBVMDest);
+        }
+
+        private void Test_PixelFormats()
+        {
+            Console.WriteLine("Test PixelFormats");
+            PixelFormat[] pixelFormatList = new PixelFormat[]
+            {
+                PixelFormats.Indexed2,
+                PixelFormats.Indexed4,
+                PixelFormats.Indexed8,
+                PixelFormats.BlackWhite,
+                PixelFormats.Gray2,
+                PixelFormats.Gray4,
+                PixelFormats.Gray8,
+                PixelFormats.Bgr555,
+                PixelFormats.Bgr565,
+                PixelFormats.Bgr101010,
+                PixelFormats.Bgr24,
+                PixelFormats.Rgb24,
+                PixelFormats.Bgr32,
+                PixelFormats.Bgra32,
+                PixelFormats.Pbgra32,
+                PixelFormats.Rgb48,
+                PixelFormats.Rgba64,
+                PixelFormats.Prgba64,
+                PixelFormats.Gray16,
+                PixelFormats.Gray32Float,
+                PixelFormats.Rgb128Float,
+                PixelFormats.Rgba128Float,
+                PixelFormats.Prgba128Float,
+                PixelFormats.Cmyk32
+            };
+
+            int[] pixelFormatInfo = new int[]
+            {
+                2, 1, /* PixelFormats.Indexed2 */
+                4, 1, /* PixelFormats.Indexed4 */
+                8, 1, /* PixelFormats.Indexed8 */
+                1, 1, /* PixelFormats.BlackWhite */
+                2, 1, /* PixelFormats.Gray2 */
+                4, 1, /* PixelFormats.Gray4 */
+                8, 1, /* PixelFormats.Gray8 */
+                16, 3, /* PixelFormats.Bgr555 */
+                16, 3, /* PixelFormats.Bgr565 */
+                32, 3, /* PixelFormats.Bgr101010 */
+                24, 3, /* PixelFormats.Bgr24 */
+                24, 3, /* PixelFormats.Rgb24 */
+                32, 3, /* PixelFormats.Bgr32 */
+                32, 4, /* PixelFormats.Bgra32 */
+                32, 4, /* PixelFormats.Pbgra32 */
+                48, 3, /* PixelFormats.Rgb48 */
+                64, 4, /* PixelFormats.Rgba64 */
+                64, 4, /* PixelFormats.Prgba64 */
+                16, 1, /* PixelFormats.Gray16 */
+                32, 1, /* PixelFormats.Gray32Float */
+                128, 3, /* PixelFormats.Rgb128Float */
+                128, 4, /* PixelFormats.Rgba128Float */
+                128, 4, /* PixelFormats.Prgba128Float */
+                32, 4 /* PixelFormats.Cmyk32 */
+            };
+            DRT.Assert(pixelFormatList.Length*2 == pixelFormatInfo.Length);
+
+            BitmapFrame frame = BitmapFrame.Create(
+                new Uri("drtfiles\\drtimaging\\tulip.jpg", UriKind.RelativeOrAbsolute),
+                System.Windows.Media.Imaging.BitmapCreateOptions.PreservePixelFormat,
+                System.Windows.Media.Imaging.BitmapCacheOption.Default
+                );
+
+            OpenContext();
+            for (int i=0; i masks = pixelFormatList[i].Masks;
+                DRT.Assert(pixelFormatInfo[2*i+1] == masks.Count);
+
+                if (pixelFormatList[i].ToString().IndexOf("Indexed") == -1)
+                {
+                    FormatConvertedBitmap fcb = new FormatConvertedBitmap(frame, pixelFormatList[i], null, 0.0);
+                    RenderImage(fcb);
+                }
+            }
+            CloseContext();
+        }
+
+        [SecurityCritical, SecurityTreatAsSafe]
+        private void Test_Metadata_Enumerate_All(BitmapMetadata metadata, bool fDoSet)
+        {
+            String format = metadata.Format;
+            String location = metadata.Location;
+
+            foreach(String query in metadata)
+            {
+                DRT.Assert(metadata.ContainsQuery(query));
+
+                object objVal = metadata.GetQuery(query);
+                if (objVal is BitmapMetadata)
+                {
+                    Test_Metadata_Enumerate_All(objVal as BitmapMetadata, fDoSet);
+                }
+
+                if (fDoSet)
+                {
+                    metadata.SetQuery(query, objVal);
+                }
+            }
+        }
+
+        [SecurityCritical, SecurityTreatAsSafe]
+        private void Test_BitmapMetadata_Equal(BitmapMetadata metadata1, BitmapMetadata metadata2)
+        {
+            DRT.Assert(metadata1.Format == metadata2.Format);
+
+            IEnumerator enumerator =
+                ((IEnumerable)metadata2).GetEnumerator();
+
+            foreach (string q1 in metadata1)
+            {
+                enumerator.MoveNext();
+                string q2 = enumerator.Current;
+                DRT.Assert(q1 == q2);
+
+                object o1 = metadata1.GetQuery(q1);
+                object o2 = metadata2.GetQuery(q2);
+                DRT.Assert(o1.GetType() == o2.GetType());
+            }
+        }
+
+        private void Test_MetadataPolicyComponent()
+        {
+            Console.WriteLine("Test MetadataPolicyComponent");
+
+            Stream jpgStream = new System.IO.FileStream("drtfiles\\drtimaging\\tulip.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
+            JpegBitmapDecoder jpgDecoder = new JpegBitmapDecoder(jpgStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame jpgFrame = jpgDecoder.Frames[0];
+            BitmapMetadata jpgMetadata = jpgFrame.Metadata as BitmapMetadata;
+
+            Stream output_jpgStreamNew = new System.IO.FileStream("output_tulip.jpg", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
+            output_jpgStreamNew.SetLength(0);
+            JpegBitmapEncoder jpgEncoderNew = new JpegBitmapEncoder();
+            BitmapMetadata jpgMetadataNew = new BitmapMetadata("jpg");
+
+            string[] strAuthors = {"abc","def","ghi" };
+            string[] strKeywords = {"NoBugToday","NoBugTomorrow","NoBugAfterShip" };
+
+            String strDateTime = DateTime.Now.ToString(DateTimeFormatInfo.InvariantInfo);
+
+            ReadOnlyCollection collectionAuthors = (new ReadOnlyCollection(strAuthors));
+            ReadOnlyCollection collectionKeywords = (new ReadOnlyCollection(strKeywords));
+            String[] strResult = new String[collectionAuthors.Count];
+            collectionAuthors.CopyTo(strResult, 0);
+
+            jpgMetadataNew.Author = collectionAuthors;
+
+            ReadOnlyCollection resultcollectionAuthors = jpgMetadataNew.Author;
+
+            jpgMetadataNew.Keywords = collectionKeywords;
+
+            jpgMetadataNew.DateTaken = strDateTime;
+
+            String strDate = jpgMetadataNew.DateTaken;
+
+            ReadOnlyCollection resultKeywords = jpgMetadataNew.Keywords;
+
+            jpgEncoderNew.Frames.Add(BitmapFrame.Create(jpgDecoder.Frames[0], null, jpgMetadataNew, null));
+            jpgEncoderNew.Save(output_jpgStreamNew);
+            output_jpgStreamNew.Flush();
+            output_jpgStreamNew.Close();
+        }
+
+        private void Test_Metadata()
+        {
+
+            Console.WriteLine("Test Metadata");
+            // ------------------------- Test get metadata from GPS, TIFF, JPG, PNG.
+            Stream jpgStreamgps = new System.IO.FileStream("drtfiles\\drtimaging\\gps.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
+            JpegBitmapDecoder jpgDecodergps = new JpegBitmapDecoder(jpgStreamgps, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame jpgFramegps = jpgDecodergps.Frames[0];
+            BitmapMetadata jpgMetadatagps = jpgFramegps.Metadata as BitmapMetadata;
+
+
+            DRT.Assert(jpgMetadatagps.ContainsQuery("/app1/ifd/GPS/{uint=0}"));
+            DRT.Assert(jpgMetadatagps.ContainsQuery("/app1/ifd/{uint=34853}/{uint=0}"));
+            Test_Metadata_Enumerate_All(jpgMetadatagps, false);
+
+            Stream pngStream = new System.IO.FileStream("drtfiles\\drtimaging\\avalon.png", FileMode.Open, FileAccess.Read, FileShare.Read);
+            PngBitmapDecoder pngDecoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame pngFrame = pngDecoder.Frames[0];
+            BitmapMetadata pngMetadata = pngFrame.Metadata as BitmapMetadata;
+            String str = pngMetadata.GetQuery("/tEXt/Software") as String;
+            DRT.Assert((str as String) =="Microsoft Office","Unexpected metadata in avalon.png");
+            DRT.Assert(!pngMetadata.ContainsQuery("/junk"));
+            Test_Metadata_Enumerate_All(pngMetadata, false);
+            DRT.Assert(pngMetadata.IsFrozen);
+            DRT.Assert(((BitmapMetadata)((BitmapMetadata)pngMetadata.GetQuery("/tEXt"))).IsFrozen);
+
+            Stream jpgStream = new System.IO.FileStream("drtfiles\\drtimaging\\tulip.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
+            JpegBitmapDecoder jpgDecoder = new JpegBitmapDecoder(jpgStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame jpgFrame = jpgDecoder.Frames[0];
+            BitmapMetadata jpgMetadata = jpgFrame.Metadata as BitmapMetadata;
+            DRT.Assert((byte)jpgMetadata.GetQuery("/app0/{uint=5}") == 0);
+            DRT.Assert(jpgMetadata.ContainsQuery("/app0"));
+            Test_Metadata_Enumerate_All(jpgMetadata, false);
+
+            Stream tiffStream = new System.IO.FileStream("drtfiles\\drtimaging\\a-b-2.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
+            TiffBitmapDecoder tiffDecoder = new TiffBitmapDecoder(tiffStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame tiffFrame = tiffDecoder.Frames[0];
+            BitmapMetadata tiffMetadata = tiffFrame.Metadata as BitmapMetadata;
+            DRT.Assert((ushort)tiffMetadata.GetQuery("/ifd/{uint=284}") == 1);
+            Test_Metadata_Enumerate_All(tiffMetadata, false);
+
+            Stream tiffStreamIptc = new System.IO.FileStream("drtfiles\\drtimaging\\ambrosia.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
+            TiffBitmapDecoder tiffDecoderIPTC = new TiffBitmapDecoder(tiffStreamIptc, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame tiffFrameIPTC = tiffDecoderIPTC.Frames[0];
+            BitmapMetadata tiffMetadataIPTC = tiffFrameIPTC.Metadata as BitmapMetadata;
+            object kw = tiffMetadataIPTC.GetQuery("/ifd/iptc/Keywords");
+            DRT.Assert(kw != null && kw is Array);
+            //Test_Metadata_Enumerate_All(tiffMetadata, false);
+
+            // ------------------------- Test encoding image w/metadata for TIFF, JPG, PNG.
+            Stream output_pngStream = new System.IO.FileStream("output_avalon.png", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
+            PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
+            output_pngStream.SetLength(0);
+            pngEncoder.Frames.Add(pngDecoder.Frames[0]);
+            pngEncoder.Save(output_pngStream);
+            output_pngStream.Flush();
+            output_pngStream.Close();
+
+            Stream output_jpgStream = new System.IO.FileStream("output_tulip.jpg", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
+            output_jpgStream.SetLength(0);
+            JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
+            jpgMetadata = new BitmapMetadata("jpg");
+            jpgMetadata.SetQuery("/app1/ifd/{uint=1000}", 12345);
+            jpgMetadata.SetQuery("/app1/ifd/{uint=1001}", 23456);
+            jpgMetadata.SetQuery("/app1/ifd/{uint=1002}", 34567);
+            jpgMetadata.SetQuery("/app1/ifd/PaddingSchema:padding", (UInt32)4096);
+            jpgEncoder.Frames.Add(BitmapFrame.Create(jpgDecoder.Frames[0], null, jpgMetadata, null));
+            jpgEncoder.Save(output_jpgStream);
+            output_jpgStream.Flush();
+            output_jpgStream.Close();
+
+            Stream output_tiffStream = new System.IO.FileStream("output_a-b-2.tif", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
+            TiffBitmapEncoder tiffEncoder = new TiffBitmapEncoder();
+            output_tiffStream.SetLength(0);
+            tiffMetadata = new BitmapMetadata("tiff");
+            tiffMetadata.SetQuery("/ifd/{ushort=1000}", 9999);
+            tiffMetadata.SetQuery("/ifd/{uint=1001}", 23456);
+            tiffMetadata.SetQuery("/ifd/{uint=1002}", 34567);
+            tiffMetadata.SetQuery("/ifd/PaddingSchema:padding", (UInt32)4096);
+            tiffMetadata.SetQuery("/ifd/exif", new BitmapMetadata("exif"));
+            tiffMetadata.SetQuery("/ifd/exif/PaddingSchema:padding", (UInt32)4096);
+            tiffEncoder.Frames.Add(BitmapFrame.Create(tiffDecoder.Frames[0], null, tiffMetadata, null));
+            tiffEncoder.Save(output_tiffStream);
+            output_tiffStream.Flush();
+            output_tiffStream.Close();
+
+            output_pngStream = null;
+            pngEncoder = null;
+            pngMetadata = null;
+
+            output_jpgStream = null;
+            jpgEncoder = null;
+            jpgMetadata = null;
+
+            output_tiffStream = null;
+            tiffEncoder = null;
+            tiffMetadata = null;
+
+            GC.Collect();
+        }
+
+        private void Test_Metadata_Inplace()
+        {
+            Console.WriteLine("Test Metadata_Inplace");
+            bool succeeded = false;
+
+            // Verify opening as URI, which is Read Only, does not allow in-place editing.
+            succeeded = false;
+            try
+            {
+                BitmapFrame frame = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\avalon.png", UriKind.RelativeOrAbsolute));
+
+                InPlaceBitmapMetadataWriter inplaceWriter = frame.CreateInPlaceBitmapMetadataWriter();
+            }
+            catch (InvalidOperationException)
+            {
+                // This exception is expected.
+                succeeded = true;
+            }
+            DRT.Assert(succeeded);
+
+            // Verify opening as stream which is read-only, does not allow in-place editing.
+            succeeded = false;
+            try
+            {
+                Stream stream = new System.IO.FileStream("drtfiles\\drtimaging\\avalon.png", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+                PngBitmapDecoder decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+                BitmapFrame frame = decoder.Frames[0];
+
+                InPlaceBitmapMetadataWriter inplaceWriter = frame.CreateInPlaceBitmapMetadataWriter();
+            }
+            catch (InvalidOperationException)
+            {
+                // This exception is expected.
+                succeeded = true;
+            }
+            DRT.Assert(succeeded);
+
+            // ------------------------- Test InPlaceBitmapMetadataWriter
+            Stream pngStream = new System.IO.FileStream("output_avalon.png", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
+            PngBitmapDecoder pngDecoder = new PngBitmapDecoder(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame pngFrame = pngDecoder.Frames[0];
+            InPlaceBitmapMetadataWriter pngInplace = pngFrame.CreateInPlaceBitmapMetadataWriter();
+            pngInplace.SetQuery("/tEXt/Software","MICROSOFT OFFICE");
+            DRT.Assert(pngInplace.TrySave());
+
+            // Test Enumerator
+            Test_Metadata_Enumerate_All(pngInplace, true);
+
+            Stream jpgStream = new System.IO.FileStream("output_tulip.jpg", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
+            JpegBitmapDecoder jpgDecoder = new JpegBitmapDecoder(jpgStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame jpgFrame = jpgDecoder.Frames[0];
+            InPlaceBitmapMetadataWriter jpgInplace = jpgFrame.CreateInPlaceBitmapMetadataWriter();
+            jpgInplace.SetQuery("/app1/ifd/{uint=2000}", 23456);
+            jpgInplace.RemoveQuery("/app1/ifd/{uint=1000}");
+            jpgInplace.SetQuery("/app1/ifd/{uint=2001}", (byte)'a');
+            jpgInplace.SetQuery("/app1/ifd/{uint=2002}", (char)'b');
+            jpgInplace.SetQuery("/app1/ifd/{uint=2003}", (int)(-13245678));
+            jpgInplace.SetQuery("/app1/ifd/{uint=2004}", (uint)87654321);
+            jpgInplace.SetQuery("/app1/ifd/{uint=2005}", (short)(-1234));
+            jpgInplace.SetQuery("/app1/ifd/{uint=2006}", (ushort)0xfedc);
+            jpgInplace.SetQuery("/app1/ifd/{uint=2007}", (Int64)(-123456789123456789));
+            jpgInplace.SetQuery("/app1/ifd/{uint=2008}", (UInt64)0xfedcfedcfedcfedc);
+            jpgInplace.SetQuery("/app1/ifd/{uint=2009}", (String)"Test String");
+            DRT.Assert(!jpgInplace.IsFrozen);
+            DRT.Assert(!((BitmapMetadata)jpgInplace.GetQuery("/app1")).IsFrozen);
+            DRT.Assert(jpgInplace.TrySave());
+
+            // Test Enumerator
+            Test_Metadata_Enumerate_All(jpgInplace, true);
+
+            Stream tiffStream = new System.IO.FileStream("output_a-b-2.tif", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
+            TiffBitmapDecoder tiffDecoder = new TiffBitmapDecoder(tiffStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
+            BitmapFrame tiffFrame = tiffDecoder.Frames[0];
+            InPlaceBitmapMetadataWriter tiffInplace = tiffFrame.CreateInPlaceBitmapMetadataWriter();
+            tiffInplace.SetQuery("/ifd/{uint=2000}", 23456);
+            tiffInplace.RemoveQuery("/ifd/{uint=1001}");
+            tiffInplace.SetQuery("/ifd/{uint=2001}", (byte)'a');
+            tiffInplace.SetQuery("/ifd/{uint=2002}", (sbyte)-100);
+            tiffInplace.SetQuery("/ifd/{uint=2003}", (char)'x');
+            tiffInplace.SetQuery("/ifd/{uint=2004}", (short)(-1234));
+            tiffInplace.SetQuery("/ifd/{uint=2005}", (ushort)0xfedc);
+            tiffInplace.SetQuery("/ifd/{uint=2006}", (String)"Test String");
+            tiffInplace.SetQuery("/ifd/{uint=2007}", (int)(-13245678));
+            tiffInplace.SetQuery("/ifd/{uint=2008}", (uint)87654321);
+            tiffInplace.SetQuery("/ifd/{uint=2009}", (Int64)(-123456789123456789));
+            tiffInplace.SetQuery("/ifd/{uint=2010}", (UInt64)0xfedcfedcfedcfedc);
+            tiffInplace.SetQuery("/ifd/{uint=2011}", (float)3.14159f);
+            tiffInplace.SetQuery("/ifd/{uint=2012}", (double)3.14159);
+            tiffInplace.SetQuery("/ifd/{uint=2013}", new BitmapMetadataBlob(new byte[] { 0x00, 0x01, 0x02, 0x03 }));
+            BitmapMetadata exifMetadata = (BitmapMetadata) tiffInplace.GetQuery("/ifd/exif");
+
+            exifMetadata.SetQuery("/{uint=2020}", new byte[] { 80, 100, 200 });
+            exifMetadata.SetQuery("/{uint=2021}", new sbyte[] { -80, -100, 100 });
+            exifMetadata.SetQuery("/{uint=2022}", new char[] { 'a', 'b', 'c' });
+            exifMetadata.SetQuery("/{uint=2023}", new ushort[] { 0x1000, 0x8000, 0xf000 });
+            exifMetadata.SetQuery("/{uint=2024}", new short[] { -1000, 2000, -30000 });
+            exifMetadata.SetQuery("/{uint=2025}", new String[] {"This","Is","A","Test" });
+            exifMetadata.SetQuery("/{uint=2026}", new uint[] { 0x20000000, 0x80000000, 0xffff0000 });
+            unchecked { exifMetadata.SetQuery("/{uint=2027}", new int[] { (int)0x200000000, (int)0x80000000, (int)0xffff0000 }); }
+            exifMetadata.SetQuery("/{uint=2028}", new UInt64[] { 0x2000000000000000, 0x8000000000000000, 0xffffffff00000000 });
+            unchecked { exifMetadata.SetQuery("/{uint=2029}", new Int64[] { (Int64)0x2000000000000000, (Int64)0x8000000000000000, (Int64)0xffffffff00000000 }); }
+
+            exifMetadata.SetQuery("/{uint=2030}", new float[] { 1.2345f, 2.3456f, 3.456f });
+            exifMetadata.SetQuery("/{uint=2031}", new double[] { 1.2345, 2.3456, 3.4567 });
+            exifMetadata.SetQuery("/{uint=2032}", new char[][] {
+                ((String)"Test").ToCharArray(),"Again".ToCharArray() });
+
+            DRT.Assert(tiffInplace.TrySave());
+
+            // Test Enumerator
+            Test_Metadata_Enumerate_All(tiffInplace, true);
+
+            // Test InPlaceBitmapMetadataWriter.Clone()
+            succeeded = false;
+            try
+            {
+                InPlaceBitmapMetadataWriter writerCopy = tiffInplace.Clone();
+            }
+            catch (InvalidOperationException)
+            {
+                succeeded = true;
+            }
+            DRT.Assert(succeeded);
+
+            BitmapMetadata exifMetadata2 = (BitmapMetadata) tiffInplace.GetQuery("/ifd/exif");
+
+            // Test BitmapMetadata.Clone()
+            BitmapMetadata exifCopy = exifMetadata.Clone();
+
+            // Even though it's a deep copy, the location is reflective of where the bitmap metadata came from.
+            // exifMetadata came from the location"/ifd/exif"
+            // exifCopy came from the root of exifMetadata"/"s
+            DRT.Assert(exifCopy.Location =="/exif");
+            DRT.Assert(exifMetadata.Location =="/ifd/exif");
+
+            Test_BitmapMetadata_Equal(exifMetadata, exifMetadata2);
+
+            // Test unmanaged IWICMetadataWriter* QL Copy()
+            Test_BitmapMetadata_Equal(exifCopy, exifMetadata);
+
+            // Test managed BitmapMetadataWriter QL Copy()
+            Test_BitmapMetadata_Equal(exifCopy, exifCopy.Clone());
+
+            // Test unmanaged IWICMetadataBlockReader* QL Copy()
+            BitmapMetadata tiffCopy = ((BitmapMetadata)tiffFrame.Metadata).Clone();
+            Test_BitmapMetadata_Equal((BitmapMetadata)tiffFrame.Metadata, tiffCopy);
+
+            Test_BitmapMetadata_Equal(tiffCopy, tiffCopy.Clone());
+        }
+
+        private void Test_LossLessRotation()
+        {
+            Console.WriteLine("Test LossLessRotation");
+            System.Windows.Media.Imaging.BitmapFrame nonLosslessImage = System.Windows.Media.Imaging.BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\img_0002.jpg", UriKind.RelativeOrAbsolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None);
+
+            OpenContext();
+            RenderImage(nonLosslessImage);
+            CloseContext();
+
+            System.Windows.Media.Imaging.JpegBitmapEncoder nonLossslessEncoder = new System.Windows.Media.Imaging.JpegBitmapEncoder();
+            nonLossslessEncoder.Frames.Add(nonLosslessImage);
+            nonLossslessEncoder.Rotation = System.Windows.Media.Imaging.Rotation.Rotate90;
+
+            using (FileStream stm = new FileStream("nonLossless.jpg", FileMode.Create, FileAccess.ReadWrite))
+            {
+                nonLossslessEncoder.Save(stm);
+            }
+
+            System.Windows.Media.Imaging.BitmapFrame image = System.Windows.Media.Imaging.BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\lossless.jpg", UriKind.RelativeOrAbsolute));
+
+            OpenContext();
+            RenderImage(image);
+            CloseContext();
+
+            System.Windows.Media.Imaging.JpegBitmapEncoder jpeg1 = new System.Windows.Media.Imaging.JpegBitmapEncoder();
+            jpeg1.Frames.Add(image);
+            jpeg1.Rotation = System.Windows.Media.Imaging.Rotation.Rotate90;
+            jpeg1.Rotation = System.Windows.Media.Imaging.Rotation.Rotate180;
+            jpeg1.FlipHorizontal = true;
+            jpeg1.Rotation = System.Windows.Media.Imaging.Rotation.Rotate270;
+            jpeg1.Rotation = System.Windows.Media.Imaging.Rotation.Rotate90;
+            jpeg1.FlipVertical = true;
+            jpeg1.FlipVertical = false;
+
+
+            using (FileStream stm = new FileStream("1.jpg", FileMode.Create, FileAccess.ReadWrite))
+            {
+                jpeg1.Save(stm);
+            }
+
+            System.Windows.Media.Imaging.JpegBitmapEncoder jpeg2 = new System.Windows.Media.Imaging.JpegBitmapEncoder();
+            jpeg2.Frames.Add(image);
+            jpeg2.Rotation = System.Windows.Media.Imaging.Rotation.Rotate180;
+
+            using (FileStream stm = new FileStream("2.jpg", FileMode.Create, FileAccess.ReadWrite))
+            {
+                jpeg2.Save(stm);
+            }
+
+            System.Windows.Media.Imaging.JpegBitmapEncoder jpeg3 = new System.Windows.Media.Imaging.JpegBitmapEncoder();
+            jpeg3.Frames.Add(image);
+            jpeg3.Rotation = System.Windows.Media.Imaging.Rotation.Rotate270;
+
+            using (FileStream stm = new FileStream("3.jpg", FileMode.Create, FileAccess.ReadWrite))
+            {
+                jpeg3.Save(stm);
+            }
+
+            System.Windows.Media.Imaging.JpegBitmapEncoder jpeg4 = new System.Windows.Media.Imaging.JpegBitmapEncoder();
+            jpeg4.Frames.Add(image);
+            jpeg4.FlipHorizontal = true;
+
+            using (FileStream stm = new FileStream("4.jpg", FileMode.Create, FileAccess.ReadWrite))
+            {
+                jpeg4.Save(stm);
+            }
+
+            System.Windows.Media.Imaging.JpegBitmapEncoder jpeg5 = new System.Windows.Media.Imaging.JpegBitmapEncoder();
+            jpeg5.Frames.Add(image);
+            jpeg5.FlipVertical = true;
+
+            using (FileStream stm = new FileStream("5.jpg", FileMode.Create, FileAccess.ReadWrite))
+            {
+                jpeg5.Save(stm);
+            }
+        }
+
+        private void Test_Cloning()
+        {
+            Console.WriteLine("Test Cloning");
+            OpenContext();
+
+            BitmapFrame tifFrame = BitmapFrame.Create(new Uri(@"drtfiles\\drtimaging\\48RGBBig.tif", UriKind.RelativeOrAbsolute), BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
+            BitmapFrame newFrame = System.Windows.Media.Imaging.BitmapFrame.Create(tifFrame);
+
+            RenderImage(tifFrame);
+            RenderImage(newFrame);
+
+            FileStream pngStream = new FileStream(@"drtfiles\\drtimaging\\cloud1.png", FileMode.Open, FileAccess.Read, FileShare.Read);
+            BitmapFrame pngFrame = BitmapFrame.Create(pngStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
+            BitmapFrame newFrame2 = System.Windows.Media.Imaging.BitmapFrame.Create(pngFrame);
+
+            RenderImage(pngFrame);
+            RenderImage(newFrame2);
+
+            BitmapSource source = null;
+            Stream imageStreamSource = new System.IO.FileStream("drtfiles\\drtimaging\\a-b-3.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
+
+            BitmapImage bi = new BitmapImage();
+            bi.BeginInit();
+            bi.StreamSource = imageStreamSource;
+            bi.CacheOption = BitmapCacheOption.OnLoad;
+            bi.EndInit();
+
+            imageStreamSource.Close();
+            source = bi.Clone();
+
+            RenderImage(bi);
+            RenderImage(source);
+
+            BitmapFrame frame = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\avalon.png", UriKind.RelativeOrAbsolute));
+            source = frame.Clone();
+
+            RenderImage(frame);
+            RenderImage(source);
+
+            Stream imageStreamSource2 = new System.IO.FileStream("drtfiles\\drtimaging\\a-b-3.tif", FileMode.Open, FileAccess.Read, FileShare.Read);
+            BitmapDecoder decoder = BitmapDecoder.Create(imageStreamSource2, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
+            for (int i = 0; i < decoder.Frames.Count; i++)
+            {
+                BitmapSource src = decoder.Frames[i];
+                RenderImage(src);
+                RenderImage(src.Clone());
+            }
+
+            CloseContext();
+        }
+
+        private void Test_Cache()
+        {
+            Console.WriteLine("Test Cache");
+            OpenContext();
+
+            BitmapFrame frame = BitmapFrame.Create(new Uri("drtfiles\\drtimaging\\avalon.png", UriKind.RelativeOrAbsolute));
+            BitmapDecoder decoder = BitmapDecoder.Create(
+                new Uri("drtfiles\\drtimaging\\avalon.png", UriKind.RelativeOrAbsolute),
+                BitmapCreateOptions.IgnoreImageCache,
+                BitmapCacheOption.Default
+                );
+
+            RenderImage(frame);
+            RenderImage(decoder.Frames[0]);
+
+            CloseContext();
+        }
+
+        private void Test_SaveGPS()
+        {
+            Console.WriteLine("Test SaveGPS");
+            Stream imageStreamSource = new System.IO.FileStream("drtfiles\\drtimaging\\gps.jpg", FileMode.Open, FileAccess.Read, FileShare.Read);
+            Stream imageStreamDest = new System.IO.FileStream("gpsoutput.jpg", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
+            BitmapDecoder decoder = new JpegBitmapDecoder(imageStreamSource, BitmapCreateOptions.None, BitmapCacheOption.Default);
+            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
+
+            encoder.Frames = decoder.Frames;
+
+            encoder.Save(imageStreamDest);
+        }
+
+        [DllImport("DrtImagingD3D.dll")]
+        static extern int Init(out IntPtr pSurface, bool forceXDDM);
+        [DllImport("DrtImagingD3D.dll")]
+        static extern int Render();
+        [DllImport("DrtImagingD3D.dll")]
+        static extern void Destroy();
+
+        // Basic D3DImage test that uses a 9Ex device when WDDM is present or 9 when not
+        private void Test_D3DImage()
+        {
+            Console.WriteLine("Test D3DImage 9Ex");
+            Test_D3DImage_Common(false);
+        }
+
+        // Same as Test_D3DImage except it forces a 9 device. On XP, this will be the same as Test_D3DImage
+        private void Test_D3DImage_Force9()
+        {
+            Console.WriteLine("Test D3DImage 9");
+            Test_D3DImage_Common(true);
+        }
+
+        private void Test_D3DImage_Common(bool forceXDDM)
+        {
+            D3DImage d3di = new D3DImage();
+
+            // 1. Test stardard D3DImage
+            IntPtr surface;
+            DRT.Assert(Init(out surface, forceXDDM) >= 0, "Unable to create unmanaged rendering core for D3DImage");
+
+            d3di.Lock();
+            d3di.SetBackBuffer(D3DResourceType.IDirect3DSurface9, surface);
+            DRT.Assert(Render() >= 0, "D3DImage renderer failed");
+            d3di.AddDirtyRect(new Int32Rect(0, 0, d3di.PixelWidth, d3di.PixelHeight));
+            d3di.Unlock();
+
+            OpenContext();
+            RenderImage(d3di);
+
+            // 2. RTB D3DImage
+            DrawingVisual dv = new DrawingVisual();
+            using (DrawingContext ctx = dv.RenderOpen())
+            {
+                ctx.DrawImage(d3di, new Rect(0, 0, d3di.PixelWidth, d3di.PixelHeight));
+            }
+
+            RenderTargetBitmap rtb = new RenderTargetBitmap(d3di.PixelWidth, d3di.PixelHeight, 96.0, 96.0, PixelFormats.Default);
+            rtb.Render(dv);
+
+            RenderImage(rtb);
+            CloseContext();
+
+            DRT.WaitForCompleteRender();
+
+            // 3. Release unmanaged stuff
+            Destroy();
+        }
+
+        private void OpenContext()
+        {
+            DRT.Assert(_ctx == null);
+            _ctx = _rootVisual.RenderOpen();
+        }
+
+        private void CloseContext()
+        {
+            DRT.Assert(_ctx != null);
+            _ctx.Close();
+            _ctx = null;
+            _currentXOffset = 0.0;
+            _currentYOffset = 0.0;
+        }
+
+        private void RenderImage(ImageSource source)
+        {
+            DRT.Assert(_ctx != null);
+            if ((_currentXOffset + _imageRenderWidth) > 800.0)
+            {
+                _currentXOffset = 0.0;
+                _currentYOffset += _imageRenderHeight;
+            }
+
+            _ctx.DrawImage(source, new Rect(_currentXOffset, _currentYOffset, _imageRenderWidth, _imageRenderHeight));
+            _currentXOffset += _imageRenderWidth;
+            DRT.WaitForCompleteRender(); // Wait until original Visual is displayed
+        }
+
+
+        DrawingVisual _rootVisual;
+        DrawingContext _ctx;
+        private double _imageRenderWidth = 100.0;
+        private double _imageRenderHeight = 100.0;
+        private double _currentXOffset = 0.0;
+        private double _currentYOffset = 0.0;
+
+
+        [SecurityCritical, SuppressUnmanagedCodeSecurity]
+        [DllImport("kernel32.dll", EntryPoint ="CloseHandle")]
+        internal static extern uint CloseHandle(
+            IntPtr hObject);
+
+        [SecurityCritical, SuppressUnmanagedCodeSecurity]
+        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint ="CreateFileW")]
+        internal static extern IntPtr CreateFile(
+            [MarshalAs(UnmanagedType.LPWStr)] string lpFilename,
+            UInt32 dwDesiredAccess,
+            UInt32 dwShareMode,
+            IntPtr lpSecurityAttributes,
+            UInt32 dwCreationDisposition,
+            UInt32 dwFlagsAndAttributes,
+            IntPtr hTemplateFile);
+
+        [SecurityCritical, SuppressUnmanagedCodeSecurity]
+        [DllImport("kernel32.dll", SetLastError = true, EntryPoint ="CreateFileMapping")]
+        internal static extern IntPtr CreateFileMapping(
+            IntPtr hFile,
+            IntPtr lpAttributes,
+            UInt32 flProtect,
+            UInt32 dwMaximumSizeHigh,
+            UInt32 dwMaximumSizeLow,
+            IntPtr lpName);
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Test/mil/DRT/imaging/DrtImaging.csproj b/src/Test/mil/DRT/imaging/DrtImaging.csproj
new file mode 100644
index 000000000..6f8875ac1
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/DrtImaging.csproj
@@ -0,0 +1,28 @@
+
+  
+    DrtImaging
+    console
+    true
+    WCP
+    EXE
+    false
+    true
+  
+  
+    
+    
+    
+    
+        \DrtFiles\DrtImaging\%(FileName)%(Extension)
+        Always
+    
+    
+        %(FileName)%(Extension)
+        Always
+    
+    
+        %(FileName)%(Extension)
+        Always
+    
+  
+
diff --git a/src/Test/mil/DRT/imaging/WriteableInteropBitmap.cs b/src/Test/mil/DRT/imaging/WriteableInteropBitmap.cs
new file mode 100644
index 000000000..a4da6561c
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/WriteableInteropBitmap.cs
@@ -0,0 +1,152 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Windows.Media;
+using System.Windows.Interop;
+using System.Reflection;
+using System.Windows;
+using System.Runtime.InteropServices;
+
+namespace DRT
+{
+    public sealed class WriteableInteropBitmap : IDisposable
+    {
+        public WriteableInteropBitmap(int width, int height, PixelFormat format)
+        {
+            Width = width;
+            Height = height;
+            Format = format;
+            CreateBitmap();
+        }
+
+        ~WriteableInteropBitmap()
+        {
+            Dispose(false);
+        }
+
+        public void Dispose()
+        {
+            Dispose(true);
+        }
+
+        public int Width {get; private set;}
+        public int Height {get; private set;}
+        public PixelFormat Format { get; private set; }
+        public InteropBitmap Bitmap { get; private set; }
+
+        public void FillQuadrant(int quadrant, Color fill, bool useDirtyRect)
+        {
+            int x = 0;
+            int y = 0;
+
+            unsafe
+            {
+                switch (quadrant)
+                {
+                    case 0:
+                        x = 0;
+                        y = 0;
+                        break;
+
+                    case 1:
+                        x = Width/2;
+                        y = 0;
+                        break;
+
+                    case 2:
+                        x = Width / 2;
+                        y = Height / 2;
+                        break;
+
+                    case 3:
+                        x = 0;
+                        y = Height / 2;
+                        break;
+                }
+
+                int bytesPerPixel = Format.BitsPerPixel / 8;
+                int stride = Width * bytesPerPixel;
+
+                byte* buffer = (byte*)_view.ToPointer();
+                buffer += y * stride;        // full strides
+                buffer += x * bytesPerPixel; // partial stride
+
+                for (int iRow = 0; iRow < Height / 2; iRow++)
+                {
+                    byte* rowPtr = buffer + iRow * stride;
+
+                    for (int iPixel = 0; iPixel < Width / 2; iPixel++)
+                    {
+                        byte* pixelPtr = rowPtr + iPixel * bytesPerPixel;
+
+                        pixelPtr[0] = fill.B;
+                        pixelPtr[1] = fill.G;
+                        pixelPtr[2] = fill.R;
+                        pixelPtr[3] = fill.A;
+                    }
+                }
+            }
+
+            if (useDirtyRect)
+            {
+                Int32Rect dirtyRect = new Int32Rect(x, y, Width / 2, Height / 2);
+                Bitmap.Invalidate(dirtyRect);
+            }
+            else
+            {
+                Bitmap.Invalidate();
+            }
+        }
+
+        private void Dispose(bool disposing)
+        {
+            DestroyBitmap();
+        }
+
+        private void CreateBitmap()
+        {
+            int bytesPerPixel = Format.BitsPerPixel / 8;
+            int stride = Width * bytesPerPixel;
+            int size = Height * stride;
+
+            _section = CreateFileMapping(new IntPtr(-1), IntPtr.Zero, 4, 0, size, null);
+            _view = MapViewOfFile(_section, 0xF001F, 0, 0, size);
+            Bitmap = (InteropBitmap)System.Windows.Interop.Imaging.CreateBitmapSourceFromMemorySection(_section, Width, Height, Format, stride, 0);
+        }
+
+        private void DestroyBitmap()
+        {
+            if (_view != IntPtr.Zero)
+            {
+                UnmapViewOfFile(_view);
+                _view = IntPtr.Zero;
+            }
+
+            if (_section != IntPtr.Zero)
+            {
+                CloseHandle(_section);
+                _section = IntPtr.Zero;
+            }
+        }
+
+        [DllImport("kernel32.dll")]
+        private static extern IntPtr CreateFileMapping(IntPtr hFile, IntPtr lpAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
+
+        [DllImport("kernel32.dll")]
+        private static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytesToMap);
+        
+        [DllImport("kernel32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
+
+        [DllImport("kernel32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static extern bool CloseHandle(IntPtr hObject);
+
+        private IntPtr _section;
+        private IntPtr _view;
+    }
+}
+
diff --git a/src/Test/mil/DRT/imaging/d3dcode/DrtImagingD3D.def b/src/Test/mil/DRT/imaging/d3dcode/DrtImagingD3D.def
new file mode 100644
index 000000000..2a2d165c5
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/d3dcode/DrtImagingD3D.def
@@ -0,0 +1,8 @@
+LIBRARY	"d3dcode"
+
+EXPORTS
+
+	Destroy
+	Init
+	Render
+	
\ No newline at end of file
diff --git a/src/Test/mil/DRT/imaging/d3dcode/DrtImagingD3D.nativeproj b/src/Test/mil/DRT/imaging/d3dcode/DrtImagingD3D.nativeproj
new file mode 100644
index 000000000..689b55a73
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/d3dcode/DrtImagingD3D.nativeproj
@@ -0,0 +1,56 @@
+
+
+    
+
+    
+    
+    
+        
+            
+                $(CDefines);
+                _DEBUG;
+            
+        
+    
+    
+
+    
+        DYNLINK
+        DrtImagingD3D
+        DRT
+
+        
+          $(CDefines);
+          WIN32;
+          _WINDOWS;
+          _USRDLL;
+          D3DCODE_EXPORTS;
+        
+
+        true
+
+        DrtImagingD3D.def
+    
+
+    
+        
+        
+    
+
+    
+
+        
+        
+
+        
+        
+        
+        
+        
+        
+
+    
+
+    
+
+
\ No newline at end of file
diff --git a/src/Test/mil/DRT/imaging/d3dcode/d3dcode.cpp b/src/Test/mil/DRT/imaging/d3dcode/d3dcode.cpp
new file mode 100644
index 000000000..b81ca6dc7
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/d3dcode/d3dcode.cpp
@@ -0,0 +1,263 @@
+#include "d3dcode.h"
+
+struct CUSTOMVERTEX
+{
+    FLOAT x, y, z; 
+    DWORD color;
+};
+
+#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)
+
+const static TCHAR szAppName[] = TEXT("shh!");
+
+Renderer::Renderer() : m_pd3dDevice(NULL), m_pd3dVB(NULL), m_pd3dSurface(NULL), m_hwndDummy(NULL)
+{
+
+}
+
+
+HRESULT
+Renderer::Create(Renderer **ppRenderer, bool fForceXDDM)
+{
+    HRESULT hr = S_OK;
+
+    Renderer *pRenderer = new Renderer();
+
+    IFC(pRenderer->Init(fForceXDDM));
+
+    *ppRenderer = pRenderer;
+
+Cleanup:
+    return hr;
+}
+
+typedef HRESULT (WINAPI *DIRECT3DCREATE9EXFUNCTION)(UINT SDKVersion, IDirect3D9Ex**);
+
+DWORD
+GetVertexProcessing(IDirect3D9 *pD3D)
+{
+    D3DCAPS9 caps;
+ 
+    if (   SUCCEEDED(pD3D->GetDeviceCaps(0, D3DDEVTYPE_HAL, &caps))
+        && (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) == D3DDEVCAPS_HWTRANSFORMANDLIGHT)
+    {
+        return D3DCREATE_HARDWARE_VERTEXPROCESSING;
+    }
+    else
+    {
+        return D3DCREATE_SOFTWARE_VERTEXPROCESSING;
+    }
+}
+
+HRESULT
+Renderer::InitDevice(bool fForceXDDM)
+{
+    D3DPRESENT_PARAMETERS d3dpp;
+    ZeroMemory(&d3dpp, sizeof(d3dpp));
+    d3dpp.Windowed = TRUE;
+    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
+    d3dpp.BackBufferHeight = 1;
+    d3dpp.BackBufferWidth = 1;
+    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
+
+    HMODULE hD3D = LoadLibrary(TEXT("d3d9.dll"));
+    DIRECT3DCREATE9EXFUNCTION pfnCreate9Ex = (DIRECT3DCREATE9EXFUNCTION)GetProcAddress(hD3D, "Direct3DCreate9Ex");
+    FreeLibrary(hD3D);
+
+    IDirect3DDevice9Ex *pd3dDevice = NULL;
+    IDirect3D9 *pD3D = NULL;
+    IDirect3D9Ex *pD3DEx = NULL;
+    
+    HRESULT hr = S_OK;
+    if (pfnCreate9Ex)
+    {
+        hr = (*pfnCreate9Ex)(D3D_SDK_VERSION, &pD3DEx);
+    }
+
+    if (pfnCreate9Ex && SUCCEEDED(hr) && !fForceXDDM)
+    {
+        IFC(pD3DEx->CreateDeviceEx(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, GetVertexProcessing(pD3DEx) | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE, &d3dpp, NULL, &pd3dDevice));
+        IFC(pd3dDevice->QueryInterface(__uuidof(IDirect3DDevice9), reinterpret_cast(&m_pd3dDevice)));  
+    }
+    else
+    {        
+        WNDCLASS wndclass;
+        
+        wndclass.style = CS_HREDRAW | CS_VREDRAW;
+        wndclass.lpfnWndProc = DefWindowProc;
+        wndclass.cbClsExtra = 0;
+        wndclass.cbWndExtra = 0;
+        wndclass.hInstance = NULL;
+        wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+        wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
+        wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
+        wndclass.lpszMenuName = NULL;
+        wndclass.lpszClassName = szAppName;
+
+        if (!RegisterClass(&wndclass))
+        {
+            IFC(E_FAIL);
+        }
+
+        // A non-null hwnd is necessary on XDDM but it doesn't do anything so make one up
+        m_hwndDummy = CreateWindow(szAppName,
+                            TEXT("whee!"),
+                            WS_OVERLAPPEDWINDOW,
+                            0,                   // Initial X
+                            0,                   // Initial Y
+                            0,                   // Width
+                            0,                   // Height
+                            NULL,
+                            NULL,
+                            NULL,
+                            NULL);
+
+        pD3D = Direct3DCreate9(D3D_SDK_VERSION);
+        if (!pD3D) 
+        {
+            IFC(E_FAIL);
+        }
+
+        IFC(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hwndDummy, GetVertexProcessing(pD3D) | D3DCREATE_MULTITHREADED | D3DCREATE_FPU_PRESERVE, &d3dpp, &m_pd3dDevice));
+    }
+
+    IFC(m_pd3dDevice->CreateRenderTarget(
+        1024,
+        1024,
+        !fForceXDDM ? D3DFMT_A8R8G8B8 : D3DFMT_X8R8G8B8,
+        D3DMULTISAMPLE_NONE,
+        0,
+        !fForceXDDM ? FALSE : TRUE,
+        &m_pd3dSurface,
+        NULL
+        ));
+
+Cleanup:
+    if (pD3DEx)
+    {
+        // QI added an extra ref in the 9Ex case
+        SAFE_RELEASE(pd3dDevice);
+    }
+    
+    SAFE_RELEASE(pD3DEx);
+    SAFE_RELEASE(pD3D);
+
+    return hr;
+}
+
+Renderer::~Renderer()
+{
+    SAFE_RELEASE(m_pd3dSurface);
+    SAFE_RELEASE(m_pd3dVB);
+    SAFE_RELEASE(m_pd3dDevice);
+
+    if (m_hwndDummy)
+    {
+        DestroyWindow(m_hwndDummy);
+        UnregisterClass(szAppName, NULL);
+    }
+}
+
+HRESULT
+Renderer::InitVB()
+{
+    HRESULT hr = S_OK;
+
+    CUSTOMVERTEX vertices[] =
+    {
+        { -1.0f, -1.0f, 0.0f, 0xffff0000, }, // x, y, z, color
+        {  1.0f, -1.0f, 0.0f, 0xff00ff00, },
+        {  0.0f,  1.0f, 0.0f, 0xff00ffff, },
+    };
+
+    IFC(m_pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_pd3dVB, NULL));
+
+    void *pVertices;
+    IFC(m_pd3dVB->Lock(0, sizeof(vertices), &pVertices, 0));
+    memcpy(pVertices, vertices, sizeof(vertices));
+    m_pd3dVB->Unlock();
+
+Cleanup:
+    return hr;
+}
+
+HRESULT
+Renderer::InitCamera()
+{
+    HRESULT hr = S_OK;
+
+    // Set up our view matrix. A view matrix can be defined given an eye point,
+    // a point to lookat, and a direction for which way is up. Here, we set the
+    // eye five units back along the z-axis and up three units, look at the
+    // origin, and define "up" to be in the y-direction.
+    D3DXVECTOR3 vEyePt(0.0f, 0.0f,-5.0f);
+    D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
+    D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
+    D3DXMATRIXA16 matView;
+    D3DXMATRIXA16 matProj;
+    D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
+    IFC(m_pd3dDevice->SetTransform(D3DTS_VIEW, &matView));
+
+    // For the projection matrix, we set up a perspective transform (which
+    // transforms geometry from 3D view space to 2D viewport space, with
+    // a perspective divide making objects smaller in the distance). To build
+    // a perpsective transform, we need the field of view (1/4 pi is common),
+    // the aspect ratio, and the near and far clipping planes (which define at
+    // what distances geometry should be no longer be rendered).
+    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
+    IFC(m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj));
+
+Cleanup:
+    return hr;
+}
+
+HRESULT 
+Renderer::Init(bool fForceXDDM)
+{
+    HRESULT hr = S_OK;
+
+    IFC(InitDevice(fForceXDDM));
+
+    IFC(InitVB());
+
+    IFC(InitCamera());
+
+    IFC(m_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE));
+    IFC(m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE));
+    IFC(m_pd3dDevice->SetStreamSource(0, m_pd3dVB, 0, sizeof(CUSTOMVERTEX)));
+    IFC(m_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX));
+    IFC(m_pd3dDevice->SetRenderTarget(0, m_pd3dSurface));
+
+Cleanup:
+    return hr;
+}
+
+HRESULT 
+Renderer::Render()
+{
+    HRESULT hr = S_OK;
+    D3DXMATRIXA16 matWorld;
+
+    // might not be created yet
+    if (!m_pd3dDevice)
+    {
+        goto Cleanup;
+    }
+
+    IFC(m_pd3dDevice->BeginScene());
+
+    IFC(m_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0));
+
+    // Set up the rotation
+    UINT  iTime  = GetTickCount() % 1000;
+    FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
+    D3DXMatrixRotationY(&matWorld, fAngle);
+    IFC(m_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld));
+
+    IFC(m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1));
+    
+    IFC(m_pd3dDevice->EndScene());
+
+Cleanup:
+    return hr;
+}
diff --git a/src/Test/mil/DRT/imaging/d3dcode/d3dcode.h b/src/Test/mil/DRT/imaging/d3dcode/d3dcode.h
new file mode 100644
index 000000000..aa5bac606
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/d3dcode/d3dcode.h
@@ -0,0 +1,40 @@
+#ifndef _D3DCODE_H_
+#define _D3DCODE_H_
+
+#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
+#include 
+
+#include 
+#include 
+
+#define IFC(x) { hr = (x); if (FAILED(hr)) goto Cleanup; }
+#define SAFE_RELEASE(x) { if ((x)) { (x)->Release(); (x) = NULL; } }
+
+class Renderer
+{
+public:
+    static HRESULT Create(Renderer **ppRenderer, bool fForceXDDM);
+
+    ~Renderer();
+
+    HRESULT Render();
+
+    IDirect3DSurface9 *GetSurfaceNoRef() { return m_pd3dSurface; }
+
+private:
+    Renderer();
+
+    HRESULT Init(bool fForceXDDM);
+    HRESULT InitDevice(bool fForceXDDM);
+    HRESULT InitVB();
+    HRESULT InitCamera();
+    HRESULT Flush();
+    
+    IDirect3DDevice9 *m_pd3dDevice;
+    IDirect3DVertexBuffer9 *m_pd3dVB;
+    IDirect3DSurface9 *m_pd3dSurface;
+
+    HWND m_hwndDummy;
+};
+
+#endif
diff --git a/src/Test/mil/DRT/imaging/d3dcode/d3dcodemain.cpp b/src/Test/mil/DRT/imaging/d3dcode/d3dcodemain.cpp
new file mode 100644
index 000000000..0a72400b7
--- /dev/null
+++ b/src/Test/mil/DRT/imaging/d3dcode/d3dcodemain.cpp
@@ -0,0 +1,53 @@
+#include "d3dcode.h"
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+                       DWORD  ul_reason_for_call,
+                       LPVOID lpReserved
+					 )
+{
+	switch (ul_reason_for_call)
+	{
+	case DLL_PROCESS_ATTACH:
+	case DLL_THREAD_ATTACH:
+	case DLL_THREAD_DETACH:
+	case DLL_PROCESS_DETACH:
+		break;
+	}
+	return TRUE;
+}
+
+Renderer *pRenderer = NULL;
+
+extern "C" HRESULT WINAPI Init(IDirect3DSurface9 **ppSurface, BOOL fForceXDDM)
+{
+    HRESULT hr = S_OK;
+
+    IFC(Renderer::Create(&pRenderer, !!fForceXDDM));
+
+    *ppSurface = pRenderer->GetSurfaceNoRef();
+
+Cleanup:
+    return hr;
+}
+
+extern "C" HRESULT WINAPI Render()
+{
+    HRESULT hr = S_OK;
+
+    if (!pRenderer)
+    {
+        IFC(E_FAIL);
+    }
+
+    IFC(pRenderer->Render());
+
+Cleanup:
+    return hr;
+}
+
+extern "C" void WINAPI Destroy()
+{
+    delete pRenderer;
+    pRenderer = NULL;
+}
+