source: geovis/trunk/ColorMap.cpp @ 5105

Last change on this file since 5105 was 5105, checked in by ldelgass, 9 years ago

geovis updates for NSF demo

  • Property svn:eol-style set to native
File size: 3.1 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * Copyright (C) 2015  HUBzero Foundation, LLC
4 *
5 * Author: Leif Delgass <ldelgass@purdue.edu>
6 */
7#include "ColorMap.h"
8
9using namespace GeoVis;
10
11void
12ColorMap::renderColorMap(osg::TransferFunction1D *map, int width, int height,
13                         osg::Image *imgData,
14                         bool opaque, float bgColor[3],
15                         bool bgr,
16                         int bytesPerPixel)
17{
18    int size = bytesPerPixel * width * height;
19    if (imgData->getTotalSizeInBytes() != (unsigned int)size) {
20        GLenum pixelFormat;
21        if (bytesPerPixel == 3) {
22            pixelFormat = bgr ? GL_BGR : GL_RGB;
23        } else {
24            pixelFormat = bgr ? GL_BGRA: GL_RGBA;
25        };
26        imgData->allocateImage(width, height, 1, pixelFormat, GL_UNSIGNED_BYTE, 1);
27    }
28    unsigned char *dst = imgData->data();
29    //unsigned char *src = map->data();
30    if (height > width) {
31        for (int i = 0; i < height; i++) {
32            float x = (float)i/(height-1);
33            osg::Vec4f rgb = map->getColor(x);
34            unsigned char color[3];
35            if (opaque) {
36                color[0] = (unsigned char)(255. * (bgr ? rgb[2] : rgb[0]));
37                color[1] = (unsigned char)(255. * rgb[1]);
38                color[2] = (unsigned char)(255. * (bgr ? rgb[0] : rgb[2]));
39            } else {
40                float opacity = rgb[3];
41                color[0] = (unsigned char)(255. * (bgColor[0] * (1.0 - opacity) + (bgr ? rgb[2] : rgb[0]) * opacity));
42                color[1] = (unsigned char)(255. * (bgColor[1] * (1.0 - opacity) + rgb[1] * opacity));
43                color[2] = (unsigned char)(255. * (bgColor[2] * (1.0 - opacity) + (bgr ? rgb[0] : rgb[2]) * opacity));
44            }
45            for (int j = 0; j < width; j++) {
46                memcpy(dst, color, 3);
47                dst += 3;
48                if (bytesPerPixel == 4) {
49                    *(dst++) = (unsigned char)255.;
50                }
51            }
52        }
53    } else {
54        for (int i = 0; i < height; i++) {
55            for (int j = 0; j < width; j++) {
56                float x = (float)j/(width-1);
57                osg::Vec4f rgb = map->getColor(x);
58                unsigned char color[3];
59                if (opaque) {
60                    color[0] = (unsigned char)(255. * (bgr ? rgb[2] : rgb[0]));
61                    color[1] = (unsigned char)(255. * rgb[1]);
62                    color[2] = (unsigned char)(255. * (bgr ? rgb[0] : rgb[2]));
63                } else {
64                    double opacity = rgb[3];
65                    color[0] = (unsigned char)(255. * (bgColor[0] * (1.0 - opacity) + (bgr ? rgb[2] : rgb[0]) * opacity));
66                    color[1] = (unsigned char)(255. * (bgColor[1] * (1.0 - opacity) + rgb[1] * opacity));
67                    color[2] = (unsigned char)(255. * (bgColor[2] * (1.0 - opacity) + (bgr ? rgb[0] : rgb[2]) * opacity));
68                }
69                memcpy(dst, color, 3);
70                dst += 3;
71                if (bytesPerPixel == 4) {
72                    *(dst++) = (unsigned char)255.;
73                }
74            }
75        }
76    }
77}
Note: See TracBrowser for help on using the repository browser.