void PainterOpenVG::drawLine(const IntPoint& from, const IntPoint& to) { ASSERT(m_state); if (m_state->strokeDisabled()) return; m_surface->makeCurrent(); VGPath path = vgCreatePath( VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0 /* scale */, 0.0 /* bias */, 2 /* expected number of segments */, 4 /* expected number of total coordinates */, VG_PATH_CAPABILITY_APPEND_TO); ASSERT_VG_NO_ERROR(); VGUErrorCode errorCode; // Try to align lines to pixels, centering them between pixels for odd thickness values. if (fmod(m_state->strokeThickness + 0.5, 2.0) < 1.0) errorCode = vguLine(path, from.x(), from.y(), to.x(), to.y()); else if ((to.y() - from.y()) > (to.x() - from.x())) // more vertical than horizontal errorCode = vguLine(path, from.x() + 0.5, from.y(), to.x() + 0.5, to.y()); else errorCode = vguLine(path, from.x(), from.y() + 0.5, to.x(), to.y() + 0.5); if (errorCode == VGU_NO_ERROR) { vgDrawPath(path, VG_STROKE_PATH); ASSERT_VG_NO_ERROR(); } vgDestroyPath(path); ASSERT_VG_NO_ERROR(); }
VGPath SurfaceOpenVG::cachedPath(CachedPathDescriptor which) { Vector<VGPath>& paths = cachedPaths(); if (paths.isEmpty()) { paths.resize(CachedPathCount); paths.fill(VG_INVALID_HANDLE); } if (paths.at(which) == VG_INVALID_HANDLE) { sharedSurface()->makeCurrent(); VGPath path = VG_INVALID_HANDLE; VGUErrorCode errorCode; switch (which) { case CachedLinePath: path = vgCreatePath( VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0 /* scale */, 0.0 /* bias */, 2 /* expected number of segments */, 4 /* expected number of total coordinates */, VG_PATH_CAPABILITY_APPEND_TO); ASSERT_VG_NO_ERROR(); errorCode = vguLine(path, 0, 0, 1, 0); ASSERT(errorCode == VGU_NO_ERROR); break; case CachedRectPath: path = vgCreatePath( VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1.0 /* scale */, 0.0 /* bias */, 5 /* expected number of segments */, 5 /* expected number of total coordinates */, VG_PATH_CAPABILITY_APPEND_TO); ASSERT_VG_NO_ERROR(); errorCode = vguRect(path, 0, 0, 1, 1); ASSERT(errorCode == VGU_NO_ERROR); break; default: ASSERT_NOT_REACHED(); } paths.at(which) = path; makeCurrent(); } return paths.at(which); }
void createPrimitives() { VGfloat points[] = {-30,-30, 30,-30, 0,30}; line = testCreatePath(); vguLine(line, -30,-30,30,30); primitives[0] = line; polyOpen = testCreatePath(); vguPolygon(polyOpen, points, 3, VG_FALSE); primitives[1] = polyOpen; polyClosed = testCreatePath(); vguPolygon(polyClosed, points, 3, VG_TRUE); primitives[2] = polyClosed; rect = testCreatePath(); vguRect(rect, -50,-30, 100,60); primitives[3] = rect; rectRound = testCreatePath(); vguRoundRect(rectRound, -50,-30, 100,60, 30,30); primitives[4] = rectRound; ellipse = testCreatePath(); vguEllipse(ellipse, 0,0, 100, 100); primitives[5] = ellipse; arcOpen = testCreatePath(); vguArc(arcOpen, 0,0, 100,60, 0, 270, VGU_ARC_OPEN); primitives[6] = arcOpen; arcChord = testCreatePath(); vguArc(arcChord, 0,0, 100,60, 0, 270, VGU_ARC_CHORD); primitives[7] = arcChord; arcPie = testCreatePath(); vguArc(arcPie, 0,0, 100,60, 0, 270, VGU_ARC_PIE); primitives[8] = arcPie; }
LRESULT OnPaint(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { VGPaint strokePaint = vgCreatePaint(); vgSetPaint(strokePaint, VG_STROKE_PATH); VGfloat color[4] = { 1.0f, 0.0f, 0.0f, 1.0f }; vgSetParameterfv(strokePaint, VG_PAINT_COLOR, 4, &color[0]); VGPath line = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL); vguLine(line, 20, 20, 130, 130); VGPath square = vgCreatePath(VG_PATH_FORMAT_STANDARD, VG_PATH_DATATYPE_F, 1, 0, 0, 0, VG_PATH_CAPABILITY_ALL); vguRect(square, 10.0f, 10.0f, 130.0f, 50.0f); vgSetf(VG_STROKE_LINE_WIDTH, 7.0f); vgDrawPath(line, VG_STROKE_PATH); vgDrawPath(square, VG_STROKE_PATH); ::ValidateRect(hWnd, NULL); return 0; }
// Line makes a line from (x1,y1) to (x2,y2) void Line(VGfloat x1, VGfloat y1, VGfloat x2, VGfloat y2) { VGPath path = newpath(); vguLine(path, x1, y1, x2, y2); vgDrawPath(path, VG_STROKE_PATH); vgDestroyPath(path); }