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:
@@ -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.
|
||||
|
||||
@@ -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 )
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user