GdkRectangle *world_to_real_rect (WorldRectangle *rcWorld, GdkRectangle *rcReal) { rcReal->x = world_to_real_x (rcWorld->xWorld) ; rcReal->y = world_to_real_y (rcWorld->yWorld) ; rcReal->width = world_to_real_cx (rcWorld->cxWorld) ; rcReal->height = world_to_real_cy (rcWorld->cyWorld) ; return rcReal ; }
static void draw (QCADDesignObject *obj, GdkDrawable *dst, GdkFunction rop, GdkRectangle *rcClip) { int Nix, Nix1 ; GdkGC *gc = NULL ; GdkRectangle rcReal ; GdkPoint ptSrc, ptDst ; QCADRectangleElectrode *rc_electrode = QCAD_RECTANGLE_ELECTRODE (obj) ; GdkColor *clr = NULL ; world_to_real_rect (&(obj->bounding_box), &rcReal) ; if (!RECT_INTERSECT_RECT (rcReal.x, rcReal.y, rcReal.width, rcReal.height, rcClip->x, rcClip->y, rcClip->width, rcClip->height)) return ; clr = obj->bSelected ? clr_idx_to_clr_struct (RED) : &(obj->clr) ; gc = gdk_gc_new (dst) ; gdk_gc_set_foreground (gc, clr) ; gdk_gc_set_background (gc, clr) ; gdk_gc_set_function (gc, rop) ; gdk_gc_set_clip_rectangle (gc, rcClip) ; ptSrc.x = world_to_real_x (rc_electrode->precompute_params.pt[0].xWorld) ; ptSrc.y = world_to_real_y (rc_electrode->precompute_params.pt[0].yWorld) ; ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[1].xWorld) ; ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[1].yWorld) ; gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ; ptSrc = ptDst ; ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[2].xWorld) ; ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[2].yWorld) ; gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ; ptSrc = ptDst ; ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[3].xWorld) ; ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[3].yWorld) ; gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ; ptSrc = ptDst ; ptDst.x = world_to_real_x (rc_electrode->precompute_params.pt[0].xWorld) ; ptDst.y = world_to_real_y (rc_electrode->precompute_params.pt[0].yWorld) ; gdk_draw_line (dst, gc, ptSrc.x, ptSrc.y, ptDst.x, ptDst.y) ; for (Nix = 0 ; Nix < rc_electrode->n_x_divisions ; Nix++) for (Nix1 = 0 ; Nix1 < rc_electrode->n_y_divisions ; Nix1++) { ptSrc.x = world_to_real_x (exp_array_index_2d (rc_electrode->precompute_params.pts, WorldPoint, Nix1, Nix).xWorld) ; ptSrc.y = world_to_real_y (exp_array_index_2d (rc_electrode->precompute_params.pts, WorldPoint, Nix1, Nix).yWorld) ; if (PT_IN_RECT (ptSrc.x, ptSrc.y, rcClip->x, rcClip->y, rcClip->width, rcClip->height)) gdk_draw_point (dst, gc, ptSrc.x, ptSrc.y) ; } g_object_unref (gc) ; }
static void draw (QCADDesignObject *obj, GdkDrawable *dst, GdkFunction rop) { GdkGC *gc = NULL ; GdkRectangle rcReal ; QCADRuler *ruler = QCAD_RULER (obj) ; double dCurrentGrad = 0 ; int iPowerOfTen = 0 ; int idx = -1 ; gboolean bVertical = (QCAD_RULER_ORIENTATION_EAST == ruler->orientation || QCAD_RULER_ORIENTATION_WEST == ruler->orientation) ; QCADLabel *lblGrad = NULL ; world_to_real_rect (&(ruler->ruler_bounding_box), &rcReal) ; gc = gdk_gc_new (dst) ; gdk_gc_set_function (gc, rop) ; gdk_gc_set_foreground (gc, &(obj->clr)) ; // Graduation lines should be at least MIN_GRADATION_DISTANCE_PIXELS pixels apart iPowerOfTen = (int)ceil (log10 (bVertical ? real_to_world_cy (MIN_GRADATION_DISTANCE_PIXELS) : real_to_world_cx (MIN_GRADATION_DISTANCE_PIXELS))) ; ruler->icLabelsVisible = 0 ; if (bVertical) { int xBeg = 0, xEnd = 0, xMid = 0, yReal = 0.0 ; double xBegWorld, xEndWorld, xMidWorld, yWorld ; if (QCAD_RULER_ORIENTATION_WEST == ruler->orientation) { xBeg = world_to_real_x (xBegWorld = ruler->ruler_bounding_box.xWorld), xEnd = world_to_real_x (xEndWorld = ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld) ; } else { xBeg = world_to_real_x (xBegWorld = ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld), xEnd = world_to_real_x (xEndWorld = ruler->ruler_bounding_box.xWorld) ; } xMid = world_to_real_x (xMidWorld = ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld / 2.0) ; for (dCurrentGrad = 0 ; dCurrentGrad < ruler->ruler_bounding_box.cyWorld ; dCurrentGrad += pow (10, iPowerOfTen)) { idx++ ; idx %= 10 ; yReal = world_to_real_y (yWorld = ruler->ruler_bounding_box.yWorld + dCurrentGrad) ; gdk_draw_line (dst, gc, xBeg, yReal, (0 == idx ? xEnd : xMid), yReal) ; if (0 == idx) { lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, dCurrentGrad, &(obj->clr)) ; qcad_label_shrinkwrap (lblGrad) ; qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), xEndWorld, yWorld) ; qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ; } } gdk_draw_line (dst, gc, xBeg, rcReal.y, xBeg, rcReal.y + rcReal.height) ; lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, ruler->ruler_bounding_box.cyWorld, &(obj->clr)) ; qcad_label_shrinkwrap (lblGrad) ; qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), xBegWorld, ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld) ; qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ; } else { int yBeg = 0, yEnd = 0, yMid = 0, xReal = 0.0 ; double yBegWorld, yEndWorld, yMidWorld, xWorld ; if (QCAD_RULER_ORIENTATION_NORTH == ruler->orientation) { yBeg = world_to_real_y (yBegWorld = ruler->ruler_bounding_box.yWorld), yEnd = world_to_real_y (yEndWorld = ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld) ; } else { yBeg = world_to_real_y (yBegWorld = ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld), yEnd = world_to_real_y (yEndWorld = ruler->ruler_bounding_box.yWorld) ; } yMid = world_to_real_y (yMidWorld = ruler->ruler_bounding_box.yWorld + ruler->ruler_bounding_box.cyWorld / 2.0) ; for (dCurrentGrad = 0 ; dCurrentGrad < ruler->ruler_bounding_box.cxWorld ; dCurrentGrad += pow (10, iPowerOfTen)) { idx++ ; idx %= 10 ; xReal = world_to_real_x (xWorld = ruler->ruler_bounding_box.xWorld + dCurrentGrad) ; gdk_draw_line (dst, gc, xReal, yBeg, xReal, (0 == idx ? yEnd : yMid)) ; if (0 == idx) { lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, dCurrentGrad, &(obj->clr)) ; qcad_label_shrinkwrap (lblGrad) ; qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), xWorld, yEndWorld) ; qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ; } } gdk_draw_line (dst, gc, rcReal.x, yBeg, rcReal.x + rcReal.width, yBeg) ; lblGrad = get_label_from_array (ruler->labels, (ruler->icLabelsVisible)++, ruler->ruler_bounding_box.cxWorld, &(obj->clr)) ; qcad_label_shrinkwrap (lblGrad) ; qcad_design_object_move_to (QCAD_DESIGN_OBJECT (lblGrad), ruler->ruler_bounding_box.xWorld + ruler->ruler_bounding_box.cxWorld, yBegWorld) ; qcad_design_object_draw (QCAD_DESIGN_OBJECT (lblGrad), dst, rop) ; } g_object_unref (gc) ; }