1 #include "tenv.h"
2 #include "tsystem.h"
3
4 #include "ino_common.h"
5
6 /* copy and paste from
7 igs_ifx_common.h */
8 namespace igs {
9 namespace image {
10 namespace rgba {
11 enum num { blu = 0, gre, red, alp, siz };
12 }
13 }
14 }
15 //------------------------------------------------------------
16 namespace {
17 // T is TPixel32 or TPixel64
18 // U is unsigned char or unsigned short
19 template <class T, class U>
ras_to_arr_(const TRasterPT<T> ras,U * arr,const int channels)20 void ras_to_arr_(const TRasterPT<T> ras, U *arr, const int channels) {
21 using namespace igs::image::rgba;
22
23 for (int yy = 0; yy < ras->getLy(); ++yy) {
24 const T *ras_sl = ras->pixels(yy);
25 for (int xx = 0; xx < ras->getLx(); ++xx, arr += channels) {
26 if (red < channels) {
27 arr[red] = ras_sl[xx].r;
28 }
29 if (gre < channels) {
30 arr[gre] = ras_sl[xx].g;
31 }
32 if (blu < channels) {
33 arr[blu] = ras_sl[xx].b;
34 }
35 if (alp < channels) {
36 arr[alp] = ras_sl[xx].m;
37 }
38 }
39 }
40 }
41 template <class U, class T>
arr_to_ras_(const U * arr,const int channels,TRasterPT<T> ras,const int margin)42 void arr_to_ras_(const U *arr, const int channels, TRasterPT<T> ras,
43 const int margin // default is 0
44 ) {
45 arr +=
46 (ras->getLx() + margin + margin) * margin * channels + margin * channels;
47
48 using namespace igs::image::rgba;
49
50 for (int yy = 0; yy < ras->getLy();
51 ++yy, arr += (ras->getLx() + margin + margin) * channels) {
52 const U *arrx = arr;
53 T *ras_sl = ras->pixels(yy);
54 for (int xx = 0; xx < ras->getLx(); ++xx, arrx += channels) {
55 if (red < channels) {
56 ras_sl[xx].r = arrx[red];
57 }
58 if (gre < channels) {
59 ras_sl[xx].g = arrx[gre];
60 }
61 if (blu < channels) {
62 ras_sl[xx].b = arrx[blu];
63 }
64 if (alp < channels) {
65 ras_sl[xx].m = arrx[alp];
66 }
67 }
68 }
69 }
70 }
71 //--------------------
ras_to_arr(const TRasterP in_ras,const int channels,unsigned char * out_arr)72 void ino::ras_to_arr(const TRasterP in_ras, const int channels,
73 unsigned char *out_arr) {
74 if ((TRaster32P)in_ras) {
75 ras_to_arr_<TPixel32, unsigned char>(in_ras, out_arr, channels);
76 } else if ((TRaster64P)in_ras) {
77 ras_to_arr_<TPixel64, unsigned short>(
78 in_ras, reinterpret_cast<unsigned short *>(out_arr), channels);
79 }
80 }
arr_to_ras(const unsigned char * in_arr,const int channels,TRasterP out_ras,const int margin)81 void ino::arr_to_ras(const unsigned char *in_arr, const int channels,
82 TRasterP out_ras, const int margin) {
83 if ((TRaster32P)out_ras) {
84 arr_to_ras_<unsigned char, TPixel32>(in_arr, channels, out_ras, margin);
85 } else if ((TRaster64P)out_ras) {
86 arr_to_ras_<unsigned short, TPixel64>(
87 reinterpret_cast<const unsigned short *>(in_arr), channels, out_ras,
88 margin);
89 }
90 }
91 //--------------------
ras_to_vec(const TRasterP in_ras,const int channels,std::vector<unsigned char> & out_vec)92 void ino::ras_to_vec(const TRasterP in_ras, const int channels,
93 std::vector<unsigned char> &out_vec) {
94 out_vec.resize(
95 in_ras->getLy() * in_ras->getLx() * channels *
96 (((TRaster64P)in_ras) ? sizeof(unsigned short) : sizeof(unsigned char)));
97 ino::ras_to_arr(in_ras, channels, &out_vec.at(0));
98 }
vec_to_ras(std::vector<unsigned char> & in_vec,const int channels,TRasterP out_ras,const int margin)99 void ino::vec_to_ras(std::vector<unsigned char> &in_vec, const int channels,
100 TRasterP out_ras, const int margin // default is 0
101 ) {
102 ino::arr_to_ras(&in_vec.at(0), channels, out_ras, margin);
103 in_vec.clear();
104 }
105 //--------------------
106 #if 0 //---
107 void ino::Lx_to_wrap( TRasterP ras ) {
108 /*
109 ras->getLx() : 描画の幅
110 ras->getWrap() : データの存在幅
111 描画幅よりデータの存在幅の方が大きい場合、
112 存在幅位置に置き直し、残りをゼロクリア
113 */
114 if ( ras->getWrap() <= ras->getLx() ) { return; }
115
116 const int rowSize = ras->getLx() * ras->getPixelSize();
117 const int wrapSize = ras->getWrap() * ras->getPixelSize();
118 const int restSize = wrapSize - rowSize;
119 const UCHAR *rowImg = ras->getRawData()+rowSize *(ras->getLy()-1);
120 UCHAR *wrapImg = ras->getRawData()+wrapSize*(ras->getLy()-1);
121 for (int yy = 0; yy < ras->getLy(); ++yy) {
122 ::memcpy(wrapImg, rowImg, rowSize);
123 ::memset(wrapImg+rowSize, 0, restSize); /* 上下にはみ出すとここで落ちる */
124 rowImg -= rowSize;
125 wrapImg -= wrapSize;
126 }
127 }
128 #endif //---
129
130 //------------------------------------------------------------
131 namespace {
132 bool enable_sw_ = true;
133 bool check_sw_ = true;
134 }
log_enable_sw(void)135 bool ino::log_enable_sw(void) {
136 if (check_sw_) {
137 TFileStatus file(
138 // ToonzFolder::getProfileFolder()
139 TEnv::getConfigDir() + "fx_ino_no_log.setup");
140 if (file.doesExist()) {
141 enable_sw_ = false;
142 }
143
144 check_sw_ = false;
145 }
146 return enable_sw_;
147 }
148