File size: 7,956 Bytes
07c3cdd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/background-image-create {         % => Data-or-/null
  dup /null eq {                   % => /null
  } {                              % => Mask Image Init SY SX
    image-create
  } ifelse
} def

/background-image-show {           % => Position Repeat Box Viewport Image
  dup /null ne {
% Setup clipping region for padding area
    gsave

    2 index get-left-padding
    3 index get-bottom-padding
    4 index get-right-padding 
    5 index get-left-padding sub
    5 index get-top-padding
    6 index get-bottom-padding sub 
    rectclip

% Determine the vertical an horizontal offset for the image
    2 index /get-width call-method
    3 index get-padding-left add
    3 index get-padding-right add  % => Position Repeat box viewport Image PaddingWidth

    3 index get-height
    4 index get-padding-top add
    4 index get-padding-bottom add % => Position Repeat box viewport Image PaddingWidth PadingHeight

    6 index /x get /percentage get {
      1 index                      % => Position Repeat box viewport Image PaddingWidth PadingHeight PaddingWidth
      3 index /SX get px sub       % => Position Repeat box viewport Image PaddingWidth PadingHeight (PaddingWidth-ImageWidth*px)
      7 index /x get /value get mul 100 div
    } {
      6 index /x get /value get
    } ifelse                       % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset

    7 index /y get /percentage get {
      1 index                      % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset PaddingHeight
      4 index /SY get px sub
      8 index /y get /value get mul 100 div
    } {
      7 index /y get /value get
    } ifelse                       % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset

% NOTE: px2pt(1) make a scaing factor for PDF output
% NOTE: background-image is positioned relative to PADDING corner and drawn in the PADDING area!
    {                              % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
      7 index                      % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset Repeat
      
      dup /no-repeat eq {
        pop
        
        1 px                       % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset Scale
        7 index get-top-padding
        6 index /SY get px sub
        1 index sub                % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset Scale Y
        8 index get-left-padding
        4 index add                % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset Scale Y X
        7 index
        image-show-simple
        
        exit
      } if
      
      dup /repeat-x eq {
        pop

        1 px                       % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset Scale
        1 index
        3 index                    % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset
        9 index get-right-padding  % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX
        8 index /SX get px         % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX
        11 index get-top-padding
        10 index /SY get px sub
        4 index sub                % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX Y
        12 index get-left-padding
        4 index add                % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX Y X
        11 index                   % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX Y X Image
        image-show-repeat-x
        
        exit
      } if
      
      dup /repeat-y eq {
        pop
        
        1 px                       % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset Scale
        1 index
        3 index                    % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset
        9 index get-bottom-padding % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX
        8 index /SY get px         % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX
        11 index get-top-padding
        10 index /SY get px sub
        4 index sub                % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX Y
        12 index get-left-padding
        4 index add                % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX Y X
        11 index                   % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TX SX Y X Image
        image-show-repeat-y

        exit
      } if
      
% /repeat (default)
      pop

      1 px                         % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale
      1 index 3 index              % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset
      9 index get-bottom-padding   % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY
      10 index get-right-padding   % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY TX
      9 index /SY get px           % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY TX SY
      10 index /SX get px          % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY TX SY SX
      13 index get-top-padding
      12 index /SY get px sub
      6 index add                  % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY TX SY SX Y
      14 index get-left-padding
      6 index add                  % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY TX SY SX Y X
      13 index                     % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   %    Scale YOffset XOffset TY TX SY SX Y X
      image-show-repeat-xy         % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
                                   
      exit
    } loop                         % => Position Repeat box viewport Image PaddingWidth PadingHeight XOffset YOffset
    pop pop pop pop

% return to the previous clipping area
    grestore

  } if                             % => Position Repeat Box Viewport Image

  pop pop pop pop pop
} def