58using namespace std::placeholders;
66#include <glsl_kicad_frag.h>
67#include <glsl_kicad_vert.h>
74 wxGLAttributes attribs;
75 attribs.RGBA().DoubleBuffer().Depth( 8 ).EndList();
124 glDeleteTextures( 1, &bitmap.second.id );
130#ifndef DISABLE_BITMAP_CACHE
136 if( glIsTexture( it->second.id ) )
138 it->second.accessTime = wxGetUTCTimeMillis().GetValue();
139 return it->second.id;
144 glDeleteTextures( 1, &it->second.id );
172 return std::numeric_limits< GLuint >::max();
174 const wxImage& imgData = *imgPtr;
176 bmp.
w = imgData.GetSize().x;
177 bmp.
h = imgData.GetSize().y;
183 glGenTextures( 1, &textureID );
191 glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
193 if( imgData.HasAlpha() || imgData.HasMask() )
195 bmp.
size = bmp.
w * bmp.
h * 4;
196 auto buf = std::make_unique<uint8_t[]>( bmp.
size );
198 uint8_t* dstP = buf.get();
199 uint8_t* srcP = imgData.GetData();
201 long long pxCount =
static_cast<long long>( bmp.
w ) * bmp.
h;
203 if( imgData.HasAlpha() )
205 uint8_t* srcAlpha = imgData.GetAlpha();
207 for(
long long px = 0; px < pxCount; px++ )
209 memcpy( dstP, srcP, 3 );
217 else if( imgData.HasMask() )
219 uint8_t maskRed = imgData.GetMaskRed();
220 uint8_t maskGreen = imgData.GetMaskGreen();
221 uint8_t maskBlue = imgData.GetMaskBlue();
223 for(
long long px = 0; px < pxCount; px++ )
225 memcpy( dstP, srcP, 3 );
227 if( srcP[0] == maskRed && srcP[1] == maskGreen && srcP[2] == maskBlue )
228 dstP[3] = wxALPHA_TRANSPARENT;
230 dstP[3] = wxALPHA_OPAQUE;
237 glBindTexture( GL_TEXTURE_2D, textureID );
238 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA8, bmp.
w, bmp.
h, 0, GL_RGBA, GL_UNSIGNED_BYTE,
243 bmp.
size = bmp.
w * bmp.
h * 3;
245 uint8_t* srcP = imgData.GetData();
247 glBindTexture( GL_TEXTURE_2D, textureID );
248 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, bmp.
w, bmp.
h, 0, GL_RGB, GL_UNSIGNED_BYTE, srcP );
251 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
252 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
254 long long currentTime = wxGetUTCTimeMillis().GetValue();
259#ifndef DISABLE_BITMAP_CACHE
267 for(
const auto& [kiid, cachedBmp] :
m_bitmaps )
269 const int cacheTimeoutMillis = 1000L;
271 if( currentTime - cachedBmp.accessTime > cacheTimeoutMillis )
285 toRemove = *toRemoveLru;
291 glDeleteTextures( 1, &cachedBitmap.
id );
309 wxEvtHandler* aMouseListener, wxEvtHandler* aPaintListener,
310 const wxString& aName ) :
311 GAL( aDisplayOptions ),
315 m_mouseListener( aMouseListener ),
316 m_paintListener( aPaintListener ),
317 m_currentManager( nullptr ),
318 m_cachedManager( nullptr ),
319 m_nonCachedManager( nullptr ),
320 m_overlayManager( nullptr ),
321 m_tempManager( nullptr ),
323 m_overlayBuffer( 0 ),
325 m_isContextLocked( false ),
326 m_lockClientCookie( 0 )
333 throw std::runtime_error(
"Could not create the main OpenGL context" );
342 throw std::runtime_error(
"Could not create a private OpenGL context" );
387#if defined _WIN32 || defined _WIN64
394 SetSize( aParent->GetClientSize() );
405 gluTessProperty(
m_tesselator, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_POSITIVE );
468 wxString retVal = wxEmptyString;
470 wxFrame* testFrame =
new wxFrame(
nullptr, wxID_ANY, wxT(
"" ), wxDefaultPosition,
471 wxSize( 1, 1 ), wxFRAME_TOOL_WINDOW | wxNO_BORDER );
486 catch( std::runtime_error& err )
489 retVal = wxString( err.what() );
547#ifdef KICAD_GAL_PROFILE
548 PROF_TIMER totalRealTime(
"OPENGL_GAL::beginDrawing()",
true );
551 wxASSERT_MSG(
m_isContextLocked,
"GAL_DRAWING_CONTEXT RAII object should have locked context. "
552 "Calling GAL::beginDrawing() directly is not allowed." );
554 wxASSERT_MSG(
IsVisible(),
"GAL::beginDrawing() must not be entered when GAL is not visible. "
555 "Other drawing routines will expect everything to be initialized "
556 "which will not be the case." );
562 glMatrixMode( GL_PROJECTION );
578 catch(
const std::runtime_error& )
580 wxLogVerbose(
"Could not create a framebuffer for diff mode blending.\n" );
587 catch(
const std::runtime_error& )
589 wxLogVerbose(
"Could not create a framebuffer for overlays.\n" );
599 glDisable( GL_TEXTURE_2D );
601 glShadeModel( GL_FLAT );
604 glEnable( GL_DEPTH_TEST );
605 glDepthFunc( GL_LESS );
608 glEnable( GL_BLEND );
609 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
611 glMatrixMode( GL_MODELVIEW );
615 GLdouble matrixData[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
625 glLoadMatrixd( matrixData );
644 const GLint FONT_TEXTURE_UNIT = 2;
649 glActiveTexture( GL_TEXTURE0 + FONT_TEXTURE_UNIT );
654 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
655 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
656 checkGlError(
"loading bitmap font", __FILE__, __LINE__ );
658 glActiveTexture( GL_TEXTURE0 );
664 glActiveTexture( GL_TEXTURE0 + FONT_TEXTURE_UNIT );
666 glActiveTexture( GL_TEXTURE0 );
681 checkGlError(
"setting bitmap font sampler as shader parameter", __FILE__, __LINE__ );
694 renderingOffset.
x *= screenPixelSize.
x;
695 renderingOffset.
y *= screenPixelSize.
y;
701 glActiveTexture( GL_TEXTURE0 );
706#ifdef KICAD_GAL_PROFILE
707 totalRealTime.
Stop();
708 wxLogTrace(
traceGalProfile, wxT(
"OPENGL_GAL::beginDrawing(): %.1f ms" ),
709 totalRealTime.
msecs() );
720 PROF_TIMER cntEndNoncached(
"gl-end-noncached" );
730 cntEndNoncached.
Start();
732 cntEndNoncached.
Stop();
734 cntEndCached.
Start();
738 cntEndOverlay.
Start();
744 cntEndOverlay.
Stop();
746 cntComposite.
Start();
749 glColor4d( 1.0, 1.0, 1.0, 1.0 );
786 wxASSERT_MSG(
m_isContextLocked,
"Context not locked. A GAL_CONTEXT_LOCKER RAII object must "
787 "be stacked rather than making separate lock/unlock calls." );
790 "Context was locked by a different client. "
791 "Should not be possible with RAII objects." );
801 wxASSERT_MSG(
m_isContextLocked,
"GAL_UPDATE_CONTEXT RAII object should have locked context. "
802 "Calling this from anywhere else is not allowed." );
804 wxASSERT_MSG(
IsVisible(),
"GAL::beginUpdate() must not be entered when GAL is not visible. "
805 "Other update routines will expect everything to be initialized "
806 "which will not be the case." );
842 VECTOR2D startEndVector = aEndPoint - aStartPoint;
849 float startX =
static_cast<float>( aStartPoint.
x );
850 float startY =
static_cast<float>( aStartPoint.
y );
851 float endX =
static_cast<float>( aEndPoint.
x );
852 float endY =
static_cast<float>( aEndPoint.
y );
854 if( startX == endX && startY == endY )
856 drawCircle( aStartPoint, aWidth / 2, aReserve );
972 double startAngle = aStartAngle.
AsRadians();
973 double endAngle = startAngle + aAngle.
AsRadians();
990 for( alpha = startAngle; ( alpha + alphaIncrement ) < endAngle; )
996 alpha += alphaIncrement;
1002 const VECTOR2D endPoint( cos( endAngle ) * aRadius, sin( endAngle ) * aRadius );
1015 VECTOR2D p( cos( startAngle ) * aRadius, sin( startAngle ) * aRadius );
1017 unsigned int lineCount = 0;
1019 for( alpha = startAngle + alphaIncrement; alpha <= endAngle; alpha += alphaIncrement )
1022 if( alpha != endAngle )
1027 for( alpha = startAngle + alphaIncrement; alpha <= endAngle; alpha += alphaIncrement )
1029 VECTOR2D p_next( cos( alpha ) * aRadius, sin( alpha ) * aRadius );
1036 if( alpha != endAngle )
1038 VECTOR2D p_last( cos( endAngle ) * aRadius, sin( endAngle ) * aRadius );
1049 double aWidth,
double aMaxError )
1060 double startAngle = aStartAngle.
AsRadians();
1061 double endAngle = startAngle + aAngle.
AsRadians();
1069 double alphaIncrement = 2.0 * M_PI / segCount360;
1074 int seg_count =
KiROUND( ( endAngle - startAngle ) / alphaIncrement );
1076 if( seg_count % 2 != 0 )
1080 if( seg_count == 0 )
1082 VECTOR2D p_start( aCenterPoint.
x + cos( startAngle ) * aRadius,
1083 aCenterPoint.
y + sin( startAngle ) * aRadius );
1085 VECTOR2D p_end( aCenterPoint.
x + cos( endAngle ) * aRadius,
1086 aCenterPoint.
y + sin( endAngle ) * aRadius );
1093 alphaIncrement = ( endAngle - startAngle ) / seg_count;
1103 double width = aWidth / 2.0;
1104 VECTOR2D startPoint( cos( startAngle ) * aRadius, sin( startAngle ) * aRadius );
1105 VECTOR2D endPoint( cos( endAngle ) * aRadius, sin( endAngle ) * aRadius );
1110 VECTOR2D pOuter( cos( startAngle ) * ( aRadius + width ),
1111 sin( startAngle ) * ( aRadius + width ) );
1113 VECTOR2D pInner( cos( startAngle ) * ( aRadius - width ),
1114 sin( startAngle ) * ( aRadius - width ) );
1118 for( alpha = startAngle + alphaIncrement; alpha <= endAngle; alpha += alphaIncrement )
1120 VECTOR2D pNextOuter( cos( alpha ) * ( aRadius + width ),
1121 sin( alpha ) * ( aRadius + width ) );
1122 VECTOR2D pNextInner( cos( alpha ) * ( aRadius - width ),
1123 sin( alpha ) * ( aRadius - width ) );
1128 pOuter = pNextOuter;
1129 pInner = pNextInner;
1133 if( alpha != endAngle )
1135 VECTOR2D pLastOuter( cos( endAngle ) * ( aRadius + width ),
1136 sin( endAngle ) * ( aRadius + width ) );
1137 VECTOR2D pLastInner( cos( endAngle ) * ( aRadius - width ),
1138 sin( endAngle ) * ( aRadius - width ) );
1150 VECTOR2D p( cos( startAngle ) * aRadius, sin( startAngle ) * aRadius );
1155 for( alpha = startAngle + alphaIncrement; alpha <= endAngle; alpha += alphaIncrement )
1161 if( alpha != endAngle )
1168 for( alpha = startAngle + alphaIncrement; alpha <= endAngle; alpha += alphaIncrement )
1170 VECTOR2D p_next( cos( alpha ) * aRadius, sin( alpha ) * aRadius );
1177 if( alpha != endAngle )
1179 VECTOR2D p_last( cos( endAngle ) * aRadius, sin( endAngle ) * aRadius );
1191 VECTOR2D diagonalPointA( aEndPoint.
x, aStartPoint.
y );
1192 VECTOR2D diagonalPointB( aStartPoint.
x, aEndPoint.
y );
1218 if( aStartPoint == aEndPoint )
1224 std::deque<VECTOR2D> pointList;
1226 pointList.push_back( aStartPoint );
1227 pointList.push_back( diagonalPointA );
1228 pointList.push_back( aEndPoint );
1229 pointList.push_back( diagonalPointB );
1230 pointList.push_back( aStartPoint );
1242 return aPointList[idx];
1244 aPointList.size(), aWidth );
1258 return aLineChain.
CPoint( idx );
1260 numPoints, aWidth );
1269 return aPointList[idx];
1271 aPointList.size() );
1280 return aPointList[idx];
1282 aPointList.size() );
1291 return aPointList[idx];
1307 return aLineChain.
CPoint( idx );
1315 int lineQuadCount = 0;
1317 for(
const std::vector<VECTOR2D>& points : aPointList )
1318 lineQuadCount += points.size() - 1;
1322 for(
const std::vector<VECTOR2D>& points : aPointList )
1329 points.size(),
false );
1336 wxCHECK( aPointList.size() >= 2, );
1337 auto points = std::unique_ptr<GLdouble[]>(
new GLdouble[3 * aPointList.size()] );
1338 GLdouble* ptr = points.get();
1340 for(
const VECTOR2D& p : aPointList )
1353 wxCHECK( aListSize >= 2, );
1354 auto points = std::unique_ptr<GLdouble[]>(
new GLdouble[3 * aListSize] );
1355 GLdouble* target = points.get();
1358 for(
int i = 0; i < aListSize; ++i )
1371 bool aStrokeTriangulation )
1378 int totalTriangleCount = 0;
1393 for(
size_t i = 0; i < triPoly->GetTriangleCount(); i++ )
1396 triPoly->GetTriangle( i, a, b, c );
1408 const auto& poly = aPolySet.
Polygon( j );
1410 for(
const auto& lc : poly )
1419 aStrokeTriangulation =
true;
1423 if( aStrokeTriangulation )
1432 for(
size_t i = 0; i < triPoly->GetTriangleCount(); i++ )
1435 triPoly->GetTriangle( i, a, b, c );
1467 std::unique_ptr<GLdouble[]> points(
new GLdouble[3 * pointCount] );
1468 GLdouble* ptr = points.get();
1470 for(
int i = 0; i < pointCount; ++i )
1484 double aFilterValue )
1486 std::vector<VECTOR2D> output;
1487 std::vector<VECTOR2D> pointCtrl;
1489 pointCtrl.push_back( aStartPoint );
1490 pointCtrl.push_back( aControlPointA );
1491 pointCtrl.push_back( aControlPointB );
1492 pointCtrl.push_back( aEndPoint );
1495 converter.
GetPoly( output, aFilterValue );
1497 if( output.size() == 1 )
1498 output.push_back( output.front() );
1506 GLfloat alpha = std::clamp( alphaBlend, 0.0, 1.0 );
1516 glm::vec4 v0 = xform * glm::vec4( -w / 2, -h / 2, 0.0, 0.0 );
1517 glm::vec4
v1 = xform * glm::vec4( w / 2, h / 2, 0.0, 0.0 );
1518 glm::vec4 trans = xform[3];
1522 if( !glIsTexture( texture_id ) )
1525 glDepthFunc( GL_ALWAYS );
1527 glAlphaFunc( GL_GREATER, 0.01f );
1528 glEnable( GL_ALPHA_TEST );
1530 glMatrixMode( GL_TEXTURE );
1532 glTranslated( 0.5, 0.5, 0.5 );
1534 glTranslated( -0.5, -0.5, -0.5 );
1536 glMatrixMode( GL_MODELVIEW );
1538 glTranslated( trans.x, trans.y, trans.z );
1540 glEnable( GL_TEXTURE_2D );
1541 glActiveTexture( GL_TEXTURE0 );
1542 glBindTexture( GL_TEXTURE_2D, texture_id );
1544 float texStartX = aBitmap.
IsMirroredX() ? 1.0 : 0.0;
1545 float texEndX = aBitmap.
IsMirroredX() ? 0.0 : 1.0;
1546 float texStartY = aBitmap.
IsMirroredY() ? 1.0 : 0.0;
1547 float texEndY = aBitmap.
IsMirroredY() ? 0.0 : 1.0;
1549 glBegin( GL_QUADS );
1550 glColor4f( 1.0, 1.0, 1.0, alpha );
1551 glTexCoord2f( texStartX, texStartY );
1553 glColor4f( 1.0, 1.0, 1.0, alpha );
1554 glTexCoord2f( texEndX, texStartY);
1556 glColor4f( 1.0, 1.0, 1.0, alpha );
1557 glTexCoord2f( texEndX, texEndY);
1559 glColor4f( 1.0, 1.0, 1.0, alpha );
1560 glTexCoord2f( texStartX, texEndY);
1564 glBindTexture( GL_TEXTURE_2D, 0 );
1566#ifdef DISABLE_BITMAP_CACHE
1567 glDeleteTextures( 1, &texture_id );
1572 glMatrixMode( GL_TEXTURE );
1574 glMatrixMode( GL_MODELVIEW );
1576 glDisable( GL_ALPHA_TEST );
1578 glDepthFunc( GL_LESS );
1587 || aText.Contains( wxT(
"^{" ) )
1588 || aText.Contains( wxT(
"_{" ) )
1589 || aText.Contains( wxT(
"\n" ) ) )
1600 double overbarHeight = textSize.
y;
1631 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
1647 overbarHeight = -textSize.
y / 2.0;
1651 wxFAIL_MSG( wxT(
"Indeterminate state legal only in dialogs." ) );
1655 int overbarLength = 0;
1656 int overbarDepth = -1;
1657 int braceNesting = 0;
1659 auto iterateString =
1660 [&](
const std::function<void(
int aOverbarLength,
int aOverbarHeight )>& overbarFn,
1661 const std::function<int(
unsigned long aChar )>& bitmapCharFn )
1665 wxASSERT_MSG( *chIt !=
'\n' && *chIt !=
'\r',
1666 "No support for multiline bitmap text yet" );
1668 if( *chIt ==
'~' && overbarDepth == -1 )
1672 if( ++lookahead !=
end && *lookahead ==
'{' )
1675 overbarDepth = braceNesting;
1680 else if( *chIt ==
'{' )
1684 else if( *chIt ==
'}' )
1686 if( braceNesting > 0 )
1689 if( braceNesting == overbarDepth )
1691 overbarFn( overbarLength, overbarHeight );
1699 if( overbarDepth != -1 )
1700 overbarLength += bitmapCharFn( *chIt );
1702 bitmapCharFn( *chIt );
1709 int overbarsCount = 0;
1712 [&overbarsCount](
int aOverbarLength,
int aOverbarHeight )
1716 [&charsCount](
unsigned long aChar ) ->
int
1732 [&](
int aOverbarLength,
int aOverbarHeight )
1736 [&](
unsigned long aChar ) ->
int
1744 if( overbarDepth != -1 && overbarLength > 0 )
1759 float minorLineWidth = std::fmax( 1.0f,
1761 float majorLineWidth = minorLineWidth * 2.0f;
1805 glDisable( GL_DEPTH_TEST );
1806 glDisable( GL_TEXTURE_2D );
1810 glEnable( GL_STENCIL_TEST );
1811 glStencilFunc( GL_ALWAYS, 1, 1 );
1812 glStencilOp( GL_KEEP, GL_KEEP, GL_INCR );
1813 glColor4d( 0.0, 0.0, 0.0, 0.0 );
1825 for(
int j = gridStartY; j <= gridEndY; j++ )
1831 for(
int i = gridStartX; i <= gridEndX; i++ )
1834 SetLineWidth( ( ( tickX && tickY ) ? majorLineWidth : minorLineWidth ) );
1848 for(
int j = gridStartY; j <= gridEndY; j++ )
1867 glStencilFunc( GL_NOTEQUAL, 0, 1 );
1873 for(
int i = gridStartX; i <= gridEndX; i++ )
1890 glDisable( GL_STENCIL_TEST );
1893 glEnable( GL_DEPTH_TEST );
1894 glEnable( GL_TEXTURE_2D );
1907 wxGLCanvas::SetSize( aWidth, aHeight );
1913 bool s = wxGLCanvas::Show( aShow );
1916 wxGLCanvas::Raise();
1934 glClearColor( 0, 0, 0, 1 );
1935 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
1941 GLdouble matrixData[16] = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 };
1943 matrixData[0] = aTransformation.
m_data[0][0];
1944 matrixData[1] = aTransformation.
m_data[1][0];
1945 matrixData[2] = aTransformation.
m_data[2][0];
1946 matrixData[4] = aTransformation.
m_data[0][1];
1947 matrixData[5] = aTransformation.
m_data[1][1];
1948 matrixData[6] = aTransformation.
m_data[2][1];
1949 matrixData[12] = aTransformation.
m_data[0][2];
1950 matrixData[13] = aTransformation.
m_data[1][2];
1951 matrixData[14] = aTransformation.
m_data[2][2];
1953 glMultMatrixd( matrixData );
1991 std::shared_ptr<VERTEX_ITEM> newItem = std::make_shared<VERTEX_ITEM>( *
m_cachedManager );
1993 m_groups.insert( std::make_pair( groupNumber, newItem ) );
2136 glBlendEquation( GL_MAX );
2138 glBlendEquation( GL_FUNC_ADD );
2145 glBlendFunc( GL_SRC_ALPHA, GL_ONE );
2147 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
2160#if wxCHECK_VERSION( 3, 3, 0 )
2172#if wxCHECK_VERSION( 3, 3, 0 )
2191 const bool aReserve )
2209 * glm::vec4( aStartPoint.
x, aStartPoint.
y, 0.0, 0.0 );
2211 * glm::vec4( aEndPoint.
x, aEndPoint.
y, 0.0, 0.0 );
2295 double outerRadius = aRadius + (
m_lineWidth / 2 );
2341 GLdouble* point = aPoints;
2343 for(
int i = 0; i < aPointCount; ++i )
2361 return VECTOR2D( aPoints[idx * 3], aPoints[idx * 3 + 1] );
2371 wxCHECK( aPointCount > 0, );
2375 if( aPointCount == 1 )
2377 drawLineQuad( aPointGetter( 0 ), aPointGetter( 0 ), aReserve );
2386 for(
int i = 1; i < aPointCount; ++i )
2388 auto start = aPointGetter( i - 1 );
2389 auto end = aPointGetter( i );
2397 int aPointCount,
double aWidth,
bool aReserve )
2399 wxCHECK( aPointCount >= 2, );
2405 for(
int i = 1; i < aPointCount; ++i )
2407 auto start = aPointGetter( i - 1 );
2408 auto end = aPointGetter( i );
2410 float startx = start.x;
2411 float starty = start.y;
2420 if( startx == endx && starty == endy )
2432 vertices += 6 + 6 + 3 + 3;
2438 for(
int i = 1; i < aPointCount; ++i )
2440 auto start = aPointGetter( i - 1 );
2441 auto end = aPointGetter( i );
2460 double spaceWidth = g->
advance * 0.74;
2478 const float XOFF = glyph->
minx;
2481 const float round_adjust = ( glyph->
maxy - glyph->
miny )
2484 const float YOFF = round_adjust + top_adjust;
2533 const float H = glyph->
maxy - glyph->
miny;
2563 float commonOffset = std::numeric_limits<float>::max();
2565 int overbarDepth = -1;
2566 int braceNesting = 0;
2570 if( *chIt ==
'~' && overbarDepth == -1 )
2574 if( ++lookahead !=
end && *lookahead ==
'{' )
2577 overbarDepth = braceNesting;
2582 else if( *chIt ==
'{' )
2586 else if( *chIt ==
'}' )
2588 if( braceNesting > 0 )
2591 if( braceNesting == overbarDepth )
2601 || *chIt ==
'-' || *chIt ==
'_' )
2603 glyph = defaultGlyph;
2610 textSize.
y = std::max<float>( textSize.
y, charHeight );
2612 textSize.
y -= commonOffset;
2614 return std::make_pair( textSize, commonOffset );
2651 VECTOR2D cursorCenter = ( cursorBegin + cursorEnd ) / 2;
2655 glActiveTexture( GL_TEXTURE0 );
2656 glDisable( GL_TEXTURE_2D );
2657 glEnable( GL_BLEND );
2658 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
2663 glBegin( GL_LINES );
2664 glVertex2d( cursorCenter.
x, cursorBegin.
y );
2665 glVertex2d( cursorCenter.
x, cursorEnd.
y );
2667 glVertex2d( cursorBegin.
x, cursorCenter.
y );
2668 glVertex2d( cursorEnd.
x, cursorCenter.
y );
2675 wxASSERT_MSG(
m_groups.size() < std::numeric_limits<unsigned int>::max(),
2676 wxT(
"There are no free slots to store a group" ) );
2687#ifndef KICAD_USE_EGL
2688 wxASSERT( IsShownOnScreen() );
2691 wxASSERT_MSG(
m_isContextLocked,
"This should only be called from within a locked context." );
2695 throw std::runtime_error(
"Could not create the tesselator" );
2696 GLenum err = glewInit();
2700 for(
int i = 0; i < 10; i++ )
2702 if( GLEW_OK == err )
2705 std::this_thread::sleep_for( std::chrono::milliseconds( 250 ) );
2711 SetOpenGLInfo( (
const char*) glGetString( GL_VENDOR ), (
const char*) glGetString( GL_RENDERER ),
2712 (
const char*) glGetString( GL_VERSION ) );
2714 if( GLEW_OK != err )
2715 throw std::runtime_error( (
const char*) glewGetErrorString( err ) );
2718 if( !GLEW_VERSION_2_1 )
2719 throw std::runtime_error(
"OpenGL 2.1 or higher is required!" );
2721#if defined( __LINUX__ )
2723 if( GLEW_ARB_debug_output )
2729 if( !GLEW_EXT_framebuffer_object )
2730 throw std::runtime_error(
"Framebuffer objects are not supported!" );
2733 if( !GLEW_ARB_vertex_buffer_object )
2734 throw std::runtime_error(
"Vertex buffer objects are not supported!" );
2739 BUILTIN_SHADERS::glsl_kicad_vert ) )
2741 throw std::runtime_error(
"Cannot compile vertex shader!" );
2746 BUILTIN_SHADERS::glsl_kicad_frag ) )
2748 throw std::runtime_error(
"Cannot compile fragment shader!" );
2752 throw std::runtime_error(
"Cannot link the shaders!" );
2756 glGetIntegerv( GL_MAX_TEXTURE_SIZE, &maxTextureSize );
2762 throw std::runtime_error(
"Requested texture size is not supported" );
2785 GLdouble* vertex =
static_cast<GLdouble*
>( aVertexPtr );
2789 assert( vboManager );
2790 vboManager->
Vertex( vertex[0], vertex[1], vertex[2] );
2795 GLdouble** dataOut,
void* aData )
2797 GLdouble* vertex =
new GLdouble[3];
2803 param->
intersectPoints.emplace_back( vertex, std::default_delete<GLdouble[]>() );
2805 memcpy( vertex, coords, 3 *
sizeof( GLdouble ) );
2843 return ( ceil( f / r ) - 0.5 ) * r;
2876 outlineGlyph.Triangulate(
2891 if( aGlyphs.empty() )
2894 bool allGlyphsAreStroke =
true;
2895 bool allGlyphsAreOutline =
true;
2897 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aGlyphs )
2899 if( !glyph->IsStroke() )
2901 allGlyphsAreStroke =
false;
2906 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aGlyphs )
2908 if( !glyph->IsOutline() )
2910 allGlyphsAreOutline =
false;
2915 if( allGlyphsAreStroke )
2918 int lineQuadCount = 0;
2920 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aGlyphs )
2924 for(
const std::vector<VECTOR2D>& points : strokeGlyph )
2925 lineQuadCount += points.size() - 1;
2930 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aGlyphs )
2934 for(
const std::vector<VECTOR2D>& points : strokeGlyph )
2941 points.size(),
false );
2947 else if( allGlyphsAreOutline )
2950 int triangleCount = 0;
2952 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aGlyphs )
2956 for(
unsigned int i = 0; i < outlineGlyph.TriangulatedPolyCount(); i++ )
2959 outlineGlyph.TriangulatedPolygon( i );
2970 for(
const std::unique_ptr<KIFONT::GLYPH>& glyph : aGlyphs )
2974 for(
unsigned int i = 0; i < outlineGlyph.TriangulatedPolyCount(); i++ )
2977 outlineGlyph.TriangulatedPolygon( i );
2994 for(
size_t i = 0; i < aGlyphs.size(); i++ )
2995 DrawGlyph( *aGlyphs[i], i, aGlyphs.size() );
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
void SetOpenGLInfo(const char *aVendor, const char *aRenderer, const char *aVersion)
A setter for OpenGL info when it's initialized.
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
Bezier curves to polygon converter.
void GetPoly(std::vector< VECTOR2I > &aOutput, int aMaxError=10)
Convert a Bezier curve to a polygon.
This class handle bitmap images in KiCad.
const wxImage * GetOriginalImageData() const
VECTOR2I GetSizePixels() const
EDA_ANGLE Rotation() const
static const WX_CURSOR_TYPE GetCursor(KICURSOR aCursorType, bool aHiDPI=false)
Get a cursor bundle (wx 3.3+) or appropriate cursor (older versions)
void UnlockCtx(wxGLContext *aContext)
Allow other canvases to bind an OpenGL context.
void DestroyCtx(wxGLContext *aContext)
Destroy a managed OpenGL context.
void LockCtx(wxGLContext *aContext, wxGLCanvas *aCanvas)
Set a context as current and prevents other canvases from switching it.
wxGLContext * CreateCtx(wxGLCanvas *aCanvas, const wxGLContext *aOther=nullptr)
Create a managed OpenGL context.
static int SetSwapInterval(int aVal)
Attempt to set the OpenGL swap interval.
wxGLCanvas wrapper for HiDPI/Retina support.
virtual wxSize GetNativePixelSize() const
double GetScaleFactor() const
Get the current scale factor.
virtual bool IsStroke() const
virtual bool IsOutline() const
A color representation with 4 components: red, green, blue, alpha.
static const COLOR4D BLACK
GAL_ANTIALIASING_MODE antialiasing_mode
The grid style to draw the grid in.
Abstract interface for drawing on a 2D-surface.
bool IsTextMirrored() const
void SetGridColor(const COLOR4D &aGridColor)
Set the grid color.
virtual void SetLayerDepth(double aLayerDepth)
Set the depth of the layer (position on the z-axis)
bool IsCursorEnabled() const
Return information about cursor visibility.
MATRIX3x3D m_worldScreenMatrix
World transformation.
VECTOR2D GetVisibleGridSize() const
Return the visible grid size in x and y directions.
double m_layerDepth
The actual layer depth.
MATRIX3x3D m_screenWorldMatrix
Screen transformation.
friend class GAL_SCOPED_ATTRS
bool m_axesEnabled
Should the axes be drawn.
float m_gridLineWidth
Line width of the grid.
VECTOR2I m_screenSize
Screen size in screen (wx logical) coordinates.
GR_TEXT_H_ALIGN_T GetHorizontalJustify() const
void normalize(T &a, T &b)
Ensure that the first element is smaller than the second.
VECTOR2D m_depthRange
Range of the depth.
virtual void SetFillColor(const COLOR4D &aColor)
Set the fill color.
virtual bool SetNativeCursorStyle(KICURSOR aCursor, bool aHiDPI)
Set the cursor in the native panel.
GRID_STYLE m_gridStyle
Grid display style.
COLOR4D m_axesColor
Color of the axes.
const MATRIX3x3D & GetScreenWorldMatrix() const
Get the screen <-> world transformation matrix.
float m_lineWidth
The line width.
void computeWorldScale()
Compute the scaling factor for the world->screen matrix.
virtual void SetLineWidth(float aLineWidth)
Set the line width.
VECTOR2D m_gridSize
The grid size.
COLOR4D getCursorColor() const
Get the actual cursor color to draw.
COLOR4D m_fillColor
The fill color.
double m_worldUnitLength
The unit length of the world coordinates [inch].
virtual bool updatedGalDisplayOptions(const GAL_DISPLAY_OPTIONS &aOptions)
Handle updating display options.
void SetAxesColor(const COLOR4D &aAxesColor)
Set the axes color.
virtual void SetStrokeColor(const COLOR4D &aColor)
Set the stroke color.
VECTOR2D m_cursorPosition
Current cursor position (world coordinates)
const VECTOR2I & GetGlyphSize() const
int m_gridTick
Every tick line gets the double width.
double m_worldScale
The scale factor world->screen.
VECTOR2D m_gridOrigin
The grid origin.
KICURSOR m_currentNativeCursor
Current cursor.
bool m_globalFlipY
Flag for Y axis flipping.
bool m_fullscreenCursor
Shape of the cursor (fullscreen or small cross)
bool m_isFillEnabled
Is filling of graphic objects enabled ?
virtual void ComputeWorldScreenMatrix()
Compute the world <-> screen transformation matrix.
COLOR4D m_gridColor
Color of the grid.
COLOR4D m_strokeColor
The color of the outlines.
bool m_isStrokeEnabled
Are the outlines stroked ?
GAL_DISPLAY_OPTIONS & m_options
bool m_gridVisibility
Should the grid be shown.
virtual void BitmapText(const wxString &aText, const VECTOR2I &aPosition, const EDA_ANGLE &aAngle)
Draw a text using a bitmap font.
float GetLineWidth() const
Get the line width.
bool m_globalFlipX
Flag for X axis flipping.
GR_TEXT_V_ALIGN_T GetVerticalJustify() const
VECTOR2D m_lookAtPoint
Point to be looked at in world space.
GLuint cacheBitmap(const BITMAP_BASE *aBitmap)
const size_t m_cacheMaxElements
GLuint RequestBitmap(const BITMAP_BASE *aBitmap)
std::list< GLuint > m_freedTextureIds
const size_t m_cacheMaxSize
std::map< const KIID, CACHED_BITMAP > m_bitmaps
std::list< KIID > m_cacheLru
VECTOR2D GetAntialiasRenderingOffset() const
virtual void Begin() override
Call this at the beginning of each frame.
void SetAntialiasingMode(GAL_ANTIALIASING_MODE aMode)
static const unsigned int DIRECT_RENDERING
virtual unsigned int GetBuffer() const override
Return currently used buffer handle.
virtual void Present() override
Call this to present the output buffer to the screen.
GAL_ANTIALIASING_MODE GetAntialiasingMode() const
virtual void Initialize() override
Perform primary initialization, necessary to use the object.
virtual void ClearBuffer(const COLOR4D &aColor) override
Clear the selected buffer (set by the SetBuffer() function).
virtual void Resize(unsigned int aWidth, unsigned int aHeight) override
Clear the state of COMPOSITOR, so it has to be reinitialized again with the new dimensions.
virtual void DrawBuffer(unsigned int aBufferHandle) override
Draw the selected buffer to the output buffer.
int GetAntialiasSupersamplingFactor() const
virtual void SetBuffer(unsigned int aBufferHandle) override
Set the selected buffer as the rendering target.
virtual unsigned int CreateBuffer() override
Prepare a new buffer that may be used as a rendering target.
OpenGL implementation of the Graphics Abstraction Layer.
void Transform(const MATRIX3x3D &aTransformation) override
Transform the context.
void drawPolygon(GLdouble *aPoints, int aPointCount)
Draw a filled polygon.
void ChangeGroupDepth(int aGroupNumber, int aDepth) override
Change the depth (Z-axis position) of the group.
void skipMouseEvent(wxMouseEvent &aEvent)
Skip the mouse event to the parent.
void drawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth, bool aReserve=true)
Internal method for segment drawing.
unsigned int m_groupCounter
Counter used for generating keys for groups.
void EndDiffLayer() override
Ends rendering of a differential layer.
VERTEX_MANAGER * m_overlayManager
Container for storing overlaid VERTEX_ITEMs.
void Scale(const VECTOR2D &aScale) override
Scale the context.
bool m_isInitialized
Basic initialization flag, has to be done when the window is visible.
VERTEX_MANAGER * m_currentManager
Currently used VERTEX_MANAGER (for storing VERTEX_ITEMs).
void drawCircle(const VECTOR2D &aCenterPoint, double aRadius, bool aReserve=true)
Internal method for circle drawing.
std::deque< std::shared_ptr< GLdouble > > m_tessIntersects
void DrawCircle(const VECTOR2D &aCenterPoint, double aRadius) override
Draw a circle using world coordinates.
void LockContext(int aClientCookie) override
Use GAL_CONTEXT_LOCKER RAII object unless you know what you're doing.
WX_CURSOR_TYPE m_currentwxCursor
wx cursor showing the current native cursor.
unsigned int m_mainBuffer
Main rendering target.
std::unique_ptr< GL_BITMAP_CACHE > m_bitmapCache
std::pair< VECTOR2D, float > computeBitmapTextSize(const UTF8 &aText) const
Compute a size of text drawn using bitmap font with current text setting applied.
void SetTarget(RENDER_TARGET aTarget) override
Set the target for rendering.
void blitCursor()
Blit cursor into the current screen.
static wxString CheckFeatures(GAL_DISPLAY_OPTIONS &aOptions)
Checks OpenGL features.
void ClearTarget(RENDER_TARGET aTarget) override
Clear the target for rendering.
void drawBitmapOverbar(double aLength, double aHeight, bool aReserve=true)
Draw an overbar over the currently drawn text.
void EndGroup() override
End the group.
bool m_isBitmapFontInitialized
Is the shader set to use bitmap fonts?
void drawSegmentChain(const std::function< VECTOR2D(int)> &aPointGetter, int aPointCount, double aWidth, bool aReserve=true)
Generic way of drawing a chain of segments stored in different containers.
void DrawArcSegment(const VECTOR2D &aCenterPoint, double aRadius, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle, double aWidth, double aMaxError) override
Draw an arc segment.
void BitmapText(const wxString &aText, const VECTOR2I &aPosition, const EDA_ANGLE &aAngle) override
Draw a text using a bitmap font.
bool updatedGalDisplayOptions(const GAL_DISPLAY_OPTIONS &aOptions) override
Handle updating display options.
unsigned int m_overlayBuffer
Auxiliary rendering target (for menus etc.)
void PostPaint(wxPaintEvent &aEvent)
Post an event to #m_paint_listener.
OPENGL_COMPOSITOR * m_compositor
Handles multiple rendering targets.
VERTEX_MANAGER * m_cachedManager
Container for storing cached VERTEX_ITEMs.
void Translate(const VECTOR2D &aTranslation) override
Translate the context.
void DrawPolyline(const std::deque< VECTOR2D > &aPointList) override
Draw a polyline.
bool SetNativeCursorStyle(KICURSOR aCursor, bool aHiDPI) override
Set the cursor in the native panel.
void DrawCurve(const VECTOR2D &startPoint, const VECTOR2D &controlPointA, const VECTOR2D &controlPointB, const VECTOR2D &endPoint, double aFilterValue=0.0) override
Draw a cubic bezier spline.
void drawFilledSemiCircle(const VECTOR2D &aCenterPoint, double aRadius, double aAngle)
Draw a filled semicircle.
void onPaint(wxPaintEvent &aEvent)
This is the OnPaint event handler.
void DrawGroup(int aGroupNumber) override
Draw the stored group.
void Restore() override
Restore the context.
void DrawSegmentChain(const std::vector< VECTOR2D > &aPointList, double aWidth) override
Draw a chain of rounded segments.
void drawStrokedSemiCircle(const VECTOR2D &aCenterPoint, double aRadius, double aAngle, bool aReserve=true)
Draw a stroked semicircle.
unsigned int getNewGroupNumber()
Return a valid key that can be used as a new group number.
void Flush() override
Force all remaining objects to be drawn.
GLint ufm_antialiasingOffset
void DeleteGroup(int aGroupNumber) override
Delete the group from the memory.
bool IsVisible() const override
Return true if the GAL canvas is visible on the screen.
wxEvtHandler * m_mouseListener
int m_swapInterval
Used to store swap interval information.
void ClearCache() override
Delete all data created during caching of graphic items.
double getWorldPixelSize() const
void DrawSegment(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, double aWidth) override
Draw a rounded segment.
GROUPS_MAP m_groups
Stores information about VBO objects (groups)
void endUpdate() override
void ClearScreen() override
Clear the screen.
void ResizeScreen(int aWidth, int aHeight) override
Resizes the canvas.
void DrawPolygon(const std::deque< VECTOR2D > &aPointList) override
Draw a polygon.
void drawTriangulatedPolyset(const SHAPE_POLY_SET &aPoly, bool aStrokeTriangulation)
Draw a set of polygons with a cached triangulation.
void DrawCursor(const VECTOR2D &aCursorPosition) override
Draw the cursor.
void DrawRectangle(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint) override
Draw a rectangle.
VERTEX_MANAGER * m_nonCachedManager
Container for storing non-cached VERTEX_ITEMs.
int drawBitmapChar(unsigned long aChar, bool aReserve=true)
Draw a single character using bitmap font.
GLUtesselator * m_tesselator
wxEvtHandler * m_paintListener
void StartDiffLayer() override
Begins rendering of a differential layer.
bool m_isContextLocked
Used for assertion checking.
void Save() override
Save the context.
bool m_isFramebufferInitialized
Are the framebuffers initialized?
void ComputeWorldScreenMatrix() override
Compute the world <-> screen transformation matrix.
bool Show(bool aShow) override
Shows/hides the GAL canvas.
static GLuint g_fontTexture
Bitmap font texture handle (shared)
virtual bool HasTarget(RENDER_TARGET aTarget) override
Return true if the target exists.
void reserveLineQuads(const int aLineCount)
Reserve specified number of line quads.
void DrawLine(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint) override
Draw a line.
OPENGL_GAL(const KIGFX::VC_SETTINGS &aVcSettings, GAL_DISPLAY_OPTIONS &aDisplayOptions, wxWindow *aParent, wxEvtHandler *aMouseListener=nullptr, wxEvtHandler *aPaintListener=nullptr, const wxString &aName=wxT("GLCanvas"))
void beginUpdate() override
double calcAngleStep(double aRadius) const
Compute the angle step when drawing arcs/circles approximated with lines.
virtual void DrawGlyph(const KIFONT::GLYPH &aGlyph, int aNth, int aTotal) override
Draw a polygon representing a font glyph.
bool m_isGrouping
Was a group started?
void BeginDrawing() override
Start/end drawing functions, draw calls can be only made in between the calls to BeginDrawing()/EndDr...
GLint ufm_screenPixelSize
void Rotate(double aAngle) override
Rotate the context.
int BeginGroup() override
Begin a group.
GLint ufm_pixelSizeMultiplier
VECTOR2D getScreenPixelSize() const
void DrawBitmap(const BITMAP_BASE &aBitmap, double alphaBlend=1.0) override
Draw a bitmap image.
void drawPolyline(const std::function< VECTOR2D(int)> &aPointGetter, int aPointCount, bool aReserve=true)
Generic way of drawing a polyline stored in different containers.
RENDER_TARGET GetTarget() const override
Get the currently used target for rendering.
void skipGestureEvent(wxGestureEvent &aEvent)
Skip the gesture event to the parent.
void UnlockContext(int aClientCookie) override
void drawSemiCircle(const VECTOR2D &aCenterPoint, double aRadius, double aAngle)
Draw a semicircle.
void drawLineQuad(const VECTOR2D &aStartPoint, const VECTOR2D &aEndPoint, bool aReserve=true)
Draw a quad for the line.
VERTEX_MANAGER * m_tempManager
Container for storing temp (diff mode) VERTEX_ITEMs.
virtual void DrawGlyphs(const std::vector< std::unique_ptr< KIFONT::GLYPH > > &aGlyphs) override
Draw polygons representing font glyphs.
void onSetNativeCursor(wxSetCursorEvent &aEvent)
Give the correct cursor image when the native widget asks for it.
void EnableDepthTest(bool aEnabled=false) override
void EndDrawing() override
End the drawing, needs to be called for every new frame.
SHADER * m_shader
There is only one shader used for different objects.
void DrawArc(const VECTOR2D &aCenterPoint, double aRadius, const EDA_ANGLE &aStartAngle, const EDA_ANGLE &aAngle) override
Draw an arc.
void DrawPolylines(const std::vector< std::vector< VECTOR2D > > &aPointLists) override
Draw multiple polylines.
RENDER_TARGET m_currentTarget
Current rendering target.
wxGLContext * m_glPrivContext
Canvas-specific OpenGL context.
void ChangeGroupColor(int aGroupNumber, const COLOR4D &aNewColor) override
Change the color used to draw the group.
static bool m_isBitmapFontLoaded
Is the bitmap font texture loaded?
static wxGLContext * m_glMainContext
Parent OpenGL context.
unsigned int m_tempBuffer
Temporary rendering target (for diffing etc.)
void init()
Basic OpenGL initialization and feature checks.
static int m_instanceCounter
GL GAL instance counter.
Provide the access to the OpenGL shaders.
bool IsLinked() const
Return true if shaders are linked correctly.
void SetParameter(int aParameterNumber, float aValue) const
Set a parameter of the shader.
bool Link()
Link the shaders.
void Use()
Use the shader.
bool LoadShaderFromStrings(SHADER_TYPE aShaderType, Args &&... aArgs)
Add a shader and compile the shader sources.
int AddParameter(const std::string &aParameterName)
Add a parameter to the parameter queue.
void Deactivate()
Deactivate the shader and use the default OpenGL program.
Class to control vertex container and GPU with possibility of emulating old-style OpenGL 1....
void EndDrawing() const
Finish drawing operations.
bool Vertex(const VERTEX &aVertex)
Add a vertex with the given coordinates to the currently set item.
const glm::mat4 & GetTransformation() const
void Map()
Map vertex buffer.
void Clear() const
Remove all the stored vertices from the container.
void BeginDrawing() const
Prepare buffers and items to start drawing.
void ChangeItemColor(const VERTEX_ITEM &aItem, const COLOR4D &aColor) const
Change the color of all vertices owned by an item.
void Color(const COLOR4D &aColor)
Change currently used color that will be applied to newly added vertices.
bool Reserve(unsigned int aSize)
Allocate space for vertices, so it will be used with subsequent Vertex() calls.
void FinishItem() const
Clean after adding an item.
void ChangeItemDepth(const VERTEX_ITEM &aItem, GLfloat aDepth) const
Change the depth of all vertices owned by an item.
void Rotate(GLfloat aAngle, GLfloat aX, GLfloat aY, GLfloat aZ)
Multiply the current matrix by a rotation matrix, so the newly vertices will be rotated by the given ...
void EnableDepthTest(bool aEnabled)
Enable/disable Z buffer depth test.
void PopMatrix()
Pop the current transformation matrix stack.
void Shader(GLfloat aShaderType, GLfloat aParam1=0.0f, GLfloat aParam2=0.0f, GLfloat aParam3=0.0f)
Change currently used shader and its parameters that will be applied to newly added vertices.
void PushMatrix()
Push the current transformation matrix stack.
void Scale(GLfloat aX, GLfloat aY, GLfloat aZ)
Multiply the current matrix by a scaling matrix, so the newly vertices will be scaled by the given fa...
void Unmap()
Unmap vertex buffer.
void SetShader(SHADER &aShader) const
Set a shader program that is going to be used during rendering.
void Translate(GLfloat aX, GLfloat aY, GLfloat aZ)
Multiply the current matrix by a translation matrix, so newly vertices will be translated by the give...
void DrawItem(const VERTEX_ITEM &aItem) const
Draw an item to the buffer.
VECTOR2< T > GetScale() const
Get the scale components of the matrix.
GL_CONTEXT_MANAGER * GetGLContextManager()
A small class to help profiling.
void Stop()
Save the time when this function was called, and set the counter stane to stop.
void Start()
Start or restart the counter.
double msecs(bool aSinceLast=false)
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
bool IsClosed() const override
int PointCount() const
Return the number of points (vertices) in this line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
int SegmentCount() const
Return the number of segments in this line chain.
size_t GetTriangleCount() const
void GetTriangle(int index, VECTOR2I &a, VECTOR2I &b, VECTOR2I &c) const
Represent a set of closed polygons.
bool IsTriangulationUpToDate() const
POLYGON & Polygon(int aIndex)
Return the aIndex-th subpolygon in the set.
const TRIANGULATED_POLYGON * TriangulatedPolygon(int aIndex) const
unsigned int TriangulatedPolyCount() const
Return the number of triangulated polygons.
int OutlineCount() const
Return the number of outlines in the set.
const SHAPE_LINE_CHAIN & COutline(int aIndex) const
uni_iter is a non-mutating iterator that walks through unicode code points in the UTF8 encoded string...
An 8 bit string that is assuredly encoded in UTF8, and supplies special conversion support to and fro...
uni_iter uend() const
Return a uni_iter initialized to the end of "this" UTF8 byte sequence.
uni_iter ubegin() const
Returns a uni_iter initialized to the start of "this" UTF8 byte sequence.
T EuclideanNorm() const
Compute the Euclidean norm of the vector, which is defined as sqrt(x ** 2 + y ** 2).
static constexpr EDA_ANGLE FULL_CIRCLE
a few functions useful in geometry calculations.
int GetArcToSegmentCount(int aRadius, int aErrorMax, const EDA_ANGLE &aArcAngle)
const wxChar *const traceGalProfile
Flag to enable debug output of GAL performance profiling.
This file contains miscellaneous commonly used macros and functions.
FONT_IMAGE_TYPE font_image
const FONT_GLYPH_TYPE * LookupGlyph(unsigned int aCodepoint)
FONT_INFO_TYPE font_information
The Cairo implementation of the graphics abstraction layer.
@ SMALL_CROSS
Use small cross instead of dots for the grid.
@ DOTS
Use dots for the grid.
@ SHADER_TYPE_VERTEX
Vertex shader.
@ SHADER_TYPE_FRAGMENT
Fragment shader.
RENDER_TARGET
RENDER_TARGET: Possible rendering targets.
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
@ TARGET_TEMP
Temporary target for drawing in separate layer.
@ TARGET_CACHED
Main rendering target (cached)
@ TARGET_OVERLAY
Items that may change while the view stays the same (noncached)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
static void InitTesselatorCallbacks(GLUtesselator *aTesselator)
void CALLBACK CombineCallback(GLdouble coords[3], GLdouble *vertex_data[4], GLfloat weight[4], GLdouble **dataOut, void *aData)
void CALLBACK VertexCallback(GLvoid *aVertexPtr, void *aData)
void CALLBACK EdgeCallback(GLboolean aEdgeFlag)
static wxGLAttributes getGLAttribs()
void CALLBACK ErrorCallback(GLenum aErrorCode)
double round_to_half_pixel(double f, double r)
#define SEG_PER_CIRCLE_COUNT
#define CALLBACK
The default number of points for circle approximation.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
PGM_BASE & Pgm()
The global program "get" accessor.
std::vector< FAB_LAYER_COLOR > dummy
unsigned char pixels[1024 *1024 *3]
unsigned int smooth_pixels
VERTEX_MANAGER * vboManager
Manager used for storing new vertices.
std::deque< std::shared_ptr< GLdouble > > & intersectPoints
Intersect points, that have to be freed after tessellation.
Structure to keep VIEW_CONTROLS settings for easy store/restore operations.
@ GR_TEXT_H_ALIGN_INDETERMINATE
@ GR_TEXT_V_ALIGN_INDETERMINATE
wxLogTrace helper definitions.
#define KI_TRACE(aWhat,...)
void enableGlDebug(bool aEnable)
Enable or disable OpenGL driver messages output.
int checkGlError(const std::string &aInfo, const char *aFile, int aLine, bool aThrow)
Check if a recent OpenGL operation has failed.
VECTOR2< int32_t > VECTOR2I
VECTOR2< double > VECTOR2D
VECTOR2I ToVECTOR2I(const wxSize &aSize)