@@ -13,5 +13,18 @@ target_link_libraries(kshark ${CMAKE_DL_LIBS}
set_target_properties(kshark PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}")
+if (OPENGL_FOUND AND GLUT_FOUND)
+
+ message(STATUS "libkshark-plot")
+ add_library(kshark-plot SHARED libkshark-plot.c)
+
+ target_link_libraries(kshark-plot kshark
+ ${OPENGL_LIBRARIES}
+ ${GLUT_LIBRARY})
+
+ set_target_properties(kshark-plot PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}")
+
+endif (OPENGL_FOUND AND GLUT_FOUND)
+
configure_file( ${KS_DIR}/build/deff.h.cmake
${KS_DIR}/src/KsDeff.h)
new file mode 100644
@@ -0,0 +1,212 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+
+/*
+ * Copyright (C) 2018 VMware Inc, Yordan Karadzhov <y.karadz@gmail.com>
+ */
+
+ /**
+ * @file libkshark-plot.c
+ * @brief Basic tools for OpenGL plotting.
+ */
+
+// OpenGL
+#include <GL/freeglut.h>
+#include <GL/gl.h>
+
+// KernelShark
+#include "libkshark-plot.h"
+
+/**
+ * @brief Create an empty scene for drawing.
+ *
+ * @param width: Width of the screen window in pixels.
+ * @param height: Height of the screen window in pixels.
+ */
+void ksplot_make_scene(int width, int height)
+{
+ /* Set Display mode. */
+ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
+
+ /* Prevent the program from exiting when a window is closed. */
+ glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE,
+ GLUT_ACTION_GLUTMAINLOOP_RETURNS);
+
+ /* Set window size. */
+ glutInitWindowSize(width, height);
+
+ /* Set window position on screen. */
+ glutInitWindowPosition(50, 50);
+
+ /* Open the screen window. */
+ glutCreateWindow("KernelShark Plot");
+
+ /*
+ * Set the origin of the coordinate system to be the top left corner.
+ * The "Y" coordinate is inverted.
+ */
+ gluOrtho2D(0, width, height, 0);
+ glViewport(0, 0, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+}
+
+/**
+ * @brief Initialize OpenGL.
+ *
+ * @param dpr: Device Pixel Ratio.
+ */
+void ksplot_init_opengl(int dpr)
+{
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_COLOR_MATERIAL);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_POLYGON_SMOOTH);
+ glLineWidth(1.5 * dpr);
+ glPointSize(2.5 * dpr);
+ glClearColor(1, 1, 1, 1);
+}
+
+/**
+ * @brief To be called whenever the OpenGL window has been resized.
+ *
+ * @param width: Width of the screen window in pixels.
+ * @param height: Height of the screen window in pixels.
+ */
+void ksplot_resize_opengl(int width, int height)
+{
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ /*
+ * Set the origin of the coordinate system to be the top left corner.
+ * The "Y" coordinate is inverted.
+ */
+ gluOrtho2D(0, width, height, 0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+/**
+ * @brief Draw a point.
+ *
+ * @param p: Input location for the point object.
+ * @param col: The color of the point.
+ * @param size: The size of the point.
+ */
+void ksplot_draw_point(const struct ksplot_point *p,
+ const struct ksplot_color *col,
+ float size)
+{
+ if (!p || !col || size < .5f)
+ return;
+
+ glPointSize(size);
+ glBegin(GL_POINTS);
+ glColor3ub(col->red, col->green, col->blue);
+ glVertex2i(p->x, p->y);
+ glEnd();
+}
+
+/**
+ * @brief Draw a line.
+ *
+ * @param a: Input location for the first finishing point of the line.
+ * @param b: Input location for the second finishing point of the line.
+ * @param col: The color of the line.
+ * @param size: The size of the line.
+ */
+void ksplot_draw_line(const struct ksplot_point *a,
+ const struct ksplot_point *b,
+ const struct ksplot_color *col,
+ float size)
+{
+ if (!a || !b || !col || size < .5f)
+ return;
+
+ glLineWidth(size);
+ glBegin(GL_LINES);
+ glColor3ub(col->red, col->green, col->blue);
+ glVertex2i(a->x, a->y);
+ glVertex2i(b->x, b->y);
+ glEnd();
+}
+
+/**
+ * @brief Draw a polygon.
+ *
+ * @param points: Input location for the array of points defining the polygon.
+ * @param n_points: The size of the array of points.
+ * @param col: The color of the polygon.
+ * @param size: The size of the polygon.
+ */
+void ksplot_draw_polygon(const struct ksplot_point *points,
+ size_t n_points,
+ const struct ksplot_color *col,
+ float size)
+{
+ if (!points || !n_points || !col || size < .5f)
+ return;
+
+ if (n_points == 1) {
+ ksplot_draw_point(points, col, size);
+ return;
+ }
+
+ if (n_points == 2) {
+ ksplot_draw_line(points, points + 1, col, size);
+ return;
+ }
+
+ /* Obtain a point inside the surface of the polygon. */
+ struct ksplot_point in_point;
+ in_point.x = (points[0].x + points[2].x) / 2;
+ in_point.y = (points[0].y + points[2].y) / 2;
+
+ /*
+ * Draw a Triangle Fan using the internal point as a central
+ * vertex.
+ */
+ glBegin(GL_TRIANGLE_FAN);
+ glColor3ub(col->red, col->green, col->blue);
+ glVertex2i(in_point.x, in_point.y);
+ for (size_t i = 0; i < n_points; ++i)
+ glVertex2i(points[i].x, points[i].y);
+
+ glVertex2i(points[0].x, points[0].y);
+ glEnd();
+}
+
+/**
+ * @brief Draw the contour of a polygon.
+ *
+ * @param points: Input location for the array of points defining the polygon.
+ * @param n_points: The size of the array of points.
+ * @param col: The color of the polygon.
+ * @param size: The size of the polygon.
+ */
+void ksplot_draw_polygon_contour(const struct ksplot_point *points,
+ size_t n_points,
+ const struct ksplot_color *col,
+ float size)
+{
+ if (!points || !n_points || !col || size < .5f)
+ return;
+
+ /* Loop over the points of the polygon and draw connecting lines. */
+ for(size_t i = 1; i < n_points; ++i)
+ ksplot_draw_line(&points[i - 1],
+ &points[i],
+ col,
+ size);
+
+ /* Close the contour. */
+ ksplot_draw_line(&points[0],
+ &points[n_points - 1],
+ col,
+ size);
+}
new file mode 100644
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+
+/*
+ * Copyright (C) 2018 VMware Inc, Yordan Karadzhov <y.karadz@gmail.com>
+ */
+
+ /**
+ * @file libkshark-plot.h
+ * @brief Basic tools for OpenGL plotting.
+ */
+
+#ifndef _LIB_KSHARK_PLOT_H
+#define _LIB_KSHARK_PLOT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Structure defining a RGB color. */
+struct ksplot_color {
+ /** The Red component of the color. */
+ uint8_t red;
+
+ /** The Green component of the color. */
+ uint8_t green;
+
+ /** The Blue component of the color. */
+ uint8_t blue;
+};
+
+/** Structure defining a 2D point. */
+struct ksplot_point {
+ /** The horizontal coordinate of the point in pixels. */
+ int x;
+
+ /** The vertical coordinate of the pointin in pixels. */
+ int y;
+};
+
+void ksplot_make_scene(int width, int height);
+
+void ksplot_init_opengl(int dpr);
+
+void ksplot_resize_opengl(int width, int height);
+
+void ksplot_draw_point(const struct ksplot_point *p,
+ const struct ksplot_color *col,
+ float size);
+
+void ksplot_draw_line(const struct ksplot_point *a,
+ const struct ksplot_point *b,
+ const struct ksplot_color *col,
+ float size);
+
+void ksplot_draw_polygon(const struct ksplot_point *points,
+ size_t n_points,
+ const struct ksplot_color *col,
+ float size);
+
+void ksplot_draw_polygon_contour(const struct ksplot_point *points,
+ size_t n_points,
+ const struct ksplot_color *col,
+ float size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
This patch introduces tools for initializing OpenGL and for drawing the three basic geometrical primitives (point, line and polygon) used when plotting KernelShark's graphs. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- kernel-shark-qt/src/CMakeLists.txt | 13 ++ kernel-shark-qt/src/libkshark-plot.c | 212 +++++++++++++++++++++++++++ kernel-shark-qt/src/libkshark-plot.h | 69 +++++++++ 3 files changed, 294 insertions(+) create mode 100644 kernel-shark-qt/src/libkshark-plot.c create mode 100644 kernel-shark-qt/src/libkshark-plot.h