# -*- coding: latin-1 -*-
#!/usr/bin/env python
from gimpfu import *
from gimpenums import *

import sys
import os
import math


def sauvegarder_selection( strNomFichierDeBase, nPos_x, nPos_y, nLargeurTexture, nHauteurTexture ):
	"""Sauvegarde la sélection dans un fichier .png dont le nom est dérivé du nom initial"""
	strNom_nouvelle_image = strNomFichierDeBase
	strNom_nouvelle_image += "_x%d_y%d"%(nPos_x, nPos_y)
	strNom_nouvelle_image += ".png"
	
	nouvelle_image = gimp.pdb.gimp_edit_paste_as_new()
	lstLayers = nouvelle_image.layers
	layer = lstLayers[0]
	#gimp.pdb.gimp_message( 'nouvelle image ok' )
	bNOk = gimp.pdb.gimp_file_save( nouvelle_image, layer, strNom_nouvelle_image, strNom_nouvelle_image )
	if bNOk:
		gimp.pdb.gimp_message( 'sauvegarde %s nok'%(strNom_nouvelle_image) )
	else:
		#gimp.pdb.gimp_message( 'sauvegarde %s ok'%(strNom_nouvelle_image) )
		pass
	gimp.pdb.gimp_image_delete( nouvelle_image )



def decouper( inImage, nLargeurTexture, nHauteurTexture ):
	"""Découpe l'image reçue en rectangles dont on a reçu les dimensions"""
	gimp.pdb.gimp_message_set_handler( MESSAGE_BOX )#GIMP_MESSAGE_BOX (0), GIMP_CONSOLE (1), GIMP_ERROR_CONSOLE (2) }
	# Récupération des éléments du nom du fichier pour calculer le nom des images qui seront générées
	strNomCompletImg = inImage.filename
	# - vérification que le nom est valide
	if strNomCompletImg == None:
		strM = "Attention, l'image doit avoir un nom pour que le script fonctionne."
		gimp.message( strM )
		return
	
	lstNom = os.path.split( strNomCompletImg )
	strCheminImg = lstNom[0]
	strNomImg = lstNom[1]
	lstNomImg = os.path.splitext( strNomImg )
	strNomImgSeul = lstNomImg[0]
	strExtensionImg = lstNomImg[1]
	strNomFichierDeBase = os.path.join( strCheminImg, strNomImgSeul )
	
	nLargeurSov = inImage.width
	nHauteurSov = inImage.height
	
	# Sauvegarde des couleurs
	save_fg = gimp.get_foreground()
	save_bg = gimp.get_background()
	
	#strM = "Le nom de l'image est \"%s\", sa largeur est %d x %d" %( strNomImgSeul, nLargeurSov, nHauteurSov )
	#gimp.message( strM )
	
	# Préparation de l'image à découper
	gimp.pdb.gimp_selection_none( inImage )
	gimp.pdb.gimp_selection_all( inImage )
	gimp.pdb.gimp_selection_clear( inImage )
	
	lstLayers = inImage.layers
	layerImg_src = lstLayers[0]
	
	nNb_x = math.ceil( float( nLargeurSov ) / float( nLargeurTexture ) )
	nNb_y = math.ceil( float( nHauteurSov ) / float( nHauteurTexture ) )
	nLargeur = nNb_x * nLargeurTexture
	nHauteur = nNb_y * nHauteurTexture
	
	# Redimensionnement de l'image initiale à un multiple de la taille de la texture
	if nLargeur > nLargeurSov or nHauteur > nHauteurSov:
		gimp.set_background( 255.0, 255.0, 0.0 )# jaune
		gimp.pdb.gimp_image_resize ( inImage, nLargeur, nHauteur, 0, 0 )  
		gimp.pdb.gimp_layer_resize_to_image_size( layerImg_src ) # redimensionnement de l'unique calque
		
		# Tracé des limites (hachures noires sur fond jaune)
		couleur = (0, 0, 0)# noir
		nLargeurBandeNoire = 32
		nHauteurHachures = nLargeurBandeNoire
		if nHauteur > nHauteurSov:
			# - hachurage de la bande horizontale inférieure
			x_start = nLargeurSov
			y_start = nHauteurSov
			pas_x_bande = 2 * nLargeurBandeNoire
			nHauteurMargeBas = min( nHauteurHachures, abs( nHauteur - nHauteurSov ) )
			while x_start > nLargeurBandeNoire:
				for x in range( nLargeurBandeNoire ):
					nLargeurMargeDroite = abs( nLargeur - x_start + x ) 
					for y in range( min( nHauteurMargeBas, nLargeurMargeDroite ) ):
						x_pt = x_start + y - x
						y_pt = nHauteurSov + y
						layerImg_src.set_pixel( x_pt, y_pt, couleur )
				# suivant
				x_start -= pas_x_bande
		
		if nLargeur > nLargeurSov:
			# - hachurage de la bande verticale droite
			x_start = nLargeurSov
			y_start = nHauteurSov - nLargeurBandeNoire
			pas_y_bande = 2 * nLargeurBandeNoire
			nLargeurMargeDroite = min( nHauteurHachures, abs( nLargeur - nLargeurSov ) )
			while y_start > nLargeurBandeNoire:
				for y in range( nLargeurBandeNoire ):
					for x in range( nLargeurMargeDroite ):
						x_pt = nLargeurSov + x  
						y_pt = y_start + x - y
						layerImg_src.set_pixel( x_pt, y_pt, couleur )
				# suivant
				y_start -= pas_y_bande
	
	
	# Découpage
	for nPos_x in range( nNb_x ):
		for nPos_y in range( nNb_y ):
			pos_x_top_left = nPos_x * nLargeurTexture
			pos_y_top_left = nPos_y * nHauteurTexture
			gimp.pdb.gimp_rect_select( inImage, pos_x_top_left, pos_y_top_left, \
				nLargeurTexture, nHauteurTexture, CHANNEL_OP_REPLACE, FALSE, 0 )
			gimp.pdb.gimp_edit_copy( layerImg_src )
			sauvegarder_selection( strNomFichierDeBase, nPos_x, nPos_y, nLargeurTexture, nHauteurTexture )
	
	# Ecriture du fichier HTML qui regroupe les images
	strNomFichierHtml = os.path.join( strCheminImg, "mosaique.html" )
	f = open( strNomFichierHtml, 'w' )
	f.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">")
	f.write("<HTML>\n")
	f.write("   <HEAD></HEAD>\n")
	f.write("   <BODY>\n")
	f.write("      <TABLE BORDER>\n")
	for li in range( nNb_y ):
		f.write("         <TR>\n")
		f.write("            ")
		for co in range( nNb_x ):
			strNomImage = strNomImgSeul 
			strNomImage += "_x%d_y%d"%( co, li )
			strNomImage += ".png"
			strLi = "<TD><img src=\"%s\"></TD>"%( strNomImage )
			f.write( strLi )
		f.write("\n         </TR>\n")
	f.write("      </TABLE>\n")
	f.write("   </BODY>\n")
	f.write("</HTML>\n")
	f.close()
	
	#gimp.Display( img )
	# Restauration de la taille initiale
	gimp.pdb.gimp_image_resize (inImage, nLargeurSov, nHauteurSov, 0,0 )
	gimp.pdb.gimp_layer_resize_to_image_size( layerImg_src )
	gimp.pdb.gimp_selection_none( inImage )
	
	# Restauration des couleurs initiales
	gimp.set_foreground( save_fg )
	gimp.set_background( save_bg )
	
	# Message final (sans d'accents !)
	strM = "Ouvrez le fichier \"%s\" pour voir le resultat du decoupage."%( strNomFichierHtml )
	gimp.pdb.gimp_message( strM )


#-----------------------------------------
# Version 1.0 : 20/09/2008
#             : première version
#
#
#
#-----------------------------------------
register(
	"python_fu_decouper",# Nom de la fonction
	"Decoupe cette image en rectangles",# pas d'accents ici
	"Decoupe cette image en rectangles",# pas d'accents ici
	"Vincent Vansuyt",
	"GPL License",
	"2008",
	"<Image>/Python-Fu/Decouper en rectangles...",# pas d'accents ici
	"",
	[
	(PF_IMAGE, "inImage", "Input image", None),
	(PF_INT, "nLargeurTexture", "Largeur texture", 256),
	(PF_INT, "nHauteurTexture", "Hauteur texture", 256),
	],
	[],
	decouper,
	menu="<Image>/Python-Fu/Découper en rectangles...",
	)

main() 
