mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-07 12:01:50 +00:00
feat: autoresize (extend/shrink) canvas element
This commit is contained in:
parent
b644a76904
commit
0d4838facf
7 changed files with 52 additions and 17 deletions
|
|
@ -470,6 +470,32 @@ void ImageData::addColor(const ImageData& other, int multiplier) {
|
|||
}
|
||||
}
|
||||
|
||||
void ImageData::extend(int newWidth, int newHeight) {
|
||||
size_t comps;
|
||||
switch (format) {
|
||||
case ImageFormat::rgb888: comps = 3; break;
|
||||
case ImageFormat::rgba8888: comps = 4; break;
|
||||
default:
|
||||
throw std::runtime_error("only unsigned byte formats supported");
|
||||
}
|
||||
auto newData = std::make_unique<ubyte[]>(newWidth * newHeight * comps);
|
||||
for (uint y = 0; y < newHeight; y++) {
|
||||
for (uint x = 0; x < newWidth; x++) {
|
||||
for (size_t c = 0; c < comps; c++) {
|
||||
if (x < width && y < height) {
|
||||
newData[(y * newWidth + x) * comps + c] =
|
||||
data[(y * width + x) * comps + c];
|
||||
} else {
|
||||
newData[(y * newWidth + x) * comps + c] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
data = std::move(newData);
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
}
|
||||
|
||||
void ImageData::addColor(const glm::ivec4& color, int multiplier) {
|
||||
uint comps;
|
||||
switch (format) {
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ public:
|
|||
void mulColor(const ImageData& other);
|
||||
void addColor(const glm::ivec4& color, int multiplier);
|
||||
void addColor(const ImageData& other, int multiplier);
|
||||
void extend(int newWidth, int newHeight);
|
||||
|
||||
std::unique_ptr<ImageData> cropped(int x, int y, int width, int height) const;
|
||||
|
||||
|
|
|
|||
|
|
@ -44,10 +44,10 @@ void Texture::unbind() const {
|
|||
void Texture::reload(const ImageData& image) {
|
||||
width = image.getWidth();
|
||||
height = image.getHeight();
|
||||
reload(image.getData());
|
||||
reload(image.getData(), width, height);
|
||||
}
|
||||
|
||||
void Texture::reload(const ubyte* data) {
|
||||
void Texture::reload(const ubyte* data, uint width, uint height) {
|
||||
glBindTexture(GL_TEXTURE_2D, id);
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0,
|
||||
GL_RGBA, GL_UNSIGNED_BYTE, static_cast<const GLvoid*>(data));
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ public:
|
|||
|
||||
virtual void bind() const;
|
||||
virtual void unbind() const;
|
||||
void reload(const ubyte* data);
|
||||
void reload(const ubyte* data, uint w, uint h);
|
||||
void reloadPartial(const ImageData& image, uint x, uint y, uint w, uint h);
|
||||
|
||||
void setNearestFilter();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue