function _image_captcha_image_generator_print_string in CAPTCHA 6.2
Same name and namespace in other branches
- 5.3 image_captcha/image_captcha.user.inc \_image_captcha_image_generator_print_string()
- 6 image_captcha/image_captcha.user.inc \_image_captcha_image_generator_print_string()
- 7 image_captcha/image_captcha.user.inc \_image_captcha_image_generator_print_string()
Helper function for drawing text on the image.
1 call to _image_captcha_image_generator_print_string()
- _image_captcha_generate_image in image_captcha/
image_captcha.user.inc - Base function for generating a image CAPTCHA.
File
- image_captcha/
image_captcha.user.inc, line 238 - Functions for the generation of the CAPTCHA image.
Code
function _image_captcha_image_generator_print_string(&$image, $width, $height, $fonts, $font_size, $text, $rtl = FALSE) {
// get characters
$characters = _image_captcha_utf8_split($text);
$character_quantity = count($characters);
// get colors
$background_rgb = _image_captcha_hex_to_rgb(variable_get('image_captcha_background_color', '#ffffff'));
$foreground_rgb = _image_captcha_hex_to_rgb(variable_get('image_captcha_foreground_color', '#000000'));
$background_color = imagecolorallocate($image, $background_rgb[0], $background_rgb[1], $background_rgb[2]);
$foreground_color = imagecolorallocate($image, $foreground_rgb[0], $foreground_rgb[1], $foreground_rgb[2]);
// precalculate the value ranges for color randomness
$foreground_randomness = (int) variable_get('image_captcha_foreground_color_randomness', 100);
if ($foreground_randomness) {
$foreground_color_range = array();
for ($i = 0; $i < 3; $i++) {
$foreground_color_range[$i] = array(
max(0, $foreground_rgb[$i] - $foreground_randomness),
min(255, $foreground_rgb[$i] + $foreground_randomness),
);
}
}
// set default text color
$color = $foreground_color;
// the image is seperated in different character cages, one for each character
// each character will be somewhere inside that cage
$ccage_width = $width / $character_quantity;
$ccage_height = $height;
foreach ($characters as $c => $character) {
// initial position of character: in the center of its cage
$center_x = ($c + 0.5) * $ccage_width;
if ($rtl) {
$center_x = $width - $center_x;
}
$center_y = 0.5 * $height;
// Pick a random font from the list.
$font = $fonts[array_rand($fonts)];
// Get character dimensions for TrueType fonts.
if ($font != 'BUILTIN') {
$bbox = imagettfbbox($font_size, 0, realpath($font), $character);
// In very rare cases with some versions of the GD library, the x-value
// of the left side of the bounding box as returned by the first call of
// imagettfbbox is corrupt (value -2147483648 = 0x80000000).
// The weird thing is that calling the function a second time
// can be used as workaround.
// This issue is discussed at http://drupal.org/node/349218.
if ($bbox[2] < 0) {
$bbox = imagettfbbox($font_size, 0, realpath($font), $character);
}
}
else {
$character_width = imagefontwidth(5);
$character_height = imagefontheight(5);
$bbox = array(
0,
$character_height,
$character_width,
$character_height,
$character_width,
0,
0,
0,
);
}
// Random (but small) rotation of the character.
// TODO: add a setting for this?
$angle = mt_rand(-10, 10);
// Determine print position: at what coordinate should the character be
// printed so that the bounding box would be nicely centered in the cage?
$bb_center_x = 0.5 * ($bbox[0] + $bbox[2]);
$bb_center_y = 0.5 * ($bbox[1] + $bbox[7]);
$angle_cos = cos($angle * 3.1415 / 180);
$angle_sin = sin($angle * 3.1415 / 180);
$pos_x = $center_x - ($angle_cos * $bb_center_x + $angle_sin * $bb_center_y);
$pos_y = $center_y - (-$angle_sin * $bb_center_x + $angle_cos * $bb_center_y);
// Calculate available room to jitter: how much can the character be moved
// so that it stays inside its cage?
$bb_width = $bbox[2] - $bbox[0];
$bb_height = $bbox[1] - $bbox[7];
$dev_x = 0.5 * max(0, $ccage_width - abs($angle_cos) * $bb_width - abs($angle_sin) * $bb_height);
$dev_y = 0.5 * max(0, $ccage_height - abs($angle_cos) * $bb_height - abs($angle_sin) * $bb_width);
// add jitter to position
$pos_x = $pos_x + mt_rand(-$dev_x, $dev_x);
$pos_y = $pos_y + mt_rand(-$dev_y, $dev_y);
// calculate text color in case of randomness
if ($foreground_randomness) {
$color = imagecolorallocate($image, mt_rand($foreground_color_range[0][0], $foreground_color_range[0][1]), mt_rand($foreground_color_range[1][0], $foreground_color_range[1][1]), mt_rand($foreground_color_range[2][0], $foreground_color_range[2][1]));
}
// draw character
if ($font == 'BUILTIN') {
imagestring($image, 5, $pos_x, $pos_y, $character, $color);
}
else {
imagettftext($image, $font_size, $angle, $pos_x, $pos_y, $color, realpath($font), $character);
}
// For debugging purposes: draw character bounding box (only valid when rotation is disabled).
// imagerectangle($image, $pos_x + $bbox[0], $pos_y + $bbox[1], $pos_x + $bbox[2], $pos_y + $bbox[7], $color);
}
// return a sign of success
return TRUE;
}