亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? plugindds.cpp

?? 一款最完整的工業(yè)組態(tài)軟源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

protected:
	unsigned m_alphas[8];
	unsigned m_alphaBits;
	int m_offset;

public:
	void Setup (const BYTE *pBlock) {
		base::Setup (pBlock);

		const DXTAlphaBlock3BitLinear &block = m_pBlock->alpha;
		m_alphas[0] = block.alpha[0];
		m_alphas[1] = block.alpha[1];
		if (m_alphas[0] > m_alphas[1]) {
			// 8 alpha block
			for (int i = 0; i < 6; i++) {
				m_alphas[i + 2] = ((6 - i) * m_alphas[0] + (1 + i) * m_alphas[1] + 3) / 7;
			}
		}
		else {
			// 6 alpha block
			for (int i = 0; i < 4; i++) {
				m_alphas[i + 2] = ((4 - i) * m_alphas[0] + (1 + i) * m_alphas[1] + 2) / 5;
			}
			m_alphas[6] = 0;
			m_alphas[7] = 0xFF;
		}

	}

	void SetY (int y) {
		base::SetY (y);
		int i = y / 2;
		const DXTAlphaBlock3BitLinear &block = m_pBlock->alpha;
		m_alphaBits = unsigned(block.data[0 + i * 3]) | (unsigned(block.data[1 + i * 3]) << 8)
			| (unsigned(block.data[2 + i * 3]) << 16);
		m_offset = (y & 1) * 12;
	}

	void GetColor (int x, int y, Color8888 &color) {
		base::GetColor (x, y, color);
		unsigned bits = (m_alphaBits >> (x * 3 + m_offset)) & 7;
		color.a = m_alphas[bits];
	}
};

template <class DECODER> void DecodeDXTBlock (BYTE *dstData, const BYTE *srcBlock, long dstPitch, int bw, int bh) {
	DECODER decoder;
	decoder.Setup (srcBlock);
	for (int y = 0; y < bh; y++) {
		BYTE *dst = dstData - y * dstPitch;
		decoder.SetY (y);
		for (int x = 0; x < bw; x++) {
			decoder.GetColor (x, y, (Color8888 &)*dst);
			dst += 4;
		}
	}
}

// ==========================================================
// Plugin Interface
// ==========================================================

static int s_format_id;

// ==========================================================
// Internal functions
// ==========================================================

static FIBITMAP *
LoadRGB (DDSURFACEDESC2 &desc, FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
	int width = (int)desc.dwWidth;
	int height = (int)desc.dwHeight;
	int bpp = (int)desc.ddpfPixelFormat.dwRGBBitCount;
	
	// allocate a new dib
	FIBITMAP *dib = FreeImage_Allocate (width, height, bpp, desc.ddpfPixelFormat.dwRBitMask,
		desc.ddpfPixelFormat.dwGBitMask, desc.ddpfPixelFormat.dwBBitMask);
	if (dib == NULL)
		return NULL;

#ifdef FREEIMAGE_BIGENDIAN
		// Calculate the number of bytes per pixel (3 for 24-bit or 4 for 32-bit)
		int bytespp = FreeImage_GetLine(dib) / FreeImage_GetWidth(dib);
#endif
	
	// read the file
	int line   = CalculateLine(width, bpp);
	int filePitch = (desc.dwFlags & DDSD_PITCH) ? (int)desc.dwPitchOrLinearSize : line;
	long delta = (long)filePitch - (long)line;
	for (int i = 0; i < height; i++) {
		BYTE *pixels = FreeImage_GetScanLine(dib, height - i - 1);
		io->read_proc (pixels, 1, line, handle);
		io->seek_proc (handle, delta, SEEK_CUR);
#ifdef FREEIMAGE_BIGENDIAN
 		for(int x = 0; x < width; x++) {
			INPLACESWAP(pixels[FI_RGBA_RED],pixels[FI_RGBA_BLUE]);
			pixels += bytespp;
		}
#endif
	}
	
	// enable transparency
	FreeImage_SetTransparent (dib, (desc.ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS) ? TRUE : FALSE);

	if (!(desc.ddpfPixelFormat.dwFlags & DDPF_ALPHAPIXELS) && bpp == 32) {
		// no transparency: convert to 24-bit
		FIBITMAP *old = dib;
		dib = FreeImage_ConvertTo24Bits (old);
		FreeImage_Unload (old);
	}
	return dib;
}

template <class DECODER> static void 
LoadDXT_Helper (FreeImageIO *io, fi_handle handle, int page, int flags, void *data, FIBITMAP *dib, BYTE *bits, int width, int height, int line) {
	typedef typename DECODER::INFO INFO;
	typedef typename INFO::Block Block;

	Block *input_buffer = new Block[(width + 3) / 4];
	int widthFullBlocks = width / 4;
	int heightFullBlocks = height / 4;
	int widthRest = (int) width & 3;
	int heightRest = (int) height & 3;
	int inputLine = (width + 3) / 4;
	int y = 0;

	if (height >= 4) {
		for (; y < height; y += 4) {
			io->read_proc (input_buffer, sizeof (typename INFO::Block), inputLine, handle);
			// TODO: probably need some endian work here
			BYTE *pbSrc = (BYTE *)input_buffer;
			BYTE *pbDst = FreeImage_GetScanLine (dib, height - y - 1);

			if (width >= 4) {
				for (int x = 0; x < width; x += 4) {
					DecodeDXTBlock <DECODER> (pbDst, pbSrc,	line, 4, 4);
					pbSrc += INFO::bytesPerBlock;
					pbDst += 4 * 4;
				}
			}
			if (widthRest) {
				DecodeDXTBlock <DECODER> (pbDst, pbSrc, line, widthRest, 4);
			}
		}
	}
	if (heightRest)	{
		io->read_proc (input_buffer, sizeof (typename INFO::Block), inputLine, handle);
		// TODO: probably need some endian work here
		BYTE *pbSrc = (BYTE *)input_buffer;
		BYTE *pbDst = FreeImage_GetScanLine (dib, height - y - 1);

		if (width >= 4) {
			for (int x = 0; x < width; x += 4) {
				DecodeDXTBlock <DECODER> (pbDst, pbSrc,	line, 4, heightRest);
				pbSrc += INFO::bytesPerBlock;
				pbDst += 4 * 4;
			}
		}
		if (widthRest) {
			DecodeDXTBlock <DECODER> (pbDst, pbSrc,	line, widthRest, heightRest);
		}

	}
}

static FIBITMAP *
LoadDXT (int type, DDSURFACEDESC2 &desc, FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
	int width = (int)desc.dwWidth;
	int height = (int)desc.dwHeight;

	// allocate a 32-bit dib
	FIBITMAP *dib = FreeImage_Allocate (width, height, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
	if (dib == NULL)
		return NULL;

	int bpp = FreeImage_GetBPP (dib);
	int line = CalculateLine (width, bpp);
	BYTE *bits = FreeImage_GetBits (dib);

	// select the right decoder
	switch (type) {
		case 1:
			LoadDXT_Helper <DXT_BLOCKDECODER_1> (io, handle, page, flags, data, dib, bits, width, height, line);
			break;
		case 3:
			LoadDXT_Helper <DXT_BLOCKDECODER_3> (io, handle, page, flags, data, dib, bits, width, height, line);
			break;
		case 5:
			LoadDXT_Helper <DXT_BLOCKDECODER_5> (io, handle, page, flags, data, dib, bits, width, height, line);
			break;
	}
	
	return dib;
}
// ==========================================================
// Plugin Implementation
// ==========================================================

static const char * DLL_CALLCONV
Format() {
	return "DDS";
}

static const char * DLL_CALLCONV
Description() {
	return "DirectX Surface";
}

static const char * DLL_CALLCONV
Extension() {
	return "dds";
}

static const char * DLL_CALLCONV
RegExpr() {
	return NULL;
}

static const char * DLL_CALLCONV
MimeType() {
	return "image/freeimage-dds";
}

static BOOL DLL_CALLCONV
Validate(FreeImageIO *io, fi_handle handle) {
	DDSHEADER header;
	io->read_proc(&header, 1, sizeof(header), handle);
#ifdef FREEIMAGE_BIGENDIAN
	SwapHeader(&header);
#endif
	if (header.dwMagic != MAKEFOURCC ('D','D','S',' '))
		return FALSE;
	if (header.surfaceDesc.dwSize != sizeof (header.surfaceDesc) ||
		header.surfaceDesc.ddpfPixelFormat.dwSize != sizeof (header.surfaceDesc.ddpfPixelFormat))
		return FALSE;
	return TRUE;
}

static BOOL DLL_CALLCONV
SupportsExportDepth(int depth) {
	return FALSE;
}

static BOOL DLL_CALLCONV 
SupportsExportType(FREE_IMAGE_TYPE type) {
	return (type == FIT_BITMAP) ? TRUE : FALSE;
}

// ----------------------------------------------------------

static void * DLL_CALLCONV
Open(FreeImageIO *io, fi_handle handle, BOOL read) {
	return NULL;
}

static void DLL_CALLCONV
Close(FreeImageIO *io, fi_handle handle, void *data) {
}

// ----------------------------------------------------------

static FIBITMAP * DLL_CALLCONV
Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
	DDSHEADER header;
	FIBITMAP *dib = NULL;
	io->read_proc(&header, 1, sizeof(header), handle);
#ifdef FREEIMAGE_BIGENDIAN
	SwapHeader(&header);
#endif
	if (header.surfaceDesc.ddpfPixelFormat.dwFlags & DDPF_RGB) {
		dib = LoadRGB (header.surfaceDesc, io, handle, page, flags, data);
	}
	else if (header.surfaceDesc.ddpfPixelFormat.dwFlags & DDPF_FOURCC) {
		switch (header.surfaceDesc.ddpfPixelFormat.dwFourCC) {
			case FOURCC_DXT1:
				dib = LoadDXT (1, header.surfaceDesc, io, handle, page, flags, data);
				break;
			case FOURCC_DXT3:
				dib = LoadDXT (3, header.surfaceDesc, io, handle, page, flags, data);
				break;
			case FOURCC_DXT5:
				dib = LoadDXT (5, header.surfaceDesc, io, handle, page, flags, data);
				break;
		}
	}
	return dib;
}

static BOOL DLL_CALLCONV
Save(FreeImageIO *io, FIBITMAP *dib, fi_handle handle, int page, int flags, void *data) {
	return FALSE;
}

// ==========================================================
//   Init
// ==========================================================

void DLL_CALLCONV
InitDDS(Plugin *plugin, int format_id) {
	s_format_id = format_id;

	plugin->format_proc = Format;
	plugin->description_proc = Description;
	plugin->extension_proc = Extension;
	plugin->regexpr_proc = RegExpr;
	plugin->open_proc = Open;
	plugin->close_proc = Close;
	plugin->pagecount_proc = NULL;
	plugin->pagecapability_proc = NULL;
	plugin->load_proc = Load;
	plugin->save_proc = NULL;	//Save;	// not implemented (yet?)
	plugin->validate_proc = Validate;
	plugin->mime_proc = MimeType;
	plugin->supports_export_bpp_proc = SupportsExportDepth;
	plugin->supports_export_type_proc = SupportsExportType;
	plugin->supports_icc_profiles_proc = NULL;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
风流少妇一区二区| 欧美成人乱码一区二区三区| 日韩一区二区麻豆国产| 一区二区三区精品在线观看| 青草国产精品久久久久久| 在线精品视频一区二区三四| 国产精品国产三级国产aⅴ无密码| 国产精品996| 亚洲视频一二三| 国产在线不卡视频| 亚洲国产精品精华液ab| 国产盗摄一区二区| 国产视频一区在线观看| 看电影不卡的网站| 亚洲国产精品一区二区www| 日韩午夜激情av| 色哟哟在线观看一区二区三区| 日韩精品久久理论片| 国产拍揄自揄精品视频麻豆| 色狠狠av一区二区三区| 视频一区视频二区中文| 亚洲欧洲成人自拍| 久久天天做天天爱综合色| 欧美三级视频在线播放| 不卡的av在线播放| 日本成人在线看| 2023国产精品视频| 91精品国产综合久久久久久| 色网综合在线观看| 国产东北露脸精品视频| 日韩av中文字幕一区二区| 最新日韩在线视频| 欧美一区二区三区电影| 91香蕉国产在线观看软件| 国产精品自在欧美一区| 中文字幕中文字幕一区二区| 精品乱人伦一区二区三区| 欧美视频一区在线| 欧美午夜在线一二页| www.亚洲精品| 色婷婷综合激情| 欧美日韩你懂得| 欧美一区二区三区播放老司机| 欧美午夜理伦三级在线观看| 一本大道久久a久久综合婷婷| 99国产精品久| 色综合天天综合狠狠| 欧美一a一片一级一片| 91丨porny丨首页| 欧美丝袜丝交足nylons| 欧美久久久久免费| 欧美大片国产精品| 亚洲欧美激情一区二区| 亚洲国产欧美在线人成| 性久久久久久久久久久久| 久久精工是国产品牌吗| 久久99精品一区二区三区| 国产成人免费视频网站| 91久久精品午夜一区二区| 91成人免费网站| 7777精品久久久大香线蕉| 亚洲国产精品av| 秋霞电影一区二区| 欧美在线高清视频| 亚洲日本一区二区三区| 国产成人免费视频网站| 在线观看免费一区| 国产精品美女久久久久久| 中文字幕一区二区5566日韩| 亚洲国产精品综合小说图片区| 亚洲成人av一区二区| 91看片淫黄大片一级在线观看| 国产欧美精品一区| 午夜婷婷国产麻豆精品| 中文字幕一区二区三区四区不卡| 天天做天天摸天天爽国产一区| 国产福利一区二区三区视频在线| 91精品在线免费| 免费视频一区二区| 5566中文字幕一区二区电影| 亚洲成av人影院| 91精品国产91久久久久久一区二区| 一区二区在线看| 色哟哟国产精品免费观看| 亚洲美女区一区| 3d成人h动漫网站入口| 天堂成人免费av电影一区| 欧美日韩在线免费视频| 美腿丝袜亚洲色图| 中文字幕亚洲欧美在线不卡| 欧美中文字幕久久 | 裸体健美xxxx欧美裸体表演| 4438x亚洲最大成人网| 老司机午夜精品| ●精品国产综合乱码久久久久| 欧美视频一区在线观看| 国产精品综合av一区二区国产馆| 国产精品护士白丝一区av| 成人久久18免费网站麻豆| 日本一区二区久久| 91色porny在线视频| 丝袜亚洲另类欧美| 日韩毛片视频在线看| 欧美日韩国产天堂| 97精品国产97久久久久久久久久久久| 日韩激情一二三区| 国产精品国产三级国产a| 久久影院视频免费| 日韩一级片在线播放| 国产一区二区不卡老阿姨| 久久嫩草精品久久久久| 成人三级在线视频| 亚洲精品成人天堂一二三| 日韩成人av影视| 久久久国产午夜精品| 97se亚洲国产综合自在线不卡 | av综合在线播放| 国产一区二区不卡在线| 国产乱人伦精品一区二区在线观看 | 久久无码av三级| 免费看欧美女人艹b| 国产精品一级片在线观看| 成人激情开心网| 在线欧美一区二区| 日韩欧美在线观看一区二区三区| 欧美高清精品3d| youjizz久久| 国产黄色精品网站| 欧美aaa在线| 日韩美女视频在线| 在线观看亚洲a| 99国内精品久久| 6080亚洲精品一区二区| 国产视频一区二区在线| 国产iv一区二区三区| 蜜臀91精品一区二区三区| 香蕉加勒比综合久久| 亚洲福利电影网| 成人激情视频网站| 国产精品资源在线观看| 蜜臀久久久久久久| 国产日本欧美一区二区| 99国产精品一区| 成人性生交大片免费看在线播放| 中文字幕一区二区三中文字幕| 欧美一二三区在线| 精品久久久影院| 久久久精品一品道一区| 一本到高清视频免费精品| 91美女在线观看| 99麻豆久久久国产精品免费| 粉嫩av一区二区三区粉嫩| 成人综合在线视频| 色婷婷av一区二区三区大白胸| 欧美视频完全免费看| 日韩欧美在线一区二区三区| 免费精品视频最新在线| 美女在线一区二区| 成人动漫一区二区三区| 91免费视频网址| 欧美精品一区二区三区蜜桃视频| 欧美伊人久久大香线蕉综合69| 欧美一级久久久久久久大片| 久久日韩精品一区二区五区| 欧美亚洲动漫制服丝袜| 国产校园另类小说区| 一区二区三区在线观看动漫| 黄页网站大全一区二区| 欧美日韩一卡二卡三卡| 久久久久久免费网| 日本不卡123| 国内成+人亚洲+欧美+综合在线| 波多野结衣中文一区| 久久久精品蜜桃| 九九视频精品免费| 99久久久久久| 在线精品视频一区二区| 91亚洲永久精品| 亚洲特黄一级片| 91久久精品一区二区三区| 国产精品国产三级国产普通话99 | 另类小说视频一区二区| av不卡在线播放| 亚洲国产精品ⅴa在线观看| 91久久久免费一区二区| 麻豆国产精品一区二区三区| 亚洲丝袜自拍清纯另类| 91免费观看国产| 亚洲成人久久影院| 久久综合久久综合九色| 91成人在线观看喷潮| 成人精品免费网站| 亚洲午夜免费电影| 亚洲免费在线观看| 91在线porny国产在线看| 国产三区在线成人av| 国产 欧美在线| 亚洲成人激情av| 中文字幕日韩精品一区| 91视频在线看|