Changeset 19


Ignore:
Timestamp:
Aug 19, 2008, 2:01:38 PM (6 years ago)
Author:
marius
Message:

seriell rendering

Location:
trunk
Files:
2 added
1 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/SConstruct

    r18 r19  
    3535 
    3636env.Program('testTextPath', source=['test/testTextPath.c','textpath.c']) 
    37 env.Program('testStrlist', source=['test/testStrlist.c','strlist.c']) 
    3837env.Program('testSize', source=['test/testSize.c']) 
    3938env.Program('testOSM', source=['test/testOSM.c','osm05.c']) 
    4039 
    4140#env.Program('testRuleset', source=['ruleset.c','testRuleset.c']) 
    42 #env.Program('testOSM', source=['osm05.c','testOSM.c']) 
  • trunk/libmercator.h

    r8 r19  
    3131 
    3232#define TILESIZE        256 
    33 #define LINESIZE(z)     (int)(exp2(z)/(z+1)) 
     33#define LINESIZE(z)     (int)(exp2(z-12)/(z-12+1)) 
    3434 
    3535 
  • trunk/osm05.c

    r18 r19  
    1818 */ 
    1919#include <glib.h> 
     20#include <glib/gstdio.h> 
     21 
    2022#include <time.h> 
    2123#include <expat.h> 
     
    4143// Counts 
    4244int     cntTag = 0; 
    43 int     cntNode = 0; 
    44 int     cntWay = 0; 
    4545int     cntNd = 0; 
    4646 
     
    7979        if (opts->debug > 1) 
    8080            fprintf(stdout,"Parsing Node\n"); 
    81         cntNode++; 
     81        osm->nodecnt++; 
    8282        cNode = malloc(sizeof(osmNode)); 
    8383        while (*atts != NULL) { 
     
    163163        if (opts->debug > 1) 
    164164            fprintf(stdout,"Parsing Way\n"); 
    165         cntWay++; 
     165        osm->waycnt++; 
    166166        cWay = malloc(sizeof(osmWay)); 
    167167        while (*atts != NULL) { 
     
    244244    // Init vars 
    245245    cntTag = 0; 
    246     cntNode = 0; 
    247     cntWay = 0; 
    248246    cntNd = 0; 
    249247 
    250248    // Local Vars 
    251     short int i = 0; 
    252     char spin[] = "/-\\|"; 
     249    unsigned int size; 
     250    unsigned int read = 0; 
     251    struct stat filestat; 
    253252    int len; 
    254253    int done; 
    255254    char *buf; 
    256255    osmFile *osm = NULL; 
     256     
     257    // Test file 
     258    if (!g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { 
     259        fprintf(stderr,"Error: \"%s\" is not a file.\n",filename); 
     260        return NULL; 
     261    } 
     262     
     263    g_stat(filename, &filestat); 
     264    size = (int) filestat.st_size; 
    257265 
    258266    // Open file 
     
    266274    osm->nodes = NULL; 
    267275    osm->nodeidx = g_hash_table_new(g_int_hash, g_int_equal); 
     276    osm->nodecnt = 0; 
    268277    osm->ways = NULL; 
     278    osm->waycnt = 0; 
    269279    osm->minlon = -190; 
    270280    osm->minlat = -190; 
     
    273283 
    274284    if (opts->debug > 0) { 
    275         fprintf(stdout," OSM parsing  "); 
     285        fprintf(stdout," OSM parsing   0%%"); 
    276286        fflush(stdout); 
    277287    } 
     
    289299    // Looping over XML 
    290300    while(!feof(fd)) { 
    291         fprintf(stdout,"\b%c",spin[i++]); 
    292         fflush(stdout); 
    293         i = i%4; 
    294301        len = (int)fread(buf, 1, BUFFSIZE, fd); 
    295302        if (ferror(fd)) { 
    296303            fprintf(stderr, "Read error\n"); 
    297304            return NULL;; 
     305        } 
     306        read += len; 
     307        if (opts->debug > 0) { 
     308            fprintf(stdout,"\r OSM parsing % 3i%%", (int)((read*100)/size)); 
     309            fflush(stdout); 
    298310        } 
    299311        done = len < sizeof(buf); 
     
    314326    if(osm->minlon == -190 || osm->minlat == -190 || 
    315327       osm->maxlon == -190 || osm->maxlat == -190) { 
    316  
    317         osm->minlon = osm->nodes->lon; 
    318         osm->minlat = osm->nodes->lat; 
    319         osm->maxlon = osm->nodes->lon; 
    320         osm->maxlat = osm->nodes->lat; 
     328         
     329        osm->minlon = 360.0; 
     330        osm->minlat = 180.0; 
     331        osm->maxlon = -360.0; 
     332        osm->maxlat = -180.0; 
    321333 
    322334        osmNode *node; 
     
    335347    if (opts->debug > 0) 
    336348        fprintf(stdout,"\r OSM parsing done. (%i/%i/%i/%i) [%fs]\n", 
    337                 cntNode, cntWay, cntTag, cntNd, 
     349                osm->nodecnt, osm->waycnt, cntTag, cntNd, 
    338350                ((long)clock()-start)/(double)CLOCKS_PER_SEC);                 
    339351     
  • trunk/osm05.h

    r16 r19  
    6767typedef struct _osmFile osmFile; 
    6868struct _osmFile { 
    69         osmNode     *nodes; 
    70         GHashTable  *nodeidx; 
    71         osmWay      *ways; 
    72         float       minlat; 
    73         float       minlon; 
    74         float       maxlat; 
    75         float       maxlon; 
     69        osmNode         *nodes;     // Node List 
     70        GHashTable      *nodeidx;   // Node Hash 
     71        unsigned int    nodecnt;    // Node Count 
     72        osmWay          *ways; 
     73        unsigned int    waycnt; 
     74        float           minlat; 
     75        float           minlon; 
     76        float           maxlat; 
     77        float           maxlon; 
    7678    }; 
    7779 
  • trunk/renderer.c

    r18 r19  
    1717 * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
    1818 */ 
    19  
     19#include <glib.h> 
    2020#include <math.h> 
    2121#include <time.h> 
     
    4949    osmNode *nd; 
    5050    coordinates xy; 
    51     int z; 
    5251     
    5352    if (opts->debug > 1) 
     
    5554 
    5655    iter = nodes; 
    57     for (z = 0; z <= opts->maxlayer-opts->minlayer; z++) { 
    58         nd = iter->data; 
    59         xy = coord2xy(nd->lat, nd->lon, z + opts->minlayer); 
    60         cairo_move_to(info->cr[z], xy.x-info->offset[z].x, 
    61                                     xy.y-info->offset[z].y); 
    62     } 
     56    nd = iter->data; 
     57    xy = coord2xy(nd->lat, nd->lon, info->zoom); 
     58    cairo_move_to(info->cr, xy.x-info->offset.x, 
     59                            xy.y-info->offset.y); 
    6360     
    6461    iter = g_slist_next(iter); 
    6562    while(iter) { 
    6663        nd = iter->data; 
    67         for (z = 0; z <= opts->maxlayer - opts->minlayer; z++) { 
    68             xy = coord2xy(nd->lat, nd->lon, z + opts->minlayer); 
    69             cairo_line_to(info->cr[z], 
    70                           xy.x-info->offset[z].x, 
    71                           xy.y-info->offset[z].y); 
    72         } 
     64        xy = coord2xy(nd->lat, nd->lon, info->zoom); 
     65        cairo_line_to(info->cr, xy.x-info->offset.x, xy.y-info->offset.y); 
    7366        iter = g_slist_next(iter); 
    7467    } 
     
    8477    if (opts->debug > 1) 
    8578        fprintf(stdout,"strokePath\n"); 
    86     int z; 
    87  
    88     for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    89        cairo_set_line_width (info->cr[z], 0); 
    90        cairo_stroke(info->cr[z]); 
    91     } 
     79         
     80    cairo_set_line_width (info->cr, 0); 
     81    cairo_stroke(info->cr); 
    9282} 
    9383 
     
    115105        h = cairo_image_surface_get_height (image); 
    116106 
    117  
    118  
    119107        pattern = cairo_pattern_create_for_surface (image); 
    120108        cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); 
    121109    } 
    122110 
    123     int z; 
    124     for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    125         if (opts->minlayer+z<draw->minlayer || opts->minlayer+z>draw->maxlayer) 
    126             continue; 
    127         cairo_set_fill_rule (info->cr[z], CAIRO_FILL_RULE_EVEN_ODD); 
    128         if(draw->pattern) 
    129             cairo_set_source (info->cr[z], pattern); 
    130         else 
    131             cairo_set_source_rgb (info->cr[z], 
    132                                     (double)draw->color[0]/(double)255, 
    133                                     (double)draw->color[1]/(double)255, 
    134                                     (double)draw->color[2]/(double)255); 
    135  
    136         cairo_fill_preserve(info->cr[z]); 
    137     } 
     111    cairo_set_fill_rule (info->cr, CAIRO_FILL_RULE_EVEN_ODD); 
     112    if(draw->pattern) 
     113        cairo_set_source (info->cr, pattern); 
     114    else 
     115        cairo_set_source_rgb (info->cr, (double)draw->color[0]/(double)255, 
     116                                        (double)draw->color[1]/(double)255, 
     117                                        (double)draw->color[2]/(double)255); 
     118 
     119    cairo_fill_preserve(info->cr); 
    138120 
    139121    if(draw->pattern) { 
     
    152134        fprintf(stdout,"drawLine\n"); 
    153135 
    154     int z; 
    155     for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    156         if (opts->minlayer+z<draw->minlayer || opts->minlayer+z>draw->maxlayer) 
    157             continue; 
    158  
    159         cairo_set_line_cap  (info->cr[z], CAIRO_LINE_CAP_ROUND); 
    160         cairo_set_line_width (info->cr[z], draw->width*LINESIZE(z)); 
    161  
    162         cairo_set_source_rgb (info->cr[z], 
    163                                     (double)draw->color[0]/(double)255, 
     136    cairo_set_line_cap  (info->cr, CAIRO_LINE_CAP_ROUND); 
     137    cairo_set_line_width (info->cr, draw->width*LINESIZE(info->zoom)); 
     138 
     139    cairo_set_source_rgb (info->cr, (double)draw->color[0]/(double)255, 
    164140                                    (double)draw->color[1]/(double)255, 
    165141                                    (double)draw->color[2]/(double)255); 
    166         cairo_stroke_preserve(info->cr[z]); 
    167     } 
     142    cairo_stroke_preserve(info->cr); 
    168143} 
    169144 
     
    175150        fprintf(stdout,"drawText\n"); 
    176151 
    177     int z; 
    178     for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    179         if (opts->minlayer+z<draw->minlayer || opts->minlayer+z>draw->maxlayer) 
    180             continue; 
    181              
    182         cairo_select_font_face (info->cr[z], "Sans", CAIRO_FONT_SLANT_NORMAL, 
    183                                         CAIRO_FONT_WEIGHT_NORMAL); 
    184         cairo_set_source_rgb (info->cr[z], (double)draw->color[0]/(double)255, 
    185                               (double)draw->color[1]/(double)255, 
    186                               (double)draw->color[2]/(double)255); 
    187         cairo_set_font_size (info->cr[z], draw->width*LINESIZE(z)); 
    188         textPath(info->cr[z], text); 
    189     } 
     152    cairo_select_font_face (info->cr, "Sans", CAIRO_FONT_SLANT_NORMAL, 
     153                                              CAIRO_FONT_WEIGHT_NORMAL); 
     154    cairo_set_source_rgb (info->cr, (double)draw->color[0]/(double)255, 
     155                                    (double)draw->color[1]/(double)255, 
     156                                    (double)draw->color[2]/(double)255); 
     157    cairo_set_font_size (info->cr, draw->width*LINESIZE(info->zoom)); 
     158    textPath(info->cr, text); 
    190159} 
    191160 
     
    271240} 
    272241 
    273 int renderCairo(cfgRules *ruleset, osmFile *osm) { 
    274     if (opts->debug > 1) 
    275         fprintf(stdout,"renderCairo\n"); 
    276     int z, l; 
    277     renderInfo *info; 
    278  
    279     info = malloc(sizeof(renderInfo)); 
    280  
    281     // Initialize all layers 
    282     for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
    283         coordinates min, max; 
    284         min = coord2xy(osm->minlat, osm->minlon, z+opts->minlayer); 
    285         max = coord2xy(osm->maxlat, osm->maxlon, z+opts->minlayer); 
    286         int w = (int)ceil(max.x-min.x); 
    287         int h = (int)ceil(min.y-max.y); 
    288  
    289         info->offset[z] = coord2xy(osm->maxlat, osm->minlon, z+opts->minlayer); 
    290  
    291         info->surface[z] = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,w,h); 
    292         info->cr[z] = cairo_create(info->surface[z]); 
    293  
    294         cairo_rectangle(info->cr[z], 0, 0, w, h); 
    295         cairo_set_source_rgb(info->cr[z], 
    296                                     (double)ruleset->background[0]/(double)255, 
    297                                     (double)ruleset->background[1]/(double)255, 
    298                                     (double)ruleset->background[2]/(double)255); 
    299         cairo_fill(info->cr[z]); 
    300     } 
     242int renderCairoRun(renderInfo *info) { 
     243    if (opts->debug > 1) 
     244        fprintf(stdout,"renderCairoRun\n"); 
     245    int l; 
    301246 
    302247    // Vars uder while looping throug data 
     
    305250    cfgDraw     *draw; 
    306251    int         paths; 
    307      
    308      
    309  
    310     long start = (long)clock(); 
    311252 
    312253    // Start checking osm from bottom layer. 
     
    314255 
    315256        if (opts->debug > 0) { 
    316             fprintf(stdout,"\r Cairo drawing Layer % 2i", l); 
     257            fprintf(stdout,"\r Cairo drawing z%i Layer % 2i", info->zoom, l); 
    317258            fflush(stdout); 
    318259        } 
    319260 
    320261        // Process Rule by Rule 
    321         LIST_FOREACH(rule, ruleset->rule) { 
     262        LIST_FOREACH(rule, info->ruleset->rule) { 
    322263 
    323264            if(rule->draw != NULL) { // Draw Match first 
     
    325266                paths = 0; 
    326267                // Loop through ways for 
    327                 LIST_FOREACH(way, osm->ways) { 
     268                LIST_FOREACH(way, info->osm->ways) { 
    328269                    //Only objects on current layer 
    329270                    if(way->layer != l) 
     
    365306                } 
    366307                if(paths) { 
    367                     LIST_FOREACH(way, osm->ways) { 
     308                    LIST_FOREACH(way, info->osm->ways) { 
    368309                        //Only objects on current layer 
    369310                        if(way->layer != l || way->name == NULL) 
     
    383324                paths = 0; 
    384325                // Loop through ways for 
    385                 LIST_FOREACH(way, osm->ways) { 
     326                LIST_FOREACH(way, info->osm->ways) { 
    386327                    //Only objects on current layer 
    387328                    if(way->layer != l) 
     
    413354 
    414355    if (opts->debug > 0) 
    415         fprintf(stdout,"\r Cairo drawing done. [%fs]\n", 
    416                     ((long)clock()-start)/(double)CLOCKS_PER_SEC); 
    417  
    418     // Saving Images 
    419     char *filename; 
    420     filename = malloc(sizeof(char)*50); 
    421  
     356        fprintf(stdout,"\r Cairo drawing done\n"); 
     357 
     358    return(0); 
     359} 
     360 
     361int renderCairo(cfgRules *ruleset, osmFile *osm) { 
     362    if (opts->debug > 1) 
     363        fprintf(stdout,"renderCairo\n"); 
     364    int z; 
     365    renderInfo *info; 
     366    GSList *infos; 
     367     
     368    // Initialize all layers 
    422369    for (z=0;z<=opts->maxlayer-opts->minlayer;z++) { 
     370        coordinates min, max; 
     371         
     372        info = malloc(sizeof(renderInfo)); 
     373        info->zoom = z+opts->minlayer; 
     374        info->ruleset = ruleset; 
     375        info->osm = osm; 
     376                 
     377        min = coord2xy(osm->minlat, osm->minlon, info->zoom); 
     378        max = coord2xy(osm->maxlat, osm->maxlon, info->zoom); 
     379        int w = (int)ceil(max.x-min.x); 
     380        int h = (int)ceil(min.y-max.y); 
     381 
     382        info->offset = coord2xy(osm->maxlat, osm->minlon, info->zoom); 
     383 
     384        info->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,w,h); 
     385        info->cr = cairo_create(info->surface); 
     386 
     387        cairo_rectangle(info->cr, 0, 0, w, h); 
     388        cairo_set_source_rgb(info->cr, 
     389                                    (double)ruleset->background[0]/(double)255, 
     390                                    (double)ruleset->background[1]/(double)255, 
     391                                    (double)ruleset->background[2]/(double)255); 
     392        cairo_fill(info->cr); 
     393         
     394        renderCairoRun(info); 
     395         
     396        // Saving Images 
     397        char *filename; 
     398        filename = malloc(sizeof(char)*50); 
     399 
    423400        if (opts->debug > 0) { 
    424             fprintf(stdout,"  Cairo rendering Z%i", z+LAYERMIN); 
     401            fprintf(stdout," Cairo rendering Z%i", info->zoom); 
    425402            fflush(stdout); 
    426403        } 
    427         start = (long)clock(); 
    428         sprintf(filename,"tiles/%02i.png",z+LAYERMIN); 
    429         cairo_surface_write_to_png(info->surface[z], filename); 
    430         cairo_destroy(info->cr[z]); 
    431         cairo_surface_destroy(info->surface[z]); 
     404        sprintf(filename,"tiles/%02i.png",info->zoom); 
     405        cairo_surface_write_to_png(info->surface, filename); 
     406        cairo_destroy(info->cr); 
     407        cairo_surface_destroy(info->surface); 
    432408        if (opts->debug > 0) 
    433             fprintf(stdout," done.  [%fs]\n", 
    434                     ((long)clock()-start)/(double)CLOCKS_PER_SEC); 
    435    } 
    436  
    437     return(0); 
     409            fprintf(stdout," done.\n"); 
     410    } 
     411     
     412    return (0); 
    438413} 
    439414 
  • trunk/renderer.h

    r8 r19  
    2727#include "osm05.h" 
    2828 
    29 #define LAYERMAX    17 
    30 #define LAYERMIN    12 
    31  
    3229typedef struct _renderInfo renderInfo; 
    3330struct _renderInfo { 
    34         coordinates     offset[LAYERMAX-LAYERMIN+1]; 
    35         cairo_surface_t *surface[LAYERMAX-LAYERMIN+1]; 
    36         cairo_t         *cr[LAYERMAX-LAYERMIN+1]; 
    37         short int       minlayer; 
    38         short int       maxlayer; 
     31        coordinates     offset; 
     32        cairo_surface_t *surface; 
     33        cairo_t         *cr; 
     34        short int       zoom; 
     35        cfgRules        *ruleset; 
     36        osmFile         *osm; 
    3937   }; 
    4038 
  • trunk/test/testTextPath.c

    r10 r19  
    3535    draw->color[1] = 0; 
    3636    draw->color[2] = 0; 
    37     draw->width = 20.0; 
    3837 
    3938    double width=400, height=400; 
     
    4645    cairo_fill (cr); 
    4746     
     47    cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, 
     48                            CAIRO_FONT_WEIGHT_NORMAL); 
     49    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); 
     50    cairo_set_font_size (cr, 20.0); 
     51     
    4852    //Test1 
    4953    cairo_move_to(cr,  50,  50); 
     
    5458    cairo_stroke_preserve(cr); 
    5559     
    56     textPath(cr, "Test1", draw); 
     60    textPath(cr, "Test1"); 
    5761     
    5862    //Test2 
     
    6569    cairo_stroke_preserve(cr); 
    6670     
    67     textPath(cr, "Test2", draw); 
     71    textPath(cr, "Test2"); 
    6872     
    6973    //Test3 
     
    7781    cairo_stroke_preserve(cr); 
    7882     
    79     textPath(cr, "Test3", draw); 
     83    textPath(cr, "Test3"); 
    8084     
    8185    //Test4 
     
    9498    cairo_stroke_preserve(cr); 
    9599     
    96     textPath(cr, "Test4", draw); 
     100    textPath(cr, "Test4"); 
    97101 
    98102     
Note: See TracChangeset for help on using the changeset viewer.