Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
f3347de5
Commit
f3347de5
authored
Jun 21, 2012
by
Dmitry Timoshkov
Committed by
Alexandre Julliard
Jun 21, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
windowscodecs: Add support for IFD_ASCII field type.
parent
32f9f327
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
48 additions
and
2 deletions
+48
-2
metadatahandler.c
dlls/windowscodecs/metadatahandler.c
+27
-0
metadata.c
dlls/windowscodecs/tests/metadata.c
+21
-2
No files found.
dlls/windowscodecs/metadatahandler.c
View file @
f3347de5
...
@@ -854,6 +854,33 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
...
@@ -854,6 +854,33 @@ static HRESULT load_IFD_entry(IStream *input, const struct IFD_entry *entry,
}
}
FIXME
(
"loading multiple rational fields is not implemented
\n
"
);
FIXME
(
"loading multiple rational fields is not implemented
\n
"
);
break
;
break
;
case
IFD_ASCII
:
item
->
value
.
u
.
pszVal
=
HeapAlloc
(
GetProcessHeap
(),
0
,
count
+
1
);
if
(
!
item
->
value
.
u
.
pszVal
)
return
E_OUTOFMEMORY
;
if
(
count
<=
4
)
{
const
char
*
data
=
(
const
char
*
)
&
entry
->
value
;
memcpy
(
item
->
value
.
u
.
pszVal
,
data
,
count
);
item
->
value
.
u
.
pszVal
[
count
]
=
0
;
break
;
}
pos
.
QuadPart
=
value
;
hr
=
IStream_Seek
(
input
,
pos
,
SEEK_SET
,
NULL
);
if
(
FAILED
(
hr
))
{
HeapFree
(
GetProcessHeap
(),
0
,
item
->
value
.
u
.
pszVal
);
return
hr
;
}
hr
=
IStream_Read
(
input
,
item
->
value
.
u
.
pszVal
,
count
,
NULL
);
if
(
FAILED
(
hr
))
{
HeapFree
(
GetProcessHeap
(),
0
,
item
->
value
.
u
.
pszVal
);
return
hr
;
}
item
->
value
.
u
.
pszVal
[
count
]
=
0
;
break
;
default:
default:
FIXME
(
"loading field of type %d, count %u is not implemented
\n
"
,
type
,
count
);
FIXME
(
"loading field of type %d, count %u is not implemented
\n
"
,
type
,
count
);
break
;
break
;
...
...
dlls/windowscodecs/tests/metadata.c
View file @
f3347de5
...
@@ -82,7 +82,7 @@ static const struct ifd_data
...
@@ -82,7 +82,7 @@ static const struct ifd_data
FLOAT
float_val
[
2
];
FLOAT
float_val
[
2
];
}
IFD_data
=
}
IFD_data
=
{
{
19
,
21
,
{
{
{
0xfe
,
IFD_SHORT
,
1
,
1
},
/* NEWSUBFILETYPE */
{
0xfe
,
IFD_SHORT
,
1
,
1
},
/* NEWSUBFILETYPE */
{
0x100
,
IFD_LONG
,
1
,
222
},
/* IMAGEWIDTH */
{
0x100
,
IFD_LONG
,
1
,
222
},
/* IMAGEWIDTH */
...
@@ -103,6 +103,8 @@ static const struct ifd_data
...
@@ -103,6 +103,8 @@ static const struct ifd_data
{
0xf00b
,
IFD_SSHORT
,
4
,
FIELD_OFFSET
(
struct
ifd_data
,
short_val
)
},
{
0xf00b
,
IFD_SSHORT
,
4
,
FIELD_OFFSET
(
struct
ifd_data
,
short_val
)
},
{
0xf00c
,
IFD_SLONG
,
2
,
FIELD_OFFSET
(
struct
ifd_data
,
long_val
)
},
{
0xf00c
,
IFD_SLONG
,
2
,
FIELD_OFFSET
(
struct
ifd_data
,
long_val
)
},
{
0xf00d
,
IFD_FLOAT
,
2
,
FIELD_OFFSET
(
struct
ifd_data
,
float_val
)
},
{
0xf00d
,
IFD_FLOAT
,
2
,
FIELD_OFFSET
(
struct
ifd_data
,
float_val
)
},
{
0xf00e
,
IFD_ASCII
,
13
,
FIELD_OFFSET
(
struct
ifd_data
,
string
)
},
{
0xf00f
,
IFD_ASCII
,
4
,
'a'
|
'b'
<<
8
|
'c'
<<
16
|
'd'
<<
24
},
},
},
0
,
0
,
{
900
,
3
},
{
900
,
3
},
...
@@ -385,7 +387,8 @@ static void test_metadata_IFD(void)
...
@@ -385,7 +387,8 @@ static void test_metadata_IFD(void)
ULONG
type
,
id
;
ULONG
type
,
id
;
int
count
;
/* if VT_VECTOR */
int
count
;
/* if VT_VECTOR */
LONGLONG
value
[
13
];
LONGLONG
value
[
13
];
}
td
[
19
]
=
const
char
*
string
;
}
td
[
21
]
=
{
{
{
VT_UI2
,
0xfe
,
0
,
{
1
}
},
{
VT_UI2
,
0xfe
,
0
,
{
1
}
},
{
VT_UI4
,
0x100
,
0
,
{
222
}
},
{
VT_UI4
,
0x100
,
0
,
{
222
}
},
...
@@ -406,6 +409,8 @@ static void test_metadata_IFD(void)
...
@@ -406,6 +409,8 @@ static void test_metadata_IFD(void)
{
VT_I2
|
VT_VECTOR
,
0xf00b
,
4
,
{
0x0101
,
0x0202
,
0x0303
,
0x0404
}
},
{
VT_I2
|
VT_VECTOR
,
0xf00b
,
4
,
{
0x0101
,
0x0202
,
0x0303
,
0x0404
}
},
{
VT_I4
|
VT_VECTOR
,
0xf00c
,
2
,
{
0x11223344
,
0x55667788
}
},
{
VT_I4
|
VT_VECTOR
,
0xf00c
,
2
,
{
0x11223344
,
0x55667788
}
},
{
VT_R4
|
VT_VECTOR
,
0xf00d
,
2
,
{
0x449a522b
,
0x4608f5ba
}
},
{
VT_R4
|
VT_VECTOR
,
0xf00d
,
2
,
{
0x449a522b
,
0x4608f5ba
}
},
{
VT_LPSTR
,
0xf00e
,
12
,
{
0
},
"Hello World!"
},
{
VT_LPSTR
,
0xf00f
,
4
,
{
0
},
"abcd"
},
};
};
HRESULT
hr
;
HRESULT
hr
;
IWICMetadataReader
*
reader
;
IWICMetadataReader
*
reader
;
...
@@ -476,11 +481,25 @@ static void test_metadata_IFD(void)
...
@@ -476,11 +481,25 @@ static void test_metadata_IFD(void)
for
(
j
=
0
;
j
<
U
(
value
).
caul
.
cElems
;
j
++
)
for
(
j
=
0
;
j
<
U
(
value
).
caul
.
cElems
;
j
++
)
ok
(
td
[
i
].
value
[
j
]
==
U
(
value
).
caul
.
pElems
[
j
],
"%u: expected value[%d] %#x/%#x, got %#x
\n
"
,
i
,
j
,
(
ULONG
)
td
[
i
].
value
[
j
],
(
ULONG
)(
td
[
i
].
value
[
j
]
>>
32
),
U
(
value
).
caul
.
pElems
[
j
]);
ok
(
td
[
i
].
value
[
j
]
==
U
(
value
).
caul
.
pElems
[
j
],
"%u: expected value[%d] %#x/%#x, got %#x
\n
"
,
i
,
j
,
(
ULONG
)
td
[
i
].
value
[
j
],
(
ULONG
)(
td
[
i
].
value
[
j
]
>>
32
),
U
(
value
).
caul
.
pElems
[
j
]);
break
;
break
;
case
VT_LPSTR
:
ok
(
td
[
i
].
count
==
U
(
value
).
calpstr
.
cElems
,
"%u: expected cElems %d, got %d
\n
"
,
i
,
td
[
i
].
count
,
U
(
value
).
caub
.
cElems
);
for
(
j
=
0
;
j
<
U
(
value
).
calpstr
.
cElems
;
j
++
)
trace
(
"%u: %s
\n
"
,
j
,
U
(
value
).
calpstr
.
pElems
[
j
]);
/* fall through to not handled message */
default:
default:
ok
(
0
,
"%u: array of type %d is not handled
\n
"
,
i
,
value
.
vt
&
~
VT_VECTOR
);
ok
(
0
,
"%u: array of type %d is not handled
\n
"
,
i
,
value
.
vt
&
~
VT_VECTOR
);
break
;
break
;
}
}
}
}
else
if
(
value
.
vt
==
VT_LPSTR
)
{
ok
(
td
[
i
].
count
==
strlen
(
U
(
value
).
pszVal
)
||
broken
(
td
[
i
].
count
==
strlen
(
U
(
value
).
pszVal
)
+
1
),
/* before Win7 */
"%u: expected count %d, got %d
\n
"
,
i
,
td
[
i
].
count
,
lstrlenA
(
U
(
value
).
pszVal
));
if
(
td
[
i
].
count
==
strlen
(
U
(
value
).
pszVal
))
ok
(
!
strcmp
(
td
[
i
].
string
,
U
(
value
).
pszVal
),
"%u: expected %s, got %s
\n
"
,
i
,
td
[
i
].
string
,
U
(
value
).
pszVal
);
}
else
else
ok
(
U
(
value
).
uhVal
.
QuadPart
==
td
[
i
].
value
[
0
],
"%u: unexpected value: %d/%d
\n
"
,
i
,
U
(
value
).
uhVal
.
u
.
LowPart
,
U
(
value
).
uhVal
.
u
.
HighPart
);
ok
(
U
(
value
).
uhVal
.
QuadPart
==
td
[
i
].
value
[
0
],
"%u: unexpected value: %d/%d
\n
"
,
i
,
U
(
value
).
uhVal
.
u
.
LowPart
,
U
(
value
).
uhVal
.
u
.
HighPart
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment