# В этом файле демонстрируется использование опрераций над изображениями.

init:
    image logo base = "logo.png"

    image logo crop = im.Crop("logo.png", 0, 0, 100, 307)

    image logo scale = im.Scale("logo.png", 100, 150) 
    
    image logo composite = im.Composite((200, 407),
                                        (0, 0), "logo.png",
                                        (0, 50), "logo.png",
                                        (0, 100), "logo.png")

    image logo livecomposite = LiveComposite((200, 407),
                                             (0, 0), anim.Blink(Image("logo.png")),
                                             (0, 50), "logo.png",
                                             (0, 100), "logo.png")

    image logo green = im.Map("logo.png", rmap=im.ramp(0, 0))

    image logo green2 = im.Recolor("logo.png", 0, 255, 255, 255)

    image logo alpha = im.Alpha("logo.png", 0.5)

    image logo blackwhite = "logobw.png"

    image logo twocolor = im.Twocolor("logobw.png",
                                      (128, 255, 255, 255),
                                      (255, 0, 0, 255))


    image eileen alpha = im.Alpha("eileen_happy.png", 0.5)

    image eileen flip = im.Flip("eileen_happy.png", vertical=True)


    image logo halfsat = im.MatrixColor("logo.png",
                                        im.matrix.saturation(.5))

    # Проще было бы это сделать с помощью im.matrix.invert(),  
    # но нам хотелось показать, как использовать MatrixColor.
    image logo invert = im.MatrixColor("logo.png",
                                       [ -1,  0,  0, 0, 1,
                                          0, -1,  0, 0, 1,
                                          0,  0, -1, 0, 1,
                                          0,  0,  0, 1, 0, ])

    image logo tintblue = im.MatrixColor("logo.png",
                                         im.matrix.saturation(.5) * im.matrix.tint(.75, .75, 1.0))

    image logo hue = im.MatrixColor("logo.png",
                                    im.matrix.hue(90))
    
    image logo bright = im.MatrixColor("logo.png",
                                       im.matrix.brightness(.5))

    image logo sepia = im.Sepia("logo.png")
    
    image logo grayscale = im.Grayscale("logo.png")
    
    
    $ logopos = Position(xpos=.5, xanchor=0, ypos=50, yanchor=0)
    
label demo_imageops:

    e "Операции над изображениями позволяют изменять изображения ещё при загрузке."

    e "Они эффекивны, так как применяются только один раз - при загрузке изображения в память."

    e "И при выводе изображения на экран никакой дополнительной работы не нужно."

    show eileen happy at left
    with move
    show logo base at logopos
    with dissolve

    e "Это наше тестовое изображение - логотип Ren'Py."

    e "Мы применим к нему некоторые операции, чтобы посмотреть, как они работают."

    show logo crop at logopos
    with dissolve

    e "Операция {i}im.Crop{/i} берёт изображение и обрезает его."

    show logo composite at logopos
    with dissolve

    e "Операция {i}im.Composite{/i} берёт несколько изображений и объединяет их в одно."

    e "Хотя зрительно того же можно достичь, показав несколько изображений отдельно, объединение более эффективно."

    show logo livecomposite at logopos
    with dissolve

    e "Есть ещё {i}LiveComposite{/i}, менее эффективное, но поддерживающее анимацию."

    e "Это не совсем операция над изображением, но нам некуда было это отнести."

    show logo scale at logopos
    with dissolve

    e "Операция {i}im.Scale{/i} меняет размер изображения."

    show logo green at logopos
    with dissolve

    e "Операция {i}im.Map{/i} позволяет поиграть с красным, зелёным, синим и альфа-каналами изображения."

    e "В данном случае мы убрали весь синий канал, оставив только красный и зелёный."

    show logo base at logopos
    with dissolve
    show logo green2 at logopos
    with dissolve 

    e "Операция {i}im.Recolor{/i} может сделать то же, но линейная смена цветовых каналов всё же эффективнее."

    show logo blackwhite at logopos
    with dissolve

    e "Операция {i}im.Twocolor{/i} берёт чёрно-белое изображение вроде этого..."

    show logo twocolor at logopos
    with dissolve

    e "... и устанавливает цвета, заменяющие чёрный и белый."

    show logo halfsat at logopos
    with dissolve
    
    e "Операция {i}im.MatrixColor{/i} использует матрицу для изменения цветовых каналов. Правильно подобранной матрицей можно изменить насыщенность цвета..."

    show logo tintblue at logopos
    with dissolve
    
    e "... добавить изображению голубизны..."

    show logo hue at logopos
    with dissolve
    
    e "... повернуть оттенки... "
    
    show logo invert at logopos
    with dissolve

    e "... или даже инвертировать цвета для получения довольно пугающего эффекта."
    
    show logo bright at logopos
    with dissolve
    
    e "Можно даже изменять яркость и контрастность изображения!"

    e "Некоторые часто используемые матрицы мы вынесли в собственные операции."

    show logo grayscale at logopos
    with dissolve

    e "{i}im.Grayscale{/i} перекрашивает изображение в оттенки серого..."

    show logo sepia at logopos
    with dissolve
    
    e "... a {i}im.Sepia{/i} накладывает эффект сепии."
       
    show logo base at logopos
    with dissolve
    show logo alpha at logopos
    with dissolve

    e "Операция {i}im.Alpha{/i} меняет альфа-канал изображения, что позволяет сделать его частично прозрачным."

    show eileen alpha at left
    with dissolve

    e "Удобно для отображения всяческих призраков."

    hide logo
    show eileen happy at left
    with dissolve

    e "Но я - не призрак."

    show eileen happy
    with move
    show eileen flip
    with dissolve

    e "Наконец, есть {i}im.Flip{/i}, отражающая изображение по вертикали или горизонтали."

    e "Пожалуй, лучше про него много не говорить."

    show eileen happy
    with dissolve

    return
