gdiplus: Added GdipCreateBitmapFromScan0.

This commit is contained in:
Evan Stade 2007-07-31 19:15:52 -07:00 committed by Alexandre Julliard
parent 4c5486fe92
commit 9fa4c12486
6 changed files with 72 additions and 1 deletions

View file

@ -78,7 +78,7 @@
@ stub GdipCreateBitmapFromHBITMAP @ stub GdipCreateBitmapFromHBITMAP
@ stub GdipCreateBitmapFromHICON @ stub GdipCreateBitmapFromHICON
@ stub GdipCreateBitmapFromResource @ stub GdipCreateBitmapFromResource
@ stub GdipCreateBitmapFromScan0 @ stdcall GdipCreateBitmapFromScan0(long long long long ptr ptr)
@ stub GdipCreateBitmapFromStream @ stub GdipCreateBitmapFromStream
@ stub GdipCreateBitmapFromStreamICM @ stub GdipCreateBitmapFromStreamICM
@ stub GdipCreateCachedBitmap @ stub GdipCreateCachedBitmap

View file

@ -128,6 +128,10 @@ struct GpMetafile{
GpUnit unit; GpUnit unit;
}; };
struct GpBitmap{
GpImage image;
};
struct GpImageAttributes{ struct GpImageAttributes{
WrapMode wrap; WrapMode wrap;
}; };

View file

@ -26,6 +26,7 @@
#define COBJMACROS #define COBJMACROS
#include "objbase.h" #include "objbase.h"
#include "olectl.h" #include "olectl.h"
#include "ole2.h"
#include "gdiplus.h" #include "gdiplus.h"
#include "gdiplus_private.h" #include "gdiplus_private.h"
@ -35,6 +36,67 @@ WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
typedef void ImageItemData; typedef void ImageItemData;
GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
PixelFormat format, BYTE* scan0, GpBitmap** bitmap)
{
BITMAPFILEHEADER *bmfh;
BITMAPINFOHEADER *bmih;
BYTE *buff;
INT datalen = stride * height, size;
IStream *stream;
TRACE("%d %d %d %d %p %p\n", width, height, stride, format, scan0, bitmap);
if(!scan0 || !bitmap)
return InvalidParameter;
*bitmap = GdipAlloc(sizeof(GpBitmap));
if(!*bitmap) return OutOfMemory;
size = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + datalen;
buff = GdipAlloc(size);
if(!buff){
GdipFree(*bitmap);
return OutOfMemory;
}
bmfh = (BITMAPFILEHEADER*) buff;
bmih = (BITMAPINFOHEADER*) (bmfh + 1);
bmfh->bfType = (((WORD)'M') << 8) + (WORD)'B';
bmfh->bfSize = size;
bmfh->bfOffBits = size - datalen;
bmih->biSize = sizeof(BITMAPINFOHEADER);
bmih->biWidth = width;
bmih->biHeight = height;
/* FIXME: use the rest of the data from format */
bmih->biBitCount = format >> 8;
bmih->biCompression = BI_RGB;
memcpy(bmih + 1, scan0, datalen);
if(CreateStreamOnHGlobal(buff, TRUE, &stream) != S_OK){
ERR("could not make stream\n");
GdipFree(*bitmap);
GdipFree(buff);
return GenericError;
}
if(OleLoadPicture(stream, 0, FALSE, &IID_IPicture,
(LPVOID*) &((*bitmap)->image.picture)) != S_OK){
TRACE("Could not load picture\n");
IStream_Release(stream);
GdipFree(*bitmap);
GdipFree(buff);
return GenericError;
}
(*bitmap)->image.type = ImageTypeBitmap;
return Ok;
}
GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image) GpStatus WINGDIPAPI GdipDisposeImage(GpImage *image)
{ {
if(!image) if(!image)

View file

@ -138,6 +138,8 @@ GpStatus WINGDIPAPI GdipCreateCustomLineCap(GpPath*,GpPath*,GpLineCap,REAL,
GpCustomLineCap**); GpCustomLineCap**);
GpStatus WINGDIPAPI GdipDeleteCustomLineCap(GpCustomLineCap*); GpStatus WINGDIPAPI GdipDeleteCustomLineCap(GpCustomLineCap*);
GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT,INT,INT,PixelFormat,BYTE*,
GpBitmap**);
GpStatus WINGDIPAPI GdipDisposeImage(GpImage*); GpStatus WINGDIPAPI GdipDisposeImage(GpImage*);
GpStatus WINGDIPAPI GdipGetImageBounds(GpImage*,GpRectF*,GpUnit*); GpStatus WINGDIPAPI GdipGetImageBounds(GpImage*,GpRectF*,GpUnit*);
GpStatus WINGDIPAPI GdipGetImageHeight(GpImage*,UINT*); GpStatus WINGDIPAPI GdipGetImageHeight(GpImage*,UINT*);

View file

@ -32,6 +32,7 @@ class GpCustomLineCap {};
class GpImage {}; class GpImage {};
class GpMetafile : public GpImage {}; class GpMetafile : public GpImage {};
class GpImageAttributes {}; class GpImageAttributes {};
class GpBitmap : public GpImage {};
#else /* end of c++ declarations */ #else /* end of c++ declarations */
@ -46,6 +47,7 @@ typedef struct GpCustomLineCap GpCustomLineCap;
typedef struct GpImage GpImage; typedef struct GpImage GpImage;
typedef struct GpMetafile GpMetafile; typedef struct GpMetafile GpMetafile;
typedef struct GpImageAttributes GpImageAttributes; typedef struct GpImageAttributes GpImageAttributes;
typedef struct GpBitmap GpBitmap;
#endif /* end of c declarations */ #endif /* end of c declarations */

View file

@ -20,5 +20,6 @@
#define _GDIPLUSPIXELFORMATS_H #define _GDIPLUSPIXELFORMATS_H
typedef DWORD ARGB; typedef DWORD ARGB;
typedef INT PixelFormat;
#endif #endif