示例#1
0
Window decorateWindow(Display *display, Drawable window, Window root, GC gc, int x, int y, int width, int height, Window *resizer) {
	Window newParent;
	XSetWindowAttributes attrib;
	XWindowAttributes attr;
	XWindowAttributes incomingAttribs;
	char *title;

	// This is entirely for window border compensation
	// FIXME: This _works_, but looks like crap for anything with more than a 1px border, in the future this should do up to one pixel and start adjusting the container window for the remainder
	XGetWindowAttributes(display, window, &incomingAttribs);

	attr.width = width;
	attr.height = height + TITLEBAR_THICKNESS;
	
	// Flag as override_redirect, so that we don't decorate decorations
	attrib.override_redirect = 1;
	
	// Create New Parent
	newParent = XCreateWindow(display, root, x, y, width + 3, height + 2 + TITLEBAR_THICKNESS, 0, CopyFromParent, InputOutput, CopyFromParent, CWOverrideRedirect, &attrib);
	XReparentWindow(display, window, newParent, 1 - incomingAttribs.border_width, TITLEBAR_THICKNESS - incomingAttribs.border_width);
	
	// Create Resize Button Window
	*resizer = XCreateWindow(display, newParent, RECT_RESIZE_BTN, 0, CopyFromParent, CopyFromParent, CopyFromParent, 0, 0);
	XMapRaised(display, *resizer);
	
	// Set Cursor
	Cursor cur = XCreateFontCursor(display, XC_left_ptr);
	XDefineCursor(display, newParent, cur);
	
	// Readjust attributes to now refer to the decoration window (these are the same magic numbers as above, fix this sometime)
	attr.width += 3;
	attr.height += 2;

	// Draw Time
	XMapWindow(display, newParent);
	XFetchName(display, window, &title);
	drawDecorations(display, newParent, gc, title, attr);
	drawResizeButton(display, *resizer, gc, RECT_RESIZE_DRAW);

	if (title) {
		XFree(title);
	}

	return newParent;
}
void KisQPainterCanvas::paintEvent(QPaintEvent * ev)
{
    KisImageWSP image = canvas()->image();
    if (image == 0) return;

    setAutoFillBackground(false);

    if (m_buffer.size() != size()) {
        m_buffer = QImage(size(), QImage::Format_ARGB32_Premultiplied);
    }


    QPainter gc(&m_buffer);

    // we double buffer, so we paint on an image first, then from the image onto the canvas,
    // so copy the clip region since otherwise we're filling the whole buffer every time with
    // the background color _and_ the transparent squares.
    gc.setClipRegion(ev->region());

    KisCoordinatesConverter *converter = coordinatesConverter();
    QTransform imageTransform = converter->viewportToWidgetTransform();

    gc.save();

    gc.setCompositionMode(QPainter::CompositionMode_Source);
    gc.fillRect(QRect(QPoint(0, 0), size()), borderColor());

    QTransform checkersTransform;
    QPointF brushOrigin;
    QPolygonF polygon;

    converter->getQPainterCheckersInfo(&checkersTransform, &brushOrigin, &polygon);
    gc.setPen(Qt::NoPen);
    gc.setBrush(m_d->checkBrush);
    gc.setBrushOrigin(brushOrigin);
    gc.setTransform(checkersTransform);
    gc.drawPolygon(polygon);

    gc.setTransform(imageTransform);
    gc.setRenderHint(QPainter::SmoothPixmapTransform, true);

    QRectF viewportRect = converter->widgetToViewport(ev->rect());

    gc.setCompositionMode(QPainter::CompositionMode_SourceOver);
    gc.drawImage(viewportRect, m_d->prescaledProjection->prescaledQImage(),
                 viewportRect);

    gc.restore();


#ifdef DEBUG_REPAINT
    QColor color = QColor(random() % 255, random() % 255, random() % 255, 150);
    gc.fillRect(ev->rect(), color);
#endif

    drawDecorations(gc, ev->rect());
    gc.end();

    QPainter painter(this);
    painter.drawImage(ev->rect(), m_buffer, ev->rect());
}
示例#3
0
void KisOpenGLCanvas2::renderDecorations(QPainter *painter)
{
    QRect boundingRect = coordinatesConverter()->imageRectInWidgetPixels().toAlignedRect();
    drawDecorations(*painter, boundingRect);
}