ReactOS  0.4.13-dev-698-g77671f0
tiffformat.c File Reference
#include <math.h>
#include <stdarg.h>
#include <stdio.h>
#include "windef.h"
#include "wincodec.h"
#include "wine/test.h"
#include "pshpack2.h"
#include "poppack.h"
Include dependency graph for tiffformat.c:

Go to the source code of this file.

Classes

struct  IFD_entry
 
struct  IFD_rational
 
struct  tiff_1bpp_data
 
struct  tiff_8bpp_alpha
 
struct  tiff_8bpp_data
 
struct  tiff_resolution_test_data
 
struct  tiff_resolution_image_data
 
struct  tiff_24bpp_data
 
struct  tiff_1x1_data
 

Macros

#define COBJMACROS
 
#define EXPECT_REF(obj, ref)   _expect_ref((IUnknown*)obj, ref, __LINE__)
 
#define IFD_BYTE   1
 
#define IFD_ASCII   2
 
#define IFD_SHORT   3
 
#define IFD_LONG   4
 
#define IFD_RATIONAL   5
 
#define IFD_SBYTE   6
 
#define IFD_UNDEFINED   7
 
#define IFD_SSHORT   8
 
#define IFD_SLONG   9
 
#define IFD_SRATIONAL   10
 
#define IFD_FLOAT   11
 
#define IFD_DOUBLE   12
 

Functions

static void _expect_ref (IUnknown *obj, ULONG ref, int line)
 
static IStreamcreate_stream (const void *data, int data_size)
 
static HRESULT create_decoder (const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
 
static HRESULT get_pixelformat_info (const GUID *format, UINT *bpp, UINT *channels, BOOL *trasparency)
 
static void dump_tiff (void *buf)
 
static void test_tiff_1bpp_palette (void)
 
static void test_QueryCapability (void)
 
static void test_tiff_8bpp_alpha (void)
 
static void generate_tiff_palette (void *buf, unsigned count)
 
static void test_tiff_8bpp_palette (void)
 
static void test_tiff_resolution (void)
 
static void test_tiff_24bpp (void)
 
static UINT width_bytes (UINT width, UINT bpp)
 
static void test_color_formats (void)
 
 START_TEST (tiffformat)
 

Variables

static const struct tiff_1bpp_data tiff_1bpp_data
 
static const struct tiff_8bpp_alpha tiff_8bpp_alpha
 
static const struct tiff_8bpp_data tiff_8bpp_data
 
static const struct tiff_resolution_test_data tiff_resolution_test_data []
 
static struct tiff_resolution_image_data tiff_resolution_image_data
 
static const struct tiff_24bpp_data tiff_24bpp_data
 
static IWICImagingFactoryfactory
 
static const struct tiff_1x1_data tiff_1x1_data
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 23 of file tiffformat.c.

◆ EXPECT_REF

#define EXPECT_REF (   obj,
  ref 
)    _expect_ref((IUnknown*)obj, ref, __LINE__)

Definition at line 29 of file tiffformat.c.

◆ IFD_ASCII

#define IFD_ASCII   2

Definition at line 39 of file tiffformat.c.

◆ IFD_BYTE

#define IFD_BYTE   1

Definition at line 38 of file tiffformat.c.

◆ IFD_DOUBLE

#define IFD_DOUBLE   12

Definition at line 49 of file tiffformat.c.

◆ IFD_FLOAT

#define IFD_FLOAT   11

Definition at line 48 of file tiffformat.c.

◆ IFD_LONG

#define IFD_LONG   4

Definition at line 41 of file tiffformat.c.

◆ IFD_RATIONAL

#define IFD_RATIONAL   5

Definition at line 42 of file tiffformat.c.

◆ IFD_SBYTE

#define IFD_SBYTE   6

Definition at line 43 of file tiffformat.c.

◆ IFD_SHORT

#define IFD_SHORT   3

Definition at line 40 of file tiffformat.c.

◆ IFD_SLONG

#define IFD_SLONG   9

Definition at line 46 of file tiffformat.c.

◆ IFD_SRATIONAL

#define IFD_SRATIONAL   10

Definition at line 47 of file tiffformat.c.

◆ IFD_SSHORT

#define IFD_SSHORT   8

Definition at line 45 of file tiffformat.c.

◆ IFD_UNDEFINED

#define IFD_UNDEFINED   7

Definition at line 44 of file tiffformat.c.

Function Documentation

◆ _expect_ref()

static void _expect_ref ( IUnknown obj,
ULONG  ref,
int  line 
)
static

Definition at line 30 of file tiffformat.c.

31 {
32  ULONG rc;
33  IUnknown_AddRef(obj);
34  rc = IUnknown_Release(obj);
35  ok_(__FILE__,line)(rc == ref, "expected refcount %d, got %d\n", ref, rc);
36 }
#define ok_(x1, x2)
GLenum GLint ref
Definition: glext.h:6028
Definition: parser.c:48
unsigned int ULONG
Definition: retypes.h:1

◆ create_decoder()

static HRESULT create_decoder ( const void image_data,
UINT  image_size,
IWICBitmapDecoder **  decoder 
)
static

Definition at line 330 of file tiffformat.c.

331 {
332  HGLOBAL hmem;
333  BYTE *data;
334  HRESULT hr;
335  IStream *stream;
336  GUID format;
337  LONG refcount;
338 
339  *decoder = NULL;
340 
341  hmem = GlobalAlloc(0, image_size);
342  data = GlobalLock(hmem);
343  memcpy(data, image_data, image_size);
344  GlobalUnlock(hmem);
345 
346  hr = CreateStreamOnHGlobal(hmem, TRUE, &stream);
347  ok(hr == S_OK, "CreateStreamOnHGlobal error %#x\n", hr);
348 
349  hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, decoder);
350  if (hr == S_OK)
351  {
352  hr = IWICBitmapDecoder_GetContainerFormat(*decoder, &format);
353  ok(hr == S_OK, "GetContainerFormat error %#x\n", hr);
354  ok(IsEqualGUID(&format, &GUID_ContainerFormatTiff),
355  "wrong container format %s\n", wine_dbgstr_guid(&format));
356 
357  refcount = IStream_Release(stream);
358  ok(refcount > 0, "expected stream refcount > 0\n");
359  }
360 
361  return hr;
362 }
#define TRUE
Definition: types.h:120
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
HRESULT hr
Definition: shlfolder.c:183
const char * wine_dbgstr_guid(const GUID *guid)
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
long LONG
Definition: pedump.c:60
Definition: main.c:440
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:77
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
Definition: parse.h:22
GLuint GLuint stream
Definition: glext.h:7522
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
#define S_OK
Definition: intsafe.h:59
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
static GLint image_size(GLint width, GLint height, GLenum format, GLenum type)
Definition: mipmap.c:4856

Referenced by test_color_formats(), test_tiff_1bpp_palette(), test_tiff_24bpp(), test_tiff_8bpp_alpha(), test_tiff_8bpp_palette(), and test_tiff_resolution().

◆ create_stream()

static IStream* create_stream ( const void data,
int  data_size 
)
static

Definition at line 309 of file tiffformat.c.

310 {
311  HRESULT hr;
312  IStream *stream;
313  HGLOBAL hdata;
314  void *locked_data;
315 
316  hdata = GlobalAlloc(GMEM_MOVEABLE, data_size);
317  ok(hdata != 0, "GlobalAlloc failed\n");
318  if (!hdata) return NULL;
319 
320  locked_data = GlobalLock(hdata);
321  memcpy(locked_data, data, data_size);
322  GlobalUnlock(hdata);
323 
324  hr = CreateStreamOnHGlobal(hdata, TRUE, &stream);
325  ok(hr == S_OK, "CreateStreamOnHGlobal failed, hr=%x\n", hr);
326 
327  return stream;
328 }
#define TRUE
Definition: types.h:120
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
LONG HRESULT
Definition: typedefs.h:77
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
Definition: parse.h:22
GLuint GLuint stream
Definition: glext.h:7522
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define S_OK
Definition: intsafe.h:59
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
#define GMEM_MOVEABLE
Definition: winbase.h:291

Referenced by test_QueryCapability().

◆ dump_tiff()

static void dump_tiff ( void buf)
static

Definition at line 395 of file tiffformat.c.

396 {
397  UINT count, i;
398  struct tiff_1bpp_data *tiff;
399  struct IFD_entry *tag;
400 
401  tiff = buf;
402  count = *(short *)((char *)tiff + tiff->dir_offset);
403  tag = (struct IFD_entry *)((char *)tiff + tiff->dir_offset + sizeof(short));
404 
405  for (i = 0; i < count; i++)
406  {
407  printf("tag %u: id %04x, type %04x, count %u, value %d",
408  i, tag[i].id, tag[i].type, tag[i].count, tag[i].value);
409  if (tag[i].id == 0x102 && tag[i].count > 2)
410  {
411  short *bps = (short *)((char *)tiff + tag[i].value);
412  printf(" (%d,%d,%d,%d)\n", bps[0], bps[1], bps[2], bps[3]);
413  }
414  else
415  printf("\n");
416  }
417 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
Definition: ecma_167.h:138
Definition: tiffiop.h:102
unsigned short(__cdecl typeof(TIFFCurrentDirectory))(struct tiff *)
Definition: typeof.h:93
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static const WCHAR tiff[]
unsigned int UINT
Definition: ndis.h:50
#define printf
Definition: config.h:203
char * tag
Definition: main.c:59

Referenced by test_color_formats().

◆ generate_tiff_palette()

static void generate_tiff_palette ( void buf,
unsigned  count 
)
static

Definition at line 610 of file tiffformat.c.

611 {
612  unsigned short *r, *g, *b;
613  unsigned i;
614 
615  r = buf;
616  g = r + count;
617  b = g + count;
618 
619  r[0] = 0x11 * 257;
620  g[0] = 0x22 * 257;
621  b[0] = 0x33 * 257;
622  r[1] = 0x44 * 257;
623  g[1] = 0x55 * 257;
624  b[1] = 0x66 * 257;
625  r[2] = 0x77 * 257;
626  g[2] = 0x88 * 257;
627  b[2] = 0x99 * 257;
628  r[3] = 0xa1 * 257;
629  g[3] = 0xb5 * 257;
630  b[3] = 0xff * 257;
631 
632  for (i = 4; i < count; i++)
633  {
634  r[i] = i * 257;
635  g[i] = (i | 0x40) * 257;
636  b[i] = (i | 0x80) * 257;
637  }
638 }
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define b
Definition: ke_i.h:79
GLboolean GLboolean g
Definition: glext.h:6204
GLboolean GLboolean GLboolean b
Definition: glext.h:6204

Referenced by test_color_formats(), and test_tiff_8bpp_palette().

◆ get_pixelformat_info()

static HRESULT get_pixelformat_info ( const GUID format,
UINT bpp,
UINT channels,
BOOL trasparency 
)
static

Definition at line 364 of file tiffformat.c.

365 {
366  HRESULT hr;
368  IWICPixelFormatInfo2 *formatinfo;
369 
370  hr = IWICImagingFactory_CreateComponentInfo(factory, format, &info);
371  ok(hr == S_OK, "CreateComponentInfo(%s) error %#x\n", wine_dbgstr_guid(format), hr);
372  if (hr == S_OK)
373  {
374  hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo2, (void **)&formatinfo);
375  if (hr == S_OK)
376  {
377  hr = IWICPixelFormatInfo2_SupportsTransparency(formatinfo, trasparency);
378  ok(hr == S_OK, "SupportsTransparency error %#x\n", hr);
379  IWICPixelFormatInfo2_Release(formatinfo);
380  }
381  hr = IWICComponentInfo_QueryInterface(info, &IID_IWICPixelFormatInfo, (void **)&formatinfo);
382  if (hr == S_OK)
383  {
384  hr = IWICPixelFormatInfo2_GetBitsPerPixel(formatinfo, bpp);
385  ok(hr == S_OK, "GetBitsPerPixel error %#x\n", hr);
386  hr = IWICPixelFormatInfo2_GetChannelCount(formatinfo, channels);
387  ok(hr == S_OK, "GetChannelCount error %#x\n", hr);
388  IWICPixelFormatInfo2_Release(formatinfo);
389  }
390  IWICComponentInfo_Release(info);
391  }
392  return hr;
393 }
HRESULT hr
Definition: shlfolder.c:183
const char * wine_dbgstr_guid(const GUID *guid)
int This channels
Definition: rdpsnd_libao.c:37
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
struct _test_info info[]
Definition: SetCursorPos.c:19
Definition: main.c:440
#define ok(value,...)
LONG HRESULT
Definition: typedefs.h:77
#define S_OK
Definition: intsafe.h:59
DWORD bpp
Definition: surface.c:181

Referenced by test_color_formats().

◆ START_TEST()

START_TEST ( tiffformat  )

Definition at line 1181 of file tiffformat.c.

1182 {
1183  HRESULT hr;
1184 
1186 
1187  hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
1188  &IID_IWICImagingFactory, (void **)&factory);
1189  ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
1190  if (FAILED(hr)) return;
1191 
1198  test_tiff_24bpp();
1199 
1200  IWICImagingFactory_Release(factory);
1201  CoUninitialize();
1202 }
HRESULT hr
Definition: shlfolder.c:183
static void test_tiff_resolution(void)
Definition: tiffformat.c:688
Definition: main.c:440
static void test_QueryCapability(void)
Definition: tiffformat.c:450
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
static void test_tiff_8bpp_alpha(void)
Definition: tiffformat.c:547
static void test_tiff_1bpp_palette(void)
Definition: tiffformat.c:419
LONG HRESULT
Definition: typedefs.h:77
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3234
#define S_OK
Definition: intsafe.h:59
static void test_tiff_8bpp_palette(void)
Definition: tiffformat.c:640
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:1991
HRESULT WINAPI DECLSPEC_HOTPATCH CoInitializeEx(LPVOID lpReserved, DWORD dwCoInit)
Definition: compobj.c:1935
static void test_tiff_24bpp(void)
Definition: tiffformat.c:740
static void test_color_formats(void)
Definition: tiffformat.c:851

◆ test_color_formats()

static void test_color_formats ( void  )
static

Definition at line 851 of file tiffformat.c.

852 {
853  struct bitmap_data
854  {
855  UINT bpp;
856  UINT width;
857  UINT height;
858  const WICPixelFormatGUID *format;
859  const BYTE *bits;
860  };
861  static const BYTE bits_1bpsBGR[] = { 0,255,0,255,0,255,255,255,0,0,0,255,255,0,0,0,255,255,255,255,255,0,0,0,0,255,0,255,0,255 };
862  static const struct bitmap_data data_1bpsBGR =
863  {
864  24, 10, 2, &GUID_WICPixelFormat24bppBGR, bits_1bpsBGR
865  };
866  static const BYTE bits_4bpsBGR[] = { 204,85,85,136,187,51,0,85,85,85,0,68,0,102,0,136,0,119,0,153,0 };
867  static const struct bitmap_data data_4bpsBGR =
868  {
869  24, 5, 2, &GUID_WICPixelFormat24bppBGR, bits_4bpsBGR
870  };
871  static const BYTE bits_8bpsBGR[] = { 2,0,1,5,4,3,8,7,6 };
872  static const struct bitmap_data data_8bpsBGR =
873  {
874  24, 3, 1, &GUID_WICPixelFormat24bppBGR, bits_8bpsBGR
875  };
876  static const BYTE bits_48bppRGB[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
877  static const struct bitmap_data data_48bppRGB =
878  {
879  48, 2, 1, &GUID_WICPixelFormat48bppRGB, bits_48bppRGB
880  };
881  static const BYTE bits_1bpsBGRA[] = { 0,255,0,255,0,255,0,255,0,255,255,0,255,0,0,255,255,0,255,255,0,0,255,0,0,255,0,255,0,255,0,255,0,0,0,0,0,255,0,0 };
882  static const struct bitmap_data data_1bpsBGRA =
883  {
884  32, 5, 2, &GUID_WICPixelFormat32bppBGRA, bits_1bpsBGRA
885  };
886  static const BYTE bits_4bpsBGRA[] = { 204,85,85,51,85,136,187,85,0,68,0,85,0,102,0,119,0,136,0,153,0,0,0,17,0,34,0,51 };
887  static const struct bitmap_data data_4bpsBGRA =
888  {
889  32, 5, 2, &GUID_WICPixelFormat32bppBGRA, bits_4bpsBGRA
890  };
891  static const BYTE bits_8bpsBGRA[] = { 2,0,1,3,6,5,4,7,0,9,8,1,4,3,2,5 };
892  static const struct bitmap_data data_8bpsBGRA =
893  {
894  32, 4, 1, &GUID_WICPixelFormat32bppBGRA, bits_8bpsBGRA
895  };
896  static const BYTE bits_64bppRGBA[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
897  static const struct bitmap_data data_64bppRGBA =
898  {
899  64, 2, 1, &GUID_WICPixelFormat64bppRGBA, bits_64bppRGBA
900  };
901  static const BYTE bits_BlackWhite[] = { 85,195,184,85 };
902  static const struct bitmap_data data_BlackWhite =
903  {
904  1, 30, 1, &GUID_WICPixelFormatBlackWhite, bits_BlackWhite
905  };
906  static const BYTE bits_BlackWhite_xp[] = { 85,195,184,84 };
907  static const struct bitmap_data data_BlackWhite_xp =
908  {
909  1, 30, 1, &GUID_WICPixelFormatBlackWhite, bits_BlackWhite_xp
910  };
911  static const BYTE bits_4bppGray[] = { 85,195,184,85 };
912  static const struct bitmap_data data_4bppGray =
913  {
914  4, 7, 1, &GUID_WICPixelFormat4bppGray, bits_4bppGray
915  };
916  static const BYTE bits_4bppGray_xp[] = { 85,195,184,80 };
917  static const struct bitmap_data data_4bppGray_xp =
918  {
919  4, 7, 1, &GUID_WICPixelFormat4bppGray, bits_4bppGray_xp
920  };
921  static const BYTE bits_8bppGray[] = { 1,0,2,3,4,5,6,7,8,9 };
922  static const struct bitmap_data data_8bppGray =
923  {
924  8, 10, 1, &GUID_WICPixelFormat8bppGray, bits_8bppGray
925  };
926  static const BYTE bits_16bppGray[] = { 1,0,2,3,4,5 };
927  static const struct bitmap_data data_16bppGray =
928  {
929  16, 3, 1, &GUID_WICPixelFormat16bppGray, bits_16bppGray
930  };
931  static const BYTE bits_32bppGrayFloat[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
932  static const struct bitmap_data data_32bppGrayFloat =
933  {
934  32, 3, 1, &GUID_WICPixelFormat32bppGrayFloat, bits_32bppGrayFloat
935  };
936 #if 0 /* FIXME */
937  static const BYTE bits_96bpp3Channels[] = { 0 };
938  static const struct bitmap_data data_96bpp3Channels =
939  {
940  64, 1, 1, &GUID_WICPixelFormat96bpp3Channels, bits_96bpp3Channels
941  };
942 #endif
943  static const BYTE bits_128bppRGBAFloat[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
944  static const struct bitmap_data data_128bppRGBAFloat =
945  {
946  128, 1, 1, &GUID_WICPixelFormat128bppRGBAFloat, bits_128bppRGBAFloat
947  };
948  static const BYTE bits_1bppIndexed[] = { 85,195,184,85 };
949  static const struct bitmap_data data_1bppIndexed =
950  {
951  1, 32, 1, &GUID_WICPixelFormat1bppIndexed, bits_1bppIndexed
952  };
953  static const BYTE bits_4bppIndexed[] = { 85,195,184,85 };
954  static const struct bitmap_data data_4bppIndexed =
955  {
956  4, 7, 1, &GUID_WICPixelFormat4bppIndexed, bits_4bppIndexed
957  };
958  static const BYTE bits_4bppIndexed_xp[] = { 85,195,184,80 };
959  static const struct bitmap_data data_4bppIndexed_xp =
960  {
961  4, 7, 1, &GUID_WICPixelFormat4bppIndexed, bits_4bppIndexed_xp
962  };
963  static const BYTE bits_8bppIndexed[] = { 1,0,2,3,4,5,6,7,8,9 };
964  static const struct bitmap_data data_8bppIndexed =
965  {
966  8, 3, 1, &GUID_WICPixelFormat8bppIndexed, bits_8bppIndexed
967  };
968  static const BYTE bits_32bppCMYK[] = { 1,0,2,3,4,5,6,7,8,9,0,1 };
969  static const struct bitmap_data data_32bppCMYK =
970  {
971  32, 3, 1, &GUID_WICPixelFormat32bppCMYK, bits_32bppCMYK
972  };
973  static const BYTE bits_64bppCMYK[] = { 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 };
974  static const struct bitmap_data data_64bppCMYK =
975  {
976  64, 2, 1, &GUID_WICPixelFormat64bppCMYK, bits_64bppCMYK
977  };
978  static const struct
979  {
980  int photometric; /* PhotometricInterpretation */
981  int samples; /* SamplesPerPixel */
982  int bps; /* BitsPerSample */
983  const struct bitmap_data *data;
984  const struct bitmap_data *alt_data;
985  } td[] =
986  {
987  /* 2 - RGB */
988  { 2, 3, 1, &data_1bpsBGR },
989  { 2, 3, 4, &data_4bpsBGR },
990  { 2, 3, 8, &data_8bpsBGR },
991  { 2, 3, 16, &data_48bppRGB },
992  { 2, 3, 24, NULL },
993 #if 0 /* FIXME */
994  { 2, 3, 32, &data_96bpp3Channels },
995 #endif
996  { 2, 4, 1, &data_1bpsBGRA },
997  { 2, 4, 4, &data_4bpsBGRA },
998  { 2, 4, 8, &data_8bpsBGRA },
999  { 2, 4, 16, &data_64bppRGBA },
1000  { 2, 4, 24, NULL },
1001  { 2, 4, 32, &data_128bppRGBAFloat },
1002  /* 1 - BlackIsZero (Bilevel) */
1003  { 1, 1, 1, &data_BlackWhite, &data_BlackWhite_xp },
1004  { 1, 1, 4, &data_4bppGray, &data_4bppGray_xp },
1005  { 1, 1, 8, &data_8bppGray },
1006  { 1, 1, 16, &data_16bppGray },
1007  { 1, 1, 24, NULL },
1008  { 1, 1, 32, &data_32bppGrayFloat },
1009  /* 3 - Palette Color */
1010  { 3, 1, 1, &data_1bppIndexed },
1011  { 3, 1, 4, &data_4bppIndexed, &data_4bppIndexed_xp },
1012  { 3, 1, 8, &data_8bppIndexed },
1013 #if 0 /* FIXME: for some reason libtiff replaces photometric 3 by 1 for bps > 8 */
1014  { 3, 1, 16, &data_8bppIndexed },
1015  { 3, 1, 24, &data_8bppIndexed },
1016  { 3, 1, 32, &data_8bppIndexed },
1017 #endif
1018  /* 5 - Separated */
1019  { 5, 4, 1, NULL },
1020  { 5, 4, 4, NULL },
1021  { 5, 4, 8, &data_32bppCMYK },
1022  { 5, 4, 16, &data_64bppCMYK },
1023  { 5, 4, 24, NULL },
1024  { 5, 4, 32, NULL },
1025  };
1026  BYTE buf[sizeof(tiff_1x1_data)];
1027  BYTE pixels[256];
1028  HRESULT hr;
1029  IWICBitmapDecoder *decoder;
1030  IWICBitmapFrameDecode *frame;
1031  GUID format;
1032  UINT count, i, bpp, channels, ret;
1033  BOOL trasparency;
1034  struct IFD_entry *tag, *tag_photo = NULL, *tag_bps = NULL, *tag_samples = NULL, *tag_colormap = NULL;
1035  struct IFD_entry *tag_width = NULL, *tag_height = NULL;
1036  short *bps;
1037 
1038  memcpy(buf, &tiff_1x1_data, sizeof(tiff_1x1_data));
1039  generate_tiff_palette(buf + FIELD_OFFSET(struct tiff_1x1_data, palette_data), 256);
1040 
1041  count = *(short *)(buf + tiff_1x1_data.dir_offset);
1042  tag = (struct IFD_entry *)(buf + tiff_1x1_data.dir_offset + sizeof(short));
1043 
1044  /* verify the TIFF structure */
1045  for (i = 0; i < count; i++)
1046  {
1047  if (tag[i].id == 0x100) /* ImageWidth */
1048  tag_width = &tag[i];
1049  else if (tag[i].id == 0x101) /* ImageLength */
1050  tag_height = &tag[i];
1051  else if (tag[i].id == 0x102) /* BitsPerSample */
1052  tag_bps = &tag[i];
1053  else if (tag[i].id == 0x106) /* PhotometricInterpretation */
1054  tag_photo = &tag[i];
1055  else if (tag[i].id == 0x115) /* SamplesPerPixel */
1056  tag_samples = &tag[i];
1057  else if (tag[i].id == 0x140) /* ColorMap */
1058  tag_colormap = &tag[i];
1059  }
1060 
1061  ok(tag_bps && tag_photo && tag_samples && tag_colormap, "tag 0x102,0x106,0x115 or 0x140 is missing\n");
1062  if (!tag_bps || !tag_photo || !tag_samples || !tag_colormap) return;
1063 
1064  ok(tag_bps->type == IFD_SHORT, "tag 0x102 should have type IFD_SHORT\n");
1065  bps = (short *)(buf + tag_bps->value);
1066  ok(bps[0] == 8 && bps[1] == 8 && bps[2] == 8 && bps[3] == 0,
1067  "expected bps 8,8,8,0 got %d,%d,%d,%d\n", bps[0], bps[1], bps[2], bps[3]);
1068 
1069  for (i = 0; i < sizeof(td)/sizeof(td[0]); i++)
1070  {
1071  if (td[i].data)
1072  {
1073  bpp = td[i].samples * td[i].bps;
1074  if (winetest_debug > 1)
1075  trace("samples %u, bps %u, bpp %u, width %u => width_bytes %u\n", td[i].samples, td[i].bps, bpp,
1076  td[i].data->width, width_bytes(td[i].data->width, bpp));
1077  tag_width->value = td[i].data->width;
1078  tag_height->value = td[i].data->height;
1079  }
1080  else
1081  {
1082  tag_width->value = 1;
1083  tag_height->value = 1;
1084  }
1085 
1086  tag_colormap->count = (1 << td[i].bps) * 3;
1087 
1088  if (td[i].bps < 8)
1089  {
1090  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data)] = 0x55;
1091  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data) + 1] = 0xc3;
1092  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data) + 2] = 0xb8;
1093  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data) + 3] = 0x55;
1094  }
1095  else
1096  {
1097  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data)] = 1;
1098  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data) + 1] = 0;
1099  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data) + 2] = 2;
1100  buf[FIELD_OFFSET(struct tiff_1x1_data, pixel_data) + 3] = 3;
1101  }
1102 
1103  tag_photo->value = td[i].photometric;
1104  tag_bps->count = td[i].samples;
1105  tag_samples->value = td[i].samples;
1106 
1107  if (td[i].samples == 1)
1108  tag_bps->value = td[i].bps;
1109  else if (td[i].samples == 2)
1110  tag_bps->value = MAKELONG(td[i].bps, td[i].bps);
1111  else if (td[i].samples == 3)
1112  {
1113  tag_bps->value = (BYTE *)bps - buf;
1114  bps[0] = bps[1] = bps[2] = td[i].bps;
1115  }
1116  else if (td[i].samples == 4)
1117  {
1118  tag_bps->value = (BYTE *)bps - buf;
1119  bps[0] = bps[1] = bps[2] = bps[3] = td[i].bps;
1120  }
1121  else
1122  {
1123  ok(0, "%u: unsupported samples count %d\n", i, td[i].samples);
1124  continue;
1125  }
1126 
1127  hr = create_decoder(buf, sizeof(buf), &decoder);
1128  if (!td[i].data)
1129  {
1131  "%u: (%d,%d,%d) wrong error %#x\n", i, td[i].photometric, td[i].samples, td[i].bps, hr);
1132  if (hr == S_OK)
1133  {
1134  IWICBitmapDecoder_Release(decoder);
1135  dump_tiff(buf);
1136  }
1137  continue;
1138  }
1139  else
1141  "%u: failed to load TIFF image data (%d,%d,%d) %#x\n",
1142  i, td[i].photometric, td[i].samples, td[i].bps, hr);
1143  if (hr != S_OK) continue;
1144 
1145  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
1146  ok(hr == S_OK, "%u: GetFrame error %#x\n", i, hr);
1147 
1148  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
1149  ok(hr == S_OK, "%u: GetPixelFormat error %#x\n", i, hr);
1150  ok(IsEqualGUID(&format, td[i].data->format),
1151  "%u (%d,%d,%d): expected %s, got %s\n",
1152  i, td[i].photometric, td[i].samples, td[i].bps,
1153  wine_dbgstr_guid(td[i].data->format), wine_dbgstr_guid(&format));
1154 
1155  trasparency = (td[i].photometric == 2 && td[i].samples == 4); /* for XP */
1156  hr = get_pixelformat_info(&format, &bpp, &channels, &trasparency);
1157  ok(hr == S_OK, "%u: get_pixelformat_bpp error %#x\n", i, hr);
1158  ok(bpp == td[i].data->bpp, "%u: expected %u, got %u\n", i, td[i].data->bpp, bpp);
1159  ok(channels == td[i].samples, "%u: expected %u, got %u\n", i, td[i].samples, channels);
1160  ok(trasparency == (td[i].photometric == 2 && td[i].samples == 4), "%u: got %u\n", i, trasparency);
1161 
1162  memset(pixels, 0, sizeof(pixels));
1163  hr = IWICBitmapFrameDecode_CopyPixels(frame, NULL, width_bytes(td[i].data->width, bpp), sizeof(pixels), pixels);
1164  ok(hr == S_OK, "%u: CopyPixels error %#x\n", i, hr);
1165  ret = memcmp(pixels, td[i].data->bits, width_bytes(td[i].data->width, bpp));
1166  if (ret && td[i].alt_data)
1167  ret = memcmp(pixels, td[i].alt_data->bits, width_bytes(td[i].data->width, bpp));
1168  ok(ret == 0, "%u: (%d,%d,%d) wrong pixel data\n", i, td[i].photometric, td[i].samples, td[i].bps);
1169  if (ret)
1170  {
1171  UINT j, n = width_bytes(td[i].data->width, bpp);
1172  for (j = 0; j < n; j++)
1173  printf("%u%s", pixels[j], (j + 1) < n ? "," : "\n");
1174  }
1175 
1176  IWICBitmapFrameDecode_Release(frame);
1177  IWICBitmapDecoder_Release(decoder);
1178  }
1179 }
GLsizei samples
Definition: glext.h:7006
#define trace(...)
Definition: kmt_test.h:217
UINT bpp
Definition: converter.c:37
static void dump_tiff(void *buf)
Definition: tiffformat.c:395
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
HRESULT hr
Definition: shlfolder.c:183
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLdouble n
Definition: glext.h:7729
static const struct tiff_1x1_data tiff_1x1_data
const char * wine_dbgstr_guid(const GUID *guid)
Definition: ecma_167.h:138
int This channels
Definition: rdpsnd_libao.c:37
ULONG dir_offset
Definition: image.c:5507
static const float bits_32bppGrayFloat[]
Definition: converter.c:507
int winetest_debug
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int BOOL
Definition: ntddk_ex.h:94
static HRESULT get_pixelformat_info(const GUID *format, UINT *bpp, UINT *channels, BOOL *trasparency)
Definition: tiffformat.c:364
#define ok(value,...)
#define MAKELONG(a, b)
Definition: typedefs.h:248
smooth NULL
Definition: ftsmooth.c:416
#define IFD_SHORT
Definition: tiffformat.c:40
static const BYTE bits_8bppGray[]
Definition: converter.c:527
LONG value
static void generate_tiff_palette(void *buf, unsigned count)
Definition: tiffformat.c:610
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
UINT height
Definition: converter.c:40
LONG HRESULT
Definition: typedefs.h:77
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: tiffformat.c:330
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
UINT width
Definition: converter.c:39
int ret
static UINT width_bytes(UINT width, UINT bpp)
Definition: tiffformat.c:846
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
unsigned char BYTE
Definition: mem.h:68
#define broken(x)
Definition: _sntprintf.h:21
#define S_OK
Definition: intsafe.h:59
#define WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT
Definition: winerror.h:3299
GLint GLint GLsizei GLsizei GLsizei GLint GLenum GLenum const GLvoid * pixels
Definition: gl.h:1546
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
const BYTE * bits
Definition: converter.c:38
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
#define WINCODEC_ERR_COMPONENTNOTFOUND
Definition: winerror.h:3288
#define WINCODEC_ERR_BADIMAGE
Definition: winerror.h:3291
const WICPixelFormatGUID * format
Definition: converter.c:36
DWORD bpp
Definition: surface.c:181
#define memset(x, y, z)
Definition: compat.h:39
const struct bitmap_data * alt_data
Definition: converter.c:43
#define printf
Definition: config.h:203
char * tag
Definition: main.c:59

Referenced by START_TEST().

◆ test_QueryCapability()

static void test_QueryCapability ( void  )
static

Definition at line 450 of file tiffformat.c.

451 {
452  HRESULT hr;
453  IStream *stream;
454  IWICBitmapDecoder *decoder;
455  IWICBitmapFrameDecode *frame;
456  static const DWORD exp_caps = WICBitmapDecoderCapabilityCanDecodeAllImages |
459  static const DWORD exp_caps_xp = WICBitmapDecoderCapabilityCanDecodeAllImages |
461  DWORD capability;
463  ULARGE_INTEGER cur_pos;
464  UINT frame_count;
465 
467  if (!stream) return;
468 
469  hr = IWICImagingFactory_CreateDecoder(factory, &GUID_ContainerFormatTiff, NULL, &decoder);
470  ok(hr == S_OK, "CreateDecoder error %#x\n", hr);
471  if (FAILED(hr)) return;
472 
473  frame_count = 0xdeadbeef;
474  hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
475  ok(hr == S_OK || broken(hr == E_POINTER) /* XP */, "GetFrameCount error %#x\n", hr);
476  ok(frame_count == 0, "expected 0, got %u\n", frame_count);
477 
478  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
479  ok(hr == WINCODEC_ERR_FRAMEMISSING || broken(hr == E_POINTER) /* XP */, "expected WINCODEC_ERR_FRAMEMISSING, got %#x\n", hr);
480 
481  pos.QuadPart = 4;
482  hr = IStream_Seek(stream, pos, SEEK_SET, NULL);
483  ok(hr == S_OK, "IStream_Seek error %#x\n", hr);
484 
485  capability = 0xdeadbeef;
486  hr = IWICBitmapDecoder_QueryCapability(decoder, stream, &capability);
487  ok(hr == S_OK, "QueryCapability error %#x\n", hr);
488  ok(capability == exp_caps || capability == exp_caps_xp,
489  "expected %#x, got %#x\n", exp_caps, capability);
490 
491  frame_count = 0xdeadbeef;
492  hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
493  ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
494  ok(frame_count == 1, "expected 1, got %u\n", frame_count);
495 
496  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
497  ok(hr == S_OK, "GetFrame error %#x\n", hr);
498  IWICBitmapFrameDecode_Release(frame);
499 
500  pos.QuadPart = 0;
501  hr = IStream_Seek(stream, pos, SEEK_CUR, &cur_pos);
502  ok(hr == S_OK, "IStream_Seek error %#x\n", hr);
503  ok(cur_pos.QuadPart > 4 && cur_pos.QuadPart < sizeof(tiff_1bpp_data),
504  "current stream pos is at %x/%x\n", cur_pos.u.LowPart, cur_pos.u.HighPart);
505 
506  hr = IWICBitmapDecoder_QueryCapability(decoder, stream, &capability);
507  ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr);
508 
509  hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnDemand);
510  ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr);
511 
512  IWICBitmapDecoder_Release(decoder);
513 
514  hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
515 todo_wine
516  ok(hr == WINCODEC_ERR_COMPONENTNOTFOUND, "expected WINCODEC_ERR_COMPONENTNOTFOUND, got %#x\n", hr);
517 
518  if (SUCCEEDED(hr))
519  IWICBitmapDecoder_Release(decoder);
520 
521  pos.QuadPart = 0;
522  hr = IStream_Seek(stream, pos, SEEK_SET, NULL);
523  ok(hr == S_OK, "IStream_Seek error %#x\n", hr);
524 
525  hr = IWICImagingFactory_CreateDecoderFromStream(factory, stream, NULL, 0, &decoder);
526  ok(hr == S_OK, "CreateDecoderFromStream error %#x\n", hr);
527 
528  frame_count = 0xdeadbeef;
529  hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
530  ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
531  ok(frame_count == 1, "expected 1, got %u\n", frame_count);
532 
533  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
534  ok(hr == S_OK, "GetFrame error %#x\n", hr);
535  IWICBitmapFrameDecode_Release(frame);
536 
537  hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnDemand);
538  ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr);
539 
540  hr = IWICBitmapDecoder_QueryCapability(decoder, stream, &capability);
541  ok(hr == WINCODEC_ERR_WRONGSTATE, "expected WINCODEC_ERR_WRONGSTATE, got %#x\n", hr);
542 
543  IWICBitmapDecoder_Release(decoder);
544  IStream_Release(stream);
545 }
#define SEEK_CUR
Definition: util.h:63
struct _ULARGE_INTEGER::@3744 u
HRESULT hr
Definition: shlfolder.c:183
ULONGLONG QuadPart
Definition: ms-dtyp.idl:185
Definition: main.c:440
#define ok(value,...)
smooth NULL
Definition: ftsmooth.c:416
#define SEEK_SET
Definition: jmemansi.c:26
LONG HRESULT
Definition: typedefs.h:77
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WINCODEC_ERR_FRAMEMISSING
Definition: winerror.h:3293
#define todo_wine
Definition: test.h:154
Definition: parse.h:22
GLuint GLuint stream
Definition: glext.h:7522
#define broken(x)
Definition: _sntprintf.h:21
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3273
#define S_OK
Definition: intsafe.h:59
unsigned int UINT
Definition: ndis.h:50
#define WINCODEC_ERR_COMPONENTNOTFOUND
Definition: winerror.h:3288
#define E_POINTER
Definition: winerror.h:2365
static IStream * create_stream(const void *data, int data_size)
Definition: tiffformat.c:309
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by START_TEST().

◆ test_tiff_1bpp_palette()

static void test_tiff_1bpp_palette ( void  )
static

Definition at line 419 of file tiffformat.c.

420 {
421  HRESULT hr;
422  IWICBitmapDecoder *decoder;
423  IWICBitmapFrameDecode *frame;
425  GUID format;
426 
427  hr = create_decoder(&tiff_1bpp_data, sizeof(tiff_1bpp_data), &decoder);
428  ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
429  if (hr != S_OK) return;
430 
431  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
432  ok(hr == S_OK, "GetFrame error %#x\n", hr);
433 
434  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
435  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
436  ok(IsEqualGUID(&format, &GUID_WICPixelFormatBlackWhite),
437  "got wrong format %s\n", wine_dbgstr_guid(&format));
438 
439  hr = IWICImagingFactory_CreatePalette(factory, &palette);
440  ok(hr == S_OK, "CreatePalette error %#x\n", hr);
441  hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
443  "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr);
444 
445  IWICPalette_Release(palette);
446  IWICBitmapFrameDecode_Release(frame);
447  IWICBitmapDecoder_Release(decoder);
448 }
HRESULT hr
Definition: shlfolder.c:183
const char * wine_dbgstr_guid(const GUID *guid)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
Definition: main.c:440
#define ok(value,...)
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3284
LONG HRESULT
Definition: typedefs.h:77
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: tiffformat.c:330
static HPALETTE palette
Definition: clipboard.c:1345
#define S_OK
Definition: intsafe.h:59
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021

Referenced by START_TEST().

◆ test_tiff_24bpp()

static void test_tiff_24bpp ( void  )
static

Definition at line 740 of file tiffformat.c.

741 {
742  HRESULT hr;
743  IWICBitmapDecoder *decoder;
744  IWICBitmapFrameDecode *frame;
746  double dpi_x, dpi_y;
747  GUID format;
748  WICRect rc;
749  BYTE data[3];
750  static const BYTE expected_data[] = { 0x33,0x22,0x11 };
751 
752  hr = create_decoder(&tiff_24bpp_data, sizeof(tiff_24bpp_data), &decoder);
753  ok(hr == S_OK, "got %#x\n", hr);
754  ok(decoder != NULL, "Failed to load TIFF image data\n");
755 
756  hr = IWICBitmapDecoder_GetFrameCount(decoder, &count);
757  ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
758  ok(count == 1, "got %u\n", count);
759 
760  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
761  ok(hr == S_OK, "GetFrame error %#x\n", hr);
762 
763  hr = IWICBitmapFrameDecode_GetSize(frame, &width, &height);
764  ok(hr == S_OK, "GetSize error %#x\n", hr);
765  ok(width == 1, "got %u\n", width);
766  ok(height == 1, "got %u\n", height);
767 
768  hr = IWICBitmapFrameDecode_GetResolution(frame, &dpi_x, &dpi_y);
769  ok(hr == S_OK, "GetResolution error %#x\n", hr);
770  ok(dpi_x == 300.0, "got %f\n", dpi_x);
771  ok(dpi_y == 300.0, "got %f\n", dpi_y);
772 
773  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
774  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
775  ok(IsEqualGUID(&format, &GUID_WICPixelFormat24bppBGR),
776  "got wrong format %s\n", wine_dbgstr_guid(&format));
777 
778  for (stride = 0; stride <= 32; stride++)
779  {
780  memset(data, 0, sizeof(data));
781  rc.X = 0;
782  rc.Y = 0;
783  rc.Width = 1;
784  rc.Height = 1;
785  hr = IWICBitmapFrameDecode_CopyPixels(frame, &rc, stride, sizeof(data), data);
786  if (stride < 3)
787  ok(hr == E_INVALIDARG, "CopyPixels(%u) should fail: %#x\n", stride, hr);
788  else
789  {
790  ok(hr == S_OK, "CopyPixels(%u) error %#x\n", stride, hr);
791 
792  for (i = 0; i < sizeof(data); i++)
793  ok(data[i] == expected_data[i], "%u: expected %02x, got %02x\n", i, expected_data[i], data[i]);
794  }
795  }
796 
797  IWICBitmapFrameDecode_Release(frame);
798  IWICBitmapDecoder_Release(decoder);
799 }
GLint GLint GLsizei width
Definition: gl.h:1546
HRESULT hr
Definition: shlfolder.c:183
GLuint GLuint GLsizei count
Definition: gl.h:1545
const char * wine_dbgstr_guid(const GUID *guid)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ok(value,...)
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
INT Height
Definition: wincodec.idl:239
GLsizei stride
Definition: glext.h:5848
LONG HRESULT
Definition: typedefs.h:77
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: tiffformat.c:330
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
unsigned char BYTE
Definition: mem.h:68
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
#define S_OK
Definition: intsafe.h:59
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
INT Width
Definition: wincodec.idl:238
#define memset(x, y, z)
Definition: compat.h:39

Referenced by START_TEST().

◆ test_tiff_8bpp_alpha()

static void test_tiff_8bpp_alpha ( void  )
static

Definition at line 547 of file tiffformat.c.

548 {
549  HRESULT hr;
550  IWICBitmapDecoder *decoder;
551  IWICBitmapFrameDecode *frame;
552  UINT frame_count, width, height, i;
553  double dpi_x, dpi_y;
555  GUID format;
556  WICRect rc;
557  BYTE data[16];
558  static const BYTE expected_data[16] = { 0x11,0x11,0x11,0x22,0x33,0x33,0x33,0x44,
559  0x55,0x55,0x55,0x66,0x77,0x77,0x77,0x88 };
560 
561  hr = create_decoder(&tiff_8bpp_alpha, sizeof(tiff_8bpp_alpha), &decoder);
562  ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
563  if (hr != S_OK) return;
564 
565  hr = IWICBitmapDecoder_GetFrameCount(decoder, &frame_count);
566  ok(hr == S_OK, "GetFrameCount error %#x\n", hr);
567  ok(frame_count == 1, "expected 1, got %u\n", frame_count);
568 
569  EXPECT_REF(decoder, 1);
570  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
571  ok(hr == S_OK, "GetFrame error %#x\n", hr);
572  EXPECT_REF(decoder, 2);
573  IWICBitmapDecoder_Release(decoder);
574 
575  hr = IWICBitmapFrameDecode_GetSize(frame, &width, &height);
576  ok(hr == S_OK, "GetSize error %#x\n", hr);
577  ok(width == 2, "expected 2, got %u\n", width);
578  ok(height == 2, "expected 2, got %u\n", height);
579 
580  hr = IWICBitmapFrameDecode_GetResolution(frame, &dpi_x, &dpi_y);
581  ok(hr == S_OK, "GetResolution error %#x\n", hr);
582  ok(dpi_x == 96.0, "expected 96.0, got %f\n", dpi_x);
583  ok(dpi_y == 96.0, "expected 96.0, got %f\n", dpi_y);
584 
585  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
586  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
587  ok(IsEqualGUID(&format, &GUID_WICPixelFormat32bppPBGRA),
588  "got wrong format %s\n", wine_dbgstr_guid(&format));
589 
590  hr = IWICImagingFactory_CreatePalette(factory, &palette);
591  ok(hr == S_OK, "CreatePalette error %#x\n", hr);
592  hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
594  "expected WINCODEC_ERR_PALETTEUNAVAILABLE, got %#x\n", hr);
595  IWICPalette_Release(palette);
596 
597  rc.X = 0;
598  rc.Y = 0;
599  rc.Width = 2;
600  rc.Height = 2;
601  hr = IWICBitmapFrameDecode_CopyPixels(frame, &rc, 8, sizeof(data), data);
602  ok(hr == S_OK, "CopyPixels error %#x\n", hr);
603 
604  for (i = 0; i < sizeof(data); i++)
605  ok(data[i] == expected_data[i], "%u: expected %02x, got %02x\n", i, expected_data[i], data[i]);
606 
607  IWICBitmapFrameDecode_Release(frame);
608 }
GLint GLint GLsizei width
Definition: gl.h:1546
HRESULT hr
Definition: shlfolder.c:183
const char * wine_dbgstr_guid(const GUID *guid)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
#define EXPECT_REF(obj, ref)
Definition: tiffformat.c:29
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
Definition: main.c:440
#define ok(value,...)
#define WINCODEC_ERR_PALETTEUNAVAILABLE
Definition: winerror.h:3284
INT Height
Definition: wincodec.idl:239
LONG HRESULT
Definition: typedefs.h:77
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: tiffformat.c:330
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
unsigned char BYTE
Definition: mem.h:68
static HPALETTE palette
Definition: clipboard.c:1345
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
#define S_OK
Definition: intsafe.h:59
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
INT Width
Definition: wincodec.idl:238

Referenced by START_TEST().

◆ test_tiff_8bpp_palette()

static void test_tiff_8bpp_palette ( void  )
static

Definition at line 640 of file tiffformat.c.

641 {
642  char buf[sizeof(tiff_8bpp_data)];
643  HRESULT hr;
644  IWICBitmapDecoder *decoder;
645  IWICBitmapFrameDecode *frame;
647  GUID format;
648  UINT count, ret;
649  WICColor color[256];
650 
652  generate_tiff_palette(buf + FIELD_OFFSET(struct tiff_8bpp_data, palette_data), 256);
653 
654  hr = create_decoder(buf, sizeof(buf), &decoder);
655  ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
656  if (hr != S_OK) return;
657 
658  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
659  ok(hr == S_OK, "GetFrame error %#x\n", hr);
660 
661  hr = IWICBitmapFrameDecode_GetPixelFormat(frame, &format);
662  ok(hr == S_OK, "GetPixelFormat error %#x\n", hr);
663  ok(IsEqualGUID(&format, &GUID_WICPixelFormat8bppIndexed),
664  "expected GUID_WICPixelFormat8bppIndexed, got %s\n", wine_dbgstr_guid(&format));
665 
666  hr = IWICImagingFactory_CreatePalette(factory, &palette);
667  ok(hr == S_OK, "CreatePalette error %#x\n", hr);
668  hr = IWICBitmapFrameDecode_CopyPalette(frame, palette);
669  ok(hr == S_OK, "CopyPalette error %#x\n", hr);
670 
671  hr = IWICPalette_GetColorCount(palette, &count);
672  ok(hr == S_OK, "GetColorCount error %#x\n", hr);
673  ok(count == 256, "expected 256, got %u\n", count);
674 
675  hr = IWICPalette_GetColors(palette, 256, color, &ret);
676  ok(hr == S_OK, "GetColors error %#x\n", hr);
677  ok(ret == count, "expected %u, got %u\n", count, ret);
678  ok(color[0] == 0xff112233, "got %#x\n", color[0]);
679  ok(color[1] == 0xff445566, "got %#x\n", color[1]);
680  ok(color[2] == 0xff778899, "got %#x\n", color[2]);
681  ok(color[3] == 0xffa1b5ff, "got %#x\n", color[3]);
682 
683  IWICPalette_Release(palette);
684  IWICBitmapFrameDecode_Release(frame);
685  IWICBitmapDecoder_Release(decoder);
686 }
HRESULT hr
Definition: shlfolder.c:183
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
static const struct tiff_8bpp_data tiff_8bpp_data
GLuint GLuint GLsizei count
Definition: gl.h:1545
const char * wine_dbgstr_guid(const GUID *guid)
GLint GLint GLsizei GLsizei GLsizei GLint GLenum format
Definition: gl.h:1546
Definition: main.c:440
GLuint color
Definition: glext.h:6243
#define ok(value,...)
static void generate_tiff_palette(void *buf, unsigned count)
Definition: tiffformat.c:610
LONG HRESULT
Definition: typedefs.h:77
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: tiffformat.c:330
int ret
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HPALETTE palette
Definition: clipboard.c:1345
#define S_OK
Definition: intsafe.h:59
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4021
UINT32 WICColor
Definition: wincodec.idl:250

Referenced by START_TEST().

◆ test_tiff_resolution()

static void test_tiff_resolution ( void  )
static

Definition at line 688 of file tiffformat.c.

689 {
690  HRESULT hr;
691  IWICBitmapDecoder *decoder;
692  IWICBitmapFrameDecode *frame;
693  double dpi_x, dpi_y;
694  int i;
695 
696  for (i = 0; i < ARRAY_SIZE(tiff_resolution_test_data); i++)
697  {
701  tiff_resolution_image_data.entry[12].value = test_data->resolution_unit;
702 
704  ok(hr == S_OK, "Failed to load TIFF image data %#x\n", hr);
705  if (hr != S_OK) return;
706 
707  hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
708  ok(hr == S_OK, "%d: GetFrame error %#x\n", i, hr);
709 
710  hr = IWICBitmapFrameDecode_GetResolution(frame, &dpi_x, &dpi_y);
711  ok(hr == S_OK, "%d: GetResolution error %#x\n", i, hr);
712 
713  if (test_data->broken_dpi_x != 0)
714  {
715  ok(fabs(dpi_x - test_data->expected_dpi_x) < 0.01 || broken(fabs(dpi_x - test_data->broken_dpi_x) < 0.01),
716  "%d: x: expected %f or %f, got %f\n", i, test_data->expected_dpi_x, test_data->broken_dpi_x, dpi_x);
717  }
718  else
719  {
720  ok(fabs(dpi_x - test_data->expected_dpi_x) < 0.01,
721  "%d: x: expected %f, got %f\n", i, test_data->expected_dpi_x, dpi_x);
722  }
723 
724  if (test_data->broken_dpi_y != 0)
725  {
726  ok(fabs(dpi_y - test_data->expected_dpi_y) < 0.01 || broken(fabs(dpi_y - test_data->broken_dpi_y) < 0.01),
727  "%d: y: expected %f or %f, got %f\n", i, test_data->expected_dpi_y, test_data->broken_dpi_y, dpi_y);
728  }
729  else
730  {
731  ok(fabs(dpi_y - test_data->expected_dpi_y) < 0.01,
732  "%d: y: expected %f, got %f\n", i, test_data->expected_dpi_y, dpi_y);
733  }
734 
735  IWICBitmapFrameDecode_Release(frame);
736  IWICBitmapDecoder_Release(decoder);
737  }
738 }
struct IFD_entry entry[13]
Definition: tiffformat.c:230
struct IFD_rational resy
Definition: tiffformat.c:233
HRESULT hr
Definition: shlfolder.c:183
struct IFD_rational resx
Definition: tiffformat.c:232
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define ok(value,...)
LONG HRESULT
Definition: typedefs.h:77
static HRESULT create_decoder(const void *image_data, UINT image_size, IWICBitmapDecoder **decoder)
Definition: tiffformat.c:330
#define broken(x)
Definition: _sntprintf.h:21
_Check_return_ _CRT_JIT_INTRINSIC double __cdecl fabs(_In_ double x)
#define S_OK
Definition: intsafe.h:59
#define ARRAY_SIZE(a)
Definition: main.h:24

Referenced by START_TEST().

◆ width_bytes()

static UINT width_bytes ( UINT  width,
UINT  bpp 
)
static

Definition at line 846 of file tiffformat.c.

847 {
848  return (width * bpp + 7) / 8;
849 }
GLint GLint GLsizei width
Definition: gl.h:1546
DWORD bpp
Definition: surface.c:181

Referenced by alpha_blend_image(), MFDRV_CreateBrushIndirect(), test_bitmap_info(), test_bitmapbits(), test_color_formats(), and test_D3DKMTCreateDCFromMemory().

Variable Documentation

◆ factory

Definition at line 307 of file tiffformat.c.

◆ tiff_1bpp_data

Initial value:
=
{
'I' | 'I' << 8,
42,
FIELD_OFFSET(struct tiff_1bpp_data, number_of_entries),
13,
{
{ 0xff, IFD_SHORT, 1, 0 },
{ 0x100, IFD_LONG, 1, 1 },
{ 0x101, IFD_LONG, 1, 1 },
{ 0x102, IFD_SHORT, 1, 1 },
{ 0x103, IFD_SHORT, 1, 1 },
{ 0x106, IFD_SHORT, 1, 1 },
{ 0x111, IFD_LONG, 1, FIELD_OFFSET(struct tiff_1bpp_data, pixel_data) },
{ 0x115, IFD_SHORT, 1, 1 },
{ 0x116, IFD_LONG, 1, 1 },
{ 0x117, IFD_LONG, 1, 1 },
{ 0x11a, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_1bpp_data, res) },
{ 0x11b, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_1bpp_data, res) },
{ 0x128, IFD_SHORT, 1, 2 },
},
0,
{ 900, 3 },
{ 0x11, 0x22, 0x33, 0 }
}
#define IFD_LONG
Definition: tiffformat.c:41
#define IFD_SHORT
Definition: tiffformat.c:40
#define IFD_RATIONAL
Definition: tiffformat.c:42
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
GLuint res
Definition: glext.h:9613

◆ tiff_1x1_data

Initial value:
=
{
'I' | 'I' << 8,
42,
FIELD_OFFSET(struct tiff_1x1_data, number_of_entries),
12,
{
{ 0xff, IFD_SHORT, 1, 0 },
{ 0x100, IFD_LONG, 1, 1 },
{ 0x101, IFD_LONG, 1, 1 },
{ 0x102, IFD_SHORT, 3, FIELD_OFFSET(struct tiff_1x1_data, bps_data) },
{ 0x103, IFD_SHORT, 1, 1 },
{ 0x106, IFD_SHORT, 1, 2 },
{ 0x111, IFD_LONG, 1, FIELD_OFFSET(struct tiff_1x1_data, pixel_data) },
{ 0x115, IFD_SHORT, 1, 3 },
{ 0x11a, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_1x1_data, res) },
{ 0x11b, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_1x1_data, res) },
{ 0x128, IFD_SHORT, 1, 2 },
{ 0x140, IFD_SHORT, 256*3, FIELD_OFFSET(struct tiff_1x1_data, palette_data) }
},
0,
{ 96, 1 },
{ { 0 } },
{ 8,8,8,0 },
{ 1,0,2,3,4,5,6,7,8,9,0,1,2,3,4,5 }
}
#define IFD_LONG
Definition: tiffformat.c:41
#define IFD_SHORT
Definition: tiffformat.c:40
#define IFD_RATIONAL
Definition: tiffformat.c:42
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
GLuint res
Definition: glext.h:9613

Referenced by test_color_formats().

◆ tiff_24bpp_data

Initial value:
=
{
'I' | 'I' << 8,
42,
FIELD_OFFSET(struct tiff_1bpp_data, number_of_entries),
13,
{
{ 0xff, IFD_SHORT, 1, 0 },
{ 0x100, IFD_LONG, 1, 1 },
{ 0x101, IFD_LONG, 1, 1 },
{ 0x102, IFD_SHORT, 1, 8 },
{ 0x103, IFD_SHORT, 1, 1 },
{ 0x106, IFD_SHORT, 1, 2 },
{ 0x111, IFD_LONG, 1, FIELD_OFFSET(struct tiff_24bpp_data, pixel_data) },
{ 0x115, IFD_SHORT, 1, 3 },
{ 0x116, IFD_LONG, 1, 1 },
{ 0x117, IFD_LONG, 1, 3 },
{ 0x11a, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_24bpp_data, res) },
{ 0x11b, IFD_RATIONAL, 1, FIELD_OFFSET(struct tiff_24bpp_data, res) },
{ 0x128, IFD_SHORT, 1, 2 },
},
0,
{ 900, 3 },
{ 0x11, 0x22, 0x33 }
}
#define IFD_LONG
Definition: tiffformat.c:41
#define IFD_SHORT
Definition: tiffformat.c:40
#define IFD_RATIONAL
Definition: tiffformat.c:42
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
GLuint res
Definition: glext.h:9613

◆ tiff_8bpp_alpha

◆ tiff_8bpp_data

◆ tiff_resolution_image_data

Initial value:
=
{
'I' | 'I' << 8,
42,
FIELD_OFFSET(struct tiff_resolution_image_data, number_of_entries),
13,
{
{ 0xff, IFD_SHORT, 1, 0 },
{ 0x100, IFD_LONG, 1, 1 },
{ 0x101, IFD_LONG, 1, 1 },
{ 0x102, IFD_SHORT, 1, 1 },
{ 0x103, IFD_SHORT, 1, 1 },
{ 0x106, IFD_SHORT, 1, 1 },
{ 0x111, IFD_LONG, 1, FIELD_OFFSET(struct tiff_resolution_image_data, pixel_data) },
{ 0x115, IFD_SHORT, 1, 1 },
{ 0x116, IFD_LONG, 1, 1 },
{ 0x117, IFD_LONG, 1, 1 },
{ 0x128, IFD_SHORT, 1, 1 },
},
0,
{ 72, 1 },
{ 72, 1 },
{ 0x11, 0x22, 0x33, 0 }
}
struct IFD_rational resy
Definition: tiffformat.c:194
#define IFD_LONG
Definition: tiffformat.c:41
#define IFD_SHORT
Definition: tiffformat.c:40
#define IFD_RATIONAL
Definition: tiffformat.c:42
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
struct IFD_rational resx
Definition: tiffformat.c:193

◆ tiff_resolution_test_data

Initial value:
=
{
{ { 100, 1 }, { 50, 1 }, 0, 100.0, 50.0, 0, 0 },
{ { 50, 1 }, { 100, 1 }, 0, 50.0, 100.0, 0, 0 },
{ { 100, 1 }, { 50, 1 }, 1, 100.0, 50.0, 0, 0 },
{ { 50, 1 }, { 100, 1 }, 1, 50.0, 100.0, 0, 0 },
{ { 49, 1 }, { 49, 1 }, 2, 49.0, 49.0, 0, 0 },
{ { 33, 1 }, { 55, 1 }, 2, 33.0, 55.0, 0, 0 },
{ { 50, 2 }, { 66, 3 }, 2, 25.0, 22.0, 0, 0 },
{ { 100, 1 }, { 200, 1 }, 3, 254.0, 508.0, 0, 0 },
{ { 0, 1 }, { 29, 1 }, 2, 96.0, 96.0, 0, 29.0 },
{ { 58, 1 }, { 29, 0 }, 2, 96.0, 96.0, 58.0, 0 },
{ { 0, 1 }, { 100, 1 }, 3, 96.0, 96.0, 243.84, 254.0 },
{ { 50, 1 }, { 72, 0 }, 3, 96.0, 96.0, 127.0, 243.84 }
}