• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.graphics.pdf;
18 
19 import android.annotation.FlaggedApi;
20 import android.annotation.IntDef;
21 import android.annotation.NonNull;
22 import android.graphics.pdf.flags.Flags;
23 
24 import java.lang.annotation.Retention;
25 import java.lang.annotation.RetentionPolicy;
26 
27 /**
28  * Represents a set of parameters that will be used to render a page of the PDF document.
29  */
30 @FlaggedApi(Flags.FLAG_ENABLE_PDF_VIEWER)
31 public final class RenderParams {
32     /**
33      * Mode to render the content for display on a screen.
34      */
35     public static final int RENDER_MODE_FOR_DISPLAY = 1;
36 
37     /**
38      * Mode to render the content for printing.
39      */
40     public static final int RENDER_MODE_FOR_PRINT = 2;
41 
42     // LINT.IfChange
43     /**
44      * Flag to enable rendering of text annotation on the page.
45      *
46      * @see RenderParams#getRenderFlags()
47      * @see RenderParams.Builder#setRenderFlags(int)
48      */
49     public static final int FLAG_RENDER_TEXT_ANNOTATIONS = 1 << 1;
50 
51     /**
52      * Flag to enable rendering of highlight annotation on the page.
53      *
54      * @see RenderParams#getRenderFlags()
55      * @see RenderParams.Builder#setRenderFlags(int)
56      */
57     public static final int FLAG_RENDER_HIGHLIGHT_ANNOTATIONS = 1 << 2;
58 
59     /**
60      * Flag to enable rendering of stamp annotation on the page.
61      *
62      * @see RenderParams#getRenderFlags()
63      * @see RenderParams.Builder#setRenderFlags(int)
64      */
65     @FlaggedApi(Flags.FLAG_ENABLE_EDIT_PDF_STAMP_ANNOTATIONS)
66     public static final int FLAG_RENDER_STAMP_ANNOTATIONS = 1 << 3;
67 
68     /**
69      * Flag to enable rendering of freetext annotation on the page.
70      *
71      * @see RenderParams#getRenderFlags()
72      * @see RenderParams.Builder#setRenderFlags(int)
73      */
74     @FlaggedApi(Flags.FLAG_ENABLE_EDIT_PDF_TEXT_ANNOTATIONS)
75     public static final int FLAG_RENDER_FREETEXT_ANNOTATIONS = 1 << 4;
76     // LINT.ThenChange(packages/providers/MediaProvider/pdf/framework/libs/pdfClient/page.h)
77     private final int mRenderMode;
78     private final int mRenderFlags;
79 
RenderParams(int renderMode, int renderFlags)80     private RenderParams(int renderMode, int renderFlags) {
81         this.mRenderMode = renderMode;
82         this.mRenderFlags = renderFlags;
83     }
84 
getRenderMask()85     private static int getRenderMask() {
86 
87         int renderMask = FLAG_RENDER_TEXT_ANNOTATIONS | FLAG_RENDER_HIGHLIGHT_ANNOTATIONS;
88         if (android.graphics.pdf.flags.readonly.Flags.enableEditPdfTextAnnotations()) {
89             renderMask |= FLAG_RENDER_FREETEXT_ANNOTATIONS;
90         }
91         if (android.graphics.pdf.flags.readonly.Flags.enableEditPdfStampAnnotations()) {
92             renderMask |= FLAG_RENDER_STAMP_ANNOTATIONS;
93         }
94         return renderMask;
95     }
96 
97     /**
98      * Returns the render mode.
99      */
100     @RenderMode
getRenderMode()101     public int getRenderMode() {
102         return mRenderMode;
103     }
104 
105     /**
106      * Returns the bitmask of the render flags.
107      */
108     @RenderFlags
getRenderFlags()109     public int getRenderFlags() {
110         return mRenderFlags;
111     }
112 
113     /** @hide */
getRenderAnnotations()114     public int getRenderAnnotations() {
115         return mRenderFlags & getRenderMask();
116     }
117 
118     /** @hide */
119     @IntDef({
120             RENDER_MODE_FOR_DISPLAY,
121             RENDER_MODE_FOR_PRINT
122     })
123     @Retention(RetentionPolicy.SOURCE)
124     public @interface RenderMode {
125     }
126 
127     /** @hide */
128     @IntDef(flag = true, prefix = {"FLAG_"}, value = {
129             FLAG_RENDER_TEXT_ANNOTATIONS,
130             FLAG_RENDER_HIGHLIGHT_ANNOTATIONS,
131             FLAG_RENDER_STAMP_ANNOTATIONS,
132             FLAG_RENDER_FREETEXT_ANNOTATIONS
133     })
134     @Retention(RetentionPolicy.SOURCE)
135     public @interface RenderFlags {
136     }
137 
138     /**
139      * Builder for constructing {@link RenderParams}.
140      */
141     public static final class Builder {
142 
143         private final int mRenderMode;
144 
145         @RenderFlags
146         private int mRenderFlags;
147 
148         /**
149          * Create a builder for constructing a {@link RenderParams} object with the render mode.
150          *
151          * @param renderMode render mode for the content.
152          */
Builder(@enderMode int renderMode)153         public Builder(@RenderMode int renderMode) {
154             this.mRenderMode = renderMode;
155         }
156 
157         /**
158          * Sets the state of the render flag.
159          * See {@link #setRenderFlags(int, int)} for usage information.
160          *
161          * @param renderFlags the bitmask of the render flag should be enabled, or {@code 0} to
162          *                    disable all flags.
163          * @see #setRenderFlags(int, int)
164          * @see #getRenderFlags()
165          */
166         @NonNull
setRenderFlags(@enderFlags int renderFlags)167         public Builder setRenderFlags(@RenderFlags int renderFlags) {
168             setRenderFlags(renderFlags, getRenderMask());
169             return this;
170         }
171 
172         /**
173          * Sets the state of the render flag specified by the mask. To change all render flags at
174          * once, see {@link #setRenderFlags(int)}.
175          * <p>
176          * When a render flag is enabled, it will be displayed on the updated
177          * {@link android.graphics.Bitmap} of the renderer.
178          * <p>
179          * Multiple indicator types may be enabled or disabled by passing the logical OR of the
180          * desired flags. If multiple flags are specified, they
181          * will all be set to the same enabled state.
182          * <p>
183          * For example, to enable the render text annotations flag:
184          * {@code setRenderFlags(FLAG_RENDER_TEXT_ANNOTATIONS, FLAG_RENDER_TEXT_ANNOTATIONS)}
185          * <p>
186          * To disable the render text annotations flag:
187          * {@code setRenderFlags(0, FLAG_RENDER_TEXT_ANNOTATIONS)}
188          *
189          * @param renderFlags the render flag, or the logical OR of multiple
190          *                    render flags. One or more of:
191          *                    <ul>
192          *                      <li>{@link #FLAG_RENDER_TEXT_ANNOTATIONS}</li>
193          *                      <li>{@link #FLAG_RENDER_HIGHLIGHT_ANNOTATIONS}</li>
194          *                    </ul>
195          * @see #setRenderFlags(int)
196          * @see #getRenderFlags()
197          */
198         @NonNull
setRenderFlags(@enderFlags int renderFlags, @RenderFlags int mask)199         public Builder setRenderFlags(@RenderFlags int renderFlags, @RenderFlags int mask) {
200             // Sanitize the mask
201             mask &= getRenderMask();
202 
203             // Mask the flags
204             renderFlags &= mask;
205 
206             // Merge with non-masked flags
207             this.mRenderFlags = renderFlags | (this.mRenderFlags & ~mask);
208             return this;
209         }
210 
211         /**
212          * Builds the {@link RenderParams} after the optional values has been set.
213          *
214          * @return the newly constructed {@link RenderParams} object
215          */
216         @NonNull
build()217         public RenderParams build() {
218             return new RenderParams(this.mRenderMode, this.mRenderFlags);
219         }
220     }
221 }
222