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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? icon.cpp.svn-base

?? wince c++ 下 開發的 rss 閱讀器源代碼
?? SVN-BASE
字號:
/**
 *  icon.cpp
 *
 *  Copyright (C) 2008  David Andrs <pda@jasnapaka.com>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#include "../StdAfx.h"
#include "../prssr.h"
#include "icon.h"
#include "../../share/file.h"

#ifdef MYDEBUG
#undef THIS_FILE
static TCHAR THIS_FILE[] = _T(__FILE__);
#include "../debug/crtdbg.h"
#define new MYDEBUG_NEW
#endif

#pragma pack(push, structs)
#pragma pack(1)

typedef struct IconDirectoryEntry {
	BYTE  bWidth;
	BYTE  bHeight;
	BYTE  bColorCount;
	BYTE  bReserved;
	WORD  wPlanes;
	WORD  wBitCount;
	DWORD dwBytesInRes;
	DWORD dwImageOffset;
} ICONDIRENTRY;

typedef struct ICONDIR {
	WORD          idReserved;
	WORD          idType;
	WORD          idCount;
} ICONHEADER;

#pragma pack(pop, structs)


HBITMAP ResizeBitmap(HBITMAP hBmp, WORD bitCount, int srcWd, int srcHt, int destWd, int destHt) {
	HDC srcDC = CreateCompatibleDC(NULL);
	HGDIOBJ oldSrc = SelectObject(srcDC, hBmp);

	HDC destDC = CreateCompatibleDC(NULL);
	BITMAPINFO bmi;
//	bmi.bmiHeader = bmpInfoHdr;
	bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = bitCount;
	bmi.bmiHeader.biWidth = destWd;
	bmi.bmiHeader.biHeight = destHt;
	void *pBits = NULL; 
	HBITMAP hbmResized = CreateDIBSection(destDC, &bmi, DIB_RGB_COLORS, &pBits, NULL, 0);
	HGDIOBJ oldDest = SelectObject(destDC, hbmResized);

	StretchBlt(destDC, 0, 0, destWd, destHt, srcDC, 0, 0, srcWd, srcHt, SRCCOPY);
/*	HBRUSH br;
	br = CreateSolidBrush(RGB(0x33, 0x66, 0x99));
	SelectObject(destDC, br);
	Rectangle(destDC, 0, 0, destWd, destHt);
*/
	SelectObject(srcDC, oldSrc);
	SelectObject(destDC, oldDest);

	DeleteDC(srcDC);
	DeleteDC(destDC);

	return hbmResized;
}

HICON DoIconLoad(BYTE *iconResData, ICONDIRENTRY &icon, int width, int height) {
	LOG0(5, "DoIconLoad");

	HICON hIcon = NULL;

	// header
	BYTE *icHeader = iconResData + 0;
	BITMAPINFOHEADER bmpInfoHdr;
	memcpy(&bmpInfoHdr, icHeader, sizeof(bmpInfoHdr));

	int pixels = icon.bWidth * icon.bHeight;
	RGBQUAD *icPalette = NULL;
	BYTE *icColor = NULL;
	BYTE *icMask = NULL;

	icColor = (iconResData + sizeof(bmpInfoHdr));
	if (bmpInfoHdr.biBitCount <= 8) {
		// palette
		int clrCount = 1 << bmpInfoHdr.biBitCount;
		icPalette = (RGBQUAD *) (icColor);

		icColor += clrCount * sizeof(RGBQUAD);
	}
	icMask = icColor + ((pixels * bmpInfoHdr.biBitCount) / 8);

	// read icon ////

	// convert to suitable format (RGB or RGBx)
	HBITMAP hbmColor;
	if (bmpInfoHdr.biBitCount == 8) {
		// convert from 256 colors to 24bpp
		BYTE *rgbData = new BYTE[3 * sizeof(BYTE) * pixels];

		int icIdx = 0;				// index in source data
		for (int row = 1; row <= icon.bHeight; row++) {
			int destIdx = 3 * (pixels - (row * icon.bWidth));

			for (int col = 0; col < icon.bWidth; col++) {
				RGBQUAD *rgb = icPalette + icColor[icIdx];

				rgbData[destIdx++] = rgb->rgbBlue;
				rgbData[destIdx++] = rgb->rgbGreen;
				rgbData[destIdx++] = rgb->rgbRed;

				icIdx++;
			}
		}

		hbmColor = CreateBitmap(icon.bWidth, icon.bHeight, 1, 24, rgbData);

		delete [] rgbData;
	}
	else if (bmpInfoHdr.biBitCount == 4) {
		// convert from 16 colors to 24bpp
		BYTE *rgbData = new BYTE[3 * sizeof(BYTE) * pixels];

		int icIdx = 0;				// index in source data
		for (int row = 1; row <= icon.bHeight; row++) {
			int destIdx = 3 * (pixels - (row * icon.bWidth));
			for (int col = 0; col < icon.bWidth; ) {
				RGBQUAD *rgb;

				rgb = icPalette + (icColor[icIdx] >> 4);
				rgbData[destIdx++] = rgb->rgbBlue;
				rgbData[destIdx++] = rgb->rgbGreen;
				rgbData[destIdx++] = rgb->rgbRed;
				col++;

				rgb = icPalette + (icColor[icIdx] & 0x0F);
				rgbData[destIdx++] = rgb->rgbBlue;
				rgbData[destIdx++] = rgb->rgbGreen;
				rgbData[destIdx++] = rgb->rgbRed;
				col++;

				icIdx++;
			}
		}

		hbmColor = CreateBitmap(icon.bWidth, icon.bHeight, 1, 24, rgbData);

		delete [] rgbData;
	}
	else {
		BYTE *rgbData = new BYTE[(pixels * bmpInfoHdr.biBitCount) / 8];

		// flip the bitmap data
		int rgbSz = bmpInfoHdr.biBitCount / 8;
		int rowBytes = icon.bWidth * rgbSz;			// no. of bytes on the row
		BYTE *src = icColor + 0;
		BYTE *dest = rgbData + (rgbSz * pixels) - rowBytes;
		for (int row = 0; row < icon.bHeight; row++) {
			memcpy(dest, src, rowBytes);
			dest -= rowBytes;
			src += rowBytes;
		}

		hbmColor = CreateBitmap(icon.bWidth, icon.bHeight, 1, rgbSz * 8, rgbData);

		delete [] rgbData;
	}

	// resize
	BOOL resize = FALSE;
	if (icon.bWidth != width || icon.bHeight != height) {
		resize = TRUE;
		HBITMAP hResized = ResizeBitmap(hbmColor, 24, icon.bWidth, icon.bHeight, width, height);
		DeleteObject(hbmColor);
		hbmColor = hResized;
	}

	// mask - for transparency
	HBITMAP hbmMask;
	if (icon.bWidth != width || icon.bHeight != height) {
		// resize the mask (from 16x16 to 32x32)
		int maskPixelsResized = (width * height) / 8;
		BYTE *maskResized = new BYTE [maskPixelsResized];
		memset(maskResized, 0, maskPixelsResized);

		int maskBytesPerRow = bmpInfoHdr.biWidth / 8;

		BYTE *src = icMask + 0;
		BYTE *dest = maskResized + maskPixelsResized - (2 * maskBytesPerRow);
		for (int row = 0; row < icon.bHeight; row++) {
			for (int j = 0; j < maskBytesPerRow; j++) {
				BYTE b = *(src + j);
				WORD w = 0;
				for (int k = 0; k < 8; k++) {
					if (b & (1 << k)) {
						w |= 3 << (2 * k);
					}
				}
				dest[2 * j] = (w >> 8) & 0xFF;
				dest[2 * j + 1] = w & 0xFF;
			}

			memcpy(dest - (2 * maskBytesPerRow), dest, 2 * maskBytesPerRow);

			dest -= 4 * maskBytesPerRow;
			src += 2 * maskBytesPerRow;
		}

		hbmMask = CreateBitmap(width, height, 1, 1, maskResized);
		delete [] maskResized;
	}
	else {
		int maskPixels = (icon.bWidth * icon.bHeight) / 8;

		// flip the mask
		BYTE *mask = new BYTE [maskPixels];
		memset(mask, 0x00, maskPixels);
		int maskBytesPerRow = icon.bWidth / 8;

		BYTE *src = icMask + 0;
		BYTE *dest = mask + maskPixels - maskBytesPerRow;
		for (int row = 0; row < icon.bHeight; row++) {
			memcpy(dest, src, maskBytesPerRow);
			dest -= maskBytesPerRow;
			src += 4; // 4 bytes per row in icon data for 16x16 and 32x32 icons
		}

		hbmMask = CreateBitmap(icon.bWidth, icon.bHeight, 1, 1, mask);
		delete [] mask;
	}

	// finally create the icon
	ICONINFO ii = { 0 };
	ii.fIcon = TRUE;
	ii.hbmMask = hbmMask;
	ii.hbmColor = hbmColor;
	hIcon = CreateIconIndirect(&ii);

//	LOG4(1, "mask: (%d x %d x %dbpp), hIcon = %d", bmpInfoHdr.biWidth, bmpInfoHdr.biHeight, bmpInfoHdr.biBitCount, hIcon);
//	LOG4(1, "(%d x %d x %dbpp), hIcon = %d", icon.bWidth, icon.bHeight, bmpInfoHdr.biBitCount, hIcon);

	DeleteObject(hbmMask);
	DeleteObject(hbmColor);

	return hIcon;
}

HICON LoadIconFromFile(LPCTSTR fileName, int width, int height) {
	LOG0(5, "LoadIconFromFile");

	HICON hIcon = NULL;
	CBufferedFile file;
	if (file.Create(fileName, GENERIC_READ, NULL, OPEN_EXISTING, 0)) {
		DWORD bytesRead;

		// read icon dir
		ICONHEADER iconHdr;
		if (file.Read(&iconHdr, sizeof(iconHdr), &bytesRead)) {
//			LOG1(1, "icon count: %d", iconHdr.idCount);
			ICONDIRENTRY *iconEntries = new ICONDIRENTRY [iconHdr.idCount];
			if (file.Read(iconEntries, iconHdr.idCount * sizeof(ICONDIRENTRY), &bytesRead)) {
				ICONDIRENTRY icon = { 0 };

				BOOL found = FALSE;
				// first pass (find the icon of exact size)
				for (int i = 0; i < iconHdr.idCount; i++) {
					if (iconEntries[i].bWidth == width && iconEntries[i].bHeight == height) {
//						LOG3(1, "wd = %d, ht = %d, bitcount = %d", iconEntries[i].bWidth, iconEntries[i].bHeight, iconEntries[i].wBitCount);
						if (iconEntries[i].wBitCount == 8) {
							icon = iconEntries[i];
							found = TRUE;
							break;
						}
						else if (iconEntries[i].wBitCount >= icon.wBitCount) {
							icon = iconEntries[i];
							found = TRUE;
						}
					}
				}

				// second pass (if icon not found in the first pass)
				if (!found) {
					for (int i = 0; i < iconHdr.idCount; i++) {
						if (iconEntries[i].bWidth == 16 && iconEntries[i].bHeight == 16) {
//							LOG3(1, "wd = %d, ht = %d, bitcount = %d", iconEntries[i].bWidth, iconEntries[i].bHeight, iconEntries[i].wBitCount);
							if (iconEntries[i].wBitCount == 8) {
								icon = iconEntries[i];
								found = TRUE;
								break;
							}
							else if (iconEntries[i].wBitCount >= icon.wBitCount) {
								icon = iconEntries[i];
								found = TRUE;
							}
						}
					}
				}

				// third pass (nothing found -> use the first icon)
/*				if (!found) {
					icon = iconEntries[0];
					found = TRUE;
				}
*/
				// create the icon
				if (found) {
//					LOG2(1, "ofs = %d, len = %d", icon.dwImageOffset, icon.dwBytesInRes);
					file.Seek(icon.dwImageOffset, FILE_BEGIN);
					
					DWORD bytesRead;
					BYTE *iconData = new BYTE [icon.dwBytesInRes];
					if (file.Read(iconData, icon.dwBytesInRes, &bytesRead)) {
//						LOG1(1, "read = %d", bytesRead);
						
//						LOG3(1, "wd = %d, ht = %d, bitcount = %d", icon.bWidth, icon.bHeight, icon.wBitCount);
						hIcon = DoIconLoad(iconData, icon, width, height);
					}

					delete [] iconData;
				}
			}		
			delete [] iconEntries;
		}

		file.Close();
	}

	return hIcon;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产乱理伦片在线观看夜一区| 亚洲一区二区三区美女| 蜜臀精品一区二区三区在线观看 | 日韩午夜三级在线| 激情都市一区二区| 在线免费观看一区| 亚洲第一成人在线| 欧美xxx久久| 成人一区二区三区中文字幕| 欧美videos中文字幕| 国产成人夜色高潮福利影视| 国产精品网曝门| 欧美写真视频网站| 亚洲黄网站在线观看| 欧美不卡在线视频| 99精品一区二区三区| 日韩va亚洲va欧美va久久| 亚洲精品一区在线观看| 91麻豆swag| 国产一区二区中文字幕| 亚洲国产中文字幕在线视频综合 | 精品欧美一区二区在线观看| 成人免费视频app| 日本sm残虐另类| 亚洲一区二区视频在线| 日本一区二区三区四区在线视频 | 欧美精品在线观看一区二区| 91毛片在线观看| 色综合久久综合网欧美综合网| 国产精品伊人色| 国产成人综合网| 国产精品一卡二| av成人免费在线观看| 91在线视频播放地址| 91色九色蝌蚪| 欧美日韩一区二区在线观看视频| 91小视频在线免费看| 欧美久久婷婷综合色| 欧美一级一区二区| 国产精品视频一二三| 亚洲柠檬福利资源导航| 手机精品视频在线观看| 国产一区日韩二区欧美三区| 99精品桃花视频在线观看| 欧美电影影音先锋| 久久蜜桃一区二区| 一区二区三区蜜桃| 日韩电影免费一区| 91高清视频在线| 91麻豆精品国产91久久久使用方法 | 国产成人aaaa| 91精品免费在线| 日本亚洲一区二区| 欧美色大人视频| 日本一区二区三区在线不卡 | 五月天国产精品| 91久久精品一区二区三区| 久久久久久久精| 国产一区二区三区日韩| 91精品国产入口| 日韩精彩视频在线观看| 欧美三级午夜理伦三级中视频| 中文字幕av一区 二区| 成人国产电影网| 国产欧美一区二区精品久导航| 麻豆精品在线观看| 欧美一区二区三区视频| 日韩av午夜在线观看| 91精品国产福利在线观看| 亚洲成av人片一区二区梦乃 | 欧美制服丝袜第一页| 亚洲成人你懂的| 欧美精品久久99| 蜜臀av性久久久久av蜜臀妖精| 欧美日韩亚洲另类| 久久99久国产精品黄毛片色诱| 日韩欧美国产三级电影视频| 国产剧情av麻豆香蕉精品| 国产日韩欧美激情| 日本高清视频一区二区| 视频在线观看91| 日韩精品一区二区三区三区免费| 美脚の诱脚舐め脚责91| 国产日产欧美一区二区视频| 99九九99九九九视频精品| 蜜桃久久精品一区二区| 中文字幕制服丝袜一区二区三区| 色婷婷久久一区二区三区麻豆| 丝袜脚交一区二区| 中文字幕一区二区三| 9191成人精品久久| 成人国产亚洲欧美成人综合网| 亚洲h在线观看| 国产精品久久久久久户外露出| 欧美日韩免费电影| 成人av动漫网站| 国产精品夜夜嗨| 免费高清在线视频一区·| 自拍偷在线精品自拍偷无码专区| 欧美一区二区黄色| 欧美视频日韩视频在线观看| 国产成人精品亚洲午夜麻豆| 久久福利资源站| 免费久久精品视频| 亚洲va欧美va人人爽午夜| 亚洲色图丝袜美腿| 亚洲日本一区二区三区| 久久久影视传媒| 久久久国产午夜精品| 日韩欧美美女一区二区三区| 欧美猛男超大videosgay| 制服.丝袜.亚洲.另类.中文| 在线观看亚洲一区| 欧美日韩精品一区二区| 3atv一区二区三区| 日韩久久久久久| 国产女同互慰高潮91漫画| 日本一区二区不卡视频| 久久先锋影音av鲁色资源网| 欧美岛国在线观看| 久久婷婷国产综合精品青草| 日韩欧美亚洲另类制服综合在线| 欧美精品v国产精品v日韩精品| 美国十次综合导航| 高清日韩电视剧大全免费| 精品一区二区三区蜜桃| 国产99精品国产| 一本一本大道香蕉久在线精品| 欧美天堂亚洲电影院在线播放| 国产v综合v亚洲欧| 91免费视频观看| 欧美剧在线免费观看网站| 欧美做爰猛烈大尺度电影无法无天| 色视频欧美一区二区三区| 51久久夜色精品国产麻豆| 日韩西西人体444www| 久久久久久电影| 一区二区三区免费网站| 激情图区综合网| 91香蕉国产在线观看软件| 欧美一区二区观看视频| 久久中文字幕电影| 亚洲色图一区二区| 久久国产精品第一页| 欧美色网一区二区| 国产无人区一区二区三区| 午夜国产精品影院在线观看| 懂色一区二区三区免费观看| 精品视频在线免费看| 国产精品毛片久久久久久| 久久激情五月婷婷| 欧美日本在线看| 亚洲国产经典视频| 激情六月婷婷久久| 久久伊人蜜桃av一区二区| 亚洲国产视频一区二区| 丁香亚洲综合激情啪啪综合| 精品美女在线播放| 亚洲国产综合色| 欧洲精品中文字幕| 视频一区欧美日韩| 欧美放荡的少妇| 蜜桃91丨九色丨蝌蚪91桃色| 成人激情免费网站| 国产精品久久一卡二卡| 国产suv精品一区二区三区| 色一情一伦一子一伦一区| 亚洲日本免费电影| 欧美伊人久久久久久久久影院 | 欧美日韩电影在线| 日韩高清一区二区| 国产欧美一区二区精品忘忧草 | 亚洲国产成人在线| 99精品视频在线播放观看| 亚洲三级电影网站| 欧美日韩一区高清| 亚洲第一成人在线| 另类调教123区| 欧美va亚洲va香蕉在线| 成人性生交大片免费看中文| 久久久久久亚洲综合| 欧美色综合久久| 精品在线播放免费| 国产精品日日摸夜夜摸av| 51精品国自产在线| 99精品久久99久久久久| 国产精品成人一区二区艾草 | 精品嫩草影院久久| 色综合久久久久综合99| 国产一区不卡在线| 综合激情成人伊人| 久久综合999| 日韩欧美在线观看一区二区三区| 麻豆视频观看网址久久| 亚洲午夜久久久久久久久电影院| 久久精品一区蜜桃臀影院| 91女厕偷拍女厕偷拍高清| 国产suv精品一区二区6| 国产真实乱偷精品视频免| 午夜视频一区二区|