⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eztwain.c

📁 扫描仪设置
💻 C
📖 第 1 页 / 共 4 页
字号:


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 + -