###
## * << Haru Free PDF Library 2.0.0 >> -- text_demo.c
## *
## * Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
## *
## * Permission to use, copy, modify, distribute and sell this software
## * and its documentation for any purpose is hereby granted without fee,
## * provided that the above copyright notice appear in all copies and
## * that both that copyright notice and this permission notice appear
## * in supporting documentation.
## * It is provided "as is" without express or implied warranty.
## *
##

## port to python by Li Jun
## http://groups.google.com/group/pythoncia

import os, sys

from ctypes import *
up=2
def setlibpath(up):
    import sys
    path=os.path.normpath(os.path.split(os.path.realpath(__file__))[0]+'\..'*up)
    if path not in sys.path:
        sys.path.append(path)

setlibpath(up)

from haru import *
from haru.c_func import *
from haru.hpdf_errorcode import *
from grid_sheet import *

from math import *

@HPDF_Error_Handler(None, HPDF_UINT, HPDF_UINT, c_void_p)
def error_handler (error_no, detail_no, user_data):
    global pdf
    printf ("ERROR: %s, detail_no=%u\n", error_detail[error_no],
                detail_no)
    HPDF_Free (pdf)
    sys.exit(1)

def show_stripe_pattern  (page, x, y):
    iy = 0

    while (iy < 50):
        HPDF_Page_SetRGBStroke (page, 0.0, 0.0, 0.5)
        HPDF_Page_SetLineWidth (page, 1)
        HPDF_Page_MoveTo (page, x, y + iy)
        HPDF_Page_LineTo (page, x + HPDF_Page_TextWidth (page, "ABCabc123"),
                    y + iy)
        HPDF_Page_Stroke (page)
        iy += 3

    HPDF_Page_SetLineWidth (page, 2.5)


def show_description  (page, x, y, text):
    fsize = HPDF_Page_GetCurrentFontSize (page)
    font = HPDF_Page_GetCurrentFont (page)
    c = HPDF_Page_GetRGBFill (page)

    HPDF_Page_BeginText (page)
    HPDF_Page_SetRGBFill (page, 0, 0, 0)
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL)
    HPDF_Page_SetFontAndSize (page, font, 10)
    HPDF_Page_TextOut (page, x, y - 12, text)
    HPDF_Page_EndText (page)

    HPDF_Page_SetFontAndSize (page, font, fsize)
    HPDF_Page_SetRGBFill (page, c.r, c.g, c.b)



def main ():
    global pdf

    page_title = "Text Demo"


    samp_text = "abcdefgABCDEFG123!#$%&+-@?"
    samp_text2 = "The quick brown fox jumps over the lazy dog."

    fname=os.path.realpath(sys.argv[0])
    fname=fname[:fname.rfind('.')]+'.pdf'

    pdf = HPDF_New (error_handler, NULL)
    if (not pdf):
        printf ("error: cannot create PdfDoc object\n")
        return 1

    # set compression mode
    HPDF_SetCompressionMode (pdf, HPDF_COMP_ALL)

    # create default-font
    font = HPDF_GetFont (pdf, "Helvetica", NULL)

    # add a new page object.
    page = HPDF_AddPage (pdf)

    # draw grid to the page
    print_grid  (pdf, page)

    # print the lines of the page.
    HPDF_Page_SetLineWidth (page, 1)
    HPDF_Page_Rectangle (page, 50, 50, HPDF_Page_GetWidth(page) - 100,
                HPDF_Page_GetHeight (page) - 110)
    HPDF_Page_Stroke (page)


    # print the title of the page (with positioning center).
    HPDF_Page_SetFontAndSize (page, font, 24)
    tw = HPDF_Page_TextWidth (page, page_title)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, (HPDF_Page_GetWidth(page) - tw) / 2,
                HPDF_Page_GetHeight (page) - 50, page_title)
    HPDF_Page_EndText (page)

    HPDF_Page_BeginText (page)
    HPDF_Page_MoveTextPos (page, 60, HPDF_Page_GetHeight(page) - 60)

    # font size
    fsize = 8
    while (fsize < 60):

        # set style and size of font.
        HPDF_Page_SetFontAndSize(page, font, fsize)

        # set the position of the text.
        HPDF_Page_MoveTextPos (page, 0, -5 - fsize)

        # measure the number of characters which included in the page.
        buf= samp_text
        length = HPDF_Page_MeasureText (page, samp_text,
                        HPDF_Page_GetWidth(page) - 120, HPDF_FALSE, NULL)

        # truncate the text.
        buf='%*s\0' %(int(length), buf)

        HPDF_Page_ShowText (page, buf)

        # print the description.
        HPDF_Page_MoveTextPos (page, 0, -10)
        HPDF_Page_SetFontAndSize(page, font, 8)
        buf="Fontsize=%.0f" %fsize
        HPDF_Page_ShowText (page, buf)

        fsize *= 1.5


    # font color
    HPDF_Page_SetFontAndSize(page, font, 8)
    HPDF_Page_MoveTextPos (page, 0, -30)
    HPDF_Page_ShowText (page, "Font color")

    HPDF_Page_SetFontAndSize (page, font, 18)
    HPDF_Page_MoveTextPos (page, 0, -20)
    length = len (samp_text)
    for i in range(length):
        buf=[None ,None]
        r = i / float(length)
        g = 1 - (i / float(length))
        buf[0] = samp_text[i]
        buf[1] = '\0'

        HPDF_Page_SetRGBFill (page, r, g, 0.0)
        HPDF_Page_ShowText (page, buf)

    HPDF_Page_MoveTextPos (page, 0, -25)

    for i in range(length):
        buf=[None ,None]
        r = i / float(length)
        b = 1 - (i / float(length))
        buf[0] = samp_text[i]
        buf[1] = '\0'

        HPDF_Page_SetRGBFill (page, r, 0.0, b)
        HPDF_Page_ShowText (page, buf)

    HPDF_Page_MoveTextPos (page, 0, -25)

    for i in range(length):
        buf=[None ,None]
        b = i / float(length)
        g = 1 - (i / float(length))
        buf[0] = samp_text[i]
        buf[1] = '\0'

        HPDF_Page_SetRGBFill (page, 0.0, g, b)
        HPDF_Page_ShowText (page, buf)


    HPDF_Page_EndText (page)

    ypos = 450

    #
    # Font rendering mode
    #
    HPDF_Page_SetFontAndSize(page, font, 32)
    HPDF_Page_SetRGBFill (page, 0.5, 0.5, 0.0)
    HPDF_Page_SetLineWidth (page, 1.5)

     # PDF_FILL
    show_description (page,  60, ypos,
                "RenderingMode=PDF_FILL")
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, ypos, "ABCabc123")
    HPDF_Page_EndText (page)

    # PDF_STROKE
    show_description (page, 60, ypos - 50,
                "RenderingMode=PDF_STROKE")
    HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, ypos - 50, "ABCabc123")
    HPDF_Page_EndText (page)

    # PDF_FILL_THEN_STROKE
    show_description (page, 60, ypos - 100,
                "RenderingMode=PDF_FILL_THEN_STROKE")
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_THEN_STROKE)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, ypos - 100, "ABCabc123")
    HPDF_Page_EndText (page)

    # PDF_FILL_CLIPPING
    show_description (page, 60, ypos - 150,
                "RenderingMode=PDF_FILL_CLIPPING")
    HPDF_Page_GSave (page)
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_CLIPPING)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, ypos - 150, "ABCabc123")
    HPDF_Page_EndText (page)
    show_stripe_pattern (page, 60, ypos - 150)
    HPDF_Page_GRestore (page)

    # PDF_STROKE_CLIPPING
    show_description (page, 60, ypos - 200,
                "RenderingMode=PDF_STROKE_CLIPPING")
    HPDF_Page_GSave (page)
    HPDF_Page_SetTextRenderingMode (page, HPDF_STROKE_CLIPPING)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, ypos - 200, "ABCabc123")
    HPDF_Page_EndText (page)
    show_stripe_pattern (page, 60, ypos - 200)
    HPDF_Page_GRestore (page)

    # PDF_FILL_STROKE_CLIPPING
    show_description (page, 60, ypos - 250,
                "RenderingMode=PDF_FILL_STROKE_CLIPPING")
    HPDF_Page_GSave (page)
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL_STROKE_CLIPPING)
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, ypos - 250, "ABCabc123")
    HPDF_Page_EndText (page)
    show_stripe_pattern (page, 60, ypos - 250)
    HPDF_Page_GRestore (page)

    # Reset text attributes
    HPDF_Page_SetTextRenderingMode (page, HPDF_FILL)
    HPDF_Page_SetRGBFill (page, 0, 0, 0)
    HPDF_Page_SetFontAndSize(page, font, 30)


    #
    # Rotating text
    #
    angle1 = 30;                   # A rotation of 30 degrees.
    rad1 = angle1 / 180 * 3.141592; # Calcurate the radian value.

    show_description (page, 320, ypos - 60, "Rotating text")
    HPDF_Page_BeginText (page)
    HPDF_Page_SetTextMatrix (page, cos(rad1), sin(rad1), -sin(rad1), cos(rad1),
                330, ypos - 60)
    HPDF_Page_ShowText (page, "ABCabc123")
    HPDF_Page_EndText (page)


    #
    # Skewing text.
    #
    show_description (page, 320, ypos - 120, "Skewing text")
    HPDF_Page_BeginText (page)

    angle1 = 10
    angle2 = 20
    rad1 = angle1 / 180 * 3.141592
    rad2 = angle2 / 180 * 3.141592

    HPDF_Page_SetTextMatrix (page, 1, tan(rad1), tan(rad2), 1, 320, ypos - 120)
    HPDF_Page_ShowText (page, "ABCabc123")
    HPDF_Page_EndText (page)


    #
    # scaling text (X direction)
    #
    show_description (page, 320, ypos - 175, "Scaling text (X direction)")
    HPDF_Page_BeginText (page)
    HPDF_Page_SetTextMatrix (page, 1.5, 0, 0, 1, 320, ypos - 175)
    HPDF_Page_ShowText (page, "ABCabc12")
    HPDF_Page_EndText (page)


    #
    # scaling text (Y direction)
    #
    show_description (page, 320, ypos - 250, "Scaling text (Y direction)")
    HPDF_Page_BeginText (page)
    HPDF_Page_SetTextMatrix (page, 1, 0, 0, 2, 320, ypos - 250)
    HPDF_Page_ShowText (page, "ABCabc123")
    HPDF_Page_EndText (page)


    #
    # char spacing, word spacing
    #

    show_description (page, 60, 140, "char-spacing 0")
    show_description (page, 60, 100, "char-spacing 1.5")
    show_description (page, 60, 60, "char-spacing 1.5, word-spacing 2.5")

    HPDF_Page_SetFontAndSize (page, font, 20)
    HPDF_Page_SetRGBFill (page, 0.1, 0.3, 0.1)

    ## char-spacing 0
    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, 140, samp_text2)
    HPDF_Page_EndText (page)

    # char-spacing 1.5
    HPDF_Page_SetCharSpace (page, 1.5)

    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, 100, samp_text2)
    HPDF_Page_EndText (page)

    # char-spacing 1.5, word-spacing 3.5
    HPDF_Page_SetWordSpace (page, 2.5)

    HPDF_Page_BeginText (page)
    HPDF_Page_TextOut (page, 60, 60, samp_text2)
    HPDF_Page_EndText (page)

    # save the document to a file
    HPDF_SaveToFile (pdf, fname)

    # clean up
    HPDF_Free (pdf)

    return 0

main()