#include "wincodecs_private.h"
-#include <winreg.h>
-#include <objbase.h>
-#include <wincodecsdk.h>
-
-#include <wine/unicode.h>
+#include <shlwapi.h>
/***********************************************************************
* interface for self-registering
*/
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};
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;
}
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;
}
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,
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);
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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,
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);
}
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;
}
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) {
{ 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 },
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",