1 /*$
2  Copyright (C) 2013-2020 Azel.
3 
4  This file is part of AzPainter.
5 
6  AzPainter is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  AzPainter is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 $*/
19 
20 /******************************
21  * DrawData 定義
22  ******************************/
23 
24 #ifndef DEF_DRAW_H
25 #define DEF_DRAW_H
26 
27 #include "mStrDef.h"
28 
29 #include "defDrawGlobal.h"
30 #include "defCanvasInfo.h"
31 #include "defTool.h"
32 #include "ColorValue.h"
33 
34 typedef struct _ImageBufRGB16 ImageBufRGB16;
35 typedef struct _ImageBuf8   ImageBuf8;
36 typedef struct _TileImage   TileImage;
37 typedef struct _LayerList   LayerList;
38 typedef struct _LayerItem   LayerItem;
39 typedef struct _FillPolygon FillPolygon;
40 typedef struct _DrawFont DrawFont;
41 
42 
43 #define COLORMASK_MAXNUM  6		//色マスクの色最大数
44 #define COLPAL_GRADNUM    3		//中間色バーの数
45 #define LAYERCOLPAL_NUM   30	//レイヤ色パレットの数
46 #define RULE_RECORD_NUM   10	//定規の記録数
47 #define HEADTAIL_RECORD_NUM 10	//入り抜き記録数
48 
49 
50 /*---- data ----*/
51 
52 
53 /** 描画用ポイントデータ */
54 
55 typedef struct _DrawPoint
56 {
57 	double x,y,pressure;
58 }DrawPoint;
59 
60 /** 定規の記録データ */
61 
62 typedef struct
63 {
64 	uint8_t type;
65 	double d[4];
66 }RuleRecord;
67 
68 
69 /*---- sub data ----*/
70 
71 /** ツールデータ */
72 
73 typedef struct
74 {
75 	int no;			//現在のツール
76 	uint8_t subno[TOOL_NUM],	//ツールのサブ情報
77 		opt_move,
78 		opt_stamp;
79 
80 	uint16_t opt_fillpoly,
81 		opt_fillpoly_erase,
82 		opt_magicwand;
83 	uint32_t opt_grad,
84 		opt_fill;
85 }DrawToolData;
86 
87 /** 色関連データ */
88 
89 typedef struct
90 {
91 	uint32_t drawcol,	//描画色(8bit)
92 		bkgndcol,		//背景色
93 		gradcol[COLPAL_GRADNUM][2],		//中間色、左右の色 (左の色の上位8bitは段階数)
94 		layercolpal[LAYERCOLPAL_NUM];	//レイヤ色パレット
95 	int32_t colmask_col[COLORMASK_MAXNUM + 1];	//マスク色。-1 で終端
96 	uint16_t colpal_max_column;	//カラーパレットの横最大数
97 	uint8_t colmask_type,		//色マスクタイプ (0:OFF 1:MASK 2:REV)
98 		colmask_num,			//色マスク、色数
99 		hlspal_sel,				//HLSパレット:H選択位置
100 		hlspal_palx,			//HLSパレット:パレット部分 XY 位置
101 		hlspal_paly,
102 		colpal_sel,			//カラーパレットのタブ選択
103 		colpal_cellw,		//カラーパレットの表示幅
104 		colpal_cellh;
105 
106 	RGBFix15 rgb15DrawCol,	//描画色/背景色 15bitカラー
107 		rgb15BkgndCol,
108 		rgb15Colmask[COLORMASK_MAXNUM + 1];	//マスク色(15bit) r=0xffff で終端
109 }DrawColorData;
110 
111 /** 定規データ */
112 
113 typedef struct
114 {
115 	int type,
116 		ntmp;
117 	double parallel_rd,	//平行線角度(ラジアン)
118 		grid_rd,		//グリッド線角度
119 		ellipse_rd,		//楕円角度
120 		ellipse_yx,		//楕円扁平率 (y/x)
121 		dtmp[3];
122 	mDoublePoint press_pos,	//ボタン押し時のイメージ位置
123 		conc_pos,			//集中線の中心位置
124 		circle_pos,
125 		ellipse_pos;
126 
127 	RuleRecord record[RULE_RECORD_NUM];  //記録データ
128 
129 	void (*funcGetPoint)(DrawData *,double *,double *);	//点を補正する関数
130 }DrawRuleData;
131 
132 /** 入り抜きデータ */
133 
134 typedef struct
135 {
136 	uint8_t selno;  	//0:直線 1:ベジェ曲線
137 	uint32_t curval[2],	//現在の値 (上位16bit:入り 下位:抜き)
138 		record[HEADTAIL_RECORD_NUM];  //登録リスト
139 }DrawHeadTailData;
140 
141 /** テキスト描画データ */
142 
143 typedef struct
144 {
145 	DrawFont *font;		//テキスト描画用フォント
146 
147 	mStr strText,		//現在の文字列
148 		strName,		//フォント名
149 		strStyle;		//フォントスタイル
150 	int size,
151 		char_space,
152 		line_space,
153 		create_dpi;		//現在のフォントが作成された時の dpi
154 	uint8_t weight,
155 		slant,
156 		hinting,
157 		flags,
158 		dakuten_combine,	//濁点合成方法
159 		in_dialog;		//ダイアログ表示中か
160 }DrawTextData;
161 
162 /** 選択範囲用データ */
163 
164 typedef struct
165 {
166 	mRect rcsel;	//選択のおおよその範囲 (tileimgSel != NULL の時)
167 
168 	TileImage *tileimgCopy;	//コピーされたイメージ (ファイル出力失敗時)
169 	uint32_t col_copyimg;	//コピーされたイメージの線の色
170 }DrawSelectData;
171 
172 /** 矩形編集用データ */
173 
174 typedef struct
175 {
176 	mBox box;			//範囲 (w == 0 で範囲なし)
177 	uint8_t cursor_resize;	//現在のリサイズカーソル状態(フラグ)
178 }DrawBoxEditData;
179 
180 /** スタンプ用データ */
181 
182 typedef struct
183 {
184 	TileImage *img;	//スタンプ画像
185 	mSize size;		//スタンプ画像のサイズ
186 }DrawStampData;
187 
188 /** 作業用データ */
189 
190 typedef struct
191 {
192 	int ntmp[3],
193 		optype,				//現在の操作タイプ
194 		opsubtype,			//操作タイプのサブ情報
195 		optoolno,			//現在操作中のツール動作
196 		press_btt,			//操作開始時に押されたボタン (M_BTT_*)
197 		release_only_btt,	//ボタン番号。ボタン離し時は指定されたボタンのみ処理する
198 		drag_cursor_type;	//(ボタン押し時) グラブ中のみカーソルを変更する場合、APP_CURSOR_* を指定。
199 							//-1 でカーソルはそのまま
200 
201 	uint32_t press_state;	//操作開始時の装飾キー (M_MODS_*)
202 
203 	uint8_t opflags,		//操作用オプションフラグ
204 		drawinfo_flags,		//drawOpSub_setDrawInfo() でセットされるフラグ
205 		in_filter_dialog,	//フィルタダイアログ中か (TRUE 時、ptmp = ダイアログのポインタ)
206 		hide_canvas_select;	//キャンバス描画で選択範囲の枠を非表示にするか (範囲イメージ移動で、移動中枠を表示しない場合)
207 
208 	mPoint ptLastArea,		//前回のカーソル位置 (int)
209 		pttmp[4];
210 	mDoublePoint ptd_tmp[1];
211 	mRect rcdraw,			//描画範囲
212 		rctmp[1];
213 	mBox boxtmp[1];
214 
215 	DrawPoint dptAreaPress,	//操作開始時のカーソル位置
216 		dptAreaCur,			//現在のカーソル位置
217 		dptAreaLast;		//前回のカーソル位置
218 
219 	void *ptmp;
220 	uint64_t sec_midcol;	//中間色作成の最初の押し時間 (sec)
221 
222 	RGBAFix15 rgbaDraw;		//描画色
223 
224 	TileImage *dstimg,		//描画先イメージ
225 		*tileimg_filterprev;	//フィルタのキャンバスプレビュー時の挿入イメージ (NULL でなし)
226 	LayerItem *layer;		//リンクの先頭レイヤ
227 
228 	FillPolygon *fillpolygon;
229 
230 	void (*funcMotion)(DrawData *,uint32_t);		//ポインタ移動時の処理関数。NULL で何もしない
231 	mBool (*funcRelease)(DrawData *);				//ボタン離し時の処理関数。NULL でグラブ解放のみ行う
232 	void (*funcPressInGrab)(DrawData *p,uint32_t);	//グラブ中にボタンが押された時の処理関数
233 	mBool (*funcAction)(DrawData *p,int action);	//右ボタンやキーなどが押された時の処理関数
234 }DrawWorkData;
235 
236 
237 /*---- DrawData ----*/
238 
239 
240 /** DrawData */
241 
242 typedef struct _DrawData
243 {
244 	int imgw,imgh,imgdpi;	//イメージ幅、高さ、DPI
245 
246 	/* キャンバス用 */
247 
248 	int canvas_zoom,		//表示倍率 (100% = 1000)
249 		canvas_angle;		//表示角度 (1度 = 100)
250 	uint8_t canvas_mirror,	//左右反転表示
251 		bCanvasLowQuality;	//キャンバス表示を低品質で行うか
252 	mSize szCanvas;			//キャンバスの領域サイズ
253 	mPoint ptScroll;		//キャンバススクロール位置
254 	double imgoriginX,		//イメージの原点位置
255 		imgoriginY;
256 
257 	RGBFix15 rgb15ImgBkgnd,	//イメージ背景色
258 		rgb15BkgndPlaid[2];	//背景チェック柄の色
259 
260 	CanvasViewParam viewparam;	//座標計算用パラメータ
261 
262 	//
263 
264 	DrawWorkData w;
265 	DrawColorData col;
266 	DrawToolData tool;
267 	DrawRuleData rule;
268 	DrawHeadTailData headtail;
269 	DrawStampData stamp;
270 	DrawSelectData sel;
271 	DrawBoxEditData boxedit;
272 	DrawTextData drawtext;
273 
274 	//
275 
276 	mStr strOptTexPath;		//オプションテクスチャのファイルパス
277 
278 	ImageBufRGB16 *blendimg;	//全レイヤ合成後のイメージ
279 	ImageBuf8 *img8OptTex;		//オプションテクスチャの現在イメージ
280 
281 	TileImage *tileimgSel,	//選択範囲用 (1bit)
282 		*tileimgDraw,		//描画用作業イメージ (描画部分の元イメージ保存用)
283 		*tileimgDraw2,		//(ブラシ描画時の描画濃度バッファ)
284 		*tileimgTmp;		//操作中のみの作業用イメージ
285 
286 	LayerList *layerlist;	//レイヤリスト
287 	LayerItem *curlayer,	//カレントレイヤ
288 		*masklayer;			//マスクレイヤ
289 }DrawData;
290 
291 
292 /** DrawTextData::flags */
293 
294 enum
295 {
296 	DRAW_DRAWTEXT_F_PREVIEW = 1<<0,
297 	DRAW_DRAWTEXT_F_VERT = 1<<1,
298 	DRAW_DRAWTEXT_F_ANTIALIAS = 1<<2,
299 	DRAW_DRAWTEXT_F_SIZE_PIXEL = 1<<3,
300 	DRAW_DRAWTEXT_F_DPI_MONITOR = 1<<4
301 };
302 
303 #endif
304