// // Alpha color values demonstration. // // Copyright (C) 2008 Hazen Babcock // // // This file is part of PLplot. // // PLplot is free software; you can redistribute it and/or modify // it under the terms of the GNU Library General 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 // // This example will only really be interesting when used with devices that // support or alpha (or transparency) values, such as the cairo device family. // #include "plcdemos.h" static PLINT red[] = { 0, 255, 0, 0 }; static PLINT green[] = { 0, 0, 255, 0 }; static PLINT blue[] = { 0, 0, 0, 255 }; static PLFLT alpha[] = { 1.0, 1.0, 1.0, 1.0 }; static PLFLT px[] = { 0.1, 0.5, 0.5, 0.1 }; static PLFLT py[] = { 0.1, 0.1, 0.5, 0.5 }; static PLFLT pos[] = { 0.0, 1.0 }; static PLFLT rcoord[] = { 1.0, 1.0 }; static PLFLT gcoord[] = { 0.0, 0.0 }; static PLFLT bcoord[] = { 0.0, 0.0 }; static PLFLT acoord[] = { 0.0, 1.0 }; static PLBOOL rev[] = { 0, 0 }; int main( int argc, const char *argv[] ) { int i, j; PLINT icol, r, g, b; PLFLT a; plparseopts( &argc, argv, PL_PARSE_FULL ); plinit(); plscmap0n( 4 ); plscmap0a( red, green, blue, alpha, 4 ); // // Page 1: // // This is a series of red, green and blue rectangles overlaid // on each other with gradually increasing transparency. // // Set up the window pladv( 0 ); plvpor( 0.0, 1.0, 0.0, 1.0 ); plwind( 0.0, 1.0, 0.0, 1.0 ); plcol0( 0 ); plbox( "", 1.0, 0, "", 1.0, 0 ); // Draw the boxes for ( i = 0; i < 9; i++ ) { icol = i % 3 + 1; // Get a color, change its transparency and // set it as the current color. plgcol0a( icol, &r, &g, &b, &a ); plscol0a( icol, r, g, b, 1.0 - (double) i / 9.0 ); plcol0( icol ); // Draw the rectangle plfill( 4, px, py ); // Shift the rectangles coordinates for ( j = 0; j < 4; j++ ) { px[j] += 0.5 / 9.0; py[j] += 0.5 / 9.0; } } // // Page 2: // // This is a bunch of boxes colored red, green or blue with a single // large (red) box of linearly varying transparency overlaid. The // overlaid box is completely transparent at the bottom and completely // opaque at the top. // // Set up the window pladv( 0 ); plvpor( 0.1, 0.9, 0.1, 0.9 ); plwind( 0.0, 1.0, 0.0, 1.0 ); // Draw the boxes. There are 25 of them drawn on a 5 x 5 grid. for ( i = 0; i < 5; i++ ) { // Set box X position px[0] = 0.05 + 0.2 * i; px[1] = px[0] + 0.1; px[2] = px[1]; px[3] = px[0]; // We don't want the boxes to be transparent, so since we changed // the colors transparencies in the first example we have to change // the transparencies back to completely opaque. icol = i % 3 + 1; plgcol0a( icol, &r, &g, &b, &a ); plscol0a( icol, r, g, b, 1.0 ); plcol0( icol ); for ( j = 0; j < 5; j++ ) { // Set box y position and draw the box. py[0] = 0.05 + 0.2 * j; py[1] = py[0]; py[2] = py[0] + 0.1; py[3] = py[2]; plfill( 4, px, py ); } } // Create the color map with 128 colors and use plscmap1la to initialize // the color values with a linearly varying red transparency (or alpha) plscmap1n( 128 ); plscmap1la( 1, 2, pos, rcoord, gcoord, bcoord, acoord, rev ); // Use that cmap1 to create a transparent red gradient for the whole // window. px[0] = 0.; px[1] = 1.; px[2] = 1.; px[3] = 0.; py[0] = 0.; py[1] = 0.; py[2] = 1.; py[3] = 1.; plgradient( 4, px, py, 90. ); plend(); exit( 0 ); }