file_bitmap.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:3k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * file_bitmap.cpp
  3.  *****************************************************************************
  4.  * Copyright (C) 2003 the VideoLAN team
  5.  * $Id: 1724b49844ff19b00cf25b3ee242c09c8c86dd68 $
  6.  *
  7.  * Authors: Cyril Deguet     <asmax@via.ecp.fr>
  8.  *          Olivier Teulière <ipkiss@via.ecp.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. #ifdef HAVE_CONFIG_H
  25. # include "config.h"
  26. #endif
  27. #include <vlc_common.h>
  28. #include "vlc_image.h"
  29. #include "file_bitmap.hpp"
  30. FileBitmap::FileBitmap( intf_thread_t *pIntf, image_handler_t *pImageHandler,
  31.                         string fileName, uint32_t aColor, int nbFrames,
  32.                         int fps ):
  33.     GenericBitmap( pIntf, nbFrames, fps ), m_width( 0 ), m_height( 0 ),
  34.     m_pData( NULL )
  35. {
  36.     video_format_t fmt_in = {0}, fmt_out = {0};
  37.     picture_t *pPic;
  38.     fmt_out.i_chroma = VLC_FOURCC('R','G','B','A');
  39.     pPic = image_ReadUrl( pImageHandler, fileName.c_str(), &fmt_in, &fmt_out );
  40.     if( !pPic ) return;
  41.     m_width = fmt_out.i_width;
  42.     m_height = fmt_out.i_height;
  43.     m_pData = new uint8_t[m_height * m_width * 4];
  44.     // Compute the alpha layer
  45.     uint8_t *pData = m_pData, *pSrc = pPic->p->p_pixels;
  46.     for( int y = 0; y < m_height; y++ )
  47.     {
  48.         for( int x = 0; x < m_width; x++ )
  49.         {
  50.             uint32_t r = *pSrc++;
  51.             uint32_t g = *pSrc++;
  52.             uint32_t b = *pSrc++;
  53.             uint8_t  a = *pSrc++;
  54.             *(pData++) = b * a / 255;
  55.             *(pData++) = g * a / 255;
  56.             *(pData++) = r * a / 255;
  57.             // Transparent pixel ?
  58.             if( aColor == (r<<16 | g<<8 | b) )
  59.             {
  60.                 *pData = 0;
  61.             }
  62.             else
  63.             {
  64.                 *pData = a;
  65.             }
  66.             pData++;
  67.         }
  68.         pSrc += pPic->p->i_pitch - m_width * 4;
  69.     }
  70.     picture_Release( pPic );
  71.     return;
  72. }
  73. FileBitmap::~FileBitmap()
  74. {
  75.     if( m_pData ) delete[] m_pData;
  76. }
  77. uint8_t *FileBitmap::getData() const
  78. {
  79.     if( m_pData == NULL )
  80.     {
  81.         msg_Warn( getIntf(), "FileBitmap::getData() returns NULL" );
  82.     }
  83.     return m_pData;
  84. }