psd
Version:
A general purpose Photoshop file parser.
79 lines (64 loc) • 1.94 kB
text/coffeescript
{Module} = require 'coffeescript-module'
# The blend mode describes important data regarding a layer, such as
# the blending mode, the opacity, and whether it's a part of a clipping mask.
module.exports = class BlendMode extends Module
@aliasProperty 'blendingMode', 'mode'
# All of the blend modes are stored in the PSD file with a specific key.
# This is the mapping of that key to its readable name.
BLEND_MODES = {
norm: 'normal',
dark: 'darken',
lite: 'lighten',
hue: 'hue',
sat: 'saturation',
colr: 'color',
lum: 'luminosity',
mul: 'multiply',
scrn: 'screen',
diss: 'dissolve',
over: 'overlay',
hLit: 'hard_light',
sLit: 'soft_light',
diff: 'difference',
smud: 'exclusion',
div: 'color_dodge',
idiv: 'color_burn',
lbrn: 'linear_burn',
lddg: 'linear_dodge',
vLit: 'vivid_light',
lLit: 'linear_light',
pLit: 'pin_light',
hMix: 'hard_mix',
pass: 'passthru',
dkCl: 'darker_color',
lgCl: 'lighter_color',
fsub: 'subtract',
fdiv: 'divide'
}
constructor: (@file) ->
# The 4 character key for the blending mode.
@blendKey = null
# The opacity of the layer, from [0, 255].
@opacity = null
# Raw value for the clipping state of this layer.
@clipping = null
# Is this layer a clipping mask?
@clipped = null
@flags = null
# The readable representation of the blend mode.
@mode = null
# Is this layer visible?
@visible = null
# Parses the blend mode data.
parse: ->
@file.seek 4, true
@blendKey = @file.readString(4).trim()
@opacity = @file.readByte()
@clipping = @file.readByte()
@flags = @file.readByte()
@mode = BLEND_MODES[@blendKey]
@clipped = @clipping is 1
@visible = !((@flags & (0x01 << 1)) > 0)
@file.seek 1, true
# Returns the layer opacity as a percentage.
opacityPercentage: -> @opacity * 100 / 255