From: <hez...@us...> - 2010-09-11 04:44:12
|
Revision: 11166 http://plplot.svn.sourceforge.net/plplot/?rev=11166&view=rev Author: hezekiahcarty Date: 2010-09-11 04:44:06 +0000 (Sat, 11 Sep 2010) Log Message: ----------- Actually commit pllegend.c Added Paths: ----------- trunk/src/pllegend.c Added: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c (rev 0) +++ trunk/src/pllegend.c 2010-09-11 04:44:06 UTC (rev 11166) @@ -0,0 +1,145 @@ +/* pllegend() + * + * Author: Hezekiah Carty 2010 + * + * Copyright (C) 2010 Hezekiah M. Carty + * + * This file is part of PLplot. + * + * PLplot is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Library Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * PLplot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with PLplot; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "plplotP.h" + +PLFLT get_character_height() { + // Character height in mm + PLFLT default_mm, char_height_mm; + // Normalized viewport limits + PLFLT vxmin, vxmax, vymin, vymax; + PLFLT vy; + // Size of subpage in mm + PLFLT mxmin, mxmax, mymin, mymax; + PLFLT mm_y; + // World height in mm + PLFLT world_height_mm; + // Normalized character height + PLFLT char_height_norm; + // Window dimensions + PLFLT wxmin, wxmax, wymin, wymax; + PLFLT world_y; + + plgchr(&default_mm, &char_height_mm); + plgvpd(&vxmin, &vxmax, &vymin, &vymax); + vy = vymax - vymin; + + plgspa(&mxmin, &mxmax, &mymin, &mymax); + mm_y = mymax - mymin; + + world_height_mm = mm_y * vy; + + // Character height (mm) / World height (mm) = Normalized char height + char_height_norm = char_height_mm / world_height_mm; + + // Normalized character height * World height (world) = + // Character height (world) + plgvpw(&wxmin, &wxmax, &wymin, &wymax); + world_y = wymax - wymin; + + return(char_height_norm * world_y); +} + +#define normalized_to_world_x(nx) ((xmin) + (nx) * ((xmax) - (xmin))) +#define normalized_to_world_y(ny) ((ymin) + (ny) * ((ymax) - (ymin))) + +// pllegend - Draw a legend using lines or points +// line_length: How long should the lines be/how far apart are the points +// x, y: Normalized position of the legend in the plot window +// n: Number of legend entries +// text_colors: Color map 0 indices of the colors to use for label text +// names: Name/label for each legend entry +// colors: Line/point color for each legend entry +// symbols: Symbol to draw for each legend entry (NULL for lines) +void c_pllegend(PLFLT line_length, PLFLT x, PLFLT y, PLINT n, PLINT *text_colors, char **names, PLINT *colors, PLINT *symbols) { + // Active indexed drawing color + PLINT old_col0; + // Viewport world-coordinate limits + PLFLT xmin, xmax, ymin, ymax; + // Legend position + PLFLT line_x, line_x_end, line_x_world, line_x_end_world; + PLFLT line_y, line_y_world; + PLFLT text_x, text_y, text_x_world, text_y_world; + // Character height (world coordinates) + PLFLT character_height; + // y-position of the current legend entry + PLFLT ty; + // Positions of the legend entries + PLFLT xs[2], ys[2]; + PLINT i; + + old_col0 = plsc->icol0; + + plgvpw(&xmin, &xmax, &ymin, &ymax); + + // World coordinates for legend lines + line_x = x; + line_y = y; + line_x_end = line_x + 0.1; + line_x_world = normalized_to_world_x(line_x); + line_y_world = normalized_to_world_y(line_y); + line_x_end_world = normalized_to_world_x(line_x_end); + + // Get world-coordinate positions of the start of the legend text + text_x = line_x_end + 0.01; + text_y = line_y; + text_x_world = normalized_to_world_x(text_x); + text_y_world = normalized_to_world_y(text_y); + + character_height = get_character_height(); + // Starting y position for legend entries + ty = text_y_world - character_height; + + xs[0] = line_x_world; + xs[1] = line_x_end_world; + ys[0] = ty; + ys[1] = ty; + + // Draw each legend entry + for (i = 0; i < n; i++) { + // Line for the legend + plcol0(colors[i]); + if (symbols == NULL) { + // Draw lines + plline(2, xs, ys); + } + else { + // Draw symbols + plpoin(2, xs, ys, symbols[i]); + } + + // Label/name for the legend + plcol0(text_colors[i]); + plptex(text_x_world, ty, 0.0, 0.0, 0.0, names[i]); + // Move to the next position + ty = ty - (1.5 * character_height); + ys[0] = ty; + ys[1] = ty; + } + + // Restore the previously active drawing color + plcol0(old_col0); + + return; +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-09-11 18:56:28
|
Revision: 11168 http://plplot.svn.sourceforge.net/plplot/?rev=11168&view=rev Author: airwin Date: 2010-09-11 18:56:21 +0000 (Sat, 11 Sep 2010) Log Message: ----------- Adjust ends of lines of symbols in the legend so they line up roughly with ends of lines in the legend. Use line_length specified by user rather than 0.1. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-09-11 16:32:28 UTC (rev 11167) +++ trunk/src/pllegend.c 2010-09-11 18:56:21 UTC (rev 11168) @@ -23,7 +23,7 @@ #include "plplotP.h" -PLFLT get_character_height() { +PLFLT get_character_or_symbol_height(PLINT ifcharacter) { // Character height in mm PLFLT default_mm, char_height_mm; // Normalized viewport limits @@ -40,7 +40,12 @@ PLFLT wxmin, wxmax, wymin, wymax; PLFLT world_y; - plgchr(&default_mm, &char_height_mm); + if(ifcharacter) { + plgchr(&default_mm, &char_height_mm); + } else { + default_mm = plsc->symdef; + char_height_mm = plsc->symht; + } plgvpd(&vxmin, &vxmax, &vymin, &vymax); vy = vymax - vymin; @@ -83,7 +88,7 @@ PLFLT line_y, line_y_world; PLFLT text_x, text_y, text_x_world, text_y_world; // Character height (world coordinates) - PLFLT character_height; + PLFLT character_height, character_width, symbol_width; // y-position of the current legend entry PLFLT ty; // Positions of the legend entries @@ -102,18 +107,31 @@ // World coordinates for legend lines line_x = x; line_y = y; - line_x_end = line_x + 0.1; + line_x_end = line_x + line_length; line_x_world = normalized_to_world_x(line_x); line_y_world = normalized_to_world_y(line_y); line_x_end_world = normalized_to_world_x(line_x_end); + // Get character height and width in world coordinates + character_height = get_character_or_symbol_height(1); + character_width = character_height*fabs((xmax-xmin)/(ymax-ymin)); + // Get symbol width in world coordinates if symbols are plotted to + // adjust ends of line of symbols. + if( ifline) { + symbol_width = 0.; + } else { + // AWI, no idea why must use 0.5 factor to get ends of symbol lines + // to line up approximately correctly with plotted legend lines. + // Factor should be unity. + symbol_width = 0.5*get_character_or_symbol_height(0)* + fabs((xmax-xmin)/(ymax-ymin)); + } // Get world-coordinate positions of the start of the legend text - text_x = line_x_end + 0.01; + text_x = line_x_end; text_y = line_y; - text_x_world = normalized_to_world_x(text_x); + text_x_world = normalized_to_world_x(text_x) + character_width; text_y_world = normalized_to_world_y(text_y); - character_height = get_character_height(); // Starting y position for legend entries ty = text_y_world - character_height; @@ -123,9 +141,9 @@ plexit( "pllegend: Insufficient memory" ); } - dxs = (line_x_end_world - line_x_world)/(double) (nsymbols-1); + dxs = (line_x_end_world - line_x_world - symbol_width)/(double) (nsymbols-1); for (j=0; j<nsymbols; j++) { - xs[j] = line_x_world + dxs*(double) j; + xs[j] = line_x_world + 0.5*symbol_width + dxs*(double) j; ys[j] = ty; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <arj...@us...> - 2010-09-14 06:55:03
|
Revision: 11180 http://plplot.svn.sourceforge.net/plplot/?rev=11180&view=rev Author: arjenmarkus Date: 2010-09-14 06:54:57 +0000 (Tue, 14 Sep 2010) Log Message: ----------- Make the function get_character_or_symbol_height a static function - it is only used in the pllegend.c source file Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-09-14 04:47:14 UTC (rev 11179) +++ trunk/src/pllegend.c 2010-09-14 06:54:57 UTC (rev 11180) @@ -1,194 +1,194 @@ -/* pllegend() - * - * Author: Hezekiah Carty 2010 - * - * Copyright (C) 2010 Hezekiah M. Carty - * - * This file is part of PLplot. - * - * PLplot is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Library Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * PLplot is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with PLplot; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "plplotP.h" - -PLFLT get_character_or_symbol_height( PLINT ifcharacter ) -{ - // Character height in mm - PLFLT default_mm, char_height_mm; - // Normalized viewport limits - PLFLT vxmin, vxmax, vymin, vymax; - PLFLT vy; - // Size of subpage in mm - PLFLT mxmin, mxmax, mymin, mymax; - PLFLT mm_y; - // World height in mm - PLFLT world_height_mm; - // Normalized character height - PLFLT char_height_norm; - // Window dimensions - PLFLT wxmin, wxmax, wymin, wymax; - PLFLT world_y; - - if ( ifcharacter ) - { - plgchr( &default_mm, &char_height_mm ); - } - else - { - default_mm = plsc->symdef; - char_height_mm = plsc->symht; - } - plgvpd( &vxmin, &vxmax, &vymin, &vymax ); - vy = vymax - vymin; - - plgspa( &mxmin, &mxmax, &mymin, &mymax ); - mm_y = mymax - mymin; - - world_height_mm = mm_y * vy; - - // Character height (mm) / World height (mm) = Normalized char height - char_height_norm = char_height_mm / world_height_mm; - - // Normalized character height * World height (world) = - // Character height (world) - plgvpw( &wxmin, &wxmax, &wymin, &wymax ); - world_y = wymax - wymin; - - return ( char_height_norm * world_y ); -} - -#define normalized_to_world_x( nx ) ( ( xmin ) + ( nx ) * ( ( xmax ) - ( xmin ) ) ) -#define normalized_to_world_y( ny ) ( ( ymin ) + ( ny ) * ( ( ymax ) - ( ymin ) ) ) - -// pllegend - Draw a legend using lines (nsymbols <=1 or symbols == NULL) or -// points/symbols. -// line_length: extent of lines or extent of nsymbols points/symbols -// x, y: Normalized position of the legend in the plot window -// n: Number of legend entries -// text_colors: Color map 0 indices of the colors to use for label text -// names: Name/label for each legend entry -// colors: Line/point color for each legend entry -// nsymbols: number of points/symbols to be drawn for each line_length -// symbols: Symbol to draw for each legend entry. -void c_pllegend( PLFLT line_length, PLFLT x, PLFLT y, PLINT n, PLINT *text_colors, char **names, PLINT *colors, PLINT nsymbols, PLINT *symbols ) -{ - // Active indexed drawing color - PLINT old_col0; - // Viewport world-coordinate limits - PLFLT xmin, xmax, ymin, ymax; - // Legend position - PLFLT line_x, line_x_end, line_x_world, line_x_end_world; - PLFLT line_y, line_y_world; - PLFLT text_x, text_y, text_x_world, text_y_world; - // Character height (world coordinates) - PLFLT character_height, character_width, symbol_width; - // y-position of the current legend entry - PLFLT ty; - // Positions of the legend entries - PLFLT dxs, *xs, *ys; - PLINT i, j; - // ifline is true if lines are to be drawn, false if points/symbols are - // to be drawn. - int ifline = nsymbols <= 1 || symbols == NULL; - if ( symbols == NULL ) - nsymbols = 2; - nsymbols = MAX( 2, nsymbols ); - - old_col0 = plsc->icol0; - - plgvpw( &xmin, &xmax, &ymin, &ymax ); - - // World coordinates for legend lines - line_x = x; - line_y = y; - line_x_end = line_x + line_length; - line_x_world = normalized_to_world_x( line_x ); - line_y_world = normalized_to_world_y( line_y ); - line_x_end_world = normalized_to_world_x( line_x_end ); - - // Get character height and width in world coordinates - character_height = get_character_or_symbol_height( 1 ); - character_width = character_height * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); - // Get symbol width in world coordinates if symbols are plotted to - // adjust ends of line of symbols. - if ( ifline ) - { - symbol_width = 0.; - } - else - { - // AWI, no idea why must use 0.5 factor to get ends of symbol lines - // to line up approximately correctly with plotted legend lines. - // Factor should be unity. - symbol_width = 0.5 * get_character_or_symbol_height( 0 ) * - fabs( ( xmax - xmin ) / ( ymax - ymin ) ); - } - // Get world-coordinate positions of the start of the legend text - text_x = line_x_end; - text_y = line_y; - text_x_world = normalized_to_world_x( text_x ) + character_width; - text_y_world = normalized_to_world_y( text_y ); - - // Starting y position for legend entries - ty = text_y_world - character_height; - - if ( ( ( xs = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) || - ( ( ys = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) ) - { - plexit( "pllegend: Insufficient memory" ); - } - - dxs = ( line_x_end_world - line_x_world - symbol_width ) / (double) ( nsymbols - 1 ); - for ( j = 0; j < nsymbols; j++ ) - { - xs[j] = line_x_world + 0.5 * symbol_width + dxs * (double) j; - ys[j] = ty; - } - - // Draw each legend entry - for ( i = 0; i < n; i++ ) - { - // Line for the legend - plcol0( colors[i] ); - if ( ifline ) - { - // Draw lines - plline( nsymbols, xs, ys ); - } - else - { - // Draw symbols - plpoin( nsymbols, xs, ys, symbols[i] ); - } - - // Label/name for the legend - plcol0( text_colors[i] ); - plptex( text_x_world, ty, 0.0, 0.0, 0.0, names[i] ); - // Move to the next position - ty = ty - ( 1.5 * character_height ); - for ( j = 0; j < nsymbols; j++ ) - { - ys[j] = ty; - } - } - free( xs ); - free( ys ); - - // Restore the previously active drawing color - plcol0( old_col0 ); - - return; -} - +/* pllegend() + * + * Author: Hezekiah Carty 2010 + * + * Copyright (C) 2010 Hezekiah M. Carty + * + * This file is part of PLplot. + * + * PLplot is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Library Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * PLplot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with PLplot; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "plplotP.h" + +static PLFLT get_character_or_symbol_height( PLINT ifcharacter ) +{ + // Character height in mm + PLFLT default_mm, char_height_mm; + // Normalized viewport limits + PLFLT vxmin, vxmax, vymin, vymax; + PLFLT vy; + // Size of subpage in mm + PLFLT mxmin, mxmax, mymin, mymax; + PLFLT mm_y; + // World height in mm + PLFLT world_height_mm; + // Normalized character height + PLFLT char_height_norm; + // Window dimensions + PLFLT wxmin, wxmax, wymin, wymax; + PLFLT world_y; + + if ( ifcharacter ) + { + plgchr( &default_mm, &char_height_mm ); + } + else + { + default_mm = plsc->symdef; + char_height_mm = plsc->symht; + } + plgvpd( &vxmin, &vxmax, &vymin, &vymax ); + vy = vymax - vymin; + + plgspa( &mxmin, &mxmax, &mymin, &mymax ); + mm_y = mymax - mymin; + + world_height_mm = mm_y * vy; + + // Character height (mm) / World height (mm) = Normalized char height + char_height_norm = char_height_mm / world_height_mm; + + // Normalized character height * World height (world) = + // Character height (world) + plgvpw( &wxmin, &wxmax, &wymin, &wymax ); + world_y = wymax - wymin; + + return ( char_height_norm * world_y ); +} + +#define normalized_to_world_x( nx ) ( ( xmin ) + ( nx ) * ( ( xmax ) - ( xmin ) ) ) +#define normalized_to_world_y( ny ) ( ( ymin ) + ( ny ) * ( ( ymax ) - ( ymin ) ) ) + +// pllegend - Draw a legend using lines (nsymbols <=1 or symbols == NULL) or +// points/symbols. +// line_length: extent of lines or extent of nsymbols points/symbols +// x, y: Normalized position of the legend in the plot window +// n: Number of legend entries +// text_colors: Color map 0 indices of the colors to use for label text +// names: Name/label for each legend entry +// colors: Line/point color for each legend entry +// nsymbols: number of points/symbols to be drawn for each line_length +// symbols: Symbol to draw for each legend entry. +void c_pllegend( PLFLT line_length, PLFLT x, PLFLT y, PLINT n, PLINT *text_colors, char **names, PLINT *colors, PLINT nsymbols, PLINT *symbols ) +{ + // Active indexed drawing color + PLINT old_col0; + // Viewport world-coordinate limits + PLFLT xmin, xmax, ymin, ymax; + // Legend position + PLFLT line_x, line_x_end, line_x_world, line_x_end_world; + PLFLT line_y, line_y_world; + PLFLT text_x, text_y, text_x_world, text_y_world; + // Character height (world coordinates) + PLFLT character_height, character_width, symbol_width; + // y-position of the current legend entry + PLFLT ty; + // Positions of the legend entries + PLFLT dxs, *xs, *ys; + PLINT i, j; + // ifline is true if lines are to be drawn, false if points/symbols are + // to be drawn. + int ifline = nsymbols <= 1 || symbols == NULL; + if ( symbols == NULL ) + nsymbols = 2; + nsymbols = MAX( 2, nsymbols ); + + old_col0 = plsc->icol0; + + plgvpw( &xmin, &xmax, &ymin, &ymax ); + + // World coordinates for legend lines + line_x = x; + line_y = y; + line_x_end = line_x + line_length; + line_x_world = normalized_to_world_x( line_x ); + line_y_world = normalized_to_world_y( line_y ); + line_x_end_world = normalized_to_world_x( line_x_end ); + + // Get character height and width in world coordinates + character_height = get_character_or_symbol_height( 1 ); + character_width = character_height * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); + // Get symbol width in world coordinates if symbols are plotted to + // adjust ends of line of symbols. + if ( ifline ) + { + symbol_width = 0.; + } + else + { + // AWI, no idea why must use 0.5 factor to get ends of symbol lines + // to line up approximately correctly with plotted legend lines. + // Factor should be unity. + symbol_width = 0.5 * get_character_or_symbol_height( 0 ) * + fabs( ( xmax - xmin ) / ( ymax - ymin ) ); + } + // Get world-coordinate positions of the start of the legend text + text_x = line_x_end; + text_y = line_y; + text_x_world = normalized_to_world_x( text_x ) + character_width; + text_y_world = normalized_to_world_y( text_y ); + + // Starting y position for legend entries + ty = text_y_world - character_height; + + if ( ( ( xs = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) || + ( ( ys = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) ) + { + plexit( "pllegend: Insufficient memory" ); + } + + dxs = ( line_x_end_world - line_x_world - symbol_width ) / (double) ( nsymbols - 1 ); + for ( j = 0; j < nsymbols; j++ ) + { + xs[j] = line_x_world + 0.5 * symbol_width + dxs * (double) j; + ys[j] = ty; + } + + // Draw each legend entry + for ( i = 0; i < n; i++ ) + { + // Line for the legend + plcol0( colors[i] ); + if ( ifline ) + { + // Draw lines + plline( nsymbols, xs, ys ); + } + else + { + // Draw symbols + plpoin( nsymbols, xs, ys, symbols[i] ); + } + + // Label/name for the legend + plcol0( text_colors[i] ); + plptex( text_x_world, ty, 0.0, 0.0, 0.0, names[i] ); + // Move to the next position + ty = ty - ( 1.5 * character_height ); + for ( j = 0; j < nsymbols; j++ ) + { + ys[j] = ty; + } + } + free( xs ); + free( ys ); + + // Restore the previously active drawing color + plcol0( old_col0 ); + + return; +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-09-14 16:16:28
|
Revision: 11181 http://plplot.svn.sourceforge.net/plplot/?rev=11181&view=rev Author: airwin Date: 2010-09-14 16:16:21 +0000 (Tue, 14 Sep 2010) Log Message: ----------- Set correct properties for this source file. In particular svn:eol-style is set to native which affects all the line endings. Modified Paths: -------------- trunk/src/pllegend.c Property Changed: ---------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-09-14 06:54:57 UTC (rev 11180) +++ trunk/src/pllegend.c 2010-09-14 16:16:21 UTC (rev 11181) @@ -1,194 +1,194 @@ -/* pllegend() - * - * Author: Hezekiah Carty 2010 - * - * Copyright (C) 2010 Hezekiah M. Carty - * - * This file is part of PLplot. - * - * PLplot is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Library Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * PLplot is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with PLplot; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "plplotP.h" - -static PLFLT get_character_or_symbol_height( PLINT ifcharacter ) -{ - // Character height in mm - PLFLT default_mm, char_height_mm; - // Normalized viewport limits - PLFLT vxmin, vxmax, vymin, vymax; - PLFLT vy; - // Size of subpage in mm - PLFLT mxmin, mxmax, mymin, mymax; - PLFLT mm_y; - // World height in mm - PLFLT world_height_mm; - // Normalized character height - PLFLT char_height_norm; - // Window dimensions - PLFLT wxmin, wxmax, wymin, wymax; - PLFLT world_y; - - if ( ifcharacter ) - { - plgchr( &default_mm, &char_height_mm ); - } - else - { - default_mm = plsc->symdef; - char_height_mm = plsc->symht; - } - plgvpd( &vxmin, &vxmax, &vymin, &vymax ); - vy = vymax - vymin; - - plgspa( &mxmin, &mxmax, &mymin, &mymax ); - mm_y = mymax - mymin; - - world_height_mm = mm_y * vy; - - // Character height (mm) / World height (mm) = Normalized char height - char_height_norm = char_height_mm / world_height_mm; - - // Normalized character height * World height (world) = - // Character height (world) - plgvpw( &wxmin, &wxmax, &wymin, &wymax ); - world_y = wymax - wymin; - - return ( char_height_norm * world_y ); -} - -#define normalized_to_world_x( nx ) ( ( xmin ) + ( nx ) * ( ( xmax ) - ( xmin ) ) ) -#define normalized_to_world_y( ny ) ( ( ymin ) + ( ny ) * ( ( ymax ) - ( ymin ) ) ) - -// pllegend - Draw a legend using lines (nsymbols <=1 or symbols == NULL) or -// points/symbols. -// line_length: extent of lines or extent of nsymbols points/symbols -// x, y: Normalized position of the legend in the plot window -// n: Number of legend entries -// text_colors: Color map 0 indices of the colors to use for label text -// names: Name/label for each legend entry -// colors: Line/point color for each legend entry -// nsymbols: number of points/symbols to be drawn for each line_length -// symbols: Symbol to draw for each legend entry. -void c_pllegend( PLFLT line_length, PLFLT x, PLFLT y, PLINT n, PLINT *text_colors, char **names, PLINT *colors, PLINT nsymbols, PLINT *symbols ) -{ - // Active indexed drawing color - PLINT old_col0; - // Viewport world-coordinate limits - PLFLT xmin, xmax, ymin, ymax; - // Legend position - PLFLT line_x, line_x_end, line_x_world, line_x_end_world; - PLFLT line_y, line_y_world; - PLFLT text_x, text_y, text_x_world, text_y_world; - // Character height (world coordinates) - PLFLT character_height, character_width, symbol_width; - // y-position of the current legend entry - PLFLT ty; - // Positions of the legend entries - PLFLT dxs, *xs, *ys; - PLINT i, j; - // ifline is true if lines are to be drawn, false if points/symbols are - // to be drawn. - int ifline = nsymbols <= 1 || symbols == NULL; - if ( symbols == NULL ) - nsymbols = 2; - nsymbols = MAX( 2, nsymbols ); - - old_col0 = plsc->icol0; - - plgvpw( &xmin, &xmax, &ymin, &ymax ); - - // World coordinates for legend lines - line_x = x; - line_y = y; - line_x_end = line_x + line_length; - line_x_world = normalized_to_world_x( line_x ); - line_y_world = normalized_to_world_y( line_y ); - line_x_end_world = normalized_to_world_x( line_x_end ); - - // Get character height and width in world coordinates - character_height = get_character_or_symbol_height( 1 ); - character_width = character_height * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); - // Get symbol width in world coordinates if symbols are plotted to - // adjust ends of line of symbols. - if ( ifline ) - { - symbol_width = 0.; - } - else - { - // AWI, no idea why must use 0.5 factor to get ends of symbol lines - // to line up approximately correctly with plotted legend lines. - // Factor should be unity. - symbol_width = 0.5 * get_character_or_symbol_height( 0 ) * - fabs( ( xmax - xmin ) / ( ymax - ymin ) ); - } - // Get world-coordinate positions of the start of the legend text - text_x = line_x_end; - text_y = line_y; - text_x_world = normalized_to_world_x( text_x ) + character_width; - text_y_world = normalized_to_world_y( text_y ); - - // Starting y position for legend entries - ty = text_y_world - character_height; - - if ( ( ( xs = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) || - ( ( ys = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) ) - { - plexit( "pllegend: Insufficient memory" ); - } - - dxs = ( line_x_end_world - line_x_world - symbol_width ) / (double) ( nsymbols - 1 ); - for ( j = 0; j < nsymbols; j++ ) - { - xs[j] = line_x_world + 0.5 * symbol_width + dxs * (double) j; - ys[j] = ty; - } - - // Draw each legend entry - for ( i = 0; i < n; i++ ) - { - // Line for the legend - plcol0( colors[i] ); - if ( ifline ) - { - // Draw lines - plline( nsymbols, xs, ys ); - } - else - { - // Draw symbols - plpoin( nsymbols, xs, ys, symbols[i] ); - } - - // Label/name for the legend - plcol0( text_colors[i] ); - plptex( text_x_world, ty, 0.0, 0.0, 0.0, names[i] ); - // Move to the next position - ty = ty - ( 1.5 * character_height ); - for ( j = 0; j < nsymbols; j++ ) - { - ys[j] = ty; - } - } - free( xs ); - free( ys ); - - // Restore the previously active drawing color - plcol0( old_col0 ); - - return; -} - +/* pllegend() + * + * Author: Hezekiah Carty 2010 + * + * Copyright (C) 2010 Hezekiah M. Carty + * + * This file is part of PLplot. + * + * PLplot is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Library Public License as published + * by the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * PLplot is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with PLplot; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "plplotP.h" + +static PLFLT get_character_or_symbol_height( PLINT ifcharacter ) +{ + // Character height in mm + PLFLT default_mm, char_height_mm; + // Normalized viewport limits + PLFLT vxmin, vxmax, vymin, vymax; + PLFLT vy; + // Size of subpage in mm + PLFLT mxmin, mxmax, mymin, mymax; + PLFLT mm_y; + // World height in mm + PLFLT world_height_mm; + // Normalized character height + PLFLT char_height_norm; + // Window dimensions + PLFLT wxmin, wxmax, wymin, wymax; + PLFLT world_y; + + if ( ifcharacter ) + { + plgchr( &default_mm, &char_height_mm ); + } + else + { + default_mm = plsc->symdef; + char_height_mm = plsc->symht; + } + plgvpd( &vxmin, &vxmax, &vymin, &vymax ); + vy = vymax - vymin; + + plgspa( &mxmin, &mxmax, &mymin, &mymax ); + mm_y = mymax - mymin; + + world_height_mm = mm_y * vy; + + // Character height (mm) / World height (mm) = Normalized char height + char_height_norm = char_height_mm / world_height_mm; + + // Normalized character height * World height (world) = + // Character height (world) + plgvpw( &wxmin, &wxmax, &wymin, &wymax ); + world_y = wymax - wymin; + + return ( char_height_norm * world_y ); +} + +#define normalized_to_world_x( nx ) ( ( xmin ) + ( nx ) * ( ( xmax ) - ( xmin ) ) ) +#define normalized_to_world_y( ny ) ( ( ymin ) + ( ny ) * ( ( ymax ) - ( ymin ) ) ) + +// pllegend - Draw a legend using lines (nsymbols <=1 or symbols == NULL) or +// points/symbols. +// line_length: extent of lines or extent of nsymbols points/symbols +// x, y: Normalized position of the legend in the plot window +// n: Number of legend entries +// text_colors: Color map 0 indices of the colors to use for label text +// names: Name/label for each legend entry +// colors: Line/point color for each legend entry +// nsymbols: number of points/symbols to be drawn for each line_length +// symbols: Symbol to draw for each legend entry. +void c_pllegend( PLFLT line_length, PLFLT x, PLFLT y, PLINT n, PLINT *text_colors, char **names, PLINT *colors, PLINT nsymbols, PLINT *symbols ) +{ + // Active indexed drawing color + PLINT old_col0; + // Viewport world-coordinate limits + PLFLT xmin, xmax, ymin, ymax; + // Legend position + PLFLT line_x, line_x_end, line_x_world, line_x_end_world; + PLFLT line_y, line_y_world; + PLFLT text_x, text_y, text_x_world, text_y_world; + // Character height (world coordinates) + PLFLT character_height, character_width, symbol_width; + // y-position of the current legend entry + PLFLT ty; + // Positions of the legend entries + PLFLT dxs, *xs, *ys; + PLINT i, j; + // ifline is true if lines are to be drawn, false if points/symbols are + // to be drawn. + int ifline = nsymbols <= 1 || symbols == NULL; + if ( symbols == NULL ) + nsymbols = 2; + nsymbols = MAX( 2, nsymbols ); + + old_col0 = plsc->icol0; + + plgvpw( &xmin, &xmax, &ymin, &ymax ); + + // World coordinates for legend lines + line_x = x; + line_y = y; + line_x_end = line_x + line_length; + line_x_world = normalized_to_world_x( line_x ); + line_y_world = normalized_to_world_y( line_y ); + line_x_end_world = normalized_to_world_x( line_x_end ); + + // Get character height and width in world coordinates + character_height = get_character_or_symbol_height( 1 ); + character_width = character_height * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); + // Get symbol width in world coordinates if symbols are plotted to + // adjust ends of line of symbols. + if ( ifline ) + { + symbol_width = 0.; + } + else + { + // AWI, no idea why must use 0.5 factor to get ends of symbol lines + // to line up approximately correctly with plotted legend lines. + // Factor should be unity. + symbol_width = 0.5 * get_character_or_symbol_height( 0 ) * + fabs( ( xmax - xmin ) / ( ymax - ymin ) ); + } + // Get world-coordinate positions of the start of the legend text + text_x = line_x_end; + text_y = line_y; + text_x_world = normalized_to_world_x( text_x ) + character_width; + text_y_world = normalized_to_world_y( text_y ); + + // Starting y position for legend entries + ty = text_y_world - character_height; + + if ( ( ( xs = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) || + ( ( ys = (PLFLT *) malloc( nsymbols * sizeof ( PLFLT ) ) ) == NULL ) ) + { + plexit( "pllegend: Insufficient memory" ); + } + + dxs = ( line_x_end_world - line_x_world - symbol_width ) / (double) ( nsymbols - 1 ); + for ( j = 0; j < nsymbols; j++ ) + { + xs[j] = line_x_world + 0.5 * symbol_width + dxs * (double) j; + ys[j] = ty; + } + + // Draw each legend entry + for ( i = 0; i < n; i++ ) + { + // Line for the legend + plcol0( colors[i] ); + if ( ifline ) + { + // Draw lines + plline( nsymbols, xs, ys ); + } + else + { + // Draw symbols + plpoin( nsymbols, xs, ys, symbols[i] ); + } + + // Label/name for the legend + plcol0( text_colors[i] ); + plptex( text_x_world, ty, 0.0, 0.0, 0.0, names[i] ); + // Move to the next position + ty = ty - ( 1.5 * character_height ); + for ( j = 0; j < nsymbols; j++ ) + { + ys[j] = ty; + } + } + free( xs ); + free( ys ); + + // Restore the previously active drawing color + plcol0( old_col0 ); + + return; +} + Property changes on: trunk/src/pllegend.c ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-09-26 02:24:12
|
Revision: 11218 http://plplot.svn.sourceforge.net/plplot/?rev=11218&view=rev Author: airwin Date: 2010-09-26 02:24:06 +0000 (Sun, 26 Sep 2010) Log Message: ----------- Implement PL_LEGEND_TEXT_LEFT capability. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-09-26 02:23:17 UTC (rev 11217) +++ trunk/src/pllegend.c 2010-09-26 02:24:06 UTC (rev 11218) @@ -155,10 +155,6 @@ text_offset * character_width; text_y_world = normalized_to_world_y( text_y ); - // if (opt & PL_LEGEND_TEXT_LEFT) - { - // - } // Calculate maximum width of text area (first in mm, then converted // to x world coordinates) including text_offset area. for ( i = 0; i < nlegend; i++ ) @@ -196,7 +192,14 @@ plcol0( col0_save ); } - // adjust for border after background is drawn. + if ( opt & PL_LEGEND_TEXT_LEFT ) + { + // text area on left, plot area on right. + text_x_world = plot_x_world; + plot_x_world += text_width; + plot_x_end_world += text_width; + } + // adjust border after background is drawn. plot_x_world += total_width_border; plot_x_end_world += total_width_border; text_x_world += total_width_border; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-09-28 02:39:47
|
Revision: 11224 http://plplot.svn.sourceforge.net/plplot/?rev=11224&view=rev Author: airwin Date: 2010-09-28 02:39:40 +0000 (Tue, 28 Sep 2010) Log Message: ----------- Doxygenization started but not complete. Implement test_justification (which I forgot to implement before). Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-09-27 05:04:27 UTC (rev 11223) +++ trunk/src/pllegend.c 2010-09-28 02:39:40 UTC (rev 11224) @@ -1,27 +1,38 @@ -/* pllegend() - * - * Copyright (C) 2010 Hezekiah M. Carty - * Copyright (C) 2010 Alan W. Irwin - * - * This file is part of PLplot. - * - * PLplot is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Library Public License as published - * by the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * PLplot is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with PLplot; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ +// pllegend() +// +// Copyright (C) 2010 Hezekiah M. Carty +// Copyright (C) 2010 Alan W. Irwin +// +// This file is part of PLplot. +// +// PLplot is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Library Public License as published +// by the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// PLplot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public License +// along with PLplot; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +// +//! @file +//! +//! Legend routines. +//! #include "plplotP.h" +//-------------------------------------------------------------------------- +//! Obtain ratio of world to mm coordinates in both x and y. +//! +//! @param x_world_per_mm : pointer to PLFLT containing x ratio after call +//! @param y_world_per_mm : pointer to PLFLT containing y ratio after call +//! + static void get_world_per_mm( PLFLT *x_world_per_mm, PLFLT *y_world_per_mm ) { // Normalized viewport limits @@ -37,7 +48,15 @@ *y_world_per_mm = ( wymax - wymin ) / ( ( vymax - vymin ) * ( mymax - mymin ) ); } -static PLFLT get_character_or_symbol_height( PLINT ifcharacter ) +//-------------------------------------------------------------------------- +//! Obtain character or symbol height in (y) world coordinates. +//! +//! @param ifcharacter : TRUE obtain character height, FALSE obtain symbol +//! height +//! @return character or symbol height +//! + +static PLFLT get_character_or_symbol_height( PLBOOL ifcharacter ) { // Character height in mm PLFLT default_mm, char_height_mm; @@ -59,11 +78,17 @@ #define normalized_to_world_x( nx ) ( ( xmin ) + ( nx ) * ( ( xmax ) - ( xmin ) ) ) #define normalized_to_world_y( ny ) ( ( ymin ) + ( ny ) * ( ( ymax ) - ( ymin ) ) ) -// pllegend - Draw a legend using lines, symbols, cmap0 colors, or cmap1 -// colors. -// plot_width: width of plotted areas (lines, symbols, or coloured -// area) in legend. (Uses normalized viewport units). -// text_offset: offset of text area from plot area in units of character width. +//-------------------------------------------------------------------------- +//! Plot discrete legend using lines, symbols, cmap0 colors, or cmap1 +//! colors. +//! +//! @param opt : ORed option flags PL_LEGEND_BACKGROUND and +//! PL_LEGEND_TEXT_LEFT controlling overall legend. +//! @param plot_width : width in normalized subpage units of plotted area +//! (lines, symbols, or coloured area) in legend. +//! @param text_offset : offset of text area from plot area in units +//! of character width. +//! // N.B. the total width of the legend is made up of plplot_width + // text_offset (converted to normalized viewport coordinates) + width // of the longest string. The latter quantity is calculated internally @@ -116,7 +141,7 @@ // Saved normalized coordinates of viewport. PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; - PLFLT x_world_per_mm, y_world_per_mm, text_width = 0.; + PLFLT x_world_per_mm, y_world_per_mm, text_width0 = 0., text_width; PLFLT total_width_border, total_width, total_height; PLINT some_lines = 0, some_symbols = 0, some_cmaps = 0; @@ -155,7 +180,7 @@ plot_x_end_world = normalized_to_world_x( plot_x_end ); // Get character height and width in world coordinates - character_height = get_character_or_symbol_height( 1 ); + character_height = get_character_or_symbol_height( TRUE ); character_width = character_height * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); // Get world-coordinate positions of the start of the legend text text_x = plot_x_end; @@ -168,10 +193,11 @@ // to x world coordinates) including text_offset area. for ( i = 0; i < nlegend; i++ ) { - text_width = MAX( text_width, plstrl( text[i] ) ); + text_width0 = MAX( text_width0, plstrl( text[i] ) ); } get_world_per_mm( &x_world_per_mm, &y_world_per_mm ); - text_width = x_world_per_mm * text_width + text_offset * character_width; + text_width0 = x_world_per_mm * text_width0; + text_width = text_width0 + text_offset * character_width; // make small border area where only the background is plotted // for left and right of legend. 0.4 seems to be a reasonable factor // that gives a good-looking result. @@ -239,7 +265,7 @@ // AWI, no idea why must use 0.5 factor to get ends of symbol lines // to line up approximately correctly with plotted legend lines. // Factor should be unity. - symbol_width = 0.5 * get_character_or_symbol_height( 0 ) * + symbol_width = 0.5 * get_character_or_symbol_height( FALSE ) * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); } @@ -252,7 +278,7 @@ ty = ty - dty; // Label/name for the legend plcol0( text_colors[i] ); - plptex( text_x_world, ty, 0.0, 0.0, 0.0, text[i] ); + plptex( text_x_world + text_justification * text_width0, ty, 0.1, 0.0, text_justification, text[i] ); if ( opt_array[i] & PL_LEGEND_CMAP0 ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-10-01 04:24:24
|
Revision: 11235 http://plplot.svn.sourceforge.net/plplot/?rev=11235&view=rev Author: airwin Date: 2010-10-01 04:24:17 +0000 (Fri, 01 Oct 2010) Log Message: ----------- Correctly order doxygen parameter documentation for pllegend. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-10-01 04:13:15 UTC (rev 11234) +++ trunk/src/pllegend.c 2010-10-01 04:24:17 UTC (rev 11235) @@ -144,12 +144,12 @@ //! @param line_styles : array of nlegend line styles (plsty indices) //! (PL_LEGEND_LINE) //! @param line_widths : array of nlegend line widths (PL_LEGEND_LINE) -//! @param symbol_numbers : array of nlegend numbers of symbols to be -//! drawn across the width of the plotted area (PL_LEGEND_SYMBOL) //! @param symbol_colors : array of nlegend symbol colors (cmap0 //! indices) (PL_LEGEND_SYMBOL) //! @param symbol_scales : array of nlegend scale values for the //! symbol height (PL_LEGEND_SYMBOL) +//! @param symbol_numbers : array of nlegend numbers of symbols to be +//! drawn across the width of the plotted area (PL_LEGEND_SYMBOL) //! @param symbols : array of nlegend symbols (plpoin indices) //! (PL_LEGEND_SYMBOL) //! This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-11-05 23:44:29
|
Revision: 11307 http://plplot.svn.sourceforge.net/plplot/?rev=11307&view=rev Author: airwin Date: 2010-11-05 23:44:23 +0000 (Fri, 05 Nov 2010) Log Message: ----------- Rename *world* variables and functions to something more appropriate (typically *subpage*) when the units are relative subpage units. x, y, and plot_width now in relative viewport coordinates. Implement new legend positioning scheme as discussed on list which consists of specifying 16 different standard positions of the legend which are customized by x and y (the offsets in relative viewport coordinates from those positions). ToDo: change x and y sign interpretation depending on which position flag bits are set. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-11-05 23:38:35 UTC (rev 11306) +++ trunk/src/pllegend.c 2010-11-05 23:44:23 UTC (rev 11307) @@ -26,14 +26,199 @@ //! #include "plplotP.h" +// xorigin is the X coordinate of the viewport reference point. +// yorigin is the Y coordinate of the viewport reference point. +// xlegend is the X coordinate of the top-left of the legend box +// relative to the legend box reference point. +// ylegend is the y coordinate of the top-left of the legend box +// relative to the legend box reference point. +// N.B. xorigin, yorigin, xlegend, and ylegend are all expressed +// in normalized external viewport coordinates to be consistent +// with the coordinate system used for x and y. + +static void legend_position( PLINT opt, PLFLT legend_width, PLFLT legend_height, + PLFLT *x_legend_position, PLFLT *y_legend_position ) +{ + PLFLT xorigin, yorigin, xlegend, ylegend; + if ( opt & PL_LEGEND_RIGHT ) + { + xorigin = 1.; + if ( opt & PL_LEGEND_UPPER ) + { + yorigin = 1.; + if ( opt & PL_LEGEND_INSIDE ) + { + xlegend = -legend_width; + ylegend = 0.; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + xlegend = 0.; + ylegend = legend_height; + } + else + { + plexit( "legend_position: internal logic error 1" ); + } + } + else if ( !( opt & PL_LEGEND_UPPER ) && !( opt & PL_LEGEND_LOWER ) ) + { + yorigin = 0.5; + ylegend = 0.5 * legend_height; + if ( opt & PL_LEGEND_INSIDE ) + { + xlegend = -legend_width; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + xlegend = 0.; + } + else + { + plexit( "legend_position: internal logic error 2" ); + } + } + else if ( opt & PL_LEGEND_LOWER ) + { + yorigin = 0.; + if ( opt & PL_LEGEND_INSIDE ) + { + xlegend = -legend_width; + ylegend = legend_height; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + xlegend = 0.; + ylegend = 0.; + } + else + { + plexit( "legend_position: internal logic error 3" ); + } + } + else + { + plexit( "legend_position: internal logic error 4" ); + } + } + else if ( !( opt & PL_LEGEND_RIGHT ) && !( opt & PL_LEGEND_LEFT ) ) + { + xorigin = 0.5; + xlegend = -0.5 * legend_width; + if ( opt & PL_LEGEND_UPPER ) + { + yorigin = 1.; + if ( opt & PL_LEGEND_INSIDE ) + { + ylegend = 0.; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + ylegend = legend_height; + } + else + { + plexit( "legend_position: internal logic error 5" ); + } + } + else if ( opt & PL_LEGEND_LOWER ) + { + yorigin = 0.; + if ( opt & PL_LEGEND_INSIDE ) + { + ylegend = legend_height; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + ylegend = 0.; + } + else + { + plexit( "legend_position: internal logic error 6" ); + } + } + else + { + plexit( "legend_position: internal logic error 7" ); + } + } + else if ( opt & PL_LEGEND_LEFT ) + { + xorigin = 0.; + if ( opt & PL_LEGEND_UPPER ) + { + yorigin = 1.; + if ( opt & PL_LEGEND_INSIDE ) + { + xlegend = 0.; + ylegend = 0.; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + xlegend = -legend_width; + ylegend = legend_height; + } + else + { + plexit( "legend_position: internal logic error 8" ); + } + } + else if ( !( opt & PL_LEGEND_UPPER ) && !( opt & PL_LEGEND_LOWER ) ) + { + yorigin = 0.5; + ylegend = 0.5 * legend_height; + if ( opt & PL_LEGEND_INSIDE ) + { + xlegend = 0.; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + xlegend = -legend_width; + } + else + { + plexit( "legend_position: internal logic error 9" ); + } + } + else if ( opt & PL_LEGEND_LOWER ) + { + yorigin = 0.; + if ( opt & PL_LEGEND_INSIDE ) + { + ylegend = legend_height; + xlegend = 0.; + } + else if ( opt & PL_LEGEND_OUTSIDE ) + { + xlegend = -legend_width; + ylegend = 0.; + } + else + { + plexit( "legend_position: internal logic error 10" ); + } + } + else + { + plexit( "legend_position: internal logic error 11" ); + } + } + else + { + plexit( "legend_position: internal logic error 12" ); + } + *x_legend_position = xorigin + xlegend; + *y_legend_position = yorigin + ylegend; +} + //-------------------------------------------------------------------------- -//! Obtain ratio of world to mm coordinates in both x and y. +//! Obtain ratio of normalized subpage to mm coordinates in both x and y. //! -//! @param x_world_per_mm : pointer to PLFLT containing x ratio after call -//! @param y_world_per_mm : pointer to PLFLT containing y ratio after call +//! @param x_subpage_per_mm : pointer to PLFLT containing x ratio after call +//! @param y_subpage_per_mm : pointer to PLFLT containing y ratio after call //! -static void get_world_per_mm( PLFLT *x_world_per_mm, PLFLT *y_world_per_mm ) +static void get_subpage_per_mm( PLFLT *x_subpage_per_mm, PLFLT *y_subpage_per_mm ) { // Normalized viewport limits PLFLT vxmin, vxmax, vymin, vymax; @@ -44,12 +229,12 @@ plgvpd( &vxmin, &vxmax, &vymin, &vymax ); plgspa( &mxmin, &mxmax, &mymin, &mymax ); plgvpw( &wxmin, &wxmax, &wymin, &wymax ); - *x_world_per_mm = ( wxmax - wxmin ) / ( ( vxmax - vxmin ) * ( mxmax - mxmin ) ); - *y_world_per_mm = ( wymax - wymin ) / ( ( vymax - vymin ) * ( mymax - mymin ) ); + *x_subpage_per_mm = ( wxmax - wxmin ) / ( ( vxmax - vxmin ) * ( mxmax - mxmin ) ); + *y_subpage_per_mm = ( wymax - wymin ) / ( ( vymax - vymin ) * ( mymax - mymin ) ); } //-------------------------------------------------------------------------- -//! Obtain character or symbol height in (y) world coordinates. +//! Obtain character or symbol height in (y) subpage coordinates. //! //! @param ifcharacter : TRUE obtain character height, FALSE obtain symbol //! height @@ -60,7 +245,7 @@ { // Character height in mm PLFLT default_mm, char_height_mm; - PLFLT x_world_per_mm, y_world_per_mm; + PLFLT x_subpage_per_mm, y_subpage_per_mm; if ( ifcharacter ) { @@ -71,29 +256,47 @@ default_mm = plsc->symdef; char_height_mm = plsc->symht; } - get_world_per_mm( &x_world_per_mm, &y_world_per_mm ); - return ( char_height_mm * y_world_per_mm ); + get_subpage_per_mm( &x_subpage_per_mm, &y_subpage_per_mm ); + return ( char_height_mm * y_subpage_per_mm ); } //-------------------------------------------------------------------------- -//! Convert from normalized sub-page (or internal viewport) X -//! coordinate to X world coordinate. +//! Convert from external normalized viewport X coordinate to normalized +//! subpage X coordinate. //! -//! @param nx : normalized X coordinate +//! @param nx : external normalized viewport X coordinate //! -#define normalized_to_world_x( nx ) ( ( xmin ) + ( nx ) * ( ( xmax ) - ( xmin ) ) ) +#define viewport_to_subpage_x( nx ) ( ( xdmin_save ) + ( nx ) * ( ( xdmax_save ) - ( xdmin_save ) ) ) //-------------------------------------------------------------------------- -//! Convert from normalized sub-page (or internal viewport) Y -//! coordinate to Y world coordinate. +//! Convert from normalized subpage X coordinate to external normalized +//! viewport X coordinate. //! -//! @param ny : normalized Y coordinate +//! @param nx : normalized subpage X coordinate //! -#define normalized_to_world_y( ny ) ( ( ymin ) + ( ny ) * ( ( ymax ) - ( ymin ) ) ) +#define subpage_to_viewport_x( nx ) ( ( nx - xdmin_save ) / ( ( xdmax_save ) - ( xdmin_save ) ) ) //-------------------------------------------------------------------------- +//! Convert from external normalized viewport Y coordinate to normalized +//! subpage Y coordinate. +//! +//! @param ny : external normalized viewport Y coordinate +//! + +#define viewport_to_subpage_y( ny ) ( ( ydmin_save ) + ( ny ) * ( ( ydmax_save ) - ( ydmin_save ) ) ) + +//-------------------------------------------------------------------------- +//! Convert from normalized subpage Y coordinate to external normalized +//! viewport Y coordinate. +//! +//! @param ny : normalized subpage Y coordinate +//! + +#define subpage_to_viewport_y( ny ) ( ( ny - ydmin_save ) / ( ( ydmax_save ) - ( ydmin_save ) ) ) + +//-------------------------------------------------------------------------- //! Plot discrete legend using lines, symbols, cmap0 colors, and/or //! cmap1 colors. //! @@ -103,11 +306,11 @@ //! put the text area on the left of the legend and the plotted area //! on the right. Otherwise, put the text area on the right of the //! legend and the plotted area on the left -//! @param x : normalized sub-page X position of the upper-left corner of the +//! @param x : normalized viewport X position of the upper-left corner of the //! legend -//! @param y : normalized sub-page Y position of the upper-left corner of the +//! @param y : normalized viewport Y position of the upper-left corner of the //! legend -//! @param plot_width : width in normalized subpage units of the plot +//! @param plot_width : width in normalized viewport units of the plot //! area (where lines, symbols, and/or colored boxes are drawn in the //! legend) //! @param bg_color : cmap0 index of the background color for the legend @@ -179,13 +382,11 @@ const PLINT *symbol_numbers, const PLINT *symbols ) { - // Viewport world-coordinate limits - PLFLT xmin, xmax, ymin, ymax; // Legend position - PLFLT plot_x, plot_x_end, plot_x_world, plot_x_end_world; - PLFLT plot_y, plot_y_world; - PLFLT text_x, text_y, text_x_world, text_y_world; - // Character height (world coordinates) + PLFLT plot_x, plot_x_end, plot_x_subpage, plot_x_end_subpage; + PLFLT plot_y, plot_y_subpage; + PLFLT text_x, text_y, text_x_subpage, text_y_subpage; + // Character height (normalized subpage coordinates) PLFLT character_height, character_width, symbol_width; // x, y-position of the current legend entry PLFLT ty, xshift, drow, dcolumn; @@ -199,13 +400,15 @@ pattern_save = plsc->patt; PLFLT text_scale_save = plsc->chrht / plsc->chrdef, symbol_scale_save = plsc->symht / plsc->symdef; - // Saved world coordinates of viewport. + // Saved external world coordinates of viewport. PLFLT xwmin_save, xwmax_save, ywmin_save, ywmax_save; - // Saved normalized coordinates of viewport. + // Saved external normalized coordinates of viewport. PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; - PLFLT x_world_per_mm, y_world_per_mm, text_width0 = 0., text_width; - PLFLT width_border, column_separation, total_width, total_height; + PLFLT x_subpage_per_mm, y_subpage_per_mm, text_width0 = 0., text_width; + PLFLT width_border, column_separation, + total_width, total_height, total_width_vc, total_height_vc; + PLFLT x_legend_position, y_legend_position; PLINT some_boxes = 0, some_lines = 0, some_symbols = 0; PLINT max_symbol_numbers = 0; @@ -224,11 +427,47 @@ } // fprintf(stdout, "nrow, ncolumn = %d, %d\n", nrow, ncolumn); + // Default position flags and sanity checks for position flags. + if ( !( opt & PL_LEGEND_RIGHT ) && !( opt & PL_LEGEND_LEFT ) && !( opt & PL_LEGEND_UPPER ) && !( opt & PL_LEGEND_LOWER ) ) + { + opt = opt | PL_LEGEND_RIGHT | PL_LEGEND_UPPER; + } + else if ( ( opt & PL_LEGEND_RIGHT ) && ( opt & PL_LEGEND_LEFT ) ) + { + plabort( "pllegend: PL_LEGEND_RIGHT and PL_LEGEND_LEFT cannot be simultaneously set." ); + return; + } + + else if ( ( opt & PL_LEGEND_UPPER ) && ( opt & PL_LEGEND_LOWER ) ) + { + plabort( "pllegend: PL_LEGEND_UPPER and PL_LEGEND_LOWER cannot be simultaneously set." ); + return; + } + + if ( !( opt & PL_LEGEND_INSIDE ) && !( opt & PL_LEGEND_OUTSIDE ) ) + { + opt = opt | PL_LEGEND_INSIDE; + } + else if ( ( opt & PL_LEGEND_INSIDE ) && ( opt & PL_LEGEND_OUTSIDE ) ) + { + plabort( "pllegend: PL_LEGEND_INSIDE and PL_LEGEND_OUTSIDE cannot be simultaneously set." ); + return; + } + + // xdmin_save, etc., are the external relative viewport + // coordinates within the current sub-page. plgvpd( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + + // xwmin_save, etc., are the external world coordinates corresponding + // to the external viewport boundaries. plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); - // viewport corresponds to sub-page so that all legends will + + // Internal viewport corresponds to sub-page so that all legends will // be clipped at sub-page boundaries. plvpor( 0., 1., 0., 1. ); + + // Internal window coordinates are the same as normalized internal + // viewport coordinates which are the same as normalized subpage coordinates. plwind( 0., 1., 0., 1. ); plschr( 0., text_scale ); @@ -246,62 +485,78 @@ } } - plgvpw( &xmin, &xmax, &ymin, &ymax ); - - // World coordinates for legend plots - plot_x = x; - plot_y = y; - plot_x_end = plot_x + plot_width; - plot_x_world = normalized_to_world_x( plot_x ); - plot_y_world = normalized_to_world_y( plot_y ); - plot_x_end_world = normalized_to_world_x( plot_x_end ); - - // Get character height and width in world coordinates + // Get character height and width in normalized subpage coordinates. character_height = get_character_or_symbol_height( TRUE ); - character_width = character_height * fabs( ( xmax - xmin ) / ( ymax - ymin ) ); - // Get world-coordinate positions of the start of the legend text - text_x = plot_x_end; - text_y = plot_y; - text_x_world = normalized_to_world_x( text_x ) + - text_offset * character_width; - text_y_world = normalized_to_world_y( text_y ); + character_width = character_height; - // Calculate maximum width of text area (first in mm, then converted - // to x world coordinates) including text_offset area. + // Calculate maximum width of text area. for ( i = 0; i < nlegend; i++ ) { + // units are mm. text_width0 = MAX( text_width0, plstrl( text[i] ) ); } - get_world_per_mm( &x_world_per_mm, &y_world_per_mm ); - text_width0 = x_world_per_mm * text_width0; - text_width = text_width0 + text_offset * character_width; - // make small border area where only the background is plotted + get_subpage_per_mm( &x_subpage_per_mm, &y_subpage_per_mm ); + + // units are normalized subpage coordinates. + text_width0 = x_subpage_per_mm * text_width0; + + // Allow gap on end closest to legend plot. + text_width = text_width0 + text_offset * character_width; + + // Allow small border area where only the background is plotted // for left and right of legend. 0.4 seems to be a reasonable factor // that gives a good-looking result. width_border = 0.4 * character_width; // Separate columns (if any) by 2.0 * character_width. column_separation = 2.0 * character_width; - total_width = 2. * width_border + ( ncolumn - 1 ) * column_separation + - ncolumn * ( text_width + ( xmax - xmin ) * plot_width ); + + // Total width and height of legend area in normalized subpage coordinates. + total_width = 2. * width_border + ( ncolumn - 1 ) * column_separation + + ncolumn * ( text_width + + viewport_to_subpage_x( plot_width ) - viewport_to_subpage_x( 0. ) ); total_height = nrow * text_spacing * character_height; + + // Total width and height of legend area in normalized external viewport + // coordinates. + + total_width_vc = subpage_to_viewport_x( total_width ) - subpage_to_viewport_x( 0. ); + total_height_vc = subpage_to_viewport_y( total_height ) - subpage_to_viewport_y( 0. ); + // dcolumn is the spacing from one column to the next and // drow is the spacing from one row to the next. - dcolumn = column_separation + text_width + ( xmax - xmin ) * plot_width; - drow = text_spacing * character_height; + dcolumn = column_separation + text_width + + viewport_to_subpage_x( plot_width ) - viewport_to_subpage_x( 0. ); + drow = text_spacing * character_height; + legend_position( opt, total_width_vc, total_height_vc, &x_legend_position, &y_legend_position ); + plot_x = x + x_legend_position; + plot_y = y + y_legend_position; + plot_x_end = plot_x + plot_width; + // Normalized subpage coordinates for legend plots + plot_x_subpage = viewport_to_subpage_x( plot_x ); + plot_y_subpage = viewport_to_subpage_y( plot_y ); + plot_x_end_subpage = viewport_to_subpage_x( plot_x_end ); + + // Get normalized subpage positions of the start of the legend text + text_x = plot_x_end; + text_y = plot_y; + text_x_subpage = viewport_to_subpage_x( text_x ) + + text_offset * character_width; + text_y_subpage = viewport_to_subpage_y( text_y ); + if ( opt & PL_LEGEND_BACKGROUND ) { PLFLT xbg[4] = { - plot_x_world, - plot_x_world, - plot_x_world + total_width, - plot_x_world + total_width, + plot_x_subpage, + plot_x_subpage, + plot_x_subpage + total_width, + plot_x_subpage + total_width, }; PLFLT ybg[4] = { - plot_y_world, - plot_y_world - total_height, - plot_y_world - total_height, - plot_y_world, + plot_y_subpage, + plot_y_subpage - total_height, + plot_y_subpage - total_height, + plot_y_subpage, }; plpsty( 0 ); plcol0( bg_color ); @@ -312,18 +567,18 @@ if ( opt & PL_LEGEND_BOUNDING_BOX ) { PLFLT xbb[5] = { - plot_x_world, - plot_x_world, - plot_x_world + total_width, - plot_x_world + total_width, - plot_x_world, + plot_x_subpage, + plot_x_subpage, + plot_x_subpage + total_width, + plot_x_subpage + total_width, + plot_x_subpage, }; PLFLT ybb[5] = { - plot_y_world, - plot_y_world - total_height, - plot_y_world - total_height, - plot_y_world, - plot_y_world, + plot_y_subpage, + plot_y_subpage - total_height, + plot_y_subpage - total_height, + plot_y_subpage, + plot_y_subpage, }; pllsty( bb_style ); plcol0( bb_color ); @@ -334,14 +589,14 @@ if ( opt & PL_LEGEND_TEXT_LEFT ) { // text area on left, plot area on right. - text_x_world = plot_x_world; - plot_x_world += text_width; - plot_x_end_world += text_width; + text_x_subpage = plot_x_subpage; + plot_x_subpage += text_width; + plot_x_end_subpage += text_width; } // adjust border after background is drawn. - plot_x_world += width_border; - plot_x_end_world += width_border; - text_x_world += width_border; + plot_x_subpage += width_border; + plot_x_end_subpage += width_border; + text_x_subpage += width_border; if ( some_symbols ) { @@ -352,24 +607,23 @@ plexit( "pllegend: Insufficient memory" ); } - // Get symbol width in world coordinates if symbols are plotted to + // Get symbol width in normalized subpage coordinates if symbols are plotted to // adjust ends of line of symbols. // AWI, no idea why must use 0.5 factor to get ends of symbol lines // to line up approximately correctly with plotted legend lines. // Factor should be unity. - symbol_width = 0.5 * get_character_or_symbol_height( FALSE ) * - fabs( ( xmax - xmin ) / ( ymax - ymin ) ); + symbol_width = 0.5 * get_character_or_symbol_height( FALSE ); } // Draw each legend entry for ( i = 0; i < nlegend; i++ ) { // y position of text, lines, symbols, and/or centre of cmap0 box. - ty = text_y_world - ( (double) irow + 0.5 ) * drow; + ty = text_y_subpage - ( (double) irow + 0.5 ) * drow; xshift = (double) icolumn * dcolumn; // Label/name for the legend plcol0( text_colors[i] ); - plptex( text_x_world + xshift + text_justification * text_width0, ty, 0.1, 0.0, text_justification, text[i] ); + plptex( text_x_subpage + xshift + text_justification * text_width0, ty, 0.1, 0.0, text_justification, text[i] ); if ( !( opt_array[i] & PL_LEGEND_NONE ) ) { @@ -377,9 +631,9 @@ { plcol0( box_colors[i] ); plpsty( box_patterns[i] ); - xbox[0] = plot_x_world + xshift; + xbox[0] = plot_x_subpage + xshift; xbox[1] = xbox[0]; - xbox[2] = plot_x_end_world + xshift; + xbox[2] = plot_x_end_subpage + xshift; xbox[3] = xbox[2]; ybox[0] = ty + 0.5 * drow * box_scales[i]; ybox[1] = ty - 0.5 * drow * box_scales[i]; @@ -392,8 +646,8 @@ plcol0( line_colors[i] ); pllsty( line_styles[i] ); plwid( line_widths[i] ); - xl[0] = plot_x_world + xshift; - xl[1] = plot_x_end_world + xshift; + xl[0] = plot_x_subpage + xshift; + xl[1] = plot_x_end_subpage + xshift; yl[0] = ty; yl[1] = ty; plline( 2, xl, yl ); @@ -405,10 +659,10 @@ { plcol0( symbol_colors[i] ); plssym( 0., symbol_scales[i] ); - dxs = ( plot_x_end_world - plot_x_world - symbol_width ) / (double) ( MAX( symbol_numbers[i], 2 ) - 1 ); + dxs = ( plot_x_end_subpage - plot_x_subpage - symbol_width ) / (double) ( MAX( symbol_numbers[i], 2 ) - 1 ); for ( j = 0; j < symbol_numbers[i]; j++ ) { - xs[j] = plot_x_world + xshift + + xs[j] = plot_x_subpage + xshift + 0.5 * symbol_width + dxs * (double) j; ys[j] = ty; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-11-06 00:11:32
|
Revision: 11309 http://plplot.svn.sourceforge.net/plplot/?rev=11309&view=rev Author: airwin Date: 2010-11-06 00:11:25 +0000 (Sat, 06 Nov 2010) Log Message: ----------- Implement interpretation of sign of x and y legend offsets that depends on the PL_LEGEND position bits that are set. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-11-05 23:47:04 UTC (rev 11308) +++ trunk/src/pllegend.c 2010-11-06 00:11:25 UTC (rev 11309) @@ -37,9 +37,13 @@ // with the coordinate system used for x and y. static void legend_position( PLINT opt, PLFLT legend_width, PLFLT legend_height, - PLFLT *x_legend_position, PLFLT *y_legend_position ) + PLFLT *x_legend_position, PLFLT *y_legend_position, + PLFLT *xsign, PLFLT *ysign ) { PLFLT xorigin, yorigin, xlegend, ylegend; + // By default the sign of the x and y offsets is positive. + *xsign = 1.; + *ysign = 1.; if ( opt & PL_LEGEND_RIGHT ) { xorigin = 1.; @@ -50,6 +54,8 @@ { xlegend = -legend_width; ylegend = 0.; + *xsign = -1.; + *ysign = -1.; } else if ( opt & PL_LEGEND_OUTSIDE ) { @@ -68,6 +74,7 @@ if ( opt & PL_LEGEND_INSIDE ) { xlegend = -legend_width; + *xsign = -1.; } else if ( opt & PL_LEGEND_OUTSIDE ) { @@ -85,11 +92,13 @@ { xlegend = -legend_width; ylegend = legend_height; + *xsign = -1.; } else if ( opt & PL_LEGEND_OUTSIDE ) { xlegend = 0.; ylegend = 0.; + *ysign = -1.; } else { @@ -111,6 +120,7 @@ if ( opt & PL_LEGEND_INSIDE ) { ylegend = 0.; + *ysign = -1.; } else if ( opt & PL_LEGEND_OUTSIDE ) { @@ -131,6 +141,7 @@ else if ( opt & PL_LEGEND_OUTSIDE ) { ylegend = 0.; + *ysign = -1.; } else { @@ -152,11 +163,13 @@ { xlegend = 0.; ylegend = 0.; + *ysign = -1.; } else if ( opt & PL_LEGEND_OUTSIDE ) { xlegend = -legend_width; ylegend = legend_height; + *xsign = -1.; } else { @@ -174,6 +187,7 @@ else if ( opt & PL_LEGEND_OUTSIDE ) { xlegend = -legend_width; + *xsign = -1.; } else { @@ -192,6 +206,8 @@ { xlegend = -legend_width; ylegend = 0.; + *xsign = -1.; + *ysign = -1.; } else { @@ -408,7 +424,7 @@ PLFLT x_subpage_per_mm, y_subpage_per_mm, text_width0 = 0., text_width; PLFLT width_border, column_separation, total_width, total_height, total_width_vc, total_height_vc; - PLFLT x_legend_position, y_legend_position; + PLFLT x_legend_position, y_legend_position, xsign, ysign; PLINT some_boxes = 0, some_lines = 0, some_symbols = 0; PLINT max_symbol_numbers = 0; @@ -528,9 +544,9 @@ viewport_to_subpage_x( plot_width ) - viewport_to_subpage_x( 0. ); drow = text_spacing * character_height; - legend_position( opt, total_width_vc, total_height_vc, &x_legend_position, &y_legend_position ); - plot_x = x + x_legend_position; - plot_y = y + y_legend_position; + legend_position( opt, total_width_vc, total_height_vc, &x_legend_position, &y_legend_position, &xsign, &ysign ); + plot_x = x * xsign + x_legend_position; + plot_y = y * ysign + y_legend_position; plot_x_end = plot_x + plot_width; // Normalized subpage coordinates for legend plots plot_x_subpage = viewport_to_subpage_x( plot_x ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-11-17 18:12:30
|
Revision: 11335 http://plplot.svn.sourceforge.net/plplot/?rev=11335&view=rev Author: airwin Date: 2010-11-17 18:12:23 +0000 (Wed, 17 Nov 2010) Log Message: ----------- Update doxygen comments to be consistent with changed pllegend API. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-11-16 20:33:01 UTC (rev 11334) +++ trunk/src/pllegend.c 2010-11-17 18:12:23 UTC (rev 11335) @@ -26,20 +26,45 @@ //! #include "plplotP.h" -// xorigin is the X coordinate of the viewport reference point. -// yorigin is the Y coordinate of the viewport reference point. -// xlegend is the X coordinate of the top-left of the legend box -// relative to the legend box reference point. -// ylegend is the y coordinate of the top-left of the legend box -// relative to the legend box reference point. -// N.B. xorigin, yorigin, xlegend, and ylegend are all expressed -// in normalized external viewport coordinates to be consistent -// with the coordinate system used for x and y. +//-------------------------------------------------------------------------- +//! Calculate parameters that help determine the position of the top left +//! of the legend in normalized viewport coordinates. +//! +//! @param opt : control variable containing valid combinations of the +//! following control bits that specify the 16 standard positions of +//! the legend: PL_LEGEND_LEFT, PL_LEGEND_RIGHT, PL_LEGEND_UPPER, +//! PL_LEGEND_LOWER, PL_LEGEND_INSIDE, and PL_LEGEND_OUTSIDE. +//! @param legend_width : total legend width in normalized viewport +//! coordinates. +//! @param legend_height : total legend height in normalized viewport +//! coordinates. +//! @param x_legend_position : pointer to a location that contains +//! (after the call) the X value of one of the 16 standard legend +//! positions specified by opt. +//! @param y_legend_position : pointer to a location that contains +//! (after the call) the Y equivalent of x_legend_position. +//! @param xsign : pointer to a location that contains (after the call) +//! the sign of the X offset relative to the standard legend position +//! specified by opt. +//! @param ysign : pointer to a location that contains (after the call) +//! the Y equivalent to xsign. +//! static void legend_position( PLINT opt, PLFLT legend_width, PLFLT legend_height, PLFLT *x_legend_position, PLFLT *y_legend_position, PLFLT *xsign, PLFLT *ysign ) { + // + // xorigin, yorigin, xlegend, and ylegend are all calculated for + // one of the 16 standard positions specified by opt and are + // expressed in normalized viewport coordinates. xorigin is the X + // coordinate of the viewport reference point. yorigin is the Y + // coordinate of the viewport reference point. xlegend is the X + // coordinate of the top-left of the legend box relative to the + // legend box reference point. ylegend is the y coordinate of the + // top-left of the legend box relative to the legend box reference + // point. + PLFLT xorigin, yorigin, xlegend, ylegend; // By default the sign of the x and y offsets is positive. *xsign = 1.; @@ -230,8 +255,8 @@ //-------------------------------------------------------------------------- //! Obtain ratio of normalized subpage to mm coordinates in both x and y. //! -//! @param x_subpage_per_mm : pointer to PLFLT containing x ratio after call -//! @param y_subpage_per_mm : pointer to PLFLT containing y ratio after call +//! @param x_subpage_per_mm : pointer to a location that contains (after the call) the x ratio. +//! @param y_subpage_per_mm : pointer to a location that contains (after the call) the y ratio. //! static void get_subpage_per_mm( PLFLT *x_subpage_per_mm, PLFLT *y_subpage_per_mm ) @@ -253,8 +278,8 @@ //! Obtain character or symbol height in (y) subpage coordinates. //! //! @param ifcharacter : TRUE obtain character height, FALSE obtain symbol -//! height -//! @return character or symbol height +//! height. +//! @return character or symbol height. //! static PLFLT get_character_or_symbol_height( PLBOOL ifcharacter ) @@ -280,7 +305,7 @@ //! Convert from external normalized viewport X coordinate to normalized //! subpage X coordinate. //! -//! @param nx : external normalized viewport X coordinate +//! @param nx : external normalized viewport X coordinate. //! #define viewport_to_subpage_x( nx ) ( ( xdmin_save ) + ( nx ) * ( ( xdmax_save ) - ( xdmin_save ) ) ) @@ -289,7 +314,7 @@ //! Convert from normalized subpage X coordinate to external normalized //! viewport X coordinate. //! -//! @param nx : normalized subpage X coordinate +//! @param nx : normalized subpage X coordinate. //! #define subpage_to_viewport_x( nx ) ( ( nx - xdmin_save ) / ( ( xdmax_save ) - ( xdmin_save ) ) ) @@ -298,7 +323,7 @@ //! Convert from external normalized viewport Y coordinate to normalized //! subpage Y coordinate. //! -//! @param ny : external normalized viewport Y coordinate +//! @param ny : external normalized viewport Y coordinate. //! #define viewport_to_subpage_y( ny ) ( ( ydmin_save ) + ( ny ) * ( ( ydmax_save ) - ( ydmin_save ) ) ) @@ -307,80 +332,128 @@ //! Convert from normalized subpage Y coordinate to external normalized //! viewport Y coordinate. //! -//! @param ny : normalized subpage Y coordinate +//! @param ny : normalized subpage Y coordinate. //! #define subpage_to_viewport_y( ny ) ( ( ny - ydmin_save ) / ( ( ydmax_save ) - ( ydmin_save ) ) ) //-------------------------------------------------------------------------- -//! Plot discrete legend using lines, symbols, cmap0 colors, and/or -//! cmap1 colors. +//! Plot discrete annotated legend using colored boxes, lines, and/or symbols. //! -//! @param opt : options controlling overall legend. If the -//! PL_LEGEND_BACKGROUND bit is set, plot a (semi-transparent) -//! background for the legend. If the PL_LEGEND_TEXT_LEFT bit is set, -//! put the text area on the left of the legend and the plotted area -//! on the right. Otherwise, put the text area on the right of the -//! legend and the plotted area on the left -//! @param x : normalized viewport X position of the upper-left corner of the -//! legend -//! @param y : normalized viewport Y position of the upper-left corner of the -//! legend -//! @param plot_width : width in normalized viewport units of the plot -//! area (where lines, symbols, and/or colored boxes are drawn in the -//! legend) +//! @param p_legend_width : pointer to a location which contains +//! (after the call) the legend width in normalized viewport +//! coordinates. This quantity is calculated from the plot_width and +//! text_offset arguments, the ncolumn argument (possibly modified +//! inside the routine depending on the nlegend and nrow arguments), +//! and the length (calculated internally) of the longest text string. +//! @param p_legend_height : pointer to a location which contains (after +//! the call) the legend height in normalized viewport coordinates. +//! This quantity is calculated from the text_scale and text_spacing arguments +//! and the nrow argument (possibly modified inside the routine depending +//! on the nlegend and ncolum arguments). +//! @param opt : this variable contains bits which control the overall +//! legend. If the PL_LEGEND_TEXT_LEFT bit is set, put the text area +//! on the left of the legend and the plotted area on the right. +//! Otherwise, put the text area on the right of the legend and the +//! plotted area on the left. If the PL_LEGEND_BACKGROUND bit is set, +//! plot a (semi-transparent) background for the legend. If the +//! PL_LEGEND_BOUNDING_BOX bit is set, plot a bounding box for the +//! legend. If the PL_LEGEND_ROW_MAJOR bit is set and both of the +//! (possibly internally transformed) nrow > 1 and ncolumn > 1, then +//! plot the resulting array of legend entries in row-major order. +//! Finally, the combination of the PL_LEGEND_LEFT, PL_LEGEND_RIGHT, +//! PL_LEGEND_UPPER, PL_LEGEND_LOWER, PL_LEGEND_INSIDE, and +//! PL_LEGEND_OUTSIDE position bits specifies one of the 16 possible +//! standard positions (the 4 corners and 4 side centers for both the +//! inside and outside cases) of the legend relative to the viewport. +//! @param x : X offset of the legend position in normalized viewport +//! coordinates from the specified standard position of the legend. +//! For positive x, the direction of motion away from the standard +//! position is inward/outward from the standard corner positions or +//! standard center-left or center-right positions if the +//! PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit is set in opt. For the +//! center-upper or center-lower cases, the direction of motion is +//! toward positive X. +//! @param y : Y offset of the legend position in normalized viewport +//! coordinates from the specified standard position of the legend. +//! For positive y, the direction of motion away from the standard +//! position is inward/outward from the standard corner positions or +//! standard center-upper or center-lower positions if the +//! PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit is set in opt. For the +//! center-left or center-right cases, the direction of motion is +//! toward positive Y. +//! @param plot_width : horizontal width in normalized viewport units +//! of the plot area (where colored boxes, lines, and/or symbols are +//! drawn in the legend). //! @param bg_color : cmap0 index of the background color for the legend -//! (PL_LEGEND_BACKGROUND) -//! @param nlegend : number of legend entries +//! (PL_LEGEND_BACKGROUND). +//! @param bb_color : cmap0 index of the color of the bounding-box +//! line for the legend (PL_LEGEND_BOUNDING_BOX). +//! @param bb_style : pllsty style number for the bounding-box line +//! for the legend (PL_LEGEND_BOUNDING_BOX). +//! @param nrow : number of rows in the matrix used to render the +//! nlegend legend entries. For internal transformations of nrow, see +//! further remarks under nlegend. +//! @param ncolumn : number of columns in the matrix used to render the +//! nlegend legend entries. For internal transformations of ncolumn, +//! see further remarks under nlegend. +//! @param nlegend : number of legend entries. The above nrow and +//! ncolumn values are transformed internally to be consistent with +//! nlegend. If either nrow or ncolumn is non-positive it is replaced +//! by 1. If the resulting product of nrow and ncolumn is less than +//! nlegend, the smaller of the two (or nrow, if nrow == ncolumn) is +//! increased so the product is >= nlegend. Thus, for example, the +//! common nrow = 0, ncolumn = 0 case is transformed internally to +//! nrow = nlegend, ncolumn = 1; i.e., the usual case of a legend +//! rendered as a single column. //! @param opt_array : array of nlegend values of options to control //! each individual plotted area corresponding to a legend entry. If //! the PL_LEGEND_NONE bit is set, then nothing is plotted in the //! plotted area. If the PL_LEGEND_COLOR_BOX, PL_LEGEND_LINE, and/or //! PL_LEGEND_SYMBOL bits are set, the plotted area corresponding to a //! legend entry is specified with a colored box; a line; and/or a -//! line of symbols +//! line of symbols. //! @param text_offset : offset of the text area from the plot area in -//! units of character width -//! @param text_scale : character height scale for text annotations +//! units of character width. +//! @param text_scale : character height scale for text annotations. //! @param text_spacing : vertical spacing in units of the character -//! height from one legend entry to the next +//! height from one legend entry to the next. //! @param text_justification : justification parameter used for text //! justification. The most common values of text_justification are //! 0., 0.5, or 1. corresponding to a text that is left justified, //! centred, or right justified within the text area, but other values //! are allowed as well. //! @param text_colors : array of nlegend text colors (cmap0 indices). -//! @param text : array of nlegend text annotations +//! @param text : array of nlegend pointers to null-terminated text +//! annotation strings. Like other PLplot strings specified by the +//! user, UTF-8 or its ascii subset may be used in the strings, and +//! the strings may include the normal PLplot text escapes. //! @param box_colors : array of nlegend colors (cmap0 indices) for -//! the discrete colored boxes (PL_LEGEND_COLOR_BOX) +//! the discrete colored boxes (PL_LEGEND_COLOR_BOX). //! @param box_patterns : array of nlegend patterns (plpsty indices) -//! for the discrete colored boxes (PL_LEGEND_COLOR_BOX) +//! for the discrete colored boxes (PL_LEGEND_COLOR_BOX). //! @param box_scales : array of nlegend scales (units of fraction of //! character height) for the height of the discrete colored boxes -//! (PL_LEGEND_COLOR_BOX) +//! (PL_LEGEND_COLOR_BOX). +//! @param box_line_widths : array of nlegend line widths for the +//! patterns specified by box_patterns (PL_LEGEND_COLOR_BOX). //! @param line_colors : array of nlegend line colors (cmap0 indices) -//! (PL_LEGEND_LINE) -//! @param line_styles : array of nlegend line styles (plsty indices) -//! (PL_LEGEND_LINE) -//! @param line_widths : array of nlegend line widths (PL_LEGEND_LINE) +//! (PL_LEGEND_LINE). +//! @param line_styles : array of nlegend line styles (pllsty indices) +//! (PL_LEGEND_LINE). +//! @param line_widths : array of nlegend line widths (PL_LEGEND_LINE). //! @param symbol_colors : array of nlegend symbol colors (cmap0 -//! indices) (PL_LEGEND_SYMBOL) +//! indices) (PL_LEGEND_SYMBOL). //! @param symbol_scales : array of nlegend scale values for the -//! symbol height (PL_LEGEND_SYMBOL) +//! symbol height (PL_LEGEND_SYMBOL). //! @param symbol_numbers : array of nlegend numbers of symbols to be -//! drawn across the width of the plotted area (PL_LEGEND_SYMBOL) -//! @param symbols : array of nlegend symbols (plpoin indices) -//! (PL_LEGEND_SYMBOL) +//! drawn across the width of the plotted area (PL_LEGEND_SYMBOL). +//! @param symbols : array of nlegend pointers to null-terminated +//! strings which represent the glyph for the symbol to be plotted +//! (PL_LEGEND_SYMBOL). Like other PLplot strings specified by the +//! user, UTF-8 or its ascii subset may be used in the strings, and +//! the strings may include the normal PLplot text escapes. //! -//! N.B. the total width of the legend is made up of plplot_width + -//! text_offset (converted to normalized subpage coordinates) + width -//! of the longest text string. The latter quantity is calculated -//! internally and converted to normalized subpage coordinates. The -//! total height of the legend is nlegend * text_spacing * character -//! height, where the latter quantity is calculated internally and -//! converted to normalized subpage coordinates. The legend is clipped -//! at the edges of the current subpage. -//! void c_pllegend( PLFLT *p_legend_width, PLFLT *p_legend_height, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2010-11-22 00:46:41
|
Revision: 11342 http://plplot.svn.sourceforge.net/plplot/?rev=11342&view=rev Author: airwin Date: 2010-11-22 00:46:35 +0000 (Mon, 22 Nov 2010) Log Message: ----------- File identification. Doxygen documentation tweaks. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2010-11-22 00:16:52 UTC (rev 11341) +++ trunk/src/pllegend.c 2010-11-22 00:46:35 UTC (rev 11342) @@ -1,4 +1,6 @@ -// pllegend() +// $Id$ +// pllegend(...) (which plots a discrete plot legend) and the static +// routines which support it. // // Copyright (C) 2010 Hezekiah M. Carty // Copyright (C) 2010 Alan W. Irwin @@ -54,7 +56,6 @@ PLFLT *x_legend_position, PLFLT *y_legend_position, PLFLT *xsign, PLFLT *ysign ) { - // // xorigin, yorigin, xlegend, and ylegend are all calculated for // one of the 16 standard positions specified by opt and are // expressed in normalized viewport coordinates. xorigin is the X @@ -338,7 +339,7 @@ #define subpage_to_viewport_y( ny ) ( ( ny - ydmin_save ) / ( ( ydmax_save ) - ( ydmin_save ) ) ) //-------------------------------------------------------------------------- -//! Plot discrete annotated legend using colored boxes, lines, and/or symbols. +//! Plot discrete annotated legend using filled boxes, lines, and/or symbols. //! //! @param p_legend_width : pointer to a location which contains //! (after the call) the legend width in normalized viewport @@ -427,7 +428,7 @@ //! @param text : array of nlegend pointers to null-terminated text //! annotation strings. Like other PLplot strings specified by the //! user, UTF-8 or its ascii subset may be used in the strings, and -//! the strings may include the normal PLplot text escapes. +//! the strings may include any of the PLplot text escapes. //! @param box_colors : array of nlegend colors (cmap0 indices) for //! the discrete colored boxes (PL_LEGEND_COLOR_BOX). //! @param box_patterns : array of nlegend patterns (plpsty indices) @@ -452,7 +453,7 @@ //! strings which represent the glyph for the symbol to be plotted //! (PL_LEGEND_SYMBOL). Like other PLplot strings specified by the //! user, UTF-8 or its ascii subset may be used in the strings, and -//! the strings may include the normal PLplot text escapes. +//! the strings may include any of the PLplot text escapes. //! void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-01-01 00:32:00
|
Revision: 11410 http://plplot.svn.sourceforge.net/plplot/?rev=11410&view=rev Author: hezekiahcarty Date: 2011-01-01 00:31:53 +0000 (Sat, 01 Jan 2011) Log Message: ----------- Move plbox drawing to make plcolorbar a bit prettier Also, tick marks and labels are no longer included by default. They must be requested in the plcolorbar call. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-01-01 00:26:35 UTC (rev 11409) +++ trunk/src/pllegend.c 2011-01-01 00:31:53 UTC (rev 11410) @@ -1161,38 +1161,6 @@ // Restore the previous drawing color to use for outlines and text plcol0( col0_save ); - // Smaller text - plschr( 0.0, 0.75 ); - // Small ticks on the vertical axis - plsmaj( 0.0, 0.5); - plsmin( 0.0, 0.5); - - // For building axis option string - PLINT max_opts = 25; - char opt_string[max_opts]; - - // Draw the boxes, ticks and tick labels - if ( opt & PL_COLORBAR_LEFT ) - { - snprintf( opt_string, max_opts, "bcn%s", axis_opts ); - plbox( "bc", 0.0, 0, opt_string, 0.0, 0 ); - } - else if ( opt & PL_COLORBAR_RIGHT ) - { - snprintf( opt_string, max_opts, "bcm%s", axis_opts ); - plbox( "bc", 0.0, 0, opt_string, 0.0, 0 ); - } - else if ( opt & PL_COLORBAR_UPPER ) - { - snprintf( opt_string, max_opts, "bcm%s", axis_opts ); - plbox( opt_string, 0.0, 0, "bc", 0.0, 0 ); - } - else if ( opt & PL_COLORBAR_LOWER ) - { - snprintf( opt_string, max_opts, "bcn%s", axis_opts ); - plbox( opt_string, 0.0, 0, "bc", 0.0, 0 ); - } - // How far away from the axis should the label be drawn? PLFLT label_offset; label_offset = 0.0; @@ -1227,6 +1195,40 @@ draw_cap( opt, x, y, length, width, 1.0 ); } + // Smaller text + plschr( 0.0, 0.75 ); + // Small ticks on the vertical axis + plsmaj( 0.0, 0.5); + plsmin( 0.0, 0.5); + + // For building axis option string + PLINT max_opts = 25; + char opt_string[max_opts]; + + // Draw the boxes, etc. + if ( opt & PL_COLORBAR_LEFT ) + { + snprintf( opt_string, max_opts, "bc%s", axis_opts ); + plbox( "bc", 0.0, 0, opt_string, 0.0, 0 ); + } + else if ( opt & PL_COLORBAR_RIGHT ) + { + snprintf( opt_string, max_opts, "bc%s", axis_opts ); + plbox( "bc", 0.0, 0, opt_string, 0.0, 0 ); + } + else if ( opt & PL_COLORBAR_UPPER ) + { + snprintf( opt_string, max_opts, "bc%s", axis_opts ); + plbox( opt_string, 0.0, 0, "bc", 0.0, 0 ); + } + else if ( opt & PL_COLORBAR_LOWER ) + { + snprintf( opt_string, max_opts, "bc%s", axis_opts ); + plbox( opt_string, 0.0, 0, "bc", 0.0, 0 ); + } + + // TODO: Add tick mark drawing and labeling here when n_colors > 2 + // Draw a title char perp; if ( opt & PL_COLORBAR_LABEL_LEFT ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-01-01 01:13:48
|
Revision: 11414 http://plplot.svn.sourceforge.net/plplot/?rev=11414&view=rev Author: hezekiahcarty Date: 2011-01-01 01:13:42 +0000 (Sat, 01 Jan 2011) Log Message: ----------- Revert a change mistakenly made to plcolorbar's tick handling Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-01-01 00:56:46 UTC (rev 11413) +++ trunk/src/pllegend.c 2011-01-01 01:13:42 UTC (rev 11414) @@ -1208,22 +1208,22 @@ // Draw the boxes, etc. if ( opt & PL_COLORBAR_LEFT ) { - snprintf( opt_string, max_opts, "bc%s", axis_opts ); + snprintf( opt_string, max_opts, "bcn%s", axis_opts ); plbox( "bc", 0.0, 0, opt_string, 0.0, 0 ); } else if ( opt & PL_COLORBAR_RIGHT ) { - snprintf( opt_string, max_opts, "bc%s", axis_opts ); + snprintf( opt_string, max_opts, "bcm%s", axis_opts ); plbox( "bc", 0.0, 0, opt_string, 0.0, 0 ); } else if ( opt & PL_COLORBAR_UPPER ) { - snprintf( opt_string, max_opts, "bc%s", axis_opts ); + snprintf( opt_string, max_opts, "bcm%s", axis_opts ); plbox( opt_string, 0.0, 0, "bc", 0.0, 0 ); } else if ( opt & PL_COLORBAR_LOWER ) { - snprintf( opt_string, max_opts, "bc%s", axis_opts ); + snprintf( opt_string, max_opts, "bcn%s", axis_opts ); plbox( opt_string, 0.0, 0, "bc", 0.0, 0 ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-01-29 22:30:44
|
Revision: 11533 http://plplot.svn.sourceforge.net/plplot/?rev=11533&view=rev Author: airwin Date: 2011-01-29 22:30:37 +0000 (Sat, 29 Jan 2011) Log Message: ----------- Fix off by two error in plcolorbar which was causing valgrind complaints for example 33. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-01-29 21:11:48 UTC (rev 11532) +++ trunk/src/pllegend.c 2011-01-29 22:30:37 UTC (rev 11533) @@ -1138,7 +1138,7 @@ } else if ( i == n_steps - 1 ) { - values_ext[i] = max_value + ( max_value - values[i - 1] ) * 0.1; + values_ext[i] = max_value + ( max_value - values[n_colors - 2] ) * 0.1; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-02-09 13:21:18
|
Revision: 11551 http://plplot.svn.sourceforge.net/plplot/?rev=11551&view=rev Author: hezekiahcarty Date: 2011-02-09 13:21:11 +0000 (Wed, 09 Feb 2011) Log Message: ----------- Revert commit 11522 The color range implementation in 11522 is buggy and not flexible enough for general use. The commit is reverted for now, until a proper implementation is available. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-02-09 13:19:11 UTC (rev 11550) +++ trunk/src/pllegend.c 2011-02-09 13:21:11 UTC (rev 11551) @@ -953,13 +953,6 @@ min_value = values[0]; max_value = values[ n_colors - 1 ]; - // Min and max colors - // Assumes that the colors array is sorted from smallest to largest - // OR from largest to smallest. - PLFLT min_color, max_color; - min_color = colors[0]; - max_color = colors[ n_colors - 1 ]; - // Saved normalized coordinates of viewport. PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; // Saved world coordinates of viewport. @@ -1128,28 +1121,12 @@ // Transform grid PLcGrid grid; PLFLT grid_axis[2] = { 0.0, 1.0 }; - n_steps = n_colors + 2; - PLFLT values_ext[n_steps]; - for ( i = 0; i < n_steps; i++ ) - { - if ( i == 0 ) - { - values_ext[i] = min_value - ( values[i + 1] - min_value ) * 0.1; - } - else if ( i == n_steps - 1 ) - { - values_ext[i] = max_value + ( max_value - values[n_colors - 2] ) * 0.1; - } - else - { - values_ext[i] = values[i - 1]; - } - } + n_steps = n_colors; // Use the provided values. if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) { grid.xg = grid_axis; - grid.yg = values_ext; + grid.yg = values; grid.nx = 2; grid.ny = n_steps; ni = 2; @@ -1159,13 +1136,13 @@ { for ( j = 0; j < nj; j++ ) { - color_data[i][j] = values_ext[j]; + color_data[i][j] = values[j]; } } } else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) { - grid.xg = values_ext; + grid.xg = values; grid.yg = grid_axis; grid.nx = n_steps; grid.ny = 2; @@ -1176,7 +1153,7 @@ { for ( j = 0; j < nj; j++ ) { - color_data[i][j] = values_ext[i]; + color_data[i][j] = values[i]; } } } @@ -1187,7 +1164,7 @@ // Draw the color bar plshades( color_data, ni, nj, NULL, wx_min, wx_max, wy_min, wy_max, - values_ext, n_steps, 0, cont_color, cont_width, plfill, TRUE, + values, n_steps, 0, cont_color, cont_width, plfill, TRUE, pltr1, (void *) ( &grid ) ); plFree2dGrid( color_data, ni, nj ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-02-15 02:18:09
|
Revision: 11566 http://plplot.svn.sourceforge.net/plplot/?rev=11566&view=rev Author: airwin Date: 2011-02-15 02:18:02 +0000 (Tue, 15 Feb 2011) Log Message: ----------- Previously we have assumed that plgvpd returned the the values of the arguments of the last call to plvpor, but that assumption is not correct if there is more than one subpage per page. To fix this issue so that pllegend (and plcolorbar) give good results regardless of how the page is divided into subpages, define a new (static) function plgvpsp which always returns the values of the arguments of the last call to plvpor in all circumstances and replace all previous calls to plgvpd within pllegend.c by calls to plgvpsp. Substantial update of doxygen documentation. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-02-13 21:06:58 UTC (rev 11565) +++ trunk/src/pllegend.c 2011-02-15 02:18:02 UTC (rev 11566) @@ -29,20 +29,53 @@ #include "plplotP.h" //-------------------------------------------------------------------------- -//! Calculate parameters that help determine the position of the top left -//! of the legend in normalized viewport coordinates. +//! Determine arguments of the last call to plvpor. This gives a different +//! result than plgvpd if there is more than one subpage per page. //! +//! @param p_xmin Pointer to a location that contains (after the call) +//! the normalized subpage coordinate of the left-hand edge of the +//! viewport. +//! @param p_xmax Pointer to a location that contains (after the call) +//! the normalized subpage coordinate of the right-hand edge of the +//! viewport. +//! @param p_ymin Pointer to a location that contains (after the call) +//! the normalized subpage coordinate of the bottom edge of the +//! viewport. +//! @param p_ymax Pointer to a location that contains (after the call) +//! the normalized subpage coordinate of the top edge of the viewport. + +static void plgvpsp( PLFLT *p_xmin, PLFLT *p_xmax, PLFLT *p_ymin, PLFLT *p_ymax ) +{ + if ( plsc->level < 1 ) + { + plabort( "plgvpsp: Please call plinit first" ); + return; + } + if ( ( plsc->cursub <= 0 ) || ( plsc->cursub > ( plsc->nsubx * plsc->nsuby ) ) ) + { + plabort( "plgvpsp: Please call pladv or plenv to go to a subpage" ); + return; + } + *p_xmin = ( plsc->vpdxmi - plsc->spdxmi ) / ( plsc->spdxma - plsc->spdxmi ); + *p_xmax = ( plsc->vpdxma - plsc->spdxmi ) / ( plsc->spdxma - plsc->spdxmi ); + *p_ymin = ( plsc->vpdymi - plsc->spdymi ) / ( plsc->spdyma - plsc->spdymi ); + *p_ymax = ( plsc->vpdyma - plsc->spdymi ) / ( plsc->spdyma - plsc->spdymi ); +} + +//-------------------------------------------------------------------------- +//! Calculate parameters that help determine the position of the top +//! left of the legend in adopted coordinates. See pllegend +//! documentation for definition of adopted coordinates. +//! //! @param position Control variable containing valid combinations of the //! following control bits that specify the 16 standard positions of //! the legend: PL_POSITION_LEFT, PL_POSITION_RIGHT, PL_POSITION_TOP, //! PL_POSITION_BOTTOM, PL_POSITION_INSIDE, and PL_POSITION_OUTSIDE. -//! @param legend_width Total legend width in normalized viewport -//! coordinates. -//! @param legend_height Total legend height in normalized viewport -//! coordinates. +//! @param legend_width Total legend width in adopted coordinates. +//! @param legend_height Total legend height in adopted coordinates. //! @param x_legend_position Pointer to a location that contains -//! (after the call) the X value of one of the 16 standard legend -//! positions specified by position. +//! (after the call) the X value in adopted coordinates of +//! one of the 16 standard legend positions specified by position. //! @param y_legend_position Pointer to a location that contains //! (after the call) the Y equivalent of x_legend_position. //! @param xsign Pointer to a location that contains (after the call) @@ -58,13 +91,13 @@ { // xorigin, yorigin, xlegend, and ylegend are all calculated for // one of the 16 standard positions specified by position and are - // expressed in normalized viewport coordinates. xorigin is the X - // coordinate of the viewport reference point. yorigin is the Y - // coordinate of the viewport reference point. xlegend is the X + // expressed in adopted coordinates. xorigin is the X value of + // the reference point of the adopted coordinates. yorigin is the + // Y value of the reference point of the adopted coordinates. + // xlegend is the X coordinate of the top-left of the legend box + // relative to the legend box reference point. ylegend is the y // coordinate of the top-left of the legend box relative to the - // legend box reference point. ylegend is the y coordinate of the - // top-left of the legend box relative to the legend box reference - // point. + // legend box reference point. PLFLT xorigin, yorigin, xlegend, ylegend; // By default the sign of the x and y offsets is positive. @@ -268,7 +301,7 @@ PLFLT mxmin, mxmax, mymin, mymax; // Viewport limits in world coordinates PLFLT wxmin, wxmax, wymin, wymax; - plgvpd( &vxmin, &vxmax, &vymin, &vymax ); + plgvpsp( &vxmin, &vxmax, &vymin, &vymax ); plgspa( &mxmin, &mxmax, &mymin, &mymax ); plgvpw( &wxmin, &wxmax, &wymin, &wymax ); *x_subpage_per_mm = ( wxmax - wxmin ) / ( ( vxmax - vxmin ) * ( mxmax - mxmin ) ); @@ -303,62 +336,68 @@ } //-------------------------------------------------------------------------- -//! Convert from external normalized viewport X coordinate to normalized -//! subpage X coordinate. +//! Convert from adopted X coordinate to normalized subpage X +//! coordinate. See pllegend documentation for definition of adopted +//! coordinates. //! -//! @param nx External normalized viewport X coordinate. +//! @param nx Adopted X coordinate. //! -#define viewport_to_subpage_x( nx ) ( ( xdmin_adopted ) + ( nx ) * ( ( xdmax_adopted ) - ( xdmin_adopted ) ) ) +#define adopted_to_subpage_x( nx ) ( ( xdmin_adopted ) + ( nx ) * ( ( xdmax_adopted ) - ( xdmin_adopted ) ) ) //-------------------------------------------------------------------------- -//! Convert from normalized subpage X coordinate to external normalized -//! viewport X coordinate. +//! Convert from normalized subpage X coordinate to adopted X +//! coordinate. See pllegend documentation for definition of adopted +//! coordinates. //! //! @param nx Normalized subpage X coordinate. //! -#define subpage_to_viewport_x( nx ) ( ( nx - xdmin_adopted ) / ( ( xdmax_adopted ) - ( xdmin_adopted ) ) ) +#define subpage_to_adopted_x( nx ) ( ( nx - xdmin_adopted ) / ( ( xdmax_adopted ) - ( xdmin_adopted ) ) ) //-------------------------------------------------------------------------- -//! Convert from external normalized viewport Y coordinate to normalized -//! subpage Y coordinate. +//! Convert from adopted Y coordinate to normalized subpage Y +//! coordinate. //! -//! @param ny External normalized viewport Y coordinate. +//! @param ny Adopted Y coordinate. //! -#define viewport_to_subpage_y( ny ) ( ( ydmin_adopted ) + ( ny ) * ( ( ydmax_adopted ) - ( ydmin_adopted ) ) ) +#define adopted_to_subpage_y( ny ) ( ( ydmin_adopted ) + ( ny ) * ( ( ydmax_adopted ) - ( ydmin_adopted ) ) ) //-------------------------------------------------------------------------- -//! Convert from normalized subpage Y coordinate to external normalized -//! viewport Y coordinate. +//! Convert from normalized subpage Y coordinate to adopted Y +//! coordinate. //! //! @param ny Normalized subpage Y coordinate. //! -#define subpage_to_viewport_y( ny ) ( ( ny - ydmin_adopted ) / ( ( ydmax_adopted ) - ( ydmin_adopted ) ) ) +#define subpage_to_adopted_y( ny ) ( ( ny - ydmin_adopted ) / ( ( ydmax_adopted ) - ( ydmin_adopted ) ) ) //-------------------------------------------------------------------------- //! Plot discrete annotated legend using filled boxes, lines, and/or symbols. //! -//! @param p_legend_width Pointer to a location which contains -//! (after the call) the legend width in normalized viewport -//! coordinates. This quantity is calculated from the plot_width and -//! text_offset arguments, the ncolumn argument (possibly modified -//! inside the routine depending on the nlegend and nrow arguments), -//! and the length (calculated internally) of the longest text string. +//! @param p_legend_width Pointer to a location which contains (after +//! the call) the legend width in adopted coordinates. (These are +//! normalized external viewport coordinates if the +//! PL_POSITION_VIEWPORT bit is set within the position argument or +//! normalized subpage coordinates if the PL_POSITION_SUBPAGE bit is +//! set within the position argument.) This quantity is calculated +//! from the plot_width and text_offset arguments, the ncolumn +//! argument (possibly modified inside the routine depending on the +//! nlegend and nrow arguments), and the length (calculated +//! internally) of the longest text string. //! @param p_legend_height Pointer to a location which contains (after -//! the call) the legend height in normalized viewport coordinates. -//! This quantity is calculated from the text_scale and text_spacing arguments -//! and the nrow argument (possibly modified inside the routine depending -//! on the nlegend and ncolum arguments). +//! the call) the legend height in adopted coordinates. This +//! quantity is calculated from the text_scale and text_spacing +//! arguments and the nrow argument (possibly modified inside the +//! routine depending on the nlegend and ncolumn arguments). //! @param position This variable contains bits which control the //! overall position of the legend. The combination of the //! PL_POSITION_LEFT, PL_POSITION_RIGHT, PL_POSITION_TOP, //! PL_POSITION_BOTTOM, PL_POSITION_INSIDE, and PL_POSITION_OUTSIDE //! position bits specifies one of the 16 possible standard positions //! (the 4 corners and 4 side centers for both the inside and outside -//! cases) of the legend relative to the viewport. +//! cases) of the legend relative to the adopted coordinate system. //! @param opt This variable contains bits which control the overall //! legend. If the PL_LEGEND_TEXT_LEFT bit is set, put the text area //! on the left of the legend and the plotted area on the right. @@ -369,25 +408,25 @@ //! legend. If the PL_LEGEND_ROW_MAJOR bit is set and both of the //! (possibly internally transformed) nrow > 1 and ncolumn > 1, then //! plot the resulting array of legend entries in row-major order. -//! @param x X offset of the legend position in normalized viewport -//! coordinates from the specified standard position of the legend. -//! For positive x, the direction of motion away from the standard -//! position is inward/outward from the standard corner positions or -//! standard center-left or center-right positions if the +//! @param x X offset of the legend position in adopted coordinates +//! from the specified standard position of the legend. For positive +//! x, the direction of motion away from the standard position is +//! inward/outward from the standard corner positions or standard +//! center-left or center-right positions if the //! PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit is set in opt. For the //! center-upper or center-lower cases, the direction of motion is //! toward positive X. -//! @param y Y offset of the legend position in normalized viewport -//! coordinates from the specified standard position of the legend. -//! For positive y, the direction of motion away from the standard -//! position is inward/outward from the standard corner positions or -//! standard center-upper or center-lower positions if the +//! @param y Y offset of the legend position in adopted coordinates +//! from the specified standard position of the legend. For positive +//! y, the direction of motion away from the standard position is +//! inward/outward from the standard corner positions or standard +//! center-upper or center-lower positions if the //! PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit is set in opt. For the //! center-left or center-right cases, the direction of motion is //! toward positive Y. -//! @param plot_width Horizontal width in normalized viewport units -//! of the plot area (where colored boxes, lines, and/or symbols are -//! drawn in the legend). +//! @param plot_width Horizontal width in adopted coordinates of the +//! plot area (where colored boxes, lines, and/or symbols are drawn in +//! the legend). //! @param bg_color Cmap0 index of the background color for the legend //! (PL_LEGEND_BACKGROUND). //! @param bb_color Cmap0 index of the color of the bounding-box @@ -497,9 +536,8 @@ // Saved external normalized coordinates of viewport. // (These are actual values used only for the restore.) PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; - // Saved external normalized coordinates of viewport. - // (These are adopted values used to calculate all coordinate - // transformations.) + // Limits of adopted coordinates used to calculate all coordinate + // transformations. PLFLT xdmin_adopted, xdmax_adopted, ydmin_adopted, ydmax_adopted; PLFLT x_subpage_per_mm, y_subpage_per_mm, text_width0 = 0., text_width; @@ -564,19 +602,20 @@ // xdmin_save, etc., are the actual external relative viewport // coordinates within the current sub-page used only for // restoration at the end. - plgvpd( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + + // Choose adopted coordinates. if ( position & PL_POSITION_SUBPAGE ) plvpor( 0., 1., 0., 1. ); - // xdmin_adopted, etc., are the adopted external relative viewport - // coordinates within the current sub-page used for all coordinate - // transformations. + // xdmin_adopted, etc., are the adopted coordinates within the + // current sub-page used for all coordinate transformations. // If position & PL_POSITION_VIEWPORT is true, these coordinates // are the external relative viewport coordinates. // If position & PL_POSITION_SUBPAGE is true, these // coordinates are the relative subpage coordinates. - plgvpd( &xdmin_adopted, &xdmax_adopted, &ydmin_adopted, &ydmax_adopted ); + plgvpsp( &xdmin_adopted, &xdmax_adopted, &ydmin_adopted, &ydmax_adopted ); // xwmin_save, etc., are the external world coordinates corresponding // to the external viewport boundaries. @@ -632,21 +671,20 @@ // Total width and height of legend area in normalized subpage coordinates. legend_width = 2. * width_border + ( ncolumn - 1 ) * column_separation + ncolumn * ( text_width + - viewport_to_subpage_x( plot_width ) - viewport_to_subpage_x( 0. ) ); + adopted_to_subpage_x( plot_width ) - adopted_to_subpage_x( 0. ) ); legend_height = nrow * text_spacing * character_height; - // Total width and height of legend area in normalized external viewport - // coordinates. + // Total width and height of legend area in adopted coordinates. - legend_width_vc = subpage_to_viewport_x( legend_width ) - subpage_to_viewport_x( 0. ); - legend_height_vc = subpage_to_viewport_y( legend_height ) - subpage_to_viewport_y( 0. ); + legend_width_vc = subpage_to_adopted_x( legend_width ) - subpage_to_adopted_x( 0. ); + legend_height_vc = subpage_to_adopted_y( legend_height ) - subpage_to_adopted_y( 0. ); *p_legend_width = legend_width_vc; *p_legend_height = legend_height_vc; // dcolumn is the spacing from one column to the next and // drow is the spacing from one row to the next. dcolumn = column_separation + text_width + - viewport_to_subpage_x( plot_width ) - viewport_to_subpage_x( 0. ); + adopted_to_subpage_x( plot_width ) - adopted_to_subpage_x( 0. ); drow = text_spacing * character_height; legend_position( position, legend_width_vc, legend_height_vc, &x_legend_position, &y_legend_position, &xsign, &ysign ); @@ -654,16 +692,16 @@ plot_y = y * ysign + y_legend_position; plot_x_end = plot_x + plot_width; // Normalized subpage coordinates for legend plots - plot_x_subpage = viewport_to_subpage_x( plot_x ); - plot_y_subpage = viewport_to_subpage_y( plot_y ); - plot_x_end_subpage = viewport_to_subpage_x( plot_x_end ); + plot_x_subpage = adopted_to_subpage_x( plot_x ); + plot_y_subpage = adopted_to_subpage_y( plot_y ); + plot_x_end_subpage = adopted_to_subpage_x( plot_x_end ); // Get normalized subpage positions of the start of the legend text text_x = plot_x_end; text_y = plot_y; - text_x_subpage = viewport_to_subpage_x( text_x ) + + text_x_subpage = adopted_to_subpage_x( text_x ) + text_offset * character_width; - text_y_subpage = viewport_to_subpage_y( text_y ); + text_y_subpage = adopted_to_subpage_y( text_y ); if ( opt & PL_LEGEND_BACKGROUND ) { @@ -853,7 +891,7 @@ PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; // Saved world coordinates of viewport. PLFLT xwmin_save, xwmax_save, ywmin_save, ywmax_save; - plgvpd( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); // Use the entire sub-page, and make world coordinates 0.0 -> 1.0 @@ -985,7 +1023,7 @@ PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; // Saved world coordinates of viewport. PLFLT xwmin_save, xwmax_save, ywmin_save, ywmax_save; - plgvpd( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); // Active attributes to be saved and restored afterward. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-02-18 19:31:10
|
Revision: 11567 http://plplot.svn.sourceforge.net/plplot/?rev=11567&view=rev Author: airwin Date: 2011-02-18 19:31:03 +0000 (Fri, 18 Feb 2011) Log Message: ----------- Substantial update of doxygen documentation of pllegend to make it consistent (again) with the current pllegend API and implementation. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-02-15 02:18:02 UTC (rev 11566) +++ trunk/src/pllegend.c 2011-02-18 19:31:03 UTC (rev 11567) @@ -357,7 +357,8 @@ //-------------------------------------------------------------------------- //! Convert from adopted Y coordinate to normalized subpage Y -//! coordinate. +//! coordinate. See pllegend documentation for definition of adopted +//! coordinates. //! //! @param ny Adopted Y coordinate. //! @@ -366,7 +367,8 @@ //-------------------------------------------------------------------------- //! Convert from normalized subpage Y coordinate to adopted Y -//! coordinate. +//! coordinate. See pllegend documentation for definition of adopted +//! coordinates. //! //! @param ny Normalized subpage Y coordinate. //! @@ -374,17 +376,16 @@ #define subpage_to_adopted_y( ny ) ( ( ny - ydmin_adopted ) / ( ( ydmax_adopted ) - ( ydmin_adopted ) ) ) //-------------------------------------------------------------------------- -//! Plot discrete annotated legend using filled boxes, lines, and/or symbols. +//! Plot legend using discretely annotated filled boxes, lines, and/or symbols. //! +//! (N.B. the adopted coordinate system used for some of the parameters +//! is defined in the documentation of the position parameter.) +//! //! @param p_legend_width Pointer to a location which contains (after -//! the call) the legend width in adopted coordinates. (These are -//! normalized external viewport coordinates if the -//! PL_POSITION_VIEWPORT bit is set within the position argument or -//! normalized subpage coordinates if the PL_POSITION_SUBPAGE bit is -//! set within the position argument.) This quantity is calculated -//! from the plot_width and text_offset arguments, the ncolumn -//! argument (possibly modified inside the routine depending on the -//! nlegend and nrow arguments), and the length (calculated +//! the call) the legend width in adopted coordinates. This quantity +//! is calculated from the plot_width and text_offset arguments, the +//! ncolumn argument (possibly modified inside the routine depending +//! on the nlegend and nrow arguments), and the length (calculated //! internally) of the longest text string. //! @param p_legend_height Pointer to a location which contains (after //! the call) the legend height in adopted coordinates. This @@ -392,12 +393,22 @@ //! arguments and the nrow argument (possibly modified inside the //! routine depending on the nlegend and ncolumn arguments). //! @param position This variable contains bits which control the -//! overall position of the legend. The combination of the +//! overall position of the legend and the definition of the adopted +//! coordinates used for positions. The combination of the //! PL_POSITION_LEFT, PL_POSITION_RIGHT, PL_POSITION_TOP, //! PL_POSITION_BOTTOM, PL_POSITION_INSIDE, and PL_POSITION_OUTSIDE -//! position bits specifies one of the 16 possible standard positions -//! (the 4 corners and 4 side centers for both the inside and outside -//! cases) of the legend relative to the adopted coordinate system. +//! bits specifies one of the 16 possible standard positions (the 4 +//! corners and 4 side centers for both the inside and outside cases) +//! of the legend relative to the adopted coordinate system. The +//! adopted coordinates are normalized viewport coordinates if the +//! PL_POSITION_VIEWPORT bit is set or normalized subpage coordinates +//! if the PL_POSITION_SUBPAGE bit is set. Default position bits: If +//! none of PL_POSITION_LEFT, PL_POSITION_RIGHT, PL_POSITION_TOP, or +//! PL_POSITION_BOTTOM are set, then use the combination of +//! PL_POSITION_RIGHT and PL_POSITION_TOP. If neither of +//! PL_POSITION_INSIDE or PL_POSITION_OUTSIDE is set, use +//! PL_POSITION_INSIDE. If neither of PL_POSITION_VIEWPORT or +//! PL_POSITION_SUBPAGE is set, use PL_POSITION_VIEWPORT. //! @param opt This variable contains bits which control the overall //! legend. If the PL_LEGEND_TEXT_LEFT bit is set, put the text area //! on the left of the legend and the plotted area on the right. @@ -411,19 +422,17 @@ //! @param x X offset of the legend position in adopted coordinates //! from the specified standard position of the legend. For positive //! x, the direction of motion away from the standard position is -//! inward/outward from the standard corner positions or standard -//! center-left or center-right positions if the -//! PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit is set in opt. For the -//! center-upper or center-lower cases, the direction of motion is -//! toward positive X. +//! inward/outward from the standard corner positions or standard left +//! or right positions if the PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit +//! is set in opt. For the top or bottom cases, the direction of +//! motion for positive x is toward positive X. //! @param y Y offset of the legend position in adopted coordinates //! from the specified standard position of the legend. For positive //! y, the direction of motion away from the standard position is -//! inward/outward from the standard corner positions or standard -//! center-upper or center-lower positions if the -//! PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit is set in opt. For the -//! center-left or center-right cases, the direction of motion is -//! toward positive Y. +//! inward/outward from the standard corner positions or standard top +//! or bottom positions if the PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit +//! is set in opt. For the left or right cases, the direction of +//! motion for positive y is toward positive Y. //! @param plot_width Horizontal width in adopted coordinates of the //! plot area (where colored boxes, lines, and/or symbols are drawn in //! the legend). This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-02-19 18:27:37
|
Revision: 11569 http://plplot.svn.sourceforge.net/plplot/?rev=11569&view=rev Author: hezekiahcarty Date: 2011-02-19 18:27:31 +0000 (Sat, 19 Feb 2011) Log Message: ----------- Basic doxygen documentation for the current state of plcolorbar This interface is likely to change significantly before the plcolorbar API is finalized, but this documents the current state of the plcolorbar code. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-02-19 16:58:37 UTC (rev 11568) +++ trunk/src/pllegend.c 2011-02-19 18:27:31 UTC (rev 11569) @@ -996,21 +996,62 @@ //-------------------------------------------------------------------------- //! Plot color bar for image, shade or gradient plots. //! -//! @param position TODO -//! @param opt TODO -//! @param x TODO -//! @param y TODO -//! @param length TODO -//! @param width TODO -//! @param cont_color TODO -//! @param cont_width TODO -//! @param ticks TODO -//! @param sub_ticks TODO -//! @param axis_opts TODO -//! @param label TODO -//! @param n_colors TODO -//! @param colors TODO -//! @param values TODO +//! @param position This variable defines the placement of the colorbar on the +//! subpage. The position can be one of PL_POSITION_TOP, +//! PL_POSITION_BOTTOM, PL_POSITION_LEFT or PL_POSITION_RIGHT. The colorbar +//! will be drawn perpendicular to the given side of the subpage. +//! @param opt This variable contains bits which control the overall colorbar. +//! The type of colorbar can be specified with PL_COLORBAR_SHADE, +//! PL_COLORBAR_IMAGE or PL_COLORBAR_GRADIENT. The position of the (optional) +//! label/title can be specified with +//! PL_COLORBAR_LABEL_(LEFT|RIGHT|TOP|BOTTOM). If no label position is +//! specified then no label will be drawn. End-caps for the colorbar can +//! added with PL_COLORBAR_CAP_LOW and PL_COLORBAR_CAP_HIGH. If a particular +//! colorbar cap option is not specified then no cap will be drawn for that +//! end. As a special case for PL_COLORBAR_SHADE, the option +//! PL_COLORBAR_SHADE_LABEL can be specified. If this option is provided then +//! any tick marks and tick labels will be placed at the breaks between shaded +//! segments. TODO: This should be expanded to support custom placement of +//! tick marks and tick labels at custom value locations for any colorbar type. +//! @param x Colorbar displacement distance along/away from the horizonal axis +//! in normalized subpage coordinates. +//! @param y Colorbar displacement distance along/away from the vertical axis +//! in normalized subpage coordinates. +//! @param length Length of the colorbar along its major axis (ex. along the +//! top of the subpage if pos is PL_POSITION_TOP) in normalized subpage +//! coordinates. +//! @param width Width of the colorbar along the minor axis (ex. fraction of +//! the vertical subpage size if pos is PL_POSITION_TOP) in normalized subpage +//! coordinates. +//! @param cont_color Contour color for PL_COLORBAR_SHADE plots. This is +//! passed directly to plshades, so it will be interpreted according to the +//! design of plshades. +//! @param cont_width Contour width for PL_COLORBAR_SHADE plots. This is +//! passed directly to plshades, so it will be interpreted according to the +//! design of plshades. +//! @param ticks Spacing of major ticks, as for plbox. +//! @param sub_ticks Number of subticks, as for plbox. +//! @param axis_opts Axis options for the colorbar's major axis, as for plbox. +//! @param label Text label for the colorbar. No title is drawn if no label +//! position is specified in pos. +//! @param n_colors Number of elements in the colors and values arrays. +//! @param colors Colors (color map 1) used to draw the colorbar. If this is a +//! PL_COLORBAR_SHADE bar then there should be one entry per break between +//! segments. If this +//! is a PL_COLORBAR_IMAGE or PL_COLORBAR_GRADIENT bar then there should be two +//! elements - one to specify the high end and one to specify the low end. +//! TODO: Due to a deficiency in plimage, plimagefr, plshades and plgradient, +//! the high and low values for colors don't have the effect that they should. +//! Each colorbar will always span the follow range of color map 1. This +//! should be fixed with new, more flexible implementations of plimage, +//! plimagefr, plshades and plgradient which use user-provided minimum and +//! maximum colors for their range instead of keeping the minimum color fixed +//! as 0.0 and the maximum fixed as 1.0. +//! @param values Numeric values for the data range represented by the +//! colorbar. For PL_COLORBAR_SHADE, this should include one value per break +//! between segments. For PL_COLORBAR_IMAGE and PL_COLORBAR_GRADIENT this +//! include two values, one for the maximum value on the scale and one for the +//! minimum value. //! void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-02-19 18:28:06
|
Revision: 11570 http://plplot.svn.sourceforge.net/plplot/?rev=11570&view=rev Author: hezekiahcarty Date: 2011-02-19 18:28:00 +0000 (Sat, 19 Feb 2011) Log Message: ----------- Restore the previous colormap 0 drawing color in plcolorbar Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-02-19 18:27:31 UTC (rev 11569) +++ trunk/src/pllegend.c 2011-02-19 18:28:00 UTC (rev 11570) @@ -1486,6 +1486,7 @@ } // Restore + plcol0( col0_save ); plvpor( xdmin_save, xdmax_save, ydmin_save, ydmax_save ); plwind( xwmin_save, xwmax_save, ywmin_save, ywmax_save ); plsmaj( 0.0, maj_save ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-02-19 18:28:34
|
Revision: 11571 http://plplot.svn.sourceforge.net/plplot/?rev=11571&view=rev Author: hezekiahcarty Date: 2011-02-19 18:28:28 +0000 (Sat, 19 Feb 2011) Log Message: ----------- Add some more detail to the code comments in plcolorbar Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-02-19 18:28:00 UTC (rev 11570) +++ trunk/src/pllegend.c 2011-02-19 18:28:28 UTC (rev 11571) @@ -1046,7 +1046,8 @@ //! should be fixed with new, more flexible implementations of plimage, //! plimagefr, plshades and plgradient which use user-provided minimum and //! maximum colors for their range instead of keeping the minimum color fixed -//! as 0.0 and the maximum fixed as 1.0. +//! as 0.0 and the maximum fixed as 1.0. The net effect of this is that the +//! values in colors do not have the effect they should at this time. //! @param values Numeric values for the data range represented by the //! colorbar. For PL_COLORBAR_SHADE, this should include one value per break //! between segments. For PL_COLORBAR_IMAGE and PL_COLORBAR_GRADIENT this @@ -1087,7 +1088,8 @@ // coordinates). PLFLT vx_min, vx_max, vy_min, vy_max; PLFLT wx_min, wx_max, wy_min, wy_max; - // Build the proper viewport and window dimensions + // Build the proper viewport and window dimension along the requested side + // of the subpage if ( position & PL_POSITION_LEFT ) { vx_min = x; @@ -1137,7 +1139,7 @@ plabort( "plcolorbar: Invalid or missing side" ); } - // The window should take up the whole viewport + // The window used to draw the colorbar should take up the whole viewport plvpor( vx_min, vx_max, vy_min, vy_max ); plwind( wx_min, wx_max, wy_min, wy_max ); @@ -1235,6 +1237,10 @@ else if ( opt & PL_COLORBAR_SHADE ) { // Transform grid + // The transform grid is used to make the size of the shaded segments + // scale relative to other segments. For example, if segment A + // makes up 10% of the scale and segment B makes up 20% of the scale + // then segment B will be twice the length of segment A. PLcGrid grid; PLFLT grid_axis[2] = { 0.0, 1.0 }; n_steps = n_colors; @@ -1296,12 +1302,15 @@ xs[3] = wx_min; ys[3] = wy_max; PLFLT angle; + // Make sure the gradient runs in the proper direction if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) { + // Top to bottom angle = 90.0; } else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) { + // Left to right angle = 0.0; } else @@ -1322,7 +1331,7 @@ if ( opt & PL_COLORBAR_CAP_LOW ) { // Add an extra offset for the label so it does not bump in to the - // cap. + // cap if the label is placed on the same side as the cap. if ( ( ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) && opt & PL_COLORBAR_LABEL_BOTTOM ) || ( ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) && @@ -1336,7 +1345,7 @@ else if ( opt & PL_COLORBAR_CAP_HIGH ) { // Add an extra offset for the label so it does not bump in to the - // cap. + // cap if the label is placed on the same side as the cap. if ( ( ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) && opt & PL_COLORBAR_LABEL_TOP ) || ( ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) && @@ -1463,7 +1472,7 @@ } } - // Draw the boxes, etc. + // Draw the outline for the entire colorbar, tick marks, tick labels. if ( position & PL_POSITION_LEFT ) { snprintf( opt_string, max_opts, "bc%s%s", tick_string, axis_opts ); @@ -1485,7 +1494,7 @@ plbox( opt_string, ticks, sub_ticks, "bc", 0.0, 0 ); } - // Restore + // Restore previous plot characteristics. plcol0( col0_save ); plvpor( xdmin_save, xdmax_save, ydmin_save, ydmax_save ); plwind( xwmin_save, xwmax_save, ywmin_save, ywmax_save ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-03-10 18:46:40
|
Revision: 11614 http://plplot.svn.sourceforge.net/plplot/?rev=11614&view=rev Author: airwin Date: 2011-03-10 18:46:33 +0000 (Thu, 10 Mar 2011) Log Message: ----------- Tweak doxygen documentation. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-03-08 23:54:25 UTC (rev 11613) +++ trunk/src/pllegend.c 2011-03-10 18:46:33 UTC (rev 11614) @@ -416,31 +416,31 @@ //! plotted area on the left. If the PL_LEGEND_BACKGROUND bit is set, //! plot a (semi-transparent) background for the legend. If the //! PL_LEGEND_BOUNDING_BOX bit is set, plot a bounding box for the -//! legend. If the PL_LEGEND_ROW_MAJOR bit is set and both of the -//! (possibly internally transformed) nrow > 1 and ncolumn > 1, then +//! legend. If the PL_LEGEND_ROW_MAJOR bit is set and both (of the +//! possibly internally transformed) nrow > 1 and ncolumn > 1, then //! plot the resulting array of legend entries in row-major order. //! @param x X offset of the legend position in adopted coordinates //! from the specified standard position of the legend. For positive //! x, the direction of motion away from the standard position is //! inward/outward from the standard corner positions or standard left -//! or right positions if the PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit -//! is set in opt. For the top or bottom cases, the direction of -//! motion for positive x is toward positive X. +//! or right positions if the PL_POSITION_INSIDE/PL_POSITION_OUTSIDE +//! bit is set in position. For the standard top or bottom positions, +//! the direction of motion for positive x is toward positive X. //! @param y Y offset of the legend position in adopted coordinates //! from the specified standard position of the legend. For positive //! y, the direction of motion away from the standard position is //! inward/outward from the standard corner positions or standard top -//! or bottom positions if the PL_LEGEND_INSIDE/PL_LEGEND_OUTSIDE bit -//! is set in opt. For the left or right cases, the direction of -//! motion for positive y is toward positive Y. +//! or bottom positions if the PL_POSITION_INSIDE/PL_POSITION_OUTSIDE +//! bit is set in position. For the standard left or right positions, +//! the direction of motion for positive y is toward positive Y. //! @param plot_width Horizontal width in adopted coordinates of the //! plot area (where colored boxes, lines, and/or symbols are drawn in //! the legend). -//! @param bg_color Cmap0 index of the background color for the legend +//! @param bg_color The cmap0 index of the background color for the legend //! (PL_LEGEND_BACKGROUND). -//! @param bb_color Cmap0 index of the color of the bounding-box +//! @param bb_color The cmap0 index of the color of the bounding-box //! line for the legend (PL_LEGEND_BOUNDING_BOX). -//! @param bb_style pllsty style number for the bounding-box line +//! @param bb_style The pllsty style number for the bounding-box line //! for the legend (PL_LEGEND_BOUNDING_BOX). //! @param nrow Number of rows in the matrix used to render the //! nlegend legend entries. For internal transformations of nrow, see This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-03-16 21:48:39
|
Revision: 11634 http://plplot.svn.sourceforge.net/plplot/?rev=11634&view=rev Author: airwin Date: 2011-03-16 21:48:33 +0000 (Wed, 16 Mar 2011) Log Message: ----------- Tweak doxygen documentation of the pllegend procedure. As far as I know, this finishes the doxygen documentation of this procedure and everything else in pllegend.c except for plcolorbar where more changes are expected. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-03-16 21:45:38 UTC (rev 11633) +++ trunk/src/pllegend.c 2011-03-16 21:48:33 UTC (rev 11634) @@ -419,6 +419,7 @@ //! legend. If the PL_LEGEND_ROW_MAJOR bit is set and both (of the //! possibly internally transformed) nrow > 1 and ncolumn > 1, then //! plot the resulting array of legend entries in row-major order. +//! Otherwise, plot the legend entries in column-major order. //! @param x X offset of the legend position in adopted coordinates //! from the specified standard position of the legend. For positive //! x, the direction of motion away from the standard position is @@ -477,8 +478,8 @@ //! @param text_colors Array of nlegend text colors (cmap0 indices). //! @param text Array of nlegend pointers to null-terminated text //! annotation strings. Like other PLplot strings specified by the -//! user, UTF-8 or its ascii subset may be used in the strings, and -//! the strings may include any of the PLplot text escapes. +//! user, the string must be UTF-8 (including its ascii subset) and +//! may include any of the PLplot text escapes. //! @param box_colors Array of nlegend colors (cmap0 indices) for //! the discrete colored boxes (PL_LEGEND_COLOR_BOX). //! @param box_patterns Array of nlegend patterns (plpsty indices) @@ -502,8 +503,8 @@ //! @param symbols Array of nlegend pointers to null-terminated //! strings which represent the glyph for the symbol to be plotted //! (PL_LEGEND_SYMBOL). Like other PLplot strings specified by the -//! user, UTF-8 or its ascii subset may be used in the strings, and -//! the strings may include any of the PLplot text escapes. +//! user, the string must be UTF-8 (including its ascii subset) and +//! may include any of the PLplot text escapes. //! void This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <hez...@us...> - 2011-04-22 04:49:05
|
Revision: 11720 http://plplot.svn.sourceforge.net/plplot/?rev=11720&view=rev Author: hezekiahcarty Date: 2011-04-22 04:48:59 +0000 (Fri, 22 Apr 2011) Log Message: ----------- Position colorbar labels a bit closer to the bar in some cases If there are no ticks between the label and the colorbar, bring the label in a bit closer. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-04-22 04:48:51 UTC (rev 11719) +++ trunk/src/pllegend.c 2011-04-22 04:48:59 UTC (rev 11720) @@ -1386,7 +1386,10 @@ { if ( position & PL_POSITION_RIGHT || position & PL_POSITION_LEFT ) { - label_offset += 4.0; + if ( position & PL_POSITION_LEFT ) + label_offset += 4.0; + else + label_offset += 2.0; perp = '\0'; just = 0.5; } @@ -1403,7 +1406,10 @@ { if ( position & PL_POSITION_RIGHT || position & PL_POSITION_LEFT ) { - label_offset += 4.0; + if ( position & PL_POSITION_RIGHT ) + label_offset += 4.0; + else + label_offset += 2.0; perp = '\0'; just = 0.5; } @@ -1425,7 +1431,10 @@ } else { - label_offset += 4.0; + if ( position & PL_POSITION_TOP ) + label_offset += 4.0; + else + label_offset += 2.0; perp = '\0'; } snprintf( opt_string, max_opts, "t%c", perp ); @@ -1440,7 +1449,10 @@ } else { - label_offset += 4.0; + if ( position & PL_POSITION_BOTTOM ) + label_offset += 4.0; + else + label_offset += 2.0; perp = '\0'; } snprintf( opt_string, max_opts, "b%c", perp ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-04-26 17:00:37
|
Revision: 11723 http://plplot.svn.sourceforge.net/plplot/?rev=11723&view=rev Author: airwin Date: 2011-04-26 17:00:30 +0000 (Tue, 26 Apr 2011) Log Message: ----------- Duplicate plcolorbar code without changing it. The first version of the code is used (and the second version ignored) because the PL_COLORBAR_NEW_API macro is #defined. The code duplication implemented with this commit prepares for making experimental changes in the PL_COLORBAR_NEW_API version of the code to attempt to reorganize the API. If these API ideas pan out, then the old code will be removed, but if not, the PL_COLORBAR_NEW_API code will be removed. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-04-22 18:33:27 UTC (rev 11722) +++ trunk/src/pllegend.c 2011-04-26 17:00:30 UTC (rev 11723) @@ -879,6 +879,9 @@ return; } +#define PL_COLORBAR_NEW_API +#ifdef PL_COLORBAR_NEW_API +// Code version with reorganized API for plcolorbar //-------------------------------------------------------------------------- //! Draw triangular end-caps for color bars. //! @@ -1528,3 +1531,655 @@ return; } +#else +// Code version without reorganized API for plcolorbar +//-------------------------------------------------------------------------- +//! Draw triangular end-caps for color bars. +//! +//! @param position This variable defines the placement of the colorbar on the +//! subpage. The position can be one of PL_POSITION_TOP, +//! PL_POSITION_BOTTOM, PL_POSITION_LEFT or PL_POSITION_RIGHT. The colorbar +//! will be drawn perpendicular to the given side of the subpage. +//! @param opt This variable can be PL_COLORBAR_CAP_LOW or +//! PL_COLORBAR_CAP_HIGH, indicating whether we are drawing a low-end cap or a +//! high-end cap. +//! @param a1 First primary coordinate for the end cap base. If position +//! is PL_POSITION_LEFT or PL_POSITION_RIGHT then a1 and a2 are x coordinates. +//! if position is PL_POSITION_TOP or PL_POSITION_BOTTOM then a1 and a2 are y +//! coordinates. (a1, b) and (a2, b) OR (b, a1) and (b, a2) define the base of +//! the triangular cap. +//! @param a2 Second primary coordinate for the end cap base. +//! @param b Secondary coordinate for the end cap base. If a1 and a2 are x, +//! b is y. If a1 and a2 are y, b is x. +//! @param color Color (color palette 1) used to fill the end cap. +//! + +void +draw_cap( PLINT position, PLINT opt, PLFLT a1, PLFLT a2, PLFLT b, PLFLT color ) +{ + // Height the cap in normalized coordinates + PLFLT cap_height = 0.05; + + // Save drawing color + PLINT col0_save = plsc->icol0; + + // Save window and viewport + // Saved normalized coordinates of viewport. + PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; + // Saved world coordinates of viewport. + PLFLT xwmin_save, xwmax_save, ywmin_save, ywmax_save; + plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); + + // Use the entire sub-page, and make world coordinates 0.0 -> 1.0 + // This way the location and orientation of the cap can be easily + // defined by a combination of position, opt, a1, a2 and b. + plvpor( 0.0, 1.0, 0.0, 1.0 ); + plwind( 0.0, 1.0, 0.0, 1.0 ); + + // Points for the triangle + PLFLT xs[3]; + PLFLT ys[3]; + + plcol1( color ); + + if ( opt & PL_COLORBAR_CAP_LOW ) + { + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + // Draw the cap on the bottom + xs[0] = a1; + ys[0] = b; + xs[2] = a2; + ys[2] = b; + xs[1] = ( xs[0] + xs[2] ) / 2.0; + ys[1] = ys[0] - cap_height; + + plfill( 3, xs, ys ); + } + else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) + { + // Draw the cap on the left + xs[0] = b; + ys[0] = a1; + xs[2] = b; + ys[2] = a2; + xs[1] = xs[0] - cap_height; + ys[1] = ( ys[0] + ys[2] ) / 2.0; + + plfill( 3, xs, ys ); + } + } + else if ( opt & PL_COLORBAR_CAP_HIGH ) + { + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + // Draw the cap on the top + xs[0] = a1; + ys[0] = b; + xs[2] = a2; + ys[2] = b; + xs[1] = ( xs[0] + xs[2] ) / 2.0; + ys[1] = ys[0] + cap_height; + + plfill( 3, xs, ys ); + } + else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) + { + // Draw the cap on the right + xs[0] = b; + ys[0] = a1; + xs[2] = b; + ys[2] = a2; + xs[1] = xs[0] + cap_height; + ys[1] = ( ys[0] + ys[2] ) / 2.0; + + plfill( 3, xs, ys ); + } + } + + // Restore the drawing color + plcol0( col0_save ); + + // Draw cap outline + plline( 3, xs, ys ); + + // Restore window and viewport + plvpor( xdmin_save, xdmax_save, ydmin_save, ydmax_save ); + plwind( xwmin_save, xwmax_save, ywmin_save, ywmax_save ); +} + +//-------------------------------------------------------------------------- +//! Plot color bar for image, shade or gradient plots. +//! +//! @param opt This variable contains bits which control the overall colorbar. +//! The type of colorbar can be specified with PL_COLORBAR_SHADE, +//! PL_COLORBAR_IMAGE or PL_COLORBAR_GRADIENT. The position of the (optional) +//! label/title can be specified with +//! PL_COLORBAR_LABEL_(LEFT|RIGHT|TOP|BOTTOM). If no label position is +//! specified then no label will be drawn. End-caps for the colorbar can +//! added with PL_COLORBAR_CAP_LOW and PL_COLORBAR_CAP_HIGH. If a particular +//! colorbar cap option is not specified then no cap will be drawn for that +//! end. As a special case for PL_COLORBAR_SHADE, the option +//! PL_COLORBAR_SHADE_LABEL can be specified. If this option is provided then +//! any tick marks and tick labels will be placed at the breaks between shaded +//! segments. TODO: This should be expanded to support custom placement of +//! tick marks and tick labels at custom value locations for any colorbar type. +//! @param position This variable defines the placement of the colorbar on the +//! subpage. The position can be one of PL_POSITION_TOP, +//! PL_POSITION_BOTTOM, PL_POSITION_LEFT or PL_POSITION_RIGHT. The colorbar +//! will be drawn perpendicular to the given side of the subpage. +//! @param x Colorbar displacement distance along/away from the horizonal axis +//! in normalized subpage coordinates. +//! @param y Colorbar displacement distance along/away from the vertical axis +//! in normalized subpage coordinates. +//! @param length Length of the colorbar along its major axis (ex. along the +//! top of the subpage if pos is PL_POSITION_TOP) in normalized subpage +//! coordinates. +//! @param width Width of the colorbar along the minor axis (ex. fraction of +//! the vertical subpage size if pos is PL_POSITION_TOP) in normalized subpage +//! coordinates. +//! @param low_cap_color Color of the low-end color bar cap, if it is drawn. +//! @param high_cap_color Color of the high-end color bar cap, if it is drawn. +//! @param cont_color Contour color for PL_COLORBAR_SHADE plots. This is +//! passed directly to plshades, so it will be interpreted according to the +//! design of plshades. +//! @param cont_width Contour width for PL_COLORBAR_SHADE plots. This is +//! passed directly to plshades, so it will be interpreted according to the +//! design of plshades. +//! @param ticks Spacing of major ticks, as for plbox. +//! @param sub_ticks Number of subticks, as for plbox. +//! @param axis_opts Axis options for the colorbar's major axis, as for plbox. +//! @param label Text label for the colorbar. No title is drawn if no label +//! position is specified in pos. +//! @param n_values Number of elements in the values array. +//! @param colors Colors (color map 1) used to draw the colorbar. If this is a +//! PL_COLORBAR_SHADE bar then there should be one entry per break between +//! segments. If this +//! is a PL_COLORBAR_IMAGE or PL_COLORBAR_GRADIENT bar then there should be two +//! elements - one to specify the high end and one to specify the low end. +//! This should have (n_values - 1) elements. +//! @param values Numeric values for the data range represented by the +//! colorbar. For PL_COLORBAR_SHADE, this should include one value per break +//! between segments. For PL_COLORBAR_IMAGE and PL_COLORBAR_GRADIENT this +//! include two values, one for the maximum value on the scale and one for the +//! minimum value. +//! + +void +c_plcolorbar( PLINT opt, PLINT position, + PLFLT x, PLFLT y, PLFLT length, PLFLT width, + PLFLT low_cap_color, PLFLT high_cap_color, + PLINT cont_color, PLINT cont_width, + PLFLT ticks, PLINT sub_ticks, + const char *axis_opts, const char *label, + PLINT n_values, const PLFLT *values ) +{ + // Justification of label text + PLFLT just; + + // Min and max values + // Assumes that the values array is sorted from smallest to largest + // OR from largest to smallest. + PLFLT min_value, max_value; + min_value = values[0]; + max_value = values[ n_values - 1 ]; + + // Min and max colors + // Assumes that the colors array is sorted from smallest to largest. + PLFLT min_color, max_color; + plgcmap1_range( &min_color, &max_color ); + + // Saved normalized coordinates of viewport. + PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; + // Saved world coordinates of viewport. + PLFLT xwmin_save, xwmax_save, ywmin_save, ywmax_save; + plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); + + // Active attributes to be saved and restored afterward. + PLINT col0_save = plsc->icol0; + + // Position of the color bar in normalized viewport (= normalized subpage + // coordinates). + PLFLT vx_min, vx_max, vy_min, vy_max; + PLFLT wx_min, wx_max, wy_min, wy_max; + // Build the proper viewport and window dimension along the requested side + // of the subpage + if ( position & PL_POSITION_LEFT ) + { + vx_min = x; + vy_min = y; + vx_max = vx_min + width; + vy_max = vy_min + length; + wx_min = 0.0; + wy_min = min_value; + wx_max = 1.0; + wy_max = max_value; + } + else if ( position & PL_POSITION_RIGHT ) + { + vx_min = 1.0 - x - width; + vy_min = y; + vx_max = vx_min + width; + vy_max = vy_min + length; + wx_min = 0.0; + wy_min = min_value; + wx_max = 1.0; + wy_max = max_value; + } + else if ( position & PL_POSITION_TOP ) + { + vx_min = x; + vy_min = 1.0 - y - width; + vx_max = vx_min + length; + vy_max = vy_min + width; + wx_min = min_value; + wy_min = 0.0; + wx_max = max_value; + wy_max = 1.0; + } + else if ( position & PL_POSITION_BOTTOM ) + { + vx_min = x; + vy_min = y; + vx_max = vx_min + length; + vy_max = vy_min + width; + wx_min = min_value; + wy_min = 0.0; + wx_max = max_value; + wy_max = 1.0; + } + else + { + plabort( "plcolorbar: Invalid or missing side" ); + } + + // The window used to draw the colorbar should take up the whole viewport + plvpor( vx_min, vx_max, vy_min, vy_max ); + plwind( wx_min, wx_max, wy_min, wy_max ); + + // The data to plot + PLFLT **color_data; + // Setting up the data for display + PLINT i, j, ni, nj, n_steps; + PLFLT step_size; + + // What kind of color bar are we making? + if ( opt & PL_COLORBAR_IMAGE ) + { + // Interpolate + // TODO: Should this be decided with an extra opt option instead of by + // counting n_values? + if ( n_values == 2 ) + { + // Use the same number of steps as there are steps in + // color palette 1. + // TODO: Determine a better way to specify the steps here? + n_steps = plsc->ncol1; + step_size = ( max_value - min_value ) / (PLFLT) n_steps; + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + ni = 2; + nj = n_steps; + plAlloc2dGrid( &color_data, ni, nj ); + for ( i = 0; i < ni; i++ ) + { + for ( j = 0; j < nj; j++ ) + { + color_data[i][j] = min_value + (PLFLT) j * step_size; + } + } + } + else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) + { + ni = n_steps; + nj = 2; + plAlloc2dGrid( &color_data, ni, nj ); + for ( i = 0; i < ni; i++ ) + { + for ( j = 0; j < nj; j++ ) + { + color_data[i][j] = min_value + (PLFLT) i * step_size; + } + } + } + else + { + plabort( "plcolorbar: Invalid side" ); + } + } + // No interpolation - use values array as-is + else + { + n_steps = n_values; + // Use the provided values in this case. + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + ni = 2; + nj = n_steps; + plAlloc2dGrid( &color_data, ni, nj ); + for ( i = 0; i < ni; i++ ) + { + for ( j = 0; j < nj; j++ ) + { + color_data[i][j] = values[j]; + } + } + } + else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) + { + ni = n_steps; + nj = 2; + plAlloc2dGrid( &color_data, ni, nj ); + for ( i = 0; i < ni; i++ ) + { + for ( j = 0; j < nj; j++ ) + { + color_data[i][j] = values[i]; + } + } + } + else + { + plabort( "plcolorbar: Invalid side" ); + } + } + // Draw the color bar + plimage( (const PLFLT **) color_data, ni, nj, wx_min, wx_max, wy_min, wy_max, + min_value, max_value, wx_min, wx_max, wy_min, wy_max ); + plFree2dGrid( color_data, ni, nj ); + } + else if ( opt & PL_COLORBAR_SHADE ) + { + // Transform grid + // The transform grid is used to make the size of the shaded segments + // scale relative to other segments. For example, if segment A + // makes up 10% of the scale and segment B makes up 20% of the scale + // then segment B will be twice the length of segment A. + PLcGrid grid; + PLFLT grid_axis[2] = { 0.0, 1.0 }; + n_steps = n_values; + // Use the provided values. + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + grid.xg = grid_axis; + grid.yg = (PLFLT *) values; + grid.nx = 2; + grid.ny = n_steps; + ni = 2; + nj = n_steps; + plAlloc2dGrid( &color_data, ni, nj ); + for ( i = 0; i < ni; i++ ) + { + for ( j = 0; j < nj; j++ ) + { + color_data[i][j] = values[j]; + } + } + } + else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) + { + grid.xg = (PLFLT *) values; + grid.yg = grid_axis; + grid.nx = n_steps; + grid.ny = 2; + ni = n_steps; + nj = 2; + plAlloc2dGrid( &color_data, ni, nj ); + for ( i = 0; i < ni; i++ ) + { + for ( j = 0; j < nj; j++ ) + { + color_data[i][j] = values[i]; + } + } + } + else + { + plabort( "plcolorbar: Invalid side" ); + } + + // Draw the color bar + plshades( (const PLFLT **) color_data, ni, nj, NULL, wx_min, wx_max, wy_min, wy_max, + values, n_steps, 0, cont_color, cont_width, plfill, TRUE, + pltr1, (void *) ( &grid ) ); + plFree2dGrid( color_data, ni, nj ); + } + else if ( opt & PL_COLORBAR_GRADIENT ) + { + PLFLT xs[4], ys[4]; + xs[0] = wx_min; + ys[0] = wy_min; + xs[1] = wx_max; + ys[1] = wy_min; + xs[2] = wx_max; + ys[2] = wy_max; + xs[3] = wx_min; + ys[3] = wy_max; + PLFLT angle; + // Make sure the gradient runs in the proper direction + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + // Top to bottom + angle = 90.0; + } + else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) + { + // Left to right + angle = 0.0; + } + else + { + plabort( "plcolorbar: Invalid side" ); + } + plgradient( 4, xs, ys, angle ); + } + + // Restore the previous drawing color to use for outlines and text + plcol0( col0_save ); + + // How far away from the axis should the label be drawn? + PLFLT label_offset; + label_offset = 0.0; + + // Draw end-caps + if ( opt & PL_COLORBAR_CAP_LOW ) + { + // Add an extra offset for the label so it does not bump in to the + // cap if the label is placed on the same side as the cap. + if ( ( ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) && + opt & PL_COLORBAR_LABEL_BOTTOM ) || + ( ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) && + opt & PL_COLORBAR_LABEL_LEFT ) ) + { + label_offset += 2.5; + } + // Draw a filled triangle (cap/arrow) at the low end of the scale + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + draw_cap( position, PL_COLORBAR_CAP_LOW, vx_min, vx_max, vy_min, low_cap_color ); + } + else if ( position & PL_POSITION_BOTTOM || position & PL_POSITION_TOP ) + { + draw_cap( position, PL_COLORBAR_CAP_LOW, vy_min, vy_max, vx_min, low_cap_color ); + } + } + if ( opt & PL_COLORBAR_CAP_HIGH ) + { + // Add an extra offset for the label so it does not bump in to the + // cap if the label is placed on the same side as the cap. + if ( ( ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) && + opt & PL_COLORBAR_LABEL_TOP ) || + ( ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) && + opt & PL_COLORBAR_LABEL_RIGHT ) ) + { + label_offset += 2.5; + } + // Draw a filled triangle (cap/arrow) at the high end of the scale + if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) + { + draw_cap( position, PL_COLORBAR_CAP_HIGH, vx_min, vx_max, vy_max, high_cap_color ); + } + else if ( position & PL_POSITION_BOTTOM || position & PL_POSITION_TOP ) + { + draw_cap( position, PL_COLORBAR_CAP_HIGH, vy_min, vy_max, vx_max, high_cap_color ); + } + } + + // For building axis option string + PLINT max_opts = 25; + char opt_string[max_opts]; + const char *tick_string; + + tick_string = ""; + + // Draw a title + char perp; + if ( opt & PL_COLORBAR_LABEL_LEFT ) + { + if ( position & PL_POSITION_RIGHT || position & PL_POSITION_LEFT ) + { + if ( position & PL_POSITION_LEFT ) + label_offset += 4.0; + else + label_offset += 2.0; + perp = '\0'; + just = 0.5; + } + else + { + label_offset += 1.5; + perp = 'v'; + just = 1.0; + } + snprintf( opt_string, max_opts, "l%c", perp ); + plmtex( opt_string, label_offset, 0.5, just, label ); + } + else if ( opt & PL_COLORBAR_LABEL_RIGHT ) + { + if ( position & PL_POSITION_RIGHT || position & PL_POSITION_LEFT ) + { + if ( position & PL_POSITION_RIGHT ) + label_offset += 4.0; + else + label_offset += 2.0; + perp = '\0'; + just = 0.5; + } + else + { + label_offset += 1.5; + perp = 'v'; + just = 0.0; + } + snprintf( opt_string, max_opts, "r%c", perp ); + plmtex( opt_string, label_offset, 0.5, just, label ); + } + else if ( opt & PL_COLORBAR_LABEL_TOP ) + { + if ( position & PL_POSITION_RIGHT || position & PL_POSITION_LEFT ) + { + label_offset += 1.5; + perp = '\0'; + } + else + { + if ( position & PL_POSITION_TOP ) + label_offset += 4.0; + else + label_offset += 2.0; + perp = '\0'; + } + snprintf( opt_string, max_opts, "t%c", perp ); + plmtex( opt_string, label_offset, 0.5, 0.5, label ); + } + else if ( opt & PL_COLORBAR_LABEL_BOTTOM ) + { + if ( position & PL_POSITION_RIGHT || position & PL_POSITION_LEFT ) + { + label_offset += 1.5; + perp = '\0'; + } + else + { + if ( position & PL_POSITION_BOTTOM ) + label_offset += 4.0; + else + label_offset += 2.0; + perp = '\0'; + } + snprintf( opt_string, max_opts, "b%c", perp ); + plmtex( opt_string, label_offset, 0.5, 0.5, label ); + } + + // Draw labels and tick marks if this is a shade color bar + // TODO: A better way to handle this would be to update the + // internals of plbox to support custom tick and label positions + // along an axis. + if ( opt & PL_COLORBAR_SHADE && opt & PL_COLORBAR_SHADE_LABEL ) + { + if ( position & PL_POSITION_LEFT ) + { + snprintf( opt_string, max_opts, "nt%s", axis_opts ); + label_box_custom( "", 0, NULL, opt_string, n_values, values ); + } + else if ( position & PL_POSITION_RIGHT ) + { + snprintf( opt_string, max_opts, "mt%s", axis_opts ); + label_box_custom( "", 0, NULL, opt_string, n_values, values ); + } + else if ( position & PL_POSITION_TOP ) + { + snprintf( opt_string, max_opts, "mt%s", axis_opts ); + label_box_custom( opt_string, n_values, values, "", 0, NULL ); + } + else if ( position & PL_POSITION_BOTTOM ) + { + snprintf( opt_string, max_opts, "nt%s", axis_opts ); + label_box_custom( opt_string, n_values, values, "", 0, NULL ); + } + } + else + { + if ( position & PL_POSITION_LEFT || position & PL_POSITION_BOTTOM ) + { + tick_string = "n"; + } + else if ( position & PL_POSITION_RIGHT || position & PL_POSITION_TOP ) + { + tick_string = "m"; + } + } + + // Draw the outline for the entire colorbar, tick marks, tick labels. + if ( position & PL_POSITION_LEFT ) + { + snprintf( opt_string, max_opts, "bc%s%s", tick_string, axis_opts ); + plbox( "bc", ticks, sub_ticks, opt_string, ticks, sub_ticks ); + } + else if ( position & PL_POSITION_RIGHT ) + { + snprintf( opt_string, max_opts, "bc%s%s", tick_string, axis_opts ); + plbox( "bc", 0.0, 0, opt_string, ticks, sub_ticks ); + } + else if ( position & PL_POSITION_TOP ) + { + snprintf( opt_string, max_opts, "bc%s%s", tick_string, axis_opts ); + plbox( opt_string, ticks, sub_ticks, "bc", 0.0, 0 ); + } + else if ( position & PL_POSITION_BOTTOM ) + { + snprintf( opt_string, max_opts, "bc%s%s", tick_string, axis_opts ); + plbox( opt_string, ticks, sub_ticks, "bc", 0.0, 0 ); + } + + // Restore previous plot characteristics. + plcol0( col0_save ); + plvpor( xdmin_save, xdmax_save, ydmin_save, ydmax_save ); + plwind( xwmin_save, xwmax_save, ywmin_save, ywmax_save ); + + return; +} + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ai...@us...> - 2011-04-26 19:06:56
|
Revision: 11724 http://plplot.svn.sourceforge.net/plplot/?rev=11724&view=rev Author: airwin Date: 2011-04-26 19:06:50 +0000 (Tue, 26 Apr 2011) Log Message: ----------- Make draw_cap API easier to understand with no side effects due to position argument. The triangle coordinates are sometimes defined in different order so that the example 33 diffs are large due to swapped coordinate pairs. Also, the rounding errors are different. However, the visual results for example 33 are the same with this draw_cap API change. Modified Paths: -------------- trunk/src/pllegend.c Modified: trunk/src/pllegend.c =================================================================== --- trunk/src/pllegend.c 2011-04-26 17:00:30 UTC (rev 11723) +++ trunk/src/pllegend.c 2011-04-26 19:06:50 UTC (rev 11724) @@ -882,33 +882,32 @@ #define PL_COLORBAR_NEW_API #ifdef PL_COLORBAR_NEW_API // Code version with reorganized API for plcolorbar + +enum PLCapOrientation +{ + PLCapRight, + PLCapUp, + PLCapLeft, + PLCapDown +}; //-------------------------------------------------------------------------- //! Draw triangular end-caps for color bars. //! -//! @param position This variable defines the placement of the colorbar on the -//! subpage. The position can be one of PL_POSITION_TOP, -//! PL_POSITION_BOTTOM, PL_POSITION_LEFT or PL_POSITION_RIGHT. The colorbar -//! will be drawn perpendicular to the given side of the subpage. -//! @param opt This variable can be PL_COLORBAR_CAP_LOW or -//! PL_COLORBAR_CAP_HIGH, indicating whether we are drawing a low-end cap or a -//! high-end cap. -//! @param a1 First primary coordinate for the end cap base. If position -//! is PL_POSITION_LEFT or PL_POSITION_RIGHT then a1 and a2 are x coordinates. -//! if position is PL_POSITION_TOP or PL_POSITION_BOTTOM then a1 and a2 are y -//! coordinates. (a1, b) and (a2, b) OR (b, a1) and (b, a2) define the base of -//! the triangular cap. -//! @param a2 Second primary coordinate for the end cap base. -//! @param b Secondary coordinate for the end cap base. If a1 and a2 are x, -//! b is y. If a1 and a2 are y, b is x. +//! @param orientation This enum variable defines the +//! orientation of the triangle. The triangle points to the +//! right, up, left, or down if orientation is equal to +//! PLCapRight, PLCapUp, PLCapLeft, or PLCapDown. +//! @param xmin Minimum X coordinate of rectangle inscribing the triangle. +//! @param xmax Maximum X coordinate of rectangle inscribing the triangle. +//! @param ymin Minimum Y coordinate of rectangle inscribing the triangle. +//! @param ymax Minimum Y coordinate of rectangle inscribing the triangle. //! @param color Color (color palette 1) used to fill the end cap. //! void -draw_cap( PLINT position, PLINT opt, PLFLT a1, PLFLT a2, PLFLT b, PLFLT color ) +draw_cap( enum PLCapOrientation orientation, PLFLT xmin, PLFLT xmax, + PLFLT ymin,PLFLT ymax, PLFLT color ) { - // Height the cap in normalized coordinates - PLFLT cap_height = 0.05; - // Save drawing color PLINT col0_save = plsc->icol0; @@ -917,76 +916,58 @@ PLFLT xdmin_save, xdmax_save, ydmin_save, ydmax_save; // Saved world coordinates of viewport. PLFLT xwmin_save, xwmax_save, ywmin_save, ywmax_save; - plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); - plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); - - // Use the entire sub-page, and make world coordinates 0.0 -> 1.0 - // This way the location and orientation of the cap can be easily - // defined by a combination of position, opt, a1, a2 and b. - plvpor( 0.0, 1.0, 0.0, 1.0 ); - plwind( 0.0, 1.0, 0.0, 1.0 ); - // Points for the triangle PLFLT xs[3]; PLFLT ys[3]; - plcol1( color ); + plgvpsp( &xdmin_save, &xdmax_save, &ydmin_save, &ydmax_save ); + plgvpw( &xwmin_save, &xwmax_save, &ywmin_save, &ywmax_save ); - if ( opt & PL_COLORBAR_CAP_LOW ) - { - if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) - { - // Draw the cap on the bottom - xs[0] = a1; - ys[0] = b; - xs[2] = a2; - ys[2] = b; - xs[1] = ( xs[0] + xs[2] ) / 2.0; - ys[1] = ys[0] - cap_height; + // The viewport is the specified rectangle that inscribes the + // triangle. The world coordinates are chosen to make drawing of + // the triangle convenient. + plvpor( xmin, xmax, ymin, ymax ); + plwind( 0.0, 1.0, 0.0, 1.0 ); - plfill( 3, xs, ys ); - } - else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) - { - // Draw the cap on the left - xs[0] = b; - ys[0] = a1; - xs[2] = b; - ys[2] = a2; - xs[1] = xs[0] - cap_height; - ys[1] = ( ys[0] + ys[2] ) / 2.0; - - plfill( 3, xs, ys ); - } + if ( orientation == PLCapRight ) + { + xs[0] = 0.; + ys[0] = 0.; + xs[1] = 1.; + ys[1] = 0.5; + xs[2] = 0.; + ys[2] = 1.; } - else if ( opt & PL_COLORBAR_CAP_HIGH ) + else if ( orientation == PLCapUp ) { - if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) - { - // Draw the cap on the top - xs[0] = a1; - ys[0] = b; - xs[2] = a2; - ys[2] = b; - xs[1] = ( xs[0] + xs[2] ) / 2.0; - ys[1] = ys[0] + cap_height; - - plfill( 3, xs, ys ); - } - else if ( position & PL_POSITION_TOP || position & PL_POSITION_BOTTOM ) - { - // Draw the cap on the right - xs[0] = b; - ys[0] = a1; - xs[2] = b; - ys[2] = a2; - xs[1] = xs[0] + cap_height; - ys[1] = ( ys[0] + ys[2] ) / 2.0; - - plfill( 3, xs, ys ); - } + xs[0] = 1.; + ys[0] = 0.; + xs[1] = 0.5; + ys[1] = 1.; + xs[2] = 0.; + ys[2] = 0.; } + else if ( orientation == PLCapLeft ) + { + xs[0] = 1.; + ys[0] = 1.; + xs[1] = 0.; + ys[1] = 0.5; + xs[2] = 1.; + ys[2] = 0.; + } + else if ( orientation == PLCapDown ) + { + xs[0] = 0.; + ys[0] = 1.; + xs[1] = 0.5; + ys[1] = 0.; + xs[2] = 1.; + ys[2] = 1.; + } + plcol1( color ); + plfill( 3, xs, ys ); // Restore the drawing color plcol0( col0_save ); @@ -1071,6 +1052,9 @@ // Assumes that the values array is sorted from smallest to largest // OR from largest to smallest. PLFLT min_value, max_value; + // Height the cap in normalized coordinates + PLFLT cap_height = 0.05; + min_value = values[0]; max_value = values[ n_values - 1 ]; @@ -1347,11 +1331,11 @@ // Draw a filled triangle (cap/arrow) at the low end of the scale if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) { - draw_cap( position, PL_COLORBAR_CAP_LOW, vx_min, vx_max, vy_min, low_cap_color ); + draw_cap( PLCapDown, vx_min, vx_max, vy_min - cap_height, vy_min, low_cap_color ); } else if ( position & PL_POSITION_BOTTOM || position & PL_POSITION_TOP ) { - draw_cap( position, PL_COLORBAR_CAP_LOW, vy_min, vy_max, vx_min, low_cap_color ); + draw_cap( PLCapLeft, vx_min - cap_height, vx_min, vy_min, vy_max, low_cap_color ); } } if ( opt & PL_COLORBAR_CAP_HIGH ) @@ -1368,13 +1352,13 @@ // Draw a filled triangle (cap/arrow) at the high end of the scale if ( position & PL_POSITION_LEFT || position & PL_POSITION_RIGHT ) { - draw_cap( position, PL_COLORBAR_CAP_HIGH, vx_min, vx_max, vy_max, high_cap_color ); + draw_cap( PLCapUp, vx_min, vx_max, vy_max, vy_max + cap_height, high_cap_color ); } else if ( position & PL_POSITION_BOTTOM || position & PL_POSITION_TOP ) { - draw_cap( position, PL_COLORBAR_CAP_HIGH, vy_min, vy_max, vx_max, high_cap_color ); + draw_cap( PLCapRight, vx_max, vx_max + cap_height, vy_min, vy_max, high_cap_color ); } - } + } // For building axis option string PLINT max_opts = 25; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |