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