You are here

function _image_captcha_image_generator_print_string in CAPTCHA 5.3

Same name and namespace in other branches
  1. 6.2 image_captcha/image_captcha.user.inc \_image_captcha_image_generator_print_string()
  2. 6 image_captcha/image_captcha.user.inc \_image_captcha_image_generator_print_string()
  3. 7 image_captcha/image_captcha.user.inc \_image_captcha_image_generator_print_string()

Helper function for drawing text on the image

Parameters

$background_mode if the text is for the background of the double vision mode:

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 176
Implementation of the image generation for the image CAPTCHA module.

Code

function _image_captcha_image_generator_print_string(&$image, $width, $height, $font, $font_size, $text, $background_mode = FALSE) {

  // get characters
  $characters = _image_captcha_utf8_split($text);
  $character_quantity = count($characters);

  // get character width for builtin font
  if ($font == 'BUILTIN') {
    $character_width = imagefontwidth(5);
    $character_height = imagefontheight(5);
    $bbox = array(
      0,
      $character_height,
      $character_width,
      $character_height,
      $character_width,
      0,
      0,
      0,
    );
  }

  // 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'));

  // correct foreground for background mode (double vision)
  if ($background_mode) {
    for ($i = 0; $i < 3; $i++) {
      $foreground_rgb[$i] = 0.75 * $background_rgb[$i] + 0.25 * $foreground_rgb[$i];
    }
  }
  $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) {
    if ($background_mode) {
      $foreground_randomness *= 0.25;
    }
    $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;
    $center_y = 0.5 * $height;

    // get character dimensions for ttf fonts
    if ($font != 'BUILTIN') {
      $bbox = imagettfbbox($font_size, 0, realpath($font), $character);
    }

    // determine print position: at what coordinate should the character be
    // printed so that the bounding box would be nicely centered in the cage?
    $pos_x = $center_x - 0.5 * ($bbox[0] + $bbox[2]);
    $pos_y = $center_y - 0.5 * ($bbox[1] + $bbox[7]);

    // calculate available room to jitter: how much can the character be moved
    // so that it stays inside its cage?
    $dev_x = 0.5 * max(0, $ccage_width - ($bbox[2] - $bbox[0]));
    $dev_y = 0.5 * max(0, $ccage_height - ($bbox[1] - $bbox[7]));

    // 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, 0, $pos_x, $pos_y, $color, realpath($font), $character);
    }

    // for debugging purposes: draw character bounding box
    // 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;
}