#!/usr/bin/env python
#save as ~/.gimp-2.2/plug-ins/andy_warhol.py
#chmod 755 ~/.gimp-2.2/plug-ins/andy_warhol.py

AW_BACKGROUND_COLORS=[
			[ [0xFF,0xFD,0x0A], [0x05,0x83,0xEA], [0x2A,0x20,0x81] ],
			[ [0xF6,0x84,0x07], [0xE2,0x09,0x1C], [0x86,0xB2,0x07] ],
			[ [0x21,0x6E,0x64], [0xFF,0xFB,0x06], [0xE4,0x04,0x7C] ]
	]
		
AW_SHADOW_COLORS=[
			[ [0x8D,0xB7,0x15], [0xF8,0xF1,0x03], [0xF7,0x8F,0xCC] ],
			[ [0x7D,0xBB,0xF4], [0xFF,0xFF,0xFF], [0xFF,0xFE,0xA4] ],
			[ [0xFF,0xFC,0xE9], [0x9C,0xBE,0x36], [0xF0,0x73,0x07] ]
	]

AW_FACE_COLORS=[
			[ [0x2B,0x25,0x7D], [0xE3,0x05,0x7C], [0xE9,0x06,0x21] ],
			[ [0x79,0x43,0x99], [0x1D,0x1A,0x21], [0xEA,0x68,0x08] ],
			[ [0xE7,0x09,0x76], [0xE9,0x1D,0x20], [0x29,0x20,0x7D] ]
	]

from gimpfu import *
import gimpfu
import os
import sys

class GimpExceptionWrapper:
	def __init__(self, callable):
		self.callable = callable
	def __call__(self, *args, **kwargs):
		try:
			return self.callable(args[0],args[2])
		except:
			pdb.gimp_message( str(sys.exc_info()[0]) + ": " + str(sys.exc_info()[1]))
			raise

def andy_warhol(timg,use_face = False):
	pdb.gimp_message('Operación en proceso, tarda un poco')
	rows=len(AW_BACKGROUND_COLORS)
	cols=len(AW_BACKGROUND_COLORS[0])
	
	finalImage = gimp.Image(cols*timg.width,rows*timg.height,RGB)
	
	bufferImage = gimp.Image(timg.width,timg.height,RGB)
	bufferLayer = gimp.Layer(bufferImage,'Other',bufferImage.width,bufferImage.height,RGB_IMAGE,100,SATURATION_MODE)
	bufferImage.add_layer(bufferLayer,0)

	for i in timg.layers:
		if i.name == 'Original':
			originalLayer = i
		if i.name == 'Face':
			facelayer = i
	if not 'originalLayer' in locals() or (use_face and not 'facelayer' in locals()):
		if not 'originalLayer' in locals():
			pdb.gimp_message('Capa "Original" no encontrada')
		elif not 'facelayer' in locals():
			pdb.gimp_message('Capa "Face" no encontrada')
		return

	shadowlayer = pdb.gimp_layer_copy(originalLayer,255)
	timg.add_layer(shadowlayer,len(timg.layers))
	shadowlayer.name = 'Shadow'
	pdb.gimp_threshold(shadowlayer,254,255)
	
	bglayer = gimp.Layer(timg,'Background',shadowlayer.width,shadowlayer.height,RGB_IMAGE,100,SATURATION_MODE)
	timg.add_layer(bglayer,len(timg.layers))

	finalImageLayer = gimp.Layer(finalImage,'Other',finalImage.width,finalImage.height,RGB_IMAGE,100,SATURATION_MODE)
	finalImage.add_layer(finalImageLayer,0)

	layer_copying_exceptions = ['Original'] #Layers that will not be copied
	if not use_face:
		layer_copying_exceptions.append('Face')
	for row in range(rows):
		for col in range(cols):
			pdb.gimp_palette_set_background(AW_SHADOW_COLORS[row][col])
			pdb.gimp_bucket_fill(shadowlayer,BG_BUCKET_FILL,NORMAL_MODE,100,100,0,timg.width/2,timg.height/2)

			if use_face:
				pdb.gimp_palette_set_background(AW_FACE_COLORS[row][col])
				pdb.gimp_bucket_fill(facelayer,BG_BUCKET_FILL,NORMAL_MODE,100,100,0,timg.width/2,timg.height/2)
		
			pdb.gimp_palette_set_background(AW_BACKGROUND_COLORS[row][col])
			pdb.gimp_drawable_fill(bglayer,BACKGROUND_FILL)
		
			for timgLayerNumber in range(len(timg.layers) + 1):
				currentLayerNumber = len(timg.layers) - timgLayerNumber - 1
				if not timg.layers[currentLayerNumber].name in layer_copying_exceptions:
					pdb.gimp_edit_copy(timg.layers[currentLayerNumber])
					pdb.gimp_edit_paste(bufferLayer,0)
	
			pdb.gimp_edit_copy(bufferLayer)
			selection = pdb.gimp_edit_paste(finalImage.layers[0],0)
			selection.set_offsets(timg.width*col,timg.height*row)

	gimp.Display(finalImage)
	pdb.gimp_message('Creada: '+str(rows)+', '+str(cols))
	
register(
	"python_fu_andy_warhol", 
	"Makes an Andy Warhol effect",      # blurb
	"Makes an Andy Warhol effect",      # help
	"Pablo Orduña Fernández",               # author
	"Pablo Orduña Fernández",               # copyright
	"2005",                                 # date
	"<Image>/Python-Fu/Andy-Warhol",       # menupath
	"*",                                    # imagetypes
	[
		(PF_BOOL,"use_face","¿Usar cara?",False)
	],                                       # params
	[],                                     # results
	GimpExceptionWrapper(andy_warhol))  # function

main()
                        
