/* * Copyright 2012, Haiku, Inc. * Distributed under the terms of the MIT License. * * Authors: * Aaron Hill * Alexander von Gluck */ #include "GLifeSaver.h" #include #include #include #include #include #include "GLifeGrid.h" #include "GLifeState.h" #include "GLifeConfig.h" #include "GLifeView.h" // ------------------------------------------------------ // GLifeSaver Class Constructor Definition GLifeSaver::GLifeSaver(BMessage* pbmPrefs, image_id iidImage) : BScreenSaver(pbmPrefs, iidImage) { // Check for preferences if (!pbmPrefs->IsEmpty()) RestoreState(pbmPrefs); // Seed random number generator srandom(system_time()); } // ------------------------------------------------------ // GLifeSaver Class SaveState Definition status_t GLifeSaver::SaveState(BMessage* pbmPrefs) const { return fGLifeState.SaveState(pbmPrefs); } // ------------------------------------------------------ // GLifeSaver Class RestoreState Definition void GLifeSaver::RestoreState(BMessage* pbmPrefs) { fGLifeState.RestoreState(pbmPrefs); } // ------------------------------------------------------ // GLifeSaver Class StartConfig Definition void GLifeSaver::StartConfig(BView* pbvView) { // Setup the "config" class GLifeConfig* pglcConfig = new GLifeConfig(pbvView->Bounds(), &fGLifeState); pbvView->AddChild(pglcConfig); } // ------------------------------------------------------ // GLifeSaver Class StartSaver Definition status_t GLifeSaver::StartSaver(BView* pbvView, bool bPreview) { SetTickSize(c_iTickSize); fGLifeViewport = new GLifeView(pbvView->Bounds(), "GLifeView", B_FOLLOW_NONE, BGL_RGB | BGL_DEPTH | BGL_DOUBLE, &fGLifeState); pbvView->AddChild(fGLifeViewport); return B_OK; } // ------------------------------------------------------ // GLifeSaver Class StopSaver Definition void GLifeSaver::StopSaver(void) { if (fGLifeViewport != NULL) fGLifeViewport->EnableDirectMode(false); } // ------------------------------------------------------ // GLifeSaver Class DirectConnected Definition void GLifeSaver::DirectConnected(direct_buffer_info* pdbiInfo) { // Enable or disable direct rendering if (fGLifeViewport != NULL) { fGLifeViewport->DirectConnected(pdbiInfo); fGLifeViewport->EnableDirectMode(true); } } // ------------------------------------------------------ // GLifeSaver Class DirectDraw Definition void GLifeSaver::Draw(BView*, int32 iFrame) { fGLifeViewport->Advance(); } // ------------------------------------------------------ // Main Instantiation Function extern "C" _EXPORT BScreenSaver* instantiate_screen_saver(BMessage* pbmPrefs, image_id iidImage) { return new GLifeSaver(pbmPrefs, iidImage); }