svnno****@sourc*****
svnno****@sourc*****
2011年 8月 13日 (土) 17:26:34 JST
Revision: 4578 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4578 Author: yutakapon Date: 2011-08-13 17:26:34 +0900 (Sat, 13 Aug 2011) Log Message: ----------- OleLoadPicture() ã§èªã¿è¾¼ãã BITMAPãã¹ãã¬ããï¼æ¡å¤§ã»ç¸®å°ï¼ã§ããããã«ããã Modified Paths: -------------- trunk/doc/en/html/about/history.html trunk/doc/ja/html/about/history.html trunk/teraterm/teraterm/vtdisp.c -------------- next part -------------- Modified: trunk/doc/en/html/about/history.html =================================================================== --- trunk/doc/en/html/about/history.html 2011-08-05 01:10:12 UTC (rev 4577) +++ trunk/doc/en/html/about/history.html 2011-08-13 08:26:34 UTC (rev 4578) @@ -45,6 +45,7 @@ <li>added the second argument as the converted string on the strspecial command.</li> </ul></li> <li>added the "<a href="../macro/command/expandenv.html">expandenv</a>" macro command.</li> + <li>Eterm look-feel: The wallpaper file format can support any format other than BMP on Windows Vista or later.</li> </ul> </li> Modified: trunk/doc/ja/html/about/history.html =================================================================== --- trunk/doc/ja/html/about/history.html 2011-08-05 01:10:12 UTC (rev 4577) +++ trunk/doc/ja/html/about/history.html 2011-08-13 08:26:34 UTC (rev 4578) @@ -45,6 +45,7 @@ <li>Ï··é¶ñð strspecial R}hÉAæ2øƵÄwèÅ«éæ¤Éµ½B</li> </ul></li> <li>}NR}h "<a href="../macro/command/expandenv.html">expandenv</a>" ðÇÁµ½B</li> + <li>Eterm look-feel: Windows VistaÈ~ɨ¢ÄAǪBMP`®ÈOÉàε½B</li> </ul> </li> Modified: trunk/teraterm/teraterm/vtdisp.c =================================================================== --- trunk/teraterm/teraterm/vtdisp.c 2011-08-05 01:10:12 UTC (rev 4577) +++ trunk/teraterm/teraterm/vtdisp.c 2011-08-13 08:26:34 UTC (rev 4578) @@ -680,54 +680,171 @@ return (hBitmap); } -void BGPreloadWallpaper(BGSrc *src) +// ü`â®@ÉæèärIN¾Érbg}bvðgåEk¬·éB +// Windows 9x/NTÎ +// cf.http://katahiromz.web.fc2.com/win32/bilinear.html +static HBITMAP CreateStretched32BppBitmapBilinear(HBITMAP hbm, INT cxNew, INT cyNew) { - HBITMAP hbm; - WallpaperInfo wi; - OSVERSIONINFO osvi; + INT ix, iy, x0, y0, x1, y1; + DWORD x, y; + BITMAP bm; + HBITMAP hbmNew; + HDC hdc; + BITMAPINFO bi; + BYTE *pbNewBits, *pbBits, *pbNewLine, *pbLine0, *pbLine1; + DWORD wfactor, hfactor; + DWORD ex0, ey0, ex1, ey1; + DWORD r0, g0, b0, a0, r1, g1, b1, a1; + DWORD c00, c01, c10, c11; + LONG nWidthBytes, nWidthBytesNew; + BOOL fAlpha; - BGGetWallpaperInfo(&wi); + if (GetObject(hbm, sizeof(BITMAP), &bm) == 0) + return NULL; - //ÇðÇÝÝ - //LR_CREATEDIBSECTION ðwè·é̪Rc - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - if (osvi.dwMajorVersion < 6) { - if (wi.pattern == BG_STRETCH) { - hbm = LoadImage(0,wi.filename,IMAGE_BITMAP,CRTWidth,CRTHeight,LR_LOADFROMFILE | LR_CREATEDIBSECTION); + hbmNew = NULL; + hdc = CreateCompatibleDC(NULL); + if (hdc != NULL) + { + nWidthBytes = bm.bmWidth * 4; + ZeroMemory(&bi, sizeof(BITMAPINFOHEADER)); + bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + bi.bmiHeader.biWidth = bm.bmWidth; + bi.bmiHeader.biHeight = bm.bmHeight; + bi.bmiHeader.biPlanes = 1; + bi.bmiHeader.biBitCount = 32; + fAlpha = (bm.bmBitsPixel == 32); + pbBits = (BYTE *)HeapAlloc(GetProcessHeap(), 0, + nWidthBytes * bm.bmHeight); + if (pbBits == NULL) + return NULL; + GetDIBits(hdc, hbm, 0, bm.bmHeight, pbBits, &bi, DIB_RGB_COLORS); + bi.bmiHeader.biWidth = cxNew; + bi.bmiHeader.biHeight = cyNew; + hbmNew = CreateDIBSection(hdc, &bi, DIB_RGB_COLORS, + (VOID **)&pbNewBits, NULL, 0); + if (hbmNew != NULL) + { + nWidthBytesNew = cxNew * 4; + wfactor = (bm.bmWidth << 8) / cxNew; + hfactor = (bm.bmHeight << 8) / cyNew; + if (!fAlpha) + a0 = 255; + for(iy = 0; iy < cyNew; iy++) + { + y = hfactor * iy; + y0 = y >> 8; + y1 = min(y0 + 1, (INT)bm.bmHeight - 1); + ey1 = y & 0xFF; + ey0 = 0x100 - ey1; + pbNewLine = pbNewBits + iy * nWidthBytesNew; + pbLine0 = pbBits + y0 * nWidthBytes; + pbLine1 = pbBits + y1 * nWidthBytes; + for(ix = 0; ix < cxNew; ix++) + { + x = wfactor * ix; + x0 = x >> 8; + x1 = min(x0 + 1, (INT)bm.bmWidth - 1); + ex1 = x & 0xFF; + ex0 = 0x100 - ex1; + c00 = ((LPDWORD)pbLine0)[x0]; + c01 = ((LPDWORD)pbLine1)[x0]; + c10 = ((LPDWORD)pbLine0)[x1]; + c11 = ((LPDWORD)pbLine1)[x1]; + + b0 = ((ex0 * (c00 & 0xFF)) + + (ex1 * (c10 & 0xFF))) >> 8; + b1 = ((ex0 * (c01 & 0xFF)) + + (ex1 * (c11 & 0xFF))) >> 8; + g0 = ((ex0 * ((c00 >> 8) & 0xFF)) + + (ex1 * ((c10 >> 8) & 0xFF))) >> 8; + g1 = ((ex0 * ((c01 >> 8) & 0xFF)) + + (ex1 * ((c11 >> 8) & 0xFF))) >> 8; + r0 = ((ex0 * ((c00 >> 16) & 0xFF)) + + (ex1 * ((c10 >> 16) & 0xFF))) >> 8; + r1 = ((ex0 * ((c01 >> 16) & 0xFF)) + + (ex1 * ((c11 >> 16) & 0xFF))) >> 8; + b0 = (ey0 * b0 + ey1 * b1) >> 8; + g0 = (ey0 * g0 + ey1 * g1) >> 8; + r0 = (ey0 * r0 + ey1 * r1) >> 8; + + if (fAlpha) + { + a0 = ((ex0 * ((c00 >> 24) & 0xFF)) + + (ex1 * ((c10 >> 24) & 0xFF))) >> 8; + a1 = ((ex0 * ((c01 >> 24) & 0xFF)) + + (ex1 * ((c11 >> 24) & 0xFF))) >> 8; + a0 = (ey0 * a0 + ey1 * a1) >> 8; + } + ((LPDWORD)pbNewLine)[ix] = + MAKELONG(MAKEWORD(b0, g0), MAKEWORD(r0, a0)); + } + } + } + HeapFree(GetProcessHeap(), 0, pbBits); + DeleteDC(hdc); } - else { - hbm = LoadImage(0,wi.filename,IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE); - } - } - else { - if (wi.pattern == BG_STRETCH) { - hbm = LoadImage(0,wi.filename,IMAGE_BITMAP,CRTWidth,CRTHeight,LR_LOADFROMFILE | LR_CREATEDIBSECTION); - // TODO: æðæÊ¢ÁÏ¢Égå·éÉÍAǤµ½ç梩H - } - else { - //hbm = LoadImage(0,wi.filename,IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE); - hbm = GetBitmapHandle(wi.filename); - } - } + return hbmNew; +} - //ÇDCðìé - if(hbm) - { - BITMAP bm; +void BGPreloadWallpaper(BGSrc *src) +{ +//#define DEBUG_XP + HBITMAP hbm; + WallpaperInfo wi; + OSVERSIONINFO osvi; - GetObject(hbm,sizeof(bm),&bm); + BGGetWallpaperInfo(&wi); - src->hdc = CreateBitmapDC(hbm); - src->width = bm.bmWidth; - src->height = bm.bmHeight; - src->pattern = wi.pattern; +#ifdef DEBUG_XP + strcpy(wi.filename, "c:\\usr\\ttssh2\\1011_01.jpg"); +#endif - }else{ - src->hdc = NULL; - } + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osvi); +#ifdef DEBUG_XP + osvi.dwMajorVersion = 7; +#endif + if (osvi.dwMajorVersion < 6) { + //ÇðÇÝÝ + //LR_CREATEDIBSECTION ðwè·é̪Rc + if (wi.pattern == BG_STRETCH) { + hbm = LoadImage(0,wi.filename,IMAGE_BITMAP,CRTWidth,CRTHeight,LR_LOADFROMFILE | LR_CREATEDIBSECTION); + } + else { + hbm = LoadImage(0,wi.filename,IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE); + } + } + else { + hbm = GetBitmapHandle(wi.filename); - src->color = GetSysColor(COLOR_DESKTOP); +#ifdef DEBUG_XP + wi.pattern = BG_STRETCH; +#endif + if (wi.pattern == BG_STRETCH) { + HBITMAP newhbm = CreateStretched32BppBitmapBilinear(hbm, CRTWidth, CRTHeight); + DeleteObject(hbm); + hbm = newhbm; + } + } + + //ÇDCðìé + if(hbm) + { + BITMAP bm; + + GetObject(hbm,sizeof(bm),&bm); + + src->hdc = CreateBitmapDC(hbm); + src->width = bm.bmWidth; + src->height = bm.bmHeight; + src->pattern = wi.pattern; + + }else{ + src->hdc = NULL; + } + + src->color = GetSysColor(COLOR_DESKTOP); } void BGPreloadSrc(BGSrc *src)