forked from unidoc/unidoc
/
utils.go
95 lines (82 loc) · 2.75 KB
/
utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
* This file is subject to the terms and conditions defined in
* file 'LICENSE.md', which is part of this source code package.
*/
package contentstream
import (
"errors"
"github.com/unidoc/unidoc/common"
"github.com/unidoc/unidoc/pdf/core"
"github.com/unidoc/unidoc/pdf/model"
)
func makeParamsFromFloats(vals []float64) []core.PdfObject {
params := []core.PdfObject{}
for _, val := range vals {
params = append(params, core.MakeFloat(val))
}
return params
}
func makeParamsFromNames(vals []core.PdfObjectName) []core.PdfObject {
params := []core.PdfObject{}
for _, val := range vals {
params = append(params, core.MakeName(string(val)))
}
return params
}
func makeParamsFromStrings(vals []core.PdfObjectString) []core.PdfObject {
params := []core.PdfObject{}
for _, val := range vals {
params = append(params, core.MakeString(string(val)))
}
return params
}
func makeParamsFromInts(vals []int64) []core.PdfObject {
params := []core.PdfObject{}
for _, val := range vals {
params = append(params, core.MakeInteger(val))
}
return params
}
func newIndexedColorspaceFromPdfObject(obj core.PdfObject) (model.PdfColorspace, error) {
arr, ok := obj.(*core.PdfObjectArray)
if !ok {
common.Log.Debug("Error: Invalid indexed cs not in array (%#v)", obj)
return nil, errors.New("Type check error")
}
if len(*arr) != 4 {
common.Log.Debug("Error: Invalid cs array, length != 4 (%d)", len(*arr))
return nil, errors.New("Range check error")
}
// Format is [/I base 255 bytes], where base = /G,/RGB,/CMYK
name, ok := (*arr)[0].(*core.PdfObjectName)
if !ok {
common.Log.Debug("Error: Invalid cs array first element not a name (array: %#v)", *arr)
return nil, errors.New("Type check error")
}
if *name != "I" && *name != "Indexed" {
common.Log.Debug("Error: Invalid cs array first element != I (got: %v)", *name)
return nil, errors.New("Range check error")
}
// Check base
name, ok = (*arr)[1].(*core.PdfObjectName)
if !ok {
common.Log.Debug("Error: Invalid cs array 2nd element not a name (array: %#v)", *arr)
return nil, errors.New("Type check error")
}
if *name != "G" && *name != "RGB" && *name != "CMYK" && *name != "DeviceGray" && *name != "DeviceRGB" && *name != "DeviceCMYK" {
common.Log.Debug("Error: Invalid cs array 2nd element != G/RGB/CMYK (got: %v)", *name)
return nil, errors.New("Range check error")
}
basename := ""
switch *name {
case "G", "DeviceGray":
basename = "DeviceGray"
case "RGB", "DeviceRGB":
basename = "DeviceRGB"
case "CMYK", "DeviceCMYK":
basename = "DeviceCMYK"
}
// Prepare to a format that can be loaded by model's newPdfColorspaceFromPdfObject.
csArr := core.MakeArray(core.MakeName("Indexed"), core.MakeName(basename), (*arr)[2], (*arr)[3])
return model.NewPdfColorspaceFromPdfObject(csArr)
}