ReactOS  0.4.15-dev-1197-g8081ba9
colorcontext.c
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Hans Leidekker for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #include "config.h"
20 
21 #include <stdarg.h>
22 
23 #define COBJMACROS
24 
25 #include "windef.h"
26 #include "winbase.h"
27 #include "objbase.h"
28 
29 #include "wincodecs_private.h"
30 
31 #include "wine/debug.h"
32 
34 
35 typedef struct ColorContext {
42 } ColorContext;
43 
45 {
46  return CONTAINING_RECORD(iface, ColorContext, IWICColorContext_iface);
47 }
48 
50  void **ppv)
51 {
53  TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
54 
55  if (!ppv) return E_INVALIDARG;
56 
57  if (IsEqualIID(&IID_IUnknown, iid) ||
58  IsEqualIID(&IID_IWICColorContext, iid))
59  {
60  *ppv = &This->IWICColorContext_iface;
61  }
62  else
63  {
64  *ppv = NULL;
65  return E_NOINTERFACE;
66  }
67 
68  IUnknown_AddRef((IUnknown*)*ppv);
69  return S_OK;
70 }
71 
73 {
76 
77  TRACE("(%p) refcount=%u\n", iface, ref);
78 
79  return ref;
80 }
81 
83 {
86 
87  TRACE("(%p) refcount=%u\n", iface, ref);
88 
89  if (ref == 0)
90  {
91  HeapFree(GetProcessHeap(), 0, This->profile);
93  }
94 
95  return ref;
96 }
97 
99 {
100  HANDLE handle;
101  DWORD count;
103  BOOL ret;
104 
105  *len = 0;
106  *profile = NULL;
109 
110  if (!(GetFileSizeEx(handle, &size)))
111  {
114  }
115  if (size.u.HighPart)
116  {
117  WARN("file too large\n");
119  return E_FAIL;
120  }
121  if (!(*profile = HeapAlloc(GetProcessHeap(), 0, size.u.LowPart)))
122  {
124  return E_OUTOFMEMORY;
125  }
126  ret = ReadFile(handle, *profile, size.u.LowPart, &count, NULL);
128  if (!ret) {
130  *profile = NULL;
132  }
133  if (count != size.u.LowPart) {
135  *profile = NULL;
136  return E_FAIL;
137  }
138  *len = count;
139  return S_OK;
140 }
141 
143  LPCWSTR wzFilename)
144 {
146  BYTE *profile;
147  UINT len;
148  HRESULT hr;
149  TRACE("(%p,%s)\n", iface, debugstr_w(wzFilename));
150 
153 
154  if (!wzFilename) return E_INVALIDARG;
155 
156  hr = load_profile(wzFilename, &profile, &len);
157  if (FAILED(hr)) return hr;
158 
159  HeapFree(GetProcessHeap(), 0, This->profile);
160  This->profile = profile;
161  This->profile_len = len;
163 
164  return S_OK;
165 }
166 
168  const BYTE *pbBuffer, UINT cbBufferSize)
169 {
171  BYTE *profile;
172  TRACE("(%p,%p,%u)\n", iface, pbBuffer, cbBufferSize);
173 
176 
177  if (!(profile = HeapAlloc(GetProcessHeap(), 0, cbBufferSize))) return E_OUTOFMEMORY;
178  memcpy(profile, pbBuffer, cbBufferSize);
179 
180  HeapFree(GetProcessHeap(), 0, This->profile);
181  This->profile = profile;
182  This->profile_len = cbBufferSize;
184 
185  return S_OK;
186 }
187 
189  UINT value)
190 {
192  TRACE("(%p,%u)\n", iface, value);
193 
196 
197  This->exif_color_space = value;
199 
200  return S_OK;
201 }
202 
204  WICColorContextType *pType)
205 {
207  TRACE("(%p,%p)\n", iface, pType);
208 
209  if (!pType) return E_INVALIDARG;
210 
211  *pType = This->type;
212  return S_OK;
213 }
214 
216  UINT cbBuffer, BYTE *pbBuffer, UINT *pcbActual)
217 {
219  TRACE("(%p,%u,%p,%p)\n", iface, cbBuffer, pbBuffer, pcbActual);
220 
221  if (This->type != WICColorContextProfile)
223 
224  if (!pcbActual) return E_INVALIDARG;
225 
226  if (cbBuffer >= This->profile_len && pbBuffer)
227  memcpy(pbBuffer, This->profile, This->profile_len);
228 
229  *pcbActual = This->profile_len;
230 
231  return S_OK;
232 }
233 
235  UINT *pValue)
236 {
238  TRACE("(%p,%p)\n", iface, pValue);
239 
240  if (!pValue) return E_INVALIDARG;
241 
242  *pValue = This->exif_color_space;
243  return S_OK;
244 }
245 
246 static const IWICColorContextVtbl ColorContext_Vtbl = {
256 };
257 
259 {
261 
262  if (!colorcontext) return E_INVALIDARG;
263 
264  This = HeapAlloc(GetProcessHeap(), 0, sizeof(ColorContext));
265  if (!This) return E_OUTOFMEMORY;
266 
267  This->IWICColorContext_iface.lpVtbl = &ColorContext_Vtbl;
268  This->ref = 1;
269  This->type = 0;
270  This->profile = NULL;
271  This->profile_len = 0;
272  This->exif_color_space = ~0u;
273 
274  *colorcontext = &This->IWICColorContext_iface;
275 
276  return S_OK;
277 }
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 * u
Definition: glfuncs.h:240
static ULONG WINAPI ColorContext_AddRef(IWICColorContext *iface)
Definition: colorcontext.c:72
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
Definition: sock.c:82
#define REFIID
Definition: guiddef.h:118
#define CloseHandle
Definition: compat.h:487
#define E_NOINTERFACE
Definition: winerror.h:2364
static ULONG WINAPI ColorContext_Release(IWICColorContext *iface)
Definition: colorcontext.c:82
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
HRESULT hr
Definition: shlfolder.c:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
static HRESULT WINAPI ColorContext_InitializeFromFilename(IWICColorContext *iface, LPCWSTR wzFilename)
Definition: colorcontext.c:142
GLuint GLuint GLsizei count
Definition: gl.h:1545
static HRESULT load_profile(const WCHAR *filename, BYTE **profile, UINT *len)
Definition: colorcontext.c:98
#define WARN(fmt,...)
Definition: debug.h:112
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define INVALID_HANDLE_VALUE
Definition: compat.h:479
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1044
#define WINCODEC_ERR_NOTINITIALIZED
Definition: winerror.h:3277
const char * filename
Definition: ioapi.h:135
#define E_FAIL
Definition: ddrawi.h:102
static HRESULT WINAPI ColorContext_InitializeFromMemory(IWICColorContext *iface, const BYTE *pbBuffer, UINT cbBufferSize)
Definition: colorcontext.c:167
Definition: send.c:48
HRESULT ColorContext_Create(IWICColorContext **colorcontext)
Definition: colorcontext.c:258
WICColorContextType
Definition: wincodec.idl:118
UINT profile_len
Definition: colorcontext.c:40
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
#define debugstr_guid
Definition: kernel32.h:35
#define OPEN_EXISTING
Definition: compat.h:523
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
static HRESULT WINAPI ColorContext_QueryInterface(IWICColorContext *iface, REFIID iid, void **ppv)
Definition: colorcontext.c:49
static HRESULT WINAPI ColorContext_GetType(IWICColorContext *iface, WICColorContextType *pType)
Definition: colorcontext.c:203
#define TRACE(s)
Definition: solgame.cpp:4
static HRESULT WINAPI ColorContext_GetExifColorSpace(IWICColorContext *iface, UINT *pValue)
Definition: colorcontext.c:234
GLsizeiptr size
Definition: glext.h:5919
#define GetProcessHeap()
Definition: compat.h:484
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
const GUID IID_IUnknown
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
#define GetFileSizeEx
Definition: compat.h:505
int ret
#define InterlockedDecrement
Definition: armddk.h:52
static HRESULT WINAPI ColorContext_InitializeFromExifColorSpace(IWICColorContext *iface, UINT value)
Definition: colorcontext.c:188
struct ColorContext ColorContext
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
#define GENERIC_READ
Definition: compat.h:135
static const IWICColorContextVtbl ColorContext_Vtbl
Definition: colorcontext.c:246
UINT exif_color_space
Definition: colorcontext.c:41
GLsizei const GLfloat * value
Definition: glext.h:6069
unsigned char BYTE
Definition: xxhash.c:193
static ColorContext * impl_from_IWICColorContext(IWICColorContext *iface)
Definition: colorcontext.c:44
WICColorContextType type
Definition: colorcontext.c:38
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3273
#define S_OK
Definition: intsafe.h:51
#define InterlockedIncrement
Definition: armddk.h:53
BYTE * profile
Definition: colorcontext.c:39
#define ReadFile(a, b, c, d, e)
Definition: compat.h:490
unsigned int UINT
Definition: ndis.h:50
WINE_DEFAULT_DEBUG_CHANNEL(wincodecs)
#define CreateFileW
Definition: compat.h:489
unsigned int ULONG
Definition: retypes.h:1
#define profile
Definition: kernel32.h:12
IWICColorContext IWICColorContext_iface
Definition: colorcontext.c:36
#define HeapFree(x, y, z)
Definition: compat.h:483
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
static HRESULT WINAPI ColorContext_GetProfileBytes(IWICColorContext *iface, UINT cbBuffer, BYTE *pbBuffer, UINT *pcbActual)
Definition: colorcontext.c:215