void VGContext::releasePaint(VGbitfield paintModes) { if(paintModes & VG_FILL_PATH) { //release previous paint Paint* prev = (Paint*)m_fillPaint; if(prev) { if(!prev->removeReference()) RI_DELETE(prev); } m_fillPaint = VG_INVALID_HANDLE; } if(paintModes & VG_STROKE_PATH) { //release previous paint Paint* prev = (Paint*)m_strokePaint; if(prev) { if(!prev->removeReference()) RI_DELETE(prev); } m_strokePaint = VG_INVALID_HANDLE; } }
VGContext::~VGContext() { releasePaint(VG_FILL_PATH | VG_STROKE_PATH); setDefaultDrawable(NULL); //destroy own images, paths and paints while(Image* i = m_imageManager->getFirstResource(this)) m_imageManager->removeResource(i); while(Path* p = m_pathManager->getFirstResource(this)) m_pathManager->removeResource(p); while(Paint* t = m_paintManager->getFirstResource(this)) m_paintManager->removeResource(t); while(Font* t = m_fontManager->getFirstResource(this)) m_fontManager->removeResource(t); while(Surface* t = m_maskLayerManager->getFirstResource(this)) m_maskLayerManager->removeResource(t); //decrease the reference count of resource managers if(!m_imageManager->removeReference()) RI_DELETE(m_imageManager); if(!m_pathManager->removeReference()) RI_DELETE(m_pathManager); if(!m_paintManager->removeReference()) RI_DELETE(m_paintManager); if(!m_fontManager->removeReference()) RI_DELETE(m_fontManager); if(!m_maskLayerManager->removeReference()) RI_DELETE(m_maskLayerManager); }
void Font::clearGlyph(Glyph* g) { RI_ASSERT(g); if(g->m_path != VG_INVALID_HANDLE) { Path* p = (Path*)g->m_path; if(!p->removeReference()) RI_DELETE(p); } if(g->m_image != VG_INVALID_HANDLE) { Image* p = (Image*)g->m_image; p->removeInUse(); if(!p->removeReference()) RI_DELETE(p); } Glyph a; *g = a; }
void VGContext::setDefaultDrawable(Drawable* drawable) { if(m_eglDrawable) { if(!m_eglDrawable->removeReference()) RI_DELETE(m_eglDrawable); } m_eglDrawable = drawable; if(m_eglDrawable) { m_eglDrawable->addReference(); } }
VGContext::VGContext(VGContext* shareContext) : // Mode settings m_matrixMode(VG_MATRIX_PATH_USER_TO_SURFACE), m_fillRule(VG_EVEN_ODD), m_imageQuality(VG_IMAGE_QUALITY_FASTER), m_renderingQuality(VG_RENDERING_QUALITY_BETTER), m_blendMode(VG_BLEND_SRC_OVER), m_imageMode(VG_DRAW_IMAGE_NORMAL), // Scissor rectangles m_scissor(), // Stroke parameters m_strokeLineWidth(1.0f), m_inputStrokeLineWidth(1.0f), m_strokeCapStyle(VG_CAP_BUTT), m_strokeJoinStyle(VG_JOIN_MITER), m_strokeMiterLimit(4.0f), m_inputStrokeMiterLimit(4.0f), m_strokeDashPattern(), m_inputStrokeDashPattern(), m_strokeDashPhase(0.0f), m_inputStrokeDashPhase(0.0f), m_strokeDashPhaseReset(VG_FALSE), // Edge fill color for vgConvolve and pattern paint m_tileFillColor(0,0,0,0, Color::sRGBA), m_inputTileFillColor(0,0,0,0, Color::sRGBA), // Color for vgClear m_clearColor(0,0,0,0, Color::sRGBA), m_inputClearColor(0,0,0,0, Color::sRGBA), m_glyphOrigin(0.0f, 0.0f), m_inputGlyphOrigin(0.0f, 0.0f), m_masking(VG_FALSE), m_scissoring(VG_FALSE), m_pixelLayout(VG_PIXEL_LAYOUT_UNKNOWN), m_filterFormatLinear(VG_FALSE), m_filterFormatPremultiplied(VG_FALSE), m_filterChannelMask(VG_RED|VG_GREEN|VG_BLUE|VG_ALPHA), // Matrices m_pathUserToSurface(), m_imageUserToSurface(), m_glyphUserToSurface(), m_fillPaintToUser(), m_strokePaintToUser(), m_fillPaint(VG_INVALID_HANDLE), m_strokePaint(VG_INVALID_HANDLE), m_colorTransform(VG_FALSE), m_colorTransformValues(), m_inputColorTransformValues(), m_error(VG_NO_ERROR), m_imageManager(NULL), m_pathManager(NULL), m_paintManager(NULL), m_fontManager(NULL), m_maskLayerManager(NULL), m_eglDrawable(NULL) { if(shareContext) { m_imageManager = shareContext->m_imageManager; m_pathManager = shareContext->m_pathManager; m_paintManager = shareContext->m_paintManager; m_fontManager = shareContext->m_fontManager; m_maskLayerManager = shareContext->m_maskLayerManager; } else { try { m_imageManager = RI_NEW(OpenVGRI::ResourceManager<Image>, ()); //throws bad_alloc m_pathManager = RI_NEW(OpenVGRI::ResourceManager<Path>, ()); //throws bad_alloc m_paintManager = RI_NEW(OpenVGRI::ResourceManager<Paint>, ()); //throws bad_alloc m_fontManager = RI_NEW(OpenVGRI::ResourceManager<Font>, ()); //throws bad_alloc m_maskLayerManager = RI_NEW(OpenVGRI::ResourceManager<Surface>, ()); //throws bad_alloc } catch(std::bad_alloc) { RI_DELETE(m_imageManager); RI_DELETE(m_pathManager); RI_DELETE(m_paintManager); RI_DELETE(m_fontManager); RI_DELETE(m_maskLayerManager); throw; } } RI_ASSERT(m_imageManager); RI_ASSERT(m_pathManager); RI_ASSERT(m_paintManager); RI_ASSERT(m_fontManager); RI_ASSERT(m_maskLayerManager); m_imageManager->addReference(); m_pathManager->addReference(); m_paintManager->addReference(); m_fontManager->addReference(); m_maskLayerManager->addReference(); m_inputColorTransformValues[0] = 1.0f; m_inputColorTransformValues[1] = 1.0f; m_inputColorTransformValues[2] = 1.0f; m_inputColorTransformValues[3] = 1.0f; m_inputColorTransformValues[4] = 0.0f; m_inputColorTransformValues[5] = 0.0f; m_inputColorTransformValues[6] = 0.0f; m_inputColorTransformValues[7] = 0.0f; m_colorTransformValues[0] = 1.0f; m_colorTransformValues[1] = 1.0f; m_colorTransformValues[2] = 1.0f; m_colorTransformValues[3] = 1.0f; m_colorTransformValues[4] = 0.0f; m_colorTransformValues[5] = 0.0f; m_colorTransformValues[6] = 0.0f; m_colorTransformValues[7] = 0.0f; }