2bbb99b2b6741959abbc8fa1283810526b26010a
[blender.git] / source / blender / editors / sculpt_paint / paint_image.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * along with this program; if not, write to the Free Software Foundation,
13  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14  *
15  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
16  * All rights reserved.
17  *
18  * The Original Code is: some of this file.
19  */
20
21 /** \file
22  * \ingroup edsculpt
23  * \brief Functions to paint images in 2D and 3D.
24  */
25
26 #include <float.h>
27 #include <string.h>
28 #include <stdio.h>
29 #include <math.h>
30
31 #include "MEM_guardedalloc.h"
32
33 #include "BLI_math.h"
34 #include "BLI_blenlib.h"
35 #include "BLI_utildefines.h"
36
37 #include "BLT_translation.h"
38
39 #include "IMB_imbuf.h"
40 #include "IMB_imbuf_types.h"
41
42 #include "DNA_brush_types.h"
43 #include "DNA_mesh_types.h"
44 #include "DNA_node_types.h"
45 #include "DNA_object_types.h"
46
47 #include "BKE_colorband.h"
48 #include "BKE_context.h"
49 #include "BKE_brush.h"
50 #include "BKE_image.h"
51 #include "BKE_main.h"
52 #include "BKE_material.h"
53 #include "BKE_mesh.h"
54 #include "BKE_node.h"
55 #include "BKE_paint.h"
56 #include "BKE_undo_system.h"
57
58 #include "DEG_depsgraph.h"
59
60 #include "UI_interface.h"
61 #include "UI_view2d.h"
62
63 #include "ED_image.h"
64 #include "ED_object.h"
65 #include "ED_paint.h"
66 #include "ED_screen.h"
67 #include "ED_view3d.h"
68
69 #include "WM_api.h"
70 #include "WM_types.h"
71 #include "WM_message.h"
72 #include "WM_toolsystem.h"
73
74 #include "RNA_access.h"
75 #include "RNA_define.h"
76
77 #include "GPU_draw.h"
78 #include "GPU_immediate.h"
79 #include "GPU_state.h"
80
81 #include "IMB_colormanagement.h"
82
83 #include "paint_intern.h"
84
85 /**
86  * This is a static resource for non-global access.
87  * Maybe it should be exposed as part of the paint operation,
88  * but for now just give a public interface.
89  */
90 static ImagePaintPartialRedraw imapaintpartial = {0, 0, 0, 0, 0};
91
92 ImagePaintPartialRedraw *get_imapaintpartial(void)
93 {
94   return &imapaintpartial;
95 }
96
97 void set_imapaintpartial(struct ImagePaintPartialRedraw *ippr)
98 {
99   imapaintpartial = *ippr;
100 }
101
102 /* Imagepaint Partial Redraw & Dirty Region */
103
104 void ED_imapaint_clear_partial_redraw(void)
105 {
106   memset(&imapaintpartial, 0, sizeof(imapaintpartial));
107 }
108
109 void imapaint_region_tiles(
110     ImBuf *ibuf, int x, int y, int w, int h, int *tx, int *ty, int *tw, int *th)
111 {
112   int srcx = 0, srcy = 0;
113
114   IMB_rectclip(ibuf, NULL, &x, &y, &srcx, &srcy, &w, &h);
115
116   *tw = ((x + w - 1) >> IMAPAINT_TILE_BITS);
117   *th = ((y + h - 1) >> IMAPAINT_TILE_BITS);
118   *tx = (x >> IMAPAINT_TILE_BITS);
119   *ty = (y >> IMAPAINT_TILE_BITS);
120 }
121
122 void ED_imapaint_dirty_region(Image *ima, ImBuf *ibuf, int x, int y, int w, int h, bool find_old)
123 {
124   ImBuf *tmpibuf = NULL;
125   int tilex, tiley, tilew, tileh, tx, ty;
126   int srcx = 0, srcy = 0;
127
128   IMB_rectclip(ibuf, NULL, &x, &y, &srcx, &srcy, &w, &h);
129
130   if (w == 0 || h == 0) {
131     return;
132   }
133
134   if (!imapaintpartial.enabled) {
135     imapaintpartial.x1 = x;
136     imapaintpartial.y1 = y;
137     imapaintpartial.x2 = x + w;
138     imapaintpartial.y2 = y + h;
139     imapaintpartial.enabled = 1;
140   }
141   else {
142     imapaintpartial.x1 = min_ii(imapaintpartial.x1, x);
143     imapaintpartial.y1 = min_ii(imapaintpartial.y1, y);
144     imapaintpartial.x2 = max_ii(imapaintpartial.x2, x + w);
145     imapaintpartial.y2 = max_ii(imapaintpartial.y2, y + h);
146   }
147
148   imapaint_region_tiles(ibuf, x, y, w, h, &tilex, &tiley, &tilew, &tileh);
149
150   ListBase *undo_tiles = ED_image_undo_get_tiles();
151
152   for (ty = tiley; ty <= tileh; ty++) {
153     for (tx = tilex; tx <= tilew; tx++) {
154       image_undo_push_tile(undo_tiles, ima, ibuf, &tmpibuf, tx, ty, NULL, NULL, false, find_old);
155     }
156   }
157
158   BKE_image_mark_dirty(ima, ibuf);
159
160   if (tmpibuf) {
161     IMB_freeImBuf(tmpibuf);
162   }
163 }
164
165 void imapaint_image_update(SpaceImage *sima, Image *image, ImBuf *ibuf, short texpaint)
166 {
167   if (imapaintpartial.x1 != imapaintpartial.x2 && imapaintpartial.y1 != imapaintpartial.y2) {
168     IMB_partial_display_buffer_update_delayed(
169         ibuf, imapaintpartial.x1, imapaintpartial.y1, imapaintpartial.x2, imapaintpartial.y2);
170   }
171
172   if (ibuf->mipmap[0]) {
173     ibuf->userflags |= IB_MIPMAP_INVALID;
174   }
175
176   /* todo: should set_tpage create ->rect? */
177   if (texpaint || (sima && sima->lock)) {
178     int w = imapaintpartial.x2 - imapaintpartial.x1;
179     int h = imapaintpartial.y2 - imapaintpartial.y1;
180     if (w && h) {
181       /* Testing with partial update in uv editor too */
182       GPU_paint_update_image(
183           image, (sima ? &sima->iuser : NULL), imapaintpartial.x1, imapaintpartial.y1, w, h);
184     }
185   }
186 }
187
188 /* paint blur kernels. Projective painting enforces use of a 2x2 kernel due to lagging */
189 BlurKernel *paint_new_blur_kernel(Brush *br, bool proj)
190 {
191   int i, j;
192   BlurKernel *kernel = MEM_mallocN(sizeof(BlurKernel), "blur kernel");
193   float radius;
194   int side;
195   eBlurKernelType type = br->blur_mode;
196
197   if (proj) {
198     radius = 0.5f;
199
200     side = kernel->side = 2;
201     kernel->side_squared = kernel->side * kernel->side;
202     kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data");
203     kernel->pixel_len = radius;
204   }
205   else {
206     if (br->blur_kernel_radius <= 0) {
207       br->blur_kernel_radius = 1;
208     }
209
210     radius = br->blur_kernel_radius;
211
212     side = kernel->side = radius * 2 + 1;
213     kernel->side_squared = kernel->side * kernel->side;
214     kernel->wdata = MEM_mallocN(sizeof(float) * kernel->side_squared, "blur kernel data");
215     kernel->pixel_len = br->blur_kernel_radius;
216   }
217
218   switch (type) {
219     case KERNEL_BOX:
220       for (i = 0; i < kernel->side_squared; i++) {
221         kernel->wdata[i] = 1.0;
222       }
223       break;
224
225     case KERNEL_GAUSSIAN: {
226       /* at 3.0 standard deviations distance, kernel is about zero */
227       float standard_dev = radius / 3.0f;
228
229       /* make the necessary adjustment to the value for use in the normal distribution formula */
230       standard_dev = -standard_dev * standard_dev * 2;
231
232       for (i = 0; i < side; i++) {
233         for (j = 0; j < side; j++) {
234           float idist = radius - i;
235           float jdist = radius - j;
236           float value = exp((idist * idist + jdist * jdist) / standard_dev);
237
238           kernel->wdata[i + j * side] = value;
239         }
240       }
241
242       break;
243     }
244
245     default:
246       printf("unidentified kernel type, aborting\n");
247       MEM_freeN(kernel->wdata);
248       MEM_freeN(kernel);
249       return NULL;
250   }
251
252   return kernel;
253 }
254
255 void paint_delete_blur_kernel(BlurKernel *kernel)
256 {
257   if (kernel->wdata) {
258     MEM_freeN(kernel->wdata);
259   }
260 }
261
262 /************************ image paint poll ************************/
263
264 static Brush *image_paint_brush(bContext *C)
265 {
266   Scene *scene = CTX_data_scene(C);
267   ToolSettings *settings = scene->toolsettings;
268
269   return BKE_paint_brush(&settings->imapaint.paint);
270 }
271
272 static bool image_paint_poll_ex(bContext *C, bool check_tool)
273 {
274   Object *obact;
275
276   if (!image_paint_brush(C)) {
277     return 0;
278   }
279
280   obact = CTX_data_active_object(C);
281   if ((obact && obact->mode & OB_MODE_TEXTURE_PAINT) && CTX_wm_region_view3d(C)) {
282     if (!check_tool || WM_toolsystem_active_tool_is_brush(C)) {
283       return 1;
284     }
285   }
286   else {
287     SpaceImage *sima = CTX_wm_space_image(C);
288
289     if (sima) {
290       ARegion *ar = CTX_wm_region(C);
291
292       if ((sima->mode == SI_MODE_PAINT) && ar->regiontype == RGN_TYPE_WINDOW) {
293         return 1;
294       }
295     }
296   }
297
298   return 0;
299 }
300
301 static bool image_paint_poll(bContext *C)
302 {
303   return image_paint_poll_ex(C, true);
304 }
305
306 static bool image_paint_poll_ignore_tool(bContext *C)
307 {
308   return image_paint_poll_ex(C, false);
309 }
310
311 static bool image_paint_2d_clone_poll(bContext *C)
312 {
313   Brush *brush = image_paint_brush(C);
314
315   if (!CTX_wm_region_view3d(C) && image_paint_poll(C)) {
316     if (brush && (brush->imagepaint_tool == PAINT_TOOL_CLONE)) {
317       if (brush->clone.image) {
318         return 1;
319       }
320     }
321   }
322
323   return 0;
324 }
325
326 /************************ paint operator ************************/
327 typedef enum eTexPaintMode {
328   PAINT_MODE_2D,
329   PAINT_MODE_3D_PROJECT,
330 } eTexPaintMode;
331
332 typedef struct PaintOperation {
333   eTexPaintMode mode;
334
335   void *custom_paint;
336
337   float prevmouse[2];
338   float startmouse[2];
339   double starttime;
340
341   void *cursor;
342   ViewContext vc;
343 } PaintOperation;
344
345 bool paint_use_opacity_masking(Brush *brush)
346 {
347   return ((brush->flag & BRUSH_AIRBRUSH) || (brush->flag & BRUSH_DRAG_DOT) ||
348                   (brush->flag & BRUSH_ANCHORED) || (brush->imagepaint_tool == PAINT_TOOL_SMEAR) ||
349                   (brush->imagepaint_tool == PAINT_TOOL_SOFTEN) ||
350                   (brush->imagepaint_tool == PAINT_TOOL_FILL) ||
351                   (brush->flag & BRUSH_USE_GRADIENT) ||
352                   (brush->mtex.tex && !ELEM(brush->mtex.brush_map_mode,
353                                             MTEX_MAP_MODE_TILED,
354                                             MTEX_MAP_MODE_STENCIL,
355                                             MTEX_MAP_MODE_3D)) ?
356               false :
357               true);
358 }
359
360 void paint_brush_color_get(struct Scene *scene,
361                            struct Brush *br,
362                            bool color_correction,
363                            bool invert,
364                            float distance,
365                            float pressure,
366                            float color[3],
367                            struct ColorManagedDisplay *display)
368 {
369   if (invert) {
370     copy_v3_v3(color, BKE_brush_secondary_color_get(scene, br));
371   }
372   else {
373     if (br->flag & BRUSH_USE_GRADIENT) {
374       float color_gr[4];
375       switch (br->gradient_stroke_mode) {
376         case BRUSH_GRADIENT_PRESSURE:
377           BKE_colorband_evaluate(br->gradient, pressure, color_gr);
378           break;
379         case BRUSH_GRADIENT_SPACING_REPEAT: {
380           float coord = fmod(distance / br->gradient_spacing, 1.0);
381           BKE_colorband_evaluate(br->gradient, coord, color_gr);
382           break;
383         }
384         case BRUSH_GRADIENT_SPACING_CLAMP: {
385           BKE_colorband_evaluate(br->gradient, distance / br->gradient_spacing, color_gr);
386           break;
387         }
388       }
389       copy_v3_v3(color, color_gr);
390     }
391     else {
392       copy_v3_v3(color, BKE_brush_color_get(scene, br));
393     }
394   }
395   if (color_correction) {
396     IMB_colormanagement_display_to_scene_linear_v3(color, display);
397   }
398 }
399
400 void paint_brush_init_tex(Brush *brush)
401 {
402   /* init mtex nodes */
403   if (brush) {
404     MTex *mtex = &brush->mtex;
405     if (mtex->tex && mtex->tex->nodetree) {
406       /* has internal flag to detect it only does it once */
407       ntreeTexBeginExecTree(mtex->tex->nodetree);
408     }
409     mtex = &brush->mask_mtex;
410     if (mtex->tex && mtex->tex->nodetree) {
411       ntreeTexBeginExecTree(mtex->tex->nodetree);
412     }
413   }
414 }
415
416 void paint_brush_exit_tex(Brush *brush)
417 {
418   if (brush) {
419     MTex *mtex = &brush->mtex;
420     if (mtex->tex && mtex->tex->nodetree) {
421       ntreeTexEndExecTree(mtex->tex->nodetree->execdata);
422     }
423     mtex = &brush->mask_mtex;
424     if (mtex->tex && mtex->tex->nodetree) {
425       ntreeTexEndExecTree(mtex->tex->nodetree->execdata);
426     }
427   }
428 }
429
430 static void gradient_draw_line(bContext *UNUSED(C), int x, int y, void *customdata)
431 {
432   PaintOperation *pop = (PaintOperation *)customdata;
433
434   if (pop) {
435     GPU_line_smooth(true);
436     GPU_blend(true);
437
438     GPUVertFormat *format = immVertexFormat();
439     uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_I32, 2, GPU_FETCH_INT_TO_FLOAT);
440
441     ARegion *ar = pop->vc.ar;
442
443     immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
444
445     GPU_line_width(4.0);
446     immUniformColor4ub(0, 0, 0, 255);
447
448     immBegin(GPU_PRIM_LINES, 2);
449     immVertex2i(pos, x, y);
450     immVertex2i(pos, pop->startmouse[0] + ar->winrct.xmin, pop->startmouse[1] + ar->winrct.ymin);
451     immEnd();
452
453     GPU_line_width(2.0);
454     immUniformColor4ub(255, 255, 255, 255);
455
456     immBegin(GPU_PRIM_LINES, 2);
457     immVertex2i(pos, x, y);
458     immVertex2i(pos, pop->startmouse[0] + ar->winrct.xmin, pop->startmouse[1] + ar->winrct.ymin);
459     immEnd();
460
461     immUnbindProgram();
462
463     GPU_blend(false);
464     GPU_line_smooth(false);
465   }
466 }
467
468 static PaintOperation *texture_paint_init(bContext *C, wmOperator *op, const float mouse[2])
469 {
470   Scene *scene = CTX_data_scene(C);
471   ToolSettings *settings = scene->toolsettings;
472   PaintOperation *pop = MEM_callocN(sizeof(PaintOperation), "PaintOperation"); /* caller frees */
473   Brush *brush = BKE_paint_brush(&settings->imapaint.paint);
474   int mode = RNA_enum_get(op->ptr, "mode");
475   ED_view3d_viewcontext_init(C, &pop->vc);
476
477   copy_v2_v2(pop->prevmouse, mouse);
478   copy_v2_v2(pop->startmouse, mouse);
479
480   /* initialize from context */
481   if (CTX_wm_region_view3d(C)) {
482     ViewLayer *view_layer = CTX_data_view_layer(C);
483     Object *ob = OBACT(view_layer);
484     bool uvs, mat, tex, stencil;
485     if (!BKE_paint_proj_mesh_data_check(scene, ob, &uvs, &mat, &tex, &stencil)) {
486       BKE_paint_data_warning(op->reports, uvs, mat, tex, stencil);
487       MEM_freeN(pop);
488       WM_event_add_notifier(C, NC_SCENE | ND_TOOLSETTINGS, NULL);
489       return NULL;
490     }
491     pop->mode = PAINT_MODE_3D_PROJECT;
492     pop->custom_paint = paint_proj_new_stroke(C, ob, mouse, mode);
493   }
494   else {
495     pop->mode = PAINT_MODE_2D;
496     pop->custom_paint = paint_2d_new_stroke(C, op, mode);
497   }
498
499   if (!pop->custom_paint) {
500     MEM_freeN(pop);
501     return NULL;
502   }
503
504   if ((brush->imagepaint_tool == PAINT_TOOL_FILL) && (brush->flag & BRUSH_USE_GRADIENT)) {
505     pop->cursor = WM_paint_cursor_activate(CTX_wm_manager(C),
506                                            SPACE_TYPE_ANY,
507                                            RGN_TYPE_ANY,
508                                            image_paint_poll,
509                                            gradient_draw_line,
510                                            pop);
511   }
512
513   settings->imapaint.flag |= IMAGEPAINT_DRAWING;
514   ED_image_undo_push_begin(op->type->name, PAINT_MODE_TEXTURE_2D);
515
516   return pop;
517 }
518
519 static void paint_stroke_update_step(bContext *C, struct PaintStroke *stroke, PointerRNA *itemptr)
520 {
521   PaintOperation *pop = paint_stroke_mode_data(stroke);
522   Scene *scene = CTX_data_scene(C);
523   ToolSettings *toolsettings = CTX_data_tool_settings(C);
524   UnifiedPaintSettings *ups = &toolsettings->unified_paint_settings;
525   Brush *brush = BKE_paint_brush(&toolsettings->imapaint.paint);
526
527   float alphafac = (brush->flag & BRUSH_ACCUMULATE) ? ups->overlap_factor : 1.0f;
528
529   /* initial brush values. Maybe it should be considered moving these to stroke system */
530   float startalpha = BKE_brush_alpha_get(scene, brush);
531
532   float mouse[2];
533   float pressure;
534   float size;
535   float distance = paint_stroke_distance_get(stroke);
536   int eraser;
537
538   RNA_float_get_array(itemptr, "mouse", mouse);
539   pressure = RNA_float_get(itemptr, "pressure");
540   eraser = RNA_boolean_get(itemptr, "pen_flip");
541   size = max_ff(1.0f, RNA_float_get(itemptr, "size"));
542
543   /* stroking with fill tool only acts on stroke end */
544   if (brush->imagepaint_tool == PAINT_TOOL_FILL) {
545     copy_v2_v2(pop->prevmouse, mouse);
546     return;
547   }
548
549   if (BKE_brush_use_alpha_pressure(scene, brush)) {
550     BKE_brush_alpha_set(scene, brush, max_ff(0.0f, startalpha * pressure * alphafac));
551   }
552   else {
553     BKE_brush_alpha_set(scene, brush, max_ff(0.0f, startalpha * alphafac));
554   }
555
556   if ((brush->flag & BRUSH_DRAG_DOT) || (brush->flag & BRUSH_ANCHORED)) {
557     UndoStack *ustack = CTX_wm_manager(C)->undo_stack;
558     ED_image_undo_restore(ustack->step_init);
559   }
560
561   if (pop->mode == PAINT_MODE_3D_PROJECT) {
562     paint_proj_stroke(
563         C, pop->custom_paint, pop->prevmouse, mouse, eraser, pressure, distance, size);
564   }
565   else {
566     paint_2d_stroke(pop->custom_paint, pop->prevmouse, mouse, eraser, pressure, distance, size);
567   }
568
569   copy_v2_v2(pop->prevmouse, mouse);
570
571   /* restore brush values */
572   BKE_brush_alpha_set(scene, brush, startalpha);
573 }
574
575 static void paint_stroke_redraw(const bContext *C, struct PaintStroke *stroke, bool final)
576 {
577   PaintOperation *pop = paint_stroke_mode_data(stroke);
578
579   if (pop->mode == PAINT_MODE_3D_PROJECT) {
580     paint_proj_redraw(C, pop->custom_paint, final);
581   }
582   else {
583     paint_2d_redraw(C, pop->custom_paint, final);
584   }
585 }
586
587 static void paint_stroke_done(const bContext *C, struct PaintStroke *stroke)
588 {
589   Scene *scene = CTX_data_scene(C);
590   ToolSettings *toolsettings = scene->toolsettings;
591   PaintOperation *pop = paint_stroke_mode_data(stroke);
592   Brush *brush = BKE_paint_brush(&toolsettings->imapaint.paint);
593
594   toolsettings->imapaint.flag &= ~IMAGEPAINT_DRAWING;
595
596   if (brush->imagepaint_tool == PAINT_TOOL_FILL) {
597     if (brush->flag & BRUSH_USE_GRADIENT) {
598       if (pop->mode == PAINT_MODE_2D) {
599         paint_2d_gradient_fill(C, brush, pop->startmouse, pop->prevmouse, pop->custom_paint);
600       }
601       else {
602         paint_proj_stroke(C,
603                           pop->custom_paint,
604                           pop->startmouse,
605                           pop->prevmouse,
606                           paint_stroke_flipped(stroke),
607                           1.0,
608                           0.0,
609                           BKE_brush_size_get(scene, brush));
610         /* two redraws, one for GPU update, one for notification */
611         paint_proj_redraw(C, pop->custom_paint, false);
612         paint_proj_redraw(C, pop->custom_paint, true);
613       }
614     }
615     else {
616       if (pop->mode == PAINT_MODE_2D) {
617         float color[3];
618         if (paint_stroke_inverted(stroke)) {
619           srgb_to_linearrgb_v3_v3(color, BKE_brush_secondary_color_get(scene, brush));
620         }
621         else {
622           srgb_to_linearrgb_v3_v3(color, BKE_brush_color_get(scene, brush));
623         }
624         paint_2d_bucket_fill(C, color, brush, pop->prevmouse, pop->custom_paint);
625       }
626       else {
627         paint_proj_stroke(C,
628                           pop->custom_paint,
629                           pop->startmouse,
630                           pop->prevmouse,
631                           paint_stroke_flipped(stroke),
632                           1.0,
633                           0.0,
634                           BKE_brush_size_get(scene, brush));
635         /* two redraws, one for GPU update, one for notification */
636         paint_proj_redraw(C, pop->custom_paint, false);
637         paint_proj_redraw(C, pop->custom_paint, true);
638       }
639     }
640   }
641   if (pop->mode == PAINT_MODE_3D_PROJECT) {
642     paint_proj_stroke_done(pop->custom_paint);
643   }
644   else {
645     paint_2d_stroke_done(pop->custom_paint);
646   }
647
648   if (pop->cursor) {
649     WM_paint_cursor_end(CTX_wm_manager(C), pop->cursor);
650   }
651
652   ED_image_undo_push_end();
653
654   /* duplicate warning, see texpaint_init */
655 #if 0
656   if (pop->s.warnmultifile) {
657     BKE_reportf(op->reports,
658                 RPT_WARNING,
659                 "Image requires 4 color channels to paint: %s",
660                 pop->s.warnmultifile);
661   }
662   if (pop->s.warnpackedfile) {
663     BKE_reportf(op->reports,
664                 RPT_WARNING,
665                 "Packed MultiLayer files cannot be painted: %s",
666                 pop->s.warnpackedfile);
667   }
668 #endif
669   MEM_freeN(pop);
670 }
671
672 static bool paint_stroke_test_start(bContext *C, wmOperator *op, const float mouse[2])
673 {
674   PaintOperation *pop;
675
676   /* TODO Should avoid putting this here. Instead, last position should be requested
677    * from stroke system. */
678
679   if (!(pop = texture_paint_init(C, op, mouse))) {
680     return false;
681   }
682
683   paint_stroke_set_mode_data(op->customdata, pop);
684
685   return true;
686 }
687
688 static int paint_invoke(bContext *C, wmOperator *op, const wmEvent *event)
689 {
690   int retval;
691
692   op->customdata = paint_stroke_new(C,
693                                     op,
694                                     NULL,
695                                     paint_stroke_test_start,
696                                     paint_stroke_update_step,
697                                     paint_stroke_redraw,
698                                     paint_stroke_done,
699                                     event->type);
700
701   if ((retval = op->type->modal(C, op, event)) == OPERATOR_FINISHED) {
702     paint_stroke_data_free(op);
703     return OPERATOR_FINISHED;
704   }
705   /* add modal handler */
706   WM_event_add_modal_handler(C, op);
707
708   OPERATOR_RETVAL_CHECK(retval);
709   BLI_assert(retval == OPERATOR_RUNNING_MODAL);
710
711   return OPERATOR_RUNNING_MODAL;
712 }
713
714 static int paint_exec(bContext *C, wmOperator *op)
715 {
716   PropertyRNA *strokeprop;
717   PointerRNA firstpoint;
718   float mouse[2];
719
720   strokeprop = RNA_struct_find_property(op->ptr, "stroke");
721
722   if (!RNA_property_collection_lookup_int(op->ptr, strokeprop, 0, &firstpoint)) {
723     return OPERATOR_CANCELLED;
724   }
725
726   RNA_float_get_array(&firstpoint, "mouse", mouse);
727
728   op->customdata = paint_stroke_new(C,
729                                     op,
730                                     NULL,
731                                     paint_stroke_test_start,
732                                     paint_stroke_update_step,
733                                     paint_stroke_redraw,
734                                     paint_stroke_done,
735                                     0);
736   /* frees op->customdata */
737   return paint_stroke_exec(C, op);
738 }
739
740 void PAINT_OT_image_paint(wmOperatorType *ot)
741 {
742   /* identifiers */
743   ot->name = "Image Paint";
744   ot->idname = "PAINT_OT_image_paint";
745   ot->description = "Paint a stroke into the image";
746
747   /* api callbacks */
748   ot->invoke = paint_invoke;
749   ot->modal = paint_stroke_modal;
750   ot->exec = paint_exec;
751   ot->poll = image_paint_poll;
752   ot->cancel = paint_stroke_cancel;
753
754   /* flags */
755   ot->flag = OPTYPE_BLOCKING;
756
757   paint_stroke_operator_properties(ot);
758 }
759
760 int get_imapaint_zoom(bContext *C, float *zoomx, float *zoomy)
761 {
762   RegionView3D *rv3d = CTX_wm_region_view3d(C);
763
764   if (!rv3d) {
765     SpaceImage *sima = CTX_wm_space_image(C);
766
767     if (sima->mode == SI_MODE_PAINT) {
768       ARegion *ar = CTX_wm_region(C);
769       ED_space_image_get_zoom(sima, ar, zoomx, zoomy);
770
771       return 1;
772     }
773   }
774
775   *zoomx = *zoomy = 1;
776
777   return 0;
778 }
779
780 /************************ cursor drawing *******************************/
781
782 static void toggle_paint_cursor(bContext *C, int enable)
783 {
784   wmWindowManager *wm = CTX_wm_manager(C);
785   Scene *scene = CTX_data_scene(C);
786   ToolSettings *settings = scene->toolsettings;
787
788   if (settings->imapaint.paintcursor && !enable) {
789     WM_paint_cursor_end(wm, settings->imapaint.paintcursor);
790     settings->imapaint.paintcursor = NULL;
791     paint_cursor_delete_textures();
792   }
793   else if (enable) {
794     paint_cursor_start(C, image_paint_poll);
795   }
796 }
797
798 /* enable the paint cursor if it isn't already.
799  *
800  * purpose is to make sure the paint cursor is shown if paint
801  * mode is enabled in the image editor. the paint poll will
802  * ensure that the cursor is hidden when not in paint mode */
803 void ED_space_image_paint_update(Main *bmain, wmWindowManager *wm, Scene *scene)
804 {
805   ToolSettings *settings = scene->toolsettings;
806   ImagePaintSettings *imapaint = &settings->imapaint;
807   bool enabled = false;
808
809   for (wmWindow *win = wm->windows.first; win; win = win->next) {
810     bScreen *screen = WM_window_get_active_screen(win);
811
812     for (ScrArea *sa = screen->areabase.first; sa; sa = sa->next) {
813       if (sa->spacetype == SPACE_IMAGE) {
814         if (((SpaceImage *)sa->spacedata.first)->mode == SI_MODE_PAINT) {
815           enabled = true;
816         }
817       }
818     }
819   }
820
821   if (enabled) {
822     BKE_paint_init(bmain, scene, PAINT_MODE_TEXTURE_2D, PAINT_CURSOR_TEXTURE_PAINT);
823
824     paint_cursor_start_explicit(&imapaint->paint, wm, image_paint_poll);
825   }
826   else {
827     paint_cursor_delete_textures();
828   }
829 }
830
831 /************************ grab clone operator ************************/
832
833 typedef struct GrabClone {
834   float startoffset[2];
835   int startx, starty;
836 } GrabClone;
837
838 static void grab_clone_apply(bContext *C, wmOperator *op)
839 {
840   Brush *brush = image_paint_brush(C);
841   float delta[2];
842
843   RNA_float_get_array(op->ptr, "delta", delta);
844   add_v2_v2(brush->clone.offset, delta);
845   ED_region_tag_redraw(CTX_wm_region(C));
846 }
847
848 static int grab_clone_exec(bContext *C, wmOperator *op)
849 {
850   grab_clone_apply(C, op);
851
852   return OPERATOR_FINISHED;
853 }
854
855 static int grab_clone_invoke(bContext *C, wmOperator *op, const wmEvent *event)
856 {
857   Brush *brush = image_paint_brush(C);
858   GrabClone *cmv;
859
860   cmv = MEM_callocN(sizeof(GrabClone), "GrabClone");
861   copy_v2_v2(cmv->startoffset, brush->clone.offset);
862   cmv->startx = event->x;
863   cmv->starty = event->y;
864   op->customdata = cmv;
865
866   WM_event_add_modal_handler(C, op);
867
868   return OPERATOR_RUNNING_MODAL;
869 }
870
871 static int grab_clone_modal(bContext *C, wmOperator *op, const wmEvent *event)
872 {
873   Brush *brush = image_paint_brush(C);
874   ARegion *ar = CTX_wm_region(C);
875   GrabClone *cmv = op->customdata;
876   float startfx, startfy, fx, fy, delta[2];
877   int xmin = ar->winrct.xmin, ymin = ar->winrct.ymin;
878
879   switch (event->type) {
880     case LEFTMOUSE:
881     case MIDDLEMOUSE:
882     case RIGHTMOUSE:  // XXX hardcoded
883       MEM_freeN(op->customdata);
884       return OPERATOR_FINISHED;
885     case MOUSEMOVE:
886       /* mouse moved, so move the clone image */
887       UI_view2d_region_to_view(
888           &ar->v2d, cmv->startx - xmin, cmv->starty - ymin, &startfx, &startfy);
889       UI_view2d_region_to_view(&ar->v2d, event->x - xmin, event->y - ymin, &fx, &fy);
890
891       delta[0] = fx - startfx;
892       delta[1] = fy - startfy;
893       RNA_float_set_array(op->ptr, "delta", delta);
894
895       copy_v2_v2(brush->clone.offset, cmv->startoffset);
896
897       grab_clone_apply(C, op);
898       break;
899   }
900
901   return OPERATOR_RUNNING_MODAL;
902 }
903
904 static void grab_clone_cancel(bContext *UNUSED(C), wmOperator *op)
905 {
906   MEM_freeN(op->customdata);
907 }
908
909 void PAINT_OT_grab_clone(wmOperatorType *ot)
910 {
911   /* identifiers */
912   ot->name = "Grab Clone";
913   ot->idname = "PAINT_OT_grab_clone";
914   ot->description = "Move the clone source image";
915
916   /* api callbacks */
917   ot->exec = grab_clone_exec;
918   ot->invoke = grab_clone_invoke;
919   ot->modal = grab_clone_modal;
920   ot->cancel = grab_clone_cancel;
921   ot->poll = image_paint_2d_clone_poll;
922
923   /* flags */
924   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
925
926   /* properties */
927   RNA_def_float_vector(ot->srna,
928                        "delta",
929                        2,
930                        NULL,
931                        -FLT_MAX,
932                        FLT_MAX,
933                        "Delta",
934                        "Delta offset of clone image in 0.0..1.0 coordinates",
935                        -1.0f,
936                        1.0f);
937 }
938
939 /******************** sample color operator ********************/
940 typedef struct {
941   bool show_cursor;
942   short event_type;
943   float initcolor[3];
944   bool sample_palette;
945 } SampleColorData;
946
947 static void sample_color_update_header(SampleColorData *data, bContext *C)
948 {
949   char msg[UI_MAX_DRAW_STR];
950   ScrArea *sa = CTX_wm_area(C);
951
952   if (sa) {
953     BLI_snprintf(msg,
954                  sizeof(msg),
955                  IFACE_("Sample color for %s"),
956                  !data->sample_palette ?
957                      IFACE_("Brush. Use Left Click to sample for palette instead") :
958                      IFACE_("Palette. Use Left Click to sample more colors"));
959     ED_workspace_status_text(C, msg);
960   }
961 }
962
963 static int sample_color_exec(bContext *C, wmOperator *op)
964 {
965   Paint *paint = BKE_paint_get_active_from_context(C);
966   Brush *brush = BKE_paint_brush(paint);
967   ePaintMode mode = BKE_paintmode_get_active_from_context(C);
968   ARegion *ar = CTX_wm_region(C);
969   wmWindow *win = CTX_wm_window(C);
970   const bool show_cursor = ((paint->flags & PAINT_SHOW_BRUSH) != 0);
971   int location[2];
972   paint->flags &= ~PAINT_SHOW_BRUSH;
973
974   /* force redraw without cursor */
975   WM_paint_cursor_tag_redraw(win, ar);
976   WM_redraw_windows(C);
977
978   RNA_int_get_array(op->ptr, "location", location);
979   const bool use_palette = RNA_boolean_get(op->ptr, "palette");
980   const bool use_sample_texture = (mode == PAINT_MODE_TEXTURE_3D) &&
981                                   !RNA_boolean_get(op->ptr, "merged");
982
983   paint_sample_color(C, ar, location[0], location[1], use_sample_texture, use_palette);
984
985   if (show_cursor) {
986     paint->flags |= PAINT_SHOW_BRUSH;
987   }
988
989   WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
990
991   return OPERATOR_FINISHED;
992 }
993
994 static int sample_color_invoke(bContext *C, wmOperator *op, const wmEvent *event)
995 {
996   Scene *scene = CTX_data_scene(C);
997   Paint *paint = BKE_paint_get_active_from_context(C);
998   Brush *brush = BKE_paint_brush(paint);
999   SampleColorData *data = MEM_mallocN(sizeof(SampleColorData), "sample color custom data");
1000   ARegion *ar = CTX_wm_region(C);
1001   wmWindow *win = CTX_wm_window(C);
1002
1003   data->event_type = event->type;
1004   data->show_cursor = ((paint->flags & PAINT_SHOW_BRUSH) != 0);
1005   copy_v3_v3(data->initcolor, BKE_brush_color_get(scene, brush));
1006   data->sample_palette = false;
1007   op->customdata = data;
1008   paint->flags &= ~PAINT_SHOW_BRUSH;
1009
1010   sample_color_update_header(data, C);
1011
1012   WM_event_add_modal_handler(C, op);
1013
1014   /* force redraw without cursor */
1015   WM_paint_cursor_tag_redraw(win, ar);
1016   WM_redraw_windows(C);
1017
1018   RNA_int_set_array(op->ptr, "location", event->mval);
1019
1020   ePaintMode mode = BKE_paintmode_get_active_from_context(C);
1021   const bool use_sample_texture = (mode == PAINT_MODE_TEXTURE_3D) &&
1022                                   !RNA_boolean_get(op->ptr, "merged");
1023
1024   paint_sample_color(C, ar, event->mval[0], event->mval[1], use_sample_texture, false);
1025   WM_cursor_modal_set(win, BC_EYEDROPPER_CURSOR);
1026
1027   WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
1028
1029   return OPERATOR_RUNNING_MODAL;
1030 }
1031
1032 static int sample_color_modal(bContext *C, wmOperator *op, const wmEvent *event)
1033 {
1034   Scene *scene = CTX_data_scene(C);
1035   SampleColorData *data = op->customdata;
1036   Paint *paint = BKE_paint_get_active_from_context(C);
1037   Brush *brush = BKE_paint_brush(paint);
1038
1039   if ((event->type == data->event_type) && (event->val == KM_RELEASE)) {
1040     if (data->show_cursor) {
1041       paint->flags |= PAINT_SHOW_BRUSH;
1042     }
1043
1044     if (data->sample_palette) {
1045       BKE_brush_color_set(scene, brush, data->initcolor);
1046       RNA_boolean_set(op->ptr, "palette", true);
1047     }
1048     WM_cursor_modal_restore(CTX_wm_window(C));
1049     MEM_freeN(data);
1050     ED_workspace_status_text(C, NULL);
1051
1052     return OPERATOR_FINISHED;
1053   }
1054
1055   ePaintMode mode = BKE_paintmode_get_active_from_context(C);
1056   const bool use_sample_texture = (mode == PAINT_MODE_TEXTURE_3D) &&
1057                                   !RNA_boolean_get(op->ptr, "merged");
1058
1059   switch (event->type) {
1060     case MOUSEMOVE: {
1061       ARegion *ar = CTX_wm_region(C);
1062       RNA_int_set_array(op->ptr, "location", event->mval);
1063       paint_sample_color(C, ar, event->mval[0], event->mval[1], use_sample_texture, false);
1064       WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
1065       break;
1066     }
1067
1068     case LEFTMOUSE:
1069       if (event->val == KM_PRESS) {
1070         ARegion *ar = CTX_wm_region(C);
1071         RNA_int_set_array(op->ptr, "location", event->mval);
1072         paint_sample_color(C, ar, event->mval[0], event->mval[1], use_sample_texture, true);
1073         if (!data->sample_palette) {
1074           data->sample_palette = true;
1075           sample_color_update_header(data, C);
1076         }
1077         WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, brush);
1078       }
1079       break;
1080   }
1081
1082   return OPERATOR_RUNNING_MODAL;
1083 }
1084
1085 static bool sample_color_poll(bContext *C)
1086 {
1087   return (image_paint_poll_ignore_tool(C) || vertex_paint_poll_ignore_tool(C));
1088 }
1089
1090 void PAINT_OT_sample_color(wmOperatorType *ot)
1091 {
1092   /* identifiers */
1093   ot->name = "Sample Color";
1094   ot->idname = "PAINT_OT_sample_color";
1095   ot->description = "Use the mouse to sample a color in the image";
1096
1097   /* api callbacks */
1098   ot->exec = sample_color_exec;
1099   ot->invoke = sample_color_invoke;
1100   ot->modal = sample_color_modal;
1101   ot->poll = sample_color_poll;
1102
1103   /* flags */
1104   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1105
1106   /* properties */
1107   PropertyRNA *prop;
1108
1109   prop = RNA_def_int_vector(ot->srna, "location", 2, NULL, 0, INT_MAX, "Location", "", 0, 16384);
1110   RNA_def_property_flag(prop, PROP_SKIP_SAVE | PROP_HIDDEN);
1111
1112   RNA_def_boolean(ot->srna, "merged", 0, "Sample Merged", "Sample the output display color");
1113   RNA_def_boolean(ot->srna, "palette", 0, "Add to Palette", "");
1114 }
1115
1116 /******************** texture paint toggle operator ********************/
1117
1118 static bool texture_paint_toggle_poll(bContext *C)
1119 {
1120   Object *ob = CTX_data_active_object(C);
1121   if (ob == NULL || ob->type != OB_MESH) {
1122     return 0;
1123   }
1124   if (!ob->data || ID_IS_LINKED(ob->data)) {
1125     return 0;
1126   }
1127   if (CTX_data_edit_object(C)) {
1128     return 0;
1129   }
1130
1131   return 1;
1132 }
1133
1134 static int texture_paint_toggle_exec(bContext *C, wmOperator *op)
1135 {
1136   struct wmMsgBus *mbus = CTX_wm_message_bus(C);
1137   Main *bmain = CTX_data_main(C);
1138   Scene *scene = CTX_data_scene(C);
1139   Object *ob = CTX_data_active_object(C);
1140   const int mode_flag = OB_MODE_TEXTURE_PAINT;
1141   const bool is_mode_set = (ob->mode & mode_flag) != 0;
1142
1143   if (!is_mode_set) {
1144     if (!ED_object_mode_compat_set(C, ob, mode_flag, op->reports)) {
1145       return OPERATOR_CANCELLED;
1146     }
1147   }
1148
1149   if (ob->mode & mode_flag) {
1150     ob->mode &= ~mode_flag;
1151
1152     if (U.glreslimit != 0) {
1153       GPU_free_images(bmain);
1154     }
1155     GPU_paint_set_mipmap(bmain, 1);
1156
1157     toggle_paint_cursor(C, 0);
1158   }
1159   else {
1160     bScreen *sc;
1161     Image *ima = NULL;
1162     ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
1163
1164     /* This has to stay here to regenerate the texture paint
1165      * cache in case we are loading a file */
1166     BKE_texpaint_slots_refresh_object(scene, ob);
1167
1168     BKE_paint_proj_mesh_data_check(scene, ob, NULL, NULL, NULL, NULL);
1169
1170     /* entering paint mode also sets image to editors */
1171     if (imapaint->mode == IMAGEPAINT_MODE_MATERIAL) {
1172       /* set the current material active paint slot on image editor */
1173       Material *ma = give_current_material(ob, ob->actcol);
1174
1175       if (ma && ma->texpaintslot) {
1176         ima = ma->texpaintslot[ma->paint_active_slot].ima;
1177       }
1178     }
1179     else if (imapaint->mode == IMAGEPAINT_MODE_IMAGE) {
1180       ima = imapaint->canvas;
1181     }
1182
1183     if (ima) {
1184       for (sc = bmain->screens.first; sc; sc = sc->id.next) {
1185         ScrArea *sa;
1186         for (sa = sc->areabase.first; sa; sa = sa->next) {
1187           SpaceLink *sl;
1188           for (sl = sa->spacedata.first; sl; sl = sl->next) {
1189             if (sl->spacetype == SPACE_IMAGE) {
1190               SpaceImage *sima = (SpaceImage *)sl;
1191
1192               if (!sima->pin) {
1193                 Object *obedit = CTX_data_edit_object(C);
1194                 ED_space_image_set(bmain, sima, obedit, ima, true);
1195               }
1196             }
1197           }
1198         }
1199       }
1200     }
1201
1202     ob->mode |= mode_flag;
1203
1204     BKE_paint_init(bmain, scene, PAINT_MODE_TEXTURE_3D, PAINT_CURSOR_TEXTURE_PAINT);
1205
1206     BKE_paint_toolslots_brush_validate(bmain, &imapaint->paint);
1207
1208     if (U.glreslimit != 0) {
1209       GPU_free_images(bmain);
1210     }
1211     GPU_paint_set_mipmap(bmain, 0);
1212
1213     toggle_paint_cursor(C, 1);
1214   }
1215
1216   Mesh *me = BKE_mesh_from_object(ob);
1217   BLI_assert(me != NULL);
1218   DEG_id_tag_update(&me->id, ID_RECALC_COPY_ON_WRITE);
1219
1220   WM_event_add_notifier(C, NC_SCENE | ND_MODE, scene);
1221
1222   WM_msg_publish_rna_prop(mbus, &ob->id, ob, Object, mode);
1223
1224   WM_toolsystem_update_from_context_view3d(C);
1225
1226   return OPERATOR_FINISHED;
1227 }
1228
1229 void PAINT_OT_texture_paint_toggle(wmOperatorType *ot)
1230 {
1231   /* identifiers */
1232   ot->name = "Texture Paint Toggle";
1233   ot->idname = "PAINT_OT_texture_paint_toggle";
1234   ot->description = "Toggle texture paint mode in 3D view";
1235
1236   /* api callbacks */
1237   ot->exec = texture_paint_toggle_exec;
1238   ot->poll = texture_paint_toggle_poll;
1239
1240   /* flags */
1241   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_USE_EVAL_DATA;
1242 }
1243
1244 static int brush_colors_flip_exec(bContext *C, wmOperator *UNUSED(op))
1245 {
1246   Scene *scene = CTX_data_scene(C);
1247   UnifiedPaintSettings *ups = &scene->toolsettings->unified_paint_settings;
1248
1249   ViewLayer *view_layer = CTX_data_view_layer(C);
1250   Paint *paint = BKE_paint_get_active(scene, view_layer);
1251   Brush *br = BKE_paint_brush(paint);
1252
1253   if (ups->flag & UNIFIED_PAINT_COLOR) {
1254     swap_v3_v3(ups->rgb, ups->secondary_rgb);
1255   }
1256   else if (br) {
1257     swap_v3_v3(br->rgb, br->secondary_rgb);
1258   }
1259   WM_event_add_notifier(C, NC_BRUSH | NA_EDITED, br);
1260
1261   return OPERATOR_FINISHED;
1262 }
1263
1264 static bool brush_colors_flip_poll(bContext *C)
1265 {
1266   if (image_paint_poll(C)) {
1267     Brush *br = image_paint_brush(C);
1268     if (ELEM(br->imagepaint_tool, PAINT_TOOL_DRAW, PAINT_TOOL_FILL)) {
1269       return true;
1270     }
1271   }
1272   else {
1273     Object *ob = CTX_data_active_object(C);
1274     if (ob != NULL) {
1275       if (ob->mode & (OB_MODE_VERTEX_PAINT | OB_MODE_TEXTURE_PAINT)) {
1276         return true;
1277       }
1278     }
1279   }
1280   return false;
1281 }
1282
1283 void PAINT_OT_brush_colors_flip(wmOperatorType *ot)
1284 {
1285   /* identifiers */
1286   ot->name = "Brush Colors Flip";
1287   ot->idname = "PAINT_OT_brush_colors_flip";
1288   ot->description = "Toggle foreground and background brush colors";
1289
1290   /* api callbacks */
1291   ot->exec = brush_colors_flip_exec;
1292   ot->poll = brush_colors_flip_poll;
1293
1294   /* flags */
1295   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
1296 }
1297
1298 void ED_imapaint_bucket_fill(struct bContext *C, float color[3], wmOperator *op)
1299 {
1300   wmWindowManager *wm = CTX_wm_manager(C);
1301   SpaceImage *sima = CTX_wm_space_image(C);
1302   Image *ima = sima->image;
1303
1304   BKE_undosys_step_push_init_with_type(wm->undo_stack, C, op->type->name, BKE_UNDOSYS_TYPE_IMAGE);
1305
1306   ED_image_undo_push_begin(op->type->name, PAINT_MODE_TEXTURE_2D);
1307
1308   paint_2d_bucket_fill(C, color, NULL, NULL, NULL);
1309
1310   BKE_undosys_step_push(wm->undo_stack, C, op->type->name);
1311
1312   DEG_id_tag_update(&ima->id, 0);
1313 }
1314
1315 static bool texture_paint_poll(bContext *C)
1316 {
1317   if (texture_paint_toggle_poll(C)) {
1318     if (CTX_data_active_object(C)->mode & OB_MODE_TEXTURE_PAINT) {
1319       return 1;
1320     }
1321   }
1322
1323   return 0;
1324 }
1325
1326 bool image_texture_paint_poll(bContext *C)
1327 {
1328   return (texture_paint_poll(C) || image_paint_poll(C));
1329 }
1330
1331 bool facemask_paint_poll(bContext *C)
1332 {
1333   return BKE_paint_select_face_test(CTX_data_active_object(C));
1334 }
1335
1336 bool vert_paint_poll(bContext *C)
1337 {
1338   return BKE_paint_select_vert_test(CTX_data_active_object(C));
1339 }
1340
1341 bool mask_paint_poll(bContext *C)
1342 {
1343   return BKE_paint_select_elem_test(CTX_data_active_object(C));
1344 }