<?php

### 이미지 관련 라이브러리 ###



/*
지정된 문자열의 실제 너비와 높이를 계산하여 이미지위에 그릴수 있는 실좌표를 반환

return Array(x1, y1, x2, y2, x3, y3, x4, y4, width, height, x_gap, y_gap) or false

나중에 기울기에 따른 값도 제공해 보겟지만 일단은 0일때만 사용 가능
*/
function image_box ($font_file, $font_size, $angle, $text) {

    $font_file = trim($font_file);
    if (!is_file($font_file))
        return false;

    $font_size = (float)$font_size;
    $angle = (float)$angle;

    if ($angle != 0) //기울기가 0 이 아닐 경우에는 0으로 변경
        $angle = 0;

    $o = imageftbbox ( $font_size, $angle, $font_file, $text );
    $n = Array();

    // x 좌표의 최소값을 찾아서 0 을 기준으로 이동
    $x_min = min($o[0], $o[2], $o[4], $o[6]) * -1;
    $n[0] = $o[0] + $x_min;
    $n[2] = $o[2] + $x_min;
    $n[4] = $o[4] + $x_min;
    $n[6] = $o[6] + $x_min;

    // y 좌표의 최소값을 찾아서 0 을 기준으로 이동
    $y_min = min($o[1], $o[3], $o[5], $o[7]) * -1;
    $n[1] = $o[1] + $y_min;
    $n[3] = $o[3] + $y_min;
    $n[5] = $o[5] + $y_min;
    $n[7] = $o[7] + $y_min;

    $n[8] = $width = abs($n[4] - $n[0]);
    $n[9] = $hieght = abs($n[1] - $n[5]);
    $n[10] = $x_gap = (round($font_size / 10 * 1.1) > 1) ? -1 * round($font_size / 10 * 1.1) : $o[0];
    $n[11] = $y_gap = $o[1] * (-1);

    return $n;
}



/*
Multibyte String (mbstring) 함수들이 지원되어야 사용가능합니다. utf-8 전용

지정된 문자열의 실제 너비가 그리고자 하는 이미지의 너비보다 클 경우 적절하게 문자열을 잘라서 개행

return Array(x1, y1, x2, y2, x3, y3, x4, y4, width, height, x_gap, y_gap) or false

나중에 기울기에 따른 값도 제공해 보겟지만 일단은 0일때만 사용 가능
*/
function image_box_auto_newline ($font_file, $font_size, $angle, &$text, $padding, $image_width) {

    $array = list($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $width, $height, $x_gap, $y_gap) = image_box ($font_file, $font_size, $angle, $text);

    if (function_exists('mb_strlen') !== true || function_exists('mb_substr') !== true)
        return $array;

    if ($padding > 0)
        $width += ($padding * 2);

    if ($width > $image_width) {

        $text_array = preg_split("`\r?\n`", $text);

        foreach($text_array as $k => $text_){

            $temp = Array();
            $temp_text = '';
            $text_len = mb_strlen($text_, 'UTF-8');
            $j = 0;
            for ($i = 0; $i < $text_len; $i++) {

                $temp_text .= mb_substr($text_, $i, 1, 'UTF-8');

                list($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $width, $height, $x_gap, $y_gap) = image_box ($font_file, $font_size, $angle, $temp_text);

                if ($padding > 0)
                    $width += ($padding * 2);

                if ($width > $image_width) {

                    $temp[] = mb_substr($text_, $j, $i - $j, 'UTF-8');
                    $temp_text = mb_substr($text_, $i, 1, 'UTF-8');
                    $j = $i;
                }
            }

            $temp[] = $temp_text;

            $text_array[$k] = implode(PHP_EOL, $temp);;
        }

        $text = implode(PHP_EOL, $text_array);
        $array = list($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $width, $height, $x_gap, $y_gap) = image_box ($font_file, $font_size, $angle, $text);
    }

    return $array;
}



/*
생성된 이미지 리소스에 지정된 문자열을 원하는 위치에 imagefttext 를 사용하여 그림

$align = > left, center, right
$valign = > top, middle, bottom
$padding => 정렬될 위치로 얼마만큼 띄울것인가, int
$auto_newline => 전달받은 문자열이 이미지의 너비보다 클때 적절하게 잘라서 개행시켜줄지 여부, true 일때 적용

return true or false
*/
function image_text (&$image, $font_file, $font_size, $font_color, $angle, $text, $align='left', $valign='top', $padding=0, $auto_newline=true) {

    if (!is_resource($image))
        return false;

    $font_file = trim($font_file);
    if (!is_file($font_file))
        return false;

    $font_size = (float)$font_size;
    $font_color = (int)$font_color;
    $angle = (float)$angle;
    $align = trim($align);
    $valign = trim($valign);
    $padding = (int)$padding;

    if (!in_array($align, array('left', 'center', 'right')))
        $align = 'left';

    if (!in_array($valign, array('top', 'middle', 'bottom')))
        $align = 'top';

    if ($auto_newline !== true)
        $auto_newline = false;

    $image_width = imagesx($image);//이미지의 너비
    $image_height = imagesy($image);//이미지의 높이



    //자동 개행
    if ($auto_newline === true) {

        $array = list($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $width, $height, $x_gap, $y_gap) = image_box_auto_newline ($font_file, $font_size, $angle, $text, $padding, $image_width);
    }
    else {

        $array = list($x1, $y1, $x2, $y2, $x3, $y3, $x4, $y4, $width, $height, $x_gap, $y_gap) = image_box ($font_file, $font_size, $angle, $text);
    }

    if ($align == 'left') {//왼쪽

        $x = $x1 + $x_gap + $padding;
    }
    else if ($align == 'right') {//오른쪽

        $x = $image_width - $width + $x_gap - $padding;
    }
    else {//가운데

        $x = ceil(($image_width - $width) / 2) + $x_gap;
    }

    if ($valign == 'top') {//상단

        $y = $y1 + $y_gap + $padding;
    }
    else if ($valign == 'bottom') {//하단

        $y = $image_height + $y_gap - $padding;
    }
    else {//가운데

        $y = ceil(($image_height + $height) / 2) + $y_gap;
    }

    imagefttext($image, $font_size, $angle, $x, $y, $font_color, $font_file, $text);

    return true;
}

?>