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