[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash/backend gnash.cpp render_handler_ogl.cpp
From: |
Rob Savoye |
Subject: |
[Gnash-commit] gnash/backend gnash.cpp render_handler_ogl.cpp |
Date: |
Sat, 11 Mar 2006 20:47:25 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Branch:
Changes by: Rob Savoye <address@hidden> 06/03/11 20:47:25
Modified files:
backend : gnash.cpp render_handler_ogl.cpp
Log message:
* backend/gnash.cpp: Use getopt for processing command line
arguments. Add GNU standard options. Use new logging system,
delete the old one.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/backend/gnash.cpp.diff?tr1=1.15&tr2=1.16&r1=text&r2=text
http://cvs.savannah.gnu.org/viewcvs/gnash/gnash/backend/render_handler_ogl.cpp.diff?tr1=1.7&tr2=1.8&r1=text&r2=text
Patches:
Index: gnash/backend/gnash.cpp
diff -u gnash/backend/gnash.cpp:1.15 gnash/backend/gnash.cpp:1.16
--- gnash/backend/gnash.cpp:1.15 Thu Mar 9 19:29:05 2006
+++ gnash/backend/gnash.cpp Sat Mar 11 20:47:24 2006
@@ -1,19 +1,39 @@
//
// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
-//
+//
// 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+//
+// Linking Gnash statically or dynamically with other modules is making
+// a combined work based on Gnash. Thus, the terms and conditions of
+// the GNU General Public License cover the whole combination.
+//
+// In addition, as a special exception, the copyright holders of Gnash give
+// you permission to combine Gnash with free software programs or
+// libraries that are released under the GNU LGPL and/or with Mozilla,
+// so long as the linking with Mozilla, or any variant of Mozilla, is
+// through its standard plug-in interface. You may copy and distribute
+// such a system following the terms of the GNU GPL for Gnash and the
+// licenses of the other code concerned, provided that you include the
+// source code of that other code when and as the GNU GPL requires
+// distribution of source code.
+//
+// Note that people who make modified versions of Gnash are not obligated
+// to grant this special exception for their modified versions; it is
+// their choice whether to do so. The GNU General Public License gives
+// permission to release a modified version without this exception; this
+// exception also makes it possible to release a modified version which
+// carries forward this exception.
//
#ifdef HAVE_CONFIG_H
@@ -23,10 +43,13 @@
#include "SDL.h"
#include "SDL_thread.h"
-#include "gnash.h"
#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
+#include <cstdlib>
+#include <cstdio>
+#include <vector>
+
+#include "gnash.h"
+#include "log.h"
#include "ogl.h"
#include "utility.h"
#include "container.h"
@@ -35,6 +58,12 @@
#include "xmlsocket.h"
#include "Movie.h"
+using namespace std;
+using namespace gnash;
+
+static void usage (const char *);
+static int runThread(void *nothing);
+
bool gofast = false; // FIXME: this flag gets set based on
// an XML message written using
// SendCommand(""). This way a movie
@@ -51,757 +80,641 @@
// the layers properly, but first I
// want to make sure it all works.
-void
-print_usage()
-{
- printf(
- "gnash -- a standalone Flash player.\n"
- "\n"
- "usage: gnash [options] movie_file.swf\n"
- "\n"
- "Plays a SWF (Shockwave Flash) movie using OpenGL"
- "\n"
- "options:\n"
- "\n"
- " -h Print this info.\n"
- " -s <factor> Scale the movie up/down by the specified factor\n"
- " -c Produce a core file instead of letting SDL trap it\n"
- " -d num Number of milli-seconds to delay in main loop\n"
- " -a Turn antialiasing on/off. (obsolete)\n"
- " -v Be verbose; i.e. print log messages to stdout\n"
- " -va Be verbose about movie Actions\n"
- " -vp Be verbose about parsing the movie\n"
- " -ml <bias> Specify the texture LOD bias (float, default is -1)\n"
- " -p Run full speed (no sleep) and log frame rate\n"
-// " -e Use SDL Event thread\n"
- " -x <ID> X11 Window ID for display\n"
- " -1 Play once; exit when/if movie reaches the last frame\n"
- " -r <0|1|2> 0 disables renderering & sound (good for batch
tests)\n"
- " 1 enables rendering & sound (default setting)\n"
- " 2 enables rendering & disables sound\n"
- " -t <sec> Timeout and exit after the specified number of
seconds\n"
- " -b <bits> Bit depth of output window (16 or 32, default is 16)\n"
- "\n"
- "keys:\n"
- " CTRL-Q Quit/Exit\n"
- " CTRL-W Quit/Exit\n"
- " ESC Quit/Exit\n"
- " CTRL-P Toggle Pause\n"
- " CTRL-R Restart the movie\n"
- " CTRL-[ or kp- Step back one frame\n"
- " CTRL-] or kp+ Step forward one frame\n"
- " CTRL-A Toggle antialiasing (doesn't work)\n"
- " CTRL-T Debug. Test the set_variable() function\n"
- " CTRL-G Debug. Test the get_variable() function\n"
- " CTRL-M Debug. Test the call_method() function\n"
- " CTRL-B Toggle background color\n"
- );
-}
-
-
#define OVERSIZE 1.0f
-static int runThread(void *nothing);
static int doneYet = 0;
static float s_scale = 1.0f;
static bool s_antialiased = false;
static int s_bit_depth = 16;
-static bool s_verbose = false;
static bool s_background = true;
static bool s_measure_performance = false;
static bool s_event_thread = false;
static bool s_start_waiting = false;
-static void
-message_log(const char* message)
-// Process a log message.
-{
- if (s_verbose) {
- fputs(message, stdout);
- fflush(stdout); // needed on osx for some reason
- }
-}
-
-static void
-log_callback(bool error, const char* message)
-// Error callback for handling messages.
-{
- if (error) {
- // Log, and also print to stderr.
- message_log(message);
- fputs(message, stderr);
- } else {
- message_log(message);
- }
-}
-
-
static tu_file*
file_opener(const char* url)
// Callback function. This opens files for the library.
{
- return new tu_file(url, "rb");
-}
+ GNASH_REPORT_FUNCTION;
+ if (strcmp(url, "-") == 0) {
+ FILE *newin = fdopen(dup(0),"rb");
+ return new tu_file(newin, false);
+ } else {
+ return new tu_file(url, "rb");
+ }
+}
static void
fs_callback(gnash::movie_interface* movie, const char* command, const char*
args)
// For handling notification callbacks from ActionScript.
{
- message_log("fs_callback: '");
- message_log(command);
- message_log("' '");
- message_log(args);
- message_log("'\n");
+ log_msg("fs_callback: '");
+ log_msg(command);
+ log_msg("' '");
+ log_msg(args);
+ log_msg("'\n");
}
-
static void
key_event(SDLKey key, bool down)
// For forwarding SDL key events.
{
- gnash::key::code c(gnash::key::INVALID);
-
- if (key >= SDLK_a && key <= SDLK_z) {
- c = (gnash::key::code) ((key - SDLK_a) + gnash::key::A);
- } else if (key >= SDLK_F1 && key <= SDLK_F15) {
- c = (gnash::key::code) ((key - SDLK_F1) + gnash::key::F1);
- } else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
- c = (gnash::key::code) ((key - SDLK_KP0) + gnash::key::KP_0);
- } else {
- // many keys don't correlate, so just use a look-up table.
- struct {
- SDLKey sdlk;
- gnash::key::code gs;
- } table[] = {
- { SDLK_RETURN, gnash::key::ENTER },
- { SDLK_ESCAPE, gnash::key::ESCAPE },
- { SDLK_LEFT, gnash::key::LEFT },
- { SDLK_UP, gnash::key::UP },
- { SDLK_RIGHT, gnash::key::RIGHT },
- { SDLK_DOWN, gnash::key::DOWN },
- // @@ TODO fill this out some more
- { SDLK_UNKNOWN, gnash::key::INVALID }
- };
-
- for (int i = 0; table[i].sdlk != SDLK_UNKNOWN; i++) {
- if (key == table[i].sdlk) {
- c = table[i].gs;
- break;
- }
+ gnash::key::code c(gnash::key::INVALID);
+
+ if (key >= SDLK_a && key <= SDLK_z) {
+ c = (gnash::key::code) ((key - SDLK_a) + gnash::key::A);
+ } else if (key >= SDLK_F1 && key <= SDLK_F15) {
+ c = (gnash::key::code) ((key - SDLK_F1) + gnash::key::F1);
+ } else if (key >= SDLK_KP0 && key <= SDLK_KP9) {
+ c = (gnash::key::code) ((key - SDLK_KP0) + gnash::key::KP_0);
+ } else {
+ // many keys don't correlate, so just use a look-up table.
+ struct {
+ SDLKey sdlk;
+ gnash::key::code gs;
+ } table[] = {
+ { SDLK_RETURN, gnash::key::ENTER },
+ { SDLK_ESCAPE, gnash::key::ESCAPE },
+ { SDLK_LEFT, gnash::key::LEFT },
+ { SDLK_UP, gnash::key::UP },
+ { SDLK_RIGHT, gnash::key::RIGHT },
+ { SDLK_DOWN, gnash::key::DOWN },
+ // @@ TODO fill this out some more
+ { SDLK_UNKNOWN, gnash::key::INVALID }
+ };
+
+ for (int i = 0; table[i].sdlk != SDLK_UNKNOWN; i++) {
+ if (key == table[i].sdlk) {
+ c = table[i].gs;
+ break;
+ }
+ }
+ }
+
+ if (c != gnash::key::INVALID) {
+ gnash::notify_key_event(c, down);
}
- }
-
- if (c != gnash::key::INVALID) {
- gnash::notify_key_event(c, down);
- }
}
int
main(int argc, char *argv[])
{
- assert(tu_types_validate());
-
- const char* infile = NULL;
-
- float exit_timeout = 0;
- bool do_render = true;
- bool do_sound = true;
- bool do_loop = true;
- bool sdl_abort = true;
- int delay = 31;
- float tex_lod_bias;
- int windowid = 0;
-
- // -1.0 tends to look good.
- tex_lod_bias = -1.2f;
-
- for (int arg = 1; arg < argc; arg++) {
- if (argv[arg][0] == '-') {
- // Looks like an option.
-
- if (argv[arg][1] == 'h') {
- // Help.
- print_usage();
- exit(1);
- }
- if (argv[arg][1] == 'c') {
- sdl_abort = false;
- } else if (argv[arg][1] == 's') {
- // Scale.
- arg++;
- if (arg < argc) {
- s_scale = fclamp((float) atof(argv[arg]), 0.01f, 100.f);
- } else {
- fprintf(stderr, "-s arg must be followed by a scale value\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 'a') {
- // Set antialiasing on or off.
- arg++;
- if (arg < argc) {
- s_antialiased = atoi(argv[arg]) ? true : false;
- } else {
- fprintf(stderr, "-a arg must be followed by 0 or 1 to disable/enable
antialiasing\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 'b') {
- // Set default bit depth.
- arg++;
- if (arg < argc) {
- s_bit_depth = atoi(argv[arg]);
- if (s_bit_depth != 16 && s_bit_depth != 32) {
- fprintf(stderr, "Command-line supplied bit depth %d, but it must
be 16 or 32", s_bit_depth);
- print_usage();
- exit(1);
- }
- } else {
- fprintf(stderr, "-b arg must be followed by 16 or 32 to set bit
depth\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 'd') {
- // Set a delay
- arg++;
- if (arg < argc) {
- delay = atoi(argv[arg]);
- } else {
- fprintf(stderr, "-d arg must be followed by number of milli-seconds
to del in the main loop\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 'p') {
- // Enable frame-rate/performance logging.
- s_measure_performance = true;
- } else if (argv[arg][1] == 'e') {
- // Use an SDL thread to handle events
- s_event_thread = true;
- } else if (argv[arg][1] == '1') {
- // Play once; don't loop.
- do_loop = false;
- } else if (argv[arg][1] == 'r') {
- // Set rendering on/off.
- arg++;
- if (arg < argc) {
- const int render_arg = atoi(argv[arg]);
- switch (render_arg) {
- case 0:
- // Disable both
- do_render = false;
- do_sound = false;
- break;
- case 1:
- // Enable both
- do_render = true;
- do_sound = true;
- break;
- case 2:
- // Disable just sound
- do_render = true;
- do_sound = false;
- break;
- default:
- fprintf(stderr, "-r must be followed by 0, 1 or 2 (%d is
invalid)\n",
- render_arg);
- print_usage();
- exit(1);
- break;
- }
- } else {
- fprintf(stderr, "-r must be followed by 0 an argument to
disable/enable rendering\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 't') {
- // Set timeout.
- arg++;
- if (arg < argc) {
- exit_timeout = (float) atof(argv[arg]);
- } else {// char SDL_windowhack[32];
-// sprintf (SDL_windowhack,"SDL_WINDOWID=%d", aWindow->window);
-// putenv (SDL_windowhack);
-
- fprintf(stderr, "-t must be followed by an exit timeout, in
seconds\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 'x') {
- // Set display window
- arg++;
- if (arg < argc) {
- windowid = strtol(argv[arg], NULL, 0);
- } else {
- fprintf(stderr, "-x must be followed by the window ID\n");
- print_usage();
- exit(1);
- }
- } else if (argv[arg][1] == 'v') {
- // Be verbose; i.e. print log messages to stdout.
- s_verbose = true;
-
- if (argv[arg][2] == 'a') {
- // Enable spew re: action.
- gnash::set_verbose_action(true);
- } else if (argv[arg][2] == 'p') {
- // Enable parse spew.
- gnash::set_verbose_parse(true);
- }
- // ...
- } else if (argv[arg][1] == 'm') {
- if (argv[arg][2] == 'l') {
- arg++;
- tex_lod_bias = (float) atof(argv[arg]);
- //printf("Texture LOD Bais is no %f\n", tex_lod_bias);
- } else {
- fprintf(stderr, "unknown variant of -m arg\n");
- print_usage();
- exit(1);
+ int c;
+ int verbosity = 0;
+ int render_arg;
+ std::vector<const char*> infiles;
+
+ assert(tu_types_validate());
+
+ float exit_timeout = 0;
+ bool do_render = true;
+ bool do_sound = true;
+ bool do_loop = true;
+ bool sdl_abort = true;
+ int delay = 31;
+ float tex_lod_bias;
+ int windowid = 0;
+
+ // -1.0 tends to look good.
+ tex_lod_bias = -1.2f;
+
+ // scan for the two main standard GNU options
+ for (c=0; c<argc; c++) {
+ if (strcmp("--help", argv[c]) == 0) {
+ usage(argv[0]);
+ exit(0);
+ }
+ if (strcmp("--version", argv[c]) == 0) {
+ cerr << "Gnash version: " << VERSION << endl;
+ exit(0);
}
- }
- } else {
- infile = argv[arg];
}
- }
-
- if (infile == NULL) {
- printf("no input file\n");
- print_usage();
- exit(1);
- }
-
- gnash::register_file_opener_callback(file_opener);
- gnash::register_fscommand_callback(fs_callback);
- if (s_verbose == true) {
- gnash::register_log_callback(log_callback);
- }
- //gnash::set_antialiased(s_antialiased);
-
- gnash::sound_handler *sound = NULL;
- gnash::render_handler *render = NULL;
- if (do_render) {
- if (do_sound) {
+
+ while ((c = getopt (argc, argv, "hvaps:cfd:m:x:r:t:b:1e")) != -1) {
+ switch (c) {
+ case 'h':
+ usage (argv[0]);
+ break;
+ case 'v':
+ verbosity++;
+ dbglogfile.setVerbosity(verbosity);
+ dbglogfile << "Verbose output turned on" << endl;
+ break;
+ case 'a':
+ gnash::set_verbose_action(true);
+ break;
+ case 'p':
+ gnash::set_verbose_parse(true);
+ break;
+ case 'f':
+ s_measure_performance = true;
+ break;
+ case 's':
+ s_scale = fclamp((float) atof(optarg), 0.01f, 100.f);
+ break;
+ case 'c':
+ sdl_abort = false;
+ break;
+ case 'd':
+ delay = atoi(optarg);
+ break;
+ case 'e':
+ s_event_thread = true;
+ break;
+ case 'x':
+ windowid = strtol(optarg, NULL, 0);
+ break;
+ case 'm':
+ tex_lod_bias = (float) atof(optarg);
+ break;
+ case '1':
+ do_loop = false;
+ break;
+ case 'r':
+ render_arg = atoi(optarg);
+ switch (render_arg) {
+ case 0:
+ // Disable both
+ do_render = false;
+ do_sound = false;
+ break;
+ case 1:
+ // Enable both
+ do_render = true;
+ do_sound = true;
+ break;
+ case 2:
+ // Disable just sound
+ do_render = true;
+ do_sound = false;
+ break;
+ default:
+ cerr << "-r must be followed by 0, 1 or 2 (" <<
+ render_arg << " is invalid" << endl;
+
+ break;
+ };
+ break;
+ case 't':
+ exit_timeout = (float) atof(optarg);
+ break;
+ case 'b':
+ s_bit_depth = atoi(optarg);
+ break;
+ }
+ }
+
+ // get the file name from the command line
+ while (optind < argc) {
+ infiles.push_back(argv[optind]);
+ optind++;
+ }
+
+ // No file names were supplied
+ if (infiles.size() == 0) {
+ printf("no input files\n");
+ usage(argv[0]);
+ exit(1);
+ }
+
+ gnash::register_file_opener_callback(file_opener);
+
+ gnash::register_fscommand_callback(fs_callback);
+// if (s_verbose == true) {
+// gnash::register_log_callback(log_callback);
+// }
+ //gnash::set_antialiased(s_antialiased);
+
+ gnash::sound_handler *sound = NULL;
+ gnash::render_handler *render = NULL;
+ if (do_render) {
+ if (do_sound) {
#ifdef HAVE_SDL_MIXER_H
- sound = gnash::create_sound_handler_sdl();
- gnash::set_sound_handler(sound);
+ sound = gnash::create_sound_handler_sdl();
+ gnash::set_sound_handler(sound);
#endif
+ }
+ render = gnash::create_render_handler_ogl();
+ gnash::set_render_handler(render);
}
- render = gnash::create_render_handler_ogl();
- gnash::set_render_handler(render);
- }
-
- // Get info about the width & height of the movie.
- int movie_version = 0;
- int movie_width = 0;
- int movie_height = 0;
- float movie_fps = 30.0f;
- gnash::get_movie_info(infile, &movie_version, &movie_width, &movie_height,
&movie_fps, NULL, NULL);
- if (movie_version == 0) {
- fprintf(stderr, "error: can't get info about %s\n", infile);
- exit(1);
- }
-
- int width = int(movie_width * s_scale);
- int height = int(movie_height * s_scale);
-
- if (do_render) {
- if (windowid) {
- char SDL_windowhack[32];
- sprintf (SDL_windowhack,"SDL_WINDOWID=%d", windowid);
- putenv (SDL_windowhack);
- }
-
- // Initialize the SDL subsystems we're using. Linux
- // and Darwin use Pthreads for SDL threads, Win32
- // doesn't. Otherwise the SDL event loop just polls.
- if (sdl_abort) {
- // Other flags are SDL_INIT_JOYSTICK | SDL_INIT_CDROM
+
+ // Get info about the width & height of the movie.
+ int movie_version = 0;
+ int movie_width = 0;
+ int movie_height = 0;
+ float movie_fps = 30.0f;
+ gnash::get_movie_info(infiles[0], &movie_version, &movie_width,
&movie_height, &movie_fps, NULL, NULL);
+ if (movie_version == 0) {
+ fprintf(stderr, "error: can't get info about %s\n", infiles[0]);
+ exit(1);
+ }
+
+ int width = int(movie_width * s_scale);
+ int height = int(movie_height * s_scale);
+
+ if (do_render) {
+ if (windowid) {
+ char SDL_windowhack[32];
+ sprintf (SDL_windowhack,"SDL_WINDOWID=%d", windowid);
+ putenv (SDL_windowhack);
+ }
+
+ // Initialize the SDL subsystems we're using. Linux
+ // and Darwin use Pthreads for SDL threads, Win32
+ // doesn't. Otherwise the SDL event loop just polls.
+ if (sdl_abort) {
+ // Other flags are SDL_INIT_JOYSTICK | SDL_INIT_CDROM
#ifdef _WIN32
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO))
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO))
#else
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTTHREAD ))
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO |
SDL_INIT_EVENTTHREAD ))
#endif
- {
- fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
- exit(1);
- }
- } else {
- fprintf(stderr, "warning: SDL won't trap core dumps \n");
+ {
+ fprintf(stderr, "Unable to init SDL: %s\n",
SDL_GetError());
+ exit(1);
+ }
+ } else {
+ fprintf(stderr, "warning: SDL won't trap core dumps \n");
#ifdef _WIN32
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE |
SDL_INIT_EVENTTHREAD))
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO |
SDL_INIT_NOPARACHUTE | SDL_INIT_EVENTTHREAD))
#else
- if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE))
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO |
SDL_INIT_NOPARACHUTE))
#endif
- {
- fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
+ {
+ fprintf(stderr, "Unable to init SDL: %s\n",
SDL_GetError());
+ exit(1);
+ }
+ }
+
+ atexit(SDL_Quit);
+
+ SDL_EnableKeyRepeat(250, 33);
+
+
+ if (s_bit_depth == 16) {
+ // 16-bit color, surface creation is likely to succeed.
+ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
+ SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
+ SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
+ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 15);
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
+ } else {
+ assert(s_bit_depth == 32);
+
+ // 32-bit color etc, for getting dest alpha,
+ // for MULTIPASS_ANTIALIASING (see
+ // render_handler_ogl.cpp).
+ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
+ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+ SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
+ }
+
+ // Change the LOD BIAS values to tweak blurriness.
+ if (tex_lod_bias != 0.0f) {
+#ifdef FIX_I810_LOD_BIAS
+ // If 2D textures weren't previously enabled, enable
+ // them now and force the driver to notice the update,
+ // then disable them again.
+ if (!glIsEnabled(GL_TEXTURE_2D)) {
+ // Clearing a mask of zero *should* have no
+ // side effects, but coupled with enbling
+ // GL_TEXTURE_2D it works around a segmentation
+ // fault in the driver for the Intel 810 chip.
+ glEnable(GL_TEXTURE_2D);
+ glClear(0);
+ glDisable(GL_TEXTURE_2D);
+ }
+#endif // FIX_I810_LOD_BIAS
+ glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT,
tex_lod_bias);
+ }
+
+ // Set the video mode.
+ if (SDL_SetVideoMode(width, height, s_bit_depth, SDL_OPENGL) == 0) {
+ fprintf(stderr, "SDL_SetVideoMode() failed.\n");
exit(1);
- }
+ }
+
+ // Set the window title
+ char *window_title = new char[1+strlen("gnash: ")+strlen(infiles[0])];
+ strcpy(window_title, "gnash: ");
+ strcat(window_title, infiles[0]);
+ SDL_WM_SetCaption(window_title, window_title);
+
+ //
+ ogl::open();
+
+ // Turn on alpha blending.
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ // Turn on line smoothing. Antialiased lines can be used to
+ // smooth the outsides of shapes.
+ glEnable(GL_LINE_SMOOTH);
+ glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // GL_NICEST,
GL_FASTEST, GL_DONT_CARE
+
+ glMatrixMode(GL_PROJECTION);
+ glOrtho(-OVERSIZE, OVERSIZE, OVERSIZE, -OVERSIZE, -1, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ // We don't need lighting effects
+ glDisable(GL_LIGHTING);
+ // glColorPointer(4, GL_UNSIGNED_BYTE, 0, *);
+ // glInterleavedArrays(GL_T2F_N3F_V3F, 0, *)
+ glPushAttrib (GL_ALL_ATTRIB_BITS);
}
- atexit(SDL_Quit);
-
- SDL_EnableKeyRepeat(250, 33);
-
-
- if (s_bit_depth == 16) {
- // 16-bit color, surface creation is likely to succeed.
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 15);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
- SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
- } else {
- assert(s_bit_depth == 32);
-
- // 32-bit color etc, for getting dest alpha,
- // for MULTIPASS_ANTIALIASING (see
- // render_handler_ogl.cpp).
- SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 8);
- SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
- SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
- SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 1);
+ // Load the actual movie.
+ gnash::movie_definition* md = gnash::create_library_movie(infiles[0]);
+ if (md == NULL) {
+ fprintf(stderr, "error: can't create a movie from '%s'\n", infiles[0]);
+ exit(1);
}
-
- // Change the LOD BIAS values to tweak blurriness.
- if (tex_lod_bias != 0.0f) {
-#ifdef FIX_I810_LOD_BIAS
- // If 2D textures weren't previously enabled, enable
- // them now and force the driver to notice the update,
- // then disable them again.
- if (!glIsEnabled(GL_TEXTURE_2D)) {
- // Clearing a mask of zero *should* have no
- // side effects, but coupled with enbling
- // GL_TEXTURE_2D it works around a segmentation
- // fault in the driver for the Intel 810 chip.
- glEnable(GL_TEXTURE_2D);
- glClear(0);
- glDisable(GL_TEXTURE_2D);
- }
-#endif // FIX_I810_LOD_BIAS
- glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT,
tex_lod_bias);
+ gnash::movie_interface* m = create_library_movie_inst(md);
+ if (m == NULL) {
+ fprintf(stderr, "error: can't create movie instance\n");
+ exit(1);
}
+ gnash::set_current_root(m);
- // Set the video mode.
- if (SDL_SetVideoMode(width, height, s_bit_depth, SDL_OPENGL) == 0) {
- fprintf(stderr, "SDL_SetVideoMode() failed.\n");
- exit(1);
- }
-
- // Set the window title
- char *window_title = new char[1+strlen("gnash: ")+strlen(infile)];
- strcpy(window_title, "gnash: ");
- strcat(window_title, infile);
- SDL_WM_SetCaption(window_title, window_title);
-
- //
- ogl::open();
-
- // Turn on alpha blending.
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- // Turn on line smoothing. Antialiased lines can be used to
- // smooth the outsides of shapes.
- glEnable(GL_LINE_SMOOTH);
- glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // GL_NICEST, GL_FASTEST,
GL_DONT_CARE
-
- glMatrixMode(GL_PROJECTION);
- glOrtho(-OVERSIZE, OVERSIZE, OVERSIZE, -OVERSIZE, -1, 1);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
-
- // We don't need lighting effects
- glDisable(GL_LIGHTING);
- // glColorPointer(4, GL_UNSIGNED_BYTE, 0, *);
- // glInterleavedArrays(GL_T2F_N3F_V3F, 0, *)
- glPushAttrib (GL_ALL_ATTRIB_BITS);
- }
-
- // Load the actual movie.
- gnash::movie_definition* md = gnash::create_library_movie(infile);
- if (md == NULL) {
- fprintf(stderr, "error: can't create a movie from '%s'\n", infile);
- exit(1);
- }
- gnash::movie_interface* m = create_library_movie_inst(md);
- if (m == NULL) {
- fprintf(stderr, "error: can't create movie instance\n");
- exit(1);
- }
- gnash::set_current_root(m);
-
- // Mouse state.
- int mouse_x = 0;
- int mouse_y = 0;
- int mouse_buttons = 0;
-
- float speed_scale = 1.0f;
- Uint32 start_ticks = 0;
- if (do_render) {
- start_ticks = SDL_GetTicks();
-
- }
- Uint32 last_ticks = start_ticks;
- int frame_counter = 0;
- int last_logged_fps = last_ticks;
-
-
- SDL_Thread *thread = NULL;
- if (s_event_thread) {
- thread = SDL_CreateThread(runThread, NULL);
- if ( thread == NULL) {
- fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
- }
- }
-
-
- for (;;) {
- Uint32 ticks;
+ // Mouse state.
+ int mouse_x = 0;
+ int mouse_y = 0;
+ int mouse_buttons = 0;
+
+ float speed_scale = 1.0f;
+ Uint32 start_ticks = 0;
if (do_render) {
- ticks = SDL_GetTicks();
- } else {
- // Simulate time.
- ticks = last_ticks + (Uint32) (1000.0f / movie_fps);
+ start_ticks = SDL_GetTicks();
+
}
- int delta_ticks = ticks - last_ticks;
- float delta_t = delta_ticks / 1000.f;
- last_ticks = ticks;
-
- // Check auto timeout counter.
- if (exit_timeout > 0
- && ticks - start_ticks > (Uint32) (exit_timeout * 1000)) {
- // Auto exit now.
- break;
+ Uint32 last_ticks = start_ticks;
+ int frame_counter = 0;
+ int last_logged_fps = last_ticks;
+
+
+ SDL_Thread *thread = NULL;
+ if (s_event_thread) {
+ thread = SDL_CreateThread(runThread, NULL);
+ if ( thread == NULL) {
+ fprintf(stderr, "Unable to create thread: %s\n", SDL_GetError());
+ }
}
- if (do_render) {
- SDL_Event event;
- // Handle input.
- bool ret = true;
- while (ret) {
+
+ for (;;) {
+ Uint32 ticks;
+ if (do_render) {
+ ticks = SDL_GetTicks();
+ } else {
+ // Simulate time.
+ ticks = last_ticks + (Uint32) (1000.0f / movie_fps);
+ }
+ int delta_ticks = ticks - last_ticks;
+ float delta_t = delta_ticks / 1000.f;
+ last_ticks = ticks;
+
+ // Check auto timeout counter.
+ if (exit_timeout > 0
+ && ticks - start_ticks > (Uint32) (exit_timeout * 1000)) {
+ // Auto exit now.
+ break;
+ }
+
+ if (do_render) {
+ SDL_Event event;
+ // Handle input.
+ bool ret = true;
+ while (ret) {
// printf("xml_fd is %d, gofast is %d, s_start_waiting is %d,
s_event_thread is %d\n",
// xml_fd, gofast, s_start_waiting, s_event_thread);
#ifdef HAVE_LIBXML
- if (s_event_thread && s_start_waiting && (xml_fd > 0) && !gofast) {
- // if (s_event_thread && (xml_fd >
0)) {
+ if (s_event_thread && s_start_waiting && (xml_fd > 0) &&
!gofast) {
+ // if (s_event_thread &&
(xml_fd > 0)) {
// printf("SDL_WaitEvent!\n");
- ret = SDL_WaitEvent(&event);
- } else {
+ ret = SDL_WaitEvent(&event);
+ } else {
// if (gofast) {
// printf("SDL_PollEvent GOFAST!\n");
// } else {
// printf("SDL_PollEvent!\n");
// }
- ret = SDL_PollEvent(&event) ? true : false;
- }
+ ret = SDL_PollEvent(&event) ? true : false;
+ }
#else
- // If we have no libxml, obey what the gofast variable is set to
- if (gofast)
- ret = SDL_PollEvent(&event) ? true : false;
- else
- ret = SDL_WaitEvent(&event);
+ // If we have no libxml, obey what the gofast variable is set
to
+ if (gofast)
+ ret = SDL_PollEvent(&event) ? true : false;
+ else
+ ret = SDL_WaitEvent(&event);
#endif
-
+
// printf("EVENT Type is %d\n", event.type);
- switch (event.type) {
- case SDL_NOEVENT:
- ret = false;
- break;
- case SDL_USEREVENT:
+ switch (event.type) {
+ case SDL_NOEVENT:
+ ret = false;
+ break;
+ case SDL_USEREVENT:
// printf("SDL_USER_EVENT at %s, code %d%d\n", __FUNCTION__,
__LINE__, event.user.code);
- ret = false;
- break;
- case SDL_KEYDOWN:
- {
- SDLKey key = event.key.keysym.sym;
- bool ctrl = (event.key.keysym.mod & KMOD_CTRL) != 0;
-
- if (key == SDLK_ESCAPE
- || (ctrl && key == SDLK_q)
- || (ctrl && key == SDLK_w)) {
- goto done;
- } else if (ctrl && key == SDLK_p) {
- // Toggle paused state.
- if (m->get_play_state() == gnash::movie_interface::STOP) {
- m->set_play_state(gnash::movie_interface::PLAY);
- } else {
- m->set_play_state(gnash::movie_interface::STOP);
- }
- } else if (ctrl && key == SDLK_r) {
- // Restart the movie.
- m->restart();
- } else if (ctrl && (key == SDLK_LEFTBRACKET || key ==
SDLK_KP_MINUS)) {
- m->goto_frame(m->get_current_frame()-1);
- } else if (ctrl && (key == SDLK_RIGHTBRACKET || key ==
SDLK_KP_PLUS)) {
- m->goto_frame(m->get_current_frame()+1);
- } else if (ctrl && key == SDLK_a) {
- // Toggle antialiasing.
- s_antialiased = !s_antialiased;
- //gnash::set_antialiased(s_antialiased);
- } else if (ctrl && key == SDLK_t) {
- // test text replacement / variable setting:
- m->set_variable("test.text", "set_edit_text was here...\nanother
line of text for you to see in the text box\nSome UTF-8: ñö£ç°ÃÃÿ");
- } else if (ctrl && key == SDLK_g) {
- // test get_variable.
- message_log("testing get_variable: '");
- message_log(m->get_variable("test.text"));
- message_log("'\n");
- } else if (ctrl && key == SDLK_m) {
- // Test call_method.
- const char* result = m->call_method(
- "test_call",
- "%d, %f, %s, %ls",
- 200,
- 1.0f,
- "Test string",
- L"Test long string");
-
- if (result) {
- message_log("call_method: result = ");
- message_log(result);
- message_log("\n");
- } else {
- message_log("call_method: null result\n");
- }
- } else if (ctrl && key == SDLK_b) {
- // toggle background color.
- s_background = !s_background;
- } else if (ctrl && key == SDLK_f) {
- extern bool gnash_debug_show_paths;
- gnash_debug_show_paths = !gnash_debug_show_paths;
- } else if (ctrl && key == SDLK_EQUALS) {
- float f = gnash::get_curve_max_pixel_error();
- f *= 1.1f;
- gnash::set_curve_max_pixel_error(f);
- printf("curve error tolerance = %f\n", f);
- } else if (ctrl && key == SDLK_MINUS) {
- float f = gnash::get_curve_max_pixel_error();
- f *= 0.9f;
- gnash::set_curve_max_pixel_error(f);
- printf("curve error tolerance = %f\n", f);
+ ret = false;
+ break;
+ case SDL_KEYDOWN:
+ {
+ SDLKey key = event.key.keysym.sym;
+ bool ctrl = (event.key.keysym.mod & KMOD_CTRL) != 0;
+
+ if (key == SDLK_ESCAPE
+ || (ctrl && key == SDLK_q)
+ || (ctrl && key == SDLK_w)) {
+ goto done;
+ } else if (ctrl && key == SDLK_p) {
+ // Toggle paused state.
+ if (m->get_play_state() ==
gnash::movie_interface::STOP) {
+ m->set_play_state(gnash::movie_interface::PLAY);
+ } else {
+ m->set_play_state(gnash::movie_interface::STOP);
+ }
+ } else if (ctrl && key == SDLK_r) {
+ // Restart the movie.
+ m->restart();
+ } else if (ctrl && (key == SDLK_LEFTBRACKET || key ==
SDLK_KP_MINUS)) {
+ m->goto_frame(m->get_current_frame()-1);
+ } else if (ctrl && (key == SDLK_RIGHTBRACKET || key ==
SDLK_KP_PLUS)) {
+ m->goto_frame(m->get_current_frame()+1);
+ } else if (ctrl && key == SDLK_a) {
+ // Toggle antialiasing.
+ s_antialiased = !s_antialiased;
+ //gnash::set_antialiased(s_antialiased);
+ } else if (ctrl && key == SDLK_t) {
+ // test text replacement / variable setting:
+ m->set_variable("test.text", "set_edit_text was
here...\nanother line of text for you to see in the text box\nSome UTF-8:
ñö£ç°ÃÃÿ");
+ } else if (ctrl && key == SDLK_g) {
+ // test get_variable.
+ log_msg("testing get_variable: '");
+ log_msg(m->get_variable("test.text"));
+ log_msg("'\n");
+ } else if (ctrl && key == SDLK_m) {
+ // Test call_method.
+ const char* result = m->call_method(
+ "test_call",
+ "%d, %f, %s, %ls",
+ 200,
+ 1.0f,
+ "Test string",
+ L"Test long string");
+
+ if (result) {
+ log_msg("call_method: result = ");
+ log_msg(result);
+ log_msg("\n");
+ } else {
+ log_msg("call_method: null result\n");
+ }
+ } else if (ctrl && key == SDLK_b) {
+ // toggle background color.
+ s_background = !s_background;
+ } else if (ctrl && key == SDLK_f) {
+ extern bool gnash_debug_show_paths;
+ gnash_debug_show_paths = !gnash_debug_show_paths;
+ } else if (ctrl && key == SDLK_EQUALS) {
+ float f = gnash::get_curve_max_pixel_error();
+ f *= 1.1f;
+ gnash::set_curve_max_pixel_error(f);
+ printf("curve error tolerance = %f\n", f);
+ } else if (ctrl && key == SDLK_MINUS) {
+ float f = gnash::get_curve_max_pixel_error();
+ f *= 0.9f;
+ gnash::set_curve_max_pixel_error(f);
+ printf("curve error tolerance = %f\n", f);
+ }
+
+ key_event(key, true);
+
+ break;
+ }
+
+ case SDL_KEYUP:
+ {
+ SDLKey key = event.key.keysym.sym;
+ key_event(key, false);
+ break;
+ }
+
+ case SDL_MOUSEMOTION:
+ mouse_x = (int) (event.motion.x / s_scale);
+ mouse_y = (int) (event.motion.y / s_scale);
+ break;
+
+ case SDL_MOUSEBUTTONDOWN:
+ case SDL_MOUSEBUTTONUP:
+ {
+ int mask = 1 << (event.button.button - 1);
+ if (event.button.state == SDL_PRESSED) {
+ mouse_buttons |= mask;
+ } else {
+ mouse_buttons &= ~mask;
+ }
+ break;
+ }
+
+ case SDL_QUIT:
+ goto done;
+ break;
+
+ default:
+ break;
+ }
}
+ }
+
+// printf("%s(%d): Frame count is %d\n", __PRETTY_FUNCTION__, __LINE__,
+// md->get_frame_count());
+ m = gnash::get_current_root();
+ gnash::delete_unused_root();
+
+ m->set_display_viewport(0, 0, width, height);
+ m->set_background_alpha(s_background ? 1.0f : 0.05f);
+
+ m->notify_mouse_state(mouse_x, mouse_y, mouse_buttons);
+
+ m->advance(delta_t * speed_scale);
+
+ if (do_render) {
+ glDisable(GL_DEPTH_TEST); // Disable depth testing.
+ glDrawBuffer(GL_BACK);
+ }
+ m->display();
+ frame_counter++;
+
+ if (do_render) {
+ SDL_GL_SwapBuffers();
+ //glPopAttrib ();
- key_event(key, true);
-
- break;
- }
-
- case SDL_KEYUP:
- {
- SDLKey key = event.key.keysym.sym;
- key_event(key, false);
- break;
- }
-
- case SDL_MOUSEMOTION:
- mouse_x = (int) (event.motion.x / s_scale);
- mouse_y = (int) (event.motion.y / s_scale);
- break;
-
- case SDL_MOUSEBUTTONDOWN:
- case SDL_MOUSEBUTTONUP:
- {
- int mask = 1 << (event.button.button - 1);
- if (event.button.state == SDL_PRESSED) {
- mouse_buttons |= mask;
+ if (s_measure_performance == false) {
+ // Don't hog the CPU.
+ // if (!nodelay)
+ if (!gofast) {
+ SDL_Delay(delay);
+ }
} else {
- mouse_buttons &= ~mask;
+ // Log the frame rate every second or so.
+ if (last_ticks - last_logged_fps > 1000) {
+ float delta = (last_ticks - last_logged_fps) / 1000.f;
+
+ if (delta > 0) {
+ printf("fps = %3.1f\n", frame_counter / delta);
+ } else {
+ printf("fps = *inf*\n");
+ }
+
+ last_logged_fps = last_ticks;
+ frame_counter = 0;
+ }
}
- break;
- }
-
- case SDL_QUIT:
- goto done;
- break;
-
- default:
- break;
}
- }
+
+ // See if we should exit.
+ if (do_loop == false
+ && m->get_current_frame() + 1 == md->get_frame_count())
+ {
+ // We're reached the end of the movie; exit.
+ break;
+ }
}
-
-// printf("%s(%d): Frame count is %d\n", __PRETTY_FUNCTION__, __LINE__,
-// md->get_frame_count());
- m = gnash::get_current_root();
- gnash::delete_unused_root();
-
- m->set_display_viewport(0, 0, width, height);
- m->set_background_alpha(s_background ? 1.0f : 0.05f);
- m->notify_mouse_state(mouse_x, mouse_y, mouse_buttons);
+ done:
+ doneYet = 1;
+ SDL_KillThread(thread); // kill the network read thread
+ //SDL_Quit();
- m->advance(delta_t * speed_scale);
+ if (md) {
+ md->drop_ref();
+ }
- if (do_render) {
- glDisable(GL_DEPTH_TEST); // Disable depth testing.
- glDrawBuffer(GL_BACK);
+ if (m) {
+ m->drop_ref();
}
- m->display();
- frame_counter++;
+ delete sound;
+ delete render;
- if (do_render) {
- SDL_GL_SwapBuffers();
- //glPopAttrib ();
-
- if (s_measure_performance == false) {
- // Don't hog the CPU.
- // if (!nodelay)
- if (!gofast) {
- SDL_Delay(delay);
- }
- } else {
- // Log the frame rate every second or so.
- if (last_ticks - last_logged_fps > 1000) {
- float delta = (last_ticks - last_logged_fps) / 1000.f;
-
- if (delta > 0) {
- printf("fps = %3.1f\n", frame_counter / delta);
- } else {
- printf("fps = *inf*\n");
- }
-
- last_logged_fps = last_ticks;
- frame_counter = 0;
- }
- }
- }
-
- // See if we should exit.
- if (do_loop == false
- && m->get_current_frame() + 1 == md->get_frame_count())
- {
- // We're reached the end of the movie; exit.
- break;
- }
- }
-
- done:
- doneYet = 1;
- SDL_KillThread(thread); // kill the network read thread
- //SDL_Quit();
-
- if (md) md->drop_ref();
- if (m) m->drop_ref();
- delete sound;
- delete render;
-
- // For testing purposes, throw some keypresses
- // to make sure the key handler is properly using weak
- // references to listeners.
- gnash::notify_key_event(gnash::key::A, true);
- gnash::notify_key_event(gnash::key::B, true);
- gnash::notify_key_event(gnash::key::C, true);
-
- // Clean up as much as possible, so valgrind will help find actual leaks.
- gnash::clear();
-
- return 0;
+ // For testing purposes, throw some keypresses
+ // to make sure the key handler is properly using weak
+ // references to listeners.
+ gnash::notify_key_event(gnash::key::A, true);
+ gnash::notify_key_event(gnash::key::B, true);
+ gnash::notify_key_event(gnash::key::C, true);
+
+ // Clean up as much as possible, so valgrind will help find actual leaks.
+ gnash::clear();
+
+ return 0;
}
static int
@@ -809,60 +722,107 @@
{
#ifdef HAVE_LIBXML
- //int i = 123;
- int val;
- int count = 0;
- SDL_Event *ptr;
+ //int i = 123;
+ int val;
+ int count = 0;
+ SDL_Event *ptr;
#if 1
- SDL_Event ev;
- ev.type = SDL_USEREVENT;
- ev.user.code = 0;
- ev.user.data1 = 0;
- ev.user.data2 = 0;
- ptr = &ev;
+ SDL_Event ev;
+ ev.type = SDL_USEREVENT;
+ ev.user.code = 0;
+ ev.user.data1 = 0;
+ ev.user.data2 = 0;
+ ptr = &ev;
#else
- ptr = (SDL_Event *)ev_ptr;
- ptr->type = SDL_USEREVENT;
- ptr->user.code = 0;
- ptr->user.data1 = 0;
- ptr->user.data2 = 0;
+ ptr = (SDL_Event *)ev_ptr;
+ ptr->type = SDL_USEREVENT;
+ ptr->user.code = 0;
+ ptr->user.data1 = 0;
+ ptr->user.data2 = 0;
#endif
-
- printf("Initializing event thread...\n");
-
- while (gnash::check_sockets(xml_fd) == -1) {
- sleep(10); // Delay to give the socket time to
- // connect.
- continue;
- }
-
- // give everything a chance to initialize.
- // since all the frames need to be set up,
- // and this is just a more runtime performance
- // issue with CPU load.
- sleep(20);
-
- printf("Enabling Event Wait Mode...\n");
- s_start_waiting = true;
-
- while (!doneYet) {
- //ptr->user.data1 = (void *)i;
- if ((val = gnash::check_sockets(xml_fd)) == -1) {
- return -1; // we shouldn't be seeing any errors
- }
- // Don't push an event if there is already one in the
- // queue. XMLSocket::onData() will come around and get
- // the data anyway.
- count = SDL_PeepEvents(ptr, 1, SDL_PEEKEVENT, SDL_USEREVENT);
- // printf("%d User Events in queue\n", count);
- if ((count == 0) && (val >= 0)) {
- //printf("Pushing User Event on queue\n");
- SDL_PushEvent(ptr);
- SDL_Delay(300); // was 300
+
+ printf("Initializing event thread...\n");
+
+ while (gnash::check_sockets(xml_fd) == -1) {
+ sleep(10); // Delay to give the socket time to
+ // connect.
+ continue;
+ }
+
+ // give everything a chance to initialize.
+ // since all the frames need to be set up,
+ // and this is just a more runtime performance
+ // issue with CPU load.
+ sleep(20);
+
+ printf("Enabling Event Wait Mode...\n");
+ s_start_waiting = true;
+
+ while (!doneYet) {
+ //ptr->user.data1 = (void *)i;
+ if ((val = gnash::check_sockets(xml_fd)) == -1) {
+ return -1; // we shouldn't be seeing any errors
+ }
+ // Don't push an event if there is already one in the
+ // queue. XMLSocket::onData() will come around and get
+ // the data anyway.
+ count = SDL_PeepEvents(ptr, 1, SDL_PEEKEVENT, SDL_USEREVENT);
+ // printf("%d User Events in queue\n", count);
+ if ((count == 0) && (val >= 0)) {
+ //printf("Pushing User Event on queue\n");
+ SDL_PushEvent(ptr);
+ SDL_Delay(300); // was 300
+ }
}
- }
#endif // HAVE_LIBXML
-
- return 0;
+
+ return 0;
+}
+
+void
+usage(const char*name)
+{
+ printf(
+ "gnash -- a standalone Flash player.\n"
+ "\n"
+ "usage: %s [options] movie_file.swf\n"
+ "\n"
+ "Plays a SWF (Shockwave Flash) movie using OpenGL"
+ "\n"
+ "options:\n"
+ "\n"
+ " -h Print this info.\n"
+ " -s <factor> Scale the movie up/down by the specified factor\n"
+ " -c Produce a core file instead of letting SDL trap it\n"
+ " -d num Number of milli-seconds to delay in main loop\n"
+// " -a Turn antialiasing on/off. (obsolete)\n"
+ " -v Be verbose; i.e. print log messages to stdout\n"
+ " -va Be verbose about movie Actions\n"
+ " -vp Be verbose about parsing the movie\n"
+ " -m <bias> Specify the texture LOD bias (float, default is -1)\n"
+ " -f Run full speed (no sleep) and log frame rate\n"
+// " -e Use SDL Event thread\n"
+ " -x <ID> X11 Window ID for display\n"
+ " -1 Play once; exit when/if movie reaches the last frame\n"
+ " -r <0|1|2> 0 disables renderering & sound (good for batch tests)\n"
+ " 1 enables rendering & sound (default setting)\n"
+ " 2 enables rendering & disables sound\n"
+ " -t <sec> Timeout and exit after the specified number of
seconds\n"
+ " -b <bits> Bit depth of output window (16 or 32, default is 16)\n"
+ "\n"
+ "keys:\n"
+ " CTRL-Q Quit/Exit\n"
+ " CTRL-W Quit/Exit\n"
+ " ESC Quit/Exit\n"
+ " CTRL-P Toggle Pause\n"
+ " CTRL-R Restart the movie\n"
+ " CTRL-[ or kp- Step back one frame\n"
+ " CTRL-] or kp+ Step forward one frame\n"
+ " CTRL-A Toggle antialiasing (doesn't work)\n"
+ " CTRL-T Debug. Test the set_variable() function\n"
+ " CTRL-G Debug. Test the get_variable() function\n"
+ " CTRL-M Debug. Test the call_method() function\n"
+ " CTRL-B Toggle background color\n", name
+ );
}
Index: gnash/backend/render_handler_ogl.cpp
diff -u gnash/backend/render_handler_ogl.cpp:1.7
gnash/backend/render_handler_ogl.cpp:1.8
--- gnash/backend/render_handler_ogl.cpp:1.7 Sun Feb 26 15:49:29 2006
+++ gnash/backend/render_handler_ogl.cpp Sat Mar 11 20:47:24 2006
@@ -12,8 +12,12 @@
#include "ogl.h"
#include "utility.h"
+#include "log.h"
+
#include <string.h> // for memset()
+using namespace gnash;
+
// choose the resampling method:
// 1 = hardware (experimental, should be fast, somewhat buggy)
// 2 = fast software bilinear (default)
@@ -33,327 +37,309 @@
// bitmap_info_ogl declaration
struct bitmap_info_ogl : public gnash::bitmap_info
{
- bitmap_info_ogl();
- bitmap_info_ogl(int width, int height, Uint8* data);
- bitmap_info_ogl(image::rgb* im);
- bitmap_info_ogl(image::rgba* im);
-
- ~bitmap_info_ogl()
- {
- if (m_texture_id > 0)
- {
- glDeleteTextures(1, (GLuint*) &m_texture_id);
- }
+ bitmap_info_ogl();
+ bitmap_info_ogl(int width, int height, Uint8* data);
+ bitmap_info_ogl(image::rgb* im);
+ bitmap_info_ogl(image::rgba* im);
+
+ ~bitmap_info_ogl() {
+ if (m_texture_id > 0) {
+ glDeleteTextures(1, (GLuint*) &m_texture_id);
}
+ }
};
struct render_handler_ogl : public gnash::render_handler
{
- // Some renderer state.
-
- // Enable/disable antialiasing.
- bool m_enable_antialias;
-
- // Output size.
- float m_display_width;
- float m_display_height;
+ // Some renderer state.
+
+ // Enable/disable antialiasing.
+ bool m_enable_antialias;
+
+ // Output size.
+ float m_display_width;
+ float m_display_height;
- gnash::matrix m_current_matrix;
- gnash::cxform m_current_cxform;
- void set_antialiased(bool enable)
- {
- m_enable_antialias = enable;
- }
-
- static void make_next_miplevel(int* width, int* height, Uint8* data)
- // Utility. Mutates *width, *height and *data to create the
- // next mip level.
- {
- assert(width);
- assert(height);
- assert(data);
-
- int new_w = *width >> 1;
- int new_h = *height >> 1;
- if (new_w < 1) new_w = 1;
- if (new_h < 1) new_h = 1;
+ gnash::matrix m_current_matrix;
+ gnash::cxform m_current_cxform;
+ void set_antialiased(bool enable) {
+ m_enable_antialias = enable;
+ }
+
+ // Utility. Mutates *width, *height and *data to create the
+ // next mip level.
+ static void make_next_miplevel(int* width, int* height, Uint8* data)
+ {
+ assert(width);
+ assert(height);
+ assert(data);
+
+ int new_w = *width >> 1;
+ int new_h = *height >> 1;
+ if (new_w < 1) new_w = 1;
+ if (new_h < 1) new_h = 1;
- if (new_w * 2 != *width || new_h * 2 != *height)
- {
- // Image can't be shrunk along (at least) one
- // of its dimensions, so don't bother
- // resampling. Technically we should, but
- // it's pretty useless at this point. Just
- // change the image dimensions and leave the
- // existing pixels.
- }
- else
- {
- // Resample. Simple average 2x2 --> 1, in-place.
- for (int j = 0; j < new_h; j++) {
- Uint8* out = ((Uint8*) data) + j * new_w;
- Uint8* in = ((Uint8*) data) + (j << 1) *
*width;
- for (int i = 0; i < new_w; i++) {
- int a;
- a = (*(in + 0) + *(in + 1) + *(in + 0 +
*width) + *(in + 1 + *width));
- *(out) = a >> 2;
- out++;
- in += 2;
- }
- }
+ if (new_w * 2 != *width || new_h * 2 != *height) {
+ // Image can't be shrunk along (at least) one
+ // of its dimensions, so don't bother
+ // resampling. Technically we should, but
+ // it's pretty useless at this point. Just
+ // change the image dimensions and leave the
+ // existing pixels.
+ } else {
+ // Resample. Simple average 2x2 --> 1, in-place.
+ for (int j = 0; j < new_h; j++) {
+ Uint8* out = ((Uint8*) data) + j * new_w;
+ Uint8* in = ((Uint8*) data) + (j << 1) * *width;
+ for (int i = 0; i < new_w; i++) {
+ int a;
+ a = (*(in + 0) + *(in + 1) + *(in + 0 + *width) + *(in
+ 1 + *width));
+ *(out) = a >> 2;
+ out++;
+ in += 2;
+ }
+ }
+ }
+
+ // Munge parameters to reflect the shrunken image.
+ *width = new_w;
+ *height = new_h;
+ }
+
+ struct fill_style
+ {
+ enum mode
+ {
+ INVALID,
+ COLOR,
+ BITMAP_WRAP,
+ BITMAP_CLAMP,
+ LINEAR_GRADIENT,
+ RADIAL_GRADIENT,
+ };
+ mode m_mode;
+ gnash::rgba m_color;
+ const gnash::bitmap_info* m_bitmap_info;
+ gnash::matrix m_bitmap_matrix;
+ gnash::cxform m_bitmap_color_transform;
+ bool m_has_nonzero_bitmap_additive_color;
+
+ fill_style()
+ :
+ m_mode(INVALID),
+ m_has_nonzero_bitmap_additive_color(false)
+ {
+ }
+
+ // Push our style into OpenGL.
+ void apply(/*const matrix& current_matrix*/) const
+ {
+ assert(m_mode != INVALID);
+
+ if (m_mode == COLOR) {
+ apply_color(m_color);
+ glDisable(GL_TEXTURE_2D);
+ } else if (m_mode == BITMAP_WRAP
+ || m_mode == BITMAP_CLAMP) {
+ assert(m_bitmap_info != NULL);
+
+ apply_color(m_color);
+
+ if (m_bitmap_info == NULL) {
+ glDisable(GL_TEXTURE_2D);
+ } else {
+ // Set up the texture for rendering.
+ {
+ // Do the modulate part of the color
+ // transform in the first pass. The
+ // additive part, if any, needs to
+ // happen in a second pass.
+ glColor4f(m_bitmap_color_transform.m_[0][0],
+ m_bitmap_color_transform.m_[1][0],
+ m_bitmap_color_transform.m_[2][0],
+ m_bitmap_color_transform.m_[3][0]
+ );
+ }
+
+ glBindTexture(GL_TEXTURE_2D, m_bitmap_info->m_texture_id);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+
+ if (m_mode == BITMAP_CLAMP) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
+ } else {
+ assert(m_mode == BITMAP_WRAP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_REPEAT);
+ }
+
+ // Set up the bitmap matrix for texgen.
+
+ float inv_width = 1.0f /
m_bitmap_info->m_original_width;
+ float inv_height = 1.0f /
m_bitmap_info->m_original_height;
+
+ const gnash::matrix& m = m_bitmap_matrix;
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ float p[4] = { 0, 0, 0, 0 };
+ p[0] = m.m_[0][0] * inv_width;
+ p[1] = m.m_[0][1] * inv_width;
+ p[3] = m.m_[0][2] * inv_width;
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, p);
+
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ p[0] = m.m_[1][0] * inv_height;
+ p[1] = m.m_[1][1] * inv_height;
+ p[3] = m.m_[1][2] * inv_height;
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, p);
}
-
- // Munge parameters to reflect the shrunken image.
- *width = new_w;
- *height = new_h;
+ }
}
- struct fill_style
- {
- enum mode
- {
- INVALID,
- COLOR,
- BITMAP_WRAP,
- BITMAP_CLAMP,
- LINEAR_GRADIENT,
- RADIAL_GRADIENT,
- };
- mode m_mode;
- gnash::rgba m_color;
- const gnash::bitmap_info* m_bitmap_info;
- gnash::matrix m_bitmap_matrix;
- gnash::cxform m_bitmap_color_transform;
- bool m_has_nonzero_bitmap_additive_color;
-
- fill_style()
- :
- m_mode(INVALID),
- m_has_nonzero_bitmap_additive_color(false)
- {
- }
-
- void apply(/*const matrix& current_matrix*/) const
- // Push our style into OpenGL.
- {
- assert(m_mode != INVALID);
-
- if (m_mode == COLOR)
- {
- apply_color(m_color);
- glDisable(GL_TEXTURE_2D);
- }
- else if (m_mode == BITMAP_WRAP
- || m_mode == BITMAP_CLAMP)
- {
- assert(m_bitmap_info != NULL);
-
- apply_color(m_color);
-
- if (m_bitmap_info == NULL)
- {
- glDisable(GL_TEXTURE_2D);
- }
- else
- {
- // Set up the texture for rendering.
- {
- // Do the modulate part of the
color
- // transform in the first pass.
The
- // additive part, if any, needs
to
- // happen in a second pass.
-
glColor4f(m_bitmap_color_transform.m_[0][0],
-
m_bitmap_color_transform.m_[1][0],
-
m_bitmap_color_transform.m_[2][0],
-
m_bitmap_color_transform.m_[3][0]
- );
- }
-
- glBindTexture(GL_TEXTURE_2D,
m_bitmap_info->m_texture_id);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
-
- if (m_mode == BITMAP_CLAMP)
- {
- glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- }
- else
- {
- assert(m_mode == BITMAP_WRAP);
- glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_REPEAT);
- }
-
- // Set up the bitmap matrix for texgen.
-
- float inv_width = 1.0f /
m_bitmap_info->m_original_width;
- float inv_height = 1.0f /
m_bitmap_info->m_original_height;
-
- const gnash::matrix& m =
m_bitmap_matrix;
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,
GL_OBJECT_LINEAR);
- float p[4] = { 0, 0, 0, 0 };
- p[0] = m.m_[0][0] * inv_width;
- p[1] = m.m_[0][1] * inv_width;
- p[3] = m.m_[0][2] * inv_width;
- glTexGenfv(GL_S, GL_OBJECT_PLANE, p);
-
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,
GL_OBJECT_LINEAR);
- p[0] = m.m_[1][0] * inv_height;
- p[1] = m.m_[1][1] * inv_height;
- p[3] = m.m_[1][2] * inv_height;
- glTexGenfv(GL_T, GL_OBJECT_PLANE, p);
- }
- }
- }
-
-
- bool needs_second_pass() const
- // Return true if we need to do a second pass to make
- // a valid color. This is for cxforms with additive
- // parts; this is the simplest way (that we know of)
- // to implement an additive color with stock OpenGL.
- {
- if (m_mode == BITMAP_WRAP
- || m_mode == BITMAP_CLAMP)
- {
- return m_has_nonzero_bitmap_additive_color;
- }
- else
- {
- return false;
- }
- }
-
- void apply_second_pass() const
- // Set OpenGL state for a necessary second pass.
- {
- assert(needs_second_pass());
-
- // The additive color also seems to be modulated by the
texture. So,
- // maybe we can fake this in one pass using using the
mean value of
- // the colors: c0*t+c1*t = ((c0+c1)/2) * t*2
- // I don't know what the alpha component of the color
is for.
- //glDisable(GL_TEXTURE_2D);
-
- glColor4f(
- m_bitmap_color_transform.m_[0][1] / 255.0f,
- m_bitmap_color_transform.m_[1][1] / 255.0f,
- m_bitmap_color_transform.m_[2][1] / 255.0f,
- m_bitmap_color_transform.m_[3][1] / 255.0f
- );
-
- glBlendFunc(GL_ONE, GL_ONE);
+
+ // Return true if we need to do a second pass to make
+ // a valid color. This is for cxforms with additive
+ // parts; this is the simplest way (that we know of)
+ // to implement an additive color with stock OpenGL.
+ bool needs_second_pass() const
+ {
+ if (m_mode == BITMAP_WRAP
+ || m_mode == BITMAP_CLAMP) {
+ return m_has_nonzero_bitmap_additive_color;
+ } else {
+ return false;
}
+ }
+
+ // Set OpenGL state for a necessary second pass.
+ void apply_second_pass() const
+ {
+ assert(needs_second_pass());
+
+ // The additive color also seems to be modulated by the
texture. So,
+ // maybe we can fake this in one pass using using the mean
value of
+ // the colors: c0*t+c1*t = ((c0+c1)/2) * t*2
+ // I don't know what the alpha component of the color is for.
+ //glDisable(GL_TEXTURE_2D);
+
+ glColor4f(
+ m_bitmap_color_transform.m_[0][1] / 255.0f,
+ m_bitmap_color_transform.m_[1][1] / 255.0f,
+ m_bitmap_color_transform.m_[2][1] / 255.0f,
+ m_bitmap_color_transform.m_[3][1] / 255.0f
+ );
+
+ glBlendFunc(GL_ONE, GL_ONE);
+ }
- void cleanup_second_pass() const
- {
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- }
+ void cleanup_second_pass() const
+ {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
- void disable() { m_mode = INVALID; }
- void set_color(gnash::rgba color) { m_mode = COLOR; m_color
= color; }
- void set_bitmap(const gnash::bitmap_info* bi, const
gnash::matrix& m, bitmap_wrap_mode wm, const gnash::cxform& color_transform)
- {
- m_mode = (wm == WRAP_REPEAT) ? BITMAP_WRAP :
BITMAP_CLAMP;
- m_bitmap_info = bi;
- m_bitmap_matrix = m;
- m_bitmap_color_transform = color_transform;
- m_bitmap_color_transform.clamp();
+ void disable() { m_mode = INVALID; }
+ void set_color(gnash::rgba color) { m_mode = COLOR; m_color = color;
}
+ void set_bitmap(const gnash::bitmap_info* bi, const gnash::matrix&
m, bitmap_wrap_mode wm, const gnash::cxform& color_transform)
+ {
+ m_mode = (wm == WRAP_REPEAT) ? BITMAP_WRAP : BITMAP_CLAMP;
+ m_bitmap_info = bi;
+ m_bitmap_matrix = m;
+ m_bitmap_color_transform = color_transform;
+ m_bitmap_color_transform.clamp();
- m_color = gnash::rgba(
- Uint8(m_bitmap_color_transform.m_[0][0] * 255.0f),
- Uint8(m_bitmap_color_transform.m_[1][0] * 255.0f),
- Uint8(m_bitmap_color_transform.m_[2][0] * 255.0f),
- Uint8(m_bitmap_color_transform.m_[3][0] * 255.0f));
+ m_color = gnash::rgba(
+ Uint8(m_bitmap_color_transform.m_[0][0] * 255.0f),
+ Uint8(m_bitmap_color_transform.m_[1][0] * 255.0f),
+ Uint8(m_bitmap_color_transform.m_[2][0] * 255.0f),
+ Uint8(m_bitmap_color_transform.m_[3][0] * 255.0f));
- if (m_bitmap_color_transform.m_[0][1] > 1.0f
- || m_bitmap_color_transform.m_[1][1] > 1.0f
- || m_bitmap_color_transform.m_[2][1] > 1.0f
- || m_bitmap_color_transform.m_[3][1] > 1.0f)
- {
- m_has_nonzero_bitmap_additive_color = true;
- }
- else
- {
- m_has_nonzero_bitmap_additive_color = false;
- }
- }
- bool is_valid() const { return m_mode != INVALID; }
- };
-
-
- // Style state.
- enum style_index
- {
- LEFT_STYLE = 0,
- RIGHT_STYLE,
- LINE_STYLE,
-
- STYLE_COUNT
- };
- fill_style m_current_styles[STYLE_COUNT];
+ if (m_bitmap_color_transform.m_[0][1] > 1.0f
+ || m_bitmap_color_transform.m_[1][1] > 1.0f
+ || m_bitmap_color_transform.m_[2][1] > 1.0f
+ || m_bitmap_color_transform.m_[3][1] > 1.0f)
+ {
+ m_has_nonzero_bitmap_additive_color = true;
+ }
+ else
+ {
+ m_has_nonzero_bitmap_additive_color = false;
+ }
+ }
+ bool is_valid() const { return m_mode != INVALID; }
+ };
+
+
+ // Style state.
+ enum style_index
+ {
+ LEFT_STYLE = 0,
+ RIGHT_STYLE,
+ LINE_STYLE,
+
+ STYLE_COUNT
+ };
+ fill_style m_current_styles[STYLE_COUNT];
- gnash::bitmap_info* create_bitmap_info_rgb(image::rgb* im)
+ gnash::bitmap_info* create_bitmap_info_rgb(image::rgb* im)
// Given an image, returns a pointer to a bitmap_info struct
// that can later be passed to fill_styleX_bitmap(), to set a
// bitmap fill style.
{
- return new bitmap_info_ogl(im);
+ return new bitmap_info_ogl(im);
}
- gnash::bitmap_info* create_bitmap_info_rgba(image::rgba* im)
+ gnash::bitmap_info* create_bitmap_info_rgba(image::rgba* im)
// Given an image, returns a pointer to a bitmap_info struct
// that can later be passed to fill_style_bitmap(), to set a
// bitmap fill style.
//
// This version takes an image with an alpha channel.
{
- return new bitmap_info_ogl(im);
+ return new bitmap_info_ogl(im);
}
- gnash::bitmap_info* create_bitmap_info_empty()
+ gnash::bitmap_info* create_bitmap_info_empty()
// Create a placeholder bitmap_info. Used when
// DO_NOT_LOAD_BITMAPS is set; then later on the host program
// can use movie_definition::get_bitmap_info_count() and
// movie_definition::get_bitmap_info() to stuff precomputed
// textures into these bitmap infos.
{
- return new bitmap_info_ogl;
+ return new bitmap_info_ogl;
}
- gnash::bitmap_info* create_bitmap_info_alpha(int w, int h, Uint8*
data)
+ gnash::bitmap_info* create_bitmap_info_alpha(int w, int h, Uint8*
data)
// Create a bitmap_info so that it contains an alpha texture
// with the given data (1 byte per texel).
//
// Munges *data (in order to make mipmaps)!!
{
- return new bitmap_info_ogl(w, h, data);
+ return new bitmap_info_ogl(w, h, data);
}
- void delete_bitmap_info(gnash::bitmap_info* bi)
+ void delete_bitmap_info(gnash::bitmap_info* bi)
// Delete the given bitmap info struct.
{
- delete bi;
+ delete bi;
}
- ~render_handler_ogl()
+ ~render_handler_ogl()
{
}
- void begin_display(
- gnash::rgba background_color,
- int viewport_x0, int viewport_y0,
- int viewport_width, int viewport_height,
- float x0, float x1, float y0, float y1)
+ void begin_display(
+ gnash::rgba background_color,
+ int viewport_x0, int viewport_y0,
+ int viewport_width, int viewport_height,
+ float x0, float x1, float y0, float y1)
// Set up to render a full frame from a movie and fills the
// background. Sets up necessary transforms, to scale the
// movie to fit within the given dimensions. Call
@@ -367,36 +353,37 @@
// coordinates of the movie that correspond to the viewport
// bounds.
{
- m_display_width = fabsf(x1 - x0);
- m_display_height = fabsf(y1 - y0);
+
+ m_display_width = fabsf(x1 - x0);
+ m_display_height = fabsf(y1 - y0);
- glViewport(viewport_x0, viewport_y0, viewport_width,
viewport_height);
+ glViewport(viewport_x0, viewport_y0, viewport_width,
viewport_height);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glOrtho(x0, x1, y0, y1, -1, 1);
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glOrtho(x0, x1, y0, y1, -1, 1);
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
- glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// GL_MODULATE
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// GL_MODULATE
- glDisable(GL_TEXTURE_2D);
+ glDisable(GL_TEXTURE_2D);
- // Clear the background, if background color has alpha > 0.
- if (background_color.m_a > 0)
+ // Clear the background, if background color has alpha > 0.
+ if (background_color.m_a > 0)
{
- // Draw a big quad.
- apply_color(background_color);
- glBegin(GL_QUADS);
- glVertex2f(x0, y0);
- glVertex2f(x1, y0);
- glVertex2f(x1, y1);
- glVertex2f(x0, y1);
- glEnd();
+ // Draw a big quad.
+ apply_color(background_color);
+ glBegin(GL_QUADS);
+ glVertex2f(x0, y0);
+ glVertex2f(x1, y0);
+ glVertex2f(x1, y1);
+ glVertex2f(x0, y1);
+ glEnd();
}
- // Old unused code. Might get revived someday.
+ // Old unused code. Might get revived someday.
// #if 0
// // See if we want to, and can, use multitexture
// // antialiasing.
@@ -441,198 +428,198 @@
}
- void end_display()
+ void end_display()
// Clean up after rendering a frame. Client program is still
// responsible for calling glSwapBuffers() or whatever.
{
- glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
}
- void set_matrix(const gnash::matrix& m)
+ void set_matrix(const gnash::matrix& m)
// Set the current transform for mesh & line-strip rendering.
{
- m_current_matrix = m;
+ m_current_matrix = m;
}
- void set_cxform(const gnash::cxform& cx)
+ void set_cxform(const gnash::cxform& cx)
// Set the current color transform for mesh & line-strip rendering.
{
- m_current_cxform = cx;
+ m_current_cxform = cx;
}
- static void apply_matrix(const gnash::matrix& m)
+ static void apply_matrix(const gnash::matrix& m)
// multiply current matrix with opengl matrix
{
- float mat[16];
- memset(&mat[0], 0, sizeof(mat));
- mat[0] = m.m_[0][0];
- mat[1] = m.m_[1][0];
- mat[4] = m.m_[0][1];
- mat[5] = m.m_[1][1];
- mat[10] = 1;
- mat[12] = m.m_[0][2];
- mat[13] = m.m_[1][2];
- mat[15] = 1;
- glMultMatrixf(mat);
+ float mat[16];
+ memset(&mat[0], 0, sizeof(mat));
+ mat[0] = m.m_[0][0];
+ mat[1] = m.m_[1][0];
+ mat[4] = m.m_[0][1];
+ mat[5] = m.m_[1][1];
+ mat[10] = 1;
+ mat[12] = m.m_[0][2];
+ mat[13] = m.m_[1][2];
+ mat[15] = 1;
+ glMultMatrixf(mat);
}
- static void apply_color(const gnash::rgba& c)
+ static void apply_color(const gnash::rgba& c)
// Set the given color.
{
- glColor4ub(c.m_r, c.m_g, c.m_b, c.m_a);
+ glColor4ub(c.m_r, c.m_g, c.m_b, c.m_a);
}
- void fill_style_disable(int fill_side)
+ void fill_style_disable(int fill_side)
// Don't fill on the {0 == left, 1 == right} side of a path.
{
- assert(fill_side >= 0 && fill_side < 2);
+ assert(fill_side >= 0 && fill_side < 2);
- m_current_styles[fill_side].disable();
+ m_current_styles[fill_side].disable();
}
- void line_style_disable()
+ void line_style_disable()
// Don't draw a line on this path.
{
- m_current_styles[LINE_STYLE].disable();
+ m_current_styles[LINE_STYLE].disable();
}
- void fill_style_color(int fill_side, gnash::rgba color)
+ void fill_style_color(int fill_side, gnash::rgba color)
// Set fill style for the left interior of the shape. If
// enable is false, turn off fill for the left interior.
{
- assert(fill_side >= 0 && fill_side < 2);
+ assert(fill_side >= 0 && fill_side < 2);
-
m_current_styles[fill_side].set_color(m_current_cxform.transform(color));
+
m_current_styles[fill_side].set_color(m_current_cxform.transform(color));
}
- void line_style_color(gnash::rgba color)
+ void line_style_color(gnash::rgba color)
// Set the line style of the shape. If enable is false, turn
// off lines for following curve segments.
{
-
m_current_styles[LINE_STYLE].set_color(m_current_cxform.transform(color));
+
m_current_styles[LINE_STYLE].set_color(m_current_cxform.transform(color));
}
- void fill_style_bitmap(int fill_side, const gnash::bitmap_info* bi,
const gnash::matrix& m, bitmap_wrap_mode wm)
+ void fill_style_bitmap(int fill_side, const gnash::bitmap_info* bi,
const gnash::matrix& m, bitmap_wrap_mode wm)
{
- assert(fill_side >= 0 && fill_side < 2);
- m_current_styles[fill_side].set_bitmap(bi, m, wm,
m_current_cxform);
+ assert(fill_side >= 0 && fill_side < 2);
+ m_current_styles[fill_side].set_bitmap(bi, m, wm, m_current_cxform);
}
- void line_style_width(float width)
+ void line_style_width(float width)
{
- // TODO: OpenGL doesn't seem to handle very low-width lines
well, even with anti-aliasing enabled
- // But this is a start (20 TWIPS' width = 1 pixel's)
- glLineWidth(TWIPS_TO_PIXELS(width));
+ // TODO: OpenGL doesn't seem to handle very low-width lines well,
even with anti-aliasing enabled
+ // But this is a start (20 TWIPS' width = 1 pixel's)
+ glLineWidth(TWIPS_TO_PIXELS(width));
}
- void draw_mesh_strip(const void* coords, int vertex_count)
+ void draw_mesh_strip(const void* coords, int vertex_count)
{
#define NORMAL_RENDERING
//#define MULTIPASS_ANTIALIASING
#ifdef NORMAL_RENDERING
- // Set up current style.
- m_current_styles[LEFT_STYLE].apply();
+ // Set up current style.
+ m_current_styles[LEFT_STYLE].apply();
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ apply_matrix(m_current_matrix);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- apply_matrix(m_current_matrix);
-
- // Send the tris to OpenGL
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, sizeof(Sint16) * 2, coords);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count);
+ // Send the tris to OpenGL
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_SHORT, sizeof(Sint16) * 2, coords);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count);
- if (m_current_styles[LEFT_STYLE].needs_second_pass())
+ if (m_current_styles[LEFT_STYLE].needs_second_pass())
{
- m_current_styles[LEFT_STYLE].apply_second_pass();
- glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count);
- m_current_styles[LEFT_STYLE].cleanup_second_pass();
+ m_current_styles[LEFT_STYLE].apply_second_pass();
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count);
+ m_current_styles[LEFT_STYLE].cleanup_second_pass();
}
- glDisableClientState(GL_VERTEX_ARRAY);
+ glDisableClientState(GL_VERTEX_ARRAY);
- glPopMatrix();
+ glPopMatrix();
#endif // NORMAL_RENDERING
#ifdef MULTIPASS_ANTIALIASING
- // So this approach basically works. This
- // implementation is not totally finished; two pass
- // materials (i.e. w/ additive color) aren't correct,
- // and there are some texture etc issues because I'm
- // just hosing state uncarefully here. It needs the
- // optimization of only filling the bounding box of
- // the shape. You must have destination alpha.
- //
- // It doesn't look quite perfect on my GF4. For one
- // thing, you kinda want to crank down the max curve
- // subdivision error, because suddenly you can see
- // sub-pixel shape much better. For another thing,
- // the antialiasing isn't quite perfect, to my eye.
- // It could be limited alpha precision, imperfections
- // GL_POLYGON_SMOOTH, and/or my imagination.
-
- glDisable(GL_TEXTURE_2D);
-
- glEnable(GL_POLYGON_SMOOTH);
- glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); // GL_NICEST,
GL_FASTEST, GL_DONT_CARE
+ // So this approach basically works. This
+ // implementation is not totally finished; two pass
+ // materials (i.e. w/ additive color) aren't correct,
+ // and there are some texture etc issues because I'm
+ // just hosing state uncarefully here. It needs the
+ // optimization of only filling the bounding box of
+ // the shape. You must have destination alpha.
+ //
+ // It doesn't look quite perfect on my GF4. For one
+ // thing, you kinda want to crank down the max curve
+ // subdivision error, because suddenly you can see
+ // sub-pixel shape much better. For another thing,
+ // the antialiasing isn't quite perfect, to my eye.
+ // It could be limited alpha precision, imperfections
+ // GL_POLYGON_SMOOTH, and/or my imagination.
+
+ glDisable(GL_TEXTURE_2D);
+
+ glEnable(GL_POLYGON_SMOOTH);
+ glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); // GL_NICEST,
GL_FASTEST, GL_DONT_CARE
+
+ // Clear destination alpha.
+ //
+ // @@ TODO Instead of drawing this huge screen-filling
+ // quad, we should take a bounding-box param from the
+ // caller, and draw the box (after apply_matrix;
+ // i.e. the box is in object space). The point being,
+ // to only fill the part of the screen that the shape
+ // is in.
+ glBlendFunc(GL_ZERO, GL_SRC_COLOR);
+ glColor4f(1, 1, 1, 0);
+ glBegin(GL_QUADS);
+ glVertex2f(0, 0);
+ glVertex2f(100000, 0);
+ glVertex2f(100000, 100000);
+ glVertex2f(0, 100000);
+ glEnd();
+
+ // Set mode for drawing alpha mask.
+ glBlendFunc(GL_ONE, GL_ONE); // additive blending
+ glColor4f(0, 0, 0, m_current_styles[LEFT_STYLE].m_color.m_a /
255.0f);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ apply_matrix(m_current_matrix);
+
+ // Send the tris to OpenGL. This produces an
+ // antialiased alpha mask of the mesh shape, in the
+ // destination alpha channel.
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_SHORT, sizeof(Sint16) * 2, coords);
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count);
+ glDisableClientState(GL_VERTEX_ARRAY);
- // Clear destination alpha.
- //
- // @@ TODO Instead of drawing this huge screen-filling
- // quad, we should take a bounding-box param from the
- // caller, and draw the box (after apply_matrix;
- // i.e. the box is in object space). The point being,
- // to only fill the part of the screen that the shape
- // is in.
- glBlendFunc(GL_ZERO, GL_SRC_COLOR);
- glColor4f(1, 1, 1, 0);
- glBegin(GL_QUADS);
- glVertex2f(0, 0);
- glVertex2f(100000, 0);
- glVertex2f(100000, 100000);
- glVertex2f(0, 100000);
- glEnd();
-
- // Set mode for drawing alpha mask.
- glBlendFunc(GL_ONE, GL_ONE); // additive blending
- glColor4f(0, 0, 0, m_current_styles[LEFT_STYLE].m_color.m_a /
255.0f);
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- apply_matrix(m_current_matrix);
-
- // Send the tris to OpenGL. This produces an
- // antialiased alpha mask of the mesh shape, in the
- // destination alpha channel.
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, sizeof(Sint16) * 2, coords);
- glDrawArrays(GL_TRIANGLE_STRIP, 0, vertex_count);
- glDisableClientState(GL_VERTEX_ARRAY);
-
- glPopMatrix();
+ glPopMatrix();
- // Set up desired fill style.
- m_current_styles[LEFT_STYLE].apply();
+ // Set up desired fill style.
+ m_current_styles[LEFT_STYLE].apply();
- // Apply fill, modulated with alpha mask.
- //
- // @@ TODO see note above about filling bounding box only.
- glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
- glBegin(GL_QUADS);
- glVertex2f(0, 0);
- glVertex2f(100000, 0);
- glVertex2f(100000, 100000);
- glVertex2f(0, 100000);
- glEnd();
+ // Apply fill, modulated with alpha mask.
+ //
+ // @@ TODO see note above about filling bounding box only.
+ glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA);
+ glBegin(GL_QUADS);
+ glVertex2f(0, 0);
+ glVertex2f(100000, 0);
+ glVertex2f(100000, 100000);
+ glVertex2f(0, 100000);
+ glEnd();
// xxxxx ??? Hm, is our mask still intact, or did we just erase it?
// if (m_current_styles[LEFT_STYLE].needs_second_pass())
@@ -642,79 +629,79 @@
// m_current_styles[LEFT_STYLE].cleanup_second_pass();
// }
- // @@ hm, there is perhaps more state that needs
- // fixing here, or setting elsewhere.
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ // @@ hm, there is perhaps more state that needs
+ // fixing here, or setting elsewhere.
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
#endif // MULTIPASS_ANTIALIASING
}
- void draw_line_strip(const void* coords, int vertex_count)
+ void draw_line_strip(const void* coords, int vertex_count)
// Draw the line strip formed by the sequence of points.
{
- // Set up current style.
- m_current_styles[LINE_STYLE].apply();
+ // Set up current style.
+ m_current_styles[LINE_STYLE].apply();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- apply_matrix(m_current_matrix);
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ apply_matrix(m_current_matrix);
- // Send the line-strip to OpenGL
- glEnableClientState(GL_VERTEX_ARRAY);
- glVertexPointer(2, GL_SHORT, sizeof(Sint16) * 2, coords);
- glDrawArrays(GL_LINE_STRIP, 0, vertex_count);
- glDisableClientState(GL_VERTEX_ARRAY);
+ // Send the line-strip to OpenGL
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(2, GL_SHORT, sizeof(Sint16) * 2, coords);
+ glDrawArrays(GL_LINE_STRIP, 0, vertex_count);
+ glDisableClientState(GL_VERTEX_ARRAY);
- glPopMatrix();
+ glPopMatrix();
}
- void draw_bitmap(
- const gnash::matrix& m,
- const gnash::bitmap_info* bi,
- const gnash::rect& coords,
- const gnash::rect& uv_coords,
- gnash::rgba color)
+ void draw_bitmap(
+ const gnash::matrix& m,
+ const gnash::bitmap_info* bi,
+ const gnash::rect& coords,
+ const gnash::rect& uv_coords,
+ gnash::rgba color)
// Draw a rectangle textured with the given bitmap, with the
// given color. Apply given transform; ignore any currently
// set transforms.
//
// Intended for textured glyph rendering.
{
- assert(bi);
+ assert(bi);
- apply_color(color);
+ apply_color(color);
- gnash::point a, b, c, d;
- m.transform(&a, gnash::point(coords.m_x_min, coords.m_y_min));
- m.transform(&b, gnash::point(coords.m_x_max, coords.m_y_min));
- m.transform(&c, gnash::point(coords.m_x_min, coords.m_y_max));
- d.m_x = b.m_x + c.m_x - a.m_x;
- d.m_y = b.m_y + c.m_y - a.m_y;
+ gnash::point a, b, c, d;
+ m.transform(&a, gnash::point(coords.m_x_min, coords.m_y_min));
+ m.transform(&b, gnash::point(coords.m_x_max, coords.m_y_min));
+ m.transform(&c, gnash::point(coords.m_x_min, coords.m_y_max));
+ d.m_x = b.m_x + c.m_x - a.m_x;
+ d.m_y = b.m_y + c.m_y - a.m_y;
- glBindTexture(GL_TEXTURE_2D, bi->m_texture_id);
- glEnable(GL_TEXTURE_2D);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
+ glBindTexture(GL_TEXTURE_2D, bi->m_texture_id);
+ glEnable(GL_TEXTURE_2D);
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
- glBegin(GL_TRIANGLE_STRIP);
+ glBegin(GL_TRIANGLE_STRIP);
- glTexCoord2f(uv_coords.m_x_min, uv_coords.m_y_min);
- glVertex2f(a.m_x, a.m_y);
+ glTexCoord2f(uv_coords.m_x_min, uv_coords.m_y_min);
+ glVertex2f(a.m_x, a.m_y);
- glTexCoord2f(uv_coords.m_x_max, uv_coords.m_y_min);
- glVertex2f(b.m_x, b.m_y);
+ glTexCoord2f(uv_coords.m_x_max, uv_coords.m_y_min);
+ glVertex2f(b.m_x, b.m_y);
- glTexCoord2f(uv_coords.m_x_min, uv_coords.m_y_max);
- glVertex2f(c.m_x, c.m_y);
+ glTexCoord2f(uv_coords.m_x_min, uv_coords.m_y_max);
+ glVertex2f(c.m_x, c.m_y);
- glTexCoord2f(uv_coords.m_x_max, uv_coords.m_y_max);
- glVertex2f(d.m_x, d.m_y);
+ glTexCoord2f(uv_coords.m_x_max, uv_coords.m_y_max);
+ glVertex2f(d.m_x, d.m_y);
- glEnd();
+ glEnd();
}
- void begin_submit_mask()
+ void begin_submit_mask()
{
glEnable(GL_STENCIL_TEST);
glClearStencil(0);
@@ -727,14 +714,14 @@
// replace if test
passes
}
- void end_submit_mask()
+ void end_submit_mask()
{
glColorMask(1,1,1,1); // enable framebuffer writes
glStencilFunc(GL_EQUAL, 1, 1); // we draw only where the
stencil is 1 (where the mask was drawn)
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); // don't change the
stencil buffer
}
- void disable_mask()
+ void disable_mask()
{
glDisable(GL_STENCIL_TEST);
}
@@ -752,47 +739,47 @@
// Sets the current texture to a resampled/expanded version of the
// given image data.
{
- assert(bytes_per_pixel == 3 || bytes_per_pixel == 4);
+ assert(bytes_per_pixel == 3 || bytes_per_pixel == 4);
- unsigned int in_format = bytes_per_pixel == 3 ? GL_RGB : GL_RGBA;
- unsigned int out_format = bytes_per_pixel == 3 ? GL_RGB : GL_RGBA;
+ unsigned int in_format = bytes_per_pixel == 3 ? GL_RGB : GL_RGBA;
+ unsigned int out_format = bytes_per_pixel == 3 ? GL_RGB : GL_RGBA;
- // alex: use the hardware to resample the image
- // issue: does not work when image > allocated window size!
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT);
- {
- char* temp = new char[dst_width * dst_height * bytes_per_pixel];
- //memset(temp,255,w*h*3);
- glTexImage2D(GL_TEXTURE_2D, 0, in_format, dst_width,
dst_height, 0, out_format, GL_UNSIGNED_BYTE, temp);
- glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, src_width, src_height,
out_format, GL_UNSIGNED_BYTE, src_data);
-
- glLoadIdentity();
- glViewport(0, 0, dst_width, dst_height);
- glOrtho(0, dst_width, 0, dst_height, 0.9, 1.1);
- glColor3f(1, 1, 1);
- glNormal3f(0, 0, 1);
- glBegin(GL_QUADS);
- {
- glTexCoord2f(0, (float) src_height / dst_height);
- glVertex3f(0, 0, -1);
- glTexCoord2f( (float) src_width / dst_width, (float)
src_height / dst_height);
- glVertex3f((float) dst_width, 0, -1);
- glTexCoord2f( (float) src_width / dst_width, 0);
- glVertex3f((float) dst_width, (float) dst_height, -1);
- glTexCoord2f(0, 0);
- glVertex3f(0, (float) dst_height, -1);
- }
- glEnd();
- glCopyTexImage2D(GL_TEXTURE_2D, 0, out_format, 0,0, dst_width,
dst_height, 0);
- delete temp;
- }
- glPopAttrib();
- glPopMatrix();
- glPopMatrix();
+ // alex: use the hardware to resample the image
+ // issue: does not work when image > allocated window size!
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT);
+ {
+ char* temp = new char[dst_width * dst_height * bytes_per_pixel];
+ //memset(temp,255,w*h*3);
+ glTexImage2D(GL_TEXTURE_2D, 0, in_format, dst_width, dst_height, 0,
out_format, GL_UNSIGNED_BYTE, temp);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, src_width, src_height,
out_format, GL_UNSIGNED_BYTE, src_data);
+
+ glLoadIdentity();
+ glViewport(0, 0, dst_width, dst_height);
+ glOrtho(0, dst_width, 0, dst_height, 0.9, 1.1);
+ glColor3f(1, 1, 1);
+ glNormal3f(0, 0, 1);
+ glBegin(GL_QUADS);
+ {
+ glTexCoord2f(0, (float) src_height / dst_height);
+ glVertex3f(0, 0, -1);
+ glTexCoord2f( (float) src_width / dst_width, (float) src_height /
dst_height);
+ glVertex3f((float) dst_width, 0, -1);
+ glTexCoord2f( (float) src_width / dst_width, 0);
+ glVertex3f((float) dst_width, (float) dst_height, -1);
+ glTexCoord2f(0, 0);
+ glVertex3f(0, (float) dst_height, -1);
+ }
+ glEnd();
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, out_format, 0,0, dst_width,
dst_height, 0);
+ delete temp;
+ }
+ glPopAttrib();
+ glPopMatrix();
+ glPopMatrix();
}
@@ -800,150 +787,150 @@
// DESTRUCTIVELY generate mipmaps of the given image. The image data
// and width/height of im are munged in this process.
{
- int level = 1;
- while (im->m_width > 1 || im->m_height > 1)
+ int level = 1;
+ while (im->m_width > 1 || im->m_height > 1)
{
- if (bytes_per_pixel == 3)
+ if (bytes_per_pixel == 3)
{
- image::make_next_miplevel((image::rgb*) im);
+ image::make_next_miplevel((image::rgb*) im);
}
- else
+ else
{
- image::make_next_miplevel((image::rgba*) im);
+ image::make_next_miplevel((image::rgba*) im);
}
- glTexImage2D(GL_TEXTURE_2D, level, internal_format,
im->m_width, im->m_height, 0,
- input_format, GL_UNSIGNED_BYTE, im->m_data);
- level++;
+ glTexImage2D(GL_TEXTURE_2D, level, internal_format, im->m_width,
im->m_height, 0,
+ input_format, GL_UNSIGNED_BYTE, im->m_data);
+ level++;
}
}
void software_resample(
- int bytes_per_pixel,
- int src_width,
- int src_height,
- int src_pitch,
- uint8* src_data,
- int dst_width,
- int dst_height)
+ int bytes_per_pixel,
+ int src_width,
+ int src_height,
+ int src_pitch,
+ uint8* src_data,
+ int dst_width,
+ int dst_height)
// Code from Alex Streit
//
// Creates an OpenGL texture of the specified dst dimensions, from a
// resampled version of the given src image. Does a bilinear
// resampling to create the dst image.
{
- assert(bytes_per_pixel == 3 || bytes_per_pixel == 4);
+ assert(bytes_per_pixel == 3 || bytes_per_pixel == 4);
- assert(dst_width >= src_width);
- assert(dst_height >= src_height);
+ assert(dst_width >= src_width);
+ assert(dst_height >= src_height);
- unsigned int internal_format = bytes_per_pixel == 3 ? GL_RGB :
GL_RGBA;
- unsigned int input_format = bytes_per_pixel == 3 ? GL_RGB : GL_RGBA;
+ unsigned int internal_format = bytes_per_pixel == 3 ? GL_RGB :
GL_RGBA;
+ unsigned int input_format = bytes_per_pixel == 3 ? GL_RGB : GL_RGBA;
- // FAST bi-linear filtering
- // the code here is designed to be fast, not readable
- Uint8* rescaled = new Uint8[dst_width * dst_height * bytes_per_pixel];
- float Uf, Vf; // fractional parts
- float Ui, Vi; // integral parts
- float w1, w2, w3, w4; // weighting
- Uint8* psrc;
- Uint8* pdst = rescaled;
- // i1,i2,i3,i4 are the offsets of the surrounding 4 pixels
- const int i1 = 0;
- const int i2 = bytes_per_pixel;
- int i3 = src_pitch;
- int i4 = src_pitch + bytes_per_pixel;
- // change in source u and v
- float dv = (float)(src_height-2) / dst_height;
- float du = (float)(src_width-2) / dst_width;
- // source u and source v
- float U;
- float V=0;
+ // FAST bi-linear filtering
+ // the code here is designed to be fast, not readable
+ Uint8* rescaled = new Uint8[dst_width * dst_height * bytes_per_pixel];
+ float Uf, Vf; // fractional parts
+ float Ui, Vi; // integral parts
+ float w1, w2, w3, w4; // weighting
+ Uint8* psrc;
+ Uint8* pdst = rescaled;
+ // i1,i2,i3,i4 are the offsets of the surrounding 4 pixels
+ const int i1 = 0;
+ const int i2 = bytes_per_pixel;
+ int i3 = src_pitch;
+ int i4 = src_pitch + bytes_per_pixel;
+ // change in source u and v
+ float dv = (float)(src_height-2) / dst_height;
+ float du = (float)(src_width-2) / dst_width;
+ // source u and source v
+ float U;
+ float V=0;
#define BYTE_SAMPLE(offset) \
(Uint8) (w1 * psrc[i1 + (offset)] + w2 * psrc[i2 + (offset)] + w3 *
psrc[i3 + (offset)] + w4 * psrc[i4 + (offset)])
- if (bytes_per_pixel == 3)
+ if (bytes_per_pixel == 3)
{
- for (int v = 0; v < dst_height; ++v)
+ for (int v = 0; v < dst_height; ++v)
{
- Vf = modff(V, &Vi);
- V+=dv;
- U=0;
+ Vf = modff(V, &Vi);
+ V+=dv;
+ U=0;
- for (int u = 0; u < dst_width; ++u)
+ for (int u = 0; u < dst_width; ++u)
{
- Uf = modff(U, &Ui);
- U+=du;
+ Uf = modff(U, &Ui);
+ U+=du;
- w1 = (1 - Uf) * (1 - Vf);
- w2 = Uf * (1 - Vf);
- w3 = (1 - Uf) * Vf;
- w4 = Uf * Vf;
- psrc = &src_data[(int) (Vi * src_pitch) + (int)
(Ui * bytes_per_pixel)];
-
- *pdst++ = BYTE_SAMPLE(0); // red
- *pdst++ = BYTE_SAMPLE(1); // green
- *pdst++ = BYTE_SAMPLE(2); // blue
+ w1 = (1 - Uf) * (1 - Vf);
+ w2 = Uf * (1 - Vf);
+ w3 = (1 - Uf) * Vf;
+ w4 = Uf * Vf;
+ psrc = &src_data[(int) (Vi * src_pitch) + (int) (Ui
* bytes_per_pixel)];
+
+ *pdst++ = BYTE_SAMPLE(0); // red
+ *pdst++ = BYTE_SAMPLE(1); // green
+ *pdst++ = BYTE_SAMPLE(2); // blue
- psrc += 3;
+ psrc += 3;
}
}
#ifdef DEBUG_WRITE_TEXTURES_TO_PPM
- static int s_image_sequence = 0;
- char temp[256];
- sprintf(temp, "image%d.ppm", s_image_sequence++);
- FILE* f = fopen(temp, "wb");
- if (f)
- {
- fprintf(f, "P6\n# test code\n%d %d\n255\n", dst_width,
dst_height);
- fwrite(rescaled, dst_width * dst_height * 3, 1, f);
- fclose(f);
+ static int s_image_sequence = 0;
+ char temp[256];
+ sprintf(temp, "image%d.ppm", s_image_sequence++);
+ FILE* f = fopen(temp, "wb");
+ if (f)
+ {
+ fprintf(f, "P6\n# test code\n%d %d\n255\n", dst_width,
dst_height);
+ fwrite(rescaled, dst_width * dst_height * 3, 1, f);
+ fclose(f);
}
#endif
}
- else
+ else
{
- assert(bytes_per_pixel == 4);
+ assert(bytes_per_pixel == 4);
- for (int v = 0; v < dst_height; ++v)
+ for (int v = 0; v < dst_height; ++v)
{
- Vf = modff(V, &Vi);
- V+=dv;
- U=0;
+ Vf = modff(V, &Vi);
+ V+=dv;
+ U=0;
- for (int u = 0; u < dst_width; ++u)
+ for (int u = 0; u < dst_width; ++u)
{
- Uf = modff(U, &Ui);
- U+=du;
+ Uf = modff(U, &Ui);
+ U+=du;
- w1 = (1 - Uf) * (1 - Vf);
- w2 = Uf * (1 - Vf);
- w3 = (1 - Uf) * Vf;
- w4 = Uf * Vf;
- psrc = &src_data[(int) (Vi * src_pitch) + (int)
(Ui * bytes_per_pixel)];
-
- *pdst++ = BYTE_SAMPLE(0); // red
- *pdst++ = BYTE_SAMPLE(1); // green
- *pdst++ = BYTE_SAMPLE(2); // blue
- *pdst++ = BYTE_SAMPLE(3); // alpha
+ w1 = (1 - Uf) * (1 - Vf);
+ w2 = Uf * (1 - Vf);
+ w3 = (1 - Uf) * Vf;
+ w4 = Uf * Vf;
+ psrc = &src_data[(int) (Vi * src_pitch) + (int) (Ui
* bytes_per_pixel)];
+
+ *pdst++ = BYTE_SAMPLE(0); // red
+ *pdst++ = BYTE_SAMPLE(1); // green
+ *pdst++ = BYTE_SAMPLE(2); // blue
+ *pdst++ = BYTE_SAMPLE(3); // alpha
- psrc += 4;
+ psrc += 4;
}
}
}
- glTexImage2D(GL_TEXTURE_2D, 0, internal_format, dst_width, dst_height,
0, input_format, GL_UNSIGNED_BYTE, rescaled);
+ glTexImage2D(GL_TEXTURE_2D, 0, internal_format, dst_width, dst_height, 0,
input_format, GL_UNSIGNED_BYTE, rescaled);
#if GENERATE_MIPMAPS
- // Build mipmaps.
- image::image_base im(rescaled, dst_width, dst_height, dst_width *
bytes_per_pixel);
- generate_mipmaps(internal_format, input_format, bytes_per_pixel, &im);
+ // Build mipmaps.
+ image::image_base im(rescaled, dst_width, dst_height, dst_width *
bytes_per_pixel);
+ generate_mipmaps(internal_format, input_format, bytes_per_pixel, &im);
#endif // GENERATE_MIPMAPS
- delete [] rescaled;
+ delete [] rescaled;
}
@@ -951,9 +938,9 @@
// Make a placeholder bitmap_info. Must be filled in later before
// using.
{
- m_texture_id = 0;
- m_original_width = 0;
- m_original_height = 0;
+ m_texture_id = 0;
+ m_original_width = 0;
+ m_original_height = 0;
}
@@ -963,43 +950,43 @@
//
// !! Munges *data in order to create mipmaps !!
{
- assert(width > 0);
- assert(height > 0);
- assert(data);
+ assert(width > 0);
+ assert(height > 0);
+ assert(data);
- m_texture_id = 0;
+ m_texture_id = 0;
- // Create the texture.
+ // Create the texture.
- glEnable(GL_TEXTURE_2D);
- glGenTextures(1, (GLuint*)&m_texture_id);
- glBindTexture(GL_TEXTURE_2D, m_texture_id);
-
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// GL_NEAREST ?
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
-
- m_original_width = width;
- m_original_height = height;
-
- #ifndef NDEBUG
- // You must use power-of-two dimensions!!
- int w = 1; while (w < width) { w <<= 1; }
- int h = 1; while (h < height) { h <<= 1; }
- assert(w == width);
- assert(h == height);
- #endif // not NDEBUG
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA,
GL_UNSIGNED_BYTE, data);
-
- // Build mips.
- int level = 1;
- while (width > 1 || height > 1)
- {
- render_handler_ogl::make_next_miplevel(&width, &height, data);
- glTexImage2D(GL_TEXTURE_2D, level, GL_ALPHA, width, height, 0,
GL_ALPHA, GL_UNSIGNED_BYTE, data);
- level++;
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, (GLuint*)&m_texture_id);
+ glBindTexture(GL_TEXTURE_2D, m_texture_id);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //
GL_NEAREST ?
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
+
+ m_original_width = width;
+ m_original_height = height;
+
+#ifndef NDEBUG
+ // You must use power-of-two dimensions!!
+ int w = 1; while (w < width) { w <<= 1; }
+ int h = 1; while (h < height) { h <<= 1; }
+ assert(w == width);
+ assert(h == height);
+#endif // not NDEBUG
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, width, height, 0, GL_ALPHA,
GL_UNSIGNED_BYTE, data);
+
+ // Build mips.
+ int level = 1;
+ while (width > 1 || height > 1)
+ {
+ render_handler_ogl::make_next_miplevel(&width, &height, data);
+ glTexImage2D(GL_TEXTURE_2D, level, GL_ALPHA, width, height, 0,
GL_ALPHA, GL_UNSIGNED_BYTE, data);
+ level++;
}
}
@@ -1007,76 +994,76 @@
bitmap_info_ogl::bitmap_info_ogl(image::rgb* im)
// NOTE: This function destroys im's data in the process of making mipmaps.
{
- assert(im);
+ assert(im);
- // Create the texture.
+ // Create the texture.
- glEnable(GL_TEXTURE_2D);
- glGenTextures(1, (GLuint*)&m_texture_id);
- glBindTexture(GL_TEXTURE_2D, m_texture_id);
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, (GLuint*)&m_texture_id);
+ glBindTexture(GL_TEXTURE_2D, m_texture_id);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
#if GENERATE_MIPMAPS
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
#else
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
#endif
- m_original_width = im->m_width;
- m_original_height = im->m_height;
+ m_original_width = im->m_width;
+ m_original_height = im->m_height;
- int w = 1; while (w < im->m_width) { w <<= 1; }
- int h = 1; while (h < im->m_height) { h <<= 1; }
+ int w = 1; while (w < im->m_width) { w <<= 1; }
+ int h = 1; while (h < im->m_height) { h <<= 1; }
- if (w != im->m_width
- || h != im->m_height)
+ if (w != im->m_width
+ || h != im->m_height)
{
#if (RESAMPLE_METHOD == 1)
- int viewport_dim[2] = { 0, 0 };
- glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &viewport_dim[0]);
- if (w > viewport_dim[0]
- || h > viewport_dim[1]
- || im->m_width * 3 != im->m_pitch)
- {
- // Can't use hardware resample. Either frame
- // buffer isn't big enough to fit the source
- // texture, or the source data isn't padded
- // quite right.
- software_resample(3, im->m_width, im->m_height,
im->m_pitch, im->m_data, w, h);
+ int viewport_dim[2] = { 0, 0 };
+ glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &viewport_dim[0]);
+ if (w > viewport_dim[0]
+ || h > viewport_dim[1]
+ || im->m_width * 3 != im->m_pitch)
+ {
+ // Can't use hardware resample. Either frame
+ // buffer isn't big enough to fit the source
+ // texture, or the source data isn't padded
+ // quite right.
+ software_resample(3, im->m_width, im->m_height,
im->m_pitch, im->m_data, w, h);
}
- else
+ else
{
- hardware_resample(3, im->m_width, im->m_height,
im->m_data, w, h);
+ hardware_resample(3, im->m_width, im->m_height, im->m_data,
w, h);
}
#elif (RESAMPLE_METHOD == 2)
- {
- // Faster/simpler software bilinear rescale.
- software_resample(3, im->m_width, im->m_height,
im->m_pitch, im->m_data, w, h);
- }
+ {
+ // Faster/simpler software bilinear rescale.
+ software_resample(3, im->m_width, im->m_height, im->m_pitch,
im->m_data, w, h);
+ }
#else
- {
- // Fancy but slow software resampling.
- image::rgb* rescaled = image::create_rgb(w, h);
- image::resample(rescaled, 0, 0, w - 1, h - 1,
- im, 0, 0, (float) im->m_width, (float)
im->m_height);
+ {
+ // Fancy but slow software resampling.
+ image::rgb* rescaled = image::create_rgb(w, h);
+ image::resample(rescaled, 0, 0, w - 1, h - 1,
+ im, 0, 0, (float) im->m_width, (float)
im->m_height);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
GL_UNSIGNED_BYTE, rescaled->m_data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
GL_UNSIGNED_BYTE, rescaled->m_data);
#if GENERATE_MIPMAPS
- generate_mipmaps(GL_RGB, GL_RGB, 3, rescaled);
+ generate_mipmaps(GL_RGB, GL_RGB, 3, rescaled);
#endif // GENERATE_MIPMAPS
- delete rescaled;
- }
+ delete rescaled;
+ }
#endif
}
- else
+ else
{
- // Use original image directly.
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
GL_UNSIGNED_BYTE, im->m_data);
+ // Use original image directly.
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
GL_UNSIGNED_BYTE, im->m_data);
#if GENERATE_MIPMAPS
- generate_mipmaps(GL_RGB, GL_RGB, 3, im);
+ generate_mipmaps(GL_RGB, GL_RGB, 3, im);
#endif // GENERATE_MIPMAPS
}
}
@@ -1086,76 +1073,76 @@
// Version of the constructor that takes an image with alpha.
// NOTE: This function destroys im's data in the process of making mipmaps.
{
- assert(im);
+ assert(im);
- // Create the texture.
+ // Create the texture.
- glEnable(GL_TEXTURE_2D);
- glGenTextures(1, (GLuint*)&m_texture_id);
- glBindTexture(GL_TEXTURE_2D, m_texture_id);
+ glEnable(GL_TEXTURE_2D);
+ glGenTextures(1, (GLuint*)&m_texture_id);
+ glBindTexture(GL_TEXTURE_2D, m_texture_id);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// GL_NEAREST ?
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //
GL_NEAREST ?
#if GENERATE_MIPMAPS
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_LINEAR);
#else
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
#endif
- m_original_width = im->m_width;
- m_original_height = im->m_height;
+ m_original_width = im->m_width;
+ m_original_height = im->m_height;
- int w = 1; while (w < im->m_width) { w <<= 1; }
- int h = 1; while (h < im->m_height) { h <<= 1; }
+ int w = 1; while (w < im->m_width) { w <<= 1; }
+ int h = 1; while (h < im->m_height) { h <<= 1; }
- if (w != im->m_width
- || h != im->m_height)
+ if (w != im->m_width
+ || h != im->m_height)
{
#if (RESAMPLE_METHOD == 1)
- int viewport_dim[2] = { 0, 0 };
- glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &viewport_dim[0]);
- if (w > viewport_dim[0]
- || h > viewport_dim[1]
- || im->m_width * 4 != im->m_pitch)
- {
- // Can't use hardware resample. Either frame
- // buffer isn't big enough to fit the source
- // texture, or the source data isn't padded
- // quite right.
- software_resample(4, im->m_width, im->m_height,
im->m_pitch, im->m_data, w, h);
+ int viewport_dim[2] = { 0, 0 };
+ glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &viewport_dim[0]);
+ if (w > viewport_dim[0]
+ || h > viewport_dim[1]
+ || im->m_width * 4 != im->m_pitch)
+ {
+ // Can't use hardware resample. Either frame
+ // buffer isn't big enough to fit the source
+ // texture, or the source data isn't padded
+ // quite right.
+ software_resample(4, im->m_width, im->m_height,
im->m_pitch, im->m_data, w, h);
}
- else
+ else
{
- hardware_resample(4, im->m_width, im->m_height,
im->m_data, w, h);
+ hardware_resample(4, im->m_width, im->m_height, im->m_data,
w, h);
}
#elif (RESAMPLE_METHOD == 2)
- {
- // Faster/simpler software bilinear rescale.
- software_resample(4, im->m_width, im->m_height,
im->m_pitch, im->m_data, w, h);
- }
+ {
+ // Faster/simpler software bilinear rescale.
+ software_resample(4, im->m_width, im->m_height, im->m_pitch,
im->m_data, w, h);
+ }
#else
- {
- // Fancy but slow software resampling.
- image::rgba* rescaled = image::create_rgba(w, h);
- image::resample(rescaled, 0, 0, w - 1, h - 1,
- im, 0, 0, (float) im->m_width, (float)
im->m_height);
+ {
+ // Fancy but slow software resampling.
+ image::rgba* rescaled = image::create_rgba(w, h);
+ image::resample(rescaled, 0, 0, w - 1, h - 1,
+ im, 0, 0, (float) im->m_width, (float)
im->m_height);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0,
GL_RGBA, GL_UNSIGNED_BYTE, rescaled->m_data);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, rescaled->m_data);
#if GENERATE_MIPMAPS
- generate_mipmaps(GL_RGBA, GL_RGBA, 4, rescaled);
+ generate_mipmaps(GL_RGBA, GL_RGBA, 4, rescaled);
#endif // GENERATE_MIPMAPS
- delete rescaled;
- }
+ delete rescaled;
+ }
#endif
}
- else
+ else
{
- // Use original image directly.
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, im->m_data);
+ // Use original image directly.
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, im->m_data);
#if GENERATE_MIPMAPS
- generate_mipmaps(GL_RGBA, GL_RGBA, 4, im);
+ generate_mipmaps(GL_RGBA, GL_RGBA, 4, im);
#endif // GENERATE_MIPMAPS
}
}
@@ -1164,7 +1151,7 @@
gnash::render_handler* gnash::create_render_handler_ogl()
// Factory.
{
- return new render_handler_ogl;
+ return new render_handler_ogl;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash/backend gnash.cpp render_handler_ogl.cpp,
Rob Savoye <=