From c08aa80635c9e741b92c0cbe2c463ba4df571d27 Mon Sep 17 00:00:00 2001 From: Lorenzo Fiorini Date: Tue, 10 Apr 2007 09:43:16 +0000 Subject: [PATCH] *** empty log message *** --- harbour/contrib/gd/tests/animgif.prg | 95 +++++ harbour/contrib/gd/tests/antialiased.prg | 99 +++++ harbour/contrib/gd/tests/barms.prg | 90 +++++ harbour/contrib/gd/tests/bartest.prg | 87 +++++ harbour/contrib/gd/tests/counter.prg | 141 +++++++ harbour/contrib/gd/tests/gdtest.prg | 122 +++++++ harbour/contrib/gd/tests/gdtestcls.prg | 334 +++++++++++++++++ .../contrib/gd/tests/images_in/conv_test.jpeg | Bin 0 -> 2317 bytes harbour/contrib/gd/tests/images_in/empty.jpeg | 0 .../contrib/gd/tests/images_in/gdlogobig.png | Bin 0 -> 7827 bytes .../contrib/gd/tests/images_in/theclipper.gif | Bin 0 -> 6200 bytes harbour/contrib/gd/tests/images_out/EMPTY | 0 harbour/contrib/gd/tests/test_out.prg | 345 ++++++++++++++++++ harbour/contrib/gd/tests/testdpi.prg | 39 ++ harbour/contrib/gd/tests/tostring.prg | 48 +++ 15 files changed, 1400 insertions(+) create mode 100644 harbour/contrib/gd/tests/animgif.prg create mode 100644 harbour/contrib/gd/tests/antialiased.prg create mode 100644 harbour/contrib/gd/tests/barms.prg create mode 100644 harbour/contrib/gd/tests/bartest.prg create mode 100644 harbour/contrib/gd/tests/counter.prg create mode 100644 harbour/contrib/gd/tests/gdtest.prg create mode 100644 harbour/contrib/gd/tests/gdtestcls.prg create mode 100644 harbour/contrib/gd/tests/images_in/conv_test.jpeg create mode 100644 harbour/contrib/gd/tests/images_in/empty.jpeg create mode 100644 harbour/contrib/gd/tests/images_in/gdlogobig.png create mode 100644 harbour/contrib/gd/tests/images_in/theclipper.gif create mode 100644 harbour/contrib/gd/tests/images_out/EMPTY create mode 100644 harbour/contrib/gd/tests/test_out.prg create mode 100644 harbour/contrib/gd/tests/testdpi.prg create mode 100644 harbour/contrib/gd/tests/tostring.prg diff --git a/harbour/contrib/gd/tests/animgif.prg b/harbour/contrib/gd/tests/animgif.prg new file mode 100644 index 0000000000..8fc7a72b5a --- /dev/null +++ b/harbour/contrib/gd/tests/animgif.prg @@ -0,0 +1,95 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * GD API anim gif test file - from GD official documantation, adapted to porting + * + * This test shows how handle either file handle than file name + */ + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "images_in/" +#define IMAGES_OUT "images_out/" + +PROCEDURE Main() + + LOCAL im, im2, im3 + LOCAL black, white, trans + LOCAL hFile + + // Check output directory + IF !ISDirectory( IMAGES_OUT ) + DirMake( IMAGES_OUT ) + ENDIF + + /* Create the image */ + im = gdImageCreate(100, 100) + + /* Allocate background */ + white = gdImageColorAllocate(im, 255, 255, 255) + + /* Allocate drawing color */ + black = gdImageColorAllocate(im, 0, 0, 0) + + /* Allocate transparent color for animation compression */ + trans = gdImageColorAllocate(im, 1, 1, 1) + + /* Draw rectangle */ + gdImageRectangle(im, 0, 0, 10, 10, black) + + /* Open output file in binary mode */ + hFile := FCreate( IMAGES_OUT + "anim1.gif" ) + /* Write GIF header. Use global color map. Loop a few times */ + gdImageGifAnimBegin(im, hFile, 1, 3) + gdImageGifAnimBegin(im, IMAGES_OUT + "anim2.gif", 1, 3) + /* Write the first frame. No local color map. Delay = 1s */ + gdImageGifAnimAdd(im, hFile, 0, 0, 0, 100, 1, NIL) + gdImageGifAnimAdd(im, IMAGES_OUT + "anim2.gif", 0, 0, 0, 100, 1, NIL) + /* construct the second frame */ + im2 = gdImageCreate(100, 100) + /* Allocate background to make it white */ + gdImageColorAllocate(im2, 255, 255, 255) + /* Make sure the palette is identical */ + gdImagePaletteCopy (im2, im) + /* Draw something */ + gdImageRectangle(im2, 0, 0, 15, 15, black) + /* Allow animation compression with transparent pixels */ + gdImageColorTransparent (im2, trans) + /* Add the second frame */ + gdImageGifAnimAdd(im2, hFile, 0, 0, 0, 100, 1, im) + gdImageGifAnimAdd(im2, IMAGES_OUT + "anim2.gif", 0, 0, 0, 100, 1, im) + /* construct the second frame */ + im3 = gdImageCreate(100, 100) + /* Allocate background to make it white */ + gdImageColorAllocate(im3, 255, 255, 255) + /* Make sure the palette is identical */ + gdImagePaletteCopy (im3, im) + /* Draw something */ + gdImageRectangle(im3, 0, 0, 15, 20, black) + /* Allow animation compression with transparent pixels */ + gdImageColorTransparent (im3, trans) + /* Add the third frame, compressing against the second one */ + gdImageGifAnimAdd(im3, hFile, 0, 0, 0, 100, 1, im2) + gdImageGifAnimAdd(im3, IMAGES_OUT + "anim2.gif", 0, 0, 0, 100, 1, im2) + /* Write the end marker */ + /* gdImageGifAnimEnd(out); is the same as the following: */ + //putc (';', out); + gdImageGifAnimEnd( hFile ) + gdImageGifAnimEnd( IMAGES_OUT + "anim2.gif" ) + /* Close file */ + FClose( hFile ) + /* Destroy images */ + gdImageDestroy(im) + gdImageDestroy(im2) + gdImageDestroy(im3) + + ? + ? "Look at " + IMAGES_OUT + " folder for output images" + ? + +RETURN diff --git a/harbour/contrib/gd/tests/antialiased.prg b/harbour/contrib/gd/tests/antialiased.prg new file mode 100644 index 0000000000..ec03336d38 --- /dev/null +++ b/harbour/contrib/gd/tests/antialiased.prg @@ -0,0 +1,99 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * GD API test file + */ + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "images_in/" +#define IMAGES_OUT "images_out/" + +PROCEDURE Main() + + LOCAL im + LOCAL white, blue, black + + // Check output directory + IF !ISDirectory( IMAGES_OUT ) + DirMake( IMAGES_OUT ) + ENDIF + + /* + This sample shows differences on use of antiliased command between a + palette based image and a true color image. + Normally antialias works better with a true color image. + + From GD official documentation: + + Antialiased lines can be drawn on both truecolor and palette-based images. + However, attempts to draw antialiased lines on highly complex palette-based backgrounds + may not give satisfactory results, due to the limited number of colors available in the + palette. Antialiased line-drawing on simple backgrounds should work well with palette-based + images; otherwise create or fetch a truecolor image instead. + + */ + + /* ***** DRAW A LINE IN A PALETTE BASED IMAGE ***** */ + + /* First we create a true color image */ + im := gdImageCreatePalette(100, 100) // alias of gdImageCreate() + + /* First allocate color is Background color */ + black := gdImageColorAllocate(im, 0, 0, 0) + + /* set foreground color */ + blue := gdImageColorAllocate(im, 0, 0, 255) + + /* Now we draw an aliased line */ + gdImageLine(im, 0, 0, 99, 40, blue) + + /* Then we set anti-alias color */ + gdImageSetAntiAliased(im, blue) + + /* and re-draw the line in antialiased mode */ + gdImageLine(im, 0, 40, 99, 80, gdAntiAliased) + + /* saving the image */ + gdImageJpeg(im, IMAGES_OUT + "antialiasedpal.jpg") + + /* Destroy it */ + gdImageDestroy(im) + + /* ***** DRAW A LINE IN A TRUE COLOR IMAGE ***** */ + + /* First we create a true color image */ + im := gdImageCreateTrueColor(100, 100) + + /* Background color (true color comes with black background, we have to fill it) */ + white := gdTrueColor( 255, 255, 255 ) + gdImageFilledRectangle(im, 0, 0, 100, 100, white) + + /* set foreground color */ + blue := gdImageColorAllocate(im, 0, 0, 255) + + /* Now we draw an aliased line */ + gdImageLine(im, 0, 0, 99, 40, blue) + + /* Then we set anti-alias color */ + gdImageSetAntiAliased(im, blue) + + /* and re-draw the line in antialiased mode */ + gdImageLine(im, 0, 40, 99, 80, gdAntiAliased) + + /* saving the image */ + gdImageJpeg(im, IMAGES_OUT + "antialiasedtrue.jpg") + + /* Destroy it */ + gdImageDestroy(im) + + ? + ? "Look at " + IMAGES_OUT + " folder for output images" + ? + +RETURN diff --git a/harbour/contrib/gd/tests/barms.prg b/harbour/contrib/gd/tests/barms.prg new file mode 100644 index 0000000000..63b8a03b9f --- /dev/null +++ b/harbour/contrib/gd/tests/barms.prg @@ -0,0 +1,90 @@ +Function Main() + + local bar + + // // Creating some Color (arguments are R, G, B) + local black := {0,0,0} + local white := {255,255,255} + + local blue := {0,0,255} + local yellon := {255,255,128} + + local red := {255,0,0} + + local ccode13 := "P48WBQ7BX3M73X8V3WRT7F9JW" + local ccode8 := "P48WBQ7BX3M73X8V3WRT7F9JW" + local ccode128 := "P48WBQ7BX3M73X8V3WRT7F9JW" + + local nlower := 1 , nhight := 50 + + /* here is the list of arguments + 1- Barcode Type 13,8 and 128 + */ + + bar := TCode():New(13) + + /* Here is the list of the arguments + 1 - Thickness + 2 - Color of bars + 3 - Color of spaces + 4 - Resolution + 5 - Text Font (0-5) + */ + bar:Configure( 70 , black, white, 2, 1 ) + + /* Here is the list of the arguments + 1 - Width + 2 - Height + 3 - Filename (empty : display on screen) + 4 - Background color */ + bar:CreateBar( 205, 105,,white) + + // 1 - code bar + bar:Draw13(ccode13) + + // Build image + bar:Finish(2) + + // EAN8 + bar:= TCode():New(8) + + bar:Configure( 70 , black, white, 2 , 1 ) + + bar:CreateBar( 154, 100,,white) + + bar:Draw8(ccode8) + + bar:Finish(8) + + bar:ResizeImage() + + // EAN128 + bar:= TCode():New(128) + + bar:Configure( 50 , black, white, 2 , 1 ) + + // output image + bar:out_img := "image/" + + bar:CreateBar( 559, 88,"Bar128",white) + + // 1- code bar + // 2- barcode types A/B/C + // A- Alphanumeric characters uppercase + // B- Alphanumeric characters upper and lowercase + // C- Numeric pairs of integer + bar:Draw128(cCode128,"A") + + bar:Finish(8) + + // BRAZIL-FEBRABAN + bar:= TCode():New(25) + + bar:Configure( 25 , black, white, 1 , 1, , .T. ) + + // output image + bar:out_img := "febraban/" + bar:CreateBar( 560 ,60, "febraban", white ) + bar:DrawI25("P48WBQ7BX3M73X8V3WRT7F9JW") + bar:Finish(8) +RETURN NIL diff --git a/harbour/contrib/gd/tests/bartest.prg b/harbour/contrib/gd/tests/bartest.prg new file mode 100644 index 0000000000..c1a57812c9 --- /dev/null +++ b/harbour/contrib/gd/tests/bartest.prg @@ -0,0 +1,87 @@ +Function Main() + + local bar + + // // Creating some Color (arguments are R, G, B) + local black := {0,0,0} + local white := {255,255,255} + + local blue := {0,0,255} + local yellon := {255,255,128} + + local red := {255,0,0} + + local ccode13 := "789136043666" + local ccode8 := "0421000" +// local ccode128 := "00011005100000000" + local ccode128 := "Code 128" + + local nlower := 1 , nhight := 50 + + /* here is the list of arguments + 1- Barcode Type 13,8 and 128 + */ + + bar := TCode():New(13) + + /* Here is the list of the arguments + 1 - Thickness + 2 - Color of bars + 3 - Color of spaces + 4 - Resolution + 5 - Text Font (0-5) + */ + bar:Configure( 70 , black, white, 2, 1 ) + + /* Here is the list of the arguments + 1 - Width + 2 - Height + 3 - Filename (empty : display on screen) + 4 - Background color */ + bar:CreateBar( 205, 105,,white) + + // 1 - code bar + bar:Draw13(ccode13) + + // Build image + bar:Finish(2) + + // EAN8 + bar:= TCode():New(8) + + bar:Configure( 70 , black, white, 2 , 1 ) + + bar:CreateBar( 154, 100,,white) + + bar:Draw8(ccode8) + + bar:Finish(8) + + bar:ResizeImage() + + // EAN128 + bar:= TCode():New(128) + + bar:Configure( 50 , black, white, 2 , 1 ) + + bar:CreateBar( 300, 400,"Bar128",white) + + // 1- code bar + // 2- barcode types A/B/C + // A- Alphanumeric characters uppercase + // B- Alphanumeric characters upper and lowercase + // C- Numeric pairs of integer + bar:Draw128(cCode128,"B") + + bar:Finish(2) + + // BRAZIL-FEBRABAN + bar:= TCode():New(25) + + bar:Configure( 25 , black, white, 1 , 1, , .T. ) + + bar:CreateBar( 560 ,60, "febraban", white ) + bar:DrawI25("104995628545723070285700000008218000") + bar:Finish(8) + +RETURN NIL diff --git a/harbour/contrib/gd/tests/counter.prg b/harbour/contrib/gd/tests/counter.prg new file mode 100644 index 0000000000..4145fb71f9 --- /dev/null +++ b/harbour/contrib/gd/tests/counter.prg @@ -0,0 +1,141 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * Counter sample + * usage: + * counter + * i.e.: counter 34524 + */ + + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "digits/" +#define IMAGES_OUT "images_out/" + +#define DISPLAY_NUM 10 + +PROCEDURE Main( cValue, cBaseImage ) + + LOCAL oI, oIDigits, nWidth, nHeight, nDigits, nNumWidth, oTemp + //LOCAL black, white, blue, red, green, cyan, gray + LOCAL white + LOCAL aNumberImages := {} + LOCAL n, nValue + + // A value if not passed + DEFAULT cValue TO Str( hb_RandomInt( 1, 10^DISPLAY_NUM ), DISPLAY_NUM ) + DEFAULT cBaseImage TO "57chevy.gif" + + IF !File( IMAGES_IN + cBaseImage ) + ? "ERROR: Base Image File '" + IMAGES_IN + cBaseImage + "' not found" + QUIT + ENDIF + + nValue := Val( cValue ) + + // Fix num lenght + IF nValue > 10^DISPLAY_NUM + nValue := 10^DISPLAY_NUM + ENDIF + + cValue := StrZero( nValue, DISPLAY_NUM ) + + Tracelog( "Value", cValue ) + + // To set fonts run this command: + // for windows: SET GDFONTPATH=c:\windows\fonts + // per linux : export GDFONTPATH=/usr/share/fonts/default/TrueType + + // SET GDFONTPATH=c:\windows\fonts + //IF GetEnv( "GDFONTPATH" ) == "" + // ? "Please set GDFONTPATH" + // ? "On Windows: SET GDFONTPATH=c:\windows\fonts" + // ? "On Linux : export GDFONTPATH=/usr/share/fonts/default/TrueType" + // ? + //ENDIF + + // Check output directory + IF !ISDirectory( IMAGES_OUT ) + DirMake( IMAGES_OUT ) + ENDIF + + /* Load a digits image in memory from file */ + oIDigits := GDImage():LoadFromGif( IMAGES_IN + cBaseImage ) + + /* Get single number images */ + + // Get dimensions + nWidth := oIDigits:Width() + nHeight := oIDigits:Height() + + // Check base digits image + DO CASE + CASE nWidth % 10 == 0 // 0..9 digits + nDigits := 10 + CASE nWidth % 11 == 0 // 0..9 : + nDigits := 11 + CASE nWidth % 13 == 0 // 0..9 : am pm + nDigits := 13 + OTHERWISE + ? "Error on digits image" + ENDCASE + nNumWidth := nWidth / nDigits + + Tracelog( "nNumWidth, nWidth, nHeight, nDigits", nNumWidth, nWidth, nHeight, nDigits ) + + /* extracts single digits */ + FOR n := 1 TO nDigits + oTemp := oIDigits:Copy( (n - 1) * nNumWidth, 0, nNumWidth, nHeight ) + oTemp:SaveGif( IMAGES_OUT + StrZero( n-1, 2 ) + ".gif" ) + // Here I have to clone the image, otherwise on var destruction I loose + // the image in memory + aAdd( aNumberImages, oTemp:Clone() ) + NEXT + + /* Create counter image in memory */ + oI := GDImage( nNumWidth * DISPLAY_NUM, nHeight ) // the counter + Tracelog( "Image dimensions: ", oI:Width(), oI:Height() ) + + /* Allocate background */ + white := oI:SetColor( 255, 255, 255 ) + + /* Allocate drawing color */ + //black := oI:SetColor( 0, 0, 0 ) + //blue := oI:SetColor( 0, 0, 255 ) + //red := oI:SetColor( 255, 0, 0 ) + //green := oI:SetColor( 0, 255, 0 ) + //cyan := oI:SetColor( 0, 255, 255 ) + + /* Draw rectangle */ + //oI:Rectangle( 0, 0, 200, 30, , blue ) + + /* Draw Digits */ + FOR n := 1 TO Len( cValue ) + // Retrieve the number from array in memory + oTemp := aNumberImages[ Val( cValue[ n ] ) + 1 ]:Clone() + // Save it to show the number for a position + oTemp:SaveGif( IMAGES_OUT + "Pos_" + StrZero( n, 2 ) + ".gif" ) + // Set the digit as tile that I have to use to fill position in counter + oI:SetTile( oTemp ) + // Fill the position with the image digit + oI:Rectangle( (n - 1) * nNumWidth, 0, (n - 1) * nNumWidth + nNumWidth, nHeight, TRUE, gdTiled ) + NEXT + + /* Write Final Counter Image */ + oI:SaveGif( IMAGES_OUT + "counter.gif" ) + + /* Destroy images in memory */ + // Class does it automatically + + ? + ? "Look at " + IMAGES_OUT + " folder for output images" + ? + +RETURN + diff --git a/harbour/contrib/gd/tests/gdtest.prg b/harbour/contrib/gd/tests/gdtest.prg new file mode 100644 index 0000000000..c3283a4c52 --- /dev/null +++ b/harbour/contrib/gd/tests/gdtest.prg @@ -0,0 +1,122 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * GD API test file + */ + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "images_in/" +#define IMAGES_OUT "images_out/" + +PROCEDURE Main() + + LOCAL im, im2 + LOCAL black, white, blue, red, green, cyan + LOCAL aClip, color, font, aRect + + // SET GDFONTPATH=c:\windows\fonts + IF GetEnv( "GDFONTPATH" ) == "" + ? "Please set GDFONTPATH" + ? "On Windows: SET GDFONTPATH=c:\windows\fonts" + ? "On Linux : export GDFONTPATH=/usr/share/fonts/default/TrueType" + ? + ENDIF +/* + // Check output directory + IF !ISDirectory( IMAGES_OUT ) + DirMake( IMAGES_OUT ) + ENDIF +*/ + + ? gdVersion() + + /* Create an image in memory */ + im = gdImageCreate(200, 200) + + /* Load an image in memory from file */ + im2 = gdImageCreateFromJpeg( IMAGES_IN + "conv_test.jpeg") + + /* Now work on first empty image */ + + /* Allocate background */ + white = gdImageColorAllocate(im, 255, 255, 255) + + /* Allocate drawing color */ + black = gdImageColorAllocate(im, 0, 0, 0) + blue = gdImageColorAllocate(im, 0, 0, 255) + red = gdImageColorAllocate(im, 255, 0, 0) + green = gdImageColorAllocate(im, 0, 255, 0) + cyan = gdImageColorAllocate(im, 0, 255, 255) + + /* Draw rectangle */ + gdImageFilledRectangle(im, 0, 0, 199, 199, cyan) + gdImageRectangle(im, 0, 0, 199, 199, black) + + /* Draw pixel */ + gdImageSetPixel(im, 50, 5, blue) + gdImageSetPixel(im, 50, 15, blue) + + /* Draw lines */ + gdImageLine(im, 0, 0, 199, 199, blue) + gdImageDashedLine(im, 0, 199, 199, 0, blue) + + /* Draw polygons */ + gdImagePolygon(im, { { 10, 10 }, { 70, 10 }, { 80, 60 } }, red) + gdImageFilledPolygon(im, { { 160, 180 }, { 170, 110 }, { 150, 160 } }, green) + + /* Draw an arc */ + gdImageArc(im, 50, 50, 40, 40, 30, 190, red ) + gdImageFilledCircle(im, 50, 150, 45, green ) + gdImageEllipse(im, 120, 120, 50, 20, blue ) + + /* Draw some characters */ + font := gdFontGetLarge() + + gdImageString(im, font, 0, 0, 'Test', black) + gdImageString(im, font, 0, 15, 'P', black) + gdImageChar(im, font, 0, 30, 'W', black) + + gdImageStringUp(im, font, 70, 90, 'Test', black) + gdImageStringUp(im, font, 70, 15, 'P', black) + gdImageCharUp(im, font, 70, 30, 'W', black) + + gdImageStringFt(im, blue, "arial", 20, 30, 20, 90, 'Test') + + ? gdImageStringFTCircle(im, 120, 120, 50, 25, 0.8, "arial", 24, "Up", /*"Down"*/, red) + + /* Set Clip Rectangle */ + gdImageSetClip(im, 25, 25, 75, 75) + + /* Retrieve Clipping rectangle */ + aClip := gdImageGetClip(im) + +// ? "Clipping rectangle values" +// ? hb_DumpVar( aClip ) + + /* Query functions */ + color := gdImageGetPixel(im, gdImageSX(im) / 2, gdImageSY(im) / 2) + ? "Pixel Color is: ", color + ? "RGB Values: ", gdImageRed(im,color), gdImageGreen(im,color), gdImageBlue(im,color) + ? "Alpha Value: ", gdImageAlpha(im,color) + + /* Write Images on files */ + gdImagePng(im, IMAGES_OUT + "rect.png") + + gdImagePng(im2, IMAGES_OUT + "conv_test.png") + gdImageJpeg(im2, IMAGES_OUT + "conv_test.jpg") + + /* Destroy images in memory */ + gdImageDestroy(im) + gdImageDestroy(im2) + + ? + ? "Look at " + IMAGES_OUT + " folder for output images" + ? + +RETURN diff --git a/harbour/contrib/gd/tests/gdtestcls.prg b/harbour/contrib/gd/tests/gdtestcls.prg new file mode 100644 index 0000000000..17bff77fe3 --- /dev/null +++ b/harbour/contrib/gd/tests/gdtestcls.prg @@ -0,0 +1,334 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * GD Class test file + */ + + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "images_in/" +#define IMAGES_OUT "images_out/" + +PROCEDURE Main() + + LOCAL im, im2 + LOCAL black, white, blue, red, green, cyan, gray + LOCAL aClip, color, font, aRect + LOCAL oI, oI2, oI3, oI4, nThick, n, nSecs + LOCAL oI5 + LOCAL oB + + // To set fonts run this command: + // for windows: SET GDFONTPATH=c:\windows\fonts + // per linux : export GDFONTPATH=/usr/share/fonts/default/TrueType + + // SET GDFONTPATH=c:\windows\fonts + IF GetEnv( "GDFONTPATH" ) == "" + ? "Please set GDFONTPATH" + ? "On Windows: SET GDFONTPATH=c:\windows\fonts" + ? "On Linux : export GDFONTPATH=/usr/share/fonts/default/TrueType" + ? + ENDIF +/* + // Check output directory + IF !ISDirectory( IMAGES_OUT ) + DirMake( IMAGES_OUT ) + ENDIF +*/ + + /* Create an image in memory */ + oI := GDImage():Create( 200, 200 ) + + /* Load an image in memory from file */ + oI2 := GDImage():LoadFromJpeg( IMAGES_IN + "conv_test.jpeg" ) + oI5 := GDImage():LoadFromJpeg( IMAGES_IN + "conv_test.jpeg" ) + + /* Now work on first empty image */ + + /* Allocate background */ + white := oI:SetColor( 255, 255, 255 ) + + /* Allocate drawing color */ + black := oI:SetColor( 0, 0, 0 ) + blue := oI:SetColor( 0, 0, 255 ) + red := oI:SetColor( 255, 0, 0 ) + green := oI:SetColor( 0, 255, 0 ) + cyan := oI:SetColor( 0, 255, 255 ) + + /* Draw rectangle */ + oI:Rectangle( 0, 0, 199, 199, .T., cyan ) + oI:Rectangle( 0, 0, 199, 199,, black) + + oI:SetColor( blue ) + + /* Draw pixel */ + oI:SetPixel( 50, 5 ) + + /* Draw lines */ + oI:Line( 0, 0, 199, 199, blue ) + oI:DashedLine(0, 199, 199, 0, blue) + nThick := oI:SetThickness( 5 ) + oI:Line( 50, 150, 100, 150 ) + oI:SetThickness( nThick ) + + oI:AddStyle( red ) + oI:AddStyle( red ) + oI:AddStyle( red ) + oI:AddStyle( gdTransparent ) + oI:AddStyle( gdTransparent ) + oI:AddStyle( gdTransparent ) + oI:SetStyle() + oI:Line( 50, 180, 100, 180, gdStyled ) + + oI:ResetStyles() + oI:AddStyle( black ) + oI:AddStyle( gdTransparent ) + oI:SetStyle() + oI:Line( 50, 185, 100, 185, gdStyled ) + + + /* Draw polygons */ + oI:AddPoint( 10, 10 ) + oI:AddPoint( 70, 10 ) + oI:AddPoint( 80, 60 ) + oI:Polygon() + + oI:ResetPoints() + oI:AddPoint( 160, 180 ) + oI:AddPoint( 170, 110 ) + oI:AddPoint( 150, 160 ) + oI:Polygon(,.T., green) + + /* Draw an arc */ + oI:Arc(50, 50, 40, 40, 30, 190,, red ) + oI:Circle(50, 150, 45, .t., green ) + oI:Ellipse(120, 120, 50, 20, , green ) + + /* Draw a character. */ + oI:SetFontLarge() + ? "Font Dims", oI:GetFontWidth(), oI:GetFontHeight() + oI:SetColor( black ) + //__OutDebug( "Font", font ) + oI:Say( 0, 0, 'Test') + oI:Say( 0, 15, 'P') + oI:Say( 0, 30, 'W') + + oI:SayVertical( 70, 90, 'Test') + oI:SayVertical( 70, 15, 'P') + oI:SayVertical( 70, 30, 'W') + + oI:SayFreeType( 20, 30, "Test", "arial", 24, 15 ) + oI:SayFreeType( 40, 70, "Test2" ) + + + /* Set Clip Rectangle */ + oI:SetClippingArea(25, 25, 75, 75) + + /* Retrieve Clipping rectangle */ + aClip := oI:GetClippingArea() + ? "Clipping rectangle values" +// ? hb_DumpVar( aClip ) + + /* Query functions */ + + color := oI:GetPixel( oI:Width() / 2, oI:Height() / 2) + ? "Pixel Color is: ", color + ? "RGB Values: ", oI:Red(color), oI:Green(color), oI:Blue(color) + ? "Alpha Value: ", oI:Alpha(color) + + /* Write Images on files */ + oI:SavePng( IMAGES_OUT + "rect.png" ) + oI2:SavePng( IMAGES_OUT + "test.png" ) + oI2:SaveJpeg( IMAGES_OUT + "test.jpg" ) + oI2:SaveGif( IMAGES_OUT + "test.gif" ) + //oI2:SaveWBmp( IMAGES_OUT + "vale1.bmp", black ) + + /* test copy functions */ + + //oI3 := GDImage():CreateTrueColor( oI2:Width * 2, oI2:Height * 2 ) + //oI2:CopyResampled( 0, 0, oI2:Width, oI2:Height, 0, 0, oI3:Width, oI3:Height, oI3 ) + //oI3:SaveJpeg("vale2.jpg") + + + nSecs := Seconds() + ? "start copy zoomed" + oI3 := oI2:CopyZoomed( 150 ) + ? "end", Seconds() - nSecs + nSecs := Seconds() + ? "start save" + oI3:SaveJpeg( IMAGES_OUT + "zoom.jpg" ) + ? "end", Seconds() - nSecs + + nSecs := Seconds() + ? "start clone & zoom" + oI4:= oI2:Clone():Zoom( 200 ) + ? "end", Seconds() - nSecs + + nSecs := Seconds() + ? "start clone" + oI4:= oI5:Clone() + ? "end", Seconds() - nSecs + + nSecs := Seconds() + ? "start zoom" + oI4:Zoom( 200 ) + ? "end", Seconds() - nSecs + + //__OutDebug( oI2:pImage ) + //oI4:SetFontGiant() + gray := oI4:SetColor(30, 30, 30) + blue := oI4:SetColor(0, 0, 200) + + //oI4:SetColor( black ) + //oI4:Say( 100, 10, "Valentina" ) + IF OS() = "Linux" + oI4:SayFreeType( oI4:CenterWidth(), oI4:CenterHeight(), "GD power", "arib____", 40, 45 ) + ELSE + nSecs := Seconds() + ? "start write" + FOR n := 0 TO 350 STEP 10 + oI4:SayFreeType( oI4:CenterWidth(), oI4:CenterHeight(), " GD Font Power", "arial", 20, n ) + NEXT + ? "end", Seconds() - nSecs + oI4:SetTransparent( blue ) + oI4:SayFreeType( oI4:CenterWidth()-4, oI4:CenterHeight()+4, "xHarbour", "verdana", 70, n, gray ) + oI4:SayFreeType( oI4:CenterWidth(), oI4:CenterHeight(), "xHarbour", "verdana", 70, n, blue ) + ENDIF + oI4:SaveJpeg( IMAGES_OUT + "writing.jpg" ) + + + //oI4 := __ObjClone( oI2 ) + oI4 := oI2:Clone() + + nSecs := Seconds() + ? "start rotate outside" + oI2:Rotate( 45 ) + ? "end", Seconds() - nSecs + oI2:SaveJpeg( IMAGES_OUT + "rotateout.jpg" ) + + nSecs := Seconds() + ? "start rotate inside" + oI4:RotateInside( 45 ) + ? "end", Seconds() - nSecs + //oI2:CopyRotated( , , , , , , 90, oI4 ) + oI4:SaveJpeg( IMAGES_OUT + "rotatein.jpg" ) + + + oI5:Zoom( 40 ) + //oI5:Rotate( 90 ) + blue := oI5:SetColor(0, 0, 200) + oI5:SayFreeType( oI5:CenterWidth(), oI5:CenterHeight(), "xHarbour", "verdana", 20, 0, blue ) + oI5:SaveJpeg( IMAGES_OUT + "xh_zoom.jpg" ) + + + oI5 := GDChart( 400, 400 ) + // Set background + white := oI5:SetColor(255, 255, 255) + // Define piece colors + blue := oI5:SetColor(0, 0, 200) + gray := oI5:SetColor(30, 30, 30) + green := oI5:SetColor(0, 250, 0) + red := oI5:SetColor(250, 0, 0) + + // Load an image as brush + oB := GDImage():LoadFromGif( IMAGES_IN + "italia.gif" ) + oB:Zoom(15) + + //oI5:Circle( 200, 200, oI5:Width() ) + //oI5:Line( 0, 200, 200, 200 ) + + oI5:AddDef( "FONTPITCH", "GIANT" ) + + oI5:SetData( { ; + { "LABEL" => "One" , "VALUE" => 10, "COLOR" => blue , "FILLED" => TRUE, "EXTRUDE" => 40/*, "TILE" => oB*/ },; + { "LABEL" => "Two" , "VALUE" => 35, "COLOR" => gray , "FILLED" => TRUE, "FONT" => { "NAME" => "Verdana", "PITCH" => 12, "ANGLE" => 0, "COLOR" => red } },; + { "LABEL" => "Three", "VALUE" => 55, "COLOR" => green, "FILLED" => TRUE }, ; + { "LABEL" => "Four" , "VALUE" => 55, "FILLED" => TRUE , "TILE" => oB }, ; + { "LABEL" => "Five" , "VALUE" => 55, "COLOR" => red , "FILLED" => TRUE, "EXTRUDE" => 20}, ; + { "LABEL" => "Six" , "VALUE" => 55, "FILLED" => TRUE , "TILE" => oB }, ; + { "LABEL" => "Seven", "VALUE" => 55, "FILLED" => TRUE , "COLOR" => green } ; + } ) + + //oI5:VerticalBarChart() + oI5:PieChart() + + + oI5:SaveJpeg( IMAGES_OUT + "pie.jpg" ) + + oI5 := GDChart( 640, 480 ) + // Set background + white := oI5:SetColor(255, 255, 255) + // Define piece colors + blue := oI5:SetColor(0, 0, 200) + gray := oI5:SetColor(30, 30, 30) + green := oI5:SetColor(0, 250, 0) + red := oI5:SetColor(250, 0, 0) + + // Load an image as brush + oB := GDImage():LoadFromJpeg( IMAGES_IN + "fsg.jpg" ) + oB:Zoom(15) + +// oI5:AddDef( "MAXVALUE", 150 ) + oI5:AddDef( "AXISPICT", "@E 999999" ) + oI5:AddDef( "FONTPITCH", "GIANT" ) + oI5:AddDef( "COLOR", blue ) + + //oI5:AddSeries( "LABEL" => "Primo",; + // "VALUES" => { 10, 23, 54, 11, 32, 25 }, ; + // "COLOR" => blue ) + +/* + oI5:SetData( { ; + { "LABEL" => "One", "VALUE" => 1000, "COLOR" => blue, "FILLED" => TRUE, "EXTRUDE" => 40 },; + { "LABEL" => "Two", "VALUE" => 3500, "COLOR" => gray, "FILLED" => TRUE, "FONT" => { "NAME" => "Verdana", "PITCH" => 12, "ANGLE" => 0, "COLOR" => red } },; + { "LABEL" => "Three", "VALUE" => 5500, "COLOR" => green, "FILLED" => TRUE }, ; + { "LABEL" => "Four", "VALUE" => 6500, "FILLED" => TRUE, "TILE" => oB }, ; + { "LABEL" => "Five", "VALUE" => 3400, "FILLED" => TRUE, "COLOR" => green }, ; + { "LABEL" => "Six", "VALUE" => 10000 }, ; + { "LABEL" => "Seven", "VALUE" => 0, "FILLED" => TRUE, "COLOR" => red }, ; + { "LABEL" => "Eight", "VALUE" => -2200 }, ; + { "LABEL" => "Nine", "VALUE" => -3600, "COLOR" => blue, "FILLED" => TRUE } ; + } ) +*/ + + + oI5:SetData( { ; + { "LABEL" => "One", "VALUE" => 10, "COLOR" => blue, "FILLED" => TRUE, "EXTRUDE" => 40/*, "TILE" => oB*/ },; + { "LABEL" => "Two", "VALUE" => 35, "COLOR" => gray, "FILLED" => TRUE, "FONT" => { "NAME" => "Verdana", "PITCH" => 12, "ANGLE" => 0, "COLOR" => red } },; + { "LABEL" => "Three", "VALUE" => 55, "COLOR" => green, "FILLED" => TRUE }, ; + { "LABEL" => "Four", "VALUE" => 65, "FILLED" => TRUE, "TILE" => oB }, ; + { "LABEL" => "Five", "VALUE" => 34, "FILLED" => TRUE, "COLOR" => green }, ; + { "LABEL" => "Six", "VALUE" => 100 }, ; + { "LABEL" => "Seven", "VALUE" => 0, "FILLED" => TRUE, "COLOR" => red }, ; + { "LABEL" => "Eight", "VALUE" => -0 }, ; + { "LABEL" => "Nine", "VALUE" => -0, "COLOR" => blue, "FILLED" => TRUE } ; + } ) + + + //oI5:VerticalBarChart() + //oI5:HorizontalBarChart() + oI5:LineChart() + oI5:SaveJpeg( IMAGES_OUT + "hystogram1.jpg" ) + //oI5:LineChart() + //oI5:SaveJpeg( IMAGES_OUT + "hystogram.jpg" ) + + //oI4 := GDImage():CreateTrueColor( oI2:Width * 2, oI2:Height * 2 ) + //oI2:CopyResampled( 0, 0, oI2:Width, oI2:Height, 0, 0, oI2:Width, oI2:Height, oI4 ) + //oI2:CopyResampled( 0, 0, oI2:Width, oI2:Height, oI4:CenterWidth(), oI4:CenterHeight(), oI2:Width, oI2:Height, oI4 ) + //oI4:SaveJpeg("vale3.jpg") + + /* Destroy images in memory */ + // Class does it auto + + ? + ? "Look at " + IMAGES_OUT + " folder for output images" + ? + +RETURN + diff --git a/harbour/contrib/gd/tests/images_in/conv_test.jpeg b/harbour/contrib/gd/tests/images_in/conv_test.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..7283d1a4754baf7d760237664763b6201c35663b GIT binary patch literal 2317 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 literal 0 HcmV?d00001 diff --git a/harbour/contrib/gd/tests/images_in/theclipper.gif b/harbour/contrib/gd/tests/images_in/theclipper.gif new file mode 100644 index 0000000000000000000000000000000000000000..dd876c89c79fee5941e66fe8d911d012404b1283 GIT binary patch literal 6200 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 WFAPVPJZnV-%M~C`*1UO55CA*ep61s8 literal 0 HcmV?d00001 diff --git a/harbour/contrib/gd/tests/images_out/EMPTY b/harbour/contrib/gd/tests/images_out/EMPTY new file mode 100644 index 0000000000..e69de29bb2 diff --git a/harbour/contrib/gd/tests/test_out.prg b/harbour/contrib/gd/tests/test_out.prg new file mode 100644 index 0000000000..a6a3f6f3bc --- /dev/null +++ b/harbour/contrib/gd/tests/test_out.prg @@ -0,0 +1,345 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * Windows CGI test application + */ + +#include "gd.ch" +#include "common.ch" + +#command WRITE => FWrite( 1, + CHR(13)+CHR(10) ) +#command OutHTML => WRITE + +PROCEDURE Main(...) + + LOCAL cPar + LOCAL aParams := hb_aParams() + LOCAL cQuery := GetEnv( "QUERY_STRING" ) + LOCAL hParams := Hash() + + LOCAL cText, cImg, nPt, nSize, nWidth, nHeight, cPhoto + + IF Empty( aParams ) + IF !Empty( cQuery ) + hParams := GetVars( cQuery ) + ENDIF + ELSE + hParams := GetParams( aParams ) + ENDIF + + //----------------------------------------------------------------------------------------- + + // Gestione parametri + IF !Empty( hParams ) + FOR EACH cPar IN hParams:Keys + + do case + case cPar == "txt" + cText := hGet( hParams, cPar ) + + case cPar == "img" + cImg := hGet( hParams, cPar ) + + case cPar == "photo" + cPhoto := hGet( hParams, cPar ) + + case cPar == "width" + nWidth := Val( hGet( hParams, cPar ) ) + + case cPar == "height" + nHeight := Val( hGet( hParams, cPar ) ) + + case cPar == "pt" + nPt := Val( hGet( hParams, cPar ) ) + + endcase + NEXT + ENDIF + + //__OutDebug( cQuery, ValToPrg( hParams ) ) + + //----------------------------------------------------------------------------------------- + //DEFAULT cText TO "Testo di Prova" + DEFAULT nPt TO 30 + + IF cImg <> NIL + //OutJpg( cImg, nPt ) + OutPhoto( cImg, nWidth, nHeight ) + + ELSEIF cPhoto <> NIL + StartHTML() + //OutHTML ValToPrg( hParams ) + "
" + //OutHTML ValToPrg( cParams ) + "
" + //OutHTML ValToPrg( cQuery ) + "
" + //OutHTML "" + "
" + OutHTML "" + OutHTML "" + OutHTML "" + OutHTML "" + OutHTML "
" + OutHTML "" + "
" + OutHTML "
" + OutHTML "" + "
" + OutHTML "
" + OutHTML cPhoto + OutHTML "
" + OutHTML "
" + //OutHTML "" + "
" + //OutHTML OS() + "
" + //OutHTML IIF( OS_ISWINNT(), "WIN NT", "NON WIN NT" ) + "
" + EndHTML() + ELSE + StartHTML() + EndHTML() + ENDIF + +RETURN + +PROCEDURE StartHTML( cTitle ) + + DEFAULT cTitle TO "" + + WRITE 'content-type: text/html' + WRITE 'Pragma: no-cache' + WRITE CHR(13)+CHR(10) + WRITE "" + WRITE "" + WRITE "" + cTitle + "" + WRITE "" + WRITE "" +RETURN + +PROCEDURE EndHTML( cTitle ) + WRITE "" + WRITE "" +RETURN + + // per windows: SET GDFONTPATH=c:\windows\fonts + // per linux : export GDFONTPATH=/usr/share/fonts/default/TrueType + +PROCEDURE OutPhoto( cPhoto, nWidth, nHeight ) + LOCAL cType + + LOCAL oImage := GDImage():LoadFromFile( cPhoto ) + + IF nWidth <> NIL .AND. nHeight <> NIL + oImage:Resize( nWidth, nHeight ) + ELSEIF nWidth <> NIL .AND. nHeight == NIL + nHeight := oImage:Height() * ( nWidth / oImage:Width() ) + oImage:Resize( nWidth, nHeight ) + ELSEIF nWidth == NIL .AND. nHeight <> NIL + nWidth := oImage:Width() * ( nHeight / oImage:Height() ) + oImage:Resize( nWidth, nHeight ) + ENDIF + + //__OutDebug( hb_dumpvar( oImage ) ) + + WRITE 'content-type: ' + oImage:cMime + CHR(13)+CHR(10) + cType := oImage:cType + + DO CASE + CASE cType == "jpeg" + oImage:OutputJpeg() + CASE cType == "gif" + oImage:OutputGif() + CASE cType == "png" + oImage:OutputPng() + ENDCASE + + oImage := NIL +RETURN + +PROCEDURE OutJpg( cText, nPitch ) + LOCAL cOS := OS() + LOCAL cPath := IIF( Left( cOS, 10 ) == "Windows NT", "c:\winnt\fonts\", "c:\windows\fonts\" ) + LOCAL oI, cyan, blue + LOCAL aSize, nWidth, nHeight, nX, nY + LOCAL cFont := cPath + "verdana.ttf" + + + DEFAULT cText TO "Sample TEXT" + DEFAULT nPitch TO 30 + + /* Create an image in memory */ + oI := GDImage( 400, 100 ) + + /* Allocate background */ + cyan := oI:SetColor(0, 255, 255) + + /* Allocate drawing color */ + blue := oI:SetColor(0, 0, 200) + + //oI:SetTransparent( blue ) + oI:SetFontName( cFont ) + oI:SetFontPitch( nPitch ) + //__OutDebug( oI:GetFTFontHeight() ) + aSize := oI:GetFTStringSize( cText ) + nWidth := aSize[1] + nHeight := aSize[2] + nX := aSize[3] + nY := aSize[4] + oI:Resize( nWidth, nHeight ) + + + /* Allocate drawing color */ + blue := oI:SetColor(0, 0, 200) + oI:SetFontName( cPath + "verdana.ttf" ) + oI:SetFontPitch( nPitch ) + oI:SayFreeType( 0 - nX, 0 + nHeight - nY, cText, , , 0, blue ) + //oI:SayFreeType( 0, 0, cText, , , 0, blue ) + + //oI:Resize( nWidth, nHeight ) + //__OutDebug( "prima", oI:Width(), oI:Height() ) + //oI:Resize( 60, 40 ) + //__OutDebug( "dopo", oI:Width(), oI:Height() ) + + //oI:SetFontLarge() + //oI:SetColor( blue ) + //oI:Say( 0, 0, cText ) + + WRITE 'content-type: image/jpeg' + CHR(13)+CHR(10) + + oI:OutputJpeg() + +RETURN + +FUNCTION GetVars( cFields, cSeparator ) + LOCAL hHashVars := Hash() + LOCAL aField, cField, aFields + LOCAL cName, xValue + DEFAULT cSeparator TO "&" + + aFields := HB_RegExSplit( cSeparator, cFields ) + + FOR EACH cField in aFields + aField := HB_RegexSplit( "=", cField, 2 ) + IF Len( aField ) != 2 + LOOP + ENDIF + + cName := LTrim( aField[1] ) + xValue := UrlDecode( aField[2] ) + + // Tracelog( "cName, xValue", cName, xValue ) + + // is it an array entry? + IF Substr( cName, Len( cName ) - 1 ) == "[]" + cName := Substr( cName, 1, Len( cName ) - 2 ) + + hHashVars[ cName ] := { xValue } + + ELSE + + hHashVars[ cName ] := xValue + + ENDIF + //Tracelog( "hHashVars, cName, xValue", DumpValue( hHashVars ), cName, xValue ) + NEXT + //__OutDebug( hHashVars ) + +RETURN hHashVars + +FUNCTION GetParams( aParams ) + LOCAL hHashVars := Hash() + LOCAL aField, cField, aFields + LOCAL cName, xValue + + aFields := aParams + + FOR EACH cField in aFields + aField := HB_RegexSplit( "=", cField, 2 ) + IF Len( aField ) != 2 + LOOP + ENDIF + + cName := LTrim( aField[1] ) + xValue := UrlDecode( aField[2] ) + + // Tracelog( "cName, xValue", cName, xValue ) + + // is it an array entry? + IF Substr( cName, Len( cName ) - 1 ) == "[]" + cName := Substr( cName, 1, Len( cName ) - 2 ) + + hHashVars[ cName ] := { xValue } + + ELSE + + hHashVars[ cName ] := xValue + + ENDIF + //Tracelog( "hHashVars, cName, xValue", DumpValue( hHashVars ), cName, xValue ) + NEXT + //__OutDebug( hHashVars ) + +RETURN hHashVars + +************************************************************ +* Decoding URL +* Can return both a string or a number +* +FUNCTION URLDecode( cStr ) + LOCAL cRet := "", i, cCar + LOCAL lNumeric := .T. + + FOR i := 1 TO Len( cStr ) + cCar := cStr[i] + DO CASE + + CASE cCar == "+" + cRet += " " + + CASE cCar == "%" + i ++ + cRet += Chr( HexToNum( SubStr( cStr, i, 2 ) ) ) + i ++ + + OTHERWISE + cRet += cCar + + ENDCASE + + IF (cRet[i] > "9" .or. cRet[i] < "0") .and. cRet[i] != "." + lNumeric := .F. + ENDIF + NEXT + + *IF lNumeric + * cRet := Val( cRet ) + *ENDIF + +RETURN cRet + +FUNCTION URLEncode( cStr ) + LOCAL cRet := "", i, nVal, cCar + + FOR i := 1 TO Len( cStr ) + cCar := cStr[i] + DO CASE + + CASE cCar == " " + cRet += "+" + + CASE cCar >= "A" .and. cCar <= "Z" + cRet += cCar + + CASE cCar >= "a" .and. cCar <= "z" + cRet += cCar + + CASE cCar >= "0" .and. cCar <= "9" + cRet += cCar + + OTHERWISE + nVal := Asc( cCar ) + cRet += "%" + NumToHex( nVal ) + ENDCASE + NEXT + +RETURN cRet diff --git a/harbour/contrib/gd/tests/testdpi.prg b/harbour/contrib/gd/tests/testdpi.prg new file mode 100644 index 0000000000..c1bc821ec8 --- /dev/null +++ b/harbour/contrib/gd/tests/testdpi.prg @@ -0,0 +1,39 @@ +/* + * GD graphic library. + * graphic font DPI demo + * + * Copyright 2005 Francesco Saverio Giudice + */ + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "images_in/" +#define IMAGES_OUT "images_out/" + +PROCEDURE Main() + + oI := GDImage:Create( 600, 300 ) + + white := oI:SetColor( 255, 255, 255 ) + black := oI:SetColor( 0, 0, 0 ) + + oI:SetColor( black ) + oI:SetFontName("c:\windows\fonts\arial.ttf") + oI:SetFontPitch( 10 ) + + // Resolution = 96 dpi, default + oI:SayFreeType( 10, 100, "GD_RESOLUTION: 96 dpi" ) + + // Resolution = 150 dpi, using parameter 12 + oI:SayFreeType( 10, 150, "GD_RESOLUTION: 150 dpi",,,,,,,, 150 ) + + // Resolution = 300 dpi, using parameter 12 + oI:SayFreeType( 10, 200, "GD_RESOLUTION: 300 dpi",,,,,,,, 300 ) + + oI:SavePng( IMAGES_OUT + "testdpi.png" ) + oI:SaveJpeg( IMAGES_OUT + "testdpi.jpg" ) + oI:SaveGif( IMAGES_OUT + "testdpi.gif" ) + + RETURN + diff --git a/harbour/contrib/gd/tests/tostring.prg b/harbour/contrib/gd/tests/tostring.prg new file mode 100644 index 0000000000..7f2e588f01 --- /dev/null +++ b/harbour/contrib/gd/tests/tostring.prg @@ -0,0 +1,48 @@ +/* + * $Id$ + */ + +/* + * Copyright 2004-2005 Francesco Saverio Giudice + * + * GD Class test file: tostring() demo + */ + + +#include "gd.ch" +#include "common.ch" + +#define IMAGES_IN "images_in/" +#define IMAGES_OUT "images_out/" + +PROCEDURE Main() + + LOCAL im, im2 + LOCAL black, white, blue, red, green, cyan, gray + LOCAL aClip, color, font, aRect + LOCAL oI, oI2, oI3, oI4, nThick, n, nSecs + LOCAL oI5 + LOCAL oB + + // Check output directory + IF !ISDirectory( IMAGES_OUT ) + DirMake( IMAGES_OUT ) + ENDIF + + /* Load an image from file */ + oI := GDImage():LoadFromFile( IMAGES_IN + "xharbour.jpg" ) + + oI:SaveJpeg( IMAGES_OUT + "testfile.jpg" ) + + //Tracelog( oI:ToString() ) + + MemoWrit( IMAGES_OUT + "teststring.jpg", oI:ToString() ) + + oI:SaveToFile( IMAGES_OUT + "testtofile" ) + + ? + ? "Look at " + IMAGES_OUT + " folder for output images" + ? + +RETURN +