mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-30 01:27:26 +08:00
1 parent
c8a163a077
commit
0351dd54f5
31 files changed
+993
-311
No files matched your search
+64
-23
@@ -16,54 +16,78 @@ package ofdgo
|
||||
|
||||
import "github.com/xiaoqidun/pdfgo"
|
||||
|
||||
// pdfTransferKey 区分图形状态与网屏覆盖函数
|
||||
// 图案标记保留设备四色通道及非零对象形状
|
||||
const (
|
||||
pdfTransferChannels uint8 = 15
|
||||
pdfTransferShape uint8 = 16
|
||||
)
|
||||
|
||||
// pdfTransferKey 区分图形状态、网屏覆盖函数及输出设备
|
||||
type pdfTransferKey struct {
|
||||
transfer *pdfgo.TransferFunction
|
||||
halftone *pdfgo.Halftone
|
||||
model pdfgo.Name
|
||||
}
|
||||
|
||||
// resolveTransfer 在页面内复用连续RGB设备的有效传递函数
|
||||
// 入参: style 原始图形状态与有效输出状态
|
||||
// 返回: error 网屏传递函数错误
|
||||
func (p *pdfImporter) resolveTransfer(style *pdfgo.Style) error {
|
||||
// resolveTransfer 在页面内复用输出设备的有效函数,不修改原始图形状态
|
||||
// 入参: style 原始图形状态, model 原生设备颜色空间
|
||||
// 返回: *pdfgo.TransferFunction 有效函数, error 网屏传递函数错误
|
||||
func (p *pdfImporter) resolveTransfer(style pdfgo.Style, model pdfgo.Name) (*pdfgo.TransferFunction, error) {
|
||||
if style.Halftone == nil && style.Transfer == nil {
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
if model == "" {
|
||||
model = "DeviceRGB"
|
||||
}
|
||||
cache := p.compositingCache()
|
||||
if cache.transfers == nil {
|
||||
cache.transfers = make(map[pdfTransferKey]*pdfgo.TransferFunction)
|
||||
}
|
||||
key := pdfTransferKey{style.Transfer, style.Halftone}
|
||||
key := pdfTransferKey{style.Transfer, style.Halftone, model}
|
||||
transfer, found := cache.transfers[key]
|
||||
if !found {
|
||||
var err error
|
||||
transfer, err = p.reader.DeviceTransfer(style.Transfer, style.Halftone, "DeviceRGB")
|
||||
transfer, err = p.reader.DeviceTransfer(style.Transfer, style.Halftone, model)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
cache.transfers[key] = transfer
|
||||
}
|
||||
style.Transfer = transfer
|
||||
return nil
|
||||
return transfer, nil
|
||||
}
|
||||
|
||||
// pdfCompositeHasTransfer 检查页面是否需要保留最终设备传递函数
|
||||
// 入参: nodes 原始图元及透明组
|
||||
// 返回: bool 是否存在非恒等函数
|
||||
func pdfCompositeHasTransfer(nodes []pdfCompositeNode) bool {
|
||||
// compositeHasTransfer 检查最终设备使用的通道,不将备用通道误判为有效函数
|
||||
// 入参: nodes 原始图元及透明组, model 原生设备颜色空间
|
||||
// 返回: bool 是否存在非恒等函数, error 网屏函数错误
|
||||
func (p *pdfImporter) compositeHasTransfer(nodes []pdfCompositeNode, model pdfgo.Name) (bool, error) {
|
||||
for _, node := range nodes {
|
||||
if node.group != nil {
|
||||
if pdfCompositeHasTransfer(node.children) {
|
||||
return true
|
||||
if found, err := p.compositeHasTransfer(node.children, model); err != nil || found {
|
||||
return found, err
|
||||
}
|
||||
} else {
|
||||
style, _, _ := node.style()
|
||||
if style.Transfer != nil {
|
||||
return true
|
||||
transfer, err := p.resolveTransfer(style, model)
|
||||
if err != nil || transfer != nil {
|
||||
return transfer != nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// transferDevice 为四色叠印保留原生设备通道,其余页面使用连续RGB设备
|
||||
// 入参: space 页面混合空间, nodes 参与合成的图元
|
||||
// 返回: pdfgo.Name 原生设备空间, error 图案或图像解析错误
|
||||
func (p *pdfImporter) transferDevice(space *pdfgo.ColorSpace, nodes []pdfCompositeNode) (pdfgo.Name, error) {
|
||||
if space.Model == "DeviceCMYK" && !space.Calibrated() {
|
||||
if found, err := p.processOverprint(nodes); err != nil {
|
||||
return "", err
|
||||
} else if found {
|
||||
return "DeviceCMYK", nil
|
||||
}
|
||||
}
|
||||
return "DeviceRGB", nil
|
||||
}
|
||||
|
||||
// selectTransfer 按最上层基本图元及祖先的不透明状态选择最终设备函数
|
||||
@@ -78,8 +102,9 @@ func (c *pdfCompositor) selectTransfer(node pdfCompositeNode, outline bool) (*pd
|
||||
if c.transferBlocked || paint.Alpha != 1 || style.SoftMask != nil || !pdfNormalBlend(style.BlendMode) {
|
||||
return nil, nil
|
||||
}
|
||||
if style.Transfer == nil {
|
||||
return nil, nil
|
||||
transfer, err := c.importer.resolveTransfer(style, c.transferModel)
|
||||
if err != nil || transfer == nil {
|
||||
return transfer, err
|
||||
}
|
||||
if pattern := paint.Shading; pattern != nil && (node.image == nil || node.image.Image.ImageMask) {
|
||||
inner := pattern.Style
|
||||
@@ -103,7 +128,23 @@ func (c *pdfCompositor) selectTransfer(node pdfCompositeNode, outline bool) (*pd
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
return style.Transfer, nil
|
||||
return transfer, nil
|
||||
}
|
||||
|
||||
// pdfPaintChannels 选择兼容叠印实际使用源颜色的通道
|
||||
// 入参: values 源四色分量, compatible 是否保留零分量背景, marked 指定通道,nil表示全部
|
||||
// 返回: [4]bool 各通道是否取源颜色
|
||||
func pdfPaintChannels(values [4]float64, compatible bool, marked *[4]bool) [4]bool {
|
||||
channels := [4]bool{true, true, true, true}
|
||||
if marked != nil {
|
||||
channels = *marked
|
||||
}
|
||||
if compatible {
|
||||
for i := range channels {
|
||||
channels[i] = channels[i] && values[i] != 0
|
||||
}
|
||||
}
|
||||
return channels
|
||||
}
|
||||
|
||||
// opaqueTransfer 复用图案不透明性检查,图案内部函数不提前作用于源颜色
|
||||
|
||||
Reference in new issue
Block a user