Files
openmaic/OpenMAIC/packages/@openmaic/importer/src1/fill.js
2026-08-16 14:58:47 +08:00

791 lines
26 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import tinycolor from 'tinycolor2'
import { getSchemeColorFromTheme } from './schemeColor'
import {
applyShade,
applyTint,
applyLumOff,
applyLumMod,
applyHueMod,
applySatMod,
hslToRgb,
getColorName2Hex,
} from './color'
import {
base64ArrayBuffer,
getTextByPathList,
angleToDegrees,
escapeHtml,
getMimeType,
toHex,
} from './utils'
export function getFillType(node) {
let fillType = ''
if (node['a:noFill']) fillType = 'NO_FILL'
if (node['a:solidFill']) fillType = 'SOLID_FILL'
if (node['a:gradFill']) fillType = 'GRADIENT_FILL'
if (node['a:pattFill']) fillType = 'PATTERN_FILL'
if (node['a:blipFill']) fillType = 'PIC_FILL'
if (node['a:grpFill']) fillType = 'GROUP_FILL'
return fillType
}
export async function getPicFill(type, node, warpObj) {
if (!node) return ''
let img
const rId = getTextByPathList(node, ['a:blip', 'attrs', 'r:embed'])
let imgPath
if (type === 'slideBg' || type === 'slide') {
imgPath = getTextByPathList(warpObj, ['slideResObj', rId, 'target'])
}
else if (type === 'slideLayoutBg') {
imgPath = getTextByPathList(warpObj, ['layoutResObj', rId, 'target'])
}
else if (type === 'slideMasterBg') {
imgPath = getTextByPathList(warpObj, ['masterResObj', rId, 'target'])
}
else if (type === 'themeBg') {
imgPath = getTextByPathList(warpObj, ['themeResObj', rId, 'target'])
}
else if (type === 'diagramBg') {
imgPath = getTextByPathList(warpObj, ['diagramResObj', rId, 'target'])
}
if (!imgPath) return imgPath
img = getTextByPathList(warpObj, ['loaded-images', imgPath])
if (!img) {
imgPath = escapeHtml(imgPath)
const imgExt = imgPath.split('.').pop()
if (imgExt === 'xml') return ''
const imgArrayBuffer = await warpObj['zip'].file(imgPath).async('arraybuffer')
const imgMimeType = getMimeType(imgExt)
if (warpObj.mediaMode === 'blob' && typeof URL !== 'undefined' && typeof Blob !== 'undefined' && URL.createObjectURL) {
img = URL.createObjectURL(new Blob([imgArrayBuffer], { type: imgMimeType }))
} else {
img = `data:${imgMimeType};base64,${base64ArrayBuffer(imgArrayBuffer)}`
}
const loadedImages = warpObj['loaded-images'] || {}
loadedImages[imgPath] = img
warpObj['loaded-images'] = loadedImages
}
return img
}
export function getPicFillOpacity(node) {
const aBlipNode = node['a:blip']
const aphaModFixNode = getTextByPathList(aBlipNode, ['a:alphaModFix', 'attrs'])
let opacity = 1
if (aphaModFixNode && aphaModFixNode['amt'] && aphaModFixNode['amt'] !== '') {
opacity = parseInt(aphaModFixNode['amt']) / 100000
}
return opacity
}
export function getPicFilters(node) {
if (!node) return null
const aBlipNode = node['a:blip']
if (!aBlipNode) return null
const filters = {}
// 从a:extLst中获取滤镜效果Microsoft Office 2010+扩展)
const extLstNode = aBlipNode['a:extLst']
if (extLstNode && extLstNode['a:ext']) {
const extNodes = Array.isArray(extLstNode['a:ext']) ? extLstNode['a:ext'] : [extLstNode['a:ext']]
for (const extNode of extNodes) {
if (!extNode['a14:imgProps'] || !extNode['a14:imgProps']['a14:imgLayer']) continue
const imgLayerNode = extNode['a14:imgProps']['a14:imgLayer']
const imgEffects = imgLayerNode['a14:imgEffect']
if (!imgEffects) continue
const effectArray = Array.isArray(imgEffects) ? imgEffects : [imgEffects]
for (const effect of effectArray) {
// 饱和度
if (effect['a14:saturation']) {
const satAttr = getTextByPathList(effect, ['a14:saturation', 'attrs', 'sat'])
if (satAttr) {
filters.saturation = parseInt(satAttr) / 100000
}
}
// 亮度、对比度
if (effect['a14:brightnessContrast']) {
const brightAttr = getTextByPathList(effect, ['a14:brightnessContrast', 'attrs', 'bright'])
const contrastAttr = getTextByPathList(effect, ['a14:brightnessContrast', 'attrs', 'contrast'])
if (brightAttr) {
filters.brightness = parseInt(brightAttr) / 100000
}
if (contrastAttr) {
filters.contrast = parseInt(contrastAttr) / 100000
}
}
// 锐化/柔化
if (effect['a14:sharpenSoften']) {
const amountAttr = getTextByPathList(effect, ['a14:sharpenSoften', 'attrs', 'amount'])
if (amountAttr) {
const amount = parseInt(amountAttr) / 100000
if (amount > 0) {
filters.sharpen = amount
}
else {
filters.soften = Math.abs(amount)
}
}
}
// 色温
if (effect['a14:colorTemperature']) {
const tempAttr = getTextByPathList(effect, ['a14:colorTemperature', 'attrs', 'colorTemp'])
if (tempAttr) {
filters.colorTemperature = parseInt(tempAttr)
}
}
}
}
}
return Object.keys(filters).length > 0 ? filters : null
}
export async function getBgPicFill(bgPr, sorce, warpObj) {
const picBase64 = await getPicFill(sorce, bgPr['a:blipFill'], warpObj)
const aBlipNode = bgPr['a:blipFill']['a:blip']
const aphaModFixNode = getTextByPathList(aBlipNode, ['a:alphaModFix', 'attrs'])
let opacity = 1
if (aphaModFixNode && aphaModFixNode['amt'] && aphaModFixNode['amt'] !== '') {
opacity = parseInt(aphaModFixNode['amt']) / 100000
}
return {
picBase64,
opacity,
}
}
export function getGradientFill(node, warpObj) {
const gsLst = node['a:gsLst']['a:gs']
const colors = []
for (let i = 0; i < gsLst.length; i++) {
const lo_color = getSolidFill(gsLst[i], undefined, undefined, warpObj)
const pos = getTextByPathList(gsLst[i], ['attrs', 'pos'])
colors[i] = {
pos: pos ? (pos / 1000 + '%') : '',
color: lo_color,
}
}
const lin = node['a:lin']
let rot = 0
let pathType = 'line'
if (lin) rot = angleToDegrees(lin['attrs']['ang'])
else {
const path = node['a:path']
if (path && path['attrs'] && path['attrs']['path']) pathType = path['attrs']['path']
}
return {
rot,
path: pathType,
colors: colors.sort((a, b) => parseInt(a.pos) - parseInt(b.pos)),
}
}
export function getPatternFill(node, warpObj) {
if (!node) return null
const pattFill = node['a:pattFill']
if (!pattFill) return null
const type = getTextByPathList(pattFill, ['attrs', 'prst'])
const fgColorNode = pattFill['a:fgClr']
const bgColorNode = pattFill['a:bgClr']
let foregroundColor = '#000000'
let backgroundColor = '#FFFFFF'
if (fgColorNode) {
foregroundColor = getSolidFill(fgColorNode, undefined, undefined, warpObj)
}
if (bgColorNode) {
backgroundColor = getSolidFill(bgColorNode, undefined, undefined, warpObj)
}
return {
type,
foregroundColor,
backgroundColor,
}
}
export function getBgGradientFill(bgPr, phClr, slideMasterContent, warpObj) {
if (bgPr) {
const grdFill = bgPr['a:gradFill']
const gsLst = grdFill['a:gsLst']['a:gs']
const colors = []
for (let i = 0; i < gsLst.length; i++) {
const lo_color = getSolidFill(gsLst[i], slideMasterContent['p:sldMaster']['p:clrMap']['attrs'], phClr, warpObj)
const pos = getTextByPathList(gsLst[i], ['attrs', 'pos'])
colors[i] = {
pos: pos ? (pos / 1000 + '%') : '',
color: lo_color,
}
}
const lin = grdFill['a:lin']
let rot = 0
let pathType = 'line'
if (lin) rot = angleToDegrees(lin['attrs']['ang']) + 0
else {
const path = grdFill['a:path']
if (path && path['attrs'] && path['attrs']['path']) pathType = path['attrs']['path']
}
return {
rot,
path: pathType,
colors: colors.sort((a, b) => parseInt(a.pos) - parseInt(b.pos)),
}
}
else if (phClr) {
return phClr.indexOf('#') === -1 ? `#${phClr}` : phClr
}
return null
}
export async function getSlideBackgroundFill(warpObj) {
const slideContent = warpObj['slideContent']
const slideLayoutContent = warpObj['slideLayoutContent']
const slideMasterContent = warpObj['slideMasterContent']
let bgPr = getTextByPathList(slideContent, ['p:sld', 'p:cSld', 'p:bg', 'p:bgPr'])
let bgRef = getTextByPathList(slideContent, ['p:sld', 'p:cSld', 'p:bg', 'p:bgRef'])
let background = '#fff'
let backgroundType = 'color'
if (bgPr) {
const bgFillTyp = getFillType(bgPr)
if (bgFillTyp === 'SOLID_FILL') {
const sldFill = bgPr['a:solidFill']
let clrMapOvr
const sldClrMapOvr = getTextByPathList(slideContent, ['p:sld', 'p:clrMapOvr', 'a:overrideClrMapping', 'attrs'])
if (sldClrMapOvr) clrMapOvr = sldClrMapOvr
else {
const sldClrMapOvr = getTextByPathList(slideLayoutContent, ['p:sldLayout', 'p:clrMapOvr', 'a:overrideClrMapping', 'attrs'])
if (sldClrMapOvr) clrMapOvr = sldClrMapOvr
else clrMapOvr = getTextByPathList(slideMasterContent, ['p:sldMaster', 'p:clrMap', 'attrs'])
}
const sldBgClr = getSolidFill(sldFill, clrMapOvr, undefined, warpObj)
background = sldBgClr
}
else if (bgFillTyp === 'GRADIENT_FILL') {
const gradientFill = getBgGradientFill(bgPr, undefined, slideMasterContent, warpObj)
if (typeof gradientFill === 'string') {
background = gradientFill
}
else if (gradientFill) {
background = gradientFill
backgroundType = 'gradient'
}
}
else if (bgFillTyp === 'PIC_FILL') {
background = await getBgPicFill(bgPr, 'slideBg', warpObj)
backgroundType = 'image'
}
else if (bgFillTyp === 'PATTERN_FILL') {
const patternFill = getPatternFill(bgPr, warpObj)
if (patternFill) {
background = patternFill
backgroundType = 'pattern'
}
}
}
else if (bgRef) {
let clrMapOvr
const sldClrMapOvr = getTextByPathList(slideContent, ['p:sld', 'p:clrMapOvr', 'a:overrideClrMapping', 'attrs'])
if (sldClrMapOvr) clrMapOvr = sldClrMapOvr
else {
const sldClrMapOvr = getTextByPathList(slideLayoutContent, ['p:sldLayout', 'p:clrMapOvr', 'a:overrideClrMapping', 'attrs'])
if (sldClrMapOvr) clrMapOvr = sldClrMapOvr
else clrMapOvr = getTextByPathList(slideMasterContent, ['p:sldMaster', 'p:clrMap', 'attrs'])
}
const phClr = getSolidFill(bgRef, clrMapOvr, undefined, warpObj)
const idx = Number(bgRef['attrs']['idx'])
if (idx > 1000) {
const trueIdx = idx - 1000
const bgFillLst = warpObj['themeContent']['a:theme']['a:themeElements']['a:fmtScheme']['a:bgFillStyleLst']
const sortblAry = []
Object.keys(bgFillLst).forEach(key => {
const bgFillLstTyp = bgFillLst[key]
if (key !== 'attrs') {
if (bgFillLstTyp.constructor === Array) {
for (let i = 0; i < bgFillLstTyp.length; i++) {
const obj = {}
obj[key] = bgFillLstTyp[i]
if (bgFillLstTyp[i]['attrs']) {
obj['idex'] = bgFillLstTyp[i]['attrs']['order']
obj['attrs'] = {
'order': bgFillLstTyp[i]['attrs']['order']
}
}
sortblAry.push(obj)
}
}
else {
const obj = {}
obj[key] = bgFillLstTyp
if (bgFillLstTyp['attrs']) {
obj['idex'] = bgFillLstTyp['attrs']['order']
obj['attrs'] = {
'order': bgFillLstTyp['attrs']['order']
}
}
sortblAry.push(obj)
}
}
})
const sortByOrder = sortblAry.slice(0)
sortByOrder.sort((a, b) => a.idex - b.idex)
const bgFillLstIdx = sortByOrder[trueIdx - 1]
const bgFillTyp = getFillType(bgFillLstIdx)
if (bgFillTyp === 'SOLID_FILL') {
const sldFill = bgFillLstIdx['a:solidFill']
const sldBgClr = getSolidFill(sldFill, clrMapOvr, undefined, warpObj)
background = sldBgClr
}
else if (bgFillTyp === 'GRADIENT_FILL') {
const gradientFill = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent, warpObj)
if (typeof gradientFill === 'string') {
background = gradientFill
}
else if (gradientFill) {
background = gradientFill
backgroundType = 'gradient'
}
}
}
}
else {
bgPr = getTextByPathList(slideLayoutContent, ['p:sldLayout', 'p:cSld', 'p:bg', 'p:bgPr'])
bgRef = getTextByPathList(slideLayoutContent, ['p:sldLayout', 'p:cSld', 'p:bg', 'p:bgRef'])
let clrMapOvr
const sldClrMapOvr = getTextByPathList(slideLayoutContent, ['p:sldLayout', 'p:clrMapOvr', 'a:overrideClrMapping', 'attrs'])
if (sldClrMapOvr) clrMapOvr = sldClrMapOvr
else clrMapOvr = getTextByPathList(slideMasterContent, ['p:sldMaster', 'p:clrMap', 'attrs'])
if (bgPr) {
const bgFillTyp = getFillType(bgPr)
if (bgFillTyp === 'SOLID_FILL') {
const sldFill = bgPr['a:solidFill']
const sldBgClr = getSolidFill(sldFill, clrMapOvr, undefined, warpObj)
background = sldBgClr
}
else if (bgFillTyp === 'GRADIENT_FILL') {
const gradientFill = getBgGradientFill(bgPr, undefined, slideMasterContent, warpObj)
if (typeof gradientFill === 'string') {
background = gradientFill
}
else if (gradientFill) {
background = gradientFill
backgroundType = 'gradient'
}
}
else if (bgFillTyp === 'PIC_FILL') {
background = await getBgPicFill(bgPr, 'slideLayoutBg', warpObj)
backgroundType = 'image'
}
else if (bgFillTyp === 'PATTERN_FILL') {
const patternFill = getPatternFill(bgPr, warpObj)
if (patternFill) {
background = patternFill
backgroundType = 'pattern'
}
}
}
else if (bgRef) {
const phClr = getSolidFill(bgRef, clrMapOvr, undefined, warpObj)
const idx = Number(bgRef['attrs']['idx'])
if (idx > 1000) {
const trueIdx = idx - 1000
const bgFillLst = warpObj['themeContent']['a:theme']['a:themeElements']['a:fmtScheme']['a:bgFillStyleLst']
const sortblAry = []
Object.keys(bgFillLst).forEach(key => {
const bgFillLstTyp = bgFillLst[key]
if (key !== 'attrs') {
if (bgFillLstTyp.constructor === Array) {
for (let i = 0; i < bgFillLstTyp.length; i++) {
const obj = {}
obj[key] = bgFillLstTyp[i]
if (bgFillLstTyp[i]['attrs']) {
obj['idex'] = bgFillLstTyp[i]['attrs']['order']
obj['attrs'] = {
'order': bgFillLstTyp[i]['attrs']['order']
}
}
sortblAry.push(obj)
}
}
else {
const obj = {}
obj[key] = bgFillLstTyp
if (bgFillLstTyp['attrs']) {
obj['idex'] = bgFillLstTyp['attrs']['order']
obj['attrs'] = {
'order': bgFillLstTyp['attrs']['order']
}
}
sortblAry.push(obj)
}
}
})
const sortByOrder = sortblAry.slice(0)
sortByOrder.sort((a, b) => a.idex - b.idex)
const bgFillLstIdx = sortByOrder[trueIdx - 1]
const bgFillTyp = getFillType(bgFillLstIdx)
if (bgFillTyp === 'SOLID_FILL') {
const sldFill = bgFillLstIdx['a:solidFill']
const sldBgClr = getSolidFill(sldFill, clrMapOvr, undefined, warpObj)
background = sldBgClr
}
else if (bgFillTyp === 'GRADIENT_FILL') {
const gradientFill = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent, warpObj)
if (typeof gradientFill === 'string') {
background = gradientFill
}
else if (gradientFill) {
background = gradientFill
backgroundType = 'gradient'
}
}
else if (bgFillTyp === 'PIC_FILL') {
background = await getBgPicFill(bgFillLstIdx, 'themeBg', warpObj)
backgroundType = 'image'
}
else if (bgFillTyp === 'PATTERN_FILL') {
const patternFill = getPatternFill(bgFillLstIdx, warpObj)
if (patternFill) {
background = patternFill
backgroundType = 'pattern'
}
}
}
}
else {
bgPr = getTextByPathList(slideMasterContent, ['p:sldMaster', 'p:cSld', 'p:bg', 'p:bgPr'])
bgRef = getTextByPathList(slideMasterContent, ['p:sldMaster', 'p:cSld', 'p:bg', 'p:bgRef'])
const clrMap = getTextByPathList(slideMasterContent, ['p:sldMaster', 'p:clrMap', 'attrs'])
if (bgPr) {
const bgFillTyp = getFillType(bgPr)
if (bgFillTyp === 'SOLID_FILL') {
const sldFill = bgPr['a:solidFill']
const sldBgClr = getSolidFill(sldFill, clrMap, undefined, warpObj)
background = sldBgClr
}
else if (bgFillTyp === 'GRADIENT_FILL') {
const gradientFill = getBgGradientFill(bgPr, undefined, slideMasterContent, warpObj)
if (typeof gradientFill === 'string') {
background = gradientFill
}
else if (gradientFill) {
background = gradientFill
backgroundType = 'gradient'
}
}
else if (bgFillTyp === 'PIC_FILL') {
background = await getBgPicFill(bgPr, 'slideMasterBg', warpObj)
backgroundType = 'image'
}
else if (bgFillTyp === 'PATTERN_FILL') {
const patternFill = getPatternFill(bgPr, warpObj)
if (patternFill) {
background = patternFill
backgroundType = 'pattern'
}
}
}
else if (bgRef) {
const phClr = getSolidFill(bgRef, clrMap, undefined, warpObj)
const idx = Number(bgRef['attrs']['idx'])
if (idx > 1000) {
const trueIdx = idx - 1000
const bgFillLst = warpObj['themeContent']['a:theme']['a:themeElements']['a:fmtScheme']['a:bgFillStyleLst']
const sortblAry = []
Object.keys(bgFillLst).forEach(key => {
const bgFillLstTyp = bgFillLst[key]
if (key !== 'attrs') {
if (bgFillLstTyp.constructor === Array) {
for (let i = 0; i < bgFillLstTyp.length; i++) {
const obj = {}
obj[key] = bgFillLstTyp[i]
if (bgFillLstTyp[i]['attrs']) {
obj['idex'] = bgFillLstTyp[i]['attrs']['order']
obj['attrs'] = {
'order': bgFillLstTyp[i]['attrs']['order']
}
}
sortblAry.push(obj)
}
}
else {
const obj = {}
obj[key] = bgFillLstTyp
if (bgFillLstTyp['attrs']) {
obj['idex'] = bgFillLstTyp['attrs']['order']
obj['attrs'] = {
'order': bgFillLstTyp['attrs']['order']
}
}
sortblAry.push(obj)
}
}
})
const sortByOrder = sortblAry.slice(0)
sortByOrder.sort((a, b) => a.idex - b.idex)
const bgFillLstIdx = sortByOrder[trueIdx - 1]
const bgFillTyp = getFillType(bgFillLstIdx)
if (bgFillTyp === 'SOLID_FILL') {
const sldFill = bgFillLstIdx['a:solidFill']
const sldBgClr = getSolidFill(sldFill, clrMapOvr, undefined, warpObj)
background = sldBgClr
}
else if (bgFillTyp === 'GRADIENT_FILL') {
const gradientFill = getBgGradientFill(bgFillLstIdx, phClr, slideMasterContent, warpObj)
if (typeof gradientFill === 'string') {
background = gradientFill
}
else if (gradientFill) {
background = gradientFill
backgroundType = 'gradient'
}
}
else if (bgFillTyp === 'PIC_FILL') {
background = await getBgPicFill(bgFillLstIdx, 'themeBg', warpObj)
backgroundType = 'image'
}
else if (bgFillTyp === 'PATTERN_FILL') {
const patternFill = getPatternFill(bgFillLstIdx, warpObj)
if (patternFill) {
background = patternFill
backgroundType = 'pattern'
}
}
}
}
}
}
return {
type: backgroundType,
value: background,
}
}
export async function getShapeFill(node, warpObj, source, groupHierarchy = []) {
const fillType = getFillType(getTextByPathList(node, ['p:spPr']))
let type = 'color'
let fillValue = ''
if (fillType === 'NO_FILL') {
return null
}
else if (fillType === 'SOLID_FILL') {
const shpFill = node['p:spPr']['a:solidFill']
fillValue = getSolidFill(shpFill, undefined, undefined, warpObj)
type = 'color'
}
else if (fillType === 'GRADIENT_FILL') {
const shpFill = node['p:spPr']['a:gradFill']
fillValue = getGradientFill(shpFill, warpObj)
type = 'gradient'
}
else if (fillType === 'PIC_FILL') {
const shpFill = node['p:spPr']['a:blipFill']
const picBase64 = await getPicFill(source, shpFill, warpObj)
const opacity = getPicFillOpacity(shpFill)
fillValue = {
picBase64,
opacity,
}
type = 'image'
}
else if (fillType === 'PATTERN_FILL') {
const shpFill = node['p:spPr']['a:pattFill']
fillValue = getPatternFill({ 'a:pattFill': shpFill }, warpObj)
type = 'pattern'
}
else if (fillType === 'GROUP_FILL') {
return findFillInGroupHierarchy(groupHierarchy, warpObj, source)
}
if (!fillValue) {
const clrName = getTextByPathList(node, ['p:style', 'a:fillRef'])
fillValue = getSolidFill(clrName, undefined, undefined, warpObj)
type = 'color'
}
if (!fillValue) {
return null
}
return {
type,
value: fillValue,
}
}
async function findFillInGroupHierarchy(groupHierarchy, warpObj, source) {
for (const groupNode of groupHierarchy) {
if (!groupNode || !groupNode['p:grpSpPr']) continue
const grpSpPr = groupNode['p:grpSpPr']
const fillType = getFillType(grpSpPr)
if (fillType === 'SOLID_FILL') {
const shpFill = grpSpPr['a:solidFill']
const fillValue = getSolidFill(shpFill, undefined, undefined, warpObj)
if (fillValue) {
return {
type: 'color',
value: fillValue,
}
}
}
else if (fillType === 'GRADIENT_FILL') {
const shpFill = grpSpPr['a:gradFill']
const fillValue = getGradientFill(shpFill, warpObj)
if (fillValue) {
return {
type: 'gradient',
value: fillValue,
}
}
}
else if (fillType === 'PIC_FILL') {
const shpFill = grpSpPr['a:blipFill']
const picBase64 = await getPicFill(source, shpFill, warpObj)
const opacity = getPicFillOpacity(shpFill)
if (picBase64) {
return {
type: 'image',
value: {
picBase64,
opacity,
},
}
}
}
else if (fillType === 'PATTERN_FILL') {
const shpFill = grpSpPr['a:pattFill']
const fillValue = getPatternFill({ 'a:pattFill': shpFill }, warpObj)
if (fillValue) {
return {
type: 'pattern',
value: fillValue,
}
}
}
}
return null
}
export function getSolidFill(solidFill, clrMap, phClr, warpObj) {
if (!solidFill) return ''
let color = ''
let clrNode
if (solidFill['a:srgbClr']) {
clrNode = solidFill['a:srgbClr']
color = getTextByPathList(clrNode, ['attrs', 'val'])
}
else if (solidFill['a:schemeClr']) {
clrNode = solidFill['a:schemeClr']
const schemeClr = 'a:' + getTextByPathList(clrNode, ['attrs', 'val'])
color = getSchemeColorFromTheme(schemeClr, warpObj, clrMap, phClr) || ''
}
else if (solidFill['a:scrgbClr']) {
clrNode = solidFill['a:scrgbClr']
const defBultColorVals = clrNode['attrs']
const red = (defBultColorVals['r'].indexOf('%') !== -1) ? defBultColorVals['r'].split('%').shift() : defBultColorVals['r']
const green = (defBultColorVals['g'].indexOf('%') !== -1) ? defBultColorVals['g'].split('%').shift() : defBultColorVals['g']
const blue = (defBultColorVals['b'].indexOf('%') !== -1) ? defBultColorVals['b'].split('%').shift() : defBultColorVals['b']
color = toHex(255 * (Number(red) / 100)) + toHex(255 * (Number(green) / 100)) + toHex(255 * (Number(blue) / 100))
}
else if (solidFill['a:prstClr']) {
clrNode = solidFill['a:prstClr']
const prstClr = getTextByPathList(clrNode, ['attrs', 'val'])
color = getColorName2Hex(prstClr)
}
else if (solidFill['a:hslClr']) {
clrNode = solidFill['a:hslClr']
const defBultColorVals = clrNode['attrs']
const hue = Number(defBultColorVals['hue']) / 100000
const sat = Number((defBultColorVals['sat'].indexOf('%') !== -1) ? defBultColorVals['sat'].split('%').shift() : defBultColorVals['sat']) / 100
const lum = Number((defBultColorVals['lum'].indexOf('%') !== -1) ? defBultColorVals['lum'].split('%').shift() : defBultColorVals['lum']) / 100
const hsl2rgb = hslToRgb(hue, sat, lum)
color = toHex(hsl2rgb.r) + toHex(hsl2rgb.g) + toHex(hsl2rgb.b)
}
else if (solidFill['a:sysClr']) {
clrNode = solidFill['a:sysClr']
const sysClr = getTextByPathList(clrNode, ['attrs', 'lastClr'])
if (sysClr) color = sysClr
}
let isAlpha = false
const alpha = parseInt(getTextByPathList(clrNode, ['a:alpha', 'attrs', 'val'])) / 100000
if (!isNaN(alpha)) {
const al_color = tinycolor(color)
al_color.setAlpha(alpha)
color = al_color.toHex8()
isAlpha = true
}
const hueMod = parseInt(getTextByPathList(clrNode, ['a:hueMod', 'attrs', 'val'])) / 100000
if (!isNaN(hueMod)) {
color = applyHueMod(color, hueMod, isAlpha)
}
const lumMod = parseInt(getTextByPathList(clrNode, ['a:lumMod', 'attrs', 'val'])) / 100000
if (!isNaN(lumMod)) {
color = applyLumMod(color, lumMod, isAlpha)
}
const lumOff = parseInt(getTextByPathList(clrNode, ['a:lumOff', 'attrs', 'val'])) / 100000
if (!isNaN(lumOff)) {
color = applyLumOff(color, lumOff, isAlpha)
}
const satMod = parseInt(getTextByPathList(clrNode, ['a:satMod', 'attrs', 'val'])) / 100000
if (!isNaN(satMod)) {
color = applySatMod(color, satMod, isAlpha)
}
const shade = parseInt(getTextByPathList(clrNode, ['a:shade', 'attrs', 'val'])) / 100000
if (!isNaN(shade)) {
color = applyShade(color, shade, isAlpha)
}
const tint = parseInt(getTextByPathList(clrNode, ['a:tint', 'attrs', 'val'])) / 100000
if (!isNaN(tint)) {
color = applyTint(color, tint, isAlpha)
}
if (color && color.indexOf('#') === -1) color = '#' + color
return color
}