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
use super::*;
use std::mem;
use foreign_types::ForeignTypeRef;

impl<'a> Tag<'a> {
    pub fn is_none(&self) -> bool {
        match *self {
            Tag::None => true,
            _ => false,
        }
    }

    pub unsafe fn new(sig: TagSignature, data: *const u8) -> Self {
        if data.is_null() {
            return Tag::None;
        }
        match sig {
            TagSignature::BlueColorantTag => Tag::CIEXYZ(mem::transmute(data)),
            TagSignature::GreenColorantTag => Tag::CIEXYZ(mem::transmute(data)),
            TagSignature::LuminanceTag => Tag::CIEXYZ(mem::transmute(data)),
            TagSignature::MediaBlackPointTag => Tag::CIEXYZ(mem::transmute(data)),
            TagSignature::MediaWhitePointTag => Tag::CIEXYZ(mem::transmute(data)),
            TagSignature::RedColorantTag => Tag::CIEXYZ(mem::transmute(data)),
            TagSignature::CharTargetTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::CopyrightTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::DeviceMfgDescTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::DeviceModelDescTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::ProfileDescriptionTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::ScreeningDescTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::ViewingCondDescTag => Tag::MLU(MLURef::from_ptr(data as *mut _)),
            TagSignature::ChromaticityTag => Tag::CIExyYTRIPLE(mem::transmute(data)),
            TagSignature::ChromaticAdaptationTag => Tag::CIExyYTRIPLE(mem::transmute(data)),
            TagSignature::ColorantTableTag => Tag::NAMEDCOLORLIST(NamedColorListRef::from_ptr(data as *mut _)),
            TagSignature::ColorantTableOutTag => Tag::NAMEDCOLORLIST(NamedColorListRef::from_ptr(data as *mut _)),
            TagSignature::CrdInfoTag => Tag::NAMEDCOLORLIST(NamedColorListRef::from_ptr(data as *mut _)),
            TagSignature::NamedColor2Tag => Tag::NAMEDCOLORLIST(NamedColorListRef::from_ptr(data as *mut _)),
            TagSignature::DataTag => Tag::ICCData(mem::transmute(data)),
            TagSignature::Ps2CRD0Tag => Tag::ICCData(mem::transmute(data)),
            TagSignature::Ps2CRD1Tag => Tag::ICCData(mem::transmute(data)),
            TagSignature::Ps2CRD2Tag => Tag::ICCData(mem::transmute(data)),
            TagSignature::Ps2CRD3Tag => Tag::ICCData(mem::transmute(data)),
            TagSignature::Ps2CSATag => Tag::ICCData(mem::transmute(data)),
            TagSignature::Ps2RenderingIntentTag => Tag::ICCData(mem::transmute(data)),
            TagSignature::AToB0Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::AToB1Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::AToB2Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToA0Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToA1Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToA2Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::DToB0Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::DToB1Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::DToB2Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::DToB3Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToD0Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToD1Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToD2Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BToD3Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::GamutTag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::Preview0Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::Preview1Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::Preview2Tag => Tag::Pipeline(PipelineRef::from_ptr(data as *mut _)),
            TagSignature::BlueTRCTag => Tag::ToneCurve(ToneCurveRef::from_ptr(data as *mut _)),
            TagSignature::GrayTRCTag => Tag::ToneCurve(ToneCurveRef::from_ptr(data as *mut _)),
            TagSignature::GreenTRCTag => Tag::ToneCurve(ToneCurveRef::from_ptr(data as *mut _)),
            TagSignature::RedTRCTag => Tag::ToneCurve(ToneCurveRef::from_ptr(data as *mut _)),
            TagSignature::ColorimetricIntentImageStateTag => {
                Tag::Signature(mem::transmute(data))
            }
            TagSignature::PerceptualRenderingIntentGamutTag => {
                Tag::Signature(mem::transmute(data))
            }
            TagSignature::SaturationRenderingIntentGamutTag => {
                Tag::Signature(mem::transmute(data))
            }
            TagSignature::TechnologyTag => Tag::Technology(*(data as *const ffi::TechnologySignature)),
            TagSignature::MeasurementTag => Tag::ICCMeasurementConditions(mem::transmute(data)),
            TagSignature::ProfileSequenceDescTag => Tag::SEQ(mem::transmute(data)),
            TagSignature::ProfileSequenceIdTag => Tag::SEQ(mem::transmute(data)),
            TagSignature::ScreeningTag => Tag::Screening(mem::transmute(data)),
            TagSignature::UcrBgTag => Tag::UcrBg(mem::transmute(data)),
            TagSignature::ViewingConditionsTag => {
                Tag::ICCViewingConditions(mem::transmute(data))
            }
            _ => Tag::None,
        }
    }
}