[WINDOWSCODECS] Sync with Wine Staging 1.7.55. CORE-10536
[reactos.git] / reactos / dll / win32 / windowscodecs / regsvr.c
index 1d139fc..b8d4740 100644 (file)
 
 #include "wincodecs_private.h"
 
-#include <winreg.h>
-#include <objbase.h>
-#include <wincodecsdk.h>
-
-#include <wine/unicode.h>
+#include <shlwapi.h>
 
 /***********************************************************************
  *             interface for self-registering
@@ -137,21 +133,6 @@ static HRESULT unregister_pixelformats(struct regsvr_pixelformat const *list);
  */
 static const WCHAR clsid_keyname[] = {
     'C', 'L', 'S', 'I', 'D', 0 };
-static const WCHAR curver_keyname[] = {
-    'C', 'u', 'r', 'V', 'e', 'r', 0 };
-static const WCHAR ips_keyname[] = {
-    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
-    0 };
-static const WCHAR ips32_keyname[] = {
-    'I', 'n', 'P', 'r', 'o', 'c', 'S', 'e', 'r', 'v', 'e', 'r',
-    '3', '2', 0 };
-static const WCHAR progid_keyname[] = {
-    'P', 'r', 'o', 'g', 'I', 'D', 0 };
-static const WCHAR viprogid_keyname[] = {
-    'V', 'e', 'r', 's', 'i', 'o', 'n', 'I', 'n', 'd', 'e', 'p',
-    'e', 'n', 'd', 'e', 'n', 't', 'P', 'r', 'o', 'g', 'I', 'D',
-    0 };
-static const char tmodel_valuename[] = "ThreadingModel";
 static const char author_valuename[] = "Author";
 static const char friendlyname_valuename[] = "FriendlyName";
 static const WCHAR vendor_valuename[] = {'V','e','n','d','o','r',0};
@@ -224,21 +205,21 @@ static HRESULT register_decoders(struct regsvr_decoder const *list)
                              KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
        if (res == ERROR_SUCCESS) {
            res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            RegCloseKey(instance_clsid_key);
        }
        if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->author) {
            res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->author),
+                                 (const BYTE*)list->author,
                                 strlen(list->author) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->friendlyname) {
            res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->friendlyname),
+                                 (const BYTE*)list->friendlyname,
                                 strlen(list->friendlyname) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -246,34 +227,34 @@ static HRESULT register_decoders(struct regsvr_decoder const *list)
         if (list->vendor) {
             StringFromGUID2(list->vendor, buf, 39);
            res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->container_format) {
             StringFromGUID2(list->container_format, buf, 39);
            res = RegSetValueExW(clsid_key, containerformat_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->version) {
            res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->version),
+                                 (const BYTE*)list->version,
                                 strlen(list->version) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->mimetypes) {
            res = RegSetValueExA(clsid_key, mimetypes_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->mimetypes),
+                                 (const BYTE*)list->mimetypes,
                                 strlen(list->mimetypes) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->extensions) {
            res = RegSetValueExA(clsid_key, extensions_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->extensions),
+                                 (const BYTE*)list->extensions,
                                 strlen(list->extensions) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -314,10 +295,10 @@ static HRESULT register_decoders(struct regsvr_decoder const *list)
                                       KEY_READ | KEY_WRITE, NULL, &pattern_key, NULL);
                 if (res != ERROR_SUCCESS) break;
                res = RegSetValueExA(pattern_key, length_valuename, 0, REG_DWORD,
-                                    (CONST BYTE*)(&list->patterns[i].length), 4);
+                                     (const BYTE*)&list->patterns[i].length, 4);
                 if (res == ERROR_SUCCESS)
                    res = RegSetValueExA(pattern_key, position_valuename, 0, REG_DWORD,
-                                        (CONST BYTE*)(&list->patterns[i].position), 4);
+                                         (const BYTE*)&list->patterns[i].position, 4);
                 if (res == ERROR_SUCCESS)
                    res = RegSetValueExA(pattern_key, pattern_valuename, 0, REG_BINARY,
                                         list->patterns[i].pattern,
@@ -328,7 +309,7 @@ static HRESULT register_decoders(struct regsvr_decoder const *list)
                                         list->patterns[i].length);
                 if (res == ERROR_SUCCESS)
                    res = RegSetValueExA(pattern_key, endofstream_valuename, 0, REG_DWORD,
-                                        (CONST BYTE*)&(list->patterns[i].endofstream), 4);
+                                         (const BYTE*)&list->patterns[i].endofstream, 4);
                 RegCloseKey(pattern_key);
             }
             RegCloseKey(patterns_key);
@@ -439,21 +420,21 @@ static HRESULT register_encoders(struct regsvr_encoder const *list)
                              KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
        if (res == ERROR_SUCCESS) {
            res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            RegCloseKey(instance_clsid_key);
        }
        if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->author) {
            res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->author),
+                                 (const BYTE*)list->author,
                                 strlen(list->author) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->friendlyname) {
            res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->friendlyname),
+                                 (const BYTE*)list->friendlyname,
                                 strlen(list->friendlyname) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -461,34 +442,34 @@ static HRESULT register_encoders(struct regsvr_encoder const *list)
         if (list->vendor) {
             StringFromGUID2(list->vendor, buf, 39);
            res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->container_format) {
             StringFromGUID2(list->container_format, buf, 39);
            res = RegSetValueExW(clsid_key, containerformat_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->version) {
            res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->version),
+                                 (const BYTE*)list->version,
                                 strlen(list->version) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->mimetypes) {
            res = RegSetValueExA(clsid_key, mimetypes_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->mimetypes),
+                                 (const BYTE*)list->mimetypes,
                                 strlen(list->mimetypes) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->extensions) {
            res = RegSetValueExA(clsid_key, extensions_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->extensions),
+                                 (const BYTE*)list->extensions,
                                 strlen(list->extensions) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -617,21 +598,21 @@ static HRESULT register_converters(struct regsvr_converter const *list)
                              KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
        if (res == ERROR_SUCCESS) {
            res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            RegCloseKey(instance_clsid_key);
        }
        if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->author) {
            res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->author),
+                                 (const BYTE*)list->author,
                                 strlen(list->author) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->friendlyname) {
            res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->friendlyname),
+                                 (const BYTE*)list->friendlyname,
                                 strlen(list->friendlyname) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -639,13 +620,13 @@ static HRESULT register_converters(struct regsvr_converter const *list)
         if (list->vendor) {
             StringFromGUID2(list->vendor, buf, 39);
            res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->version) {
            res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->version),
+                                 (const BYTE*)list->version,
                                 strlen(list->version) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -774,21 +755,21 @@ static HRESULT register_metadatareaders(struct regsvr_metadatareader const *list
                              KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
        if (res == ERROR_SUCCESS) {
            res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            RegCloseKey(instance_clsid_key);
        }
        if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->author) {
            res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->author),
+                                 (const BYTE*)list->author,
                                 strlen(list->author) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->friendlyname) {
            res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->friendlyname),
+                                 (const BYTE*)list->friendlyname,
                                 strlen(list->friendlyname) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -796,42 +777,42 @@ static HRESULT register_metadatareaders(struct regsvr_metadatareader const *list
         if (list->vendor) {
             StringFromGUID2(list->vendor, buf, 39);
            res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->metadata_format) {
             StringFromGUID2(list->metadata_format, buf, 39);
            res = RegSetValueExW(clsid_key, metadataformat_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->version) {
            res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->version),
+                                 (const BYTE*)list->version,
                                 strlen(list->version) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->specversion) {
            res = RegSetValueExA(clsid_key, specversion_valuename, 0, REG_SZ,
-                                (CONST BYTE*)(list->version),
+                                 (const BYTE*)list->version,
                                 strlen(list->version) + 1);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         res = RegSetValueExA(clsid_key, requiresfullstream_valuename, 0, REG_DWORD,
-                            (CONST BYTE*)(&list->requires_fullstream), 4);
+                             (const BYTE*)&list->requires_fullstream, 4);
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         res = RegSetValueExA(clsid_key, supportspadding_valuename, 0, REG_DWORD,
-                            (CONST BYTE*)(&list->supports_padding), 4);
+                             (const BYTE*)&list->supports_padding, 4);
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->requires_fixedsize) {
            res = RegSetValueExA(clsid_key, requiresfixedsize_valuename, 0, REG_DWORD,
-                                (CONST BYTE*)(&list->requires_fixedsize), 4);
+                                 (const BYTE*)&list->requires_fixedsize, 4);
            if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
@@ -860,7 +841,7 @@ static HRESULT register_metadatareaders(struct regsvr_metadatareader const *list
                                           KEY_READ | KEY_WRITE, NULL, &pattern_key, NULL);
                     if (res != ERROR_SUCCESS) break;
                     res = RegSetValueExA(pattern_key, position_valuename, 0, REG_DWORD,
-                                         (CONST BYTE*)(&container->patterns[i].position), 4);
+                                         (const BYTE*)&container->patterns[i].position, 4);
                     if (res == ERROR_SUCCESS)
                         res = RegSetValueExA(pattern_key, pattern_valuename, 0, REG_BINARY,
                                              container->patterns[i].pattern,
@@ -871,7 +852,7 @@ static HRESULT register_metadatareaders(struct regsvr_metadatareader const *list
                                              container->patterns[i].length);
                     if (res == ERROR_SUCCESS && container->patterns[i].data_offset)
                         res = RegSetValueExA(pattern_key, dataoffset_valuename, 0, REG_DWORD,
-                                             (CONST BYTE*)&(container->patterns[i].data_offset), 4);
+                                             (const BYTE*)&container->patterns[i].data_offset, 4);
                     RegCloseKey(pattern_key);
                 }
 
@@ -984,21 +965,21 @@ static HRESULT register_pixelformats(struct regsvr_pixelformat const *list)
                               KEY_READ | KEY_WRITE, NULL, &instance_clsid_key, NULL);
         if (res == ERROR_SUCCESS) {
             res = RegSetValueExW(instance_clsid_key, clsid_valuename, 0, REG_SZ,
-                                 (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
             RegCloseKey(instance_clsid_key);
         }
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->author) {
             res = RegSetValueExA(clsid_key, author_valuename, 0, REG_SZ,
-                                 (CONST BYTE*)(list->author),
+                                 (const BYTE*)list->author,
                                  strlen(list->author) + 1);
             if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->friendlyname) {
             res = RegSetValueExA(clsid_key, friendlyname_valuename, 0, REG_SZ,
-                                 (CONST BYTE*)(list->friendlyname),
+                                 (const BYTE*)list->friendlyname,
                                  strlen(list->friendlyname) + 1);
             if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
@@ -1006,31 +987,31 @@ static HRESULT register_pixelformats(struct regsvr_pixelformat const *list)
         if (list->vendor) {
             StringFromGUID2(list->vendor, buf, 39);
             res = RegSetValueExW(clsid_key, vendor_valuename, 0, REG_SZ,
-                                 (CONST BYTE*)(buf), 78);
+                                 (const BYTE*)buf, 78);
             if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         if (list->version) {
             res = RegSetValueExA(clsid_key, version_valuename, 0, REG_SZ,
-                                 (CONST BYTE*)(list->version),
+                                 (const BYTE*)list->version,
                                  strlen(list->version) + 1);
             if (res != ERROR_SUCCESS) goto error_close_clsid_key;
         }
 
         res = RegSetValueExA(clsid_key, bitsperpixel_valuename, 0, REG_DWORD,
-                             (CONST BYTE*)(&list->bitsperpixel), 4);
+                             (const BYTE*)&list->bitsperpixel, 4);
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         res = RegSetValueExA(clsid_key, channelcount_valuename, 0, REG_DWORD,
-                             (CONST BYTE*)(&list->channelcount), 4);
+                             (const BYTE*)&list->channelcount, 4);
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         res = RegSetValueExA(clsid_key, numericrepresentation_valuename, 0, REG_DWORD,
-                             (CONST BYTE*)(&list->numericrepresentation), 4);
+                             (const BYTE*)&list->numericrepresentation, 4);
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         res = RegSetValueExA(clsid_key, supportstransparency_valuename, 0, REG_DWORD,
-                             (CONST BYTE*)(&list->supportsalpha), 4);
+                             (const BYTE*)&list->supportsalpha, 4);
         if (res != ERROR_SUCCESS) goto error_close_clsid_key;
 
         if (list->channelmasks) {
@@ -1502,6 +1483,21 @@ static const struct reader_containers pngtext_containers[] = {
     { NULL } /* list terminator */
 };
 
+static const BYTE gAMA[] = "gAMA";
+
+static const struct metadata_pattern pnggama_metadata_pattern[] = {
+    { 4, 4, gAMA, mask_all, 4 },
+    { 0 }
+};
+
+static const struct reader_containers pnggama_containers[] = {
+    {
+        &GUID_ContainerFormatPng,
+        pnggama_metadata_pattern
+    },
+    { NULL } /* list terminator */
+};
+
 static const struct metadata_pattern lsd_metadata_patterns[] = {
     { 0, 6, gif87a_magic, mask_all, 0 },
     { 0, 6, gif89a_magic, mask_all, 0 },
@@ -1597,6 +1593,16 @@ static struct regsvr_metadatareader const metadatareader_list[] = {
         1, 1, 0,
         ifd_containers
     },
+    {   &CLSID_WICPngGamaMetadataReader,
+        "The Wine Project",
+        "Chunk gAMA Reader",
+        "1.0.0.0",
+        "1.0.0.0",
+        &GUID_VendorMicrosoft,
+        &GUID_MetadataFormatChunkgAMA,
+        0, 0, 0,
+        pnggama_containers
+    },
     {   &CLSID_WICPngTextMetadataReader,
         "The Wine Project",
         "Chunk tEXt Reader",