Commit 7cacfd05 authored by pickle136's avatar pickle136

Addition of the scale feature, menu control and option added.

optional code which can be selected by the define SCALE
parent f13f9c54
...@@ -13,14 +13,16 @@ objects = src/bonus/bonus.o \ ...@@ -13,14 +13,16 @@ objects = src/bonus/bonus.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \ src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \
src/menu/menuutil.o src/menu/setupmenu.o \ src/menu/menuutil.o src/menu/setupmenu.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \ src/player/bird.o src/player/player.o src/player/playerframe.o \
src/main.o src/movable.o src/planet.o src/scene.o src/util.o src/main.o src/movable.o src/planet.o src/scene.o src/util.o \
src/scale2x/getopt.o src/scale2x/pixel.o src/scale2x/scale2x.o \
src/scale2x/scale3x.o src/scale2x/scalebit.o src/scale2x/simple2x.o
OpenJazz: $(objects) OpenJazz: $(objects)
cc -Wall -o OpenJazz -lSDL -lstdc++ $(objects) cc -Wall -o OpenJazz -lSDL -lstdc++ $(objects)
%.o: %.cpp %.o: %.cpp
cc -Wall -DUSE_SOCKETS -Isrc -O2 -c $< -o $@ cc -Wall -DUSE_SOCKETS -DSCALE -Isrc -O2 -c $< -o $@
clean: clean:
rm -f OpenJazz $(objects) rm -f OpenJazz $(objects)
...@@ -37,12 +37,14 @@ OBJS = src/bonus/bonus.o \ ...@@ -37,12 +37,14 @@ OBJS = src/bonus/bonus.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \ src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \
src/menu/menuutil.o src/menu/setupmenu.o \ src/menu/menuutil.o src/menu/setupmenu.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \ src/player/bird.o src/player/player.o src/player/playerframe.o \
src/main.o src/movable.o src/planet.o src/scene.o src/util.o src/main.o src/movable.o src/planet.o src/scene.o src/util.o \
src/scale2x/getopt.o src/scale2x/pixel.o src/scale2x/scale2x.o \
src/scale2x/scale3x.o src/scale2x/scalebit.o src/scale2x/simple2x.o
CXX = $(PREFIX)/bin/$(TARGET)g++ CXX = $(PREFIX)/bin/$(TARGET)g++
ifeq ($(BUILDTYPE),PANDORA) ifeq ($(BUILDTYPE),PANDORA)
CXXFLAGS += CXXFLAGS += -DSCALE
LDFLAGS += -lts LDFLAGS += -lts
else else
ifeq ($(BUILDTYPE),WIZ) ifeq ($(BUILDTYPE),WIZ)
...@@ -55,13 +57,13 @@ OBJS += src/platforms/wiz.o ...@@ -55,13 +57,13 @@ OBJS += src/platforms/wiz.o
CXXFLAGS += -DGP2X -DFULLSCREEN_ONLY CXXFLAGS += -DGP2X -DFULLSCREEN_ONLY
LDFLAGS += -static -lpthread LDFLAGS += -static -lpthread
else # default linux else # default linux
CXXFLAGS += CXXFLAGS += -DSCALE
LDFLAGS += LDFLAGS +=
endif endif
endif endif
endif endif
CXXFLAGS += -g -Wall -O2 -fsigned-char -DUSE_SOCKETS -I$(PREFIX)/include -I$(PREFIX)/include/SDL -Isrc CXXFLAGS += -g -Wall -O3 -fsigned-char -DUSE_SOCKETS -I$(PREFIX)/include -I$(PREFIX)/include/SDL -Isrc
LDFLAGS += -L$(PREFIX)/lib -lSDL LDFLAGS += -L$(PREFIX)/lib -lSDL
# Uncomment the following two lines for music (requires libmodplug) # Uncomment the following two lines for music (requires libmodplug)
......
...@@ -13,10 +13,12 @@ objects = src/bonus/bonus.o \ ...@@ -13,10 +13,12 @@ objects = src/bonus/bonus.o \
src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \ src/menu/gamemenu.o src/menu/mainmenu.o src/menu/menu.o \
src/menu/menuutil.o src/menu/setupmenu.o \ src/menu/menuutil.o src/menu/setupmenu.o \
src/player/bird.o src/player/player.o src/player/playerframe.o \ src/player/bird.o src/player/player.o src/player/playerframe.o \
src/main.o src/movable.o src/planet.o src/scene.o src/util.o src/main.o src/movable.o src/planet.o src/scene.o src/util.o \
src/scale2x/getopt.o src/scale2x/pixel.o src/scale2x/scale2x.o \
src/scale2x/scale3x.o src/scale2x/scalebit.o src/scale2x/simple2x.o
CXXFLAGS += -g -Wall -O2 -DUSE_SOCKETS CXXFLAGS += -g -Wall -O2 -DUSE_SOCKETS -DSCALE
# Uncomment the following two lines for music (requires libmodplug) # Uncomment the following two lines for music (requires libmodplug)
#CXXFLAGS += -DUSE_MODPLUG `pkg-config --cflags libmodplug` #CXXFLAGS += -DUSE_MODPLUG `pkg-config --cflags libmodplug`
......
...@@ -42,17 +42,20 @@ SDL_Surface * createSurface (unsigned char * pixels, int width, int height) { ...@@ -42,17 +42,20 @@ SDL_Surface * createSurface (unsigned char * pixels, int width, int height) {
// Set the surface's palette // Set the surface's palette
SDL_SetPalette(ret, SDL_LOGPAL, logicalPalette, 0, 256); SDL_SetPalette(ret, SDL_LOGPAL, logicalPalette, 0, 256);
// Upload pixel data to the surface if (pixels != NULL )
if (SDL_MUSTLOCK(ret)) SDL_LockSurface(ret); {
// Upload pixel data to the surface
if (SDL_MUSTLOCK(ret)) SDL_LockSurface(ret);
for (y = 0; y < height; y++) for (y = 0; y < height; y++)
memcpy(((unsigned char *)(ret->pixels)) + (ret->pitch * y), memcpy(((unsigned char *)(ret->pixels)) + (ret->pitch * y),
pixels + (width * y), width); pixels + (width * y), width);
if (SDL_MUSTLOCK(ret)) SDL_UnlockSurface(ret); if (SDL_MUSTLOCK(ret)) SDL_UnlockSurface(ret);
// Free redundant pixel data // Free redundant pixel data
delete[] pixels; delete[] pixels;
}
return ret; return ret;
...@@ -60,18 +63,34 @@ SDL_Surface * createSurface (unsigned char * pixels, int width, int height) { ...@@ -60,18 +63,34 @@ SDL_Surface * createSurface (unsigned char * pixels, int width, int height) {
void createFullscreen () { void createFullscreen () {
#if defined(WIZ) || defined(GP2X) #if defined(WIZ) || defined(GP2X)
screen = SDL_SetVideoMode(320, 240, 8, screen = SDL_SetVideoMode(320, 240, 8,
SDL_FULLSCREEN | SDL_SWSURFACE | SDL_HWPALETTE); SDL_FULLSCREEN | SDL_SWSURFACE | SDL_HWPALETTE);
#else #else
#ifdef SCALE
screen_scaled = SDL_SetVideoMode(screenW*scalar, screenH*scalar, 8,
SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE);
if (screen)
SDL_FreeSurface(screen);
screen = createSurface( NULL, screenW, screenH );
SDL_SetPalette(screen_scaled, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen_scaled, SDL_PHYSPAL, currentPalette, 0, 256);
#else
screen = SDL_SetVideoMode(screenW, screenH, 8, screen = SDL_SetVideoMode(screenW, screenH, 8,
SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE); SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE);
SDL_SetPalette(screen, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen, SDL_PHYSPAL, currentPalette, 0, 256);
#endif
#endif #endif
SDL_ShowCursor(SDL_DISABLE); SDL_ShowCursor(SDL_DISABLE);
SDL_SetPalette(screen, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen, SDL_PHYSPAL, currentPalette, 0, 256);
/* A real 8-bit display is quite likely if the user has the right video /* A real 8-bit display is quite likely if the user has the right video
card, the right video drivers, the right version of DirectX/whatever, and card, the right video drivers, the right version of DirectX/whatever, and
...@@ -90,13 +109,25 @@ void createFullscreen () { ...@@ -90,13 +109,25 @@ void createFullscreen () {
#ifndef FULLSCREEN_ONLY #ifndef FULLSCREEN_ONLY
void createWindow () { void createWindow () {
#ifdef SCALE
screen_scaled = SDL_SetVideoMode(screenW*scalar, screenH*scalar, 8,
SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_HWSURFACE);
if (screen)
SDL_FreeSurface(screen);
screen = createSurface( NULL, screenW, screenH );
SDL_SetPalette(screen_scaled, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen_scaled, SDL_PHYSPAL, currentPalette, 0, 256);
#else
screen = SDL_SetVideoMode(screenW, screenH, 8, screen = SDL_SetVideoMode(screenW, screenH, 8,
SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE); SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE);
SDL_SetPalette(screen, SDL_LOGPAL, logicalPalette, 0, 256); SDL_SetPalette(screen, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen, SDL_PHYSPAL, currentPalette, 0, 256); SDL_SetPalette(screen, SDL_PHYSPAL, currentPalette, 0, 256);
#endif
SDL_ShowCursor(SDL_ENABLE); SDL_ShowCursor(SDL_ENABLE);
/* Assume that in windowed mode the palette is being emulated. /* Assume that in windowed mode the palette is being emulated.
...@@ -114,9 +145,14 @@ void usePalette (SDL_Color *palette) { ...@@ -114,9 +145,14 @@ void usePalette (SDL_Color *palette) {
// Make palette changes invisible until the next draw. Hopefully. // Make palette changes invisible until the next draw. Hopefully.
clearScreen(SDL_MapRGB(screen->format, 0, 0, 0)); clearScreen(SDL_MapRGB(screen->format, 0, 0, 0));
#ifndef SCALE
SDL_Flip(screen); SDL_Flip(screen);
#endif
SDL_SetPalette(screen, SDL_PHYSPAL, palette, 0, 256); SDL_SetPalette(screen, SDL_PHYSPAL, palette, 0, 256);
#ifdef SCALE
SDL_SetPalette(screen_scaled, SDL_PHYSPAL, palette, 0, 256);
#endif
currentPalette = palette; currentPalette = palette;
return; return;
...@@ -160,5 +196,3 @@ void drawRect (int x, int y, int width, int height, int index) { ...@@ -160,5 +196,3 @@ void drawRect (int x, int y, int width, int height, int index) {
return; return;
} }
...@@ -39,6 +39,10 @@ ...@@ -39,6 +39,10 @@
EXTERN SDL_Surface *screen; EXTERN SDL_Surface *screen;
EXTERN int viewW, viewH, screenW, screenH; EXTERN int viewW, viewH, screenW, screenH;
EXTERN int scalar;
#ifdef SCALE
EXTERN SDL_Surface *screen_scaled;
#endif
#ifndef FULLSCREEN_ONLY #ifndef FULLSCREEN_ONLY
EXTERN bool fullscreen; EXTERN bool fullscreen;
#endif #endif
......
...@@ -57,6 +57,10 @@ extern int volume_direction; ...@@ -57,6 +57,10 @@ extern int volume_direction;
extern char KOpenJazzPath[256]; extern char KOpenJazzPath[256];
#endif #endif
#ifdef SCALE
#include "scale2x/scalebit.h"
#endif
int loadMain (int argc, char *argv[]) { int loadMain (int argc, char *argv[]) {
File *file; File *file;
...@@ -191,6 +195,13 @@ int loadMain (int argc, char *argv[]) { ...@@ -191,6 +195,13 @@ int loadMain (int argc, char *argv[]) {
// Read video settings // Read video settings
screenW = file->loadShort(); screenW = file->loadShort();
screenH = file->loadShort(); screenH = file->loadShort();
#ifdef SCALE
scalar = file->loadChar();
#else
scalar = 1;
file->loadChar();
#endif
#ifdef FULLSCREEN_ONLY #ifdef FULLSCREEN_ONLY
file->loadChar(); file->loadChar();
#else #else
...@@ -255,8 +266,11 @@ int loadMain (int argc, char *argv[]) { ...@@ -255,8 +266,11 @@ int loadMain (int argc, char *argv[]) {
else createWindow(); else createWindow();
#endif #endif
#ifdef SCALE
if (!screen_scaled) {
#else
if (!screen) { if (!screen) {
#endif
logError("Could not set video mode", SDL_GetError()); logError("Could not set video mode", SDL_GetError());
delete characterName; delete characterName;
...@@ -279,6 +293,9 @@ int loadMain (int argc, char *argv[]) { ...@@ -279,6 +293,9 @@ int loadMain (int argc, char *argv[]) {
logicalPalette[count].b = count; logicalPalette[count].b = count;
restorePalette(screen); restorePalette(screen);
#ifdef SCALE
restorePalette(screen_scaled);
#endif
firstPE = NULL; firstPE = NULL;
...@@ -465,6 +482,9 @@ void freeMain () { ...@@ -465,6 +482,9 @@ void freeMain () {
SDL_FreeSurface(panelAmmo[3]); SDL_FreeSurface(panelAmmo[3]);
SDL_FreeSurface(panelAmmo[4]); SDL_FreeSurface(panelAmmo[4]);
#ifdef SCALE
SDL_FreeSurface(screen);
#endif
closeAudio(); closeAudio();
...@@ -489,6 +509,12 @@ void freeMain () { ...@@ -489,6 +509,12 @@ void freeMain () {
// Write video settings // Write video settings
file->storeShort(screenW); file->storeShort(screenW);
file->storeShort(screenH); file->storeShort(screenH);
#ifdef SCALE
file->storeChar(scalar);
#else
file->storeChar(1);
#endif
#ifdef FULLSCREEN_ONLY #ifdef FULLSCREEN_ONLY
file->storeChar(1); file->storeChar(1);
#else #else
...@@ -544,9 +570,27 @@ int loop (int type) { ...@@ -544,9 +570,27 @@ int loop (int type) {
SDL_Event event; SDL_Event event;
int prevTicks, ret; int prevTicks, ret;
// Show everything that has been drawn so far // Show everything that has been drawn so far
#ifdef SCALE
if (scalar>1) {
int depth = screen_scaled->format->BytesPerPixel;
scale(scalar, screen_scaled->pixels, screen->w*depth*scalar, screen->pixels, screen->w*depth,
depth, screen->w, screen->h );
//Simple2x((unsigned char*)screen->pixels, screen->w*depth, 0, (unsigned char*)screen_scaled->pixels, screen->w*depth*2,
// screen->w, screen->h );
}
else
{
SDL_BlitSurface(screen, NULL, screen_scaled, NULL);
}
SDL_Flip(screen_scaled);
#else
SDL_Flip(screen); SDL_Flip(screen);
#endif
prevTicks = globalTicks; prevTicks = globalTicks;
globalTicks = SDL_GetTicks(); globalTicks = SDL_GetTicks();
...@@ -605,9 +649,20 @@ int loop (int type) { ...@@ -605,9 +649,20 @@ int loop (int type) {
screenW = event.resize.w; screenW = event.resize.w;
screenH = event.resize.h; screenH = event.resize.h;
#ifdef SCALE
screen_scaled = SDL_SetVideoMode(screenW*scalar, screenH*scalar, 8,
SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_HWSURFACE |
SDL_HWPALETTE);
if (screen)
SDL_FreeSurface(screen);
screen = SDL_CreateRGBSurface(SDL_HWSURFACE, screenW, screenH, 8, 0, 0, 0, 0);
#else
screen = SDL_SetVideoMode(screenW, screenH, 8, screen = SDL_SetVideoMode(screenW, screenH, 8,
SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF | SDL_HWSURFACE |
SDL_HWPALETTE); SDL_HWPALETTE);
#endif
// The absence of a break statement is intentional // The absence of a break statement is intentional
...@@ -615,6 +670,10 @@ int loop (int type) { ...@@ -615,6 +670,10 @@ int loop (int type) {
SDL_SetPalette(screen, SDL_LOGPAL, logicalPalette, 0, 256); SDL_SetPalette(screen, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen, SDL_PHYSPAL, currentPalette, 0, 256); SDL_SetPalette(screen, SDL_PHYSPAL, currentPalette, 0, 256);
#ifdef SCALE
SDL_SetPalette(screen_scaled, SDL_LOGPAL, logicalPalette, 0, 256);
SDL_SetPalette(screen_scaled, SDL_PHYSPAL, currentPalette, 0, 256);
#endif
break; break;
#endif #endif
...@@ -646,6 +705,10 @@ int loop (int type) { ...@@ -646,6 +705,10 @@ int loop (int type) {
firstPE->apply(shownPalette, false, globalTicks - prevTicks); firstPE->apply(shownPalette, false, globalTicks - prevTicks);
SDL_SetPalette(screen, SDL_PHYSPAL, shownPalette, 0, 256); SDL_SetPalette(screen, SDL_PHYSPAL, shownPalette, 0, 256);
#ifdef SCALE
SDL_SetPalette(screen_scaled, SDL_PHYSPAL, shownPalette, 0, 256);
#endif
} else { } else {
......
...@@ -265,6 +265,19 @@ int Menu::setupResolution () { ...@@ -265,6 +265,19 @@ int Menu::setupResolution () {
SDL_Rect **resolutions; SDL_Rect **resolutions;
int dimension, count, maxW, maxH; int dimension, count, maxW, maxH;
#ifdef SCALE
int minS = 1;
int maxS = 4;
#define minD 0
#define maxD 2
if ( scalar < minS || scalar > maxS )
scalar = 1;
#else
#define minD 0
#define maxD 1
#endif
dimension = 0; dimension = 0;
#ifndef FULLSCREEN_ONLY #ifndef FULLSCREEN_ONLY
...@@ -276,6 +289,7 @@ int Menu::setupResolution () { ...@@ -276,6 +289,7 @@ int Menu::setupResolution () {
resolutions = SDL_ListModes(NULL, resolutions = SDL_ListModes(NULL,
SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE); SDL_FULLSCREEN | SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_HWPALETTE);
#if defined(WIZ) || defined(GP2X) #if defined(WIZ) || defined(GP2X)
maxW = 320; maxW = 320;
maxH = 240; maxH = 240;
...@@ -318,44 +332,84 @@ int Menu::setupResolution () { ...@@ -318,44 +332,84 @@ int Menu::setupResolution () {
drawRect(0, screenH - 32, 32, 32, 79); drawRect(0, screenH - 32, 32, 32, 79);
// X 1
fontmn2->showString("x", (screenW >> 2) + 40, screenH >> 1); fontmn2->showString("x", (screenW >> 2) + 40, screenH >> 1);
// X 2
fontmn2->showString("x", (screenW >> 2) + 112, screenH >> 1);
// Width
if (dimension == 0) fontmn2->mapPalette(240, 8, 114, 16); if (dimension == 0) fontmn2->mapPalette(240, 8, 114, 16);
fontmn2->showNumber(screenW, (screenW >> 2) + 32, screenH >> 1); fontmn2->showNumber(screenW, (screenW >> 2) + 32, screenH >> 1);
if (dimension == 0) fontmn2->restorePalette(); // Height
if (dimension == 0 || dimension == 2) fontmn2->restorePalette();
else fontmn2->mapPalette(240, 8, 114, 16); else fontmn2->mapPalette(240, 8, 114, 16);
fontmn2->showNumber(screenH, (screenW >> 2) + 104, screenH >> 1); fontmn2->showNumber(screenH, (screenW >> 2) + 104, screenH >> 1);
// Scalar
if (dimension == 0 || dimension == 1) fontmn2->restorePalette();
else fontmn2->mapPalette(240, 8, 114, 16);
fontmn2->showNumber(scalar, (screenW >> 2) + 150, screenH >> 1);
if (dimension != 0) fontmn2->restorePalette(); if (dimension != 0) fontmn2->restorePalette();
count = 0; count = 0;
if (controls.release(C_LEFT)) dimension = !dimension; if (controls.release(C_LEFT)) {
dimension--;
if(dimension<minD)
dimension = minD;
}
if (controls.release(C_RIGHT)) dimension = !dimension; if (controls.release(C_RIGHT)) {
dimension++;
if(dimension>maxD)
dimension = maxD;
}
if (controls.release(C_UP)) { if (controls.release(C_UP)) {
if ((dimension == 0) && (screenW < maxW)) { if ((dimension == 0) && (screenW*scalar < maxW)) {
while (screenW >= widthOptions[count]) count++; while (screenW >= widthOptions[count] && (screenW*scalar)<maxW) count++;
if ((widthOptions[count]*scalar) > maxW)
count--;
screenW = widthOptions[count]; screenW = widthOptions[count];
} }
if ((dimension == 1) && (screenH < maxH)) { if ((dimension == 1) && (screenH*scalar < maxH)) {
while (screenH >= heightOptions[count]) count++; while (screenH >= heightOptions[count]) count++;
if ((heightOptions[count]*scalar) > maxH)
count--;
screenH = heightOptions[count]; screenH = heightOptions[count];
} }
#ifdef SCALE
if ((dimension == 2) && (scalar < maxS)) {
if ( screenH*(scalar+1) <= maxH && screenW*(scalar+1) <= maxW )
{
scalar++;
count = 1;
}
}
#endif
} }
if (controls.release(C_DOWN)) { if (controls.release(C_DOWN)) {
...@@ -382,6 +436,15 @@ int Menu::setupResolution () { ...@@ -382,6 +436,15 @@ int Menu::setupResolution () {
} }
#ifdef SCALE
if ((dimension == 2) && (scalar > minS)) {
scalar--;
count = 1;
}
#endif
} }
// Check for a resolution change // Check for a resolution change
...@@ -393,7 +456,7 @@ int Menu::setupResolution () { ...@@ -393,7 +456,7 @@ int Menu::setupResolution () {
if (!fullscreen) if (!fullscreen)
{ {
createWindow(); createWindow();
} }
else else
#endif #endif
......
/*
* This file is part of the Advance project.
*
* Copyright (C) 2002 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#if HAVE_CONFIG_H
#include <config.h>
#endif
#if !HAVE_GETOPT
/* This source is extracted from the DJGPP LIBC library */
#define unconst(var, type) ((type)(var))
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <string.h>
#include <stdio.h>
int opterr = 1, optind = 1, optopt = 0;
char *optarg = 0;
#define BADCH (int)'?'
#define EMSG ""
int getopt(int nargc, char *const nargv[], char *ostr)
{
static const char *place = EMSG; /* option letter processing */
char *oli; /* option letter list index */
char *p;
if (!*place)
{
if (optind >= nargc || *(place = nargv[optind]) != '-')
{
place = EMSG;
return(EOF);
}
if (place[1] && *++place == '-')
{
++optind;
place = EMSG;
return(EOF);
}
}
if ((optopt = (int)*place++) == (int)':'
|| !(oli = strchr(ostr, optopt)))
{
/*
* if the user didn't specify '-' as an option,
* assume it means EOF.
*/
if (optopt == (int)'-')
return EOF;
if (!*place)
++optind;
if (opterr)
{
if (!(p = strrchr(*nargv, '/')))
p = *nargv;
else
++p;
fprintf(stderr, "%s: illegal option -- %c\n", p, optopt);
}
return BADCH;
}
if (*++oli != ':')
{ /* don't need argument */
optarg = NULL;
if (!*place)
++optind;
}
else
{ /* need an argument */
if (*place) /* no white space */
optarg = unconst(place, char *);
else if (nargc <= ++optind)
{ /* no arg */
place = EMSG;
if (!(p = strrchr(*nargv, '/')))
p = *nargv;
else
++p;
if (opterr)
fprintf(stderr, "%s: option requires an argument -- %c\n", p, optopt);
return BADCH;
}
else /* white space */
optarg = nargv[optind];
place = EMSG;
++optind;
}
return optopt; /* dump back option letter */
}
#endif
/*
* This file is part of the Scale2x project.
*
* Copyright (C) 2003 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "pixel.h"
pixel_t pixel_get(int x, int y, const unsigned char* pix, unsigned slice, unsigned pixel, unsigned dx, unsigned dy, int opt_tes)
{
const unsigned char* p;
unsigned i;
pixel_t v;
if (opt_tes) {
if (x < 0)
x += dx;
if (x >= dx)
x -= dx;
if (y < 0)
y += dy;
if (y >= dy)
y -= dy;
} else {
if (x < 0)
x = 0;
if (x >= dx)
x = dx - 1;
if (y < 0)
y = 0;
if (y >= dy)
y = dy - 1;
}
p = pix + (y * slice) + (x * pixel);
v = 0;
for(i=0;i<pixel;++i)
v |= ((pixel_t)p[i]) << (i*8);
return v;
}
void pixel_put(int x, int y, unsigned char* pix, unsigned slice, unsigned pixel, unsigned dx, unsigned dy, pixel_t v)
{
unsigned char* p;
unsigned i;
p = pix + (y * slice) + (x * pixel);
for(i=0;i<pixel;++i) {
p[i] = v >> (i*8);
}
}
/*
* This file is part of the Scale2x project.
*
* Copyright (C) 2003 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __PIXEL_H
#define __PIXEL_H
typedef unsigned long long pixel_t;
pixel_t pixel_get(int x, int y, const unsigned char* pix, unsigned slice, unsigned pixel, unsigned dx, unsigned dy, int opt_tes);
void pixel_put(int x, int y, unsigned char* pix, unsigned slice, unsigned pixel, unsigned dx, unsigned dy, pixel_t v);
#endif
/*
* This file is part of the Scale2x project.
*
* Copyright (C) 2001, 2002, 2003 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __PORTABLE_H
#define __PORTABLE_H
#if HAVE_CONFIG_H
#include <config.h>
#endif
/* ------------------------------------------------------------------------ */
/* getopt */
#if HAVE_GETOPT_H
#include <getopt.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if !HAVE_GETOPT
int getopt(int argc, char * const *argv, const char *options);
extern char *optarg;
extern int optind, opterr, optopt;
#endif
#endif
This diff is collapsed.
/*
* This file is part of the Scale2x project.
*
* Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __SCALE2X_H
#define __SCALE2X_H
#define restrict
typedef unsigned char scale2x_uint8;
typedef unsigned short scale2x_uint16;
typedef unsigned scale2x_uint32;
void scale2x_8_def(scale2x_uint8* dst0, scale2x_uint8* dst1, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count);
void scale2x_16_def(scale2x_uint16* dst0, scale2x_uint16* dst1, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count);
void scale2x_32_def(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count);
void scale2x3_8_def(scale2x_uint8* dst0, scale2x_uint8* dst1, scale2x_uint8* dst2, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count);
void scale2x3_16_def(scale2x_uint16* dst0, scale2x_uint16* dst1, scale2x_uint16* dst2, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count);
void scale2x3_32_def(scale2x_uint32* dst0, scale2x_uint32* dst1, scale2x_uint32* dst2, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count);
void scale2x4_8_def(scale2x_uint8* dst0, scale2x_uint8* dst1, scale2x_uint8* dst2, scale2x_uint8* dst3, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count);
void scale2x4_16_def(scale2x_uint16* dst0, scale2x_uint16* dst1, scale2x_uint16* dst2, scale2x_uint16* dst3, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count);
void scale2x4_32_def(scale2x_uint32* dst0, scale2x_uint32* dst1, scale2x_uint32* dst2, scale2x_uint32* dst3, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count);
#if defined(__GNUC__) && defined(__i386__)
void scale2x_8_mmx(scale2x_uint8* dst0, scale2x_uint8* dst1, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count);
void scale2x_16_mmx(scale2x_uint16* dst0, scale2x_uint16* dst1, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count);
void scale2x_32_mmx(scale2x_uint32* dst0, scale2x_uint32* dst1, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count);
void scale2x3_8_mmx(scale2x_uint8* dst0, scale2x_uint8* dst1, scale2x_uint8* dst2, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count);
void scale2x3_16_mmx(scale2x_uint16* dst0, scale2x_uint16* dst1, scale2x_uint16* dst2, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count);
void scale2x3_32_mmx(scale2x_uint32* dst0, scale2x_uint32* dst1, scale2x_uint32* dst2, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count);
void scale2x4_8_mmx(scale2x_uint8* dst0, scale2x_uint8* dst1, scale2x_uint8* dst2, scale2x_uint8* dst3, const scale2x_uint8* src0, const scale2x_uint8* src1, const scale2x_uint8* src2, unsigned count);
void scale2x4_16_mmx(scale2x_uint16* dst0, scale2x_uint16* dst1, scale2x_uint16* dst2, scale2x_uint16* dst3, const scale2x_uint16* src0, const scale2x_uint16* src1, const scale2x_uint16* src2, unsigned count);
void scale2x4_32_mmx(scale2x_uint32* dst0, scale2x_uint32* dst1, scale2x_uint32* dst2, scale2x_uint32* dst3, const scale2x_uint32* src0, const scale2x_uint32* src1, const scale2x_uint32* src2, unsigned count);
/**
* End the use of the MMX instructions.
* This function must be called before using any floating-point operations.
*/
static inline void scale2x_mmx_emms(void)
{
__asm__ __volatile__ (
"emms"
);
}
#endif
#endif
This diff is collapsed.
/*
* This file is part of the Scale2x project.
*
* Copyright (C) 2001, 2002, 2003, 2004 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef __SCALE3X_H
#define __SCALE3X_H
#define restrict
typedef unsigned char scale3x_uint8;
typedef unsigned short scale3x_uint16;
typedef unsigned scale3x_uint32;
void scale3x_8_def(scale3x_uint8* dst0, scale3x_uint8* dst1, scale3x_uint8* dst2, const scale3x_uint8* src0, const scale3x_uint8* src1, const scale3x_uint8* src2, unsigned count);
void scale3x_16_def(scale3x_uint16* dst0, scale3x_uint16* dst1, scale3x_uint16* dst2, const scale3x_uint16* src0, const scale3x_uint16* src1, const scale3x_uint16* src2, unsigned count);
void scale3x_32_def(scale3x_uint32* dst0, scale3x_uint32* dst1, scale3x_uint32* dst2, const scale3x_uint32* src0, const scale3x_uint32* src1, const scale3x_uint32* src2, unsigned count);
#endif
This diff is collapsed.
/*
* This file is part of the Scale2x project.
*
* Copyright (C) 2003 Andrea Mazzoleni
*
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* This file contains an example implementation of the Scale effect
* applyed to a generic bitmap.
*
* You can find an high level description of the effect at :
*
* http://scale2x.sourceforge.net/
*
* Alternatively at the previous license terms, you are allowed to use this
* code in your program with these conditions:
* - the program is not used in commercial activities.
* - the whole source code of the program is released with the binary.
* - derivative works of the program are allowed.
*/
#ifndef __SCALEBIT_H
#define __SCALEBIT_H
int scale_precondition(unsigned scale, unsigned pixel, unsigned width, unsigned height);
void scale(unsigned scale, void* void_dst, unsigned dst_slice, const void* void_src, unsigned src_slice, unsigned pixel, unsigned width, unsigned height);
void Simple2x(unsigned char *srcPtr, unsigned int srcPitch, unsigned char *deltaPtr, unsigned char *dstPtr, unsigned int dstPitch, int width, int height);
#endif
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
// Copyright (C) 1999-2003 Forgotten
// Copyright (C) 2004 Forgotten and the VBA development team
// 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, or(at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
/*
* Code adapted To openjazz by Pickle (from Openbor adapted by SX
* simple2x.c - Trying to scale 2x.
*
*
*/
#include "scalebit.h"
void Simple2x(unsigned char *srcPtr, unsigned int srcPitch, unsigned char *deltaPtr, unsigned char *dstPtr, unsigned int dstPitch, int width, int height)
{
unsigned char *nextLine, *finish;
nextLine = dstPtr + dstPitch;
do
{
unsigned char *bP = (unsigned char *) srcPtr;
unsigned char *dP = (unsigned char *) dstPtr;
unsigned char *nL = (unsigned char *) nextLine;
unsigned char currentPixel;
finish = (unsigned char *) bP + ((width+2) << 1);
currentPixel = *bP++;
do
{
#ifdef BIG_ENDIAN
unsigned char color = currentPixel >> 16;
#else
unsigned char color = currentPixel & 0xffff;
#endif
color = color | (color << 16);
*(dP) = color;
*(nL) = color;
//#ifdef BIG_ENDIAN
// color = currentPixel & 0xffff;
//#else
// color = currentPixel >> 16;
//#endif
color = color| (color << 16);
*(dP + 1) = color;
*(nL + 1) = color;
currentPixel = *bP++;
dP += 2;
nL += 2;
}
while ((unsigned char *) bP < finish);
srcPtr += srcPitch;
dstPtr += dstPitch << 1;
nextLine += dstPitch << 1;
}
while (--height);
}
void Simple2x32(unsigned char *srcPtr, unsigned int srcPitch, unsigned char *deltaPtr, unsigned char *dstPtr, unsigned int dstPitch, int width, int height)
{
unsigned char *nextLine, *finish;
nextLine = dstPtr + dstPitch;
do
{
unsigned int *bP = (unsigned int *) srcPtr;
unsigned int *dP = (unsigned int *) dstPtr;
unsigned int *nL = (unsigned int *) nextLine;
unsigned int currentPixel;
finish = (unsigned char *) bP + ((width+1) << 2);
currentPixel = *bP++;
do
{
unsigned int color = currentPixel;
*(dP) = color;
*(dP+1) = color;
*(nL) = color;
*(nL + 1) = color;
currentPixel = *bP++;
dP += 2;
nL += 2;
}
while ((unsigned char *) bP < finish);
srcPtr += srcPitch;
dstPtr += dstPitch << 1;
nextLine += dstPitch << 1;
}
while (--height);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment