示例#1
0
文件: navit.c 项目: justinzane/navit
void
navit_draw(struct navit *this_)
{
	transform_setup_source_rect(this_->trans);
	graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts, this_->route);
	this_->ready=1;
}
示例#2
0
文件: navit.c 项目: justinzane/navit
void
navit_draw(struct navit *this_)
{
	GList *l;
	struct navit_vehicle *nv;

	transform_setup_source_rect(this_->trans);
	graphics_draw(this_->gra, this_->displaylist, this_->mapsets, this_->trans, this_->layouts, this_->route);
	l=this_->vehicles;
	while (l) {
		nv=l->data;
		cursor_redraw(nv->cursor);
		l=g_list_next(l);
	}
	this_->ready=1;
}
示例#3
0
void
graphics_redraw(struct container *co)
{
	int scale=transform_get_scale(co->trans);
	int i,slimit=255,tlimit=255,plimit=255;
	int bw[4],w[4],t[4];
	struct display_list **disp=co->disp;
	struct graphics *gra=co->gra;

#if 0
	printf("scale=%d center=0x%lx,0x%lx mercator scale=%f\n", scale, co->trans->center.x, co->trans->center.y, transform_scale(co->trans->center.y));
#endif
	
	display_free(co->disp, display_end);

	transform_setup_source_rect(co->trans);

	gra->draw_mode(gra, draw_mode_begin);
	for (i = 0 ; i < data_window_type_end; i++) {
		data_window_begin(co->data_window[i]);	
	}
	gra->gc_set_linewidth(gra->gc[GC_RAIL], 3);

	bw[0]=0;
	bw[1]=0;
	bw[2]=0;
	bw[3]=0;
	w[0]=1;
	w[1]=1;
	w[2]=1;
	w[3]=1;
	t[0]=0xf;
	t[1]=0xf;
	t[2]=0xf;
	t[3]=0xf;
	if (scale < 2) {
		tlimit=0xff;
		slimit=0xff;
		bw[0]=17;
		w[0]=15;
		bw[1]=19;
		w[1]=17;
		bw[2]=19;
		w[2]=17;
		bw[3]=21;
		w[3]=17;
	} else if (scale < 4) {
		tlimit=0xff;
		slimit=0xff;
		bw[0]=11;
		w[0]=9;
		bw[1]=13;
		w[1]=11;
		bw[2]=13;
		w[2]=11;
		bw[3]=15;
		w[3]=11;
	} else if (scale < 8) {
		tlimit=0xff;
		slimit=0xff;
		bw[0]=5;
		w[0]=3;
		bw[1]=11;
		w[1]=9;
		bw[2]=11;
		w[2]=9;
		bw[3]=13;
		w[3]=9;
		t[0]=0xa;
		t[1]=0xf;
	} else if (scale < 16) {
		tlimit=0xff;
		slimit=0xff;
		bw[1]=9;
		w[1]=7;
		bw[2]=9;
		w[2]=7;
		bw[3]=11;
		w[3]=7;
		t[0]=0x9;
		t[1]=0xe;
	} else if (scale < 32) {
		tlimit=0xff;
		slimit=0xff;
		bw[1]=5;
		w[1]=3;
		bw[2]=5;
		w[2]=3;
		bw[3]=5;
		w[3]=3;
		t[0]=0x8;
		t[1]=0xb;
	} else if (scale < 64) {
		tlimit=0xf;
		slimit=0x6;
		bw[1]=5;
		w[1]=3;
		bw[2]=5;
		w[2]=3;
		bw[3]=5;
		w[3]=3;
		t[0]=0x8;
		t[1]=0xa;
	} else if (scale < 128) {
		tlimit=0xc;
		slimit=0x6;
		plimit=0x1e;
		w[1]=3;
		w[2]=3;
		bw[3]=5;
		w[3]=3;
		t[0]=0x7;
		t[1]=0xa;
	} else if (scale < 256) {
		tlimit=0xb;
		slimit=0x5;
		plimit=0x1a;
		w[2]=3;
		bw[3]=5;
		w[3]=3;
		t[0]=0x7;
		t[1]=0x8;
	} else if (scale < 512) {
		tlimit=0x9;
		slimit=0x5;
		plimit=0x14;
		w[1]=0;
		w[2]=1;
		bw[3]=3;
		w[3]=1;
		t[0]=0x4;
		t[1]=0x7;
	} else if (scale < 1024) {
		tlimit=0x8;
		slimit=0x4;
		slimit=0x4;
		plimit=0x11;
		w[1]=0;
		w[2]=1;
		bw[3]=3;
		w[3]=1;
		t[0]=0x3;
		t[1]=0x5;
	} else if (scale < 2048) {
		tlimit=0x5;
		slimit=0x3;
		plimit=0x10;
		bw[3]=3;
		w[3]=1;
		t[0]=0x2;
		t[1]=0x4;
	} else if (scale < 4096) {
		bw[3]=3;
		w[3]=1;
		tlimit=0x4;
		slimit=0x2;
		plimit=0xf;
		t[0]=0x2;
		t[1]=0x3;
	} else if (scale < 8192) {
		bw[3]=3;
		w[3]=1;
		tlimit=0x3;
		slimit=0x2;
		plimit=0xf;
		t[0]=0x1;
		t[1]=0x2;
	} else {
		bw[3]=3;
		w[3]=1;
		tlimit=0x2;
		slimit=0x2;
		plimit=0xf;
		t[0]=0x1;
		t[1]=0x4;
	}
	gra->gc_set_linewidth(gra->gc[GC_STREET_SMALL], w[0]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_NO_PASS], w[0]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_SMALL_B], bw[0]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_MID], w[1]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_MID_B], bw[1]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_BIG], w[2]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_BIG_B], bw[2]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_BIG2], w[3]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_BIG2_B], bw[3]);
	gra->gc_set_linewidth(gra->gc[GC_STREET_ROUTE], w[3]+7+w[3]/2);

	profile_timer(NULL);
	graphics_draw(co->map_data, file_border_ply, co, display_rail, plimit, 48, poly_draw_block);
	graphics_draw(co->map_data, file_woodland_ply, co, display_wood, plimit, 48, poly_draw_block);
	graphics_draw(co->map_data, file_other_ply, co, display_other, plimit, 48, poly_draw_block);
	graphics_draw(co->map_data, file_town_twn, co, display_town, tlimit, 48, town_draw_block);
	graphics_draw(co->map_data, file_water_ply, co, display_water, plimit, 48, poly_draw_block);
	graphics_draw(co->map_data, file_sea_ply, co, display_sea, plimit, 48, poly_draw_block);
	/* todo height, tunnel, bridge, street_bti ??? */
#if 0
	graphics_draw(co->map_data, file_height_ply, co, display_other1, plimit, 48, poly_draw_block);
#endif
	if (scale < 256) {
		graphics_draw(co->map_data, file_rail_ply, co, display_rail, plimit, 48, poly_draw_block);
	}
	profile_timer("map_draw");
	plugin_call_draw(co);
	profile_timer("plugin");
#if 0
	draw_poly(map, &co->d_tunnel_ply, "Tunnel", 0, 11, plimit);
#endif
	graphics_draw(co->map_data, file_street_str, co, display_street, slimit, 7, street_draw_block);
  
	display_draw(disp[display_sea], gra, gra->gc[GC_WATER_FILL], NULL); 
	display_draw(disp[display_wood], gra, gra->gc[GC_WOOD], NULL); 
	display_draw(disp[display_other], gra, gra->gc[GC_TOWN_FILL], gra->gc[GC_TOWN_LINE]); 
	display_draw(disp[display_other1], gra, gra->gc[GC_BUILDING], NULL); 
	display_draw(disp[display_other2], gra, gra->gc[GC_BUILDING_2], NULL); 
	display_draw(disp[display_other3], gra, gra->gc[GC_PARK], NULL); 
	display_draw(disp[display_water], gra, gra->gc[GC_WATER_FILL], gra->gc[GC_WATER_LINE]); 
	display_draw(disp[display_rail], gra, gra->gc[GC_RAIL], NULL); 
	street_route_draw(co);
	display_draw(disp[display_street_route], gra, gra->gc[GC_STREET_ROUTE], NULL); 
	if (bw[0]) {
		display_draw(disp[display_street_no_pass], gra, gra->gc[GC_STREET_SMALL_B], NULL); 
		display_draw(disp[display_street], gra, gra->gc[GC_STREET_SMALL_B], NULL); 
	}
	if (bw[1]) 
		display_draw(disp[display_street1], gra, gra->gc[GC_STREET_MID_B], NULL); 
	if (bw[2])
		display_draw(disp[display_street2], gra, gra->gc[GC_STREET_BIG_B], NULL); 
	if (bw[3])
		display_draw(disp[display_street3], gra, gra->gc[GC_STREET_BIG2_B], NULL); 
	if (w[0]) {
		display_draw(disp[display_street_no_pass], gra, gra->gc[GC_STREET_NO_PASS], NULL); 
		display_draw(disp[display_street], gra, gra->gc[GC_STREET_SMALL], NULL); 
	}
	if (w[1]) 
		display_draw(disp[display_street1], gra, gra->gc[GC_STREET_MID], gra->gc[GC_BLACK]); 
	display_draw(disp[display_street2], gra, gra->gc[GC_STREET_BIG], gra->gc[GC_BLACK]); 
	display_draw(disp[display_street3], gra, gra->gc[GC_STREET_BIG2], gra->gc[GC_BLACK]); 
	if (w[3] > 1) 
		display_draw(disp[display_street3], gra, gra->gc[GC_STREET_BIG2_L], NULL); 

	display_draw(disp[display_poi], gra, gra->gc[GC_BLACK], NULL); 


	profile_timer("display_draw");

	if (scale < 2) {
		display_labels(disp[display_street], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[1]);
		display_labels(disp[display_street1], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[1]);
	}
	else {
		display_labels(disp[display_street], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]);
		display_labels(disp[display_street1], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]);
	}
	display_labels(disp[display_street2], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]);
	display_labels(disp[display_street3], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]);

	for (i = display_town+t[1] ; i < display_town+0x10 ; i++) 
		display_labels(disp[i], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[0]);
	for (i = display_town+t[0] ; i < display_town+t[1] ; i++) 
		display_labels(disp[i], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[1]);
	for (i = display_town ; i < display_town+t[0] ; i++) 
		display_labels(disp[i], gra, gra->gc[GC_TEXT_FG], gra->gc[GC_TEXT_BG], gra->font[2]);

	for (i = display_town ; i < display_town+0x10 ; i++) 
		display_draw(disp[i], gra, gra->gc[GC_BLACK], NULL); 
	display_draw(disp[display_bti], gra, gra->gc[GC_BLACK], NULL); 
	profile_timer("labels");
	gra->draw_mode(gra, draw_mode_end);
	for (i = 0 ; i < data_window_type_end; i++) {
		data_window_end(co->data_window[i]);	
	}
#if 0
	map_scrollbars_update(map);
#endif
}
void graphics_hud_draw(hud_t *hud, float attitude[3], float speed, float altitude, float track, float bearing, float distance, const char *waypoint)
{
    DEBUG("graphics_hud_draw()");
    assert(hud != 0);
    assert(attitude != 0);
    assert(waypoint != 0);

    const char *wpt_name = waypoint[0] ? waypoint : "???";

    // Print labels
    char str[32];
    snprintf(str, sizeof(str), "%.0f km/h", speed);
    graphics_label_set_text(hud->speed_label, str);
    snprintf(str, sizeof(str), "%.0f m", altitude);
    graphics_label_set_text(hud->altitude_label, str);
    snprintf(str, sizeof(str), "%s, %.1f km", wpt_name, distance);
    graphics_label_set_text(hud->waypoint_label, str);

    float hangle, vangle;

    // Draw static labels
    graphics_draw(hud->g, hud->speed_label, 10, 10, 1, 0);
    graphics_draw(hud->g, hud->waypoint_label, hud->g->width / 2, 10, 1, 0);
    graphics_draw(hud->g, hud->altitude_label, hud->g->width - 10, 10, 1, 0);

    // Draw horizon line
    vangle = -attitude[1];
    vangle = vangle < M_PI ? vangle : vangle - 2 * M_PI;
    vangle = vangle > -M_PI ? vangle : vangle + 2 * M_PI;
    if(vangle < hud->vfov / -2.0)
        graphics_draw(hud->g, hud->horizon_alt, hud->g->width / 2, 100, 1, 0);
    else if(vangle > hud->vfov / 2.0)
        graphics_draw(hud->g, hud->horizon_alt, hud->g->width / 2, (float)hud->g->height - 100, 1, M_PI);
    else
        graphics_draw(hud->g, hud->horizon_line, hud->g->width / 2, (float)hud->g->height / 2 + (float)hud->g->height * vangle / hud->vfov, 1, -attitude[0]);

    // Draw compass lines
    graphics_draw(hud->g, hud->compass_lines, (float)hud->g->width / 2 - (float)hud->g->width * attitude[2] / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0);
    if(attitude[2] < hud->hfov / 2) graphics_draw(hud->g, hud->compass_lines, (float)hud->g->width / 2 - (float)hud->g->width * (attitude[2] + 2 * M_PI)  / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0);
    if(attitude[2] > 2 * M_PI - hud->hfov / 2) graphics_draw(hud->g, hud->compass_lines, (float)hud->g->width / 2 - (float)hud->g->width * (attitude[2] - 2 * M_PI) / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0);

    // Draw compass labels
    int i;
    for(i = 0; i < COMPASS_LABEL_NUM; i++)
    {
        hangle = attitude[2] - i * 2 * M_PI / COMPASS_LABEL_NUM;
        hangle = hangle < M_PI ? hangle : hangle - 2 * M_PI;
        hangle = hangle > -M_PI ? hangle : hangle + 2 * M_PI;
        if((hangle < hud->hfov / -2.0) || (hangle > hud->hfov / 2.0)) continue;
        graphics_draw(hud->g, hud->compass_labels[i], (float)hud->g->width / 2 - (float)hud->g->width * hangle / hud->hfov, hud->g->height - 3, 1, 0);
    }

    // Draw track marker
    hangle = track - attitude[2];
    hangle = hangle < M_PI ? hangle : hangle - 2 * M_PI;
    hangle = hangle > -M_PI ? hangle : hangle + 2 * M_PI;
    if(hangle < hud->hfov / -2.0) hangle = hud->hfov / -2.0;
    if(hangle > hud->hfov / 2.0) hangle = hud->hfov / 2.0;
    graphics_draw(hud->g, hud->track_marker, (float)hud->g->width / 2 + (float)hud->g->width * hangle / hud->hfov, hud->g->height - hud->font_size - 12, 1, 0);

    // Draw bearing marker
    hangle = bearing - attitude[2];
    hangle = hangle < M_PI ? hangle : hangle - 2 * M_PI;
    hangle = hangle > -M_PI ? hangle : hangle + 2 * M_PI;
    if(hangle < hud->hfov / -2.0) hangle = hud->hfov / -2.0;
    if(hangle > hud->hfov / 2.0) hangle = hud->hfov / 2.0;
    graphics_draw(hud->g, hud->bearing_marker, (float)hud->g->width / 2 + (float)hud->g->width * hangle / hud->hfov, hud->g->height - hud->font_size - 10, 1, 0);
}
void application_mainloop(application_t *app)
{
    DEBUG("application_mainloop()");
    assert(app != 0);

    void *data;
    size_t length;
    float att[3], alt, spd, trk, brg, dst;
    char wpt[32];

    float accsum[3];
    float difftime;

    while(1)
    {
        // Process video
        if(!video_read(app->video, &data, &length))
        {
            ERROR("Cannot read from video device");
            break;
        }
        graphics_image_set_bitmap(app->image, data, length);
        graphics_draw(app->graphics, app->image, app->window_width / 2, app->window_height / 2,
                      (float)app->window_width / (float)app->window_height < (float)app->video_width / (float)app->video_height ?
                      (float)app->window_height / (float)app->video_height : (float)app->window_width / (float)app->video_width, 0);

        imu_get_attitude(app->imu, att);
        gps_get_pos(app->gps, NULL, NULL, &alt);

        imu_get_acceleration(app->imu, accsum, &difftime);
        gps_inertial_update(app->gps, accsum[0], accsum[1], accsum[2], difftime);

        // Draw landmarks
        void *iterator;
        float hangle, vangle, dist;
        drawable_t *label = gps_get_projection_label(app->gps, &hangle, &vangle, &dist, att, &iterator);
        while(iterator)
        {
            if((hangle > app->video_hfov / -2.0) &&
               (hangle < app->video_hfov / 2.0)  &&
               (vangle > app->video_vfov / -2.0) &&
               (vangle < app->video_vfov / 2.0)  &&
               (dist < app->visible_distance))
            {
                INFO("Projecting landmark hangle = %f, vangle = %f, distance = %f", hangle, vangle, dist / 1000.0);
                uint32_t x = (float)app->window_width  / 2 + (float)app->window_width  * hangle / app->video_hfov;
                uint32_t y = (float)app->window_height / 2 + (float)app->window_height * vangle / app->video_vfov;
                graphics_draw(app->graphics, label, x, y, 1, 0);
            }
            label = gps_get_projection_label(app->gps, &hangle, &vangle, &dist, att, &iterator);
        }

        // Draw HUD overlay
        gps_get_track(app->gps, &spd, &trk);
        gps_get_route(app->gps, wpt, &dst, &brg);
        graphics_hud_draw(app->hud, att, spd, alt, trk, brg, dst, wpt);

        // Render to screen
        if(!graphics_flush(app->graphics, NULL))
        {
            ERROR("Cannot draw");
            break;
        }
    }
}
示例#6
0
static void
pedestrian_cmd_pedestrian_rocket(struct rocket *rocket)
{
    struct attr attr;
    int max=0;
#if 0
    int i,step=10;
#endif
    rocket->a=2;
    rocket->g=1;
    rocket->t=100;
    rocket->hog=0;
    rocket->v=0;
    rocket->vscale=10;
    if (! navit_get_attr(rocket->navit, attr_graphics, &attr, NULL))
        return;
    rocket->gra=attr.u.graphics;
    if (! navit_get_attr(rocket->navit, attr_transformation, &attr, NULL))
        return;
    rocket->trans=attr.u.transformation;
    if (! navit_get_attr(rocket->navit, attr_displaylist, &attr, NULL))
        return;
    rocket->dl=attr.u.displaylist;
    if (! navit_get_attr(rocket->navit, attr_mapset, &attr, NULL))
        return;
    rocket->ms=attr.u.mapset;
    transform_set_hog(rocket->trans, max);
    transform_set_order_base(rocket->trans, 14);
    transform_set_scale(rocket->trans, transform_get_scale(rocket->trans));
    transform_setup_source_rect(rocket->trans);
    graphics_overlay_disable(rocket->gra, 1);
    graphics_draw(rocket->gra, rocket->dl, rocket->ms, rocket->trans, rocket->layout, 0, NULL, 0);
    sensors_locked=1;
    if (!rocket->idle)
        rocket->idle=event_add_idle(50, rocket->callback);
#if 0
    while (hog >= 0) {
        transform_set_hog(trans, hog);
#if 0
        graphics_draw(gra, dl, ms, trans, layout, 0, NULL);
#else
        graphics_displaylist_draw(gra, dl, trans, layout, 0);
#endif
        v=v+a-g;
        if (t > 0)
            t--;
        else
            a=0;
        hog=hog+v/vscale;
    }
#if 0
    for (i = 0 ; i < max ; i+=step) {
        transform_set_hog(trans, i);
        graphics_displaylist_draw(gra, dl, trans, layout, 0);
    }
    for (i = max ; i >= 0 ; i-=step) {
        transform_set_hog(trans, i);
        graphics_displaylist_draw(gra, dl, trans, layout, 0);
    }
#endif
#endif
}