summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libflash/movie.cc
Side-by-side diff
Diffstat (limited to 'core/multimedia/opieplayer/libflash/movie.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libflash/movie.cc171
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;
+ }
+ }
+}