}
}
+void RenderControl::drawMask(Surface &sf, const RenderColor &color,
+ const PixmapMask &mask) const
+{
+ assert(_screen == sf._screen);
+ assert(_screen == color.screen());
+
+ if (mask.mask == None) return; // no mask given
+
+ int width = sf.size().width(), height = sf.size().height();
+
+ // set the clip region
+ int x = (width - mask.w) / 2, y = (height - mask.h) / 2;
+ XSetClipMask(**display, color.gc(), mask.mask);
+ XSetClipOrigin(**display, color.gc(), x, y);
+
+ // fill in the clipped region
+ XFillRectangle(**display, sf.pixmap(), color.gc(), x, y,
+ x + mask.w, y + mask.h);
+
+ // unset the clip region
+ XSetClipMask(**display, color.gc(), None);
+ XSetClipOrigin(**display, color.gc(), 0, 0);
+}
+
}
class Font;
class RenderColor;
class ustring;
+class PixmapMask;
class RenderControl {
protected:
virtual void drawRoot(const RenderColor &color) const;
+ //! Draws a background onto a Surface, as specified by a RenderTexture
+ /*!
+ This function will overwrite the entire surface.
+ */
+ virtual void drawBackground(Surface &sf,
+ const RenderTexture &texture) const = 0;
+
//! Draws a string onto a Surface
virtual void drawString(Surface &sf, const Font &font, int x, int y,
const RenderColor &color,
const ustring &string) const;
- //! Draws a background onto a Surface, as specified by a RenderTexture
- virtual void drawBackground(Surface &sf,
- const RenderTexture &texture) const = 0;
+ //! Draws a PixmapMask with a specified color onto a Surface
+ virtual void drawMask(Surface &sf, const RenderColor &color,
+ const PixmapMask &mask) const;
};
}