Attached are the diffs from gd.c and php_gd.h that add a new function to PHP:

int ImageRawRectangle (int im, int x, int y, int x_size, int y_size, string 
data)

ImageRawRectangle() translates the data string into a rectangle of size x_size 
b y_size in the image im.  The data string represents the image data in normal 
scanline format (left-to-right, top-to-bottom). If the image is palletted, the 
function expects a string of bytes x_size * y_size, each representing an index 
of a pixel.  If the image is true color, the function expects a string of bytes 
x_size * y_size *4. Each group of four bytes represents the Alpha, Red, Green, 
and Blue components of a pixel.

Example 1. Storing a fill pattern in the PHP source.

<?PHP
        header ("Content-type: image/png");

        $checkerFillData = chr(0x00).chr(0xff).chr(0x00).chr(0x00) . chr
(0x00).chr(0xff).chr(0x00).chr(0x00) . chr(0x00).chr(0xff).chr(0x00).chr
(0x00) . chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr(0x00).chr(0x80).chr
(0x80).chr(0x80) . chr(0x00).chr(0x80).chr(0x80).chr(0x80).
                chr(0x00).chr(0xff).chr(0x00).chr(0x00) . chr(0x00).chr
(0xff).chr(0x00).chr(0x00) . chr(0x00).chr(0xff).chr(0x00).chr(0x00) . chr
(0x00).chr(0x80).chr(0x80).chr(0x80) . chr(0x00).chr(0x80).chr(0x80).chr
(0x80) . chr(0x00).chr(0x80).chr(0x80).chr(0x80).
                chr(0x00).chr(0xff).chr(0x00).chr(0x00) . chr(0x00).chr
(0xff).chr(0x00).chr(0x00) . chr(0x00).chr(0xff).chr(0x00).chr(0x00) . chr
(0x00).chr(0x80).chr(0x80).chr(0x80) . chr(0x00).chr(0x80).chr(0x80).chr
(0x80) . chr(0x00).chr(0x80).chr(0x80).chr(0x80).
                chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr(0x00).chr
(0x80).chr(0x80).chr(0x80) . chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr
(0x00).chr(0xff).chr(0x00).chr(0x00) . chr(0x00).chr(0xff).chr(0x00).chr
(0x00) . chr(0x00).chr(0xff).chr(0x00).chr(0x00).
                chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr(0x00).chr
(0x80).chr(0x80).chr(0x80) . chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr
(0x00).chr(0xff).chr(0x00).chr(0x00) . chr(0x00).chr(0xff).chr(0x00).chr
(0x00) . chr(0x00).chr(0xff).chr(0x00).chr(0x00).
                chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr(0x00).chr
(0x80).chr(0x80).chr(0x80) . chr(0x00).chr(0x80).chr(0x80).chr(0x80) . chr
(0x00).chr(0xff).chr(0x00).chr(0x00) . chr(0x00).chr(0xff).chr(0x00).chr
(0x00) . chr(0x00).chr(0xff).chr(0x00).chr(0x00);

        $checkerFillImage = ImageCreateTrueColor(6, 6);
        ImageRawRectangle($checkerFillImage, 0, 0, 6, 6, $checkerFillData);

        $im = ImageCreateTrueColor(200, 100);
        ImageSetTile($im, $checkerFillImage);
        ImageFilledEllipse ($im, 100, 50, 150, 75, IMG_COLOR_TILED);
        ImagePng ($im);
?>

Example 2. Reading raw pixel data from disk.
Example 3. Storing icons in the PHP source.


Please respond with comments, revisions or suggestions.  I would like to see 
these changes incorporated into the next official PHP build. 
Thanks!

---------------------------------------------
This message was sent using netINS Webmail.
Don't settle for less, get netINS!
http://netINS.net
*** php-4.1.1/ext/gd/gd.c.orig  Fri Nov 16 06:02:30 2001
--- php-4.1.1/ext/gd/gd.c       Fri Feb 22 04:14:30 2002
***************
*** 163,168 ****
--- 163,169 ----
        PHP_FE(imagefill,                                                              
 NULL)
        PHP_FE(imagefilledpolygon,                                              NULL)
        PHP_FE(imagefilledrectangle,                                    NULL)
+       PHP_FE(imagerawrectangle,                                       NULL)
        PHP_FE(imagefilltoborder,                                               NULL)
        PHP_FE(imagefontwidth,                                                  NULL)
        PHP_FE(imagefontheight,                                                 NULL)
***************
*** 1973,1978 ****
--- 1974,2041 ----
        RETURN_TRUE;
  }
  /* }}} */     
+ 
+ /* {{{ proto int imagerawrectangle(int im, int x, int y, int x_size, int y_size, 
+string str)
+    Draw a rectangle filled with pixels represented by raw pixel data in the string*/
+ PHP_FUNCTION(imagerawrectangle)
+ {
+       zval **IM, **x, **y, **x_size, **y_size, **str;
+       gdImagePtr im;
+       long _x, _y, _x_size, _y_size, x_count, y_count, pixel_start;
+       int col;
+       char *_str;
+ 
+ 
+       if (ZEND_NUM_ARGS() != 6 ||     zend_get_parameters_ex(6, &IM, &x, &y, 
+&x_size, &y_size, &str) == FAILURE) {
+               ZEND_WRONG_PARAM_COUNT();
+       }
+ 
+       ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd);
+ 
+       convert_to_long_ex(x);
+       convert_to_long_ex(y);
+       convert_to_long_ex(x_size);
+       convert_to_long_ex(y_size);
+       convert_to_string_ex(str);
+ 
+       _x = Z_LVAL_PP(x);
+       _y = Z_LVAL_PP(y);
+       _x_size = Z_LVAL_PP(x_size);
+       _y_size = Z_LVAL_PP(y_size);
+ 
+       _str = Z_STRVAL_PP(str);
+ 
+ #if HAVE_LIBGD20
+       if (gdImageTrueColor(im)) {
+               if (Z_STRLEN_PP(str) == (_x_size * _y_size * 4)) {
+                       for (y_count = 0; y_count < _y_size; y_count++) {
+                               for (x_count = 0; x_count < _x_size; x_count++) {
+                                       pixel_start = (_x_size * y_count + x_count) * 
+4;
+                                       col = gdTrueColorAlpha((unsigned 
+char)_str[pixel_start + 1], (unsigned char)_str[pixel_start + 2], (unsigned 
+char)_str[pixel_start + 3], (unsigned char)_str[pixel_start]);
+                                       gdImageSetPixel(im, _x + x_count, _y + 
+y_count, col);
+                               }
+                       }
+               } else {
+                       php_error(E_ERROR, "%s(): Data is the wrong length, expecting 
+four bytes (ARGB) per pixel", get_active_function_name(TSRMLS_C));
+               }
+       } else {
+ #endif
+               if (Z_STRLEN_PP(str) == (_x_size * _y_size)) {
+                       for (y_count = 0; y_count < _y_size; y_count++) {
+                               for (x_count = 0; x_count < _x_size; x_count++) {
+                                       gdImageSetPixel(im, _x + x_count, _y + 
+y_count, (unsigned char)_str[_x_size * y_count + x_count]);
+                               }
+                       }
+               } else {
+                       php_error(E_ERROR, "%s(): Data is the wrong length, expecting 
+one byte (index) per pixel", get_active_function_name(TSRMLS_C));
+               }
+ #if HAVE_LIBGD20
+       } 
+ #endif
+ 
+       RETURN_TRUE;
+ }
+ /* }}} */
  
  /* {{{ proto int imagearc(int im, int cx, int cy, int w, int h, int s, int e, int 
col)
     Draw a partial ellipse */
*** php-4.1.1/ext/gd/php_gd.h.orig      Fri Aug 24 15:07:07 2001
--- php-4.1.1/ext/gd/php_gd.h   Fri Feb 22 04:17:09 2002
***************
*** 125,130 ****
--- 125,131 ----
  PHP_FUNCTION(imagefill);
  PHP_FUNCTION(imagefilledpolygon);
  PHP_FUNCTION(imagefilledrectangle);
+ PHP_FUNCTION(imagerawrectangle);
  PHP_FUNCTION(imagefilltoborder);
  PHP_FUNCTION(imagefontwidth);
  PHP_FUNCTION(imagefontheight);
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to