proper delayed release fix for 10.16
This commit is contained in:
@@ -504,6 +504,7 @@ protected:
|
|||||||
|
|
||||||
CGFunctionRef CreateGradientFunction(const wxGraphicsGradientStops& stops);
|
CGFunctionRef CreateGradientFunction(const wxGraphicsGradientStops& stops);
|
||||||
static void CalculateShadingValues (void *info, const CGFloat *in, CGFloat *out);
|
static void CalculateShadingValues (void *info, const CGFloat *in, CGFloat *out);
|
||||||
|
static void ReleaseComponents (void *info);
|
||||||
|
|
||||||
bool m_isShading;
|
bool m_isShading;
|
||||||
CGFunctionRef m_gradientFunction;
|
CGFunctionRef m_gradientFunction;
|
||||||
@@ -544,7 +545,7 @@ protected:
|
|||||||
GradientComponent *comps;
|
GradientComponent *comps;
|
||||||
};
|
};
|
||||||
|
|
||||||
GradientComponents m_gradientComponents;
|
GradientComponents* m_gradientComponents;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -564,6 +565,8 @@ wxMacCoreGraphicsPenBrushDataBase::~wxMacCoreGraphicsPenBrushDataBase()
|
|||||||
|
|
||||||
if ( m_shadingMatrix )
|
if ( m_shadingMatrix )
|
||||||
delete m_shadingMatrix;
|
delete m_shadingMatrix;
|
||||||
|
|
||||||
|
// an eventual existing m_gradientComponents will be deallocated via the CGFunction callback
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -573,6 +576,7 @@ wxMacCoreGraphicsPenBrushDataBase::Init()
|
|||||||
m_shading = NULL;
|
m_shading = NULL;
|
||||||
m_isShading = false;
|
m_isShading = false;
|
||||||
m_shadingMatrix = NULL;
|
m_shadingMatrix = NULL;
|
||||||
|
m_gradientComponents = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -616,6 +620,13 @@ wxMacCoreGraphicsPenBrushDataBase::CreateRadialGradientShading(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxMacCoreGraphicsPenBrushDataBase::ReleaseComponents(void *info)
|
||||||
|
{
|
||||||
|
const GradientComponents* stops = (GradientComponents*) info ;
|
||||||
|
if ( stops )
|
||||||
|
delete stops;
|
||||||
|
}
|
||||||
|
|
||||||
void wxMacCoreGraphicsPenBrushDataBase::CalculateShadingValues(void *info, const CGFloat *in, CGFloat *out)
|
void wxMacCoreGraphicsPenBrushDataBase::CalculateShadingValues(void *info, const CGFloat *in, CGFloat *out)
|
||||||
{
|
{
|
||||||
const GradientComponents& stops = *(GradientComponents*) info ;
|
const GradientComponents& stops = *(GradientComponents*) info ;
|
||||||
@@ -662,26 +673,27 @@ void wxMacCoreGraphicsPenBrushDataBase::CalculateShadingValues(void *info, const
|
|||||||
CGFunctionRef
|
CGFunctionRef
|
||||||
wxMacCoreGraphicsPenBrushDataBase::CreateGradientFunction(const wxGraphicsGradientStops& stops)
|
wxMacCoreGraphicsPenBrushDataBase::CreateGradientFunction(const wxGraphicsGradientStops& stops)
|
||||||
{
|
{
|
||||||
|
m_gradientComponents = new GradientComponents();
|
||||||
|
|
||||||
static const CGFunctionCallbacks callbacks = { 0, &CalculateShadingValues, NULL };
|
static const CGFunctionCallbacks callbacks = { 0, &CalculateShadingValues, &ReleaseComponents };
|
||||||
static const CGFloat input_value_range [2] = { 0, 1 };
|
static const CGFloat input_value_range [2] = { 0, 1 };
|
||||||
static const CGFloat output_value_ranges [8] = { 0, 1, 0, 1, 0, 1, 0, 1 };
|
static const CGFloat output_value_ranges [8] = { 0, 1, 0, 1, 0, 1, 0, 1 };
|
||||||
|
|
||||||
m_gradientComponents.Init(stops.GetCount());
|
m_gradientComponents->Init(stops.GetCount());
|
||||||
for ( unsigned i = 0; i < m_gradientComponents.count; i++ )
|
for ( unsigned i = 0; i < m_gradientComponents->count; i++ )
|
||||||
{
|
{
|
||||||
const wxGraphicsGradientStop stop = stops.Item(i);
|
const wxGraphicsGradientStop stop = stops.Item(i);
|
||||||
|
|
||||||
m_gradientComponents.comps[i].pos = stop.GetPosition();
|
m_gradientComponents->comps[i].pos = stop.GetPosition();
|
||||||
|
|
||||||
const wxColour col = stop.GetColour();
|
const wxColour col = stop.GetColour();
|
||||||
m_gradientComponents.comps[i].red = (CGFloat) (col.Red() / 255.0);
|
m_gradientComponents->comps[i].red = (CGFloat) (col.Red() / 255.0);
|
||||||
m_gradientComponents.comps[i].green = (CGFloat) (col.Green() / 255.0);
|
m_gradientComponents->comps[i].green = (CGFloat) (col.Green() / 255.0);
|
||||||
m_gradientComponents.comps[i].blue = (CGFloat) (col.Blue() / 255.0);
|
m_gradientComponents->comps[i].blue = (CGFloat) (col.Blue() / 255.0);
|
||||||
m_gradientComponents.comps[i].alpha = (CGFloat) (col.Alpha() / 255.0);
|
m_gradientComponents->comps[i].alpha = (CGFloat) (col.Alpha() / 255.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CGFunctionCreate ( &m_gradientComponents, 1,
|
return CGFunctionCreate ( m_gradientComponents, 1,
|
||||||
input_value_range,
|
input_value_range,
|
||||||
4,
|
4,
|
||||||
output_value_ranges,
|
output_value_ranges,
|
||||||
|
Reference in New Issue
Block a user