source: subversion/sites/other/tilesAtHome_tahngo/Tools/sofortile.c @ 9859

Last change on this file since 9859 was 9632, checked in by jth, 12 years ago

Clean some blank tiles from tilesets

File size: 5.7 KB
Line 
1/*                                                                          */
2/*  sofortile to clean tiles@home tilesetfiles for openstreetmap.org        */
3/*                                                                          */
4/* Compile: gcc -o sofortile -O2 `Magick-config --cflags --ldflags --libs`\ */
5/*            sofortile.c                                                   */
6/*                                                                          */
7/* Copyright (C) 2008 Johan Thelmén                                         */
8/* This program is free software: you can redistribute it and/or modify     */
9/* it under the terms of the GNU General Public License as published by     */
10/* the Free Software Foundation, either version 3 of the License, or        */
11/* (at your option) any later version.                                      */
12/*                                                                          */
13/*  This program is distributed in the hope that it will be useful,         */
14/*  but WITHOUT ANY WARRANTY; without even the implied warranty of          */
15/*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           */
16/*  GNU General Public License for more details.                            */
17/*                                                                          */
18/*  You should have received a copy of the GNU General Public License       */
19/*  along with this program.  If not, see <http://www.gnu.org/licenses/>.   */
20/*                                                                          */
21
22#include <sys/types.h>
23#include <sys/stat.h>
24#include <time.h>
25#include <stdio.h>
26#include <stdlib.h>
27#include <strings.h>
28#include <wand/MagickWand.h>
29
30#define FILEVERSION 1
31#define MIN_VALID_OFFSET 4
32#define HEADERSIZE 8+1366*4
33
34#define ThrowWandException(wand) \
35{ char *description; ExceptionType  severity; \
36  description=MagickGetException(wand,&severity); \
37  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
38  description=(char *) MagickRelinquishMemory(description); \
39  exit(-1); \
40}
41
42int main(int argc, char *argv[])
43{ struct stat sb;
44  FILE *fp;
45
46  if (argc != 2) { fprintf(stderr, "Usage: %s tilefile\n", argv[0]); exit(EXIT_FAILURE); }
47  if (stat(argv[1],&sb) == -1) { perror("stat"); exit(EXIT_FAILURE); }
48  if (sb.st_size < HEADERSIZE) { printf("tileset %s too small, %i!", argv[1], sb.st_size ); exit(EXIT_FAILURE); }
49  printf("File size: %lld bytes\n", (long long) sb.st_size);
50  if ((fp = fopen(argv[1], "r+")) == NULL)  { perror("Could not open file"); exit(EXIT_FAILURE); }  /* + */
51
52  char *tileset;
53  if ((tileset = malloc(sb.st_size + 4)) == NULL) {perror("Could not allocate memory"); exit(EXIT_FAILURE); }
54  if (fread(tileset, sb.st_size,1, fp) != 1) { perror("reading tileset"); exit(EXIT_FAILURE); }
55  if (tileset[0] != FILEVERSION) { printf("tilesetfile %s is our VERSION", argv[1]); fclose(fp); exit(EXIT_FAILURE); }
56
57  MagickBooleanType status;
58  MagickWand  *mw;
59  MagickWandGenesis();
60  mw = NewMagickWand();
61  int i,nexti;
62  unsigned int *startpos,*endpos;
63  unsigned int nextend, nextstart = 5472,size;
64  for (i=1;i <= 1365; i++)
65  { startpos = (unsigned int *)&tileset[4*i+4]; 
66    if (*startpos < MIN_VALID_OFFSET ) continue;
67//    { switch (*startpos)
68//      { case 0: printf("#%d sea\n",i); continue;
69//        case 1: printf("#%d land\n",i); continue;
70//        case 2: printf("#%d transparent\n",i); continue;
71//        default: printf("#%d Error!!\n",i); continue;
72//    } }
73
74    for (nexti = i; nexti <= 1366; ++nexti)
75    { endpos = (unsigned int *)&tileset[4*nexti+8];
76      if (*endpos > MIN_VALID_OFFSET) break;
77    }
78    size = *endpos - *startpos;
79//    if (size == 0) continue; /* Last tile ? */
80    printf("#%d Nextstart:%d Start:%d Stop:%d Size:%d ", i, nextstart, *startpos, *endpos , size );
81    status = MagickReadImageBlob( mw, &tileset[*startpos], size);
82    if (status == MagickFalse) ThrowWandException(mw);
83
84    unsigned long colors;
85    colors = MagickGetImageColors(mw);
86    char *color;
87    printf("Colors:%d      \r",colors);
88    if (colors == 1) /* Blank tile */
89    { PixelWand *p_wand = NewPixelWand();
90      status = MagickGetImagePixelColor(mw, 1 , 1 , p_wand);
91      if (status == MagickFalse) ThrowWandException(mw);
92      color = PixelGetColorAsString(p_wand);
93      if ( strcmp(color, "rgb(181,214,241)") == 0) { *startpos=1;      /*printf("Color is sea\n");*/ }
94      else if ( strcmp(color, "rgb(248,248,248)") == 0) { *startpos=2; /*printf("Color is land\n");*/ }
95        else printf("Other single color is %s\n", color);  // Print other blank color
96      p_wand = DestroyPixelWand( p_wand );
97    }
98    status = MagickRemoveImage(mw); if (status == MagickFalse) ThrowWandException(mw);
99
100// nextend = *endpos;  /* Where the next tile is starting */
101//     else /* Non changed tile */
102    if ( *startpos > MIN_VALID_OFFSET ) /* Only if we handle a real tile */
103    { if ( *startpos != nextstart)     /* Move tile to beginning and update index */
104      { //printf("#%d Update startpos:%d nextstart:%d size:%d\n", i , *startpos, nextstart, size);
105        bcopy(&tileset[*startpos], &tileset[nextstart], size); /*src dst*/
106        *startpos = nextstart;      /* Update index for new nextstart for image */
107        nextstart = *startpos + size; /* Update where to expect next image to start */
108      }else nextstart = *endpos;    /* Tile in correct place update lastpos */
109    } 
110  } /* Next tile */
111
112  /* Write last index entry, please verify */
113  startpos = (unsigned int *) &tileset[4*1366+4];
114  *startpos = nextstart;
115
116  /* Time to write back the tileset*/
117  rewind(fp);
118  if (fwrite(tileset, nextstart,1, fp) != 1) perror("writing tileset"); /* exit with error another time */
119  ftruncate(fileno(fp), nextstart);
120 
121  DestroyMagickWand(mw);
122  MagickWandTerminus();
123  fclose(fp);
124  exit(EXIT_SUCCESS);
125}
Note: See TracBrowser for help on using the repository browser.