📄 eztwain.c
字号:
static int DibNumColors(VOID FAR *pv)
{
LPBITMAPINFOHEADER lpbi = ((LPBITMAPINFOHEADER)pv);
LPBITMAPCOREHEADER lpbc = ((LPBITMAPCOREHEADER)pv);
int nColors;
if (lpbi->biSize == sizeof(BITMAPCOREHEADER)) {
nColors = 1 << lpbc->bcBitCount;
} else if (lpbi->biClrUsed == 0) {
nColors = 1 << lpbi->biBitCount;
} else {
nColors = (int)lpbi->biClrUsed;
}
if (nColors > 256) nColors = 0;
return nColors;
} // DibNumColors
int EZTAPI TWAIN_DibNumColors(HANDLE hdib)
// given a DIB handle, return the number of palette entries: 0,2,16, or 256
{
VOID FAR *pv = GlobalLock(hdib);
int nColors = DibNumColors(pv);
GlobalUnlock(hdib);
return nColors;
}
//---------------------------------------------------------------------------
const PALETTEENTRY peStock256[256] = {
// from 0 .. 9 are Windows fixed colors
0, 0, 0, 0, // 000 always black
128, 0, 0, 0, // 001 dark red
0, 128, 0, 0, // 002 dark green
128, 128, 0, 0, // 003 dark brown
0, 0, 128, 0, // 004 dark blue
128, 0, 128, 0, // 005 dark purple
0, 128, 128, 0, // 006 dark teal
192, 192, 192, 0, // 007 light gray
192, 220, 192, 0, // 008 pale green
166, 202, 240, 0, // 009 sky blue
4, 4, 4, 4, // 010 dark gray ramp
8, 8, 8, 4, // 011
12, 12, 12, 4, // 012
17, 17, 17, 4, // 013
22, 22, 22, 4, // 014
28, 28, 28, 4, // 015
34, 34, 34, 4, // 016
41, 41, 41, 4, // 017
85, 85, 85, 4, // 018
77, 77, 77, 4, // 019
66, 66, 66, 4, // 020
57, 57, 57, 4, // 021
255, 124, 128, 4, // 022
255, 80, 80, 4, // 023
214, 0, 147, 4, // 024
204, 236, 255, 4, // 025
239, 214, 198, 4, // 026
231, 231, 214, 4, // 027
173, 169, 144, 4, // 028
51, 0, 0, 4, // 029
102, 0, 0, 4, // 030
153, 0, 0, 4, // 031
204, 0, 0, 4, // 032
0, 51, 0, 4, // 033
51, 51, 0, 4, // 034
102, 51, 0, 4, // 035
153, 51, 0, 4, // 036
204, 51, 0, 4, // 037
255, 51, 0, 4, // 038
0, 102, 0, 4, // 039
51, 102, 0, 4, // 040
102, 102, 0, 4, // 041
153, 102, 0, 4, // 042
204, 102, 0, 4, // 043
255, 102, 0, 4, // 044
0, 153, 0, 4, // 045
51, 153, 0, 4, // 046
102, 153, 0, 4, // 047
153, 153, 0, 4, // 048
204, 153, 0, 4, // 049
255, 153, 0, 4, // 050
0, 204, 0, 4, // 051
51, 204, 0, 4, // 052
102, 204, 0, 4, // 053
153, 204, 0, 4, // 054
204, 204, 0, 4, // 055
255, 204, 0, 4, // 056
102, 255, 0, 4, // 057
153, 255, 0, 4, // 058
204, 255, 0, 4, // 059
0, 0, 51, 4, // 060
51, 0, 51, 4, // 061
102, 0, 51, 4, // 062
153, 0, 51, 4, // 063
204, 0, 51, 4, // 064
255, 0, 51, 4, // 065
0, 51, 51, 4, // 066
51, 51, 51, 4, // 067
102, 51, 51, 4, // 068
153, 51, 51, 4, // 069
204, 51, 51, 4, // 070
255, 51, 51, 4, // 071
0, 102, 51, 4, // 072
51, 102, 51, 4, // 073
102, 102, 51, 4, // 074
153, 102, 51, 4, // 075
204, 102, 51, 4, // 076
255, 102, 51, 4, // 077
0, 153, 51, 4, // 078
51, 153, 51, 4, // 079
102, 153, 51, 4, // 080
153, 153, 51, 4, // 081
204, 153, 51, 4, // 082
255, 153, 51, 4, // 083
0, 204, 51, 4, // 084
51, 204, 51, 4, // 085
102, 204, 51, 4, // 086
153, 204, 51, 4, // 087
204, 204, 51, 4, // 088
255, 204, 51, 4, // 089
51, 255, 51, 4, // 090
102, 255, 51, 4, // 091
153, 255, 51, 4, // 092
204, 255, 51, 4, // 093
255, 255, 51, 4, // 094
0, 0, 102, 4, // 095
51, 0, 102, 4, // 096
102, 0, 102, 4, // 097
153, 0, 102, 4, // 098
204, 0, 102, 4, // 099
255, 0, 102, 4, // 100
0, 51, 102, 4, // 101
51, 51, 102, 4, // 102
102, 51, 102, 4, // 103
153, 51, 102, 4, // 104
204, 51, 102, 4, // 105
255, 51, 102, 4, // 106
0, 102, 102, 4, // 107
51, 102, 102, 4, // 108
102, 102, 102, 4, // 109
153, 102, 102, 4, // 110
204, 102, 102, 4, // 111
0, 153, 102, 4, // 112
51, 153, 102, 4, // 113
102, 153, 102, 4, // 114
153, 153, 102, 4, // 115
204, 153, 102, 4, // 116
255, 153, 102, 4, // 117
0, 204, 102, 4, // 118
51, 204, 102, 4, // 119
153, 204, 102, 4, // 120
204, 204, 102, 4, // 121
255, 204, 102, 4, // 122
0, 255, 102, 4, // 123
51, 255, 102, 4, // 124
153, 255, 102, 4, // 125
204, 255, 102, 4, // 126
255, 0, 204, 4, // 127
204, 0, 255, 4, // 128
0, 153, 153, 4, // 129
153, 51, 153, 4, // 130
153, 0, 153, 4, // 131
204, 0, 153, 4, // 132
0, 0, 153, 4, // 133
51, 51, 153, 4, // 134
102, 0, 153, 4, // 135
204, 51, 153, 4, // 136
255, 0, 153, 4, // 137
0, 102, 153, 4, // 138
51, 102, 153, 4, // 139
102, 51, 153, 4, // 140
153, 102, 153, 4, // 141
204, 102, 153, 4, // 142
255, 51, 153, 4, // 143
51, 153, 153, 4, // 144
102, 153, 153, 4, // 145
153, 153, 153, 4, // 146
204, 153, 153, 4, // 147
255, 153, 153, 4, // 148
0, 204, 153, 4, // 149
51, 204, 153, 4, // 150
102, 204, 102, 4, // 151
153, 204, 153, 4, // 152
204, 204, 153, 4, // 153
255, 204, 153, 4, // 154
0, 255, 153, 4, // 155
51, 255, 153, 4, // 156
102, 204, 153, 4, // 157
153, 255, 153, 4, // 158
204, 255, 153, 4, // 159
255, 255, 153, 4, // 160
0, 0, 204, 4, // 161
51, 0, 153, 4, // 162
102, 0, 204, 4, // 163
153, 0, 204, 4, // 164
204, 0, 204, 4, // 165
0, 51, 153, 4, // 166
51, 51, 204, 4, // 167
102, 51, 204, 4, // 168
153, 51, 204, 4, // 169
204, 51, 204, 4, // 170
255, 51, 204, 4, // 171
0, 102, 204, 4, // 172
51, 102, 204, 4, // 173
102, 102, 153, 4, // 174
153, 102, 204, 4, // 175
204, 102, 204, 4, // 176
255, 102, 153, 4, // 177
0, 153, 204, 4, // 178
51, 153, 204, 4, // 179
102, 153, 204, 4, // 180
153, 153, 204, 4, // 181
204, 153, 204, 4, // 182
255, 153, 204, 4, // 183
0, 204, 204, 4, // 184
51, 204, 204, 4, // 185
102, 204, 204, 4, // 186
153, 204, 204, 4, // 187
204, 204, 204, 4, // 188
255, 204, 204, 4, // 189
0, 255, 204, 4, // 190
51, 255, 204, 4, // 191
102, 255, 153, 4, // 192
153, 255, 204, 4, // 193
204, 255, 204, 4, // 194
255, 255, 204, 4, // 195
51, 0, 204, 4, // 196
102, 0, 255, 4, // 197
153, 0, 255, 4, // 198
0, 51, 204, 4, // 199
51, 51, 255, 4, // 200
102, 51, 255, 4, // 201
153, 51, 255, 4, // 202
204, 51, 255, 4, // 203
255, 51, 255, 4, // 204
0, 102, 255, 4, // 205
51, 102, 255, 4, // 206
102, 102, 204, 4, // 207
153, 102, 255, 4, // 208
204, 102, 255, 4, // 209
255, 102, 204, 4, // 210
0, 153, 255, 4, // 211
51, 153, 255, 4, // 212
102, 153, 255, 4, // 213
153, 153, 255, 4, // 214
204, 153, 255, 4, // 215
255, 153, 255, 4, // 216
0, 204, 255, 4, // 217
51, 204, 255, 4, // 218
102, 204, 255, 4, // 219
153, 204, 255, 4, // 220
204, 204, 255, 4, // 221
255, 204, 255, 4, // 222
51, 255, 255, 4, // 223
102, 255, 204, 4, // 224
153, 255, 255, 4, // 225
204, 255, 255, 4, // 226
255, 102, 102, 4, // 227
102, 255, 102, 4, // 228
255, 255, 102, 4, // 229
102, 102, 255, 4, // 230
255, 102, 255, 4, // 231
102, 255, 255, 4, // 232
165, 0, 33, 4, // 233
95, 95, 95, 4, // 234
119, 119, 119, 4, // 235
134, 134, 134, 4, // 236
150, 150, 150, 4, // 237
203, 203, 203, 4, // 238
178, 178, 178, 4, // 239
215, 215, 215, 4, // 240
221, 221, 221, 4, // 241
227, 227, 227, 4, // 242
234, 234, 234, 4, // 243
241, 241, 241, 4, // 244
248, 248, 248, 4, // 245
// 246 - 255 are Windows fixed colors
255, 251, 240, 0, // 246
160, 160, 164, 0, // 247
128, 128, 128, 0, // 248
255, 0, 0, 0, // 249
0, 255, 0, 0, // 250
255, 255, 0, 0, // 251
0, 0, 255, 0, // 252
255, 0, 255, 0, // 253
0, 255, 255, 0, // 254
255, 255, 255, 0, // 255 always white
};
HPALETTE EZTAPI TWAIN_CreateDibPalette (HANDLE hdib)
// given a pointer to a locked DIB, returns a handle to a plausible logical
// palette to be used for rendering the DIB
// For 24-bit dibs, returns a default palette.
{
HPALETTE hPalette = NULL;
LPBITMAPINFOHEADER lpbmi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
if (lpbmi) {
WORD nColors = TWAIN_DibNumColors(hdib); // size of DIB palette
WORD nEntries = nColors ? nColors : 256; // size of palette to create
// allocate logical palette structure
LOGPALETTE *pPal = (LOGPALETTE*)LocalAlloc(LPTR,
sizeof(LOGPALETTE) + nEntries * sizeof(PALETTEENTRY));
if (pPal) {
// Fill in the palette entries
pPal->palNumEntries = nEntries;
pPal->palVersion = 0x300; // Windows 3.0 or later
if (nColors) {
// from the DIB color table
// Get a pointer to the color table
RGBQUAD FAR *pRgb = (RGBQUAD FAR *)((LPSTR)lpbmi + (WORD)lpbmi->biSize);
WORD i;
// copy from DIB palette (triples, by the way) into the LOGPALETTE
for (i = 0; i < nEntries; i++) {
pPal->palPalEntry[i].peRed = pRgb[i].rgbRed;
pPal->palPalEntry[i].peGreen = pRgb[i].rgbGreen;
pPal->palPalEntry[i].peBlue = pRgb[i].rgbBlue;
pPal->palPalEntry[i].peFlags = (BYTE)0;
} // for
} else {
// Deep Dib: Synthesize halftone palette
memcpy(pPal->palPalEntry, peStock256, sizeof peStock256);
}
// create a logical palette
hPalette = CreatePalette(pPal);
LocalFree((HANDLE)pPal);
}
GlobalUnlock(hdib);
}
return hPalette;
} // TWAIN_CreateDibPalette
LPBYTE DibBits(LPBITMAPINFOHEADER lpdib)
// Given a pointer to a locked DIB, return a pointer to the actual bits (pixels)
{
DWORD dwColorTableSize = (DWORD)(DibNumColors(lpdib) * sizeof(RGBQUAD));
LPBYTE lpBits = (LPBYTE)lpdib + lpdib->biSize + dwColorTableSize;
return lpBits;
} // end DibBits
void EZTAPI TWAIN_DrawDibToDC(HDC hDC, int dx, int dy, int w, int h,
HANDLE hdib, int sx, int sy)
{
LPBITMAPINFOHEADER lpbmi = (LPBITMAPINFOHEADER)GlobalLock(hdib);
if (lpbmi) {
/*#ifdef _WIN32
HDRAWDIB hdd = DrawDibOpen();
if (hdd) {
DrawDibDraw(hdd, hDC,
dx, dy, w, h,
lpbmi, DibBits(lpbmi),
sx, sy, w, h,
0
);
DrawDibClose(hdd);
}
#else*/
StretchDIBits(hDC,
dx, dy, // x,y destination
w, h, // pixel width & height in destination
sx, sy, // x,y source
w, h, // width & height in source
DibBits(lpbmi), // pointer to 'bits' - the pixels
(LPBITMAPINFO)lpbmi,
DIB_RGB_COLORS, // DIB palette is (presumably?) RGB entries
SRCCOPY); // raster operation (copy)
//#endif
GlobalUnlock(hdib);
}
} // TWAIN_DrawDibToDC
///////////////////////////////////////////////////////////////////////
// TWAIN general
int EZTAPI TWAIN_IsAvailable(void)
// return 1 if TWAIN services are available, 0 if 'TWAIN-less' system
{
if (pDSM_Entry) return TRUE; // SM currently loaded
if (iAvailable == 0) {
if (TWAIN_LoadSourceManager()) {
iAvailable = 1;
TWAIN_UnloadSourceManager();
} else {
iAvailable = -1;
}
}
return (iAvailable > 0);
} // TWAIN_IsAvailable
int EZTAPI TWAIN_EasyVersion(void)
// Returns the version number of EZTWAIN.DLL, multiplied by 100.
// So e.g. version 2.01 will return 201 from this call.
{
return VERSION;
} // TWAIN_EasyVersion
int EZTAPI TWAIN_State(void)
// Returns the TWAIN Protocol State per the spec.
{
return nState;
}
int EZTAPI TWAIN_GetHideUI(void)
{
return bHideUI;
} // TWAIN_GetHideUI
void EZTAPI TWAIN_SetHideUI(int fHide)
{
bHideUI = (fHide != 0);
} // TWAIN_SetHideUI
///////////////////////////////////////////////////////////////////////
// TWAIN State Changers
int EZTAPI TWAIN_LoadSourceManager(void)
{
char szSMDir[128];
int cc;
OFSTRUCT of;
if (nState >= 2) return TRUE; // DSM already loaded
GetWindowsDirectory(szSMDir, sizeof(szSMDir));
cc = lstrlen(szSMDir);
if (cc && szSMDir[cc-1] != ':') {
lstrcat(szSMDir, "\\");
}
lstrcat(szSMDir, DSM_FILENAME); // could crash!
if (OpenFile(szSMDir, &of, OF_EXIST) != -1) {
hDSMLib = LoadLibrary(szSMDir);
} else {
hDSMLib = NULL;
}
if (IsValidHandle(hDSMLib)) {
pDSM_Entry = (DSMENTRYPROC) GetProcAddress(hDSMLib, DSM_ENTRYPOINT);
if (pDSM_Entry) {
iAvailable = 1;
nState = 2;
} else {
FreeLibrary(hDSMLib);
hDSMLib = NULL;
}
} else {
pDSM_Entry = NULL;
}
return (nState >= 2);
} // TWAIN_LoadSourceManager
static TW_INT32 hwnd32SM;
int EZTAPI TWAIN_OpenSourceManager(HWND hwnd)
{
hwnd32SM = (TW_INT32)hwnd;
if (TWAIN_LoadSourceManager() &&
TWAIN_Mgr(DG_CONTROL, DAT_PARENT, MSG_OPENDSM, &hwnd32SM)) {
nState = TWAIN_SM_OPEN;
}
return (nState >= TWAIN_SM_OPEN);
} // TWAIN_OpenSourceManager
int EZTAPI TWAIN_OpenDefaultSource(void)
{
if (nState != 3) return FALSE;
// open the system default source
SourceId.ProductName[0] = '\0';
SourceId.Id = 0;
if (TWAIN_Mgr(DG_CONTROL, DAT_IDENTITY, MSG_OPENDS, &SourceId)) {
nState = 4;
} else {
RecordError(ED_DSM_FAILURE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -