This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project gfxprim.git.
The branch, generate has been updated via 2cd6436b86198dce6fbbbfa48c9b8831144ea4ea (commit) from 1a194b0be00177f64b07ebc7b37f474c1625d12d (commit)
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- http://repo.or.cz/w/gfxprim.git/commit/2cd6436b86198dce6fbbbfa48c9b8831144ea...
commit 2cd6436b86198dce6fbbbfa48c9b8831144ea4ea Author: Cyril Hrubis metan@ucw.cz Date: Sat Aug 20 19:34:03 2011 +0200
Fixed PGM loader, added blittest.
diff --git a/include/loaders/GP_Loaders.h b/include/loaders/GP_Loaders.h index 44d1405..e7ac305 100644 --- a/include/loaders/GP_Loaders.h +++ b/include/loaders/GP_Loaders.h @@ -19,7 +19,7 @@ * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos * * jiri.bluebear.dluhos@gmail.com * * * - * Copyright (C) 2009-2010 Cyril Hrubis metan@ucw.cz * + * Copyright (C) 2009-2011 Cyril Hrubis metan@ucw.cz * * * *****************************************************************************/
@@ -35,4 +35,6 @@ #include "GP_PBM.h" #include "GP_PGM.h"
+struct GP_Context *GP_Load(const char *src_path); + #endif /* GP_LOADERS_H */ diff --git a/include/loaders/GP_PBM.h b/include/loaders/GP_PBM.h index 19c52a4..46b8c3e 100644 --- a/include/loaders/GP_PBM.h +++ b/include/loaders/GP_PBM.h @@ -19,7 +19,7 @@ * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos * * jiri.bluebear.dluhos@gmail.com * * * - * Copyright (C) 2009-2010 Cyril Hrubis metan@ucw.cz * + * Copyright (C) 2009-2011 Cyril Hrubis metan@ucw.cz * * * *****************************************************************************/
@@ -28,8 +28,8 @@
#include "core/GP_Context.h"
-GP_RetCode GP_LoadPBM(const char *src, GP_Context **res); +GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res);
-GP_RetCode GP_SavePBM(const char *res, GP_Context *src); +GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src);
#endif /* GP_PBM_H */ diff --git a/include/loaders/GP_PGM.h b/include/loaders/GP_PGM.h index 272c50c..e3420f9 100644 --- a/include/loaders/GP_PGM.h +++ b/include/loaders/GP_PGM.h @@ -28,8 +28,8 @@
#include "core/GP_Context.h"
-GP_RetCode GP_LoadPGM(const char *src, GP_Context **res); +GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res);
-GP_RetCode GP_SavePGM(const char *res, GP_Context *src); +GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src);
#endif /* GP_PGM_H */ diff --git a/libs/loaders/GP_PBM.c b/libs/loaders/GP_PBM.c index 623b873..a90ed8b 100644 --- a/libs/loaders/GP_PBM.c +++ b/libs/loaders/GP_PBM.c @@ -48,9 +48,9 @@ #include "GP_PXMCommon.h" #include "GP_PBM.h"
-GP_RetCode GP_LoadPBM(const char *src, GP_Context **res) +GP_RetCode GP_LoadPBM(const char *src_path, GP_Context **res) { - FILE *f = fopen(src, "r"); + FILE *f = fopen(src_path, "r"); uint32_t w, h;
if (f == NULL) @@ -62,7 +62,7 @@ GP_RetCode GP_LoadPBM(const char *src, GP_Context **res) if (fscanf(f, "%"PRIu32"%"PRIu32, &w, &h) < 2) goto err1;
- *res = GP_ContextAlloc(w, h, GP_PIXEL_G1); + *res = GP_ContextAlloc(w, h, GP_PIXEL_V1);
if (*res == NULL) { fclose(f); @@ -81,14 +81,14 @@ err1: return GP_EBADFILE; }
-GP_RetCode GP_SavePBM(const char *res, GP_Context *src) +GP_RetCode GP_SavePBM(const char *res_path, GP_Context *src) { FILE *f;
- if (src->pixel_type != GP_PIXEL_G1) + if (src->pixel_type != GP_PIXEL_V1) return GP_ENOIMPL; - f = fopen(res, "w"); + f = fopen(res_path, "w");
if (f == NULL) return GP_EBADFILE; diff --git a/libs/loaders/GP_PGM.c b/libs/loaders/GP_PGM.c index 77d8051..6612e2a 100644 --- a/libs/loaders/GP_PGM.c +++ b/libs/loaders/GP_PGM.c @@ -19,7 +19,7 @@ * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos * * jiri.bluebear.dluhos@gmail.com * * * - * Copyright (C) 2009-2010 Cyril Hrubis metan@ucw.cz * + * Copyright (C) 2009-2011 Cyril Hrubis metan@ucw.cz * * * *****************************************************************************/
@@ -45,37 +45,88 @@ #include <stdio.h> #include <stdint.h> #include <inttypes.h> +#include <errno.h> +#include <string.h> +#include <ctype.h> + +#include <GP_Debug.h>
#include "GP_PXMCommon.h" #include "GP_PGM.h"
-GP_RetCode GP_LoadPGM(const char *src, GP_Context **res) +static void try_read_comments(FILE *f) { - FILE *f = fopen(src, "r"); + char c1, c2; + + while (isspace(c1 = fgetc(f))); + + ungetc(c1, f); + + while ((c1 = fgetc(f)) == '#') { + do { + c2 = fgetc(f); + } while (c2 != 'n' && c2 != EOF); + } + + ungetc(c1, f); +} + +GP_RetCode GP_LoadPGM(const char *src_path, GP_Context **res) +{ + FILE *f = fopen(src_path, "r"); uint32_t w, h, gray; GP_PixelType type; + char h1, h2;
- if (f == NULL) + if (f == NULL) { + GP_DEBUG(1, "Failed to open file '%s': %s", + src_path, strerror(errno)); return GP_EBADFILE; + }
- if (fgetc(f) != 'P' || fgetc(f) != '2') + h1 = fgetc(f); + h2 = fgetc(f); + + if (h1 != 'P' || h2 != '2') { + GP_DEBUG(1, "Invalid PGM header '%c%c' (0x%2x 0x%2x)", + isprint(h1) ? h1 : ' ', isprint(h2) ? h2 : ' ', + h1, h2); goto err1; + } + + try_read_comments(f); + + if (fscanf(f, "%"PRIu32, &w) < 1) { + GP_DEBUG(1, "Failed to read PGM header width"); + goto err1; + } + + try_read_comments(f); + + if (fscanf(f, "%"PRIu32, &h) < 1) { + GP_DEBUG(1, "Failed to read PGM header height"); + goto err1; + } + + try_read_comments(f); - if (fscanf(f, "%"PRIu32"%"PRIu32"%"PRIu32, &w, &h, &gray) < 3) + if (fscanf(f, "%"PRIu32, &gray) < 1) { + GP_DEBUG(1, "Failed to read PGM header gray"); goto err1; + } switch (gray) { case 1: - type = GP_PIXEL_G1; + type = GP_PIXEL_V1; break; case 3: - type = GP_PIXEL_G2; + type = GP_PIXEL_V2; break; case 15: - type = GP_PIXEL_G4; + type = GP_PIXEL_V4; break; case 255: - type = GP_PIXEL_G8; + type = GP_PIXEL_V8; break; default: goto err1; @@ -83,6 +134,9 @@ GP_RetCode GP_LoadPGM(const char *src, GP_Context **res)
*res = GP_ContextAlloc(w, h, type);
+ if (res == NULL) + goto err1; + switch (gray) { case 1: if (GP_PXMLoad1bpp(f, *res)) @@ -111,32 +165,35 @@ err1: return GP_EBADFILE; }
-GP_RetCode GP_SavePGM(const char *res, GP_Context *src) +GP_RetCode GP_SavePGM(const char *res_path, GP_Context *src) { FILE *f; uint32_t gray;
switch (src->pixel_type) { - case GP_PIXEL_G1: + case GP_PIXEL_V1: gray = 1; break; - case GP_PIXEL_G2: + case GP_PIXEL_V2: gray = 3; break; - case GP_PIXEL_G4: + case GP_PIXEL_V4: gray = 15; break; - case GP_PIXEL_G8: + case GP_PIXEL_V8: gray = 255; break; default: return GP_ENOIMPL; } - f = fopen(res, "w"); + f = fopen(res_path, "w");
- if (f == NULL) + if (f == NULL) { + GP_DEBUG(1, "Failed to open file '%s': %s", + res_path, strerror(errno)); return GP_EBADFILE; + }
if (fprintf(f, "P2n%u %un%un# Generated by gfxprimn", (unsigned int) src->w, (unsigned int) src->h, gray) < 3) diff --git a/libs/loaders/Makefile b/libs/loaders/Makefile index e753f5c..5d037b7 100644 --- a/libs/loaders/Makefile +++ b/libs/loaders/Makefile @@ -1,5 +1,6 @@ TOPDIR=../.. -#CSOURCES=$(shell ls *.c) +CSOURCES=$(shell ls *.c) +INCLUDE=core LIBNAME=loaders include $(TOPDIR)/include.mk include $(TOPDIR)/lib.mk diff --git a/tests/SDL/Makefile b/tests/SDL/Makefile index 0c908f2..22292e5 100644 --- a/tests/SDL/Makefile +++ b/tests/SDL/Makefile @@ -6,7 +6,7 @@ INCLUDE=core gfx SDL backends LDLIBS+=-lGP -L$(TOPDIR)/build/ -lGP_SDL -lSDL
APPS=pixeltest fileview fonttest linetest randomshapetest shapetest sierpinsky- symbolstest textaligntest trianglefps input + symbolstest textaligntest trianglefps input blittest
include $(TOPDIR)/include.mk include $(TOPDIR)/app.mk diff --git a/tests/SDL/ball.pgm b/tests/SDL/ball.pgm new file mode 100644 index 0000000..9f9487f --- /dev/null +++ b/tests/SDL/ball.pgm @@ -0,0 +1,10004 @@ +P2 +# CREATOR: GIMP PNM Filter Version 1.1 +100 100 +255 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +2 +1 +1 +2 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +3 +4 +6 +6 +8 +8 +9 +9 +9 +9 +8 +8 +7 +6 +5 +4 +3 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +3 +6 +8 +10 +11 +12 +13 +15 +15 +16 +16 +16 +16 +15 +15 +15 +13 +12 +11 +10 +8 +6 +3 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +3 +6 +8 +11 +12 +15 +17 +18 +19 +20 +22 +22 +23 +23 +23 +22 +23 +22 +21 +21 +19 +17 +17 +15 +13 +11 +8 +6 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +4 +6 +9 +12 +15 +17 +20 +22 +23 +25 +26 +28 +28 +29 +29 +30 +30 +30 +29 +29 +28 +27 +26 +25 +23 +22 +20 +17 +14 +12 +10 +6 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +6 +10 +13 +16 +18 +21 +23 +26 +28 +30 +32 +33 +34 +36 +36 +37 +36 +37 +37 +37 +36 +35 +34 +33 +32 +30 +28 +26 +24 +22 +19 +16 +13 +10 +6 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +6 +9 +12 +16 +19 +22 +25 +28 +30 +32 +35 +37 +38 +40 +42 +43 +43 +43 +44 +44 +44 +44 +43 +42 +41 +40 +39 +36 +35 +33 +30 +27 +25 +22 +19 +16 +13 +9 +6 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +7 +12 +15 +19 +23 +25 +29 +31 +34 +37 +39 +41 +43 +45 +46 +48 +49 +50 +50 +51 +51 +51 +51 +50 +49 +48 +47 +45 +43 +42 +39 +37 +34 +32 +29 +26 +23 +19 +15 +11 +7 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +9 +13 +17 +21 +25 +29 +31 +35 +38 +41 +43 +46 +48 +50 +52 +53 +55 +56 +57 +57 +59 +58 +58 +58 +57 +56 +55 +53 +52 +50 +48 +46 +44 +41 +38 +35 +32 +29 +25 +21 +17 +13 +9 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +5 +10 +14 +19 +23 +27 +31 +34 +38 +41 +44 +48 +50 +52 +54 +57 +59 +61 +62 +63 +64 +64 +65 +66 +65 +64 +64 +63 +62 +61 +59 +57 +55 +53 +50 +47 +44 +41 +38 +34 +31 +27 +23 +19 +14 +10 +6 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +7 +11 +16 +20 +24 +29 +33 +37 +41 +44 +47 +51 +54 +57 +59 +62 +63 +66 +67 +69 +70 +71 +72 +72 +72 +72 +71 +71 +70 +69 +68 +66 +64 +62 +59 +57 +54 +51 +47 +44 +40 +36 +33 +29 +25 +20 +15 +11 +7 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +6 +11 +16 +21 +26 +30 +35 +38 +43 +46 +50 +53 +56 +60 +63 +66 +68 +70 +72 +75 +76 +77 +78 +79 +80 +80 +79 +78 +78 +77 +76 +74 +72 +70 +68 +66 +63 +60 +56 +53 +50 +46 +43 +39 +34 +30 +25 +21 +16 +12 +7 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +7 +12 +16 +21 +26 +30 +36 +40 +44 +48 +52 +56 +59 +63 +66 +69 +72 +75 +78 +79 +81 +82 +84 +85 +86 +86 +86 +86 +86 +85 +84 +83 +81 +79 +77 +75 +72 +69 +67 +64 +60 +56 +52 +48 +44 +40 +35 +30 +26 +21 +16 +11 +6 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +11 +16 +21 +27 +31 +36 +40 +45 +50 +54 +58 +62 +65 +70 +73 +76 +78 +81 +84 +86 +88 +90 +91 +92 +92 +93 +93 +93 +93 +92 +91 +89 +88 +86 +84 +81 +79 +76 +72 +70 +65 +62 +58 +54 +50 +46 +41 +36 +31 +26 +22 +16 +11 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +10 +16 +21 +26 +31 +37 +41 +46 +51 +56 +60 +64 +68 +72 +75 +79 +82 +85 +87 +90 +93 +94 +97 +98 +99 +100 +101 +100 +101 +100 +99 +98 +96 +95 +93 +90 +88 +85 +82 +79 +75 +72 +68 +64 +60 +55 +51 +46 +41 +36 +31 +26 +21 +16 +10 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +9 +15 +20 +25 +31 +36 +41 +46 +52 +56 +61 +65 +69 +74 +78 +81 +85 +89 +91 +95 +97 +99 +101 +103 +104 +106 +106 +107 +107 +107 +107 +106 +104 +104 +101 +99 +97 +94 +91 +88 +85 +81 +78 +73 +70 +65 +60 +55 +51 +46 +42 +36 +31 +25 +20 +15 +9 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +8 +14 +18 +24 +30 +36 +41 +46 +52 +57 +61 +66 +71 +75 +80 +83 +87 +91 +95 +98 +100 +103 +106 +108 +110 +112 +113 +114 +114 +114 +114 +114 +113 +112 +110 +108 +106 +104 +101 +98 +94 +92 +87 +84 +80 +75 +71 +66 +61 +56 +51 +46 +41 +35 +29 +24 +18 +13 +8 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +11 +17 +22 +29 +34 +40 +46 +51 +56 +61 +66 +71 +75 +80 +84 +89 +93 +97 +101 +104 +107 +110 +113 +115 +117 +119 +120 +121 +121 +121 +121 +121 +120 +118 +117 +115 +112 +110 +108 +104 +100 +97 +93 +89 +85 +81 +76 +71 +66 +61 +56 +51 +45 +40 +35 +28 +23 +17 +11 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +9 +15 +21 +27 +33 +39 +44 +50 +55 +60 +66 +71 +77 +81 +85 +90 +95 +99 +103 +107 +110 +113 +116 +119 +122 +124 +126 +127 +128 +128 +129 +128 +128 +127 +126 +123 +122 +119 +116 +114 +110 +107 +103 +99 +95 +90 +86 +81 +76 +71 +65 +61 +55 +49 +44 +39 +33 +26 +21 +15 +9 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +7 +13 +19 +25 +31 +37 +42 +48 +54 +60 +65 +70 +75 +81 +86 +91 +96 +100 +104 +108 +112 +116 +120 +122 +126 +128 +130 +132 +133 +134 +135 +135 +136 +134 +133 +132 +131 +129 +125 +123 +120 +116 +112 +109 +105 +100 +95 +91 +86 +81 +75 +70 +65 +60 +53 +48 +42 +37 +30 +25 +19 +13 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +10 +16 +22 +28 +34 +40 +46 +52 +58 +64 +69 +75 +80 +85 +91 +96 +101 +106 +110 +115 +119 +122 +126 +130 +132 +135 +137 +139 +141 +141 +142 +143 +142 +142 +140 +140 +137 +135 +132 +130 +126 +122 +119 +115 +110 +106 +100 +96 +91 +86 +81 +75 +69 +64 +58 +52 +46 +40 +34 +28 +23 +16 +10 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +7 +13 +19 +25 +31 +38 +44 +50 +56 +62 +68 +73 +79 +85 +91 +96 +101 +106 +111 +116 +119 +124 +129 +132 +136 +139 +141 +144 +146 +148 +148 +149 +150 +149 +148 +148 +146 +144 +141 +139 +135 +132 +128 +125 +120 +115 +111 +106 +101 +96 +90 +85 +79 +73 +68 +62 +56 +50 +44 +37 +32 +26 +20 +13 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +9 +16 +22 +29 +35 +41 +47 +53 +60 +66 +72 +78 +83 +90 +95 +100 +105 +111 +116 +121 +125 +130 +134 +138 +141 +144 +148 +150 +152 +154 +156 +156 +157 +156 +156 +154 +152 +151 +148 +145 +142 +138 +134 +130 +125 +120 +115 +111 +105 +100 +95 +89 +84 +78 +71 +66 +60 +54 +47 +41 +35 +29 +22 +16 +10 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +12 +19 +25 +31 +38 +44 +51 +56 +63 +70 +75 +82 +88 +94 +99 +105 +110 +116 +120 +125 +130 +135 +140 +144 +147 +151 +154 +157 +159 +161 +163 +163 +164 +164 +162 +161 +160 +157 +154 +151 +148 +144 +140 +135 +131 +126 +121 +116 +110 +105 +99 +93 +88 +81 +76 +69 +63 +57 +51 +44 +38 +32 +25 +19 +12 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +8 +14 +21 +27 +35 +40 +47 +54 +60 +67 +73 +78 +85 +91 +97 +103 +109 +114 +120 +125 +131 +136 +141 +145 +149 +153 +157 +161 +164 +166 +168 +170 +171 +170 +170 +169 +168 +166 +164 +161 +158 +154 +150 +145 +140 +135 +131 +126 +120 +115 +109 +103 +97 +91 +85 +79 +72 +66 +60 +54 +47 +40 +35 +28 +21 +15 +8 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +11 +17 +23 +30 +37 +44 +50 +57 +63 +69 +76 +82 +89 +95 +100 +106 +113 +118 +125 +130 +135 +141 +146 +150 +155 +159 +163 +167 +170 +173 +175 +177 +177 +178 +177 +177 +175 +172 +170 +167 +163 +159 +155 +151 +145 +141 +135 +130 +124 +119 +112 +107 +101 +95 +88 +82 +75 +69 +63 +57 +50 +44 +37 +31 +24 +17 +10 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +12 +20 +26 +33 +39 +46 +53 +59 +66 +72 +79 +85 +91 +97 +104 +110 +116 +122 +128 +134 +140 +145 +150 +155 +160 +164 +169 +173 +176 +180 +182 +184 +184 +185 +184 +183 +181 +179 +177 +173 +169 +165 +160 +155 +150 +145 +139 +134 +129 +123 +116 +110 +104 +98 +91 +85 +79 +72 +66 +60 +53 +46 +40 +32 +26 +19 +13 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +7 +15 +21 +28 +35 +41 +48 +55 +61 +68 +75 +82 +88 +95 +100 +108 +114 +120 +126 +132 +138 +144 +150 +155 +161 +166 +170 +175 +179 +182 +186 +188 +190 +191 +191 +191 +190 +189 +186 +183 +179 +175 +170 +165 +160 +155 +149 +144 +138 +132 +126 +119 +114 +107 +100 +94 +88 +81 +75 +69 +61 +55 +48 +42 +35 +28 +21 +15 +8 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +10 +17 +23 +30 +36 +43 +50 +57 +64 +71 +77 +83 +90 +98 +104 +110 +116 +123 +129 +136 +142 +147 +153 +160 +165 +171 +175 +180 +185 +189 +192 +195 +197 +199 +199 +199 +197 +195 +192 +189 +185 +180 +176 +171 +165 +159 +153 +148 +141 +135 +129 +123 +117 +110 +103 +97 +91 +84 +77 +70 +64 +57 +50 +44 +37 +30 +23 +17 +9 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +11 +18 +25 +32 +39 +45 +53 +59 +66 +73 +79 +86 +93 +100 +106 +112 +119 +126 +132 +138 +145 +151 +158 +164 +169 +175 +181 +186 +191 +195 +199 +201 +204 +205 +206 +205 +204 +201 +199 +194 +190 +185 +180 +175 +169 +163 +157 +151 +145 +139 +132 +126 +119 +113 +106 +99 +93 +86 +79 +73 +65 +59 +52 +45 +38 +31 +25 +18 +11 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +13 +20 +26 +33 +40 +47 +54 +60 +67 +74 +81 +87 +95 +102 +108 +115 +121 +128 +134 +142 +148 +155 +161 +167 +173 +179 +184 +190 +196 +200 +204 +207 +210 +212 +213 +212 +210 +208 +204 +200 +195 +190 +184 +179 +173 +167 +161 +155 +148 +141 +134 +128 +122 +115 +108 +101 +94 +88 +82 +74 +67 +60 +54 +47 +40 +33 +26 +19 +12 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +7 +13 +20 +28 +34 +41 +49 +55 +61 +69 +76 +83 +90 +97 +103 +110 +117 +124 +131 +137 +144 +150 +157 +164 +170 +176 +182 +189 +194 +200 +205 +210 +214 +217 +219 +220 +219 +217 +214 +210 +205 +200 +194 +188 +183 +176 +170 +164 +157 +150 +144 +137 +130 +124 +117 +110 +103 +96 +90 +83 +75 +69 +62 +55 +49 +42 +35 +28 +20 +14 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +7 +14 +21 +29 +36 +42 +49 +56 +63 +70 +77 +84 +91 +98 +104 +112 +118 +125 +132 +139 +146 +153 +159 +166 +173 +179 +185 +192 +198 +205 +210 +215 +220 +224 +226 +227 +226 +223 +220 +216 +210 +204 +198 +192 +186 +179 +172 +166 +159 +153 +146 +139 +132 +125 +119 +111 +105 +98 +91 +84 +77 +70 +63 +56 +49 +42 +35 +28 +22 +14 +7 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +8 +15 +22 +29 +36 +43 +50 +57 +64 +71 +78 +85 +92 +99 +106 +113 +120 +126 +133 +141 +148 +154 +161 +168 +175 +182 +188 +195 +201 +208 +214 +220 +225 +230 +232 +234 +233 +230 +225 +220 +214 +208 +202 +195 +189 +182 +175 +169 +161 +154 +147 +141 +134 +126 +120 +113 +105 +99 +92 +85 +78 +71 +64 +57 +50 +43 +36 +29 +22 +15 +8 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +9 +16 +23 +30 +37 +44 +51 +57 +65 +71 +79 +85 +93 +100 +107 +114 +121 +127 +135 +141 +148 +155 +163 +169 +176 +183 +190 +197 +204 +210 +217 +223 +230 +235 +239 +241 +240 +235 +230 +223 +217 +211 +204 +197 +191 +184 +176 +169 +162 +156 +149 +142 +135 +127 +120 +114 +107 +99 +92 +85 +79 +72 +65 +57 +50 +44 +36 +30 +23 +16 +8 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +9 +16 +23 +30 +37 +44 +51 +58 +65 +73 +79 +86 +93 +100 +108 +114 +121 +128 +135 +143 +149 +157 +164 +171 +177 +184 +191 +198 +205 +212 +219 +226 +233 +239 +245 +248 +245 +239 +233 +226 +219 +212 +205 +198 +192 +184 +178 +170 +163 +157 +149 +143 +135 +128 +122 +114 +107 +100 +93 +86 +79 +72 +65 +58 +51 +44 +37 +30 +23 +15 +9 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +9 +16 +23 +30 +37 +44 +51 +58 +65 +72 +79 +86 +93 +101 +107 +115 +121 +129 +135 +143 +149 +157 +163 +170 +178 +184 +192 +199 +206 +213 +219 +227 +234 +241 +248 +255 +248 +241 +234 +226 +220 +213 +206 +198 +192 +184 +178 +171 +163 +157 +149 +143 +135 +129 +122 +115 +108 +101 +93 +86 +79 +72 +66 +59 +51 +44 +37 +30 +23 +16 +9 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +9 +16 +23 +29 +36 +44 +51 +58 +65 +72 +79 +87 +93 +100 +107 +114 +121 +128 +135 +142 +150 +156 +164 +170 +177 +184 +191 +199 +205 +213 +220 +226 +233 +240 +245 +248 +245 +239 +233 +226 +219 +212 +205 +198 +192 +185 +177 +170 +163 +157 +150 +142 +136 +129 +121 +114 +107 +100 +93 +86 +80 +73 +65 +58 +51 +44 +37 +30 +23 +16 +9 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +8 +16 +22 +30 +37 +43 +51 +57 +64 +72 +79 +86 +92 +100 +106 +114 +121 +128 +135 +142 +149 +156 +163 +169 +176 +183 +190 +197 +204 +210 +217 +223 +229 +235 +240 +241 +239 +235 +230 +223 +217 +211 +204 +197 +190 +183 +176 +169 +162 +156 +149 +142 +135 +128 +121 +114 +106 +100 +93 +86 +78 +72 +65 +58 +50 +44 +37 +29 +23 +16 +8 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +8 +15 +22 +29 +36 +43 +50 +57 +64 +71 +78 +85 +92 +99 +106 +113 +120 +126 +134 +141 +148 +154 +161 +168 +174 +181 +189 +195 +201 +208 +214 +220 +226 +230 +233 +234 +232 +229 +225 +220 +214 +208 +201 +195 +189 +182 +175 +168 +161 +155 +147 +140 +134 +127 +120 +113 +106 +98 +92 +85 +78 +71 +64 +57 +50 +43 +36 +29 +22 +15 +8 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +8 +14 +21 +29 +36 +42 +50 +56 +64 +70 +77 +84 +91 +98 +105 +111 +119 +125 +132 +139 +146 +153 +159 +166 +173 +180 +185 +192 +198 +204 +210 +216 +220 +223 +226 +227 +226 +224 +220 +215 +210 +204 +199 +192 +186 +179 +173 +166 +159 +153 +146 +139 +132 +126 +119 +111 +105 +98 +91 +84 +77 +70 +63 +56 +50 +42 +36 +29 +21 +15 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +13 +21 +27 +34 +41 +48 +55 +62 +69 +75 +82 +90 +97 +103 +110 +117 +123 +131 +137 +143 +151 +158 +163 +170 +176 +183 +189 +194 +200 +206 +210 +214 +217 +219 +219 +219 +217 +214 +210 +205 +200 +195 +189 +183 +176 +170 +164 +157 +151 +144 +138 +131 +124 +117 +110 +103 +97 +90 +82 +75 +69 +62 +55 +48 +41 +35 +27 +21 +13 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +12 +20 +26 +33 +40 +47 +54 +61 +68 +74 +81 +88 +95 +102 +109 +115 +122 +128 +135 +141 +148 +154 +161 +167 +173 +179 +184 +190 +195 +200 +205 +208 +211 +212 +213 +212 +211 +208 +204 +200 +196 +190 +184 +179 +173 +167 +161 +154 +148 +142 +135 +128 +121 +115 +108 +101 +95 +87 +81 +74 +68 +61 +53 +47 +39 +33 +26 +20 +13 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +11 +18 +25 +31 +39 +45 +53 +58 +66 +72 +79 +86 +93 +99 +106 +113 +120 +125 +132 +139 +145 +151 +157 +163 +169 +175 +181 +185 +190 +194 +198 +202 +204 +205 +206 +205 +204 +201 +199 +194 +190 +186 +180 +175 +170 +163 +158 +151 +145 +139 +132 +126 +119 +113 +106 +100 +93 +86 +80 +73 +65 +59 +52 +45 +39 +31 +25 +18 +11 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +10 +17 +23 +30 +37 +44 +50 +57 +64 +70 +77 +83 +90 +97 +103 +110 +116 +123 +129 +135 +142 +147 +154 +160 +165 +170 +176 +180 +185 +189 +192 +195 +197 +199 +199 +198 +197 +195 +192 +189 +185 +180 +175 +170 +165 +159 +154 +148 +142 +135 +129 +123 +116 +110 +103 +97 +90 +84 +77 +70 +64 +57 +50 +44 +36 +30 +23 +16 +9 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +8 +15 +22 +29 +35 +42 +48 +55 +61 +69 +75 +81 +88 +95 +101 +107 +114 +119 +126 +132 +138 +144 +149 +155 +160 +165 +170 +175 +179 +183 +186 +188 +190 +191 +192 +191 +190 +189 +186 +182 +179 +175 +170 +166 +160 +155 +149 +144 +138 +132 +126 +119 +113 +108 +101 +95 +88 +81 +75 +68 +62 +55 +48 +41 +35 +29 +21 +15 +7 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +13 +20 +26 +32 +39 +46 +52 +60 +65 +73 +79 +85 +92 +97 +104 +111 +117 +122 +128 +134 +140 +145 +151 +156 +160 +165 +169 +173 +177 +179 +182 +183 +184 +185 +184 +183 +182 +179 +176 +173 +169 +165 +161 +156 +150 +146 +140 +134 +128 +122 +117 +111 +104 +98 +91 +86 +79 +72 +66 +59 +52 +46 +39 +32 +26 +19 +12 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +10 +18 +24 +30 +36 +44 +50 +57 +63 +69 +76 +82 +88 +95 +101 +107 +113 +119 +125 +129 +135 +140 +146 +150 +155 +159 +163 +167 +170 +173 +174 +177 +178 +177 +177 +176 +175 +173 +170 +167 +163 +159 +155 +151 +146 +141 +136 +130 +124 +118 +112 +107 +100 +95 +88 +82 +76 +70 +63 +57 +50 +44 +37 +31 +24 +17 +11 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +8 +15 +21 +28 +34 +41 +47 +54 +60 +67 +73 +79 +85 +91 +97 +103 +108 +115 +120 +125 +131 +136 +141 +146 +150 +154 +158 +161 +163 +166 +169 +169 +170 +171 +170 +169 +168 +166 +164 +161 +158 +153 +150 +145 +141 +136 +131 +125 +120 +114 +109 +102 +97 +91 +85 +78 +72 +66 +60 +54 +47 +40 +35 +28 +21 +14 +8 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +13 +18 +25 +32 +38 +45 +51 +57 +63 +69 +75 +81 +88 +93 +99 +104 +110 +115 +121 +126 +130 +135 +140 +144 +148 +151 +154 +157 +159 +161 +163 +163 +164 +163 +162 +161 +160 +157 +155 +151 +147 +143 +139 +135 +131 +126 +120 +115 +110 +104 +99 +93 +87 +82 +76 +69 +63 +57 +51 +45 +38 +32 +25 +18 +12 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +9 +16 +22 +29 +35 +41 +47 +53 +60 +66 +72 +78 +83 +89 +95 +100 +105 +111 +116 +121 +126 +130 +134 +138 +142 +145 +147 +151 +152 +154 +156 +156 +156 +157 +156 +154 +153 +151 +148 +145 +141 +138 +134 +130 +125 +121 +116 +111 +105 +100 +95 +89 +83 +78 +72 +65 +60 +53 +48 +41 +35 +29 +23 +15 +9 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +7 +13 +19 +25 +32 +38 +44 +50 +57 +62 +68 +73 +79 +85 +91 +96 +100 +105 +111 +115 +120 +124 +128 +132 +135 +138 +142 +143 +146 +147 +149 +150 +149 +150 +149 +148 +146 +144 +141 +139 +136 +133 +128 +124 +120 +115 +111 +106 +100 +95 +90 +85 +79 +74 +68 +62 +56 +50 +44 +38 +32 +25 +19 +12 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +10 +16 +22 +29 +35 +41 +47 +52 +58 +63 +70 +75 +80 +85 +91 +96 +101 +106 +110 +115 +119 +123 +126 +129 +132 +135 +137 +139 +140 +142 +142 +143 +142 +142 +141 +139 +137 +135 +133 +129 +126 +123 +118 +114 +110 +105 +101 +96 +91 +85 +81 +75 +70 +64 +58 +52 +46 +40 +34 +29 +22 +16 +10 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +6 +13 +18 +24 +31 +36 +42 +48 +54 +59 +65 +70 +76 +81 +86 +91 +96 +100 +105 +109 +113 +116 +120 +123 +126 +128 +130 +132 +134 +134 +135 +136 +135 +135 +133 +132 +130 +128 +126 +123 +119 +116 +113 +109 +105 +100 +95 +91 +86 +81 +76 +70 +65 +60 +54 +49 +43 +36 +31 +25 +19 +12 +7 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +9 +15 +21 +27 +33 +39 +44 +50 +55 +60 +66 +71 +76 +81 +85 +90 +94 +99 +103 +107 +110 +113 +116 +119 +122 +124 +125 +127 +128 +128 +129 +128 +128 +127 +126 +124 +122 +119 +116 +113 +110 +106 +103 +99 +95 +91 +86 +81 +76 +71 +66 +61 +56 +50 +44 +39 +32 +27 +21 +15 +9 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +11 +17 +22 +29 +34 +40 +46 +51 +56 +61 +66 +71 +76 +81 +85 +89 +93 +97 +101 +104 +107 +110 +113 +114 +117 +118 +120 +121 +121 +122 +121 +121 +120 +119 +117 +115 +113 +110 +107 +105 +100 +97 +94 +89 +85 +80 +76 +71 +66 +61 +56 +50 +46 +40 +34 +29 +23 +17 +11 +5 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +7 +13 +19 +24 +30 +35 +41 +46 +51 +56 +61 +66 +71 +75 +79 +83 +87 +91 +94 +98 +101 +104 +106 +108 +110 +112 +113 +114 +114 +114 +114 +114 +113 +111 +110 +108 +106 +104 +101 +98 +95 +92 +87 +83 +79 +75 +71 +66 +61 +56 +52 +46 +41 +36 +30 +24 +18 +13 +7 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +9 +15 +20 +25 +31 +36 +41 +46 +51 +56 +61 +65 +69 +73 +78 +81 +85 +88 +91 +94 +97 +100 +101 +103 +104 +106 +106 +107 +108 +107 +106 +106 +105 +103 +101 +100 +97 +94 +91 +88 +84 +82 +77 +74 +69 +65 +61 +56 +51 +46 +41 +36 +30 +25 +20 +15 +9 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +10 +16 +21 +26 +31 +37 +41 +46 +50 +55 +59 +64 +68 +72 +75 +79 +82 +85 +88 +91 +93 +95 +97 +98 +99 +100 +100 +100 +100 +100 +99 +98 +96 +94 +93 +91 +88 +85 +82 +79 +75 +71 +68 +64 +59 +56 +50 +46 +41 +36 +31 +26 +21 +15 +10 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +6 +11 +16 +21 +26 +31 +36 +41 +45 +50 +54 +58 +62 +66 +70 +72 +75 +79 +81 +84 +86 +88 +90 +91 +92 +93 +93 +93 +93 +93 +91 +91 +90 +88 +85 +84 +81 +78 +75 +72 +70 +66 +62 +58 +54 +50 +46 +41 +36 +31 +26 +21 +16 +11 +6 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +6 +11 +17 +22 +27 +31 +36 +39 +44 +49 +53 +56 +59 +63 +66 +69 +72 +75 +77 +79 +81 +82 +84 +85 +86 +86 +86 +86 +86 +84 +84 +83 +81 +79 +77 +74 +72 +70 +66 +63 +59 +56 +52 +48 +45 +40 +35 +31 +26 +21 +16 +11 +6 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +6 +12 +16 +21 +26 +30 +34 +38 +42 +46 +50 +54 +57 +60 +63 +65 +68 +70 +73 +75 +76 +77 +78 +79 +80 +79 +79 +78 +78 +77 +76 +74 +72 +70 +68 +66 +63 +60 +57 +54 +50 +46 +43 +38 +34 +30 +26 +21 +16 +11 +6 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +6 +11 +16 +20 +24 +28 +33 +37 +41 +44 +48 +51 +54 +56 +59 +61 +63 +66 +67 +68 +70 +71 +71 +72 +72 +72 +71 +71 +70 +69 +67 +66 +64 +62 +59 +57 +54 +51 +47 +44 +41 +37 +33 +29 +24 +20 +15 +11 +6 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +5 +10 +15 +19 +23 +27 +31 +35 +38 +41 +45 +47 +51 +52 +55 +57 +59 +61 +62 +63 +64 +64 +65 +65 +65 +64 +64 +63 +62 +60 +58 +57 +55 +53 +51 +47 +44 +41 +38 +34 +31 +27 +23 +19 +14 +10 +5 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +5 +9 +13 +17 +21 +25 +29 +32 +35 +38 +41 +44 +46 +48 +50 +52 +53 +55 +56 +58 +58 +58 +58 +58 +58 +57 +56 +55 +54 +52 +50 +48 +46 +44 +41 +38 +35 +31 +29 +25 +21 +17 +13 +9 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +8 +12 +15 +18 +22 +25 +28 +32 +35 +37 +40 +41 +44 +46 +47 +48 +49 +50 +51 +51 +51 +51 +51 +50 +49 +48 +47 +45 +43 +41 +39 +37 +34 +32 +29 +25 +22 +19 +15 +11 +7 +4 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +5 +9 +12 +16 +20 +22 +25 +28 +30 +33 +35 +37 +39 +40 +41 +42 +43 +44 +44 +45 +44 +44 +43 +43 +41 +40 +38 +36 +35 +32 +30 +28 +25 +23 +19 +16 +12 +9 +6 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +7 +10 +13 +16 +18 +21 +23 +26 +28 +30 +31 +33 +35 +36 +36 +36 +37 +37 +37 +37 +36 +35 +35 +34 +31 +30 +28 +26 +23 +22 +19 +16 +13 +10 +7 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +4 +6 +10 +12 +15 +17 +19 +21 +24 +25 +26 +28 +28 +29 +30 +30 +30 +30 +29 +29 +28 +28 +26 +25 +23 +22 +19 +17 +15 +12 +10 +6 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +3 +6 +8 +10 +13 +15 +16 +18 +19 +21 +21 +22 +23 +23 +23 +23 +22 +23 +21 +20 +19 +17 +16 +14 +13 +11 +8 +6 +3 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +2 +4 +5 +8 +9 +11 +12 +13 +14 +15 +15 +16 +16 +16 +16 +15 +14 +14 +13 +11 +9 +8 +6 +3 +2 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +2 +4 +5 +7 +7 +8 +9 +9 +9 +9 +8 +8 +7 +7 +6 +4 +2 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +1 +1 +2 +2 +2 +1 +1 +1 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 diff --git a/tests/SDL/blittest.c b/tests/SDL/blittest.c new file mode 100644 index 0000000..fe92757 --- /dev/null +++ b/tests/SDL/blittest.c @@ -0,0 +1,186 @@ +/***************************************************************************** + * This file is part of gfxprim library. * + * * + * Gfxprim is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public * + * License as published by the Free Software Foundation; either * + * version 2.1 of the License, or (at your option) any later version. * + * * + * Gfxprim 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 * + * Lesser General Public License for more details. * + * * + * You should have received a copy of the GNU Lesser General Public * + * License along with gfxprim; if not, write to the Free Software * + * Foundation, Inc., 51 Franklin Street, Fifth Floor, * + * Boston, MA 02110-1301 USA * + * * + * Copyright (C) 2009-2010 Jiri "BlueBear" Dluhos * + * jiri.bluebear.dluhos@gmail.com * + * * + * Copyright (C) 2009-2011 Cyril Hrubis metan@ucw.cz * + * * + *****************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <SDL/SDL.h> + +#include "GP_SDL.h" + +static GP_Pixel black; + +SDL_Surface *display = NULL; +GP_Context context; +GP_Context *bitmap; + +SDL_TimerID timer; + +SDL_UserEvent timer_event; + +static int pause_flag = 0; + +static int bitmap_x, bitmap_y, bitmap_vx = -3, bitmap_vy = -3; + +Uint32 timer_callback(__attribute__((unused)) Uint32 interval, + __attribute__((unused)) void *param) +{ + timer_event.type = SDL_USEREVENT; + SDL_PushEvent((SDL_Event *) &timer_event); + return 10; +} + + +void redraw_screen(void) +{ + if (pause_flag) + return; + + bitmap_x += bitmap_vx; + bitmap_y += bitmap_vy; + + if (bitmap_x + bitmap->w > context.w) { + bitmap_vx = -bitmap_vx; + bitmap_x += bitmap_vx; + } + + if (bitmap_x < 0) { + bitmap_vx = -bitmap_vx; + bitmap_x += bitmap_vx; + } + + if (bitmap_y + bitmap->h > context.h) { + bitmap_vy = -bitmap_vy; + bitmap_y += bitmap_vy; + } + + if (bitmap_y < 0) { + bitmap_vy = -bitmap_vy; + bitmap_y += bitmap_vy; + } + + SDL_LockSurface(display); + + GP_Blit_Naive(bitmap, 0, 0, bitmap->w, bitmap->h, &context, bitmap_x, bitmap_y); + + SDL_UpdateRect(display, bitmap_x, bitmap_y, bitmap->w, bitmap->h); + + SDL_UnlockSurface(display); +} + +void event_loop(void) +{ + SDL_Event event; + + while (SDL_WaitEvent(&event) > 0) { + + switch (event.type) { + + case SDL_USEREVENT: + redraw_screen(); + break; + + case SDL_KEYDOWN: + switch (event.key.keysym.sym) { + case SDLK_p: + pause_flag = !pause_flag; + break; + case SDLK_ESCAPE: + return; + + default: + break; + } + break; + case SDL_QUIT: + return; + default: + break; + } + } +} + +int main(int argc, char *argv[]) +{ + /* Bits per pixel to be set for the display surface. */ + int display_bpp = 0; + + int i; + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-16") == 0) { + display_bpp = 16; + } + else if (strcmp(argv[i], "-24") == 0) { + display_bpp = 24; + } + else if (strcmp(argv[i], "-32") == 0) { + display_bpp = 32; + } + } + + GP_SetDebugLevel(10); + + GP_RetCode ret; + + if (ret = GP_LoadPGM("ball.pgm", &bitmap)) { + fprintf(stderr, "Failed to load fractal: %sn", GP_RetCodeName(ret)); + return 1; + } + + /* Initialize SDL */ + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) { + fprintf(stderr, "Could not initialize SDL: %sn", SDL_GetError()); + return 1; + } + + /* Create a window with a software back surface */ + display = SDL_SetVideoMode(640, 480, display_bpp, SDL_SWSURFACE); + if (display == NULL) { + fprintf(stderr, "Could not open display: %sn", SDL_GetError()); + goto fail; + } + + GP_SDL_ContextFromSurface(&context, display); + + black = GP_ColorToPixel(&context, GP_COL_BLACK); + + /* Set up the refresh timer */ + timer = SDL_AddTimer(60, timer_callback, NULL); + if (timer == 0) { + fprintf(stderr, "Could not set up timer: %sn", SDL_GetError()); + goto fail; + } + + /* Enter the event loop */ + event_loop(); + + /* We're done */ + SDL_Quit(); + return 0; + +fail: + SDL_Quit(); + return 1; +} +
-----------------------------------------------------------------------
Summary of changes: include/loaders/GP_Loaders.h | 4 +- include/loaders/GP_PBM.h | 6 +- include/loaders/GP_PGM.h | 4 +- libs/loaders/GP_PBM.c | 12 +- libs/loaders/GP_PGM.c | 91 +- libs/loaders/Makefile | 3 +- tests/SDL/Makefile | 2 +- tests/SDL/ball.pgm |10004 +++++++++++++++++++++++++++++++ tests/SDL/{symbolstest.c => blittest.c} | 87 +- 9 files changed, 10134 insertions(+), 79 deletions(-) create mode 100644 tests/SDL/ball.pgm copy tests/SDL/{symbolstest.c => blittest.c} (75%)
repo.or.cz automatic notification. Contact project admin jiri.bluebear.dluhos@gmail.com if you want to unsubscribe, or site admin admin@repo.or.cz if you receive no reply.