void PlastikClient::init() { s_titleFont = isToolWindow() ? Handler()->titleFontTool() : Handler()->titleFont(); clearCaptionPixmaps(); KCommonDecoration::init(); }
const QPixmap &PlastikClient::captionPixmap() const { bool active = isActive(); if (m_captionPixmaps[active]) { return *m_captionPixmaps[active]; } // not found, create new pixmap... const int maxCaptionLength = 300; // truncate captions longer than this! QString c(caption() ); if (c.length() > maxCaptionLength) { c.truncate(maxCaptionLength); c.append(" [...]"); } QFontMetrics fm(s_titleFont); int captionWidth = fm.width(c); int captionDescent = fm.descent(); QFontMetrics fm_vmname(s_vmnameFont); captionWidth += fm_vmname.width(qubes_vmname); if (fm_vmname.descent() > fm.descent()) captionDescent = fm_vmname.descent(); const int th = layoutMetric(LM_TitleHeight, false) + layoutMetric(LM_TitleEdgeBottom, false); QPainter painter; const int thickness = 2; QPixmap *captionPixmap = new QPixmap(captionWidth+2*thickness, th); painter.begin(captionPixmap); painter.drawTiledPixmap(captionPixmap->rect(), Handler()->pixmap(qubes_label, TitleBarTile, active, isToolWindow()) ); painter.setFont(s_vmnameFont); QRect boundingRect1 = painter.boundingRect(captionPixmap->rect(), Qt::AlignVCenter | Qt::AlignLeft, qubes_vmname); QPoint tp1 = boundingRect1.bottomLeft() - QPoint(0, captionDescent); QPoint tp2 = tp1 + QPoint (fm_vmname.width(qubes_vmname) + 5, 0); QColor fontColor = Handler()->getColor(qubes_label, TitleFont,active); painter.setPen(fontColor ); painter.drawText(tp1, qubes_vmname ); painter.setFont(s_titleFont); painter.drawText(tp2, c ); painter.end(); m_captionPixmaps[active] = captionPixmap; return *captionPixmap; }
void LaptopClient::updateActiveBuffer( ) { QRect rTitle = titleRect(); if( !bufferDirty && (lastBufferWidth == rTitle.width())) return; if ( rTitle.width() <= 0 || rTitle.height() <= 0 ) return; lastBufferWidth = rTitle.width(); bufferDirty = false; activeBuffer = QPixmap(rTitle.width(), rTitle.height()); QPainter p; QRect r(0, 0, activeBuffer.width(), activeBuffer.height()); p.begin(&activeBuffer); if(aUpperGradient){ p.drawTiledPixmap(r, *aUpperGradient); } else{ p.fillRect(r, options()->color(KDecoration::ColorTitleBar, true)); } if(titlePix) p.drawTiledPixmap(r, *titlePix); p.setFont(options()->font(true, isToolWindow() )); QFontMetrics fm(options()->font(true)); QPalette g = options()->palette(KDecoration::ColorTitleBar, true); g.setCurrentColorGroup( QPalette::Active ); if(aUpperGradient) p.drawTiledPixmap(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), fm.width(caption())+8, r.height()-1, *aUpperGradient); else p.fillRect(r.x()+((r.width()-fm.width(caption()))/2)-4, 0, fm.width(caption())+8, r.height(), g.brush(QPalette::Background)); p.setPen(g.mid().color()); p.drawLine(r.x(), r.y(), r.right(), r.y()); p.drawLine(r.x(), r.y(), r.x(), r.bottom()); p.setPen(g.color(QPalette::Button)); p.drawLine(r.right(), r.y(), r.right(), r.bottom()); p.drawLine(r.x(), r.bottom(), r.right(), r.bottom()); p.setPen(options()->color(KDecoration::ColorFont, true)); p.drawText(r.x(), r.y()+1, r.width(), r.height()-1, Qt::AlignCenter, caption() ); g = options()->palette(KDecoration::ColorFrame, true); g.setCurrentColorGroup( QPalette::Active ); p.setPen(g.background().color()); p.drawPoint(r.x(), r.y()); p.drawPoint(r.right(), r.y()); p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); p.end(); }
void QuartzClient::init() { // Finally, toolWindows look small if ( isToolWindow() ) { titleHeight = toolTitleHeight; largeButtons = false; } else { titleHeight = normalTitleHeight; largeButtons = true; } borderSize = borderWidth; KCommonDecoration::init(); }
int LaptopClient::layoutMetric(LayoutMetric lm, bool respectWindowState, const KCommonDecorationButton *btn) const { switch (lm) { case LM_TitleEdgeLeft: case LM_TitleEdgeRight: case LM_BorderLeft: case LM_BorderRight: return 4; case LM_BorderBottom: return mustDrawHandle() ? handleSize : 4; case LM_TitleEdgeTop: return 3; case LM_TitleEdgeBottom: return 1; case LM_TitleBorderLeft: case LM_TitleBorderRight: return 0; case LM_ButtonWidth: { if (btn && (btn->type()==HelpButton||btn->type()==OnAllDesktopsButton) ) { return btnWidth1; } else { return btnWidth2; } } case LM_ButtonHeight: case LM_TitleHeight: if (isToolWindow() ) return titleHeight-2; else return titleHeight; case LM_ButtonSpacing: return 0; default: return KCommonDecoration::layoutMetric(lm, respectWindowState, btn); } }
void WebClient::reset( unsigned long changed ) { if (changed & SettingColors) { // repaint the whole thing widget()->repaint(); } else if (changed & SettingFont) { // font has changed -- update title height // title height const int textVMargin = 2; QFontMetrics fm(options()->font(isActive(), isToolWindow())); titleHeight_ = qMax(qMax(14, fm.height() + textVMargin * 2), borderSize_); if (0 != titleHeight_ % 2) titleHeight_ += 1; widget()->repaint(); } KCommonDecoration::reset(changed); }
void PlastikClient::reset(unsigned long changed) { if(changed & SettingColors) { // repaint the whole thing clearCaptionPixmaps(); widget()->update(); updateButtons(); } else if(changed & SettingFont) { // font has changed -- update title height and font s_titleFont = isToolWindow() ? Handler()->titleFontTool() : Handler()->titleFont(); updateLayout(); // then repaint clearCaptionPixmaps(); widget()->update(); } KCommonDecoration::reset(changed); }
void WebClient::init() { // title height const int textVMargin = 2; QFontMetrics fm(options()->font(isActive(), isToolWindow())); // border size switch(options()->preferredBorderSize( factory())) { case BorderLarge: borderSize_ = 8; break; case BorderVeryLarge: borderSize_ = 12; break; case BorderHuge: borderSize_ = 18; break; case BorderVeryHuge: borderSize_ = 27; break; case BorderOversized: borderSize_ = 40; break; case BorderNormal: default: borderSize_ = 4; } titleHeight_ = qMax(qMax(14, fm.height() + textVMargin * 2), borderSize_); if (0 != titleHeight_ % 2) titleHeight_ += 1; KConfig c("kwinwebrc"); shape_ = c.group("General").readEntry("Shape", true); KCommonDecoration::init(); }
void WebClient::paintEvent(QPaintEvent * pe) { int r_x, r_y, r_x2, r_y2; widget()->rect().getCoords(&r_x, &r_y, &r_x2, &r_y2); const int titleEdgeLeft = layoutMetric(LM_TitleEdgeLeft); const int titleEdgeTop = layoutMetric(LM_TitleEdgeTop); const int titleEdgeRight = layoutMetric(LM_TitleEdgeRight); const int titleEdgeBottom = layoutMetric(LM_TitleEdgeBottom); const int ttlHeight = layoutMetric(LM_TitleHeight); const int titleEdgeBottomBottom = r_y+titleEdgeTop+ttlHeight+titleEdgeBottom-1; QRect titleRect = QRect(r_x+titleEdgeLeft+buttonsLeftWidth()+1, r_y+titleEdgeTop, r_x2-titleEdgeRight-buttonsRightWidth()-(r_x+titleEdgeLeft+buttonsLeftWidth()+1), titleEdgeBottomBottom-(r_y+titleEdgeTop) ); titleRect.setTop(1); QPainter p(widget()); p.setPen(Qt::black); QPalette pal = options()->palette(ColorFrame, isActive()); pal.setCurrentColorGroup( QPalette::Active ); p.setBrush( pal.background() ); p.setClipRegion(pe->region() - titleRect); QRect r(widget()->rect()); r.adjust(0, 0, -1, -1); p.drawRect(r); p.setClipRegion(pe->region()); p.fillRect(titleRect, options()->color(ColorTitleBar, isActive())); if (shape_) { int r(width()); int b(height()); // Draw edge of top-left corner inside the area removed by the mask. p.drawPoint(3, 1); p.drawPoint(4, 1); p.drawPoint(2, 2); p.drawPoint(1, 3); p.drawPoint(1, 4); // Draw edge of top-right corner inside the area removed by the mask. p.drawPoint(r - 5, 1); p.drawPoint(r - 4, 1); p.drawPoint(r - 3, 2); p.drawPoint(r - 2, 3); p.drawPoint(r - 2, 4); // Draw edge of bottom-left corner inside the area removed by the mask. p.drawPoint(1, b - 5); p.drawPoint(1, b - 4); p.drawPoint(2, b - 3); p.drawPoint(3, b - 2); p.drawPoint(4, b - 2); // Draw edge of bottom-right corner inside the area removed by the mask. p.drawPoint(r - 2, b - 5); p.drawPoint(r - 2, b - 4); p.drawPoint(r - 3, b - 3); p.drawPoint(r - 4, b - 2); p.drawPoint(r - 5, b - 2); } p.setFont(options()->font(isActive(), isToolWindow())); p.setPen(options()->color(ColorFont, isActive())); p.drawText(titleRect, Qt::AlignCenter, caption()); }
int PlastikClient::layoutMetric(LayoutMetric lm, bool respectWindowState, const KCommonDecorationButton *btn) const { bool maximized = maximizeMode() == MaximizeFull && !options()->moveResizeMaximizedWindows(); switch(lm) { case LM_BorderLeft: case LM_BorderRight: case LM_BorderBottom: { if(respectWindowState && maximized) { return 0; } else { return Handler()->borderSize(); } } case LM_TitleEdgeTop: { if(respectWindowState && maximized) { return 0; } else { return 4; } } case LM_TitleEdgeBottom: { // if (respectWindowState && maximized) { // return 1; // } else { return 2; // } } case LM_TitleEdgeLeft: case LM_TitleEdgeRight: { if(respectWindowState && maximized) { return 0; } else { return 6; } } case LM_TitleBorderLeft: case LM_TitleBorderRight: return 5; case LM_ButtonWidth: case LM_ButtonHeight: case LM_TitleHeight: { if(respectWindowState && isToolWindow()) { return Handler()->titleHeightTool(); } else { return Handler()->titleHeight(); } } case LM_ButtonSpacing: return 1; case LM_ButtonMarginTop: return 0; case LM_ExplicitButtonSpacer: return 3; default: return KCommonDecoration::layoutMetric(lm, respectWindowState, btn); } }
const QPixmap &PlastikClient::captionPixmap() const { bool active = isActive(); if(m_captionPixmaps[active]) { return *m_captionPixmaps[active]; } // not found, create new pixmap... const uint maxCaptionLength = 300; // truncate captions longer than this! QString c(caption()); if(c.length() > maxCaptionLength) { c.truncate(maxCaptionLength); c.append(" [...]"); } QFontMetrics fm(s_titleFont); int captionWidth = fm.width(c); int captionHeight = fm.height(); const int th = layoutMetric(LM_TitleHeight, false) + layoutMetric(LM_TitleEdgeBottom, false); QPainter painter; const int thickness = 2; QPixmap *captionPixmap = new QPixmap(captionWidth + 2 * thickness, th); painter.begin(captionPixmap); painter.drawTiledPixmap(captionPixmap->rect(), Handler()->pixmap(TitleBarTile, active, isToolWindow())); painter.setFont(s_titleFont); QPoint tp(1, captionHeight - 1); if(Handler()->titleShadow()) { QColor shadowColor; if(qGray(Handler()->getColor(TitleFont, active).rgb()) < 100) shadowColor = QColor(255, 255, 255); else shadowColor = QColor(0, 0, 0); painter.setPen(alphaBlendColors(options()->color(ColorTitleBar, active), shadowColor, 205)); painter.drawText(tp + QPoint(1, 2), c); painter.setPen(alphaBlendColors(options()->color(ColorTitleBar, active), shadowColor, 225)); painter.drawText(tp + QPoint(2, 2), c); painter.setPen(alphaBlendColors(options()->color(ColorTitleBar, active), shadowColor, 165)); painter.drawText(tp + QPoint(1, 1), c); } painter.setPen(Handler()->getColor(TitleFont, active)); painter.drawText(tp, c); painter.end(); m_captionPixmaps[active] = captionPixmap; return *captionPixmap; }
const QPixmap &PlastikClient::getTitleBarTile(bool active) const { return Handler()->pixmap(TitleBarTile, active, isToolWindow()); }
void PlastikClient::paintEvent(QPaintEvent *e) { QRegion region = e->region(); PlastikHandler *handler = Handler(); if(oldCaption != caption()) clearCaptionPixmaps(); bool active = isActive(); bool toolWindow = isToolWindow(); QPainter painter(widget()); // often needed coordinates QRect r = widget()->rect(); int r_w = r.width(); // int r_h = r.height(); int r_x, r_y, r_x2, r_y2; r.coords(&r_x, &r_y, &r_x2, &r_y2); const int borderLeft = layoutMetric(LM_BorderLeft); const int borderRight = layoutMetric(LM_BorderRight); const int borderBottom = layoutMetric(LM_BorderBottom); const int titleHeight = layoutMetric(LM_TitleHeight); const int titleEdgeTop = layoutMetric(LM_TitleEdgeTop); const int titleEdgeBottom = layoutMetric(LM_TitleEdgeBottom); const int titleEdgeLeft = layoutMetric(LM_TitleEdgeLeft); const int titleEdgeRight = layoutMetric(LM_TitleEdgeRight); const int borderBottomTop = r_y2 - borderBottom + 1; const int borderLeftRight = r_x + borderLeft - 1; const int borderRightLeft = r_x2 - borderRight + 1; const int titleEdgeBottomBottom = r_y + titleEdgeTop + titleHeight + titleEdgeBottom - 1; const int sideHeight = borderBottomTop - titleEdgeBottomBottom - 1; QRect Rtitle = QRect(r_x + titleEdgeLeft + buttonsLeftWidth(), r_y + titleEdgeTop, r_x2 - titleEdgeRight - buttonsRightWidth() - (r_x + titleEdgeLeft + buttonsLeftWidth()), titleEdgeBottomBottom - (r_y + titleEdgeTop)); QRect tempRect; // topSpacer if(titleEdgeTop > 0) { tempRect.setRect(r_x + 2, r_y, r_w - 2 * 2, titleEdgeTop); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarTileTop, active, toolWindow)); } } // leftTitleSpacer int titleMarginLeft = 0; int titleMarginRight = 0; if(titleEdgeLeft > 0) { tempRect.setRect(r_x, r_y, borderLeft, titleEdgeTop + titleHeight + titleEdgeBottom); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarLeft, active, toolWindow)); titleMarginLeft = borderLeft; } } // rightTitleSpacer if(titleEdgeRight > 0) { tempRect.setRect(borderRightLeft, r_y, borderRight, titleEdgeTop + titleHeight + titleEdgeBottom); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarRight, active, toolWindow)); titleMarginRight = borderRight; } } // titleSpacer const QPixmap &caption = captionPixmap(); if(Rtitle.width() > 0) { m_captionRect = captionRect(); // also update m_captionRect! if(m_captionRect.isValid() && region.contains(m_captionRect)) { painter.drawTiledPixmap(m_captionRect, caption); } // left to the title tempRect.setRect(r_x + titleMarginLeft, m_captionRect.top(), m_captionRect.left() - (r_x + titleMarginLeft), m_captionRect.height()); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarTile, active, toolWindow)); } // right to the title tempRect.setRect(m_captionRect.right() + 1, m_captionRect.top(), (r_x2 - titleMarginRight) - m_captionRect.right(), m_captionRect.height()); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(TitleBarTile, active, toolWindow)); } } // leftSpacer if(borderLeft > 0 && sideHeight > 0) { tempRect.setCoords(r_x, titleEdgeBottomBottom + 1, borderLeftRight, borderBottomTop - 1); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(BorderLeftTile, active, toolWindow)); } } // rightSpacer if(borderRight > 0 && sideHeight > 0) { tempRect.setCoords(borderRightLeft, titleEdgeBottomBottom + 1, r_x2, borderBottomTop - 1); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(BorderRightTile, active, toolWindow)); } } // bottomSpacer if(borderBottom > 0) { int l = r_x; int r = r_x2; tempRect.setRect(r_x, borderBottomTop, borderLeft, borderBottom); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(BorderBottomLeft, active, toolWindow)); l = tempRect.right() + 1; } tempRect.setRect(borderRightLeft, borderBottomTop, borderLeft, borderBottom); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(BorderBottomRight, active, toolWindow)); r = tempRect.left() - 1; } tempRect.setCoords(l, borderBottomTop, r, r_y2); if(tempRect.isValid() && region.contains(tempRect)) { painter.drawTiledPixmap(tempRect, handler->pixmap(BorderBottomTile, active, toolWindow)); } } }
int OxygenClient::layoutMetric(LayoutMetric lm, bool respectWindowState, const KCommonDecorationButton *btn) const { bool maximized = maximizeMode()==MaximizeFull && !options()->moveResizeMaximizedWindows(); int frameWidth = OxygenFactory::borderSize(); switch (lm) { case LM_BorderLeft: case LM_BorderRight: case LM_BorderBottom: { if (respectWindowState && maximized) { return 0; } else { // Even for thin borders (2px wide) we want to preserve // the rounded corners having a minimum height of 7px if (lm == LM_BorderBottom) { return qMax(frameWidth, 7); } else { return frameWidth; } } } case LM_TitleEdgeTop: { if (respectWindowState && maximized) { return 0; } else { return TFRAMESIZE; } } case LM_TitleEdgeBottom: { return 0; } case LM_TitleEdgeLeft: case LM_TitleEdgeRight: { if (respectWindowState && maximized) { return 0; } else { return 6; } } case LM_TitleBorderLeft: case LM_TitleBorderRight: return 5; case LM_ButtonWidth: case LM_ButtonHeight: case LM_TitleHeight: { if (respectWindowState && isToolWindow()) { return OXYGEN_BUTTONSIZE; } else { return OXYGEN_BUTTONSIZE; } } case LM_ButtonSpacing: return 1; case LM_ButtonMarginTop: return 0; default: return KCommonDecoration::layoutMetric(lm, respectWindowState, btn); } }
void LaptopClient::paintEvent( QPaintEvent* ) { QPainter p(widget()); QPalette g = options()->palette(KDecoration::ColorFrame, isActive()); g.setCurrentColorGroup( QPalette::Active ); QRect r(widget()->rect()); p.setPen(Qt::black); p.drawRect(r.adjusted(0, 0, -1, -1)); // fill mid frame... p.setPen(g.background().color()); p.drawLine(r.x()+2, r.y()+2, r.right()-2, r.y()+2); p.drawLine(r.left()+2, r.y()+3, r.left()+2, r.bottom()-layoutMetric(LM_BorderBottom)+1); p.drawLine(r.right()-2, r.y()+3, r.right()-2, r.bottom()-layoutMetric(LM_BorderBottom)+1); p.drawLine(r.left()+3, r.y()+3, r.left()+3, r.y()+layoutMetric(LM_TitleEdgeTop)+layoutMetric(LM_TitleHeight)+layoutMetric(LM_TitleEdgeTop) ); p.drawLine(r.right()-3, r.y()+3, r.right()-3, r.y()+layoutMetric(LM_TitleEdgeTop)+layoutMetric(LM_TitleHeight)+layoutMetric(LM_TitleEdgeTop) ); if (!mustDrawHandle() ) p.drawLine(r.left()+1, r.bottom()-2, r.right()-1, r.bottom()-2); // outer frame p.setPen(g.color(QPalette::Light)); p.drawLine(r.x()+1, r.y()+1, r.right()-1, r.y()+1); p.drawLine(r.x()+1, r.y()+1, r.x()+1, r.bottom()-1); p.setPen(g.dark().color()); p.drawLine(r.right()-1, r.y()+1, r.right()-1, r.bottom()-1); p.drawLine(r.x()+1, r.bottom()-1, r.right()-1, r.bottom()-1); int th = titleHeight; int bb = handleSize + 2; // Bottom border int bs = handleSize - 2; // inner size of bottom border if (!mustDrawHandle()) { bb = 6; bs = 0; } if ( isToolWindow() ) th -= 2; // inner rect p.drawRect(r.x() + 3, r.y() + th + 3, r.width() - 7, r.height() - th - bb - 1); // handles if (mustDrawHandle()) { if (r.width() > 3*handleSize + 20) { int range = 8 + 3*handleSize/2; qDrawShadePanel(&p, r.x() + 1, r.bottom() - bs, range, handleSize - 2, g, false, 1, &g.brush(QPalette::Mid)); qDrawShadePanel(&p, r.x() + range + 1, r.bottom() - bs, r.width() - 2*range - 2, handleSize - 2, g, false, 1, isActive() ? &g.brush(QPalette::Background) : &g.brush(QPalette::Mid)); qDrawShadePanel(&p, r.right() - range, r.bottom() - bs, range, bs, g, false, 1, &g.brush(QPalette::Mid)); } else { qDrawShadePanel(&p, r.x() + 1, r.bottom() - bs, r.width() - 2, bs, g, false, 1, isActive() ? &g.brush(QPalette::Background) : &g.brush(QPalette::Mid)); } } r = titleRect(); if(isActive()){ updateActiveBuffer(); p.drawPixmap(r.x(), r.y(), activeBuffer); p.setPen(g.background().color()); p.drawPoint(r.x(), r.y()); p.drawPoint(r.right(), r.y()); p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); } else{ if(iUpperGradient) p.drawTiledPixmap(r.x(), r.y(), r.width(), r.height()-1, *iUpperGradient); else p.fillRect(r.x(), r.y(), r.width(), r.height()-1, options()->color(KDecoration::ColorTitleBar, false)); p.setFont(options()->font(false, isToolWindow() )); QFontMetrics fm(options()->font(false)); g = options()->palette(KDecoration::ColorTitleBar, false); g.setCurrentColorGroup( QPalette::Active ); if(iUpperGradient) p.drawTiledPixmap(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), fm.width(caption())+8, r.height()-1, *iUpperGradient); else p.fillRect(r.x()+((r.width()-fm.width(caption()))/2)-4, r.y(), fm.width(caption())+8, r.height()-1, g.brush(QPalette::Background)); p.setPen(g.mid().color()); p.drawLine(r.x(), r.y(), r.right(), r.y()); p.drawLine(r.x(), r.y(), r.x(), r.bottom()); p.setPen(g.color(QPalette::Button)); p.drawLine(r.right(), r.y(), r.right(), r.bottom()); p.drawLine(r.x(), r.bottom(), r.right(), r.bottom()); p.setPen(options()->color(KDecoration::ColorFont, false)); p.drawText(r.x(), r.y()+1, r.width(), r.height()-1, Qt::AlignCenter, caption() ); g = options()->palette(KDecoration::ColorFrame, true); g.setCurrentColorGroup( QPalette::Active ); p.setPen(g.background().color()); p.drawPoint(r.x(), r.y()); p.drawPoint(r.right(), r.y()); p.drawLine(r.right()+1, r.y(), r.right()+1, r.bottom()); } }