Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
Obě strany předchozí revizePředchozí verze | |||
pitel:gux:1 [05. 12. 2013, 13.17:04] – Zbytecne nadpisy pitel | pitel:gux:1 [30. 12. 2022, 13.43:01] (aktuální) – upraveno mimo DokuWiki 127.0.0.1 | ||
---|---|---|---|
Řádek 1: | Řádek 1: | ||
+ | ====== Projekt 1 ====== | ||
+ | [[http:// | ||
+ | <file c draw.c> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | GC inputGC; | ||
+ | Widget question; | ||
+ | int x1, y1, x2, y2; /* input points */ | ||
+ | unsigned short button_pressed = 0; /* input state */ | ||
+ | Colormap cmap; | ||
+ | short fill = 0; | ||
+ | XColor red, green, blue, black, white; | ||
+ | XColor *lineFgColor = &black; | ||
+ | XColor *lineBgColor = &white; | ||
+ | XColor *fillFgColor = &red; | ||
+ | XColor *fillBgColor = &blue; | ||
+ | unsigned int line_width = 0; | ||
+ | int line_style = LineSolid; | ||
+ | int cap_style = CapButt; | ||
+ | int join_style = JoinMiter; | ||
+ | |||
+ | typedef enum toolkit {POINT, LINE, RECTANGLE, ELLIPSE} toolkit; | ||
+ | toolkit tool = LINE; | ||
+ | |||
+ | struct drawing { | ||
+ | toolkit tool; | ||
+ | GC gc; | ||
+ | short fill; | ||
+ | XColor fillColor; | ||
+ | int x1, y1, x2, y2; | ||
+ | }; | ||
+ | struct drawing *drawings = NULL; | ||
+ | size_t allocated = 1; | ||
+ | size_t ndrawings = 0; | ||
+ | |||
+ | /* Save drawing */ | ||
+ | void saveDrawing(Widget w) { | ||
+ | ndrawings++; | ||
+ | if (allocated <= ndrawings) { | ||
+ | drawings = (struct drawing *) realloc(drawings, | ||
+ | if (drawings != NULL) { | ||
+ | allocated *= 2; | ||
+ | } else { | ||
+ | fprintf(stderr, | ||
+ | exit(1); | ||
+ | } | ||
+ | } | ||
+ | drawings[ndrawings - 1].gc = XCreateGC(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XSetBackground(XtDisplay(w), | ||
+ | XCopyGC(XtDisplay(w), | ||
+ | drawings[ndrawings - 1].tool = tool; | ||
+ | drawings[ndrawings - 1].x1 = x1; | ||
+ | drawings[ndrawings - 1].x2 = x2; | ||
+ | drawings[ndrawings - 1].y1 = y1; | ||
+ | drawings[ndrawings - 1].y2 = y2; | ||
+ | drawings[ndrawings - 1].fill = fill; | ||
+ | drawings[ndrawings - 1].fillColor = *fillFgColor; | ||
+ | drawings[ndrawings].gc = NULL; /* Sentinel */ | ||
+ | } | ||
+ | |||
+ | /* Input event handler */ | ||
+ | void DrawEH(Widget w, XtPointer client_data, | ||
+ | Pixel fg, bg; | ||
+ | if (button_pressed) { | ||
+ | if (!inputGC) { | ||
+ | inputGC = XCreateGC(XtDisplay(w), | ||
+ | / | ||
+ | } | ||
+ | XtVaGetValues(w, | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XSetBackground(XtDisplay(w), | ||
+ | XSetLineAttributes(XtDisplay(w), | ||
+ | if (button_pressed > 1) { | ||
+ | XSetFunction(XtDisplay(w), | ||
+ | /* Kreslime znovu ten samy objekt pres sebe, cimz ho smazeme */ | ||
+ | switch (tool) { | ||
+ | case LINE: | ||
+ | XDrawLine(XtDisplay(w), | ||
+ | break; | ||
+ | case RECTANGLE: | ||
+ | if (fill) { | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XFillRectangle(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | } | ||
+ | XDrawRectangle(XtDisplay(w), | ||
+ | break; | ||
+ | case ELLIPSE: | ||
+ | if (fill) { | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XFillArc(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | } | ||
+ | XDrawArc(XtDisplay(w), | ||
+ | break; | ||
+ | default: | ||
+ | break; | ||
+ | } | ||
+ | } else { | ||
+ | /* remember first MotionNotify */ | ||
+ | button_pressed = 2; | ||
+ | } | ||
+ | x2 = event-> | ||
+ | y2 = event-> | ||
+ | switch (tool) { | ||
+ | case LINE: | ||
+ | XDrawLine(XtDisplay(w), | ||
+ | break; | ||
+ | case RECTANGLE: | ||
+ | if (fill) { | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XFillRectangle(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | } | ||
+ | XDrawRectangle(XtDisplay(w), | ||
+ | break; | ||
+ | case ELLIPSE: | ||
+ | if (fill) { | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XFillArc(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | } | ||
+ | XDrawArc(XtDisplay(w), | ||
+ | break; | ||
+ | default: | ||
+ | saveDrawing(w); | ||
+ | XDrawPoint(XtDisplay(w), | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* Save callback function */ | ||
+ | void SaveCB(Widget w, XtPointer client_data, | ||
+ | XmDrawingAreaCallbackStruct *d = (XmDrawingAreaCallbackStruct*) call_data; | ||
+ | switch (d-> | ||
+ | case ButtonPress: | ||
+ | if (d-> | ||
+ | button_pressed = 1; | ||
+ | x1 = d-> | ||
+ | y1 = d-> | ||
+ | } | ||
+ | break; | ||
+ | case ButtonRelease: | ||
+ | if (d-> | ||
+ | saveDrawing(w); | ||
+ | button_pressed = 0; | ||
+ | XClearArea(XtDisplay(w), | ||
+ | } | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* " | ||
+ | void ExposeCB(Widget w, XtPointer client_data, | ||
+ | size_t i = 0; | ||
+ | XGCValues lineColor; | ||
+ | for (; i < ndrawings; i++) { | ||
+ | x1 = drawings[i].x1; | ||
+ | x2 = drawings[i].x2; | ||
+ | y1 = drawings[i].y1; | ||
+ | y2 = drawings[i].y2; | ||
+ | if (drawings[i].fill) { | ||
+ | XGetGCValues(XtDisplay(w), | ||
+ | } | ||
+ | switch (drawings[i].tool) { | ||
+ | case LINE: | ||
+ | XDrawLine(XtDisplay(w), | ||
+ | break; | ||
+ | case RECTANGLE: | ||
+ | if (drawings[i].fill) { | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XFillRectangle(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | } | ||
+ | XDrawRectangle(XtDisplay(w), | ||
+ | break; | ||
+ | case ELLIPSE: | ||
+ | if (drawings[i].fill) { | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | XFillArc(XtDisplay(w), | ||
+ | XSetForeground(XtDisplay(w), | ||
+ | } | ||
+ | XDrawArc(XtDisplay(w), | ||
+ | break; | ||
+ | case POINT: | ||
+ | XDrawPoint(XtDisplay(w), | ||
+ | XDrawPoint(XtDisplay(w), | ||
+ | break; | ||
+ | default: | ||
+ | fprintf(stderr, | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* " | ||
+ | void ClearCB(Widget w, XtPointer client_data, | ||
+ | Widget wcd = (Widget) client_data; | ||
+ | ndrawings = 0; | ||
+ | XClearWindow(XtDisplay(wcd), | ||
+ | } | ||
+ | |||
+ | /* Nastaveni nastroje */ | ||
+ | void setTool(Widget w, XtPointer newtool, XtPointer call_data) { | ||
+ | tool = (toolkit) newtool; | ||
+ | } | ||
+ | |||
+ | /* Nastaveni barvy popredi */ | ||
+ | void setColor(Widget w, XtPointer color, XtPointer call_data) { | ||
+ | unsigned long pixel = (*((XColor**)color))-> | ||
+ | if (pixel == black.pixel) { | ||
+ | *((XColor**) color) = &white; | ||
+ | } else if (pixel == white.pixel) { | ||
+ | *((XColor**) color) = &red; | ||
+ | } else if (pixel == red.pixel) { | ||
+ | *((XColor**) color) = &green; | ||
+ | } else if (pixel == green.pixel) { | ||
+ | *((XColor**) color) = &blue; | ||
+ | } else if (pixel == blue.pixel) { | ||
+ | *((XColor**) color) = &black; | ||
+ | } | ||
+ | / | ||
+ | XtVaSetValues(w, | ||
+ | } | ||
+ | |||
+ | /* Nastaveni tloustky cary */ | ||
+ | void setLineWidth(Widget w, XtPointer client_data, | ||
+ | XmString label; | ||
+ | switch (line_width) { | ||
+ | case 0: | ||
+ | line_width = 3; | ||
+ | label = XmStringCreateSimple(" | ||
+ | XtVaSetValues(w, | ||
+ | break; | ||
+ | case 3: | ||
+ | line_width = 8; | ||
+ | label = XmStringCreateSimple(" | ||
+ | XtVaSetValues(w, | ||
+ | break; | ||
+ | default: | ||
+ | line_width = 0; | ||
+ | label = XmStringCreateSimple(" | ||
+ | XtVaSetValues(w, | ||
+ | } | ||
+ | XmStringFree(label); | ||
+ | } | ||
+ | |||
+ | /* Nastaveni stylu cary */ | ||
+ | void setLineStyle(Widget w, XtPointer client_data, | ||
+ | XmString label; | ||
+ | switch (line_style) { | ||
+ | case LineSolid: | ||
+ | line_style = LineDoubleDash; | ||
+ | label = XmStringCreateSimple(" | ||
+ | XtVaSetValues(w, | ||
+ | break; | ||
+ | case LineDoubleDash: | ||
+ | line_style = LineSolid; | ||
+ | label = XmStringCreateSimple(" | ||
+ | XtVaSetValues(w, | ||
+ | break; | ||
+ | default: | ||
+ | label = XmStringCreateSimple("" | ||
+ | } | ||
+ | XmStringFree(label); | ||
+ | } | ||
+ | |||
+ | /* Nastaveni vyplnovani */ | ||
+ | void setFill(Widget w, XtPointer client_data, | ||
+ | XmString label; | ||
+ | if (fill) { | ||
+ | fill = 0; | ||
+ | label = XmStringCreateSimple(" | ||
+ | } else { | ||
+ | fill = 1; | ||
+ | label = XmStringCreateSimple(" | ||
+ | } | ||
+ | XtVaSetValues(w, | ||
+ | XmStringFree(label); | ||
+ | } | ||
+ | |||
+ | /* " | ||
+ | void quitCB(Widget w, XtPointer client_data, | ||
+ | XtManageChild(question); | ||
+ | } | ||
+ | |||
+ | /* Konecny callback */ | ||
+ | void questionCB(Widget w, XtPointer client_data, | ||
+ | size_t i = 0; | ||
+ | if ((int)client_data) { | ||
+ | for (; i < allocated; i++) { | ||
+ | if (drawings != NULL && drawings[i].gc != NULL) { | ||
+ | XFreeGC(XtDisplay(w), | ||
+ | } else { | ||
+ | / | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | if (inputGC != NULL) { | ||
+ | XFreeGC(XtDisplay(w), | ||
+ | } | ||
+ | exit(0); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | int main(int argc, char **argv) { | ||
+ | XtAppContext app_context; | ||
+ | XmString label; | ||
+ | Atom wm_delete; | ||
+ | Widget topLevel, | ||
+ | mainWin, | ||
+ | frame, | ||
+ | drawArea, | ||
+ | command_window, | ||
+ | toolbox, | ||
+ | pointBtn, | ||
+ | lineBtn, | ||
+ | rectBtn, | ||
+ | ellipseBtn, | ||
+ | colors, | ||
+ | lineFgBtn, | ||
+ | lineBgBtn, | ||
+ | fillFgBtn, | ||
+ | fillBgBtn, | ||
+ | style, | ||
+ | lineSizeBtn, | ||
+ | lineStyleBtn, | ||
+ | fillBtn, | ||
+ | sys, | ||
+ | quitBtn, | ||
+ | clearBtn; | ||
+ | |||
+ | char *fallback_resources[] = { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | NULL | ||
+ | }; | ||
+ | |||
+ | XtSetLanguageProc(NULL, | ||
+ | topLevel = XtVaAppInitialize( | ||
+ | & | ||
+ | " | ||
+ | NULL, 0, /* command line option list */ | ||
+ | & | ||
+ | fallback_resources, | ||
+ | XmNdeleteResponse, | ||
+ | NULL); | ||
+ | mainWin = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmMainWindowWidgetClass, | ||
+ | topLevel, | ||
+ | XmNcommandWindowLocation, | ||
+ | NULL); | ||
+ | frame = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmFrameWidgetClass, | ||
+ | mainWin, | ||
+ | NULL); | ||
+ | drawArea = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmDrawingAreaWidgetClass, | ||
+ | frame, | ||
+ | XmNwidth, 320, /* set startup width */ | ||
+ | XmNheight, | ||
+ | NULL); | ||
+ | command_window = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmRowColumnWidgetClass, | ||
+ | mainWin, | ||
+ | NULL); | ||
+ | toolbox = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmRowColumnWidgetClass, | ||
+ | command_window, | ||
+ | XmNentryAlignment, | ||
+ | XmNorientation, | ||
+ | XmNpacking, | ||
+ | NULL); | ||
+ | colors = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmRowColumnWidgetClass, | ||
+ | command_window, | ||
+ | XmNentryAlignment, | ||
+ | XmNorientation, | ||
+ | XmNpacking, | ||
+ | NULL); | ||
+ | style = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmRowColumnWidgetClass, | ||
+ | command_window, | ||
+ | XmNentryAlignment, | ||
+ | XmNorientation, | ||
+ | XmNpacking, | ||
+ | NULL); | ||
+ | sys = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmRowColumnWidgetClass, | ||
+ | command_window, | ||
+ | XmNentryAlignment, | ||
+ | XmNorientation, | ||
+ | XmNpacking, | ||
+ | NULL); | ||
+ | clearBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | sys, | ||
+ | NULL); | ||
+ | pointBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | toolbox, | ||
+ | NULL); | ||
+ | lineBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | toolbox, | ||
+ | NULL); | ||
+ | rectBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | toolbox, | ||
+ | NULL); | ||
+ | ellipseBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | toolbox, | ||
+ | NULL); | ||
+ | lineFgBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | colors, | ||
+ | NULL); | ||
+ | lineBgBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | colors, | ||
+ | NULL); | ||
+ | fillFgBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | colors, | ||
+ | NULL); | ||
+ | fillBgBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | colors, | ||
+ | NULL); | ||
+ | label = XmStringCreateSimple(" | ||
+ | lineSizeBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | style, | ||
+ | XmNlabelString, | ||
+ | NULL); | ||
+ | XmStringFree(label); | ||
+ | label = XmStringCreateSimple(" | ||
+ | lineStyleBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | style, | ||
+ | XmNlabelString, | ||
+ | NULL); | ||
+ | XmStringFree(label); | ||
+ | label = XmStringCreateSimple(" | ||
+ | fillBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | style, | ||
+ | XmNlabelString, | ||
+ | NULL); | ||
+ | XmStringFree(label); | ||
+ | quitBtn = XtVaCreateManagedWidget( | ||
+ | " | ||
+ | xmPushButtonWidgetClass, | ||
+ | sys, | ||
+ | NULL); | ||
+ | |||
+ | question = XmCreateQuestionDialog(topLevel, | ||
+ | XtVaSetValues(question, | ||
+ | XtUnmanageChild(XmMessageBoxGetChild(question, | ||
+ | XtAddCallback(question, | ||
+ | / | ||
+ | wm_delete = XInternAtom(XtDisplay(topLevel), | ||
+ | XmAddWMProtocolCallback(topLevel, | ||
+ | XmActivateWMProtocol(topLevel, | ||
+ | XtAddEventHandler(topLevel, | ||
+ | |||
+ | XmMainWindowSetAreas(mainWin, | ||
+ | |||
+ | cmap = DefaultColormap(XtDisplay(drawArea), | ||
+ | if ( | ||
+ | !XAllocNamedColor(XtDisplay(drawArea), | ||
+ | !XAllocNamedColor(XtDisplay(drawArea), | ||
+ | !XAllocNamedColor(XtDisplay(drawArea), | ||
+ | !XAllocNamedColor(XtDisplay(drawArea), | ||
+ | !XAllocNamedColor(XtDisplay(drawArea), | ||
+ | ) { | ||
+ | fprintf(stderr, | ||
+ | return 1; | ||
+ | } | ||
+ | XtVaSetValues(lineFgBtn, | ||
+ | XtVaSetValues(lineBgBtn, | ||
+ | XtVaSetValues(fillFgBtn, | ||
+ | XtVaSetValues(fillBgBtn, | ||
+ | |||
+ | XtAddCallback(drawArea, | ||
+ | XtAddEventHandler(drawArea, | ||
+ | XtAddCallback(drawArea, | ||
+ | XtAddCallback(clearBtn, | ||
+ | XtAddCallback(lineFgBtn, | ||
+ | XtAddCallback(lineBgBtn, | ||
+ | XtAddCallback(fillFgBtn, | ||
+ | XtAddCallback(fillBgBtn, | ||
+ | XtAddCallback(lineSizeBtn, | ||
+ | XtAddCallback(lineStyleBtn, | ||
+ | XtAddCallback(fillBtn, | ||
+ | XtAddCallback(pointBtn, | ||
+ | XtAddCallback(lineBtn, | ||
+ | XtAddCallback(rectBtn, | ||
+ | XtAddCallback(ellipseBtn, | ||
+ | XtAddCallback(quitBtn, | ||
+ | XtRealizeWidget(topLevel); | ||
+ | XtAppMainLoop(app_context); | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | <file make Imakefile> | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | CC=gcc | ||
+ | CCOPTIONS=-O2 -pipe -pedantic-errors -Wall -Wextra -march=native -ansi | ||
+ | CDEBUGFLAGS=-g | ||
+ | |||
+ | LOCAL_LIBRARIES = XmClientLibs $(XMULIB) | ||
+ | |||
+ | MSimpleProgramTarget(draw) | ||
+ | |||
+ | clean:: | ||
+ | $(RM) Makefile | ||
+ | </ |