#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import * 
import ctypes

def napln(image, drawable):

    # Merging operation
    pdb.gimp_image_undo_group_start(image)
    
    # Image size recognition and layer creation       
    sirka = drawable.width
    vyska = drawable.height

    vrstva1 = pdb.gimp_layer_new_from_drawable(drawable, image)
       
    # Edge detection using Sobel operator       
    pdb.plug_in_edge(image, drawable, 1, 0, 0)
    
    # Converting to gryscale according to the value parameter
    monochrome = TRUE
    rr_gain = 0.299
    rg_gain = 0.299
    rb_gain = 0.299
    gr_gain = 0.587
    gg_gain = 0.587
    gb_gain = 0.587 
    br_gain = 0.114
    bg_gain = 0.114
    bb_gain = 0.114
    
    pdb.plug_in_colors_channel_mixer(image, drawable, monochrome, rr_gain, rg_gain, rb_gain, gr_gain, gg_gain, gb_gain, br_gain, bg_gain, bb_gain)

    # Converting to monochrome    
    pdb.gimp_image_convert_grayscale(image)

    # Bit depth recognition
    hloubka = drawable.bpp    
    if pdb.gimp_drawable_has_alpha(drawable):
        hloubka = (256 ** (hloubka / 2)) - 1
    else:
        hloubka = (256 ** hloubka) - 1
    
    rozliseni = ((int(pdb.gimp_image_get_resolution(image)[0]) + int(pdb.gimp_image_get_resolution(image)[0])) / 2)  
    
    # Average pixel value recognition    
    histogram = pdb.gimp_drawable_histogram(drawable, 0, 0, 1)
    jdh = histogram[0] / hloubka
    jdh = jdh * 100

    # Visualization of the map load distribution
    # pdb.gimp_drawable_invert(drawable, True)
    # pdb.gimp_drawable_brightness_contrast(drawable, -0.5, 0.5)
        
    sirka = int(sirka / 10)
    vyska = int(vyska / 10)
    if sirka > vyska:
      pdb.plug_in_pixelize2(image, drawable, vyska, vyska)
    else:
      pdb.plug_in_pixelize2(image, drawable, sirka, sirka)   
    
    pdb.gimp_image_convert_rgb(image)      
    vrstva2 = pdb.gimp_layer_new_from_drawable(drawable, image)
    
    pdb.gimp_layer_set_opacity(vrstva2, 85)
    pdb.gimp_image_insert_layer(image, vrstva1, None, -1)
    pdb.gimp_image_insert_layer(image, vrstva2, None, -1)    
    
    # Value notification
    hlaska = ""
    if rozliseni != 100:
      hlaska = " Varování: Rozlišení obrazu je "  + str(rozliseni) + " DPI zatímco doporučeno je 100 DPI\n\n"  
    hlaska = hlaska + " Grafická náplň mapy: " + str(round(jdh, 1)) + " %"
    ctypes.windll.user32.MessageBoxW(0, unicode(hlaska, "utf-8"), u"VÝSLEDKY MĚŘENÍ", 0x40)
    
    # Finishing operations
    pdb.gimp_image_undo_group_end(image)
    
register(
    "NAPLNMAPY_1-1",
    "Experimentální nástroj pro určování grafické náplně map založený na detekci hran",
    "Experimentální nástroj pro určování grafické náplně map založený na detekci hran pomocí Sobelova filtru, vyvinutý na Katedře geoinformatiky Univerzity Palackého v Olomouci v rámci výzkumu metrik pro výpočet grafické náplně map. Pro vzájemnou porovnatelnost se doporučuje využít rastry reprezentující mapu v originálních rozměrech a s rozlišením 100 DPI",
    "Radek Barvíř", "CC BY-SA", "v 1.1, build 201125, 2020",
    "GMLMT 1.1 (náplň mapy)",
    "RGB*", 
    [
        (PF_IMAGE, "image", "takes current image", None),
        (PF_DRAWABLE, "drawable", "Input layer", None)
    ],
    [],
    napln, menu="<Image>/Filters/Edge-Detect")

main()