mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-03 21:46:20 +00:00
Add ink type Copy Alpha+Color to custom brush
This commit is contained in:
parent
7160f45296
commit
7fd1c7e0e7
@ -1756,6 +1756,164 @@ void BrushShadingInkProcessing<GrayscaleTraits>::processPixel(int x, int y) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
// Brush Ink - Copy Alpha+Color ink type
|
||||||
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
template<typename ImageTraits>
|
||||||
|
class BrushCopyInkProcessing : public BrushInkProcessingBase<ImageTraits> {
|
||||||
|
public:
|
||||||
|
BrushCopyInkProcessing(ToolLoop* loop) : BrushInkProcessingBase<ImageTraits>(loop) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void processPixel(int x, int y) override {
|
||||||
|
//Do nothing
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void BrushCopyInkProcessing<RgbTraits>::processPixel(int x, int y) {
|
||||||
|
alignPixelPoint(x, y);
|
||||||
|
if (m_brushMask && !get_pixel_fast<BitmapTraits>(m_brushMask, x, y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
color_t c;
|
||||||
|
switch (m_brushImage->pixelFormat()) {
|
||||||
|
case IMAGE_RGB: {
|
||||||
|
c = get_pixel_fast<RgbTraits>(m_brushImage, x, y);
|
||||||
|
if (rgba_geta(c) == 0)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_INDEXED: {
|
||||||
|
// TODO m_palette->getEntry(c) does not work because the m_palette member is
|
||||||
|
// loaded the Graya Palette, NOT the original Indexed Palette from where m_brushImage belongs.
|
||||||
|
// This conversion can be possible if we load the palette pointer in m_brush when
|
||||||
|
// is created the custom brush in the Indexed Sprite.
|
||||||
|
c = get_pixel_fast<IndexedTraits>(m_brushImage, x, y);
|
||||||
|
if (c == m_transparentColor) {
|
||||||
|
*m_dstAddress = *m_srcAddress;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
c = m_palette->getEntry(c);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_GRAYSCALE: {
|
||||||
|
c = get_pixel_fast<GrayscaleTraits>(m_brushImage, x, y);
|
||||||
|
if (graya_geta(c) == 0)
|
||||||
|
return;
|
||||||
|
c = rgba(graya_getv(c), graya_getv(c), graya_getv(c), graya_geta(c));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_BITMAP: {
|
||||||
|
// TODO In which circuntance is possible this case?
|
||||||
|
c = get_pixel_fast<BitmapTraits>(m_brushImage, x, y);
|
||||||
|
c = c ? m_fgColor: m_bgColor;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
ASSERT(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*m_dstAddress = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void BrushCopyInkProcessing<IndexedTraits>::processPixel(int x, int y) {
|
||||||
|
alignPixelPoint(x, y);
|
||||||
|
if (m_brushMask && !get_pixel_fast<BitmapTraits>(m_brushMask, x, y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
color_t c;
|
||||||
|
switch (m_brushImage->pixelFormat()) {
|
||||||
|
case IMAGE_RGB: {
|
||||||
|
c = get_pixel_fast<RgbTraits>(m_brushImage, x, y);
|
||||||
|
if (rgba_geta(c) == 0)
|
||||||
|
return;
|
||||||
|
c = m_palette->findBestfit(rgba_getr(c), rgba_getg(c), rgba_getb(c), rgba_geta(c), 0);
|
||||||
|
if (c == 0)
|
||||||
|
c = *m_srcAddress;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_INDEXED: {
|
||||||
|
c = get_pixel_fast<IndexedTraits>(m_brushImage, x, y);
|
||||||
|
if (c == m_transparentColor)
|
||||||
|
c = *m_srcAddress;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_GRAYSCALE: {
|
||||||
|
c = get_pixel_fast<GrayscaleTraits>(m_brushImage, x, y);
|
||||||
|
if (graya_geta(c) == 0)
|
||||||
|
return;
|
||||||
|
c = m_palette->findBestfit(graya_getv(c),
|
||||||
|
graya_getv(c),
|
||||||
|
graya_getv(c),
|
||||||
|
graya_geta(c), 0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_BITMAP: {
|
||||||
|
// TODO In which circuntance is possible this case?
|
||||||
|
c = get_pixel_fast<BitmapTraits>(m_brushImage, x, y);
|
||||||
|
c = c ? m_fgColor: m_bgColor;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
ASSERT(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*m_dstAddress = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
void BrushCopyInkProcessing<GrayscaleTraits>::processPixel(int x, int y) {
|
||||||
|
alignPixelPoint(x, y);
|
||||||
|
if (m_brushMask && !get_pixel_fast<BitmapTraits>(m_brushMask, x, y))
|
||||||
|
return;
|
||||||
|
|
||||||
|
color_t c;
|
||||||
|
switch (m_brushImage->pixelFormat()) {
|
||||||
|
case IMAGE_RGB: {
|
||||||
|
c = get_pixel_fast<RgbTraits>(m_brushImage, x, y);
|
||||||
|
if (rgba_geta(c) == 0)
|
||||||
|
return;
|
||||||
|
c = graya(rgba_luma(c), rgba_geta(c));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_INDEXED: {
|
||||||
|
// TODO m_palette->getEntry(c) does not work because the
|
||||||
|
// m_palette member is loaded the Graya Palette, NOT the
|
||||||
|
// original Indexed Palette from where m_brushImage belongs.
|
||||||
|
// This conversion can be possible if we load the palette
|
||||||
|
// pointer in m_brush when is created the custom brush in the
|
||||||
|
// Indexed Sprite.
|
||||||
|
c = get_pixel_fast<IndexedTraits>(m_brushImage, x, y);
|
||||||
|
if (c == m_transparentColor) {
|
||||||
|
*m_dstAddress = *m_srcAddress;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
c = m_palette->getEntry(c);
|
||||||
|
c = graya(rgba_luma(c), rgba_geta(c));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_GRAYSCALE: {
|
||||||
|
c = get_pixel_fast<GrayscaleTraits>(m_brushImage, x, y);
|
||||||
|
if (graya_geta(c) == 0)
|
||||||
|
return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case IMAGE_BITMAP: {
|
||||||
|
// TODO In which circuntance is possible this case?
|
||||||
|
c = get_pixel_fast<BitmapTraits>(m_brushImage, x, y);
|
||||||
|
c = c ? m_fgColor: m_bgColor;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
ASSERT(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
*m_dstAddress = c;
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template<template<typename> class T>
|
template<template<typename> class T>
|
||||||
|
@ -89,6 +89,9 @@ public:
|
|||||||
case LockAlpha:
|
case LockAlpha:
|
||||||
setProc(get_ink_proc<BrushLockAlphaInkProcessing>(loop));
|
setProc(get_ink_proc<BrushLockAlphaInkProcessing>(loop));
|
||||||
break;
|
break;
|
||||||
|
case Copy:
|
||||||
|
setProc(get_ink_proc<BrushCopyInkProcessing>(loop));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
setProc(get_ink_proc<BrushSimpleInkProcessing>(loop));
|
setProc(get_ink_proc<BrushSimpleInkProcessing>(loop));
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user