Page 9 of 10

Re: HMG Graph based on Bos Taurus

Posted: Tue Dec 06, 2016 5:17 am
by Rathinagiri
That shows your kindness and pride towards your profession. Kudos.

Re: HMG Graph based on Bos Taurus

Posted: Tue Dec 06, 2016 6:23 am
by mol
I was so close ;)

HMG Graph based on Bos Taurus

Posted: Tue Dec 06, 2016 10:07 am
by Pablo César
srvet_claudio wrote:In this case it is not a joke and it has no double meaning the name, Bos Taurus is the scientific name of the cattle. :lol:
I see, Very extensive breeds types in cattle... sorry for my joking.

Your work is a true tribute to these noble animals that we enjoy so much of them...

Wikipedia (portuguese) says: Bos taurus

Re: HMG Graph based on Bos Taurus

Posted: Tue Dec 06, 2016 1:02 pm
by mol
Any news about what's the problem about bad working library?

Re: HMG Graph based on Bos Taurus

Posted: Wed Dec 07, 2016 5:21 am
by Rathinagiri
From my side, HMG.3.4.2 doesn't give this problem.

Marek can you confirm that HMG.3.4.2 is also giving problem?

This info will be useful in finding out the bug, I think.

Re: HMG Graph based on Bos Taurus

Posted: Wed Dec 07, 2016 6:47 am
by mol
I've tried with hmg342 sp4 and problem still exists.

Re: HMG Graph based on Bos Taurus

Posted: Wed Dec 07, 2016 12:05 pm
by Rathinagiri
I have spotted the problem with draw line.

This test code stops exactly at 9957 (for me) in HMG 3.4.3 and runs fully up to 10000 in HMG 3.4.2 (Marek, for me, 3.4.2 doesn't give problem!)

Code: Select all

#include <hmg.ch>

Function Main
   define window main at 0, 0 width 800 height 600 main
      define button start
         row 10
         col 10
         caption 'Start'
         action start_test()
      end button
      define label test
         row 10
         col 110
         value ''
      end label   
   end window
  Main.Center
  Main.Activate

Return

function start_test
   local j
   local hBitMap, hDC, BTStruct
   cfile :='image.bmp'
   hBitMap := BT_BitmapCreateNew ( 2000, 2000, { 255, 255, 255 } )
   hDC := BT_CreateDC( hBitMap, BT_HDC_BITMAP, @BTStruct )
   for j := 1 to 10000
      BT_DrawLine (hDC, 10, 10, 150, 150, { 0, 0, 0 }, { 0, 0, 0 }, 0.1 )
      main.test.value := str( j )
   next j    
   BT_DeleteDC( BTstruct )
   BT_BitmapSaveFile(hBitmap, cfile )
   BT_BitmapRelease( hBitmap )
return nil

Re: HMG Graph based on Bos Taurus

Posted: Wed Dec 07, 2016 12:15 pm
by Rathinagiri
Claudio,

c_Bos_Taurus.c file has undergone a change to BT_DRAW_HDC_POLY() from BT_DRAW_HDC_POLYLine (in Line 1053). I think the problem might be there. Can you check up please?

The above testing code will help you.

Re: HMG Graph based on Bos Taurus

Posted: Wed Dec 07, 2016 1:36 pm
by mol
I've tested function drawing graphs embedded in my app. I've observed thait if you prepare small standalone sample, problem occurs later, when it's calldd from huge app, it occurs after few calls.

What I need to change? Sources of Bos Taurus?

Re: HMG Graph based on Bos Taurus

Posted: Wed Dec 07, 2016 2:06 pm
by gfilatov
mol wrote:What I need to change? Sources of Bos Taurus?
Hi Marek,

Yes, it is. :cry:

For example, there is the missed cleaning of hBrush variable in the C-function BT_DRAW_HDC_POLY :o

This function should be fixed as below

Code: Select all

HB_FUNC( BT_DRAW_HDC_POLY )
{
   HDC hDC;
   HPEN hPen;
   HBRUSH hBrush;
   HPEN   OldPen;
   HBRUSH OldBrush;
   INT nCountX, nCountY;
   COLORREF ColorLine, ColorFill;
   INT nWidthLine, nLen;
   INT nPOLY, i;
   #ifndef __MINGW_H
      POINT aPoint [2048];
   #endif

   hDC        = (HDC)      HB_PARNL  (1);
   nCountX    = (INT)      hb_parinfa(2,0);
   nCountY    = (INT)      hb_parinfa(3,0);
   ColorLine  = (COLORREF) hb_parnl  (4);
   nWidthLine = (INT)      hb_parni  (5);
   ColorFill  = (COLORREF) hb_parnl  (6);
   nPOLY      = (INT)      hb_parni  (7);

   nLen = min( nCountX, nCountY );

   if ( nLen > 0 )
   {
      #ifdef __MINGW_H
         POINT aPoint[ nLen ];
      #endif
      for ( i=0; i < nLen; i++ )
      {  aPoint[ i ].x = hb_parvni ( 2, i + 1 );
         aPoint[ i ].y = hb_parvni ( 3, i + 1 );
      }
      SaveDC(hDC);
         hPen = CreatePen(PS_SOLID, nWidthLine, ColorLine);
         OldPen = ( HPEN ) SelectObject(hDC, hPen);
         hBrush = CreateSolidBrush( ColorFill );
         OldBrush = ( HBRUSH ) SelectObject(hDC, hBrush);

         switch( nPOLY )
         {
            case BT_DRAW_POLYLINE:
               Polyline( hDC, aPoint, nLen );
               break;
            case BT_DRAW_POLYGON:
               Polygon( hDC, aPoint, nLen );
               break;
            case BT_DRAW_POLYBEZIER:
               PolyBezier( hDC, aPoint, nLen );
               break;
         }

         SelectObject( hDC, OldBrush );
         DeleteObject(hBrush);
         SelectObject( hDC, OldPen );
         DeleteObject(hPen);   
      RestoreDC(hDC, -1);
      hb_retl( TRUE );
   }
   else
      hb_retl( FALSE );
}
Please take a look for the needed additional strings
SelectObject( hDC, OldBrush );
...
SelectObject( hDC, OldPen );
There are a similar bugs with the missed SelectObject calling in the others functions also. :?

Hope that helps :idea: