Diffstat (limited to 'core/multimedia/opieplayer/libflash/movie.cc') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/multimedia/opieplayer/libflash/movie.cc | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libflash/movie.cc b/core/multimedia/opieplayer/libflash/movie.cc new file mode 100644 index 0000000..349e43b --- a/dev/null +++ b/core/multimedia/opieplayer/libflash/movie.cc @@ -0,0 +1,171 @@ +//////////////////////////////////////////////////////////// +// Flash Plugin and Player +// Copyright (C) 1998,1999 Olivier Debon +// +// 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-1307, USA. +// +/////////////////////////////////////////////////////////////// +// Author : Olivier Debon <odebon@club-internet.fr> +// +#include "movie.h" + +FlashMovie::FlashMovie() +{ + gd = NULL; + sm = NULL; + getSwf = NULL; + getUrl = NULL; + cursorOnOff = NULL; + buttons_updated = 0; + scheduledTime.tv_sec = -1; + cur_focus = NULL; + lost_over = NULL; + msPerFrame = 0; + + /* mouse handling */ + mouse_active = 0; + mouse_x = -1; + mouse_y = -1; + button_pressed = 0; + refresh = 1; +} + +FlashMovie::~FlashMovie() +{ + CInputScript *n; + + while (main != NULL) { + n = main->next; + delete main; + main = n; + } + + if (gd) delete gd; + if (sm) delete sm; +} + +int +FlashMovie::processMovie(GraphicDevice *gd, SoundMixer *sm) +{ + CInputScript *script; + int wakeUp = 0; + + if (sm && sm->playSounds()) { + wakeUp = 1; + } + for (script = this->main; script != NULL; script = script->next) { + if (script->program == NULL) continue; + if (script->program->nbFrames == 0) continue; + if (script->program->processMovie(gd,sm)) { + wakeUp = 1; + } + } + renderMovie(); + return wakeUp; +} + +int +FlashMovie::handleEvent(GraphicDevice *gd, SoundMixer *sm, FlashEvent *event) +{ + int wakeUp = 0; + + if (sm && sm->playSounds()) { + wakeUp = 1; + } + if (this->main == 0) return 0; + if (this->main->program == 0) return 0; + if (this->main->program->handleEvent(gd, sm, event)) { + wakeUp = 1; + } + renderMovie(); + return wakeUp; +} + +/* current focus bigger and translated if needed */ +void +FlashMovie::renderFocus() +{ + Rect rect,boundary; + Matrix mat; + + if (mouse_active || !cur_focus) return; + + /* rect is the bbox in screen coordinates */ + + // Compute the bounding box in screen coordinates + cur_focus->character->getBoundingBox(&boundary,cur_focus); + mat = (*gd->adjust) * cur_focus->renderMatrix; + transformBoundingBox(&rect, &mat, &boundary, 1); + + gd->drawBox(rect.xmin, rect.ymin, rect.xmax, rect.ymax); +} + +void +FlashMovie::renderMovie() +{ + CInputScript *script,*prev,*next; + Rect clipping; + Matrix identity; + + clipping.reset(); + + // First pass to update the clipping region + for (script = this->main; script != NULL; script = script->next) { + if (script->level == -1) { + clipping.xmin = -32768; + clipping.ymin = -32768; + clipping.xmax = 32767; + clipping.ymax = 32767; + continue; + } + if (script->program == NULL) continue; + if (script->program->dl->bbox.xmin == LONG_MAX) continue; + transformBoundingBox(&clipping, &identity, &script->program->dl->bbox, 0); + script->program->render = 0; + } + + if (clipping.xmin == LONG_MAX) return; + + // Update the clipping region + gd->updateClippingRegion(&clipping); + gd->clearCanvas(); + + // Second pass to render the movie + for (script = this->main; script != NULL; script = script->next) { + if (script->level == -1) continue; + if (script->program == NULL) continue; + script->program->dl->render(gd); + } + renderFocus(); + + // Final pass to delete some movies + script = this->main; + prev = 0; + while (script != NULL) { + if (script->level == -1) { + next = script->next; + if (prev == 0) { + this->main = next; + } else { + prev->next = next; + } + delete script; + script = next; + } else { + prev = script; + script = script->next; + } + } +} |