summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortron <tron@openttd.org>2004-11-15 19:25:59 +0000
committertron <tron@openttd.org>2004-11-15 19:25:59 +0000
commit450c669eb27dd0510d5c62622936635ece2a237f (patch)
tree4e3568628d8f2cd98e94bdd8cab9529eaf20e3bd
parentfb4b5fa841533cbf48727f068e6a704455bdaa97 (diff)
downloadopenttd-450c669eb27dd0510d5c62622936635ece2a237f.tar.xz
(svn r631) Merge r440, r444, r485, r630 to trunk:
r440 Move screenshot function declarations to new file screenshot.h Clean up screenshot.c a bit, mostly whitespace, alloca() -> malloc() and checking return values r485 Remove unused field from struct ScreenshotFormat
-rw-r--r--functions.h5
-rw-r--r--screenshot.c138
-rw-r--r--screenshot.h12
-rw-r--r--settings_gui.c1
-rw-r--r--strings.c1
-rw-r--r--ttd.c1
-rw-r--r--viewport.c2
-rw-r--r--viewport.h4
8 files changed, 111 insertions, 53 deletions
diff --git a/functions.h b/functions.h
index a4bc6e98f..47ef642aa 100644
--- a/functions.h
+++ b/functions.h
@@ -257,17 +257,12 @@ void ttd_strlcpy(char *dst, const char *src, size_t len);
// callback from drivers that is called if the game size changes dynamically
void GameSizeChanged();
-bool MakeScreenshot();
-bool MakeWorldScreenshot(int left, int top, int width, int height, int zoom);
bool FileExists(const char *filename);
bool ReadLanguagePack(int index);
void InitializeLanguagePacks();
byte *ReadFileToMem(const char *filename, size_t *lenp, size_t maxsize);
int GetLanguageList(char **languages, int max);
-const char *GetScreenshotFormatDesc(int i);
-void InitializeScreenshotFormats();
-void SetScreenshotFormat(int i);
void CheckSwitchToEuro();
void LoadFromConfig();
diff --git a/screenshot.c b/screenshot.c
index 7033f47de..4f3e72309 100644
--- a/screenshot.c
+++ b/screenshot.c
@@ -4,6 +4,7 @@
#include "viewport.h"
#include "player.h"
#include "gui.h"
+#include "screenshot.h"
// called by the ScreenShot proc to generate screenshot lines.
typedef void ScreenshotCallback(void *userdata, byte *buf, uint y, uint pitch, uint n);
@@ -13,7 +14,6 @@ typedef struct {
const char *name;
const char *extension;
ScreenshotHandlerProc *proc;
- byte id;
} ScreenshotFormat;
//************************************************
@@ -89,7 +89,7 @@ static bool MakeBmpImage(const char *name, ScreenshotCallback *callb, void *user
bih.clrimp = 0;
// convert the palette to the windows format
- for(i=0; i!=256; i++) {
+ for (i = 0; i != 256; i++) {
rq[i].red = *palette++;
rq[i].green = *palette++;
rq[i].blue = *palette++;
@@ -97,15 +97,19 @@ static bool MakeBmpImage(const char *name, ScreenshotCallback *callb, void *user
}
// write file header and info header and palette
- fwrite(&bfh, 1, sizeof(bfh), f);
- fwrite(&bih, 1, sizeof(bih), f);
- fwrite(rq, 1, sizeof(rq), f);
+ if (fwrite(&bfh, sizeof(bfh), 1, f) != 1) return false;
+ if (fwrite(&bih, sizeof(bih), 1, f) != 1) return false;
+ if (fwrite(rq, sizeof(rq), 1, f) != 1) return false;
// use by default 64k temp memory
maxlines = clamp(65536 / padw, 16, 128);
// now generate the bitmap bits
- buff = (byte*)alloca(padw * maxlines); // by default generate 128 lines at a time.
+ buff = malloc(padw * maxlines); // by default generate 128 lines at a time.
+ if (buff == NULL) {
+ fclose(f);
+ return false;
+ }
memset(buff, 0, padw * maxlines); // zero the buffer to have the padding bytes set to 0
// start at the bottom, since bitmaps are stored bottom up.
@@ -119,9 +123,14 @@ static bool MakeBmpImage(const char *name, ScreenshotCallback *callb, void *user
// write each line
while (n)
- fwrite(buff + (--n) * padw, 1, padw, f);
- } while (h);
+ if (fwrite(buff + (--n) * padw, padw, 1, f) != 1) {
+ free(buff);
+ fclose(f);
+ return false;
+ }
+ } while (h != 0);
+ free(buff);
fclose(f);
return true;
@@ -135,7 +144,7 @@ static bool MakeBmpImage(const char *name, ScreenshotCallback *callb, void *user
static void PNGAPI png_my_error(png_structp png_ptr, png_const_charp message)
{
- DEBUG(misc, 0) ("ERROR(libpng): %s - %s\n", message,(char *)png_get_error_ptr(png_ptr));
+ DEBUG(misc, 0) ("ERROR(libpng): %s - %s\n", message, (char *)png_get_error_ptr(png_ptr));
longjmp(png_ptr->jmpbuf, 1);
}
@@ -161,15 +170,15 @@ static bool MakePNGImage(const char *name, ScreenshotCallback *callb, void *user
f = fopen(name, "wb");
if (f == NULL) return false;
- png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (char *) name, png_my_error, png_my_warning);
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, (char *)name, png_my_error, png_my_warning);
- if (!png_ptr) {
+ if (png_ptr == NULL) {
fclose(f);
return false;
}
info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr) {
+ if (info_ptr == NULL) {
png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
fclose(f);
return false;
@@ -185,15 +194,15 @@ static bool MakePNGImage(const char *name, ScreenshotCallback *callb, void *user
png_set_filter(png_ptr, 0, PNG_FILTER_NONE);
- png_set_IHDR(png_ptr, info_ptr, w, h, pixelformat, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+ png_set_IHDR(png_ptr, info_ptr, w, h, pixelformat, PNG_COLOR_TYPE_PALETTE,
+ PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
// convert the palette to the .PNG format.
{
// avoids "might be clobbered" warning of argument "palette"
const byte *pal = palette;
- for(i=0; i!=256; i++) {
+ for (i = 0; i != 256; i++) {
rq[i].red = *pal++;
rq[i].green = *pal++;
rq[i].blue = *pal++;
@@ -208,7 +217,12 @@ static bool MakePNGImage(const char *name, ScreenshotCallback *callb, void *user
maxlines = clamp(65536 / w, 16, 128);
// now generate the bitmap bits
- buff = (byte*)alloca(w * maxlines); // by default generate 128 lines at a time.
+ buff = malloc(w * maxlines); // by default generate 128 lines at a time.
+ if (buff == NULL) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ fclose(f);
+ return false;
+ }
memset(buff, 0, w * maxlines); // zero the buffer to have the padding bytes set to 0
y = 0;
@@ -221,13 +235,14 @@ static bool MakePNGImage(const char *name, ScreenshotCallback *callb, void *user
y += n;
// write them to png
- for(i=0; i!=n; i++)
+ for (i = 0; i != n; i++)
png_write_row(png_ptr, buff + i * w);
} while (y != h);
png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, &info_ptr);
+ free(buff);
fclose(f);
return true;
}
@@ -278,8 +293,8 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
pcx.version = 5;
pcx.rle = 1;
pcx.bpp = 8;
- pcx.xmax = TO_LE16(w-1);
- pcx.ymax = TO_LE16(h-1);
+ pcx.xmax = TO_LE16(w - 1);
+ pcx.ymax = TO_LE16(h - 1);
pcx.hdpi = TO_LE16(320);
pcx.vdpi = TO_LE16(320);
@@ -289,53 +304,86 @@ static bool MakePCXImage(const char *name, ScreenshotCallback *callb, void *user
pcx.height = TO_LE16(h);
// write pcx header
- fwrite(&pcx, sizeof(pcx), 1, f);
+ if (fwrite(&pcx, sizeof(pcx), 1, f) != 1) {
+ fclose(f);
+ return false;
+ }
// use by default 64k temp memory
maxlines = clamp(65536 / w, 16, 128);
// now generate the bitmap bits
- buff = (byte*)alloca(w * maxlines); // by default generate 128 lines at a time.
- memset(buff, 0, w * maxlines); // zero the buffer to have the padding bytes set to 0
+ buff = malloc(w * maxlines); // by default generate 128 lines at a time.
+ if (buff == NULL) {
+ fclose(f);
+ return false;
+ }
+ memset(buff, 0, w * maxlines); // zero the buffer to have the padding bytes set to 0
y = 0;
do {
// determine # lines to write
- uint n = min(h - y, maxlines), i;
+ uint n = min(h - y, maxlines);
+ uint i;
// render the pixels into the buffer
callb(userdata, buff, y, w, n);
y += n;
// write them to pcx
- for(i=0; i!=n; i++) {
+ for (i = 0; i != n; i++) {
int runcount = 1;
byte *bufp = buff + i * w;
byte runchar = buff[0];
- uint left = w - 1;
+ uint left;
// for each pixel...
- while (left) {
+ for (left = w - 1; left > 0; --left) {
byte ch = *bufp++;
if (ch != runchar || runcount >= 0x3f) {
- if (runcount > 1 || (runchar & 0xC0) == 0xC0) fputc(0xC0 | runcount, f);
- fputc(runchar,f);
+ if (runcount > 1 || (runchar & 0xC0) == 0xC0)
+ if (fputc(0xC0 | runcount, f) == EOF) {
+ free(buff);
+ fclose(f);
+ return false;
+ }
+ if (fputc(runchar, f) == EOF) {
+ free(buff);
+ fclose(f);
+ return false;
+ }
runcount = 0;
runchar = ch;
}
runcount++;
- left--;
}
// write remaining bytes..
- if (runcount > 1 || (runchar & 0xC0) == 0xC0) fputc(0xC0 | runcount, f);
- fputc(runchar,f);
+ if (runcount > 1 || (runchar & 0xC0) == 0xC0)
+ if (fputc(0xC0 | runcount, f) == EOF) {
+ free(buff);
+ fclose(f);
+ return false;
+ }
+ if (fputc(runchar, f) == EOF) {
+ free(buff);
+ fclose(f);
+ return false;
+ }
}
} while (y != h);
+ free(buff);
+
// write 8-bit color palette
- fputc(12, f);
- fwrite(palette, 256*3, 1, f);
+ if (fputc(12, f) == EOF) {
+ fclose(f);
+ return false;
+ }
+ if (fwrite(palette, 256 * 3, 1, f) != 1) {
+ fclose(f);
+ return false;
+ }
fclose(f);
return true;
@@ -353,11 +401,14 @@ static const ScreenshotFormat _screenshot_formats[] = {
{"PCX", "pcx", &MakePCXImage},
};
-void InitializeScreenshotFormats()
+void InitializeScreenshotFormats(void)
{
- int i,j;
- for (i=0,j=0; i!=lengthof(_screenshot_formats); i++)
- if (!strcmp(_screenshot_format_name, _screenshot_formats[i].extension)) { j=i; break; }
+ int i, j;
+ for (i = 0, j = 0; i != lengthof(_screenshot_formats); i++)
+ if (!strcmp(_screenshot_format_name, _screenshot_formats[i].extension)) {
+ j = i;
+ break;
+ }
_cur_screenshot_format = j;
_num_screenshot_formats = lengthof(_screenshot_formats);
}
@@ -376,16 +427,13 @@ void SetScreenshotFormat(int i)
// screenshot generator that dumps the current video buffer
static void CurrentScreenCallback(void *userdata, byte *buf, uint y, uint pitch, uint n)
{
- for (; n > 0; --n)
- {
+ for (; n > 0; --n) {
memcpy(buf, _screen.dst_ptr + y * _screen.pitch, _screen.width);
++y;
buf += pitch;
}
}
-extern void ViewportDoDraw(ViewPort *vp, int left, int top, int right, int bottom);
-
// generate a large piece of the world
static void LargeWorldCallback(void *userdata, byte *buf, uint y, uint pitch, uint n)
{
@@ -413,7 +461,7 @@ static void LargeWorldCallback(void *userdata, byte *buf, uint y, uint pitch, ui
((left - wx - vp->left) << vp->zoom) + vp->virtual_left,
((y - vp->top) << vp->zoom) + vp->virtual_top,
((left - vp->left) << vp->zoom) + vp->virtual_left,
- (((y+n) - vp->top) << vp->zoom) + vp->virtual_top
+ (((y + n) - vp->top) << vp->zoom) + vp->virtual_top
);
}
@@ -440,7 +488,7 @@ static char *MakeScreenshotName(const char *ext)
base[0] = '.'; strcpy(base + 1, ext);
serial = 0;
- for(;;) {
+ for (;;) {
snprintf(filename, sizeof(filename), "%s%s", _path.personal_dir, _screenshot_name);
if (!FileExists(filename))
break;
@@ -450,9 +498,7 @@ static char *MakeScreenshotName(const char *ext)
return filename;
}
-extern byte _cur_palette[768];
-
-bool MakeScreenshot()
+bool MakeScreenshot(void)
{
const ScreenshotFormat *sf = _screenshot_formats + _cur_screenshot_format;
return sf->proc(MakeScreenshotName(sf->extension), CurrentScreenCallback, NULL, _screen.width, _screen.height, 8, _cur_palette);
diff --git a/screenshot.h b/screenshot.h
new file mode 100644
index 000000000..900c1e702
--- /dev/null
+++ b/screenshot.h
@@ -0,0 +1,12 @@
+#ifndef SCREENSHOT_H
+#define SCREENSHOT_H
+
+void InitializeScreenshotFormats(void);
+
+const char *GetScreenshotFormatDesc(int i);
+void SetScreenshotFormat(int i);
+
+bool MakeScreenshot(void);
+bool MakeWorldScreenshot(int left, int top, int width, int height, int zoom);
+
+#endif
diff --git a/settings_gui.c b/settings_gui.c
index f84c0e140..c916e6504 100644
--- a/settings_gui.c
+++ b/settings_gui.c
@@ -6,6 +6,7 @@
#include "gfx.h"
#include "command.h"
#include "engine.h"
+#include "screenshot.h"
static uint32 _difficulty_click_a;
static uint32 _difficulty_click_b;
diff --git a/strings.c b/strings.c
index f1c44486b..855dae390 100644
--- a/strings.c
+++ b/strings.c
@@ -4,6 +4,7 @@
#include "town.h"
#include "vehicle.h"
#include "news.h"
+#include "screenshot.h"
#define USE_TABLE(x) { assert(index < lengthof(x)); str = x[index]; break; }
diff --git a/ttd.c b/ttd.c
index a197c560c..aef3ac55a 100644
--- a/ttd.c
+++ b/ttd.c
@@ -22,6 +22,7 @@
#include "saveload.h"
#include "ai.h"
#include "console.h"
+#include "screenshot.h"
#include <stdarg.h>
diff --git a/viewport.c b/viewport.c
index 339ec58e0..da415f3d6 100644
--- a/viewport.c
+++ b/viewport.c
@@ -1132,7 +1132,7 @@ static void ViewportDrawStrings(DrawPixelInfo *dpi, StringSpriteToDraw *ss)
_cur_dpi = dpi;
}
-void ViewportDoDraw(ViewPort *vp, int left, int top, int right, int bottom)
+void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom)
{
ViewportDrawer vd;
int mask;
diff --git a/viewport.h b/viewport.h
index 6e1c0e65f..487fc9a9d 100644
--- a/viewport.h
+++ b/viewport.h
@@ -116,4 +116,6 @@ VARDEF Point _tile_fract_coords;
extern TileHighlightData * const _thd_ptr;
-#endif
+void ViewportDoDraw(const ViewPort *vp, int left, int top, int right, int bottom);
+
+#endif /* VIEWPORT_H */