| |
| |
| #include "tgl.h" |
| |
| |
| #include <QPixmap> |
| #include <QImage> |
| #include <QOpenGLWidget> |
| #include <QDesktopWidget> |
| #include <QApplication> |
| |
| #include "toonzqt/pickrgbutils.h" |
| |
| |
| |
| |
| |
| namespace { |
| |
| QRgb meanColor(const QImage &img, const QRect &rect) { |
| if (rect.width() == 1 && rect.height() == 1) |
| return img.pixel(rect.left(), rect.top()); |
| |
| int r, g, b, m; |
| int x, y, x1 = rect.right(), y1 = rect.bottom(), |
| count = rect.width() * rect.height(); |
| |
| r = g = b = m = 0; |
| for (y = rect.top(); y <= y1; ++y) |
| for (x = rect.left(); x <= x1; ++x) { |
| QRgb color = img.pixel(x, y); |
| |
| r += (color & 0xff); |
| g += ((color >> 8) & 0xff); |
| b += ((color >> 16) & 0xff); |
| m += ((color >> 24) & 0xff); |
| } |
| |
| r = r / count; |
| g = g / count; |
| b = b / count; |
| m = m / count; |
| |
| return r | (g << 8) | (b << 16) | (m << 24); |
| } |
| } |
| |
| |
| |
| QRgb pickRGB(QWidget *widget, const QRect &rect) { |
| QImage img(QPixmap::grabWidget(widget, rect.x(), rect.y(), rect.width(), |
| rect.height()) |
| .toImage()); |
| return meanColor(img, img.rect()); |
| } |
| |
| |
| |
| QRgb pickScreenRGB(const QRect &rect) { |
| QWidget *widget = QApplication::desktop(); |
| |
| #ifdef MACOSX |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| const QRect &screen0Geom = QApplication::desktop()->screenGeometry(0); |
| |
| int left = std::min(rect.left(), screen0Geom.right()); |
| int top = std::min(rect.top(), screen0Geom.bottom()); |
| int right = std::max(rect.right(), screen0Geom.left()); |
| int bottom = std::max(rect.bottom(), screen0Geom.right()); |
| |
| QRect theRect(QPoint(left, top), QPoint(right, bottom)); |
| |
| #else |
| |
| const QRect &theRect = rect; |
| |
| #endif |
| |
| QImage img(QPixmap::grabWindow(widget->winId(), theRect.x(), theRect.y(), |
| theRect.width(), theRect.height()) |
| .toImage()); |
| return meanColor( |
| img, QRect(rect.left() - theRect.left(), rect.top() - theRect.top(), |
| rect.width(), rect.height())); |
| } |
| |
| |
| |
| QRgb pickRGB(QOpenGLWidget *widget, const QRect &rect) { |
| widget->makeCurrent(); |
| |
| glReadBuffer(GL_FRONT); |
| |
| QImage img(rect.size(), QImage::Format_ARGB32); |
| glReadPixels(rect.x(), widget->height() - rect.y(), rect.width(), |
| rect.height(), GL_BGRA_EXT, GL_UNSIGNED_BYTE, img.bits()); |
| |
| widget->doneCurrent(); |
| |
| return meanColor(img, img.rect()); |
| } |
| |