home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: WPS_PM
/
WPS_PM.zip
/
DESKEXT.ZIP
/
PATTERN.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-05-12
|
3KB
|
110 lines
/***************************************************************************\
* PATTERN.C - An example Desktop Picture Reader extension by John Ridges
\***************************************************************************/
#define INCL_BITMAPFILEFORMAT
#define INCL_DOSFILEMGR
#define INCL_GPIBITMAPS
#define INCL_WINSYS
#include <os2.h>
#include <string.h>
char far * far pascal _loadds deskpicextension(HMODULE);
ULONG far pascal _loadds deskpicgetsize(HFILE);
BOOL far pascal _loadds deskpicread(HFILE, SEL, BITMAPINFO far *);
void far pascal _loadds deskpicinfo(char far *, HWND);
static USHORT near cx; /* Width of screen in pels */
static USHORT near cy; /* Height of screen in pels */
static BITMAPFILEHEADER near filehead; /* The icon's header */
char far * far pascal _loadds deskpicextension(module)
HMODULE module;
{
module; /* Reference the argument so we don't get compiler warnings */
return ".ICO"; /* Tell DESKPIC to look for .ICO extensions */
}
ULONG far pascal _loadds deskpicgetsize(hf)
HFILE hf;
{
USHORT n;
/* Read the icon's header */
if (DosRead(hf,&filehead,sizeof(BITMAPFILEHEADER),&n) ||
n != sizeof(BITMAPFILEHEADER)) return 0L;
/* Check that the icon is big enough and has only one color plane */
if (filehead.bmp.cx < 16 || filehead.bmp.cy < 16 ||
filehead.bmp.cPlanes != 1 || filehead.bmp.cBitCount > 8) return 0L;
/* Get the screen size */
cx = (USHORT)WinQuerySysValue(HWND_DESKTOP,SV_CXSCREEN);
cy = (USHORT)WinQuerySysValue(HWND_DESKTOP,SV_CYSCREEN);
/* Return the amount of memory needed for the whole screen */
return (ULONG)cy*((cx*filehead.bmp.cBitCount+7>>3)+3&0xfffc);
}
BOOL far pascal _loadds deskpicread(hf,sel,cbmi)
HFILE hf;
SEL sel;
BITMAPINFO far *cbmi;
{
USHORT i,n,y;
ULONG row;
BYTE huge *abbitmap;
/* Specify a bitmap the size of the screen */
cbmi->cbFix = 12;
cbmi->cx = cx;
cbmi->cy = cy;
cbmi->cPlanes = 1;
cbmi->cBitCount = filehead.bmp.cBitCount;
/* Read in the icon's color table */
for (i = 0; i < (USHORT)(1<<filehead.bmp.cBitCount); i++)
if (DosRead(hf,&cbmi->argbColor[i],sizeof(RGB),&n) || n != sizeof(RGB))
return TRUE;
/* Get a pointer to the bitmap data */
abbitmap = MAKEP(sel,0);
/* Duplicate the first 16 rows of icon data over every row of the bitmap */
for (y = 0; y < cy; y++) {
/* Locate the row in the icon data */
DosChgFilePtr(hf,(LONG)filehead.offBits+
(LONG)(y%16)*((filehead.bmp.cx*filehead.bmp.cBitCount+7>>3)+3&0xfffc),
FILE_BEGIN,&row);
/* Locate the row in the bitmap */
row = (ULONG)y*((cx*filehead.bmp.cBitCount+7>>3)+3&0xfffc);
/* Read the row of icon data */
for (n = 0; n < filehead.bmp.cBitCount<<1; n++)
if (DosRead(hf,abbitmap+row+n,1,&i) || i != 1) return TRUE;
/* Duplicate the data over the rest of the bitmap row */
for (i = 0; i < (cx*filehead.bmp.cBitCount+7>>3)-n; i++)
abbitmap[row+n+i] = abbitmap[row+i];
}
/* Return success */
return FALSE;
}
void far pascal _loadds deskpicinfo(filepath,hwnd)
char far *filepath;
HWND hwnd;
{
char temp[255];
/* Create and display an "about" message */
strcpy(temp,"PATTERN.DPR - Generates a desktop pattern from a PM 1.1 "
"Icon.\n\nby John Ridges\n\nCurrent Icon: ");
strcat(temp,filepath);
WinMessageBox(HWND_DESKTOP,hwnd,temp,"DESKPIC",0,MB_OK|MB_NOICON);
}