ReactOS 0.4.16-dev-819-g75c0dc0
bmpencode.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winreg.h"
#include "wingdi.h"
#include "objbase.h"
#include "wincodecs_private.h"
#include "wine/debug.h"
Include dependency graph for bmpencode.c:

Go to the source code of this file.

Classes

struct  bmp_pixelformat
 
struct  BmpFrameEncode
 
struct  BmpEncoder
 

Macros

#define COBJMACROS
 

Typedefs

typedef struct BmpFrameEncode BmpFrameEncode
 
typedef struct BmpEncoder BmpEncoder
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (wincodecs)
 
static BmpFrameEncodeimpl_from_IWICBitmapFrameEncode (IWICBitmapFrameEncode *iface)
 
static HRESULT WINAPI BmpFrameEncode_QueryInterface (IWICBitmapFrameEncode *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI BmpFrameEncode_AddRef (IWICBitmapFrameEncode *iface)
 
static ULONG WINAPI BmpFrameEncode_Release (IWICBitmapFrameEncode *iface)
 
static HRESULT WINAPI BmpFrameEncode_Initialize (IWICBitmapFrameEncode *iface, IPropertyBag2 *pIEncoderOptions)
 
static HRESULT WINAPI BmpFrameEncode_SetSize (IWICBitmapFrameEncode *iface, UINT uiWidth, UINT uiHeight)
 
static HRESULT WINAPI BmpFrameEncode_SetResolution (IWICBitmapFrameEncode *iface, double dpiX, double dpiY)
 
static HRESULT WINAPI BmpFrameEncode_SetPixelFormat (IWICBitmapFrameEncode *iface, WICPixelFormatGUID *pPixelFormat)
 
static HRESULT WINAPI BmpFrameEncode_SetColorContexts (IWICBitmapFrameEncode *iface, UINT cCount, IWICColorContext **ppIColorContext)
 
static HRESULT WINAPI BmpFrameEncode_SetPalette (IWICBitmapFrameEncode *iface, IWICPalette *palette)
 
static HRESULT WINAPI BmpFrameEncode_SetThumbnail (IWICBitmapFrameEncode *iface, IWICBitmapSource *pIThumbnail)
 
static HRESULT BmpFrameEncode_AllocateBits (BmpFrameEncode *This)
 
static HRESULT WINAPI BmpFrameEncode_WritePixels (IWICBitmapFrameEncode *iface, UINT lineCount, UINT cbStride, UINT cbBufferSize, BYTE *pbPixels)
 
static HRESULT WINAPI BmpFrameEncode_WriteSource (IWICBitmapFrameEncode *iface, IWICBitmapSource *pIBitmapSource, WICRect *prc)
 
static HRESULT WINAPI BmpFrameEncode_Commit (IWICBitmapFrameEncode *iface)
 
static HRESULT WINAPI BmpFrameEncode_GetMetadataQueryWriter (IWICBitmapFrameEncode *iface, IWICMetadataQueryWriter **query_writer)
 
static BmpEncoderimpl_from_IWICBitmapEncoder (IWICBitmapEncoder *iface)
 
static HRESULT WINAPI BmpEncoder_QueryInterface (IWICBitmapEncoder *iface, REFIID iid, void **ppv)
 
static ULONG WINAPI BmpEncoder_AddRef (IWICBitmapEncoder *iface)
 
static ULONG WINAPI BmpEncoder_Release (IWICBitmapEncoder *iface)
 
static HRESULT WINAPI BmpEncoder_Initialize (IWICBitmapEncoder *iface, IStream *pIStream, WICBitmapEncoderCacheOption cacheOption)
 
static HRESULT WINAPI BmpEncoder_GetContainerFormat (IWICBitmapEncoder *iface, GUID *pguidContainerFormat)
 
static HRESULT WINAPI BmpEncoder_GetEncoderInfo (IWICBitmapEncoder *iface, IWICBitmapEncoderInfo **info)
 
static HRESULT WINAPI BmpEncoder_SetColorContexts (IWICBitmapEncoder *iface, UINT cCount, IWICColorContext **ppIColorContext)
 
static HRESULT WINAPI BmpEncoder_SetPalette (IWICBitmapEncoder *iface, IWICPalette *palette)
 
static HRESULT WINAPI BmpEncoder_SetThumbnail (IWICBitmapEncoder *iface, IWICBitmapSource *pIThumbnail)
 
static HRESULT WINAPI BmpEncoder_SetPreview (IWICBitmapEncoder *iface, IWICBitmapSource *pIPreview)
 
static HRESULT WINAPI BmpEncoder_CreateNewFrame (IWICBitmapEncoder *iface, IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions)
 
static HRESULT WINAPI BmpEncoder_Commit (IWICBitmapEncoder *iface)
 
static HRESULT WINAPI BmpEncoder_GetMetadataQueryWriter (IWICBitmapEncoder *iface, IWICMetadataQueryWriter **ppIMetadataQueryWriter)
 
HRESULT BmpEncoder_CreateInstance (REFIID iid, void **ppv)
 

Variables

static const struct bmp_pixelformat formats []
 
static const IWICBitmapFrameEncodeVtbl BmpFrameEncode_Vtbl
 
static const IWICBitmapEncoderVtbl BmpEncoder_Vtbl
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 22 of file bmpencode.c.

Typedef Documentation

◆ BmpEncoder

◆ BmpFrameEncode

Function Documentation

◆ BmpEncoder_AddRef()

static ULONG WINAPI BmpEncoder_AddRef ( IWICBitmapEncoder iface)
static

Definition at line 461 of file bmpencode.c.

462{
465
466 TRACE("(%p) refcount=%lu\n", iface, ref);
467
468 return ref;
469}
#define InterlockedIncrement
Definition: armddk.h:53
static BmpEncoder * impl_from_IWICBitmapEncoder(IWICBitmapEncoder *iface)
Definition: bmpencode.c:433
#define TRACE(s)
Definition: solgame.cpp:4
Definition: send.c:48
uint32_t ULONG
Definition: typedefs.h:59

◆ BmpEncoder_Commit()

static HRESULT WINAPI BmpEncoder_Commit ( IWICBitmapEncoder iface)
static

Definition at line 609 of file bmpencode.c.

610{
612 TRACE("(%p)\n", iface);
613
614 if (!This->frame || !This->frame->committed) return WINCODEC_ERR_WRONGSTATE;
615
616 return S_OK;
617}
#define S_OK
Definition: intsafe.h:52
#define WINCODEC_ERR_WRONGSTATE
Definition: winerror.h:3281

◆ BmpEncoder_CreateInstance()

HRESULT BmpEncoder_CreateInstance ( REFIID  iid,
void **  ppv 
)

Definition at line 642 of file bmpencode.c.

643{
645 HRESULT ret;
646
647 TRACE("(%s,%p)\n", debugstr_guid(iid), ppv);
648
649 *ppv = NULL;
650
651 This = malloc(sizeof(BmpEncoder));
652 if (!This) return E_OUTOFMEMORY;
653
654 This->IWICBitmapEncoder_iface.lpVtbl = &BmpEncoder_Vtbl;
655 This->ref = 1;
656 This->stream = NULL;
657 This->frame = NULL;
658
659 ret = IWICBitmapEncoder_QueryInterface(&This->IWICBitmapEncoder_iface, iid, ppv);
660 IWICBitmapEncoder_Release(&This->IWICBitmapEncoder_iface);
661
662 return ret;
663}
static const IWICBitmapEncoderVtbl BmpEncoder_Vtbl
Definition: bmpencode.c:626
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define malloc
Definition: debug_ros.c:4
#define NULL
Definition: types.h:112
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
int ret

◆ BmpEncoder_CreateNewFrame()

static HRESULT WINAPI BmpEncoder_CreateNewFrame ( IWICBitmapEncoder iface,
IWICBitmapFrameEncode **  ppIFrameEncode,
IPropertyBag2 **  ppIEncoderOptions 
)
static

Definition at line 558 of file bmpencode.c.

560{
562 BmpFrameEncode *encode;
563 HRESULT hr;
564 static const PROPBAG2 opts[1] =
565 {
566 { PROPBAG2_TYPE_DATA, VT_BOOL, 0, 0, (LPOLESTR)L"EnableV5Header32bppBGRA" },
567 };
568
569 TRACE("(%p,%p,%p)\n", iface, ppIFrameEncode, ppIEncoderOptions);
570
571 if (This->frame) return WINCODEC_ERR_UNSUPPORTEDOPERATION;
572
573 if (!This->stream) return WINCODEC_ERR_NOTINITIALIZED;
574
575 if (ppIEncoderOptions)
576 {
577 hr = CreatePropertyBag2(opts, ARRAY_SIZE(opts), ppIEncoderOptions);
578 if (FAILED(hr)) return hr;
579 }
580
581 encode = malloc(sizeof(BmpFrameEncode));
582 if (!encode)
583 {
584 IPropertyBag2_Release(*ppIEncoderOptions);
585 *ppIEncoderOptions = NULL;
586 return E_OUTOFMEMORY;
587 }
589 encode->ref = 2;
590 IStream_AddRef(This->stream);
591 encode->stream = This->stream;
592 encode->initialized = FALSE;
593 encode->width = 0;
594 encode->height = 0;
595 encode->bits = NULL;
596 encode->format = NULL;
597 encode->xres = 0.0;
598 encode->yres = 0.0;
599 encode->lineswritten = 0;
600 encode->colors = 0;
601 encode->committed = FALSE;
602
603 *ppIFrameEncode = &encode->IWICBitmapFrameEncode_iface;
604 This->frame = encode;
605
606 return S_OK;
607}
#define ARRAY_SIZE(A)
Definition: main.h:20
static const IWICBitmapFrameEncodeVtbl BmpFrameEncode_Vtbl
Definition: bmpencode.c:409
#define FALSE
Definition: types.h:117
@ VT_BOOL
Definition: compat.h:2306
HRESULT CreatePropertyBag2(const PROPBAG2 *options, UINT count, IPropertyBag2 **ppPropertyBag2)
Definition: propertybag.c:278
#define FAILED(hr)
Definition: intsafe.h:51
static LPOLESTR
Definition: stg_prop.c:27
#define L(x)
Definition: ntvdm.h:50
HRESULT hr
Definition: shlfolder.c:183
UINT lineswritten
Definition: bmpencode.c:70
BOOL committed
Definition: bmpencode.c:74
BOOL initialized
Definition: bmpencode.c:65
const struct bmp_pixelformat * format
Definition: bmpencode.c:68
double yres
Definition: bmpencode.c:69
BYTE * bits
Definition: bmpencode.c:67
IStream * stream
Definition: bmpencode.c:64
IWICBitmapFrameEncode IWICBitmapFrameEncode_iface
Definition: bmpencode.c:62
double xres
Definition: bmpencode.c:69
#define WINCODEC_ERR_UNSUPPORTEDOPERATION
Definition: winerror.h:3308
#define WINCODEC_ERR_NOTINITIALIZED
Definition: winerror.h:3285

◆ BmpEncoder_GetContainerFormat()

static HRESULT WINAPI BmpEncoder_GetContainerFormat ( IWICBitmapEncoder iface,
GUID pguidContainerFormat 
)
static

Definition at line 501 of file bmpencode.c.

503{
504 TRACE("(%p,%p)\n", iface, pguidContainerFormat);
505
506 if (!pguidContainerFormat)
507 return E_INVALIDARG;
508
509 memcpy(pguidContainerFormat, &GUID_ContainerFormatBmp, sizeof(GUID));
510 return S_OK;
511}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ BmpEncoder_GetEncoderInfo()

static HRESULT WINAPI BmpEncoder_GetEncoderInfo ( IWICBitmapEncoder iface,
IWICBitmapEncoderInfo **  info 
)
static

Definition at line 513 of file bmpencode.c.

514{
515 IWICComponentInfo *comp_info;
516 HRESULT hr;
517
518 TRACE("%p,%p\n", iface, info);
519
520 if (!info) return E_INVALIDARG;
521
522 hr = CreateComponentInfo(&CLSID_WICBmpEncoder, &comp_info);
523 if (hr == S_OK)
524 {
525 hr = IWICComponentInfo_QueryInterface(comp_info, &IID_IWICBitmapEncoderInfo, (void **)info);
526 IWICComponentInfo_Release(comp_info);
527 }
528 return hr;
529}
HRESULT CreateComponentInfo(REFCLSID clsid, IWICComponentInfo **ppIInfo)
Definition: info.c:2030

◆ BmpEncoder_GetMetadataQueryWriter()

static HRESULT WINAPI BmpEncoder_GetMetadataQueryWriter ( IWICBitmapEncoder iface,
IWICMetadataQueryWriter **  ppIMetadataQueryWriter 
)
static

Definition at line 619 of file bmpencode.c.

621{
622 FIXME("(%p,%p): stub\n", iface, ppIMetadataQueryWriter);
623 return E_NOTIMPL;
624}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ BmpEncoder_Initialize()

static HRESULT WINAPI BmpEncoder_Initialize ( IWICBitmapEncoder iface,
IStream pIStream,
WICBitmapEncoderCacheOption  cacheOption 
)
static

Definition at line 488 of file bmpencode.c.

490{
492
493 TRACE("(%p,%p,%u)\n", iface, pIStream, cacheOption);
494
495 IStream_AddRef(pIStream);
496 This->stream = pIStream;
497
498 return S_OK;
499}

◆ BmpEncoder_QueryInterface()

static HRESULT WINAPI BmpEncoder_QueryInterface ( IWICBitmapEncoder iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 438 of file bmpencode.c.

440{
442 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
443
444 if (!ppv) return E_INVALIDARG;
445
446 if (IsEqualIID(&IID_IUnknown, iid) ||
447 IsEqualIID(&IID_IWICBitmapEncoder, iid))
448 {
449 *ppv = &This->IWICBitmapEncoder_iface;
450 }
451 else
452 {
453 *ppv = NULL;
454 return E_NOINTERFACE;
455 }
456
457 IUnknown_AddRef((IUnknown*)*ppv);
458 return S_OK;
459}
const GUID IID_IUnknown
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ BmpEncoder_Release()

static ULONG WINAPI BmpEncoder_Release ( IWICBitmapEncoder iface)
static

Definition at line 471 of file bmpencode.c.

472{
475
476 TRACE("(%p) refcount=%lu\n", iface, ref);
477
478 if (ref == 0)
479 {
480 if (This->stream) IStream_Release(This->stream);
481 if (This->frame) IWICBitmapFrameEncode_Release(&This->frame->IWICBitmapFrameEncode_iface);
482 free(This);
483 }
484
485 return ref;
486}
#define InterlockedDecrement
Definition: armddk.h:52
#define free
Definition: debug_ros.c:5

◆ BmpEncoder_SetColorContexts()

static HRESULT WINAPI BmpEncoder_SetColorContexts ( IWICBitmapEncoder iface,
UINT  cCount,
IWICColorContext **  ppIColorContext 
)
static

Definition at line 531 of file bmpencode.c.

533{
534 FIXME("(%p,%u,%p): stub\n", iface, cCount, ppIColorContext);
535 return E_NOTIMPL;
536}

◆ BmpEncoder_SetPalette()

static HRESULT WINAPI BmpEncoder_SetPalette ( IWICBitmapEncoder iface,
IWICPalette palette 
)
static

Definition at line 538 of file bmpencode.c.

539{
541
542 TRACE("(%p,%p)\n", iface, palette);
544}
static HPALETTE palette
Definition: clipboard.c:1345

◆ BmpEncoder_SetPreview()

static HRESULT WINAPI BmpEncoder_SetPreview ( IWICBitmapEncoder iface,
IWICBitmapSource pIPreview 
)
static

Definition at line 552 of file bmpencode.c.

553{
554 TRACE("(%p,%p)\n", iface, pIPreview);
556}

◆ BmpEncoder_SetThumbnail()

static HRESULT WINAPI BmpEncoder_SetThumbnail ( IWICBitmapEncoder iface,
IWICBitmapSource pIThumbnail 
)
static

Definition at line 546 of file bmpencode.c.

547{
548 TRACE("(%p,%p)\n", iface, pIThumbnail);
550}

◆ BmpFrameEncode_AddRef()

static ULONG WINAPI BmpFrameEncode_AddRef ( IWICBitmapFrameEncode iface)
static

Definition at line 105 of file bmpencode.c.

106{
109
110 TRACE("(%p) refcount=%lu\n", iface, ref);
111
112 return ref;
113}
static BmpFrameEncode * impl_from_IWICBitmapFrameEncode(IWICBitmapFrameEncode *iface)
Definition: bmpencode.c:77

◆ BmpFrameEncode_AllocateBits()

static HRESULT BmpFrameEncode_AllocateBits ( BmpFrameEncode This)
static

Definition at line 241 of file bmpencode.c.

242{
243 if (!This->bits)
244 {
245 if (!This->initialized || !This->width || !This->height || !This->format)
247
248 This->stride = (((This->width * This->format->bpp)+31)/32)*4;
249 This->bits = calloc(This->stride, This->height);
250 if (!This->bits) return E_OUTOFMEMORY;
251 }
252
253 return S_OK;
254}
#define calloc
Definition: rosglue.h:14

Referenced by BmpFrameEncode_WritePixels().

◆ BmpFrameEncode_Commit()

static HRESULT WINAPI BmpFrameEncode_Commit ( IWICBitmapFrameEncode iface)
static

Definition at line 319 of file bmpencode.c.

320{
323 BITMAPV5HEADER bih;
324 UINT info_size;
326 ULONG byteswritten;
327 HRESULT hr;
328
329 TRACE("(%p)\n", iface);
330
331 if (!This->bits || This->committed || This->height != This->lineswritten)
333
334 bfh.bfType = 0x4d42; /* "BM" */
335 bfh.bfReserved1 = 0;
336 bfh.bfReserved2 = 0;
337
338 bih.bV5Size = info_size = sizeof(BITMAPINFOHEADER);
339 bih.bV5Width = This->width;
340 bih.bV5Height = This->height;
341 bih.bV5Planes = 1;
342 bih.bV5BitCount = This->format->bpp;
343 bih.bV5Compression = This->format->compression;
344 bih.bV5SizeImage = This->stride*This->height;
345 bih.bV5XPelsPerMeter = (This->xres+0.0127) / 0.0254;
346 bih.bV5YPelsPerMeter = (This->yres+0.0127) / 0.0254;
347 bih.bV5ClrUsed = (This->format->bpp <= 8) ? This->colors : 0;
348 bih.bV5ClrImportant = bih.bV5ClrUsed;
349
350 if (This->format->compression == BI_BITFIELDS)
351 {
352 if (This->format->alphamask)
353 bih.bV5Size = info_size = sizeof(BITMAPV4HEADER);
354 else
355 info_size = sizeof(BITMAPINFOHEADER)+12;
356 bih.bV5RedMask = This->format->redmask;
357 bih.bV5GreenMask = This->format->greenmask;
358 bih.bV5BlueMask = This->format->bluemask;
359 bih.bV5AlphaMask = This->format->alphamask;
360 bih.bV5CSType = LCS_DEVICE_RGB;
361 }
362
363 bfh.bfSize = sizeof(BITMAPFILEHEADER) + info_size + bih.bV5SizeImage;
364 bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + info_size;
365 bfh.bfOffBits += bih.bV5ClrUsed * sizeof(WICColor);
366
367 pos.QuadPart = 0;
368 hr = IStream_Seek(This->stream, pos, STREAM_SEEK_SET, NULL);
369 if (FAILED(hr)) return hr;
370
371 hr = IStream_Write(This->stream, &bfh, sizeof(BITMAPFILEHEADER), &byteswritten);
372 if (FAILED(hr)) return hr;
373 if (byteswritten != sizeof(BITMAPFILEHEADER)) return E_FAIL;
374
375 hr = IStream_Write(This->stream, &bih, info_size, &byteswritten);
376 if (FAILED(hr)) return hr;
377 if (byteswritten != info_size) return E_FAIL;
378
379 /* write the palette */
380 if (This->format->colors)
381 {
382 hr = IStream_Write(This->stream, This->palette, This->colors * sizeof(WICColor), &byteswritten);
383 if (FAILED(hr)) return hr;
384 if (byteswritten != This->colors * sizeof(WICColor)) return E_FAIL;
385 }
386
387 hr = IStream_Write(This->stream, This->bits, bih.bV5SizeImage, &byteswritten);
388 if (FAILED(hr)) return hr;
389 if (byteswritten != bih.bV5SizeImage) return E_FAIL;
390
391 This->committed = TRUE;
392
393 return S_OK;
394}
#define E_FAIL
Definition: ddrawi.h:102
#define TRUE
Definition: types.h:120
if(dx< 0)
Definition: linetemp.h:194
#define BI_BITFIELDS
Definition: mmreg.h:507
unsigned int UINT
Definition: ndis.h:50
UINT32 WICColor
Definition: wincodec.idl:364
struct tagBITMAPFILEHEADER BITMAPFILEHEADER
#define LCS_DEVICE_RGB
Definition: wingdi.h:1098

◆ BmpFrameEncode_GetMetadataQueryWriter()

static HRESULT WINAPI BmpFrameEncode_GetMetadataQueryWriter ( IWICBitmapFrameEncode iface,
IWICMetadataQueryWriter **  query_writer 
)
static

Definition at line 396 of file bmpencode.c.

398{
400
401 TRACE("iface %p, query_writer %p.\n", iface, query_writer);
402
403 if (!encoder->initialized)
405
407}

◆ BmpFrameEncode_Initialize()

static HRESULT WINAPI BmpFrameEncode_Initialize ( IWICBitmapFrameEncode iface,
IPropertyBag2 pIEncoderOptions 
)
static

Definition at line 132 of file bmpencode.c.

134{
136 TRACE("(%p,%p)\n", iface, pIEncoderOptions);
137
138 if (This->initialized) return WINCODEC_ERR_WRONGSTATE;
139
140 if (pIEncoderOptions)
141 WARN("ignoring encoder options.\n");
142
143 This->initialized = TRUE;
144
145 return S_OK;
146}
#define WARN(fmt,...)
Definition: precomp.h:61

◆ BmpFrameEncode_QueryInterface()

static HRESULT WINAPI BmpFrameEncode_QueryInterface ( IWICBitmapFrameEncode iface,
REFIID  iid,
void **  ppv 
)
static

Definition at line 82 of file bmpencode.c.

84{
86 TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
87
88 if (!ppv) return E_INVALIDARG;
89
90 if (IsEqualIID(&IID_IUnknown, iid) ||
91 IsEqualIID(&IID_IWICBitmapFrameEncode, iid))
92 {
93 *ppv = &This->IWICBitmapFrameEncode_iface;
94 }
95 else
96 {
97 *ppv = NULL;
98 return E_NOINTERFACE;
99 }
100
101 IUnknown_AddRef((IUnknown*)*ppv);
102 return S_OK;
103}

◆ BmpFrameEncode_Release()

static ULONG WINAPI BmpFrameEncode_Release ( IWICBitmapFrameEncode iface)
static

Definition at line 115 of file bmpencode.c.

116{
119
120 TRACE("(%p) refcount=%lu\n", iface, ref);
121
122 if (ref == 0)
123 {
124 if (This->stream) IStream_Release(This->stream);
125 free(This->bits);
126 free(This);
127 }
128
129 return ref;
130}

◆ BmpFrameEncode_SetColorContexts()

static HRESULT WINAPI BmpFrameEncode_SetColorContexts ( IWICBitmapFrameEncode iface,
UINT  cCount,
IWICColorContext **  ppIColorContext 
)
static

Definition at line 204 of file bmpencode.c.

206{
207 FIXME("(%p,%u,%p): stub\n", iface, cCount, ppIColorContext);
208 return E_NOTIMPL;
209}

◆ BmpFrameEncode_SetPalette()

static HRESULT WINAPI BmpFrameEncode_SetPalette ( IWICBitmapFrameEncode iface,
IWICPalette palette 
)
static

Definition at line 211 of file bmpencode.c.

213{
215 HRESULT hr;
216
217 TRACE("(%p,%p)\n", iface, palette);
218
219 if (!palette) return E_INVALIDARG;
220
221 if (!This->initialized)
223
224 hr = IWICPalette_GetColors(palette, 256, This->palette, &This->colors);
225 if (hr == S_OK)
226 {
227 UINT i;
228 for (i = 0; i < This->colors; i++)
229 This->palette[i] |= 0xff000000; /* BMP palette has no alpha */
230 }
231 return hr;
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

◆ BmpFrameEncode_SetPixelFormat()

static HRESULT WINAPI BmpFrameEncode_SetPixelFormat ( IWICBitmapFrameEncode iface,
WICPixelFormatGUID pPixelFormat 
)
static

Definition at line 176 of file bmpencode.c.

178{
180 int i;
181 TRACE("(%p,%s)\n", iface, debugstr_guid(pPixelFormat));
182
183 if (!This->initialized || This->bits) return WINCODEC_ERR_WRONGSTATE;
184
185 if (IsEqualGUID(pPixelFormat, &GUID_WICPixelFormatBlackWhite))
186 *pPixelFormat = GUID_WICPixelFormat1bppIndexed;
187 else if (IsEqualGUID(pPixelFormat, &GUID_WICPixelFormat2bppIndexed))
188 *pPixelFormat = GUID_WICPixelFormat4bppIndexed;
189
190 for (i=0; formats[i].guid; i++)
191 {
192 if (IsEqualGUID(formats[i].guid, pPixelFormat))
193 break;
194 }
195
196 if (!formats[i].guid) i = 0;
197
198 This->format = &formats[i];
199 memcpy(pPixelFormat, This->format->guid, sizeof(GUID));
200
201 return S_OK;
202}
static const struct bmp_pixelformat formats[]
Definition: bmpencode.c:47
const GUID * guid
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147

◆ BmpFrameEncode_SetResolution()

static HRESULT WINAPI BmpFrameEncode_SetResolution ( IWICBitmapFrameEncode iface,
double  dpiX,
double  dpiY 
)
static

Definition at line 162 of file bmpencode.c.

164{
166 TRACE("(%p,%0.2f,%0.2f)\n", iface, dpiX, dpiY);
167
168 if (!This->initialized || This->bits) return WINCODEC_ERR_WRONGSTATE;
169
170 This->xres = dpiX;
171 This->yres = dpiY;
172
173 return S_OK;
174}

◆ BmpFrameEncode_SetSize()

static HRESULT WINAPI BmpFrameEncode_SetSize ( IWICBitmapFrameEncode iface,
UINT  uiWidth,
UINT  uiHeight 
)
static

Definition at line 148 of file bmpencode.c.

150{
152 TRACE("(%p,%u,%u)\n", iface, uiWidth, uiHeight);
153
154 if (!This->initialized || This->bits) return WINCODEC_ERR_WRONGSTATE;
155
156 This->width = uiWidth;
157 This->height = uiHeight;
158
159 return S_OK;
160}

◆ BmpFrameEncode_SetThumbnail()

static HRESULT WINAPI BmpFrameEncode_SetThumbnail ( IWICBitmapFrameEncode iface,
IWICBitmapSource pIThumbnail 
)
static

Definition at line 234 of file bmpencode.c.

236{
237 FIXME("(%p,%p): stub\n", iface, pIThumbnail);
239}

◆ BmpFrameEncode_WritePixels()

static HRESULT WINAPI BmpFrameEncode_WritePixels ( IWICBitmapFrameEncode iface,
UINT  lineCount,
UINT  cbStride,
UINT  cbBufferSize,
BYTE pbPixels 
)
static

Definition at line 256 of file bmpencode.c.

258{
260 UINT dstbuffersize, bytesperrow, row;
261 BYTE *dst, *src;
262 HRESULT hr;
263
264 TRACE("(%p,%u,%u,%u,%p)\n", iface, lineCount, cbStride, cbBufferSize, pbPixels);
265
266 if (!This->initialized || !This->width || !This->height || !This->format)
268
270 if (FAILED(hr)) return hr;
271
272 bytesperrow = ((This->format->bpp * This->width) + 7) / 8;
273
274 if (This->stride < bytesperrow)
275 return E_INVALIDARG;
276
277 dstbuffersize = This->stride * (This->height - This->lineswritten);
278 if ((This->stride * (lineCount - 1)) + bytesperrow > dstbuffersize)
279 return E_INVALIDARG;
280
281 src = pbPixels;
282 dst = This->bits + This->stride * (This->height - This->lineswritten - 1);
283 for (row = 0; row < lineCount; row++)
284 {
285 memcpy(dst, src, bytesperrow);
286 src += cbStride;
287 dst -= This->stride;
288 }
289
290 This->lineswritten += lineCount;
291
292 return S_OK;
293}
static HRESULT BmpFrameEncode_AllocateBits(BmpFrameEncode *This)
Definition: bmpencode.c:241
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
Definition: typeof.h:78
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340
unsigned char BYTE
Definition: xxhash.c:193

◆ BmpFrameEncode_WriteSource()

static HRESULT WINAPI BmpFrameEncode_WriteSource ( IWICBitmapFrameEncode iface,
IWICBitmapSource pIBitmapSource,
WICRect prc 
)
static

Definition at line 295 of file bmpencode.c.

297{
299 HRESULT hr;
300 TRACE("(%p,%p,%s)\n", iface, pIBitmapSource, debug_wic_rect(prc));
301
302 if (!This->initialized)
304
305 hr = configure_write_source(iface, pIBitmapSource, prc,
306 This->format ? This->format->guid : NULL, This->width, This->height,
307 This->xres, This->yres);
308
309 if (SUCCEEDED(hr))
310 {
311 hr = write_source(iface, pIBitmapSource, prc,
312 This->format->guid, This->format->bpp, !This->colors && This->format->colors,
313 This->width, This->height);
314 }
315
316 return hr;
317}
#define SUCCEEDED(hr)
Definition: intsafe.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
HRESULT write_source(IWICBitmapFrameEncode *iface, IWICBitmapSource *source, const WICRect *prc, const WICPixelFormatGUID *format, UINT bpp, BOOL need_palette, INT width, INT height)
HRESULT configure_write_source(IWICBitmapFrameEncode *iface, IWICBitmapSource *source, const WICRect *prc, const WICPixelFormatGUID *format, INT width, INT height, double xres, double yres)
static const char * debug_wic_rect(const WICRect *rect)

◆ impl_from_IWICBitmapEncoder()

static BmpEncoder * impl_from_IWICBitmapEncoder ( IWICBitmapEncoder iface)
inlinestatic

Definition at line 433 of file bmpencode.c.

434{
435 return CONTAINING_RECORD(iface, BmpEncoder, IWICBitmapEncoder_iface);
436}
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by BmpEncoder_AddRef(), BmpEncoder_Commit(), BmpEncoder_CreateNewFrame(), BmpEncoder_Initialize(), BmpEncoder_QueryInterface(), BmpEncoder_Release(), and BmpEncoder_SetPalette().

◆ impl_from_IWICBitmapFrameEncode()

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( wincodecs  )

Variable Documentation

◆ BmpEncoder_Vtbl

const IWICBitmapEncoderVtbl BmpEncoder_Vtbl
static
Initial value:
= {
}
static HRESULT WINAPI BmpEncoder_GetEncoderInfo(IWICBitmapEncoder *iface, IWICBitmapEncoderInfo **info)
Definition: bmpencode.c:513
static ULONG WINAPI BmpEncoder_Release(IWICBitmapEncoder *iface)
Definition: bmpencode.c:471
static HRESULT WINAPI BmpEncoder_CreateNewFrame(IWICBitmapEncoder *iface, IWICBitmapFrameEncode **ppIFrameEncode, IPropertyBag2 **ppIEncoderOptions)
Definition: bmpencode.c:558
static HRESULT WINAPI BmpEncoder_SetThumbnail(IWICBitmapEncoder *iface, IWICBitmapSource *pIThumbnail)
Definition: bmpencode.c:546
static HRESULT WINAPI BmpEncoder_Initialize(IWICBitmapEncoder *iface, IStream *pIStream, WICBitmapEncoderCacheOption cacheOption)
Definition: bmpencode.c:488
static HRESULT WINAPI BmpEncoder_SetColorContexts(IWICBitmapEncoder *iface, UINT cCount, IWICColorContext **ppIColorContext)
Definition: bmpencode.c:531
static HRESULT WINAPI BmpEncoder_SetPreview(IWICBitmapEncoder *iface, IWICBitmapSource *pIPreview)
Definition: bmpencode.c:552
static HRESULT WINAPI BmpEncoder_Commit(IWICBitmapEncoder *iface)
Definition: bmpencode.c:609
static HRESULT WINAPI BmpEncoder_GetMetadataQueryWriter(IWICBitmapEncoder *iface, IWICMetadataQueryWriter **ppIMetadataQueryWriter)
Definition: bmpencode.c:619
static ULONG WINAPI BmpEncoder_AddRef(IWICBitmapEncoder *iface)
Definition: bmpencode.c:461
static HRESULT WINAPI BmpEncoder_SetPalette(IWICBitmapEncoder *iface, IWICPalette *palette)
Definition: bmpencode.c:538
static HRESULT WINAPI BmpEncoder_GetContainerFormat(IWICBitmapEncoder *iface, GUID *pguidContainerFormat)
Definition: bmpencode.c:501
static HRESULT WINAPI BmpEncoder_QueryInterface(IWICBitmapEncoder *iface, REFIID iid, void **ppv)
Definition: bmpencode.c:438

Definition at line 626 of file bmpencode.c.

Referenced by BmpEncoder_CreateInstance().

◆ BmpFrameEncode_Vtbl

const IWICBitmapFrameEncodeVtbl BmpFrameEncode_Vtbl
static
Initial value:
= {
}
static HRESULT WINAPI BmpFrameEncode_WritePixels(IWICBitmapFrameEncode *iface, UINT lineCount, UINT cbStride, UINT cbBufferSize, BYTE *pbPixels)
Definition: bmpencode.c:256
static HRESULT WINAPI BmpFrameEncode_SetThumbnail(IWICBitmapFrameEncode *iface, IWICBitmapSource *pIThumbnail)
Definition: bmpencode.c:234
static ULONG WINAPI BmpFrameEncode_AddRef(IWICBitmapFrameEncode *iface)
Definition: bmpencode.c:105
static ULONG WINAPI BmpFrameEncode_Release(IWICBitmapFrameEncode *iface)
Definition: bmpencode.c:115
static HRESULT WINAPI BmpFrameEncode_SetPalette(IWICBitmapFrameEncode *iface, IWICPalette *palette)
Definition: bmpencode.c:211
static HRESULT WINAPI BmpFrameEncode_SetSize(IWICBitmapFrameEncode *iface, UINT uiWidth, UINT uiHeight)
Definition: bmpencode.c:148
static HRESULT WINAPI BmpFrameEncode_SetPixelFormat(IWICBitmapFrameEncode *iface, WICPixelFormatGUID *pPixelFormat)
Definition: bmpencode.c:176
static HRESULT WINAPI BmpFrameEncode_WriteSource(IWICBitmapFrameEncode *iface, IWICBitmapSource *pIBitmapSource, WICRect *prc)
Definition: bmpencode.c:295
static HRESULT WINAPI BmpFrameEncode_SetResolution(IWICBitmapFrameEncode *iface, double dpiX, double dpiY)
Definition: bmpencode.c:162
static HRESULT WINAPI BmpFrameEncode_SetColorContexts(IWICBitmapFrameEncode *iface, UINT cCount, IWICColorContext **ppIColorContext)
Definition: bmpencode.c:204
static HRESULT WINAPI BmpFrameEncode_Initialize(IWICBitmapFrameEncode *iface, IPropertyBag2 *pIEncoderOptions)
Definition: bmpencode.c:132
static HRESULT WINAPI BmpFrameEncode_Commit(IWICBitmapFrameEncode *iface)
Definition: bmpencode.c:319
static HRESULT WINAPI BmpFrameEncode_QueryInterface(IWICBitmapFrameEncode *iface, REFIID iid, void **ppv)
Definition: bmpencode.c:82
static HRESULT WINAPI BmpFrameEncode_GetMetadataQueryWriter(IWICBitmapFrameEncode *iface, IWICMetadataQueryWriter **query_writer)
Definition: bmpencode.c:396

Definition at line 409 of file bmpencode.c.

Referenced by BmpEncoder_CreateNewFrame().

◆ formats

const struct bmp_pixelformat formats[]
static
Initial value:
= {
{&GUID_WICPixelFormat24bppBGR, 24, 0, BI_RGB},
{&GUID_WICPixelFormatBlackWhite, 1, 2, BI_RGB},
{&GUID_WICPixelFormat1bppIndexed, 1, 2, BI_RGB},
{&GUID_WICPixelFormat2bppIndexed, 2, 4, BI_RGB},
{&GUID_WICPixelFormat4bppIndexed, 4, 16, BI_RGB},
{&GUID_WICPixelFormat8bppIndexed, 8, 256, BI_RGB},
{&GUID_WICPixelFormat16bppBGR555, 16, 0, BI_RGB},
{&GUID_WICPixelFormat16bppBGR565, 16, 0, BI_BITFIELDS, 0xf800, 0x7e0, 0x1f, 0},
{&GUID_WICPixelFormat32bppBGR, 32, 0, BI_RGB},
{&GUID_WICPixelFormat32bppBGRA, 32, 0, BI_BITFIELDS, 0xff0000, 0xff00, 0xff, 0xff000000},
{NULL}
}
#define BI_RGB
Definition: precomp.h:56

Definition at line 47 of file bmpencode.c.

Referenced by BmpFrameEncode_SetPixelFormat().