home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
swCHIP 1991 January
/
swCHIP_95-1.bin
/
utility
/
gsview13
/
src
/
gvwclip.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-09
|
10KB
|
337 lines
/* Copyright (C) 1993, 1994, Russell Lang. All rights reserved.
This file is part of GSview.
This program is distributed with NO WARRANTY OF ANY KIND. No author
or distributor accepts any responsibility for the consequences of using it,
or for whether it serves any particular purpose or works at all, unless he
or she says so in writing. Refer to the GSview Free Public Licence
(the "Licence") for full details.
Every copy of GSview must include a copy of the Licence, normally in a
plain ASCII text file named LICENCE. The Licence grants you the right
to copy, modify and redistribute GSview, but only under certain conditions
described in the Licence. Among other things, the Licence requires that
the copyright notice and this notice be preserved on all copies.
*/
/* gvwclip.c */
/* Clipboard module for Windows GSview */
#include "gvwin.h"
#include "gvceps.h"
long hugewrite(HFILE hf, const void _huge *hpvBuffer, long cbBuffer); /* in gvweps.c */
void paste_to_file(void);
void clip_convert(void);
void clip_add_palette(void);
void clip_add_ddb(void);
void clip_add_dib(void);
/* copy a DIB from the clipboard to a file */
void
paste_to_file(void)
{
HGLOBAL hglobal;
LPBITMAPINFOHEADER pbmih;
BITMAPFILEHEADER bmfh;
UINT palcolors;
UINT palsize;
DWORD bitmap_size;
BYTE _huge *lpBits;
static char output[MAXSTR];
HFILE hfile;
if (!OpenClipboard(hwndimg)) {
play_sound(SOUND_ERROR);
return;
}
if (!IsClipboardFormatAvailable(CF_DIB)) {
CloseClipboard();
play_sound(SOUND_ERROR);
return;
}
hglobal = (HGLOBAL)GetClipboardData(CF_DIB);
pbmih = (LPBITMAPINFOHEADER)GlobalLock(hglobal);
palcolors = dib_pal_colors((LPBITMAP2)pbmih);
if (pbmih->biSize == sizeof(BITMAPCOREHEADER))
palsize = palcolors * sizeof(RGBTRIPLE);
else
palsize = palcolors * sizeof(RGBQUAD);
bitmap_size = (DWORD)pbmih->biHeight * dib_bytewidth((LPBITMAP2)pbmih);
bmfh.bfType = ('M'<<8) | 'B';
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + pbmih->biSize + palsize;
bmfh.bfSize = bmfh.bfOffBits + bitmap_size;
if ( get_filename(output, TRUE, FILTER_BMP, NULL, IDS_TOPICEDIT)
&& ((hfile = _lcreat(output, 0)) != HFILE_ERROR) ) {
hugewrite(hfile, &bmfh, sizeof(BITMAPFILEHEADER));
hugewrite(hfile, pbmih, pbmih->biSize + palsize);
lpBits = ((BYTE _huge *)pbmih) + pbmih->biSize + palsize;
hugewrite(hfile, lpBits, bitmap_size);
_lclose(hfile);
}
GlobalUnlock(hglobal);
CloseClipboard();
}
/* convert bitmap (DIB or DDB) in clipboard to */
/* CF_DIB, CF_BITMAP and CF_PALETTE */
void
clip_convert(void)
{
if (!OpenClipboard(hwndimg)) {
play_sound(SOUND_ERROR);
return;
}
if (IsClipboardFormatAvailable(CF_DIB)) {
if (!IsClipboardFormatAvailable(CF_PALETTE))
clip_add_palette();
if (!IsClipboardFormatAvailable(CF_BITMAP))
clip_add_ddb();
}
else {
if (IsClipboardFormatAvailable(CF_BITMAP)) {
clip_add_dib();
if (!IsClipboardFormatAvailable(CF_PALETTE))
clip_add_palette();
}
else
play_sound(SOUND_ERROR);
}
CloseClipboard();
}
/* Read DIB from the clipboard, create PALETTE and add to clipboard */
void
clip_add_palette(void)
{
HGLOBAL hglobal;
LPBITMAPINFOHEADER pbmih;
UINT palcolors;
UINT palsize;
int i;
LPLOGPALETTE logpalette;
HPALETTE hpalette;
RGBQUAD FAR *prgbquad;
RGBTRIPLE FAR *prgbtriple;
if (!IsClipboardFormatAvailable(CF_DIB)) {
play_sound(SOUND_ERROR);
return;
}
hglobal = (HGLOBAL)GetClipboardData(CF_DIB);
pbmih = (LPBITMAPINFOHEADER)GlobalLock(hglobal);
palcolors = dib_pal_colors((LPBITMAP2)pbmih);
if (pbmih->biSize == sizeof(BITMAPCOREHEADER))
palsize = palcolors * sizeof(RGBTRIPLE);
else
palsize = palcolors * sizeof(RGBQUAD);
hpalette = (HPALETTE)NULL;
if (palsize) {
/* create palette to match DIB */
logpalette = (LPLOGPALETTE) malloc( sizeof(LOGPALETTE) +
palcolors * sizeof(PALETTEENTRY) );
if (logpalette == (LPLOGPALETTE)NULL) {
GlobalUnlock(hglobal);
play_sound(SOUND_ERROR);
return;
}
logpalette->palVersion = 0x300;
logpalette->palNumEntries = (WORD)palcolors;
prgbquad = (RGBQUAD FAR *)(((BYTE _huge *)pbmih) + pbmih->biSize);
if (pbmih->biSize == sizeof(BITMAPCOREHEADER)) {
/* OS2 format */
prgbtriple = (RGBTRIPLE FAR *)prgbquad;
for (i=0; i<palcolors; i++) {
logpalette->palPalEntry[i].peFlags = 0;
logpalette->palPalEntry[i].peRed = prgbtriple[i].rgbtRed;
logpalette->palPalEntry[i].peGreen = prgbtriple[i].rgbtGreen;
logpalette->palPalEntry[i].peBlue = prgbtriple[i].rgbtBlue;
}
}
else {
/* Windows Format */
for (i=0; i<palcolors; i++) {
logpalette->palPalEntry[i].peFlags = 0;
logpalette->palPalEntry[i].peRed = prgbquad[i].rgbRed;
logpalette->palPalEntry[i].peGreen = prgbquad[i].rgbGreen;
logpalette->palPalEntry[i].peBlue = prgbquad[i].rgbBlue;
}
}
hpalette = CreatePalette(logpalette);
free((void *)logpalette);
SetClipboardData(CF_PALETTE, hpalette);
}
GlobalUnlock(hglobal);
}
/* Read DIB from the clipboard, convert to DDB and add to clipboard */
void
clip_add_ddb(void)
{
HGLOBAL hglobal;
LPBITMAPINFOHEADER pbmih;
UINT palcolors;
UINT palsize;
HPALETTE hpalette;
HDC hdc;
HBITMAP hbitmap;
hglobal = (HGLOBAL)GetClipboardData(CF_DIB);
pbmih = (LPBITMAPINFOHEADER)GlobalLock(hglobal);
palcolors = dib_pal_colors((LPBITMAP2)pbmih);
if (pbmih->biSize == sizeof(BITMAPCOREHEADER))
palsize = palcolors * sizeof(RGBTRIPLE);
else
palsize = palcolors * sizeof(RGBQUAD);
hdc = GetDC(hwndimg);
hpalette = GetClipboardData(CF_PALETTE);
if (hpalette) {
SelectPalette(hdc,hpalette,NULL);
RealizePalette(hdc);
}
hbitmap = CreateDIBitmap(hdc, pbmih, CBM_INIT,
((BYTE _huge *)pbmih) + pbmih->biSize + palsize,
(LPBITMAPINFO)pbmih, DIB_RGB_COLORS);
ReleaseDC(hwndimg, hdc);
GlobalUnlock(hglobal);
SetClipboardData(CF_BITMAP, hbitmap);
}
/* make a DIB from a BITMAP in the clipboard */
/* GetDIBits won't work for 4 plane or 4 bit/pixel bitmaps */
/* clipboard must be open */
HGLOBAL
make_dib(void)
{
LPBITMAPINFOHEADER pbmih;
LPBITMAPINFO pbmi;
BYTE FAR *lpBits;
HBITMAP hbitmap;
UINT palcolors;
UINT palsize;
UINT byte_width;
DWORD bitmap_size;
HGLOBAL hglobal;
HDC hdc;
HDC hdc_bit;
BITMAP bm;
PALETTEENTRY *pe;
int i;
hbitmap = GetClipboardData(CF_BITMAP);
hdc = GetDC((HWND)NULL);
hdc_bit = CreateCompatibleDC(hdc);
ReleaseDC((HWND)NULL,hdc);
GetObject(hbitmap, sizeof(BITMAP), &bm);
if (bm.bmPlanes == 4) {
HBITMAP hbitmap_new, hbitmap_old;
HDC hdc_new;
/* convert format to 1 plane, 1 bit/pixel */
bm.bmPlanes = 1;
bm.bmBitsPixel = 1;
hdc_new = CreateCompatibleDC(hdc_bit);
hbitmap_new = CreateBitmap(bm.bmWidth, bm.bmHeight, bm.bmPlanes, bm.bmBitsPixel, NULL);
SelectBitmap(hdc_new, hbitmap_new);
hbitmap_old = SelectBitmap(hdc_bit, hbitmap);
BitBlt(hdc_new, 0, 0, bm.bmWidth, bm.bmHeight, hdc_bit, 0, 0, SRCCOPY);
SelectBitmap(hdc_bit, hbitmap_old);
DeleteDC(hdc_new);
hbitmap = hbitmap_new;
}
byte_width = (((bm.bmWidth * bm.bmBitsPixel + 31) & ~31) >> 3);
bitmap_size = (DWORD)bm.bmHeight * byte_width;
palcolors = 1<<(bm.bmBitsPixel * bm.bmPlanes);
palsize = palcolors * sizeof(RGBQUAD);
hglobal = GlobalAlloc(GHND, sizeof(BITMAPINFOHEADER) + palsize + bitmap_size);
if (hglobal != (HGLOBAL)NULL) {
lpBits = GlobalLock(hglobal);
pbmi = (LPBITMAPINFO)lpBits;
pbmih = (LPBITMAPINFOHEADER)lpBits;
lpBits += sizeof(BITMAPINFOHEADER) + palsize;
pbmih->biSize = sizeof(BITMAPINFOHEADER);
pbmih->biWidth = bm.bmWidth;
pbmih->biHeight = bm.bmHeight;
pbmih->biPlanes = 1;
pbmih->biBitCount = (WORD)(bm.bmBitsPixel * bm.bmPlanes);
pbmih->biCompression = BI_RGB;
pbmih->biSizeImage = bitmap_size;
pbmih->biXPelsPerMeter = (int)(option.xdpi / 25.4 * 1000);
pbmih->biYPelsPerMeter = (int)(option.ydpi / 25.4 * 1000);
pbmih->biClrUsed = palcolors;
pbmih->biClrImportant = palcolors;
/* create colour table from system palette */
pe = malloc(palcolors * sizeof(PALETTEENTRY));
if (IsClipboardFormatAvailable(CF_PALETTE)) {
HPALETTE hpalette = GetClipboardData(CF_PALETTE);
i = GetObject(hpalette, sizeof(int), pe);
GetPaletteEntries(hpalette, 0, i, pe);
}
else
GetSystemPaletteEntries(hdc_bit, 0, palcolors, pe);
for (i=0; i<palcolors; i++) {
pbmi->bmiColors[i].rgbRed = pe[i].peRed;
pbmi->bmiColors[i].rgbGreen = pe[i].peGreen;
pbmi->bmiColors[i].rgbBlue = pe[i].peBlue;
pbmi->bmiColors[i].rgbReserved = 0;
}
free((void *)pe);
i = GetDIBits(hdc_bit, hbitmap, 0, (UINT)pbmih->biHeight,
lpBits, pbmi, DIB_RGB_COLORS);
GlobalUnlock(hglobal);
if (i == 0) {
GlobalFree(hglobal);
hglobal = NULL;
}
}
DeleteDC(hdc_bit);
if (hbitmap != GetClipboardData(CF_BITMAP))
DeleteBitmap(hbitmap);
return hglobal;
}
/* Read DDB from the clipboard, convert to DIB and add to clipboard */
void
clip_add_dib(void)
{
HGLOBAL hglobal;
hglobal = make_dib();
if (hglobal != (HGLOBAL)NULL)
SetClipboardData(CF_DIB, hglobal);
}
#ifdef NOT_USED
/* not used */
/* Read bitmap (CF_DIB or CF_BITMAP) from the clipboard */
/* convert to Metafile Picture and add to clipboard */
void
clip_add_metafile(void)
{
LPMETAFILEPICT lpmfp;
HGLOBAL hglobal;
HMETAFILE hmf;
if ( (hmf = make_metafile()) == (HMETAFILE)NULL ) {
return;
}
hglobal = GlobalAlloc(GHND | GMEM_SHARE, sizeof(METAFILEPICT));
lpmfp = GlobalLock(hglobal);
lpmfp->mm = MM_ANISOTROPIC;
if (bitmap_width)
lpmfp->xExt = (int)(bitmap_width / xdpi * 2540);
else
lpmfp->xExt = 21000; /* A4 */
if (bitmap_height)
lpmfp->yExt = (int)(bitmap_height / ydpi * 2540);
else
lpmfp->yExt = 29700; /* A4 */
lpmfp->hMF = hmf;
GlobalUnlock(hglobal);
SetClipboardData(CF_METAFILEPICT, hglobal);
return;
}
#endif