2009-12-22 02:22 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)

* harbour/contrib/hbcairo/core.c
    * used current GC API to store references between GC blocks
    ! fixed GC block storage
    * added additional protection against using released path in 
      cairo_path_iterator_*()

  * harbour/contrib/hbcairo/text.c
    ! fixed copy-paste typo in cairo_set_font_matrix()
This commit is contained in:
Mindaugas Kavaliauskas
2009-12-22 00:22:33 +00:00
parent caf196c431
commit 5ec03c4d97
3 changed files with 47 additions and 71 deletions

View File

@@ -17,6 +17,16 @@
past entries belonging to author(s): Viktor Szakats.
*/
2009-12-22 02:22 UTC+0200 Mindaugas Kavaliauskas (dbtopas/at/dbtopas.lt)
* harbour/contrib/hbcairo/core.c
* used current GC API to store references between GC blocks
! fixed GC block storage
* added additional protection against using released path in
cairo_path_iterator_*()
* harbour/contrib/hbcairo/text.c
! fixed copy-paste typo in cairo_set_font_matrix()
2009-12-22 00:15 UTC+0100 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbbtree/hb_btree.c
! Cleaned code to compile without warning on BCC.

View File

@@ -50,12 +50,6 @@
*
*/
#define HB_USE_ITEM
#ifndef HB_USE_ITEM
#define _HB_API_INTERNAL_
#endif
#include "hbcairo.h"
#include "hbapiitm.h"
#include "hbapierr.h"
@@ -271,11 +265,7 @@ HB_FUNC( CAIRO_PATH_DESTROY )
typedef struct
{
#ifdef HB_USE_ITEM
PHB_ITEM pPath;
#else
cairo_path_t * pPath;
#endif
cairo_path_t ** ppPath;
int iPos;
} HB_CAIRO_PATH_ITERATOR, * PHB_CAIRO_PATH_ITERATOR;
@@ -284,14 +274,10 @@ static HB_GARBAGE_FUNC( hb_cairo_path_iterator_destructor )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) Cargo;
if( pIterator->pPath )
if( pIterator->ppPath )
{
#ifdef HB_USE_ITEM
hb_itemRelease( pIterator->pPath );
#else
hb_gcRefFree( pIterator->pPath );
#endif
pIterator->pPath = NULL;
hb_gcRefFree( pIterator->ppPath );
pIterator->ppPath = NULL;
}
}
@@ -300,8 +286,8 @@ static HB_GARBAGE_FUNC( hb_cairo_path_iterator_mark )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) Cargo;
if( pIterator->pPath )
hb_gcMark( pIterator->pPath );
if( pIterator->ppPath )
hb_gcMark( pIterator->ppPath );
}
@@ -314,21 +300,18 @@ static const HB_GC_FUNCS s_gcIteratorFuncs =
HB_FUNC( CAIRO_PATH_ITERATOR_CREATE )
{
cairo_path_t * pPath = hb_cairo_path_param( 1 );
cairo_path_t ** ppPath = ( cairo_path_t ** ) hb_parptrGC( &s_gcPathFuncs, 1 );
if( pPath )
if( ppPath && *ppPath )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) hb_gcAllocate( sizeof( PHB_CAIRO_PATH_ITERATOR ), &s_gcIteratorFuncs );
#ifdef HB_USE_ITEM
pIterator->pPath = hb_itemNew( hb_param( 1, HB_IT_POINTER ) );
hb_gcUnlock( pIterator->pPath );
#else
pIterator->pPath = pPath;
hb_gcRefInc( pPath );
#endif
pIterator->ppPath = ppPath;
hb_gcRefInc( ppPath );
pIterator->iPos = -1;
hb_itemPutPtrGC( hb_stackReturnItem(), pIterator );
}
else
hb_errRT_BASE( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
@@ -336,14 +319,10 @@ HB_FUNC( CAIRO_PATH_ITERATOR_DESTROY )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) hb_parptrGC( &s_gcIteratorFuncs, 1 );
if( pIterator && pIterator->pPath )
if( pIterator && pIterator->ppPath )
{
#ifdef HB_USE_ITEM
hb_itemRelease( pIterator->pPath );
#else
hb_gcRefFree( pIterator->pPath );
#endif
pIterator->pPath = NULL;
hb_gcRefFree( pIterator->ppPath );
pIterator->ppPath = NULL;
}
else
hb_errRT_BASE( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
@@ -353,17 +332,10 @@ HB_FUNC( CAIRO_PATH_ITERATOR_DESTROY )
HB_FUNC( CAIRO_PATH_ITERATOR_NEXT )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) hb_parptrGC( &s_gcIteratorFuncs, 1 );
cairo_path_t * pPath;
if( pIterator )
if( pIterator && pIterator->ppPath && ( pPath = * ( pIterator->ppPath ) ) != NULL )
{
cairo_path_t * pPath;
#ifdef HB_USE_ITEM
pPath = ( cairo_path_t * ) hb_itemGetPtr( pIterator->pPath );
#else
pPath = pIterator->pPath;
#endif
/* Skip */
if( pIterator->iPos == -1 )
pIterator->iPos = 0;
@@ -384,17 +356,12 @@ HB_FUNC( CAIRO_PATH_ITERATOR_NEXT )
HB_FUNC( CAIRO_PATH_ITERATOR_GET_POINTS )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) hb_parptrGC( &s_gcIteratorFuncs, 1 );
cairo_path_t * pPath;
if( pIterator )
if( pIterator && pIterator->ppPath && ( pPath = * ( pIterator->ppPath ) ) != NULL )
{
cairo_path_t * pPath;
cairo_path_data_t * pData;
#ifdef HB_USE_ITEM
pPath = ( cairo_path_t * ) hb_itemGetPtr( pIterator->pPath );
#else
pPath = pIterator->pPath;
#endif
if( pIterator->iPos < pPath->num_data && pIterator->iPos != -1 )
{
PHB_ITEM pItem, pArray;
@@ -422,19 +389,13 @@ HB_FUNC( CAIRO_PATH_ITERATOR_SET_POINTS )
{
PHB_CAIRO_PATH_ITERATOR pIterator = ( PHB_CAIRO_PATH_ITERATOR ) hb_parptrGC( &s_gcIteratorFuncs, 1 );
PHB_ITEM pArray = hb_param( 2, HB_IT_ARRAY );
cairo_path_t * pPath;
if( pIterator && pArray )
if( pIterator && pIterator->ppPath && ( pPath = * ( pIterator->ppPath ) ) != NULL && pArray )
{
cairo_path_t * pPath;
cairo_path_data_t * pData;
ULONG ulLen;
#ifdef HB_USE_ITEM
pPath = ( cairo_path_t * ) hb_itemGetPtr( pIterator->pPath );
#else
pPath = pIterator->pPath;
#endif
ulLen = hb_arrayLen( pArray );
if( pIterator->iPos < pPath->num_data && pIterator->iPos != -1 &&
( ULONG ) pPath->data[ pIterator->iPos ].header.length == ulLen + 1 )

View File

@@ -53,6 +53,7 @@
#include "hbcairo.h"
#include "hbapistr.h"
#include "hbapierr.h"
HB_FUNC( CAIRO_FONT_EXTENTS )
@@ -111,17 +112,21 @@ HB_FUNC( CAIRO_SET_FONT_MATRIX )
cairo_t * pCairo = hb_cairo_param( 1 );
if( pCairo )
{
PHB_ITEM pItem = hb_stackReturnItem();
cairo_matrix_t m;
cairo_set_font_matrix( pCairo, &m );
hb_arrayNew( pItem, 6 );
hb_arraySetND( pItem, 1, m.xx );
hb_arraySetND( pItem, 2, m.yx );
hb_arraySetND( pItem, 3, m.xy );
hb_arraySetND( pItem, 4, m.yy );
hb_arraySetND( pItem, 5, m.x0 );
hb_arraySetND( pItem, 6, m.y0 );
PHB_ITEM pItem;
if( ( pItem = hb_param( 2, HB_IT_ARRAY ) ) != NULL && hb_arrayLen( pItem ) == 6 )
{
cairo_matrix_t m;
m.xx = hb_arrayGetND( pItem, 1 );
m.yx = hb_arrayGetND( pItem, 2 );
m.xy = hb_arrayGetND( pItem, 3 );
m.yy = hb_arrayGetND( pItem, 4 );
m.x0 = hb_arrayGetND( pItem, 5 );
m.y0 = hb_arrayGetND( pItem, 6 );
cairo_set_font_matrix( pCairo, &m );
}
else
hb_errRT_BASE( EG_ARG, 3012, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS );
}
}