win32_bitmap.cpp

来自「VLC媒体播放程序」· C++ 代码 · 共 194 行

CPP
194
字号
/***************************************************************************** * win32_bitmap.cpp: Win32 implementation of the Bitmap class ***************************************************************************** * Copyright (C) 2003 VideoLAN * $Id: win32_bitmap.cpp,v 1.6 2003/04/29 12:54:57 gbazin Exp $ * * Authors: Olivier Teuli鑢e <ipkiss@via.ecp.fr> *          Emmanuel Puig    <karibu@via.ecp.fr> * * 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, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, * USA. *****************************************************************************/#ifdef WIN32//--- WIN32 -----------------------------------------------------------------#define WINVER  0x0500#include <windows.h>//--- VLC -------------------------------------------------------------------#include <vlc/intf.h>//--- SKIN ------------------------------------------------------------------#include "../os_api.h"#include "../src/graphics.h"#include "win32_graphics.h"#include "../src/bitmap.h"#include "win32_bitmap.h"#include "../src/skin_common.h"//---------------------------------------------------------------------------//   Win32Bitmap//---------------------------------------------------------------------------Win32Bitmap::Win32Bitmap( intf_thread_t *p_intf, string FileName, int AColor )    : Bitmap( p_intf, FileName, AColor ){    HBITMAP HBitmap;    HBITMAP HBuf;    BITMAP  Bmp;    HDC     bufDC;    // Create image from file if it exists    HBitmap = (HBITMAP) LoadImage( NULL, FileName.c_str(), IMAGE_BITMAP,                                   0, 0, LR_LOADFROMFILE );    if( HBitmap == NULL )    {        if( FileName != "" )            msg_Warn( p_intf, "Couldn't load bitmap: %s", FileName.c_str() );        HBitmap = CreateBitmap( 0, 0, 1, 32, NULL );    }    // Create device context    bmpDC   = CreateCompatibleDC( NULL );    SelectObject( bmpDC, HBitmap );    // Get size of image    GetObject( HBitmap, sizeof( Bmp ), &Bmp );    Width  = Bmp.bmWidth;    Height = Bmp.bmHeight;    // If alpha color is not 0, then change 0 color to non black color to avoid    // window transparency    if( (int)AlphaColor != OSAPI_GetNonTransparentColor( 0 ) )    {        bufDC = CreateCompatibleDC( bmpDC );        HBuf = CreateCompatibleBitmap( bmpDC, Width, Height );        SelectObject( bufDC, HBuf );        LPRECT r = new RECT;        HBRUSH Brush = CreateSolidBrush( OSAPI_GetNonTransparentColor( 0 ) );        r->left   = 0;        r->top    = 0;        r->right  = Width;        r->bottom = Height;        FillRect( bufDC, r, Brush );        DeleteObject( Brush );        delete r;        if( p_intf->p_sys->TransparentBlt && IS_WINNT )        {            // This function contains a memory leak on win95/win98            p_intf->p_sys->TransparentBlt( bufDC, 0, 0, Width, Height,                                           bmpDC, 0, 0, Width, Height, 0 );        }        else        {            BitBlt( bufDC, 0, 0, Width, Height, bmpDC, 0, 0, SRCCOPY );        }        BitBlt( bmpDC, 0, 0, Width, Height, bufDC, 0, 0, SRCCOPY );        DeleteDC( bufDC );        DeleteObject( HBuf );    }    // Delete objects    DeleteObject( HBitmap );}//---------------------------------------------------------------------------Win32Bitmap::Win32Bitmap( intf_thread_t *p_intf, Graphics *from, int x, int y,    int w, int h, int AColor ) : Bitmap( p_intf, from, x, y, w, h, AColor ){    Width  = w;    Height = h;    AlphaColor = AColor;    HBITMAP HBmp;    HDC fromDC = ( (Win32Graphics *)from )->GetImageHandle();    // Create image    bmpDC = CreateCompatibleDC( fromDC );    HBmp  = CreateCompatibleBitmap( fromDC, Width, Height );    SelectObject( bmpDC, HBmp );    DeleteObject( HBmp );    BitBlt( bmpDC, 0, 0, Width, Height, fromDC, x, y, SRCCOPY );}//---------------------------------------------------------------------------Win32Bitmap::Win32Bitmap( intf_thread_t *p_intf, Bitmap *c )    : Bitmap( p_intf, c ){    HBITMAP HBuf;    // Copy attibutes    c->GetSize( Width, Height );    AlphaColor = c->GetAlphaColor();    // Copy bmpDC    bmpDC = CreateCompatibleDC( NULL );    HBuf  = CreateCompatibleBitmap( bmpDC, Width, Height );    SelectObject( bmpDC, HBuf );    BitBlt( bmpDC, 0, 0, Width, Height, ( (Win32Bitmap *)c )->GetBmpDC(),            0, 0, SRCCOPY );    DeleteObject( HBuf );}//---------------------------------------------------------------------------Win32Bitmap::~Win32Bitmap(){    DeleteDC( bmpDC );}//---------------------------------------------------------------------------void Win32Bitmap::DrawBitmap( int x, int y, int w, int h, int xRef, int yRef,                              Graphics *dest ){    HDC destDC = ( (Win32Graphics *)dest )->GetImageHandle();    if( p_intf->p_sys->TransparentBlt && IS_WINNT )    {        // This function contains a memory leak on win95/win98        p_intf->p_sys->TransparentBlt( destDC, xRef, yRef, w, h,                                       bmpDC, x, y, w, h, AlphaColor );    }    else    {        BitBlt( destDC, xRef, yRef, w, h, bmpDC, x, y, SRCCOPY );    }}//---------------------------------------------------------------------------bool Win32Bitmap::Hit( int x, int y){    unsigned int c = GetPixel( bmpDC, x, y );    if( c == AlphaColor || c == CLR_INVALID )        return false;    else        return true;}//---------------------------------------------------------------------------int Win32Bitmap::GetBmpPixel( int x, int y ){    return GetPixel( bmpDC, x, y );}//---------------------------------------------------------------------------void Win32Bitmap::SetBmpPixel( int x, int y, int color ){    SetPixelV( bmpDC, x, y, color );}//---------------------------------------------------------------------------#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?