⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agg_platform_support.cpp

📁 gnash 在pc和嵌入式下开发需要的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//----------------------------------------------------------------------------// Anti-Grain Geometry (AGG) - Version 2.5// A high quality rendering engine for C++// Copyright (C) 2002-2006 Maxim Shemanarev// Copyright (C) 2004 Mauricio Piacentini (SDL Support)// Contact: mcseem@antigrain.com//          mcseemagg@yahoo.com//          http://antigrain.com// // AGG 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.// // AGG 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 AGG; if not, write to the Free Software// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, // MA 02110-1301, USA.//----------------------------------------------------------------------------#include <string.h>#include "platform/agg_platform_support.h"#include "SDL.h"#include "SDL_byteorder.h"namespace agg{    //------------------------------------------------------------------------    class platform_specific    {    public:        platform_specific(pix_format_e format, bool flip_y);        ~platform_specific();        pix_format_e  m_format;        pix_format_e  m_sys_format;        bool          m_flip_y;        unsigned      m_bpp;        unsigned      m_sys_bpp;        unsigned      m_rmask;        unsigned      m_gmask;        unsigned      m_bmask;        unsigned      m_amask;        bool          m_update_flag;        bool          m_resize_flag;        bool          m_initialized;        SDL_Surface*  m_surf_screen;        SDL_Surface*  m_surf_window;        SDL_Surface*  m_surf_img[platform_support::max_images];        int           m_cur_x;        int           m_cur_y;	int          m_sw_start;    };    //------------------------------------------------------------------------    platform_specific::platform_specific(pix_format_e format, bool flip_y) :        m_format(format),        m_sys_format(pix_format_undefined),        m_flip_y(flip_y),        m_bpp(0),        m_sys_bpp(0),        m_update_flag(true),         m_resize_flag(true),        m_initialized(false),        m_surf_screen(0),        m_surf_window(0),        m_cur_x(0),        m_cur_y(0)    {        memset(m_surf_img, 0, sizeof(m_surf_img));        switch(m_format)        {			case pix_format_gray8:            m_bpp = 8;            break;        case pix_format_rgb565:            m_rmask = 0xF800;            m_gmask = 0x7E0;            m_bmask = 0x1F;            m_amask = 0;            m_bpp = 16;            break;        case pix_format_rgb555:            m_rmask = 0x7C00;            m_gmask = 0x3E0;            m_bmask = 0x1F;            m_amask = 0;            m_bpp = 16;            break;			#if SDL_BYTEORDER == SDL_LIL_ENDIAN        case pix_format_rgb24:			m_rmask = 0xFF;            m_gmask = 0xFF00;            m_bmask = 0xFF0000;            m_amask = 0;            m_bpp = 24;            break;        case pix_format_bgr24:            m_rmask = 0xFF0000;            m_gmask = 0xFF00;            m_bmask = 0xFF;            m_amask = 0;            m_bpp = 24;            break;        case pix_format_bgra32:            m_rmask = 0xFF0000;            m_gmask = 0xFF00;            m_bmask = 0xFF;            m_amask = 0xFF000000;            m_bpp = 32;            break;        case pix_format_abgr32:            m_rmask = 0xFF000000;            m_gmask = 0xFF0000;            m_bmask = 0xFF00;            m_amask = 0xFF;            m_bpp = 32;            break;        case pix_format_argb32:            m_rmask = 0xFF00;            m_gmask = 0xFF0000;            m_bmask = 0xFF000000;            m_amask = 0xFF;            m_bpp = 32;            break;        case pix_format_rgba32:            m_rmask = 0xFF;            m_gmask = 0xFF00;            m_bmask = 0xFF0000;            m_amask = 0xFF000000;            m_bpp = 32;            break;#else //SDL_BIG_ENDIAN (PPC)        case pix_format_rgb24:			m_rmask = 0xFF0000;            m_gmask = 0xFF00;            m_bmask = 0xFF;            m_amask = 0;            m_bpp = 24;            break;        case pix_format_bgr24:            m_rmask = 0xFF;            m_gmask = 0xFF00;            m_bmask = 0xFF0000;            m_amask = 0;            m_bpp = 24;            break;        case pix_format_bgra32:            m_rmask = 0xFF00;            m_gmask = 0xFF0000;            m_bmask = 0xFF000000;            m_amask = 0xFF;            m_bpp = 32;            break;        case pix_format_abgr32:            m_rmask = 0xFF;            m_gmask = 0xFF00;            m_bmask = 0xFF0000;            m_amask = 0xFF000000;            m_bpp = 32;            break;        case pix_format_argb32:            m_rmask = 0xFF0000;            m_gmask = 0xFF00;            m_bmask = 0xFF;            m_amask = 0xFF000000;            m_bpp = 32;            break;        case pix_format_rgba32:            m_rmask = 0xFF000000;            m_gmask = 0xFF0000;            m_bmask = 0xFF00;            m_amask = 0xFF;            m_bpp = 32;            break;#endif        }    }    //------------------------------------------------------------------------    platform_specific::~platform_specific()    {        int i;        for(i = platform_support::max_images - 1; i >= 0; --i)        {            if(m_surf_img[i]) SDL_FreeSurface(m_surf_img[i]);        }        if(m_surf_window) SDL_FreeSurface(m_surf_window);        if(m_surf_screen) SDL_FreeSurface(m_surf_screen);    }    //------------------------------------------------------------------------    platform_support::platform_support(pix_format_e format, bool flip_y) :        m_specific(new platform_specific(format, flip_y)),        m_format(format),        m_bpp(m_specific->m_bpp),        m_window_flags(0),        m_wait_mode(true),        m_flip_y(flip_y)    {        SDL_Init(SDL_INIT_VIDEO);        strcpy(m_caption, "Anti-Grain Geometry Application");    }    //------------------------------------------------------------------------    platform_support::~platform_support()    {        delete m_specific;    }    //------------------------------------------------------------------------    void platform_support::caption(const char* cap)    {        strcpy(m_caption, cap);        if(m_specific->m_initialized)        {            SDL_WM_SetCaption(cap, 0);        }    }        //------------------------------------------------------------------------    bool platform_support::init(unsigned width, unsigned height, unsigned flags)    {        m_window_flags = flags;        unsigned wflags = SDL_SWSURFACE;        if(m_window_flags & window_hw_buffer)        {            wflags = SDL_HWSURFACE;        }        if(m_window_flags & window_resize)        {            wflags |= SDL_RESIZABLE;        }        if(m_specific->m_surf_screen) SDL_FreeSurface(m_specific->m_surf_screen);        m_specific->m_surf_screen = SDL_SetVideoMode(width, height, m_bpp, wflags);        if(m_specific->m_surf_screen == 0)         {            fprintf(stderr,                     "Unable to set %dx%d %d bpp video: %s\n",                     width,                     height,                     m_bpp,                     ::SDL_GetError());            return false;        }        SDL_WM_SetCaption(m_caption, 0);        if(m_specific->m_surf_window) SDL_FreeSurface(m_specific->m_surf_window);        m_specific->m_surf_window =             SDL_CreateRGBSurface(SDL_HWSURFACE,                                  m_specific->m_surf_screen->w,                                  m_specific->m_surf_screen->h,                                 m_specific->m_surf_screen->format->BitsPerPixel,                                 m_specific->m_rmask,                                  m_specific->m_gmask,                                  m_specific->m_bmask,                                  m_specific->m_amask);        if(m_specific->m_surf_window == 0)         {            fprintf(stderr,                     "Unable to create image buffer %dx%d %d bpp: %s\n",                     width,                     height,                     m_bpp,                     SDL_GetError());            return false;        }        m_rbuf_window.attach((unsigned char*)m_specific->m_surf_window->pixels,                              m_specific->m_surf_window->w,                              m_specific->m_surf_window->h,                              m_flip_y ? -m_specific->m_surf_window->pitch :                                          m_specific->m_surf_window->pitch);        if(!m_specific->m_initialized)        {            m_initial_width = width;            m_initial_height = height;            on_init();            m_specific->m_initialized = true;        }        on_resize(m_rbuf_window.width(), m_rbuf_window.height());        m_specific->m_update_flag = true;        return true;    }    //------------------------------------------------------------------------    void platform_support::update_window()    {        SDL_BlitSurface(m_specific->m_surf_window, 0, m_specific->m_surf_screen, 0);        SDL_UpdateRect(m_specific->m_surf_screen, 0, 0, 0, 0);    }    //------------------------------------------------------------------------    int platform_support::run()    {        SDL_Event event;        bool ev_flag = false;        for(;;)        {            if(m_specific->m_update_flag)            {                on_draw();                update_window();                m_specific->m_update_flag = false;            }            ev_flag = false;            if(m_wait_mode)            {                SDL_WaitEvent(&event);                ev_flag = true;            }            else            {

⌨️ 快捷键说明

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