From 1156c003f932fccb30eaae467bbfb8500df53bef Mon Sep 17 00:00:00 2001 From: barnestr Date: Tue, 29 Mar 2022 11:44:36 -0500 Subject: [PATCH] lab4 start --- Lab3/Lab3 | Bin 72544 -> 0 bytes Lab4/Lab4 | Bin 0 -> 69600 bytes Lab4/drawbase.h | 21 ++++ Lab4/gcontext.cpp | 26 +++++ Lab4/gcontext.h | 141 ++++++++++++++++++++++++++ Lab4/main.cpp | 28 ++++++ Lab4/makefile | 25 +++++ Lab4/x11context.cpp | 239 ++++++++++++++++++++++++++++++++++++++++++++ Lab4/x11context.h | 49 +++++++++ 9 files changed, 529 insertions(+) delete mode 100755 Lab3/Lab3 create mode 100755 Lab4/Lab4 create mode 100644 Lab4/drawbase.h create mode 100644 Lab4/gcontext.cpp create mode 100644 Lab4/gcontext.h create mode 100644 Lab4/main.cpp create mode 100644 Lab4/makefile create mode 100644 Lab4/x11context.cpp create mode 100644 Lab4/x11context.h diff --git a/Lab3/Lab3 b/Lab3/Lab3 deleted file mode 100755 index ad3c598699cf754e05b8d4dee4af454ea1d7d361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72544 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 // for trig functions +#include "gcontext.h" + +/* + * Destructor - does nothing + */ +GraphicsContext::~GraphicsContext() +{ + // nothing to do + // here to insure subclasses handle destruction properly +} + +//does nothing +void GraphicsContext::drawLine(int x0, int y0, int x1, int y1){} +void GraphicsContext::drawCircle(int x0, int y0, unsigned int radius){} + + +void GraphicsContext::endLoop() +{ + run = false; +} \ No newline at end of file diff --git a/Lab4/gcontext.h b/Lab4/gcontext.h new file mode 100644 index 0000000..61c6713 --- /dev/null +++ b/Lab4/gcontext.h @@ -0,0 +1,141 @@ +#ifndef GCONTEXT_H +#define GCONTEXT_H + +/** + * This class is intended to be the abstract base class + * for a graphical context for various platforms. Any + * concrete subclass will need to implement the pure virtual + * methods to support setting pixels, getting pixel color, + * setting the drawing mode, and running an event loop to + * capture mouse and keyboard events directed to the graphics + * context (or window). Specific expectations for the various + * methods are documented below. + * + * */ + + +// forward reference - needed because runLoop needs a target for events +class DrawingBase; + + +class GraphicsContext +{ + public: + /********************************************************* + * Some constants and enums + *********************************************************/ + // This enumerated type is an argument to setMode and allows + // us to support two different drawing modes. MODE_NORMAL is + // also call copy-mode and the affect pixel(s) are set to the + // color requested. XOR mode will XOR the new color with the + // existing color so that the change is reversible. + enum drawMode {MODE_NORMAL, MODE_XOR}; + + // Some colors - for fun + static const unsigned int BLACK = 0x000000; + static const unsigned int BLUE = 0x0000FF; + static const unsigned int GREEN = 0x00FF00; + static const unsigned int RED = 0xFF0000; + static const unsigned int CYAN = 0x00FFFF; + static const unsigned int MAGENTA = 0xFF00FF; + static const unsigned int YELLOW = 0xFFFF00; + static const unsigned int GRAY = 0x808080; + static const unsigned int WHITE = 0xFFFFFF; + + + /********************************************************* + * Construction / Destruction + *********************************************************/ + // Implementations of this class should include a constructor + // that creates the drawing canvas (window), sets a background + // color (which may be configurable), sets a default drawing + // color (which may be configurable), and start with normal + // (copy) drawing mode. + + // need a virtual destructor to ensure subclasses will have + // their destructors called properly. Must be virtual. + virtual ~GraphicsContext(); + + /********************************************************* + * Drawing operations + *********************************************************/ + + // Allows the drawing mode to be changed between normal (copy) + // and xor. The implementing context should default to normal. + virtual void setMode(drawMode newMode) = 0; + + // Set the current color. Implementations should default to white. + // color is 24-bit RGB value + virtual void setColor(unsigned int color) = 0; + + // Set pixel to the current color + virtual void setPixel(int x, int y) = 0; + + // Get 24-bit RGB pixel color at specified location + // unsigned int will likely be 32-bit on 32-bit systems, and + // possible 64-bit on some 64-bit systems. In either case, + // it is large enough to hold a 16-bit color. + virtual unsigned int getPixel(int x, int y) = 0; + + // This should reset entire context to the current background + virtual void clear()=0; + + // These are the naive implementations that use setPixel, + // but are overridable should a context have a better- + // performing version available. + + /* will need to be provided by the concrete + * implementation. + * + * Parameters: + * x0, y0 - origin of line + * x1, y1 - end of line + * + * Returns: void + */ + virtual void drawLine(int x0, int y0, int x1, int y1); + + /* will need to be provided by the concrete + * implementation. + * + * Parameters: + * x0, y0 - origin/center of circle + * radius - radius of circle + * + * Returns: void + */ + virtual void drawCircle(int x0, int y0, unsigned int radius); + + + /********************************************************* + * Event loop operations + *********************************************************/ + + // Run Event loop. This routine will receive events from + // the implementation and pass them along to the drawing. It + // will return when the window is closed or other implementation- + // specific sequence. + virtual void runLoop(DrawingBase* drawing) = 0; + + // This method will end the current loop if one is running + // a default version is supplied + virtual void endLoop(); + + + /********************************************************* + * Utility operations + *********************************************************/ + + // returns the width of the window + virtual int getWindowWidth() = 0; + + // returns the height of the window + virtual int getWindowHeight() = 0; + + protected: + // this flag is used to control whether the event loop + // continues to run. + bool run; +}; + +#endif \ No newline at end of file diff --git a/Lab4/main.cpp b/Lab4/main.cpp new file mode 100644 index 0000000..d7a712a --- /dev/null +++ b/Lab4/main.cpp @@ -0,0 +1,28 @@ +#include "x11context.h" +#include +#include + +int main(void) +{ + GraphicsContext* gc = new X11Context(800,600,GraphicsContext::BLACK); + + + // draw some lines + gc->setColor(GraphicsContext::GREEN); + gc->setPixel(10,10); + gc->setPixel(30,30); + gc->drawLine(100,100,500,500); + gc->setColor(GraphicsContext::RED); + gc->drawLine(100,500,500,500); + gc->setColor(GraphicsContext::BLUE); + gc->drawLine(500,500,500,100); + gc->setColor(GraphicsContext::YELLOW); + gc->drawLine(500,100,100,100); + gc->setColor(GraphicsContext::MAGENTA); + gc->drawCircle(300,300,200); + sleep(10); + + delete gc; + + return 0; +} \ No newline at end of file diff --git a/Lab4/makefile b/Lab4/makefile new file mode 100644 index 0000000..0de43e1 --- /dev/null +++ b/Lab4/makefile @@ -0,0 +1,25 @@ +# lab4 Makefile + +CC = g++ +CFLAGS = -c -MMD -g +LFLAGS = -lX11 +# Change w/ every new project +SOURCES = main.cpp gcontext.cpp x11context.cpp +OBJECTS = $(SOURCES:.cpp=.o) +# Change w/ every new project +EXECUTABLE = Lab4 + +all: $(EXECUTABLE) $(SOURCES) + +$(EXECUTABLE): $(OBJECTS) + $(CC) -o $@ $(OBJECTS) $(LFLAGS) + +-include *.d + +%.o:%.cpp + $(CC) $(CFLAGS) $< + +clean: + rm -f $(EXECUTABLE) + rm -f $(OBJECTS) + rm -f *.d \ No newline at end of file diff --git a/Lab4/x11context.cpp b/Lab4/x11context.cpp new file mode 100644 index 0000000..bc8f0d1 --- /dev/null +++ b/Lab4/x11context.cpp @@ -0,0 +1,239 @@ +/* Provides a simple drawing context for X11/XWindows + * You must have the X11 dev libraries installed. If missing, + * 'sudo apt-get install libx11-dev' should help. + */ + +#include // Every Xlib program must include this +#include // needed for XGetPixel +#include // needed for keyboard setup +#include "x11context.h" +#include "drawbase.h" +#include + +/** + * The only constructor provided. Allows size of window and background + * color be specified. + * */ +X11Context::X11Context(unsigned int sizex=400,unsigned int sizey=400, + unsigned int bg_color=GraphicsContext::BLACK) +{ + // Open the display + display = XOpenDisplay(NULL); + + // Holding a key in gives repeated key_press commands but only + // one key_release + int supported; + + XkbSetDetectableAutoRepeat(display,true,&supported); + + // Create a window - we will assume the color map is in RGB mode. + window = XCreateSimpleWindow(display, DefaultRootWindow(display), 0, 0, + sizex, sizey, 0, 0 , bg_color); + + // Sign up for MapNotify events + XSelectInput(display, window, StructureNotifyMask); + + // Put the window on the screen + XMapWindow(display, window); + + // Create a "Graphics Context" + graphics_context = XCreateGC(display, window, 0, NULL); + + // Default color to white + XSetForeground(display, graphics_context, GraphicsContext::WHITE); + + // Wait for MapNotify event + for(;;) + { + XEvent e; + XNextEvent(display, &e); + if (e.type == MapNotify) + break; + } + + // We also want exposure, mouse, and keyboard events + XSelectInput(display, window, ExposureMask| + ButtonPressMask| + ButtonReleaseMask| + KeyPressMask| + KeyReleaseMask| + PointerMotionMask); + + // We need this to get the WM_DELETE_WINDOW message from the + // window manager in case user click the X icon + Atom atomKill = XInternAtom(display, "WM_DELETE_WINDOW", False); + XSetWMProtocols(display, window, &atomKill, 1); + + return; +} + +// Destructor - shut down window and connection to server +X11Context::~X11Context() +{ + XFreeGC(display, graphics_context); + XDestroyWindow(display,window); + XCloseDisplay(display); +} + +// Set the drawing mode - argument is enumerated +void X11Context::setMode(drawMode newMode) +{ + if (newMode == GraphicsContext::MODE_NORMAL) + { + XSetFunction(display,graphics_context,GXcopy); + } + else + { + XSetFunction(display,graphics_context,GXxor); + } +} + +// Set drawing color - assume colormap is 24 bit RGB +void X11Context::setColor(unsigned int color) +{ + // Go ahead and set color here - better performance than setting + // on every setPixel + XSetForeground(display, graphics_context, color); +} + +// Set a pixel in the current color +void X11Context::setPixel(int x, int y) +{ + XDrawPoint(display, window, graphics_context, x, y); + XFlush(display); +} + +unsigned int X11Context::getPixel(int x, int y) +{ + XImage *image; + image = XGetImage (display, window, x, y, 1, 1, AllPlanes, XYPixmap); + XColor color; + color.pixel = XGetPixel (image, 0, 0); + XFree (image); + XQueryColor (display, DefaultColormap(display, DefaultScreen (display)), + &color); + // I now have RGB values, but, they are 16 bits each, I only want 8-bits + // each since I want a 24-bit RGB color value + unsigned int pixcolor = color.red & 0xff00; + pixcolor |= (color.green >> 8); + pixcolor <<= 8; + pixcolor |= (color.blue >> 8); + return pixcolor; +} + +void X11Context::clear() +{ + XClearWindow(display, window); + XFlush(display); +} + + + +// Run event loop +void X11Context::runLoop(DrawingBase* drawing) +{ + run = true; + + while(run) + { + XEvent e; + XNextEvent(display, &e); + + // Exposure event - lets not worry about region + if (e.type == Expose) + drawing->paint(this); + + // Key Down + else if (e.type == KeyPress) + drawing->keyDown(this,XLookupKeysym((XKeyEvent*)&e, + (((e.xkey.state&0x01)&&!(e.xkey.state&0x02))|| + (!(e.xkey.state&0x01)&&(e.xkey.state&0x02)))?1:0)); + + // Key Up + else if (e.type == KeyRelease){ + drawing->keyUp(this,XLookupKeysym((XKeyEvent*)&e, + (((e.xkey.state&0x01)&&!(e.xkey.state&0x02))|| + (!(e.xkey.state&0x01)&&(e.xkey.state&0x02)))?1:0)); + } + + // Mouse Button Down + else if (e.type == ButtonPress) + drawing->mouseButtonDown(this, + e.xbutton.button, + e.xbutton.x, + e.xbutton.y); + + // Mouse Button Up + else if (e.type == ButtonRelease) + drawing->mouseButtonUp(this, + e.xbutton.button, + e.xbutton.x, + e.xbutton.y); + + // Mouse Move + else if (e.type == MotionNotify) + drawing->mouseMove(this, + e.xmotion.x, + e.xmotion.y); + + // This will respond to the WM_DELETE_WINDOW from the + // window manager. + else if (e.type == ClientMessage) + break; + } +} + + +int X11Context::getWindowWidth() +{ + XWindowAttributes window_attributes; + XGetWindowAttributes(display,window, &window_attributes); + return window_attributes.width; +} + +int X11Context::getWindowHeight() +{ + XWindowAttributes window_attributes; + XGetWindowAttributes(display,window, &window_attributes); + return window_attributes.height; +} + +// void X11Context::drawLine(int x1, int y1, int x2, int y2) +// { +// XDrawLine(display, window, graphics_context, x1, y1, x2, y2); +// XFlush(display); +// } + +// Bresenham Implementation +void X11Context::drawLine(int x1, int y1, int x2, int y2){ + //setPixel(x1,y1); + // Check direction of line + if(abs(y2-y1) < abs(x2-x1)){ + if(x1 > x2){ + //swap + } else { + //swap + } + } else { + + } + int dx = x2-x1; + int dy = y2-y1; + int D = 2*dy-dx; + int y = y1; + for(int i = x1; i < x2; i++){ + setPixel(i,y); + if(D > 0){ + y = y+1; + D = D-2*dx; + } + D = D+2*dy; + } +} + +void X11Context::drawCircle(int x, int y, unsigned int radius) +{ + XDrawArc(display, window, graphics_context, x-radius, + y-radius, radius*2, radius*2, 0, 360*64); + XFlush(display); +} \ No newline at end of file diff --git a/Lab4/x11context.h b/Lab4/x11context.h new file mode 100644 index 0000000..54a7af1 --- /dev/null +++ b/Lab4/x11context.h @@ -0,0 +1,49 @@ +#ifndef X11_CONTEXT +#define X11_CONTEXT +/** + * This class is a sample implementation of the GraphicsContext class + * for the X11 / XWindows system. + * */ + +#include // Every Xlib program must include this +#include "gcontext.h" // base class + +class X11Context : public GraphicsContext +{ + public: + // Default Constructor + X11Context(unsigned int sizex,unsigned int sizey,unsigned int bg_color); + + // Destructor + virtual ~X11Context(); + + // Drawing Operations + void setMode(drawMode newMode); + void setColor(unsigned int color); + void setPixel(int x, int y); + unsigned int getPixel(int x, int y); + void clear(); + //void drawLine(int x1, int y1, int x2, int y2); + void drawLine(int x1, int y1, int x2, int y2); + void drawCircle(int x, int y, unsigned int radius); + + + // Event looop functions + void runLoop(DrawingBase* drawing); + + // we will use endLoop provided by base class + + // Utility functions + int getWindowWidth(); + int getWindowHeight(); + + + private: + // X11 stuff - specific to this context + Display* display; + Window window; + GC graphics_context; + +}; + +#endif \ No newline at end of file