/* image.hpp: image helper * * Copyright (C) 2014: Dalton Nell, Maim Contributors (https://github.com/naelstrof/slop/graphs/contributors). * * This file is part of Maim. * * Maim is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Maim is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Maim. If not, see . */ #ifndef N_IMAGE_H_ #define N_IMAGE_H_ #include #include #include #include #include #include #include #include "x.hpp" static inline unsigned char computeRGBPixel(unsigned char* data, XImage* image, int x, int y, int roffset, int goffset, int boffset, int width, glm::ivec2 offset ) { unsigned int real = XGetPixel(image, x, y); int curpixel = ((y-offset.y)*width+((x-offset.x)))*3; data[curpixel] = (unsigned char)((real & image->red_mask) >> roffset); data[curpixel+1] = (unsigned char)((real & image->green_mask) >> goffset); data[curpixel+2] = (unsigned char)((real & image->blue_mask) >> boffset); } static inline unsigned char computeRGBAPixel(unsigned char* data, XImage* image, int x, int y, int roffset, int goffset, int boffset, int aoffset, int width, glm::ivec2 offset ) { unsigned int real = XGetPixel(image, x, y); int curpixel = ((y-offset.y)*width+((x-offset.x)))*4; data[curpixel] = (unsigned char)((real & image->red_mask) >> roffset); data[curpixel+1] = (unsigned char)((real & image->green_mask) >> goffset); data[curpixel+2] = (unsigned char)((real & image->blue_mask) >> boffset); data[curpixel+3] = (unsigned char)(real >> aoffset); } static inline unsigned char computeRGBAPixel(unsigned char* data, XImage* image, int x, int y, int roffset, int goffset, int boffset, int width, glm::ivec2 offset ) { unsigned int real = XGetPixel(image, x, y); int curpixel = ((y-offset.y)*width+((x-offset.x)))*4; data[curpixel] = (unsigned char)((real & image->red_mask) >> roffset); data[curpixel+1] = (unsigned char)((real & image->green_mask) >> goffset); data[curpixel+2] = (unsigned char)((real & image->blue_mask) >> boffset); data[curpixel+3] = 255; } static inline int get_shift (int mask) { int shift = 0; while (mask) { if (mask & 1) { break; } shift++; mask >>= 1; } return shift; } class ARGBImage { private: unsigned char* data; unsigned int width; unsigned int height; unsigned int channels; int imagex, imagey; bool intersect( XRRCrtcInfo* a, glm::vec4 b ); bool containsCompletely( XRRCrtcInfo* a, glm::vec4 b ); public: void blendCursor( X11* x11 ); void mask(X11* x11); ARGBImage( XImage* image, glm::ivec2 imageloc, glm::ivec4 selectionrect, int channels, X11* x11 ); ~ARGBImage(); void writePNG( std::ostream& streamout, int quality ); void writeJPEG( std::ostream& streamout, int quality ); }; #endif