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

📄 agg_platform_support.cpp

📁 gnash 在pc和嵌入式下开发需要的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
AGGView::Update(){    // trigger display update    if (LockLooper()) {        Invalidate();        UnlockLooper();    }}voidAGGView::ForceRedraw(){    // force a redraw (fRedraw = true;)    // and trigger display update    if (LockLooper()) {        fRedraw = true;        Invalidate();        UnlockLooper();    }}unsignedAGGView::GetKeyFlags(){    uint32 buttons = fMouseButtons;    uint32 mods = modifiers();    unsigned flags = 0;    if (buttons & B_PRIMARY_MOUSE_BUTTON)   flags |= agg::mouse_left;    if (buttons & B_SECONDARY_MOUSE_BUTTON) flags |= agg::mouse_right;    if (mods & B_SHIFT_KEY)                 flags |= agg::kbd_shift;    if (mods & B_COMMAND_KEY)               flags |= agg::kbd_ctrl;    return flags;}// #pragma mark -class AGGWindow : public BWindow { public:                    AGGWindow()                    : BWindow(BRect(-50.0, -50.0, -10.0, -10.0),                              "AGG Application", B_TITLED_WINDOW, B_ASYNCHRONOUS_CONTROLS)                    {                    }    virtual bool    QuitRequested()                    {                        be_app->PostMessage(B_QUIT_REQUESTED);                        return true;                    }            bool    Init(BRect frame, agg::platform_support* agg, agg::pix_format_e format,                              bool flipY, uint32 flags)                    {                        MoveTo(frame.LeftTop());                        ResizeTo(frame.Width(), frame.Height());                        SetFlags(flags);                        frame.OffsetTo(0.0, 0.0);                        fView = new AGGView(frame, agg, format, flipY);                        AddChild(fView);                        return fView->Bitmap() != NULL;                    }        AGGView*    View() const                    {                        return fView;                    } private:    AGGView*        fView;};// #pragma mark -class AGGApplication : public BApplication { public:                    AGGApplication()                    : BApplication("application/x-vnd.AGG-AGG")                    {                        fWindow = new AGGWindow();                    }    virtual void    ReadyToRun()                    {                        if (fWindow) {                            fWindow->Show();                        }                    }    virtual bool    Init(agg::platform_support* agg, int width, int height,                         agg::pix_format_e format, bool flipY, uint32 flags)                    {                        BRect r(50.0, 50.0,                                50.0 + width - 1.0,                                50.0 + height - 1.0);                        uint32 windowFlags = B_ASYNCHRONOUS_CONTROLS;                        if (!(flags & agg::window_resize))                            windowFlags |= B_NOT_RESIZABLE;                        return fWindow->Init(r, agg, format, flipY, windowFlags);;                    }        AGGWindow*  Window() const                    {                        return fWindow;                    } private:    AGGWindow*      fWindow;};// #pragma mark -namespace agg{class platform_specific { public:                    platform_specific(agg::platform_support* agg,                                      agg::pix_format_e format, bool flip_y)                        : fAGG(agg),                          fApp(NULL),                          fFormat(format),                          fFlipY(flip_y),                          fTimerStart(system_time())                    {                        memset(fImages, 0, sizeof(fImages));                        fApp = new AGGApplication();                        fAppPath[0] = 0;                        // figure out where we're running from                        app_info info;                        status_t ret = fApp->GetAppInfo(&info);                        if (ret >= B_OK) {                            BPath path(&info.ref);                            ret = path.InitCheck();                            if (ret >= B_OK) {                                ret = path.GetParent(&path);                                if (ret >= B_OK) {                                    sprintf(fAppPath, "%s", path.Path());                                } else {                                    fprintf(stderr, "getting app parent folder failed: %s\n", strerror(ret));                                }                            } else {                                fprintf(stderr, "making app path failed: %s\n", strerror(ret));                            }                        } else {                            fprintf(stderr, "GetAppInfo() failed: %s\n", strerror(ret));                        }                    }                    ~platform_specific()                    {                        for (int32 i = 0; i < agg::platform_support::max_images; i++)                            delete fImages[i];                        delete fApp;                    }    bool            Init(int width, int height, unsigned flags)                    {                        return fApp->Init(fAGG, width, height, fFormat, fFlipY, flags);                    }    int             Run()                    {                        status_t ret = B_NO_INIT;                        if (fApp) {                            fApp->Run();                            ret = B_OK;                        }                        return ret;                    }    void            SetTitle(const char* title)                    {                        if (fApp && fApp->Window() && fApp->Window()->Lock()) {                            fApp->Window()->SetTitle(title);                            fApp->Window()->Unlock();                        }                    }    void            StartTimer()                    {                        fTimerStart = system_time();                    }    double          ElapsedTime() const                    {                        return (system_time() - fTimerStart) / 1000.0;                    }    void            ForceRedraw()                    {                        fApp->Window()->View()->ForceRedraw();                    }    void            UpdateWindow()                    {                        fApp->Window()->View()->Update();                    }    agg::platform_support*  fAGG;    AGGApplication*     fApp;    agg::pix_format_e    fFormat;    bool                fFlipY;    bigtime_t           fTimerStart;    BBitmap*            fImages[agg::platform_support::max_images];    char                fAppPath[B_PATH_NAME_LENGTH];    char                fFilePath[B_PATH_NAME_LENGTH];};    //------------------------------------------------------------------------    platform_support::platform_support(pix_format_e format, bool flip_y) :        m_specific(new platform_specific(this, format, flip_y)),        m_format(format),        m_bpp(32/*m_specific->m_bpp*/),        m_window_flags(0),        m_wait_mode(true),        m_flip_y(flip_y),        m_initial_width(10),        m_initial_height(10)    {        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);        m_specific->SetTitle(cap);    }    //------------------------------------------------------------------------    void platform_support::start_timer()    {        m_specific->StartTimer();    }    //------------------------------------------------------------------------    double platform_support::elapsed_time() const    {        return m_specific->ElapsedTime();    }    //------------------------------------------------------------------------    void* platform_support::raw_display_handler()    {        // TODO: if we ever support BDirectWindow here, that would        // be the frame buffer pointer with offset to the window top left        return NULL;    }    //------------------------------------------------------------------------    void platform_support::message(const char* msg)    {        BAlert* alert = new BAlert("AGG Message", msg, "Ok");        alert->Go(/*NULL*/);    }    //------------------------------------------------------------------------    bool platform_support::init(unsigned width, unsigned height, unsigned flags)    {        m_initial_width = width;        m_initial_height = height;        m_window_flags = flags;        if (m_specific->Init(width, height, flags)) {            on_init();            return true;        }        return false;    }    //------------------------------------------------------------------------    int platform_support::run()    {        return m_specific->Run();    }    //------------------------------------------------------------------------    const char* platform_support::img_ext() const { return ".ppm"; }    const char* platform_support::full_file_name(const char* file_name)    {        sprintf(m_specific->fFilePath, "%s/%s", m_specific->fAppPath, file_name);        return m_specific->fFilePath;    }    //------------------------------------------------------------------------    bool platform_support::load_img(unsigned idx, const char* file)    {        if (idx < max_images)        {            char path[B_PATH_NAME_LENGTH];            sprintf(path, "%s/%s%s", m_specific->fAppPath, file, img_ext());            BBitmap* transBitmap = BTranslationUtils::GetBitmap(path);            if (transBitmap && transBitmap->IsValid()) {                if(transBitmap->ColorSpace() != B_RGB32 && transBitmap->ColorSpace() != B_RGBA32) {                    // ups we got a smart ass Translator making our live harder                    delete transBitmap;                    return false;                }                color_space format = B_RGB24;                switch (m_format) {                    case pix_format_gray8:                        format = B_GRAY8;                        break;                    case pix_format_rgb555:                        format = B_RGB15;                        break;                    case pix_format_rgb565:                        format = B_RGB16;                        break;                    case pix_format_rgb24:                        format = B_RGB24_BIG;                        break;                    case pix_format_bgr24:                        format = B_RGB24;                        break;                    case pix_format_abgr32:                    case pix_format_argb32:                    case pix_format_bgra32:                        format = B_RGB32;                        break;                    case pix_format_rgba32:                        format = B_RGB32_BIG;                        break;                }                BBitmap* bitmap = new (nothrow) BBitmap(transBitmap->Bounds(), 0, format);                if (!bitmap || !bitmap->IsValid()) {                    fprintf(stderr, "failed to allocate temporary bitmap!\n");                    delete transBitmap;                    delete bitmap;                    return false;                }                delete m_specific->fImages[idx];                rendering_buffer rbuf_tmp;                attach_buffer_to_BBitmap(rbuf_tmp, transBitmap, m_flip_y);                        m_specific->fImages[idx] = bitmap;                        attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y);                        rendering_buffer* dst = &m_rbuf_img[idx];                switch(m_format)                {                case pix_format_gray8:                    return false;//                  color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_gray8()); break;                    break;                        case pix_format_rgb555:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb555()); break;                    break;                        case pix_format_rgb565:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb565()); break;                    break;                        case pix_format_rgb24:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgb24()); break;                    break;                        case pix_format_bgr24:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgr24()); break;                    break;                        case pix_format_abgr32:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_abgr32()); break;                    break;                        case pix_format_argb32:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_argb32()); break;                    break;                        case pix_format_bgra32:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_bgra32()); break;                    break;                        case pix_format_rgba32:                    color_conv(dst, &rbuf_tmp, color_conv_bgra32_to_rgba32()); break;                    break;                }                delete transBitmap;                                return true;            } else {                fprintf(stderr, "failed to load bitmap: '%s'\n", full_file_name(file));            }        }        return false;    }    //------------------------------------------------------------------------    bool platform_support::save_img(unsigned idx, const char* file)    {        // TODO: implement using BTranslatorRoster and friends        return false;    }    //------------------------------------------------------------------------    bool platform_support::create_img(unsigned idx, unsigned width, unsigned height)    {        if(idx < max_images)        {            if(width  == 0) width  = m_specific->fApp->Window()->View()->Bitmap()->Bounds().IntegerWidth() + 1;            if(height == 0) height = m_specific->fApp->Window()->View()->Bitmap()->Bounds().IntegerHeight() + 1;            BBitmap* bitmap = new BBitmap(BRect(0.0, 0.0, width - 1, height - 1), 0, B_RGBA32);;            if (bitmap && bitmap->IsValid()) {                delete m_specific->fImages[idx];                m_specific->fImages[idx] = bitmap;                attach_buffer_to_BBitmap(m_rbuf_img[idx], bitmap, m_flip_y);                return true;            } else {                delete bitmap;            }        }        return false;    }    //------------------------------------------------------------------------    void platform_support::force_redraw()    {        m_specific->ForceRedraw();    }    //------------------------------------------------------------------------    void platform_support::update_window()    {        m_specific->UpdateWindow();    }    //------------------------------------------------------------------------    void platform_support::on_init() {}    void platform_support::on_resize(int sx, int sy) {}    void platform_support::on_idle() {}    void platform_support::on_mouse_move(int x, int y, unsigned flags) {}    void platform_support::on_mouse_button_down(int x, int y, unsigned flags) {}    void platform_support::on_mouse_button_up(int x, int y, unsigned flags) {}    void platform_support::on_key(int x, int y, unsigned key, unsigned flags) {}    void platform_support::on_ctrl_change() {}    void platform_support::on_draw() {}    void platform_support::on_post_draw(void* raw_handler) {}}//----------------------------------------------------------------------------int agg_main(int argc, char* argv[]);intmain(int argc, char* argv[]){    return agg_main(argc, argv);}

⌨️ 快捷键说明

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