BBC BASIC for Windows
« GDI+ DrawString Function »

Welcome Guest. Please Login or Register.
Apr 6th, 2018, 12:26am



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

If you require a dump of the post on your message board, please come to the support board and request it.


Thank you Conforums members.

BBC BASIC for Windows Resources
Online BBC BASIC for Windows documentation
BBC BASIC for Windows Beginners' Tutorial
BBC BASIC Home Page
BBC BASIC on Rosetta Code
BBC BASIC discussion group
BBC BASIC for Windows Programmers' Reference

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: GDI+ DrawString Function  (Read 1092 times)
VBI
Guest
xx GDI+ DrawString Function
« Thread started on: May 8th, 2014, 2:23pm »

I'm hoping somebody who knows a bit more about GDI+ than me (not hard) could take a look at the attached code and give a pointer to where I'm going wrong.

This is just a piece of testbed code to exercise the functions I need to use as part of a larger program that can render multiple images and text into a DIB that, ultimately, gets sent to a printer via a direct control DLL.

No problem rendering the images as required. The problem I'm having is that I cannot get the string rendering to work at all. The GdipDrawString function either returns 11 or 1, depending on how I play with the rcf{} parameters, and nothing is rendered to the DIB.

To experiment, I have also tried rendering a rectangle, GdipDrawRectanglel, and a filled rectangle, GdipFillRectangle, both of which complete without error but produce nothing in the DIB.

I'm sure I'm doing something fundamentally wrong here, but have gone around in fruitless circles trying to find what it may be. The code that is of primary focus (I think) is REM'd with "Start" and "End". The program will save a .bmp file of the DIB for diagnostic purposes.

Thanks,
Graham.


Code:
      HIMEM = (LOMEM+100000000) AND -4
      
      infile$="c:\windows\Soap Bubbles.bmp"
      
      pagewide%=1844 : pagehigh%=1240
      
      img1_x%=100  : img1_y%=100 : img1_w%=256 : img1_h%=256
      img2_x%=500  : img2_y%=350 : img2_w%=512 : img2_h%=512
      img3_x%=1200 : img3_y%=600 : img3_w%=512 : img3_h%=512
      
      REM Load DLL
      SYS "LoadLibrary", "GDIPLUS.DLL" TO gdip%
      IF gdip%=0 ERROR 100, "Couldn't load GDIPLUS.DLL"
      SYS "GetProcAddress", gdip%, "GdiplusStartup" TO `GdiplusStartup`
      SYS "GetProcAddress", gdip%, "GdipLoadImageFromFile" TO `GdipLoadImageFromFile`
      SYS "GetProcAddress", gdip%, "GdipDrawImageRectRectI" TO `GdipDrawImageRectRectI`
      SYS "GetProcAddress", gdip%, "GdipGetImageHeight" TO `GdipGetImageHeight`
      SYS "GetProcAddress", gdip%, "GdipGetImageWidth" TO `GdipGetImageWidth`
      SYS "GetProcAddress", gdip%, "GdipCreateFromHDC" TO `GdipCreateFromHDC`
      SYS "GetProcAddress", gdip%, "GdipSetSmoothingMode" TO `GdipSetSmoothingMode`
      SYS "GetProcAddress", gdip%, "GdipDeleteGraphics" TO `GdipDeleteGraphics`
      SYS "GetProcAddress", gdip%, "GdipDisposeImage" TO `GdipDisposeImage`
      SYS "GetProcAddress", gdip%, "GdiplusShutdown" TO `GdiplusShutdown`
      SYS "GetProcAddress", gdip%, "GdipImageRotateFlip" TO `GdipImageRotateFlip`
      SYS "GetProcAddress", gdip%, "GdipCloneImage" TO `GdipCloneImage`
      SYS "GetProcAddress", gdip%, "GdipCreateFontFamilyFromName" TO `GdipCreateFontFamilyFromName`
      SYS "GetProcAddress", gdip%, "GdipCreateFont" TO `GdipCreateFont`
      SYS "GetProcAddress", gdip%, "GdipCreateSolidFill" TO `GdipCreateSolidFill`
      SYS "GetProcAddress", gdip%, "GdipDrawString" TO `GdipDrawString`
      SYS "GetProcAddress", gdip%, "GdipCreatePen1" TO `GdipCreatePen1`
      SYS "GetProcAddress", gdip%, "GdipGetPenColor" TO `GdipGetPenColor`
      SYS "GetProcAddress", gdip%, "GdipDrawRectangleI" TO `GdipDrawRectangleI`
      SYS "GetProcAddress", gdip%, "GdipFillRectangle" TO `GdipFillRectangle`
      SYS "GetProcAddress", gdip%, "GdipDeleteFontFamily" TO `GdipDeleteFontFamily`
      SYS "GetProcAddress", gdip%, "GdipDeleteFont" TO `GdipDeleteFont`
      SYS "GetProcAddress", gdip%, "GdipDeleteBrush" TO `GdipDeleteBrush`
      SYS "GetProcAddress", gdip%, "GdipDeletePen" TO `GdipDeletePen`
      
      DIM tSI{GdiplusVersion%, DebugEventCallback%, \
      \       SuppressBackgroundThread%, SuppressExternalCodecs%}
      tSI.GdiplusVersion%=1
      SYS `GdiplusStartup`, ^lGDIP%, tSI{}, 0
      
      SYS "CreateCompatibleDC", 0 TO hdc%
      
      DIM bmi{biSize%, biWidth%, biHeight%, biPlanes{l&,h&}, biBitCount{l&,h&}, \
      \       biCompression%, biSizeImage%, biXPelsPerMeter%, biYPelsPerMeter%, \
      \       biClrUsed%, biClrImportant%}
      bmi.biSize%=DIM(bmi{})
      bmi.biWidth%=pagewide%
      bmi.biHeight%=pagehigh%
      bmi.biPlanes.l&=1
      bmi.biBitCount.l&=24
      
      SYS "CreateDIBSection", hdc%, bmi{}, 0, ^bits%, 0, 0 TO hdib%
      SYS "SelectObject", hdc%, hdib% TO old%
      SYS "PatBlt", hdc%, 0, 0, pagewide%, pagehigh%, &FF0062 : REM Paint White Bkgrnd
      SYS `GdipCreateFromHDC`, hdc%, ^gfx%
      SYS `GdipSetSmoothingMode`, gfx%, 2 : REM 2=High Quality
      
      DIM infileW% 2*LEN(infile$)+1
      SYS "MultiByteToWideChar", 0, 0, infile$, -1, infileW%, LEN(infile$)+1
      SYS `GdipLoadImageFromFile`, infileW%, ^image0%
      IF image0%=0 THEN
        SYS `GdiplusShutdown`, lGDIP%
        SYS "FreeLibrary", gdip%
      ENDIF
      
      SYS `GdipCloneImage`, image0%, ^image90%
      SYS `GdipImageRotateFlip`, image90%, 1 TO res% : REM 1=90CW No-Flip
      
      SYS `GdipGetImageWidth`, image0%, ^ix% : SYS `GdipGetImageHeight`, image0%, ^iy%
      SYS `GdipDrawImageRectRectI`, gfx%, image0%, img1_x%, img1_y%, img1_w%, img1_h%, 0, 0, ix%, iy%, 2, 0, 0, 0
      SYS `GdipDrawImageRectRectI`, gfx%, image0%, img2_x%, img2_y%, img2_w%, img2_h%, 0, 0, ix%, iy%, 2, 0, 0, 0
      
      SYS `GdipGetImageWidth`, image90%, ^ix% : SYS `GdipGetImageHeight`, image90%, ^iy%
      SYS `GdipDrawImageRectRectI`, gfx%, image90%, img3_x%, img3_y%, img3_w%, img3_h%, 0, 0, ix%, iy%, 2, 0, 0, 0
      
      REM *************
      REM *** Start ***
      REM *************
      ttf$="Arial"
      DIM ttf% 2*LEN(ttf$)+1
      SYS "MultiByteToWideChar", 0, 0, ttf$, -1, ttf%, LEN(ttf$)+1
      SYS `GdipCreateFontFamilyFromName`, ttf%, 0, ^hFontFamily% TO res%
      PRINT "CreateFontFamily Handle: ";hFontFamily%
      PRINT "CreateFontFamily Result: ";res%
      
      SYS `GdipCreateFont`, hFontFamily%, 24, 0, 0, ^hFont% TO res%
      PRINT "CreateFont Handle: ";hFont%
      PRINT "CreateFont Result: ";res%
      
      DIM ARGB% 3 : REM For Black Brush/Pen
      ARGB%?0=255
      ARGB%?1=0
      ARGB%?2=0
      ARGB%?3=0
      
      SYS `GdipCreateSolidFill`, ARGB%, ^hBrush% TO res%
      PRINT "CreateSolidFill (Brush) Handle: "hBrush%
      PRINT "CreateSolidFill (Brush) Result: ";res%
      
      SampleText$="Hello World!"
      DIM string% 2*LEN(SampleText$)+1
      SYS "MultiByteToWideChar", 0, 0, SampleText$, -1, string%, LEN(SampleText$)+1
      chars%=LEN(SampleText$)+1
      
      DIM rcf{x,y,w,h}
      rcf{}.x=10.0
      rcf{}.y=10.0
      rcf{}.w=100.0
      rcf{}.h=50.0
      
      SYS `GdipDrawString`, gfx%, string%, chars%, hFont%, rcf{}, 0, hBrush% TO res%
      IF res% <>0 res$="***FAILED***> " ELSE res$="***OK***>"
      PRINT "DrawString Result: "+res$;res%
      
      SYS `GdipCreatePen1`, ARGB%, 5, 2, ^hPen% TO res%
      PRINT "CreatePen Handle: ";hPen%
      PRINT "CreatePen Result: ";res%
      
      SYS `GdipGetPenColor`, hPen%, ^hCol% TO res%
      PRINT "GetPenColor (just to confirm): ";hCol%?0,;hCol%?1,;hCol%?2,;hCol%?3
      PRINT "GetPenColor Result: ";res%
      
      rect_x=0.5
      rect_y=0.5
      rect_w=100.0
      rect_h=50.0
      
      SYS `GdipDrawRectangleI`, gfx%, hPen%, rect_x, rect_y, rect_w, rect_h TO res%
      PRINT "DrawRectanglel Result: ";res%
      
      SYS `GdipFillRectangle`, gfx%, hBrush%, rect_x, rect_y, rect_w, rect_h TO res%
      PRINT "FillRectangle Result: ";res%
      REM *************
      REM ***  END  ***
      REM *************
      
      SYS "SelectObject", hdc%, old%
      SYS "DeleteDC", hdc%
      SYS `GdipDeleteGraphics`, gfx%
      SYS `GdipDisposeImage`, image0%
      SYS `GdipDisposeImage`, image90%
      SYS `GdipDeleteFontFamily`, hFontFamily%
      SYS `GdipDeleteFont`, hFont%
      SYS `GdipDeleteBrush`, hBrush%
      SYS `GdipDeletePen`, hPen%
      SYS `GdiplusShutdown`, lGDIP%
      SYS "FreeLibrary", gdip%
      
      outfile$=@dir$+"DIB_bits.raw"
      OSCLI "SAVE """+outfile$+""" "+STR$~bits%+" +"+STR$~((pagewide%*pagehigh%)*3)
      
      DIM hdr% 53
      hdr%?0=ASC"B"
      hdr%?1=ASC"M"
      hdr%!2=((pagewide%*pagehigh%)*3)+54
      hdr%!10=54
      hdr%!14=40
      hdr%!18=pagewide%
      hdr%!22=pagehigh%
      hdr%!26=&180001
      ch0=OPENOUT(@dir$+"DIB_bits.bmp")
      FOR p%=0 TO 53
        BPUT#ch0,hdr%?p%
      NEXT p%
      FOR p%=0 TO ((pagewide%*pagehigh%)*3)-1
        BPUT#ch0,bits%?p%
      NEXT p%
      CLOSE#ch0

 
User IP Logged

rtr
Guest
xx Re: GDI+ DrawString Function
« Reply #1 on: May 8th, 2014, 3:02pm »

on May 8th, 2014, 2:23pm, VBI wrote:
I'm sure I'm doing something fundamentally wrong here, but have gone around in fruitless circles trying to find what it may be.

This is not an answer to your question, but is there a specific reason why you are not using Hans's library GDIPlib_win.bbc which incorporates routines for outputting text, specifically PROC_g_p_text(), PROC_g_text() and PROC_g_text_fancy()?

Even if you prefer not to use that library, you could study its code and by comparing it with yours probably identify where the problem lies.

Hans's library can be found via the Libraries page on the Wiki.

Richard.
User IP Logged

VBI
Guest
xx Re: GDI+ DrawString Function
« Reply #2 on: May 8th, 2014, 3:40pm »

Doh! I'm sure I have that library downloaded already somewhere, but had forgotten it - I'll take a look.

I also think that the "FN_f4", to convert to 4 byte real format, contained within your own GDI library may also be pertinent here.

Thanks, Richard.

Graham.

User IP Logged

rtr
Guest
xx Re: GDI+ DrawString Function
« Reply #3 on: May 8th, 2014, 3:49pm »

on May 8th, 2014, 3:40pm, VBI wrote:
I also think that the "FN_f4", to convert to 4 byte real format, contained within your own GDI library may also be pertinent here.

Yes indeed. Glancing at your code the rectangle definition would need to be:

Code:
      DIM rcf{x%,y%,w%,h%}
      rcf.x% = FN_f4(10.0)
      rcf.y% = FN_f4(10.0)
      rcf.w% = FN_f4(100.0)
      rcf.h% = FN_f4(50.0) 

Richard.
User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls