diff options
Diffstat (limited to 'src/extension/dxf2svg/aci2rgb.cpp')
| -rw-r--r-- | src/extension/dxf2svg/aci2rgb.cpp | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/extension/dxf2svg/aci2rgb.cpp b/src/extension/dxf2svg/aci2rgb.cpp new file mode 100644 index 000000000..57e488bfc --- /dev/null +++ b/src/extension/dxf2svg/aci2rgb.cpp @@ -0,0 +1,114 @@ +#include <iostream> +#include <sstream> +#include <string> + + +char* RGB(double R, double G, double B); +char* RGB(double R, double G, double B){ + int r = int (R); + int g = int (G); + int b = int (B); + + char out[6]; + char *chr_ptr; + string output; + stringstream oss; + + if (r < 16 ){ + oss << 0; + } + oss << hex << r; + + if (g < 16 ){ + oss << 0; + } + oss << hex << g; + + if (b < 16 ){ + oss << 0; + } + oss << hex << b; + + output = oss.str(); + + for (int i = 0; i < 6; i++){ + out[i] = output[i]; + } + chr_ptr = &out; + return chr_ptr; +} + + +float aci_to_rgb(int aci); + +float aci_to_rgb(int aci) + { + aci = abs(aci); // hidden layers have negative color values + if (aci<10 || aci>249) // values of these ranges are special colors + { + switch (aci) + { + case 1: return RGB(255,0,0); // basic colors + case 2: return RGB(255,255,0); + case 3: return RGB(0,255,0); + case 4: return RGB(0,255,255); + case 5: return RGB(0,0,255); + case 6: return RGB(255,0,255); + case 7: return RGB(255,255,255); + case 8: return RGB(128,128,128); + case 9: return RGB(192,192,192); + case 250: return RGB(51,51,51); // grey shades + case 251: return RGB(91,91,91); + case 252: return RGB(132,132,132); + case 253: return RGB(173,173,173); + case 254: return RGB(214,214,214); + case 255: return RGB(255,255,255); + case 256: // "by layer" + // Here you should decide how to handle "by layer" logical color. + // Maybe it is a good idea to return a value like -1. + // The outer code will find what is the color of the layer which + // this entity belongs to. + return -1; + } + } + // for all the rest of ACI codes + float H,S,L, R,G,B; + int remainder = aci % 10; + H = 1.5f * (aci - remainder - 10); // hue in range 0-360 + S = ((aci % 2) ? 0.5f : 1.0f); // odd colors have 50% of saturation, even - 100% + // set lighteness, the last digit of aci code stands for this + if (reminder == 0 || reminder == 1) L = 1.0f; + if (reminder == 2 || reminder == 3) L = 0.8f; + if (reminder == 4 || reminder == 5) L = 0.6f; + if (reminder == 6 || reminder == 7) L = 0.5f; + if (reminder == 8 || reminder == 9) L = 0.3f; + // here we have H,S,L set already + // let's convert it to RGB, first without consideration of S and L + if (H<=120) + { + R = (120-H)/60; + G = H/60; + B = 0; + } + if (H>120 && H<=240) + { + R = 0; + G = (240-H)/60; + B = (H-120)/60; + } + if (H>240 && H<=360) + { + R = (H-240)/60; + G = 0; + B = (360-H)/60; + } + R = min(R, 1); + G = min(G, 1); + B = min(B, 1); + // influence of S and L + float max_value = max(R,max(G,B)); + R = (max_value-S*(max_value-R)) * L * 255; + G = (max_value-S*(max_value-G)) * L * 255; + B = (max_value-S*(max_value-B)) * L * 255; + return RGB(R,G,B); + }
\ No newline at end of file |
