/*! \brief Draw raster row in RGB mode \param A_row row number \param r_raster red data buffer \param g_raster green data buffer \param b_raster blue data buffer \param r_colors colors used for red channel \param g_colors colors used for green channel \param b_colors colors used for blue channel \param r_type raster type used for red channel \param g_type raster type used for red channel \param b_type raster type used for red channel \return */ int D_draw_raster_RGB(int A_row, const void *r_raster, const void *g_raster, const void *b_raster, struct Colors *r_colors, struct Colors *g_colors, struct Colors *b_colors, RASTER_MAP_TYPE r_type, RASTER_MAP_TYPE g_type, RASTER_MAP_TYPE b_type) { static unsigned char *r_buf, *g_buf, *b_buf, *n_buf; static int nalloc; int r_size = Rast_cell_size(r_type); int g_size = Rast_cell_size(g_type); int b_size = Rast_cell_size(b_type); int ncols = src[0][1] - src[0][0]; int i; /* reallocate color_buf if necessary */ if (nalloc < ncols) { nalloc = ncols; r_buf = G_realloc(r_buf, nalloc); g_buf = G_realloc(g_buf, nalloc); b_buf = G_realloc(b_buf, nalloc); n_buf = G_realloc(n_buf, nalloc); } /* convert cell values to bytes */ Rast_lookup_colors(r_raster, r_buf, n_buf, n_buf, n_buf, ncols, r_colors, r_type); Rast_lookup_colors(g_raster, n_buf, g_buf, n_buf, n_buf, ncols, g_colors, g_type); Rast_lookup_colors(b_raster, n_buf, n_buf, b_buf, n_buf, ncols, b_colors, b_type); if (D__overlay_mode) for (i = 0; i < ncols; i++) { n_buf[i] = (Rast_is_null_value(r_raster, r_type) || Rast_is_null_value(g_raster, g_type) || Rast_is_null_value(b_raster, b_type)); r_raster = G_incr_void_ptr(r_raster, r_size); g_raster = G_incr_void_ptr(g_raster, g_size); b_raster = G_incr_void_ptr(b_raster, b_size); } A_row = COM_raster(ncols, A_row, r_buf, g_buf, b_buf, D__overlay_mode ? n_buf : NULL); return (A_row < src[1][1]) ? A_row : -1; }
static int draw_cell(int A_row, const void *array, struct Colors *colors, RASTER_MAP_TYPE data_type) { static unsigned char *red, *grn, *blu, *set; static int nalloc; int ncols = src[0][1] - src[0][0]; int i; if (nalloc < ncols) { nalloc = ncols; red = G_realloc(red, nalloc); grn = G_realloc(grn, nalloc); blu = G_realloc(blu, nalloc); set = G_realloc(set, nalloc); } Rast_lookup_colors(array, red, grn, blu, set, ncols, colors, data_type); if (D__overlay_mode) for (i = 0; i < ncols; i++) { set[i] = Rast_is_null_value(array, data_type); array = G_incr_void_ptr(array, Rast_cell_size(data_type)); } A_row = COM_raster(ncols, A_row, red, grn, blu, D__overlay_mode ? set : NULL); return (A_row < src[1][1]) ? A_row : -1; }
static int load_files(void) { void *voidc; int rtype; register int i, rowoff, row, col, vxoff, vyoff, offset; int cnt, fd, size, tsiz, coff; int vnum; int y_rows, y_cols; char *pr, *pg, *pb; unsigned char *tr, *tg, *tb, *tset; char *mpfilename, *name; char *yfiles[MAXIMAGES]; struct Colors colors; int ret; size = nrows * ncols; pr = G_malloc(size); pg = G_malloc(size); pb = G_malloc(size); tsiz = Rast_window_cols(); tr = (unsigned char *)G_malloc(tsiz); tg = (unsigned char *)G_malloc(tsiz); tb = (unsigned char *)G_malloc(tsiz); tset = (unsigned char *)G_malloc(tsiz); for (cnt = 0; cnt < frames; cnt++) { if (cnt > MAXIMAGES) { cnt--; break; } for (i = 0; i < size; i++) pr[i] = pg[i] = pb[i] = 0; for (vnum = 0; vnum < numviews; vnum++) { if (icols == vcols) { vxoff = BORDER_W; vyoff = (irows == vrows) ? BORDER_W : BORDER_W + vnum * (BORDER_W + vrows); } else if (irows == vrows) { vxoff = (icols == vcols) ? BORDER_W : BORDER_W + vnum * (BORDER_W + vcols); vyoff = BORDER_W; } else { /* 4 views */ /* assumes we want: view1 view2 view3 view4 */ vxoff = vnum % 2 ? BORDER_W : vcols + 2 * BORDER_W; vyoff = vnum > 1 ? vrows + 2 * BORDER_W : BORDER_W; } name = vfiles[vnum][cnt]; G_message(_("Reading raster map <%s>..."), name); fd = Rast_open_old(name, ""); if (Rast_read_colors(name, "", &colors) < 0) G_fatal_error(_("Unable to read color table for <%s>"), name); rtype = Rast_get_map_type(fd); voidc = Rast_allocate_buf(rtype); for (row = 0; row < vrows; row++) { Rast_get_row(fd, voidc, (int)(row / vscale), rtype); rowoff = (vyoff + row) * ncols; Rast_lookup_colors(voidc, tr, tg, tb, tset, tsiz, &colors, rtype); for (col = 0; col < vcols; col++) { coff = (int)(col / vscale); offset = rowoff + col + vxoff; if (!tset[coff]) pr[offset] = pg[offset] = pb[offset] = (char)255; else { pr[offset] = (char)tr[coff]; pg[offset] = (char)tg[coff]; pb[offset] = (char)tb[coff]; } } } Rast_close(fd); } yfiles[cnt] = G_tempfile(); #ifdef USE_PPM write_ppm(pr, pg, pb, nrows, ncols, &y_rows, &y_cols, yfiles[cnt]); #else write_ycc(pr, pg, pb, nrows, ncols, &y_rows, &y_cols, yfiles[cnt]); #endif } mpfilename = G_tempfile(); write_params(mpfilename, yfiles, outfile, cnt, quality, y_rows, y_cols, 0); if (G_verbose() <= G_verbose_min()) ret = G_spawn(encoder, encoder, mpfilename, SF_REDIRECT_FILE, SF_STDOUT, SF_MODE_OUT, G_DEV_NULL, SF_REDIRECT_FILE, SF_STDERR, SF_MODE_OUT, G_DEV_NULL, NULL); else ret = G_spawn(encoder, encoder, mpfilename, NULL); if (ret != 0) G_warning(_("mpeg_encode ERROR")); clean_files(mpfilename, yfiles, cnt); G_free(voidc); G_free(tset); G_free(tr); G_free(tg); G_free(tb); G_free(pr); G_free(pg); G_free(pb); return (cnt); }