Skip to content
Permalink
Browse files
Add an [invert:<mode> texture modifier
Inverts the given channels of the base image.
Mode may contain the characters "r", "g", "b", "a".
Only the channels that are mentioned in the mode string will be inverted.
  • Loading branch information
Thomas--S authored and paramat committed Sep 15, 2016
1 parent 6e30dd0 commit 1475c1b1c8bb1a2a2812d485d3590e1f817f7c7b
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
@@ -318,6 +318,15 @@ Example:

default_sandstone.png^[opacity:127

#### `[invert:<mode>`
Inverts the given channels of the base image.
Mode may contain the characters "r", "g", "b", "a".
Only the channels that are mentioned in the mode string will be inverted.

Example:

default_apple.png^[invert:rgb

#### `[brighten`
Brightens the texture.

@@ -1783,9 +1783,48 @@ bool TextureSource::generateImagePart(std::string part_of_name,
for (u32 y = 0; y < dim.Height; y++)
for (u32 x = 0; x < dim.Width; x++)
{
video::SColor c = baseimg->getPixel(x,y);
video::SColor c = baseimg->getPixel(x, y);
c.setAlpha(floor((c.getAlpha() * ratio) / 255 + 0.5));
baseimg->setPixel(x,y,c);
baseimg->setPixel(x, y, c);
}
}
/*
[invert:mode
Inverts the given channels of the base image.
Mode may contain the characters "r", "g", "b", "a".
Only the channels that are mentioned in the mode string
will be inverted.
*/
else if (str_starts_with(part_of_name, "[invert:")) {
if (baseimg == NULL) {
errorstream << "generateImagePart(): baseimg == NULL "
<< "for part_of_name=\"" << part_of_name
<< "\", cancelling." << std::endl;
return false;
}

Strfnd sf(part_of_name);
sf.next(":");

std::string mode = sf.next("");
u32 mask = 0;
if (mode.find("a") != std::string::npos)
mask |= 0xff000000UL;
if (mode.find("r") != std::string::npos)
mask |= 0x00ff0000UL;
if (mode.find("g") != std::string::npos)
mask |= 0x0000ff00UL;
if (mode.find("b") != std::string::npos)
mask |= 0x000000ffUL;

core::dimension2d<u32> dim = baseimg->getDimension();

for (u32 y = 0; y < dim.Height; y++)
for (u32 x = 0; x < dim.Width; x++)
{
video::SColor c = baseimg->getPixel(x, y);
c.color ^= mask;
baseimg->setPixel(x, y, c);
}
}
else

0 comments on commit 1475c1b

Please sign in to comment.