iup-stack/im/include/im_dib.h

213 lines
7.9 KiB
C
Executable File

/** \file
* \brief Windows DIB (Device Independent Bitmap)
*
* See Copyright Notice in im_lib.h
*/
#ifndef __IM_DIB_H
#define __IM_DIB_H
#if defined(__cplusplus)
extern "C" {
#endif
/** \defgroup dib Windows DIB
*
* \par
* Windows DIBs in memory are handled just like a BMP file without the file header. \n
* These functions will work only in Windows. They are useful for interchanging data
* with the clipboard, with capture drivers, with the AVI and WMF file formats and others.
* \par
* Supported DIB aspects:
* \li bpp must be 1, 4, 8, 16, 24, or 32.
* \li BITMAPV4HEADER or BITMAPV5HEADER are handled but ignored. \n
* \li BITMAPCOREHEADER is not handled .
* \li BI_JPEG and BI_PNG compressions are not handled.
* \li biHeight can be negative, compression can be RLE only if created
* from imDibCreateReference, imDibPasteClipboard, imDibLoadFile.
* \li can not encode/decode Images to/from RLE compressed Dibs.
* \li if working with RLE Dibs bits_size is greater than used.
* \li the resolution of a new Dib is taken from the screen.
* \li SetDIBitsToDevice(start_scan is 0, scan_lines is dib->bmih->biHeight).
* \li StretchDIBits(use always DIB_RGB_COLORS).
* \li CreateDIBPatternBrushPt(packed_dib is dib->dib).
* \par
* Must include <windows.h> before using these functions. \n
* Check <wingdi.h> for structures and definitions.
* \par
* See \ref im_dib.h
* \ingroup util */
/** \brief Windows DIB Structure
*
* \par
* Handles a DIB in memory. \n
* The DIB is stored in only one buffer.
* The secondary members are pointers to the main buffer.
* \ingroup dib */
typedef struct _imDib
{
HGLOBAL handle; /**< The windows memory handle */
BYTE* buffer; /**< The DIB as it is defined in memory */
int free_buffer; /**< Free the memory buffer, used only for DIB section */
int size; /**< Full size in memory */
BITMAPINFO* bmi; /**< Bitmap Info = Bitmap Info Header + Palette */
BITMAPINFOHEADER* bmih; /**< Bitmap Info Header */
RGBQUAD* bmic; /**< Bitmap Info Colors = Palette */
BYTE* bits; /**< Bitmap Bits */
int palette_count; /**< number of colors in the palette */
int bits_size; /**< size in bytes of the Bitmap Bits */
int line_size; /**< size in bytes of one line, includes padding */
int pad_size; /**< number of bytes remaining in the line, lines are in a word boundary */
} imDib;
/** Creates a new DIB. \n
* use bpp=-16/-32 to allocate space for BITFLIEDS. \n
* Allocates all fields.
* \ingroup dib */
imDib* imDibCreate(int width, int height, int bpp);
/** Duplicates the DIB contents in a new DIB. \n
* A Reference DIB will be copied into a full DIB structure.
* \ingroup dib */
imDib* imDibCreateCopy(const imDib* dib);
/** Creates a DIB using an already allocated memory. \n
* "bmi" must be a pointer to BITMAPINFOHEADER. \n
* "bits" can be NULL if it is inside "bmi" after the palette. \n
* "handle" is not allocated. buffer will point to bmi.
* \ingroup dib */
imDib* imDibCreateReference(BYTE* bmi, BYTE* bits);
/** Creates a DIB section for drawing purposes. \n
* Returns the bitmap that is also created. \n
* "handle" is not allocated. \n
* You cannot paste a DIB section from one application into another application.
* \ingroup dib */
imDib* imDibCreateSection(HDC hDC, HBITMAP *bitmap, int width, int height, int bpp);
/** Destroy the DIB
* \ingroup dib */
void imDibDestroy(imDib* dib);
/** DIB GetPixel function definition. \n
* the DWORD is a raw copy of the bits, use (unsigned char*)&pixel
* \ingroup dib */
typedef unsigned int (*imDibLineGetPixel)(unsigned char* line, int col);
/** Returns a function to read pixels from a DIB line.
* \ingroup dib */
imDibLineGetPixel imDibLineGetPixelFunc(int bpp);
/** DIB SetPixel function definition
* \ingroup dib */
typedef void (*imDibLineSetPixel)(unsigned char* line, int col, unsigned int pixel);
/** Returns a function to write pixels into a DIB line.
* \ingroup dib */
imDibLineSetPixel imDibLineSetPixelFunc(int bpp);
/** Creates a DIB from a image handle and a palette handle.
* \ingroup dib */
imDib* imDibFromHBitmap(const HBITMAP image, const HPALETTE hPalette);
/** Creates a image handle from a DIB.
* \ingroup dib */
HBITMAP imDibToHBitmap(const imDib* dib);
/** Returns a Logical palette from the DIB palette. \n
* DIB bpp must be <=8.
* \ingroup dib */
HPALETTE imDibLogicalPalette(const imDib* dib);
/** Captures the screen into a DIB.
* \ingroup dib */
imDib* imDibCaptureScreen(int x, int y, int width, int height);
/** Transfer the DIB to the clipboard. \n
* "dib" pointer can not be used after, or use imDibCopyClipboard(imDibCreateCopy(dib)). \n
* You cannot paste a DIB section from one application into another application. \n
* Warning: Clipboard functions in C++ can fail with Visual C++ /EHsc (Enable C++ Exceptions)
* \ingroup dib */
void imDibCopyClipboard(imDib* dib);
/** Creates a reference for the DIB in the clipboard if any. Returns NULL otherwise.
* Warning: Clipboard functions in C++ can fail with Visual C++ /EHsc (Enable C++ Exceptions)
* \ingroup dib */
imDib* imDibPasteClipboard(void);
/** Checks if there is a dib at the clipboard.
* \ingroup dib */
int imDibIsClipboardAvailable(void);
/** Saves the DIB into a file ".bmp".
* \ingroup dib */
int imDibSaveFile(const imDib* dib, const char* filename);
/** Creates a DIB from a file ".bmp".
* \ingroup dib */
imDib* imDibLoadFile(const char* filename);
/** Converts a DIB into an RGBA image. alpha is optional. bpp must be >8. \n
* alpha is used only when bpp=32.
* \ingroup dib */
void imDibDecodeToRGBA(const imDib* dib, unsigned char* red, unsigned char* green, unsigned char* blue, unsigned char* alpha);
/** Converts a DIB into an indexed image. bpp must be <=8. colors must have room for at least 256 colors.
* colors is rgb packed (RGBRGBRGB...)
* \ingroup dib */
void imDibDecodeToMap(const imDib* dib, unsigned char* map, long* palette);
/** Converts an RGBA image into a DIB. alpha is optional. bpp must be >8. \n
* alpha is used only when bpp=32.
* \ingroup dib */
void imDibEncodeFromRGBA(imDib* dib, const unsigned char* red, const unsigned char* green, const unsigned char* blue, const unsigned char* alpha);
/** Converts an indexed image into a DIB. bpp must be <=8. \n
* colors is rgb packed (RGBRGBRGB...)
* \ingroup dib */
void imDibEncodeFromMap(imDib* dib, const unsigned char* map, const long* palette, int palette_count);
/** Converts a IM_RGB packed image, with or without alpha, into a DIB.
* \ingroup dib */
void imDibEncodeFromBitmap(imDib* dib, const unsigned char* data);
/** Converts a DIB into IM_RGB packed image, with or without alpha.
* \ingroup dib */
void imDibDecodeToBitmap(const imDib* dib, unsigned char* data);
#ifdef __IM_IMAGE_H
/* You must include "im_image.h" before this header to enable these declarations. */
/** Creates a imImage from the dib data.
* \ingroup dib */
imImage* imDibToImage(const imDib* dib);
/** Creates a Dib from the image. It must be a bitmap image.
* \ingroup dib */
imDib* imDibFromImage(const imImage* image);
/** Creates a Dib Section from the image. It must be a bitmap image.
* \ingroup dib */
imDib* imDibSectionFromImage(HDC hDC, HBITMAP *bitmap, const imImage* image);
/** Creates an imImage from a RCDATA in the executable/dll resources. (Since 3.9) \n
* module can be NULL, it will use GetModuleHandle(NULL). \n
* name is the name of the resource. If using IDs, then can be obtained from MAKEINTRESOURCE(id). \n
* index is the image index in the file, 0 will return the first image.
* \ingroup dib */
imImage* imImageLoadFromResource(HMODULE module, LPCTSTR name, int index, int *error);
#endif
#if defined(__cplusplus)
}
#endif
#endif