📄 cdraw.cpp
字号:
END_METHODBEGIN_METHOD(CDRAW_line, GB_INTEGER x1; GB_INTEGER y1; GB_INTEGER x2; GB_INTEGER y2) CHECK_PAINTER(); DP->drawLine(VARG(x1), VARG(y1), VARG(x2), VARG(y2)); if (DPM) DPM->drawLine(VARG(x1), VARG(y1), VARG(x2), VARG(y2));END_METHODBEGIN_METHOD(CDRAW_point, GB_INTEGER x; GB_INTEGER y) CHECK_PAINTER(); DP->drawPoint(VARG(x), VARG(y)); if (DPM) DPM->drawPoint(VARG(x), VARG(y));END_METHODBEGIN_METHOD(CDRAW_picture, GB_OBJECT pict; GB_INTEGER x; GB_INTEGER y; GB_INTEGER sx; GB_INTEGER sy; GB_INTEGER sw; GB_INTEGER sh) long x, y, sx, sy, sw, sh; CPICTURE *picture = (CPICTURE *)VARG(pict); QPixmap *p; CHECK_PAINTER(); if (GB.CheckObject(picture)) return; x = VARGOPT(x, 0); y = VARGOPT(y, 0); sx = VARGOPT(sx, 0); sy = VARGOPT(sy, 0); sw = VARGOPT(sw, -1); sh = VARGOPT(sh, -1); p = picture->pixmap; DP->drawPixmap(x, y, *p, sx, sy, sw, sh); if (DPM) { if (p->hasAlpha()) { DPM->save(); DPM->setRasterOp(Qt::OrROP); DPM->drawPixmap(x, y, *(p->mask()), sx, sy, sw, sh); DPM->restore(); } else DPM->fillRect(x, y, sw, sh, Qt::color1); }END_METHODBEGIN_METHOD(CDRAW_image, GB_OBJECT img; GB_INTEGER x; GB_INTEGER y; GB_INTEGER sx; GB_INTEGER sy; GB_INTEGER sw; GB_INTEGER sh) static bool warn = false; long x, y, sx, sy, sw, sh; CIMAGE *img = (CIMAGE *)VARG(img); CHECK_PAINTER(); if (GB.CheckObject(img)) return; x = VARGOPT(x, 0); y = VARGOPT(y, 0); sx = VARGOPT(sx, 0); sy = VARGOPT(sy, 0); sw = VARGOPT(sw, -1); sh = VARGOPT(sh, -1); DP->drawImage(x, y, *(img->image), sx, sy, sw, sh); if (DPM && !warn) { qDebug("WARNING: DRAW.Image() on transparent devices is not implemented."); warn = true; }END_METHODBEGIN_METHOD(CDRAW_drawing, GB_OBJECT drawing; GB_INTEGER x; GB_INTEGER y; GB_INTEGER sx; GB_INTEGER sy; GB_INTEGER sw; GB_INTEGER sh) static bool warn = false; long x, y, sx, sy, sw, sh; CDRAWING *drawing = (CDRAWING *)VARG(drawing); CHECK_PAINTER(); if (GB.CheckObject(drawing)) return; x = VARGOPT(x, 0); y = VARGOPT(y, 0); sx = VARGOPT(sx, 0); sy = VARGOPT(sy, 0); sw = VARGOPT(sw, -1); sh = VARGOPT(sh, -1); DP->save(); if ((sw > 0) && (sh > 0)) DP->setClipRect(x + sx, y + sy, sw, sh); DP->drawPicture(x, y, *(drawing->picture)); DP->restore(); if (DPM) { DPM->save(); if ((sw > 0) && (sh > 0)) DPM->setClipRect(x + sx, y + sy, sw, sh); DPM->drawPicture(x, y, *(drawing->picture)); DPM->restore(); if (!warn) { qDebug("WARNING: Draw.Drawing() on transparent devices partially implemented."); warn = true; } }END_METHODBEGIN_METHOD(CDRAW_tile, GB_OBJECT pict; GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h) CPICTURE *picture = (CPICTURE *)VARG(pict); QPixmap *p; CHECK_PAINTER(); if (GB.CheckObject(picture)) return; p = picture->pixmap; DP->drawTiledPixmap(VARG(x), VARG(y), VARG(w), VARG(h), *p, -DP->brushOrigin().x(), -DP->brushOrigin().y()); if (DPM) { if (p->hasAlpha()) { DPM->save(); DPM->setRasterOp(Qt::OrROP); DPM->drawTiledPixmap(VARG(x), VARG(y), VARG(w), VARG(h), *(p->mask()), -DP->brushOrigin().x(), -DP->brushOrigin().y()); DPM->restore(); } else DPM->fillRect(VARG(x), VARG(y), VARG(w), VARG(h), Qt::color1); }END_METHODstatic QStringList text_sl;static QMemArray<int> text_w;static int text_line;static int text_width(QPainter *dp, QString &s){ int w, width = 0; int i; text_sl = QStringList::split('\n', s, true); QMemArray<int> tw(text_sl.count()); for (i = 0; i < (int)text_sl.count(); i++) { w = dp->fontMetrics().width(text_sl[i]); if (w > width) width = w; tw[i] = w; } text_w = tw; return width;}static int text_height(QPainter *dp, QString &s){ text_line = dp->fontMetrics().height(); return text_line * (1 + s.contains('\n'));}BEGIN_METHOD(CDRAW_text, GB_STRING text; GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h; GB_INTEGER align) //static bool warn = false; QString text; int x, y, w, h, align, xx, ww; int tw, th; int i; CHECK_PAINTER(); text = QSTRING_ARG(text); x = VARG(x); y = VARG(y); /*if (MISSING(w) && MISSING(h) && MISSING(align)) { DP->drawText(x, y, text); return; }*/ tw = text_width(DP, text); th = text_height(DP, text); w = VARGOPT(w, tw); h = VARGOPT(h, th); align = VARGOPT(align, Qt::AlignAuto + Qt::AlignTop); y += DP->fontMetrics().ascent(); switch(align & Qt::AlignVertical_Mask) { case Qt::AlignBottom: y += h - th; break; case Qt::AlignVCenter: y += (h - th) / 2; break; default: break; } align = qApp->horizontalAlignment(align); for (i = 0; i < (int)text_sl.count(); i++) { text = text_sl[i]; ww = text_w[i]; switch(align) { case Qt::AlignRight: xx = x + w - ww; break; case Qt::AlignHCenter: xx = x + (w - ww) / 2; break; default: xx = x; break; } DP->drawText(xx, y, text); if (DPM) DPM->drawText(xx, y, text); /* if (DPM && !warn) { qDebug("WARNING: Draw.Text() on transparent devices not implemented."); warn = true; } */ y += text_line; }END_METHODBEGIN_METHOD(CDRAW_rect_text, GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h; GB_STRING text; GB_INTEGER align) //static bool warn = false; int align; CHECK_PAINTER(); align = Qt::AlignAuto | Qt::AlignVCenter; if (!MISSING(align)) align = VARG(align) & ALIGN_MASK; align |= Qt::WordBreak; DP->drawText(VARG(x), VARG(y), VARG(w), VARG(h), align, QSTRING_ARG(text)); if (DPM) DPM->drawText(VARG(x), VARG(y), VARG(w), VARG(h), align, QSTRING_ARG(text)); /* if (DPM && !warn) { qDebug("WARNING: Draw.RectText() on transparent devices not implemented."); warn = true; } */END_METHODBEGIN_METHOD(CDRAW_text_width, GB_STRING text) QString s; CHECK_PAINTER(); s = QSTRING_ARG(text); GB.ReturnInteger(text_width(DP, s));END_METHODBEGIN_METHOD(CDRAW_text_height, GB_STRING text) QString s; CHECK_PAINTER(); s = QSTRING_ARG(text); GB.ReturnInteger(text_height(DP, s));END_METHODstatic void draw_poly(bool fill, GB_ARRAY points){ uint i, j, n; int x, y; CHECK_PAINTER(); n = GB.Array.Count(points) / 2; if (n == 0) return; QPointArray p(n); for (i = 0, j = 0; i < n; i++, j += 2) { x = *((int *)GB.Array.Get(points, j)); y = *((int *)GB.Array.Get(points, j + 1)); p.setPoint(i, x, y); } if (fill) { DP->drawPolygon(p, true); if (DPM) DPM->drawPolygon(p, true); } else { DP->drawPolyline(p); if (DPM) DPM->drawPolyline(p); }}BEGIN_METHOD(CDRAW_polyline, GB_OBJECT points) draw_poly(false, VARG(points));END_METHODBEGIN_METHOD(CDRAW_polygon, GB_OBJECT points) draw_poly(true, VARG(points));END_METHODBEGIN_PROPERTY(CDRAW_clip_x) CHECK_PAINTER(); GB.ReturnInteger(DP->clipRegion(QPainter::CoordPainter).boundingRect().x());END_PROPERTYBEGIN_PROPERTY(CDRAW_clip_y) CHECK_PAINTER(); GB.ReturnInteger(DP->clipRegion(QPainter::CoordPainter).boundingRect().y());END_PROPERTYBEGIN_PROPERTY(CDRAW_clip_w) CHECK_PAINTER(); GB.ReturnInteger(DP->clipRegion(QPainter::CoordPainter).boundingRect().width());END_PROPERTYBEGIN_PROPERTY(CDRAW_clip_h) CHECK_PAINTER(); GB.ReturnInteger(DP->clipRegion(QPainter::CoordPainter).boundingRect().height());END_PROPERTYBEGIN_PROPERTY(CDRAW_clip_enabled) CHECK_PAINTER(); if (READ_PROPERTY) GB.ReturnBoolean(DP->hasClipping()); else { DP->setClipping(VPROP(GB_BOOLEAN)); if (DPM) DPM->setClipping(VPROP(GB_BOOLEAN)); }END_PROPERTYBEGIN_METHOD(CDRAW_clip, GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h) CHECK_PAINTER(); DP->setClipRect(VARG(x), VARG(y), VARG(w), VARG(h), QPainter::CoordPainter); if (DPM) DPM->setClipRect(VARG(x), VARG(y), VARG(w), VARG(h), QPainter::CoordPainter);END_PROPERTYGB_DESC CDrawClipDesc[] ={ GB_DECLARE(".DrawClip", 0), GB_VIRTUAL_CLASS(), GB_STATIC_PROPERTY_READ("X", "i", CDRAW_clip_x), GB_STATIC_PROPERTY_READ("Y", "i", CDRAW_clip_y), GB_STATIC_PROPERTY_READ("W", "i", CDRAW_clip_w), GB_STATIC_PROPERTY_READ("H", "i", CDRAW_clip_h), GB_STATIC_PROPERTY_READ("Width", "i", CDRAW_clip_w), GB_STATIC_PROPERTY_READ("Height", "i", CDRAW_clip_h), GB_STATIC_PROPERTY("Enabled", "b", CDRAW_clip_enabled), GB_STATIC_METHOD("_call", NULL, CDRAW_clip, "(X)i(Y)i(Width)i(Height)i"), GB_END_DECLARE};GB_DESC CDrawDesc[] ={ GB_DECLARE("Draw", 0), GB_VIRTUAL_CLASS(), GB_STATIC_METHOD("_init", NULL, CDRAW_init, NULL), GB_STATIC_METHOD("_exit", NULL, CDRAW_exit, NULL), GB_STATIC_METHOD("Begin", NULL, CDRAW_begin, "(Device)o"), GB_STATIC_METHOD("End", NULL, CDRAW_end, NULL), GB_STATIC_PROPERTY_SELF("Clip", ".DrawClip"), //GB_STATIC_METHOD("Clip", NULL, CDRAW_clip, "(X)i(Y)i(Width)i(Height)i"), GB_STATIC_PROPERTY("BackColor", "i", CDRAW_background), GB_STATIC_PROPERTY("Background", "i", CDRAW_background), GB_STATIC_PROPERTY("Transparent", "b", CDRAW_transparent), GB_STATIC_PROPERTY("Invert", "b", CDRAW_invert), GB_STATIC_PROPERTY("ForeColor", "i", CDRAW_foreground), GB_STATIC_PROPERTY("Foreground", "i", CDRAW_foreground), GB_STATIC_PROPERTY("LineWidth", "i", CDRAW_line_width), GB_STATIC_PROPERTY("LineStyle", "i", CDRAW_line_style), GB_STATIC_PROPERTY("FillColor", "i", CDRAW_fill_color), GB_STATIC_PROPERTY("FillStyle", "i", CDRAW_fill_style), GB_STATIC_PROPERTY("Font", "Font", CDRAW_font), GB_STATIC_PROPERTY("FillX", "i", CDRAW_fill_x), GB_STATIC_PROPERTY("FillY", "i", CDRAW_fill_y), //GB_STATIC_METHOD("Arc", NULL, CDRAW_arc, "(X)i(Y)i(Width)i(Height)i(Start)e(Length)e"), //GB_STATIC_METHOD("Chord", NULL, CDRAW_chord, "(X)i(Y)i(Width)i(Height)i(Start)e(Length)e"), //GB_SATIC_METHOD("Circle", NULL, CDRAW_circle, "(X)i(Y)i(Radius)i[(Start)e(Length)e]"), GB_STATIC_METHOD("Ellipse", NULL, CDRAW_ellipse, "(X)i(Y)i(Width)i(Height)i[(Start)f(Length)f]"), GB_STATIC_METHOD("Line", NULL, CDRAW_line, "(X1)i(Y1)i(X2)i(Y2)i"), GB_STATIC_METHOD("Picture", NULL, CDRAW_picture, "(Picture)Picture;(X)i(Y)i[(SrcX)i(SrcY)i(SrcWidth)i(SrcHeight)i]"), GB_STATIC_METHOD("Image", NULL, CDRAW_image, "(Image)Image;(X)i(Y)i[(SrcX)i(SrcY)i(SrcWidth)i(SrcHeight)i]"), GB_STATIC_METHOD("Drawing", NULL, CDRAW_drawing, "(Image)Drawing;(X)i(Y)i[(Width)i(Height)i]"), GB_STATIC_METHOD("Tile", NULL, CDRAW_tile, "(Picture)Picture;(X)i(Y)i(Width)i(Height)i"), GB_STATIC_METHOD("Point", NULL, CDRAW_point, "(X)i(Y)i"), GB_STATIC_METHOD("Rect", NULL, CDRAW_rect, "(X)i(Y)i(Width)i(Height)i"), GB_STATIC_METHOD("Text", NULL, CDRAW_text, "(Text)s(X)i(Y)i[(Width)i(Height)i(Alignment)i)]"), GB_STATIC_METHOD("TextWidth", "i", CDRAW_text_width, "(Text)s"), GB_STATIC_METHOD("TextHeight", "i", CDRAW_text_height, "(Text)s"), GB_STATIC_METHOD("Polyline", NULL, CDRAW_polyline, "(Points)Integer[]"), GB_STATIC_METHOD("Polygon", NULL, CDRAW_polygon, "(Points)Integer[]"), GB_END_DECLARE};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -