|
@@ -16,43 +16,22 @@
|
|
|
*****************************************************************************/
|
|
|
|
|
|
#include <grass/gis.h>
|
|
|
-#include <grass/raster.h>
|
|
|
+#include <grass/display.h>
|
|
|
#include <grass/symbol.h>
|
|
|
#include <grass/glocale.h>
|
|
|
|
|
|
-/*!
|
|
|
- * \brief draw a symbol at pixel coordinates
|
|
|
- *
|
|
|
- * Draws a symbol (one of $GISBASE/etc/symbols/) to the active display.
|
|
|
- * The starting x0,y0 coordinate corresponds to the center of the icon.
|
|
|
- * The symbol must be pre-processed with S_stroke() before being sent
|
|
|
- * to this function.
|
|
|
- *
|
|
|
- * example:
|
|
|
- * #include <grass/display.h>
|
|
|
- * #include <grass/symbol.h>
|
|
|
- * SYMBOL *Symb;
|
|
|
- * Symb = S_read( symbol_name );
|
|
|
- * S_stroke( Symb, size, rotation, tolerance );
|
|
|
- * D_symbol( Symb, x0, y0, line_color, fill_color );
|
|
|
- *
|
|
|
- * \param Symb The symbol name (e.g. basic/circle)
|
|
|
- * \param x0 The starting x display coordinate (pixel)
|
|
|
- * \param y0 The starting y display coordinate (pixel)
|
|
|
- * \param line_color Outline color
|
|
|
- * \param fill_color Fill color
|
|
|
- * \return void
|
|
|
- */
|
|
|
-
|
|
|
-void D_symbol(const SYMBOL * Symb, double x0, double y0,
|
|
|
- const RGBA_Color * line_color, const RGBA_Color * fill_color)
|
|
|
+static void symbol(const SYMBOL *Symb, double x0, double y0,
|
|
|
+ const RGBA_Color *fill_color,
|
|
|
+ const RGBA_Color *line_color,
|
|
|
+ const RGBA_Color *string_color)
|
|
|
{
|
|
|
int i, j, k;
|
|
|
const SYMBPART *part;
|
|
|
const SYMBCHAIN *chain;
|
|
|
double xp, yp;
|
|
|
double *x, *y;
|
|
|
-
|
|
|
+ double sx = D_get_d_to_u_xconv();
|
|
|
+ double sy = D_get_d_to_u_yconv();
|
|
|
|
|
|
G_debug(2, "D_symbol(): %d parts", Symb->count);
|
|
|
|
|
@@ -67,9 +46,9 @@ void D_symbol(const SYMBOL * Symb, double x0, double y0,
|
|
|
fill_color->a != RGBA_COLOR_NONE) ||
|
|
|
part->fcolor.color == S_COL_DEFINED) {
|
|
|
if (part->fcolor.color == S_COL_DEFAULT)
|
|
|
- R_RGB_color(fill_color->r, fill_color->g, fill_color->b);
|
|
|
+ D_RGB_color(fill_color->r, fill_color->g, fill_color->b);
|
|
|
else
|
|
|
- R_RGB_color(part->fcolor.r, part->fcolor.g,
|
|
|
+ D_RGB_color(part->fcolor.r, part->fcolor.g,
|
|
|
part->fcolor.b);
|
|
|
|
|
|
for (j = 0; j < part->count; j++) { /* for each component polygon */
|
|
@@ -79,10 +58,10 @@ void D_symbol(const SYMBOL * Symb, double x0, double y0,
|
|
|
y = G_malloc(sizeof(double) * chain->scount);
|
|
|
|
|
|
for (k = 0; k < chain->scount; k++) {
|
|
|
- x[k] = x0 + chain->sx[k];
|
|
|
- y[k] = y0 - chain->sy[k];
|
|
|
+ x[k] = x0 + sx * chain->sx[k];
|
|
|
+ y[k] = y0 - sy * chain->sy[k];
|
|
|
}
|
|
|
- R_polygon_abs(x, y, chain->scount);
|
|
|
+ D_polygon_abs(x, y, chain->scount);
|
|
|
|
|
|
G_free(x);
|
|
|
G_free(y);
|
|
@@ -93,23 +72,25 @@ void D_symbol(const SYMBOL * Symb, double x0, double y0,
|
|
|
if ((part->color.color == S_COL_DEFAULT &&
|
|
|
line_color->a != RGBA_COLOR_NONE) ||
|
|
|
part->color.color == S_COL_DEFINED) {
|
|
|
- if (part->color.color == S_COL_DEFAULT) {
|
|
|
- R_RGB_color(line_color->r, line_color->g, line_color->b);
|
|
|
- }
|
|
|
+ if (part->color.color == S_COL_DEFAULT)
|
|
|
+ D_RGB_color(line_color->r, line_color->g, line_color->b);
|
|
|
else
|
|
|
- R_RGB_color(part->color.r, part->color.g, part->color.b);
|
|
|
+ D_RGB_color(part->color.r, part->color.g, part->color.b);
|
|
|
|
|
|
for (j = 0; j < part->count; j++) {
|
|
|
chain = part->chain[j];
|
|
|
|
|
|
+ D_begin();
|
|
|
for (k = 0; k < chain->scount; k++) {
|
|
|
- xp = x0 + chain->sx[k];
|
|
|
- yp = y0 - chain->sy[k];
|
|
|
+ xp = x0 + sx * chain->sx[k];
|
|
|
+ yp = y0 - sy * chain->sy[k];
|
|
|
if (k == 0)
|
|
|
- R_move_abs(xp, yp);
|
|
|
+ D_move_abs(xp, yp);
|
|
|
else
|
|
|
- R_cont_abs(xp, yp);
|
|
|
+ D_cont_abs(xp, yp);
|
|
|
}
|
|
|
+ D_end();
|
|
|
+ D_stroke();
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
@@ -118,27 +99,61 @@ void D_symbol(const SYMBOL * Symb, double x0, double y0,
|
|
|
if (part->color.color == S_COL_NONE)
|
|
|
break;
|
|
|
else if (part->color.color == S_COL_DEFAULT &&
|
|
|
- line_color->a != RGBA_COLOR_NONE)
|
|
|
- R_RGB_color(line_color->r, line_color->g, line_color->b);
|
|
|
+ string_color->a != RGBA_COLOR_NONE)
|
|
|
+ D_RGB_color(string_color->r, string_color->g, string_color->b);
|
|
|
else
|
|
|
- R_RGB_color(part->color.r, part->color.g, part->color.b);
|
|
|
+ D_RGB_color(part->color.r, part->color.g, part->color.b);
|
|
|
|
|
|
chain = part->chain[0];
|
|
|
|
|
|
+ D_begin();
|
|
|
for (j = 0; j < chain->scount; j++) {
|
|
|
- xp = x0 + chain->sx[j];
|
|
|
- yp = y0 - chain->sy[j];
|
|
|
+ xp = x0 + sx * chain->sx[j];
|
|
|
+ yp = y0 - sy * chain->sy[j];
|
|
|
if (j == 0)
|
|
|
- R_move_abs(xp, yp);
|
|
|
+ D_move_abs(xp, yp);
|
|
|
else
|
|
|
- R_cont_abs(xp, yp);
|
|
|
+ D_cont_abs(xp, yp);
|
|
|
}
|
|
|
+ D_end();
|
|
|
+ D_stroke();
|
|
|
break;
|
|
|
|
|
|
} /* switch */
|
|
|
} /* for loop */
|
|
|
}
|
|
|
|
|
|
+/*!
|
|
|
+ * \brief draw a symbol at pixel coordinates
|
|
|
+ *
|
|
|
+ * Draws a symbol (one of $GISBASE/etc/symbols/) to the active display.
|
|
|
+ * The starting x0,y0 coordinate corresponds to the center of the icon.
|
|
|
+ * The symbol must be pre-processed with S_stroke() before being sent
|
|
|
+ * to this function.
|
|
|
+ *
|
|
|
+ * example:
|
|
|
+ * #include <grass/display.h>
|
|
|
+ * #include <grass/symbol.h>
|
|
|
+ * SYMBOL *Symb;
|
|
|
+ * Symb = S_read( symbol_name );
|
|
|
+ * S_stroke( Symb, size, rotation, tolerance );
|
|
|
+ * D_symbol( Symb, x0, y0, line_color, fill_color );
|
|
|
+ *
|
|
|
+ * \param Symb The symbol name (e.g. basic/circle)
|
|
|
+ * \param x0 The starting x display coordinate (pixel)
|
|
|
+ * \param y0 The starting y display coordinate (pixel)
|
|
|
+ * \param line_color Outline color
|
|
|
+ * \param fill_color Fill color
|
|
|
+ * \return void
|
|
|
+ */
|
|
|
+
|
|
|
+void D_symbol(const SYMBOL *Symb, double x0, double y0,
|
|
|
+ const RGBA_Color *line_color,
|
|
|
+ const RGBA_Color *fill_color)
|
|
|
+{
|
|
|
+ symbol(Symb, x0, y0, fill_color, line_color, line_color);
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
/*!
|
|
|
* \brief draw a symbol at pixel coordinates (alternate)
|
|
@@ -156,102 +171,9 @@ void D_symbol(const SYMBOL * Symb, double x0, double y0,
|
|
|
* \param secondary_color Secondary draw color
|
|
|
* \return void
|
|
|
*/
|
|
|
-void D_symbol2(const SYMBOL * Symb, double x0, double y0,
|
|
|
- const RGBA_Color * primary_color,
|
|
|
- const RGBA_Color * secondary_color)
|
|
|
+void D_symbol2(const SYMBOL *Symb, double x0, double y0,
|
|
|
+ const RGBA_Color *primary_color,
|
|
|
+ const RGBA_Color *secondary_color)
|
|
|
{
|
|
|
- /* TODO: merge duplicate D_symbol() code into common lib fns */
|
|
|
- int i, j, k;
|
|
|
- const SYMBPART *part;
|
|
|
- const SYMBCHAIN *chain;
|
|
|
- double xp, yp;
|
|
|
- double *x, *y;
|
|
|
-
|
|
|
-
|
|
|
- G_debug(2, "D_symbol(): %d parts", Symb->count);
|
|
|
-
|
|
|
- for (i = 0; i < Symb->count; i++) {
|
|
|
- part = Symb->part[i];
|
|
|
-
|
|
|
- switch (part->type) {
|
|
|
-
|
|
|
- case S_POLYGON:
|
|
|
- /* draw background fills */
|
|
|
- if ((part->fcolor.color == S_COL_DEFAULT &&
|
|
|
- primary_color->a != RGBA_COLOR_NONE) ||
|
|
|
- part->fcolor.color == S_COL_DEFINED) {
|
|
|
- if (part->fcolor.color == S_COL_DEFAULT)
|
|
|
- R_RGB_color(primary_color->r, primary_color->g,
|
|
|
- primary_color->b);
|
|
|
- else
|
|
|
- R_RGB_color(part->fcolor.r, part->fcolor.g,
|
|
|
- part->fcolor.b);
|
|
|
-
|
|
|
- for (j = 0; j < part->count; j++) { /* for each component polygon */
|
|
|
- chain = part->chain[j];
|
|
|
-
|
|
|
- x = G_malloc(sizeof(double) * chain->scount);
|
|
|
- y = G_malloc(sizeof(double) * chain->scount);
|
|
|
-
|
|
|
- for (k = 0; k < chain->scount; k++) {
|
|
|
- x[k] = x0 + chain->sx[k];
|
|
|
- y[k] = y0 - chain->sy[k];
|
|
|
- }
|
|
|
- R_polygon_abs(x, y, chain->scount);
|
|
|
-
|
|
|
- G_free(x);
|
|
|
- G_free(y);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- /* again, to draw the lines */
|
|
|
- if ((part->color.color == S_COL_DEFAULT &&
|
|
|
- secondary_color->a != RGBA_COLOR_NONE) ||
|
|
|
- part->color.color == S_COL_DEFINED) {
|
|
|
- if (part->color.color == S_COL_DEFAULT) {
|
|
|
- R_RGB_color(secondary_color->r, secondary_color->g,
|
|
|
- secondary_color->b);
|
|
|
- }
|
|
|
- else
|
|
|
- R_RGB_color(part->color.r, part->color.g, part->color.b);
|
|
|
-
|
|
|
- for (j = 0; j < part->count; j++) {
|
|
|
- chain = part->chain[j];
|
|
|
-
|
|
|
- for (k = 0; k < chain->scount; k++) {
|
|
|
- xp = x0 + chain->sx[k];
|
|
|
- yp = y0 - chain->sy[k];
|
|
|
- if (k == 0)
|
|
|
- R_move_abs(xp, yp);
|
|
|
- else
|
|
|
- R_cont_abs(xp, yp);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case S_STRING:
|
|
|
- if (part->color.color == S_COL_NONE)
|
|
|
- break;
|
|
|
- else if (part->color.color == S_COL_DEFAULT &&
|
|
|
- primary_color->a != RGBA_COLOR_NONE)
|
|
|
- R_RGB_color(primary_color->r, primary_color->g,
|
|
|
- primary_color->b);
|
|
|
- else
|
|
|
- R_RGB_color(part->color.r, part->color.g, part->color.b);
|
|
|
-
|
|
|
- chain = part->chain[0];
|
|
|
-
|
|
|
- for (j = 0; j < chain->scount; j++) {
|
|
|
- xp = x0 + chain->sx[j];
|
|
|
- yp = y0 - chain->sy[j];
|
|
|
- if (j == 0)
|
|
|
- R_move_abs(xp, yp);
|
|
|
- else
|
|
|
- R_cont_abs(xp, yp);
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- } /* switch */
|
|
|
- } /* for loop */
|
|
|
+ symbol(Symb, x0, y0, primary_color, secondary_color, primary_color);
|
|
|
}
|