- if (_outline_what & LEFT) {
- context->move_to (plot.x0, plot.y0);
- context->line_to (plot.x0, plot.y1);
- }
-
- if (_outline_what & BOTTOM) {
- context->move_to (plot.x0, plot.y1);
- context->line_to (plot.x1, plot.y1);
- }
-
- if (_outline_what & RIGHT) {
- context->move_to (plot.x1, plot.y0);
- context->line_to (plot.x1, plot.y1);
- }
-
- if (_outline_what & TOP) {
- context->move_to (plot.x0, plot.y0);
- context->line_to (plot.x0, plot.y1);
+
+ setup_outline_context (context);
+
+ if (_outline_what == What (LEFT|RIGHT|BOTTOM|TOP)) {
+
+ context->rectangle (self.x0 + 0.5, self.y0 + 0.5, self.width(), self.height());
+
+ } else {
+
+ context->set_line_cap (Cairo::LINE_CAP_SQUARE);
+
+ /* see the cairo FAQ on single pixel lines to see why we do
+ * this expansion of the perimeter.
+ */
+
+ if (_outline_what & LEFT) {
+ /* vertical line: move x-coordinate by 0.5 pixels */
+ context->move_to (self.x0 + 0.5, self.y0);
+ context->line_to (self.x0 + 0.5, self.y1);
+ }
+
+ if (_outline_what & BOTTOM) {
+ /* horizontal line: move y-coordinate by 0.5 pixels */
+ context->move_to (self.x0, self.y1 - 0.5);
+ context->line_to (self.x1, self.y1 - 0.5);
+ }
+
+ if (_outline_what & RIGHT) {
+ /* vertical line: move x-coordinate by 0.5 pixels */
+ context->move_to (self.x1 - 0.5, self.y0);
+ context->line_to (self.x1 - 0.5, self.y1);
+ }
+
+ if (_outline_what & TOP) {
+ /* horizontal line: move y-coordinate by 0.5 pixels */
+ context->move_to (self.x0, self.y0 + 0.5);
+ context->line_to (self.x1, self.y0 + 0.5);
+ }