poly line issue
Per Dalgas Jakobsen
pdj at knaldgas.dk
Mon Nov 9 21:24:03 UTC 2020
Hi,
I'm trying to learn coding with XCB and found an issue the XCB people
think should be placed her.
Drawing a diamond seems to render correctly only if started (end ended)
at the right-most corner, drawing from any other corner causes the
right-most pixel not to be rendered. As I'm new to XCB and Xlib
programing my assumption is that I am doing something stupid, but I
can't see where I failed, so any help is appreciated.
I've tried to make a MWE that demonstrates the issue. It uses the xcb
lib, and compiles with gcc -lxcb <source-file>
(with a high DPI screen you likely need to zoom in to see the problem
(screenshot)).
~Per
---
#include <stdlib.h>
#include <stdio.h>
#include <xcb/xcb.h>
xcb_connection_t *connection;
xcb_drawable_t window;
xcb_screen_t *screen;
xcb_gcontext_t foreground;
void draw_diamond (int x, int y, xcb_point_t *points)
{
xcb_point_t diamond [5];
for (int i = 0; i < 4; i++) {
diamond [i].x = x + points [i].x;
diamond [i].y = y + points [i].y;
}
diamond [4] = diamond [0];
xcb_poly_line (connection, XCB_COORD_MODE_ORIGIN, window,
foreground, 5, diamond);
}
xcb_point_t P_Top = { 0, -5 };
xcb_point_t P_Right = { 5, 0 };
xcb_point_t P_Left = { -5, 0 };
xcb_point_t P_Bottom = { 0, 5 };
int main ()
{
xcb_point_t ccT[] = { P_Top, P_Right, P_Bottom, P_Left };
xcb_point_t ccR[] = { P_Right, P_Bottom, P_Left, P_Top };
xcb_point_t ccB[] = { P_Bottom, P_Left, P_Top, P_Right };
xcb_point_t ccL[] = { P_Left, P_Top, P_Right, P_Bottom };
xcb_point_t cccT[] = { P_Top, P_Left, P_Bottom, P_Right };
xcb_point_t cccR[] = { P_Right, P_Top, P_Left, P_Bottom };
xcb_point_t cccB[] = { P_Bottom, P_Right, P_Top, P_Left };
xcb_point_t cccL[] = { P_Left, P_Bottom, P_Right, P_Top };
/* Open the connection to the X server */
connection = xcb_connect (NULL, NULL);
/* Get the first screen */
screen = xcb_setup_roots_iterator (xcb_get_setup (connection)).data;
/* Create black (foreground) graphic context */
window = screen->root;
foreground = xcb_generate_id (connection);
uint32_t mask = XCB_GC_FOREGROUND |
XCB_GC_GRAPHICS_EXPOSURES;
uint32_t values[2] = {screen->black_pixel, 0};
xcb_create_gc (connection, foreground, window, mask, values);
/* Create a window */
window = xcb_generate_id (connection);
mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
values[0] = screen->white_pixel;
values[1] = XCB_EVENT_MASK_EXPOSURE;
xcb_create_window (connection, /*
connection */
XCB_COPY_FROM_PARENT, /* depth */
window, /* window Id */
screen->root, /* parent window */
0, 0, /* x, y */
150, 150, /* width, height */
10, /* border_width */
XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class */
screen->root_visual, /* visual */
mask, values ); /* masks */
/* Map the window on the screen and flush*/
xcb_map_window (connection, window);
xcb_flush (connection);
/* draw primitives */
xcb_generic_event_t *event;
while ((event = xcb_wait_for_event (connection))) {
switch (event->response_type & ~0x80) {
case XCB_EXPOSE:
draw_diamond (10, 10, ccT);
draw_diamond (25, 10, ccR);
draw_diamond (40, 10, ccB);
draw_diamond (55, 10, ccL);
draw_diamond (10, 30, cccT);
draw_diamond (25, 30, cccR);
draw_diamond (40, 30, cccB);
draw_diamond (55, 30, cccL);
/* flush the request */
xcb_flush (connection);
break;
default:
/* Unknown event type, ignore it */
break;
}
free (event);
}
return 0;
}
---
More information about the xorg
mailing list