## Python Imaging Library# $Id$## stuff to read (and render) GIMP gradient files## History:# 97-08-23 fl Created## Copyright (c) Secret Labs AB 1997.# Copyright (c) Fredrik Lundh 1997.## See the README file for information on usage and redistribution.#"""Stuff to translate curve segments to palette values (derived fromthe corresponding code in GIMP, written by Federico Mena Quintero.See the GIMP distribution for more information.)"""from__future__importannotationsfrommathimportlog,pi,sin,sqrtfrom._binaryimporto8EPSILON=1e-10""""""# Enable auto-doc for data member
[docs]defgetpalette(self,entries=256):palette=[]ix=0x0,x1,xm,rgb0,rgb1,segment=self.gradient[ix]foriinrange(entries):x=i/(entries-1)whilex1<x:ix+=1x0,x1,xm,rgb0,rgb1,segment=self.gradient[ix]w=x1-x0ifw<EPSILON:scale=segment(0.5,0.5)else:scale=segment((xm-x0)/w,(x-x0)/w)# expand to RGBAr=o8(int(255*((rgb1[0]-rgb0[0])*scale+rgb0[0])+0.5))g=o8(int(255*((rgb1[1]-rgb0[1])*scale+rgb0[1])+0.5))b=o8(int(255*((rgb1[2]-rgb0[2])*scale+rgb0[2])+0.5))a=o8(int(255*((rgb1[3]-rgb0[3])*scale+rgb0[3])+0.5))# add to palettepalette.append(r+g+b+a)returnb"".join(palette),"RGBA"
[docs]classGimpGradientFile(GradientFile):"""File handler for GIMP's gradient format."""def__init__(self,fp):iffp.readline()[:13]!=b"GIMP Gradient":msg="not a GIMP gradient file"raiseSyntaxError(msg)line=fp.readline()# GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files doifline.startswith(b"Name: "):line=fp.readline().strip()count=int(line)gradient=[]foriinrange(count):s=fp.readline().split()w=[float(x)forxins[:11]]x0,x1=w[0],w[2]xm=w[1]rgb0=w[3:7]rgb1=w[7:11]segment=SEGMENTS[int(s[11])]cspace=int(s[12])ifcspace!=0:msg="cannot handle HSV colour space"raiseOSError(msg)gradient.append((x0,x1,xm,rgb0,rgb1,segment))self.gradient=gradient