cgv
Loading...
Searching...
No Matches
color_storage.h
1#pragma once
2
3#include <vector>
4#include "color.h"
5
6#include "lib_begin.h"
7
8namespace cgv {
9 namespace media {
11 enum ColorType {
12 CT_RGB8,
13 CT_RGBA8,
14 CT_RGB,
15 CT_RGBA
16 };
17
19 template <typename T> struct color_storage_traits {};
20 template <> struct color_storage_traits<color<float, RGB> > { static const ColorType color_type = CT_RGB; };
21 template <> struct color_storage_traits<color<float, RGB, OPACITY> > { static const ColorType color_type = CT_RGBA; };
22 template <> struct color_storage_traits<color<unsigned char, RGB> > { static const ColorType color_type = CT_RGB8; };
23 template <> struct color_storage_traits<color<unsigned char, RGB, OPACITY> > { static const ColorType color_type = CT_RGBA8; };
24
27 {
28 protected:
29 // type of color stored in storage
30 ColorType color_type;
31 public:
33 abst_color_storage(ColorType _color_type);
35 virtual ~abst_color_storage();
37 ColorType get_color_type() const;
39 size_t get_color_size() const;
41 virtual abst_color_storage* clone() const = 0;
43 virtual size_t get_nr_colors() const = 0;
45 virtual void resize(size_t nr_colors) = 0;
47 virtual const void* get_data_ptr() const = 0;
49 virtual const void* get_data_vector_ptr() const = 0;
51 virtual void* ref_data_ptr() = 0;
53 virtual void* ref_data_vector_ptr() = 0;
54
56 virtual void set_color(size_t i, const void* col_ptr) = 0;
58 virtual void set_color(size_t i, const rgb& col) = 0;
60 virtual void set_color(size_t i, const rgba& col) = 0;
62 virtual void set_color(size_t i, const rgb8& col) = 0;
64 virtual void set_color(size_t i, const rgba8& col) = 0;
66 virtual void put_color(size_t i, void* col_ptr) const = 0;
68 virtual void put_color(size_t i, rgb& col) const = 0;
70 virtual void put_color(size_t i, rgba& col) const = 0;
72 virtual void put_color(size_t i, rgb8& col) const = 0;
74 virtual void put_color(size_t i, rgba8& col) const = 0;
75 };
76
78 template <typename C>
80 {
81 public:
82 std::vector<C> colors;
87 colors(csm.colors) { }
89 template <typename C1>
91 for (const auto& col : csm.colors)
92 colors.push_back(col);
93 }
96 switch (acsm.get_color_type()) {
97 case CT_RGB: new (this) color_storage<C>(static_cast<const color_storage<rgb>&>(acsm)); break;
98 case CT_RGBA: new (this) color_storage<C>(static_cast<const color_storage<rgba>&>(acsm)); break;
99 case CT_RGB8: new (this) color_storage<C>(static_cast<const color_storage<rgb8>&>(acsm)); break;
100 case CT_RGBA8: new (this) color_storage<C>(static_cast<const color_storage<rgba8>&>(acsm)); break;
101 }
102 }
105 return new color_storage(*this);
106 }
107 // implementation of vector access passes interface to std::vector class
108 size_t get_nr_colors() const { return colors.size(); }
109 void resize(size_t nr_colors) { colors.resize(nr_colors); }
110 const void* get_data_ptr() const { return &colors.front(); }
111 const void* get_data_vector_ptr() const { return &colors; }
112 void* ref_data_ptr() { return &colors.front(); }
113 void* ref_data_vector_ptr() { return &colors; }
114 // implementation of color access uses type conversion operators implemented for color class
115 void set_color(size_t i, const void* col_ptr) { colors[i] = *reinterpret_cast<const C*>(col_ptr); }
116 void set_color(size_t i, const rgb& col) { colors[i] = col; }
117 void set_color(size_t i, const rgba& col) { colors[i] = col; }
118 void set_color(size_t i, const rgb8& col) { colors[i] = col; }
119 void set_color(size_t i, const rgba8& col) { colors[i] = col; }
120 void put_color(size_t i, void* col_ptr) const { *reinterpret_cast<C*>(col_ptr) = colors[i]; }
121 void put_color(size_t i, rgb& col) const { col = colors[i]; }
122 void put_color(size_t i, rgba& col) const { col = colors[i]; }
123 void put_color(size_t i, rgb8& col) const { col = colors[i]; }
124 void put_color(size_t i, rgba8& col) const { col = colors[i]; }
125 };
126 }
127}
128
129#include <cgv/config/lib_end.h>
interface for color storage of different internal types
virtual void set_color(size_t i, const rgba &col)=0
set i-th color from color of type rgba
virtual void set_color(size_t i, const void *col_ptr)=0
set i-th color to color of type stored in storage
virtual void put_color(size_t i, rgba8 &col) const =0
set color of type rgba8 to i-th color
virtual const void * get_data_ptr() const =0
return a const void pointer to the color data
virtual void put_color(size_t i, rgb &col) const =0
set color of type rgb to i-th color
virtual size_t get_nr_colors() const =0
return number colors stored in color storage
virtual abst_color_storage * clone() const =0
clone the color storage
virtual void set_color(size_t i, const rgb8 &col)=0
set i-th color from color of type rgb8
virtual void * ref_data_vector_ptr()=0
return a void pointer to the color data vector
virtual const void * get_data_vector_ptr() const =0
return a const void pointer to the color data vector
virtual void * ref_data_ptr()=0
return a void pointer to the color data
virtual void put_color(size_t i, rgba &col) const =0
set color of type rgba to i-th color
virtual void resize(size_t nr_colors)=0
resize to the given number of colors
virtual void set_color(size_t i, const rgba8 &col)=0
set i-th color from color of type rgba8
ColorType get_color_type() const
return color type of color storage
virtual void put_color(size_t i, void *col_ptr) const =0
set color of type stored in storage to i-th color
virtual ~abst_color_storage()
virtual destructor ensures that std::vector defined in template class color_storage is destructed too
virtual void set_color(size_t i, const rgb &col)=0
set i-th color from color of type rgb
virtual void put_color(size_t i, rgb8 &col) const =0
set color of type rgb8 to i-th color
size_t get_color_size() const
return size of a single color in byte
template implementation of color storage model
size_t get_nr_colors() const
return number colors stored in color storage
void * ref_data_vector_ptr()
return a void pointer to the color data vector
abst_color_storage * clone() const
clone the color storage
void put_color(size_t i, rgb &col) const
set color of type rgb to i-th color
void set_color(size_t i, const rgba8 &col)
set i-th color from color of type rgba8
void set_color(size_t i, const rgba &col)
set i-th color from color of type rgba
const void * get_data_vector_ptr() const
return a const void pointer to the color data vector
void set_color(size_t i, const rgb8 &col)
set i-th color from color of type rgb8
void resize(size_t nr_colors)
resize to the given number of colors
color_storage()
construct empty color storage
color_storage(const color_storage< C1 > &csm)
construct from color storage of different type
void put_color(size_t i, void *col_ptr) const
set color of type stored in storage to i-th color
void set_color(size_t i, const rgb &col)
set i-th color from color of type rgb
color_storage(const color_storage< C > &csm)
construct from color storage of same type
color_storage(const abst_color_storage &acsm)
construct from abstract color storage of unknown type
void set_color(size_t i, const void *col_ptr)
set i-th color to color of type stored in storage
void put_color(size_t i, rgb8 &col) const
set color of type rgb8 to i-th color
void * ref_data_ptr()
return a void pointer to the color data
void put_color(size_t i, rgba &col) const
set color of type rgba to i-th color
void put_color(size_t i, rgba8 &col) const
set color of type rgba8 to i-th color
const void * get_data_ptr() const
return a const void pointer to the color data
represent a color with components of given type and color and alpha model as specified.
Definition color.h:574
the cgv namespace
Definition print.h:11
traits struct used to derive color type (need to be declared on namespace level for specialization)