Mercurial > hg > digilib-old
annotate servlet/src/digilib/servlet/Scaler.java @ 303:9db80eb0f50b
Servlet version 1.5.1b
- new option "mo=jpg" to always send JPG (even from TIFF)
author | robcast |
---|---|
date | Sun, 24 Oct 2004 23:03:14 +0200 |
parents | 1ecaf9c1fd8a |
children | 9bce7008a514 |
rev | line source |
---|---|
181 | 1 /* |
2 * Scaler -- Scaler servlet main class | |
3 * | |
4 * Digital Image Library servlet components | |
5 * | |
303 | 6 * Copyright (C) 200-2004 Robert Casties (robcast@mail.berlios.de) |
181 | 7 * |
8 * This program is free software; you can redistribute it and/or modify it | |
9 * under the terms of the GNU General Public License as published by the Free | |
10 * Software Foundation; either version 2 of the License, or (at your option) | |
11 * any later version. | |
12 * | |
13 * Please read license.txt for the full details. A copy of the GPL may be found | |
14 * at http://www.gnu.org/copyleft/lgpl.html | |
15 * | |
16 * You should have received a copy of the GNU General Public License along with | |
17 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple | |
18 * Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
1 | 21 |
22 package digilib.servlet; | |
23 | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
24 import java.awt.geom.AffineTransform; |
100 | 25 import java.awt.geom.NoninvertibleTransformException; |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
26 import java.awt.geom.Rectangle2D; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
27 import java.io.File; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
28 import java.io.IOException; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
29 import java.util.List; |
1 | 30 |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
31 import javax.servlet.ServletConfig; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
32 import javax.servlet.ServletContext; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
33 import javax.servlet.ServletException; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
34 import javax.servlet.http.HttpServlet; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
35 import javax.servlet.http.HttpServletRequest; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
36 import javax.servlet.http.HttpServletResponse; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
37 |
181 | 38 import org.apache.log4j.Logger; |
39 | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
40 import digilib.auth.AuthOpException; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
41 import digilib.auth.AuthOps; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
42 import digilib.image.ImageOpException; |
284 | 43 import digilib.image.ImageOps; |
149 | 44 import digilib.image.ImageSize; |
86 | 45 import digilib.io.DocuDirCache; |
181 | 46 import digilib.io.FileOpException; |
47 import digilib.io.FileOps; | |
161 | 48 import digilib.io.ImageFile; |
49 import digilib.io.ImageFileset; | |
1 | 50 |
51 | |
73 | 52 /** |
181 | 53 * @author casties |
54 */ | |
1 | 55 //public class Scaler extends HttpServlet implements SingleThreadModel { |
56 public class Scaler extends HttpServlet { | |
57 | |
263 | 58 private static final long serialVersionUID = -325080527268912852L; |
59 | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
60 /** digilib servlet version (for all components) */ |
303 | 61 public static final String dlVersion = "1.5.1b"; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
62 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
63 /** logger for accounting requests */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
64 private static Logger accountlog = Logger.getLogger("account.request"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
65 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
66 /** gengeral logger for this class */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
67 private static Logger logger = Logger.getLogger("digilib.servlet"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
68 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
69 /** logger for authentication related */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
70 private static Logger authlog = Logger.getLogger("digilib.auth"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
71 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
72 /** general error code */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
73 public static final int ERROR_UNKNOWN = 0; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
74 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
75 /** error code for authentication error */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
76 public static final int ERROR_AUTH = 1; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
77 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
78 /** error code for file operation error */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
79 public static final int ERROR_FILE = 2; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
80 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
81 /** error code for image operation error */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
82 public static final int ERROR_IMAGE = 3; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
83 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
84 /** DocuDirCache instance */ |
86 | 85 DocuDirCache dirCache; |
161 | 86 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
87 /** authentication error image file */ |
153 | 88 File denyImgFile; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
89 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
90 /** image error image file */ |
153 | 91 File errorImgFile; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
92 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
93 /** subsampling before scaling */ |
153 | 94 float minSubsample = 2f; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
95 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
96 /** send files as is? */ |
153 | 97 boolean sendFileAllowed = true; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
98 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
99 /** default scaling quality */ |
153 | 100 int defaultQuality = 1; |
1 | 101 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
102 /** DigilibConfiguration instance */ |
73 | 103 DigilibConfiguration dlConfig; |
1 | 104 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
105 /** use authorization database */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
106 boolean useAuthorization = true; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
107 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
108 /** AuthOps instance */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
109 AuthOps authOp; |
1 | 110 |
100 | 111 // EXPRIMENTAL |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
112 /** try to enlarge cropping area for "oblique" angles */ |
100 | 113 boolean wholeRotArea = false; |
114 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
115 /** |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
116 * Initialisation on first run. |
73 | 117 * |
118 * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig) | |
119 */ | |
120 public void init(ServletConfig config) throws ServletException { | |
121 super.init(config); | |
1 | 122 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
123 System.out |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
124 .println("***** Digital Image Library Image Scaler Servlet (version " |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
125 + dlVersion + ") *****"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
126 // say hello in the log file |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
127 logger |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
128 .info("***** Digital Image Library Image Scaler Servlet (version " |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
129 + dlVersion + ") *****"); |
1 | 130 |
73 | 131 // get our ServletContext |
132 ServletContext context = config.getServletContext(); | |
133 // see if there is a Configuration instance | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
134 dlConfig = (DigilibConfiguration) context |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
135 .getAttribute("digilib.servlet.configuration"); |
73 | 136 if (dlConfig == null) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
137 // no Configuration |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
138 throw new ServletException("No Configuration!"); |
73 | 139 } |
140 // set our AuthOps | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
141 useAuthorization = dlConfig.getAsBoolean("use-authorization"); |
153 | 142 authOp = (AuthOps) dlConfig.getValue("servlet.auth.op"); |
181 | 143 |
86 | 144 // DocuDirCache instance |
153 | 145 dirCache = (DocuDirCache) dlConfig.getValue("servlet.dir.cache"); |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
146 denyImgFile = (File) dlConfig.getValue("denied-image"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
147 errorImgFile = (File) dlConfig.getValue("error-image"); |
153 | 148 sendFileAllowed = dlConfig.getAsBoolean("sendfile-allowed"); |
149 minSubsample = dlConfig.getAsFloat("subsample-minimum"); | |
150 defaultQuality = dlConfig.getAsInt("default-quality"); | |
73 | 151 } |
1 | 152 |
181 | 153 /** Process the HTTP Get request */ |
73 | 154 public void doGet(HttpServletRequest request, HttpServletResponse response) |
155 throws ServletException, IOException { | |
181 | 156 accountlog.info("GET from "+request.getRemoteAddr()); |
73 | 157 // create new request with defaults |
158 DigilibRequest dlReq = new DigilibRequest(); | |
159 // set with request parameters | |
160 dlReq.setWithRequest(request); | |
161 // add DigilibRequest to ServletRequest | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
162 request.setAttribute("digilib.servlet.request", dlReq); |
73 | 163 // do the processing |
164 processRequest(request, response); | |
165 } | |
1 | 166 |
181 | 167 /** Process the HTTP Post request */ |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
168 public void doPost(HttpServletRequest request, HttpServletResponse response) |
73 | 169 throws ServletException, IOException { |
181 | 170 accountlog.info("POST from "+request.getRemoteAddr()); |
73 | 171 // create new request with defaults |
172 DigilibRequest dlReq = new DigilibRequest(); | |
173 // set with request parameters | |
174 dlReq.setWithRequest(request); | |
175 // add DigilibRequest to ServletRequest | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
176 request.setAttribute("digilib.servlet.request", dlReq); |
73 | 177 // do the processing |
178 processRequest(request, response); | |
179 } | |
180 | |
181 /** main request handler. */ | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
182 void processRequest(HttpServletRequest request, HttpServletResponse response) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
183 throws ServletException { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
184 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
185 if (dlConfig == null) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
186 throw new ServletException("ERROR: No Configuration!"); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
187 } |
1 | 188 |
181 | 189 accountlog.debug("request: "+request.getQueryString()); |
189 | 190 logger.debug("request: "+request.getQueryString()); |
181 | 191 |
73 | 192 // time for benchmarking |
193 long startTime = System.currentTimeMillis(); | |
194 // output mime/type | |
195 String mimeType = "image/png"; | |
1 | 196 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
197 /* parameters for a session */ |
1 | 198 |
73 | 199 // scale the image file to fit window size i.e. respect dw,dh |
200 boolean scaleToFit = true; | |
100 | 201 // scale the image by a fixed factor only |
202 boolean absoluteScale = false; | |
122 | 203 // only crop the image to fit |
204 boolean cropToFit = false; | |
149 | 205 // send the file as is |
206 boolean sendFile = false; | |
207 // use low resolution images only | |
208 boolean loresOnly = false; | |
209 // use hires images only | |
122 | 210 boolean hiresOnly = false; |
303 | 211 // send the image always as JPEG |
212 boolean forceJPEG = false; | |
73 | 213 // interpolation to use for scaling |
153 | 214 int scaleQual = defaultQuality; |
73 | 215 // send html error message (or image file) |
216 boolean errorMsgHtml = false; | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
217 // mirror the image |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
218 boolean doMirror = false; |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
219 // angle of mirror axis |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
220 float mirrorAngle = 0; |
130 | 221 // original (hires) image resolution |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
222 float origResX = 0; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
223 float origResY = 0; |
1 | 224 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
225 /* request parameters */ |
73 | 226 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
227 DigilibRequest dlRequest = (DigilibRequest) request |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
228 .getAttribute("digilib.servlet.request"); |
1 | 229 |
73 | 230 // destination image width |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
231 int paramDW = dlRequest.getAsInt("dw"); |
73 | 232 // destination image height |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
233 int paramDH = dlRequest.getAsInt("dh"); |
73 | 234 // relative area x_offset (0..1) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
235 float paramWX = dlRequest.getAsFloat("wx"); |
73 | 236 // relative area y_offset |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
237 float paramWY = dlRequest.getAsFloat("wy"); |
73 | 238 // relative area width (0..1) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
239 float paramWW = dlRequest.getAsFloat("ww"); |
73 | 240 // relative area height |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
241 float paramWH = dlRequest.getAsFloat("wh"); |
73 | 242 // scale factor (additional to dw/width, dh/height) |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
243 float paramWS = dlRequest.getAsFloat("ws"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
244 // rotation angle |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
245 float paramROT = dlRequest.getAsFloat("rot"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
246 // contrast enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
247 float paramCONT = dlRequest.getAsFloat("cont"); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
248 // brightness enhancement |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
249 float paramBRGT = dlRequest.getAsFloat("brgt"); |
86 | 250 // color modification |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
251 float[] paramRGBM = null; |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
252 Parameter p = dlRequest.get("rgbm"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
253 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
254 paramRGBM = p.parseAsFloatArray("/"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
255 } |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
256 float[] paramRGBA = null; |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
257 p = dlRequest.get("rgba"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
258 if (p.hasValue() && (!p.getAsString().equals("0/0/0"))) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
259 paramRGBA = p.parseAsFloatArray("/"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
260 } |
130 | 261 // destination resolution (DPI) |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
262 float paramDDPIX = dlRequest.getAsFloat("ddpix"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
263 float paramDDPIY = dlRequest.getAsFloat("ddpiy"); |
130 | 264 if ((paramDDPIX == 0) || (paramDDPIY == 0)) { |
265 // if X or Y resolution isn't set, use DDPI | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
266 paramDDPIX = dlRequest.getAsFloat("ddpi"); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
267 paramDDPIY = paramDDPIX; |
130 | 268 } |
1 | 269 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
270 /* |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
271 * operation mode: "fit": always fit to page, "clip": send original |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
272 * resolution cropped, "file": send whole file (if allowed) |
73 | 273 */ |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
274 if (dlRequest.hasOption("mo", "clip")) { |
73 | 275 scaleToFit = false; |
100 | 276 absoluteScale = false; |
73 | 277 cropToFit = true; |
149 | 278 sendFile = false; |
279 hiresOnly = true; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
280 } else if (dlRequest.hasOption("mo", "fit")) { |
73 | 281 scaleToFit = true; |
100 | 282 absoluteScale = false; |
122 | 283 cropToFit = false; |
149 | 284 sendFile = false; |
285 hiresOnly = false; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
286 } else if (dlRequest.hasOption("mo", "osize")) { |
100 | 287 scaleToFit = false; |
288 absoluteScale = true; | |
122 | 289 cropToFit = false; |
149 | 290 sendFile = false; |
122 | 291 hiresOnly = true; |
73 | 292 } |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
293 // operation mode: "lores": try to use scaled image, "hires": use |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
294 // unscaled image |
149 | 295 // "autores": try best fitting resolution |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
296 if (dlRequest.hasOption("mo", "lores")) { |
149 | 297 loresOnly = true; |
298 hiresOnly = false; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
299 } else if (dlRequest.hasOption("mo", "hires")) { |
149 | 300 loresOnly = false; |
301 hiresOnly = true; | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
302 } else if (dlRequest.hasOption("mo", "autores")) { |
149 | 303 loresOnly = false; |
304 hiresOnly = false; | |
305 } | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
306 // operation mode: "errtxt": error message in html, "errimg": error |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
307 // image |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
308 if (dlRequest.hasOption("mo", "errtxt")) { |
73 | 309 errorMsgHtml = true; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
310 } else if (dlRequest.hasOption("mo", "errimg")) { |
73 | 311 errorMsgHtml = false; |
312 } | |
313 // operation mode: "q0" - "q2": interpolation quality | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
314 if (dlRequest.hasOption("mo", "q0")) { |
73 | 315 scaleQual = 0; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
316 } else if (dlRequest.hasOption("mo", "q1")) { |
73 | 317 scaleQual = 1; |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
318 } else if (dlRequest.hasOption("mo", "q2")) { |
73 | 319 scaleQual = 2; |
320 } | |
303 | 321 // operation mode: "jpg": always use JPEG |
322 if (dlRequest.hasOption("mo", "jpg")) { | |
323 forceJPEG = true; | |
324 } | |
1 | 325 |
185 | 326 // check with the maximum allowed size (if set) |
327 int maxImgSize = dlConfig.getAsInt("max-image-size"); | |
328 if (maxImgSize > 0) { | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
329 paramDW = (paramDW * paramWS > maxImgSize) ? (int) (maxImgSize / paramWS) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
330 : paramDW; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
331 paramDH = (paramDH * paramWS > maxImgSize) ? (int) (maxImgSize / paramWS) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
332 : paramDH; |
185 | 333 } |
334 | |
73 | 335 //"big" try for all file/image actions |
336 try { | |
337 | |
161 | 338 // ImageFileset of the image to load |
339 ImageFileset fileset = null; | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
340 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
341 /* find the file to load/send */ |
1 | 342 |
73 | 343 // get PathInfo |
344 String loadPathName = dlRequest.getFilePath(); | |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
345 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
346 /* check permissions */ |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
347 if (useAuthorization) { |
73 | 348 // get a list of required roles (empty if no restrictions) |
349 List rolesRequired = authOp.rolesForPath(loadPathName, request); | |
350 if (rolesRequired != null) { | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
351 authlog.debug("Role required: " + rolesRequired); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
352 authlog.debug("User: " + request.getRemoteUser()); |
73 | 353 // is the current request/user authorized? |
354 if (!authOp.isRoleAuthorized(rolesRequired, request)) { | |
355 // send deny answer and abort | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
356 throw new AuthOpException(); |
73 | 357 } |
358 } | |
359 } | |
1 | 360 |
122 | 361 // find the file(set) |
161 | 362 ImageFile fileToLoad; |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
363 fileset = (ImageFileset) dirCache.getFile(loadPathName, dlRequest |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
364 .getAsInt("pn"), FileOps.CLASS_IMAGE); |
94 | 365 if (fileset == null) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
366 throw new FileOpException("File " + loadPathName + "(" |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
367 + dlRequest.getAsInt("pn") + ") not found."); |
94 | 368 } |
181 | 369 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
370 /* calculate expected source image size */ |
149 | 371 ImageSize expectedSourceSize = new ImageSize(); |
122 | 372 if (scaleToFit) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
373 float scale = (1 / Math.min(paramWW, paramWH)) * paramWS; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
374 expectedSourceSize.setSize((int) (paramDW * scale), |
149 | 375 (int) (paramDH * scale)); |
122 | 376 } else { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
377 expectedSourceSize.setSize((int) (paramDW * paramWS), |
149 | 378 (int) (paramDH * paramWS)); |
100 | 379 } |
380 | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
381 /* select a resolution */ |
149 | 382 if (hiresOnly) { |
383 // get first element (= highest resolution) | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
384 fileToLoad = fileset.getBiggest(); |
149 | 385 } else if (loresOnly) { |
386 // enforced lores uses next smaller resolution | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
387 fileToLoad = fileset.getNextSmaller(expectedSourceSize); |
149 | 388 if (fileToLoad == null) { |
389 // this is the smallest we have | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
390 fileToLoad = fileset.getSmallest(); |
149 | 391 } |
392 } else { | |
130 | 393 // autores: use next higher resolution |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
394 fileToLoad = fileset.getNextBigger(expectedSourceSize); |
122 | 395 if (fileToLoad == null) { |
130 | 396 // this is the highest we have |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
397 fileToLoad = fileset.getBiggest(); |
122 | 398 } |
86 | 399 } |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
400 logger.info("Planning to load: " + fileToLoad.getFile()); |
73 | 401 |
181 | 402 /* |
403 * send the image if its mo=(raw)file | |
404 */ | |
405 if (dlRequest.hasOption("mo", "file") | |
406 || dlRequest.hasOption("mo", "rawfile")) { | |
407 if (sendFileAllowed) { | |
408 String mt = null; | |
409 if (dlRequest.hasOption("mo", "rawfile")) { | |
410 mt = "application/octet-stream"; | |
411 } | |
263 | 412 logger.debug("Sending RAW File as is."); |
181 | 413 ServletOps.sendFile(fileToLoad.getFile(), mt, response); |
263 | 414 logger.info("Done in " |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
415 + (System.currentTimeMillis() - startTime) + "ms"); |
263 | 416 return; |
181 | 417 } |
418 } | |
419 | |
420 /* | |
421 * prepare resolution for original size | |
422 */ | |
130 | 423 if (absoluteScale) { |
424 // get original resolution from metadata | |
425 fileset.checkMeta(); | |
426 origResX = fileset.getResX(); | |
427 origResY = fileset.getResY(); | |
139
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
428 if ((origResX == 0) || (origResY == 0)) { |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
429 throw new ImageOpException("Missing image DPI information!"); |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
430 } |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
431 |
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
432 if ((paramDDPIX == 0) || (paramDDPIY == 0)) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
433 throw new ImageOpException( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
434 "Missing display DPI information!"); |
139
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
435 } |
130 | 436 } |
437 | |
86 | 438 // check the source image |
122 | 439 if (!fileToLoad.isChecked()) { |
284 | 440 ImageOps.checkFile(fileToLoad); |
122 | 441 } |
86 | 442 // get the source image type |
443 mimeType = fileToLoad.getMimetype(); | |
149 | 444 // get the source image size |
445 ImageSize imgSize = fileToLoad.getSize(); | |
446 | |
130 | 447 // decide if the image can be sent as is |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
448 boolean mimetypeSendable = mimeType.equals("image/jpeg") |
122 | 449 || mimeType.equals("image/png") |
450 || mimeType.equals("image/gif"); | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
451 boolean imagoOptions = dlRequest.hasOption("mo", "hmir") |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
452 || dlRequest.hasOption("mo", "vmir") || (paramROT != 0) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
453 || (paramRGBM != null) || (paramRGBA != null) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
454 || (paramCONT != 0) || (paramBRGT != 0); |
139
11cfe4c89fdc
Servlet version 1.11b1 with improved original-size.
robcast
parents:
130
diff
changeset
|
455 boolean imageSendable = mimetypeSendable && !imagoOptions; |
73 | 456 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
457 /* |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
458 * if not autoRes and image smaller than requested size then send as |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
459 * is. if autoRes and image has requested size then send as is. if |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
460 * not autoScale and not scaleToFit nor cropToFit then send as is |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
461 * (mo=file) |
73 | 462 */ |
181 | 463 if (imageSendable |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
464 && ((loresOnly && fileToLoad.getSize().isSmallerThan( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
465 expectedSourceSize)) || (!(loresOnly || hiresOnly) && fileToLoad |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
466 .getSize().fitsIn(expectedSourceSize)))) { |
73 | 467 |
181 | 468 logger.debug("Sending File as is."); |
1 | 469 |
181 | 470 ServletOps.sendFile(fileToLoad.getFile(), null, response); |
471 | |
472 logger.info("Done in " | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
473 + (System.currentTimeMillis() - startTime) + "ms"); |
73 | 474 return; |
475 } | |
1 | 476 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
477 // set missing dw or dh from aspect ratio |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
478 float imgAspect = fileToLoad.getAspect(); |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
479 if (paramDW == 0) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
480 paramDW = (int) Math.round(paramDH * imgAspect); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
481 } else if (paramDH == 0) { |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
482 paramDH = (int) Math.round(paramDW / imgAspect); |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
483 } |
149 | 484 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
485 /* crop and scale the image */ |
1 | 486 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
487 logger.debug("IMG: " + imgSize.getWidth() + "x" |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
488 + imgSize.getHeight()); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
489 logger.debug("time " + (System.currentTimeMillis() - startTime) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
490 + "ms"); |
1 | 491 |
73 | 492 // coordinates and scaling |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
493 float areaXoff; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
494 float areaYoff; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
495 float areaWidth; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
496 float areaHeight; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
497 float scaleX; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
498 float scaleY; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
499 float scaleXY; |
1 | 500 |
100 | 501 // coordinates using Java2D |
502 // image size in pixels | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
503 Rectangle2D imgBounds = new Rectangle2D.Float(0, 0, imgSize |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
504 .getWidth(), imgSize.getHeight()); |
100 | 505 // user window area in [0,1] coordinates |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
506 Rectangle2D relUserArea = new Rectangle2D.Float(paramWX, paramWY, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
507 paramWW, paramWH); |
100 | 508 // transform from relative [0,1] to image coordinates. |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
509 AffineTransform imgTrafo = AffineTransform.getScaleInstance(imgSize |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
510 .getWidth(), imgSize.getHeight()); |
85 | 511 // transform user coordinate area to image coordinate area |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
512 Rectangle2D userImgArea = imgTrafo.createTransformedShape( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
513 relUserArea).getBounds2D(); |
100 | 514 |
515 // calculate scaling factors based on inner user area | |
73 | 516 if (scaleToFit) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
517 areaWidth = (float) userImgArea.getWidth(); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
518 areaHeight = (float) userImgArea.getHeight(); |
73 | 519 scaleX = paramDW / areaWidth * paramWS; |
520 scaleY = paramDH / areaHeight * paramWS; | |
521 scaleXY = (scaleX > scaleY) ? scaleY : scaleX; | |
100 | 522 } else if (absoluteScale) { |
523 // absolute scale | |
130 | 524 scaleX = paramDDPIX / origResX; |
525 scaleY = paramDDPIY / origResY; | |
526 // currently only same scale :-( | |
527 scaleXY = scaleX; | |
528 areaWidth = paramDW / scaleXY * paramWS; | |
529 areaHeight = paramDH / scaleXY * paramWS; | |
100 | 530 // reset user area size |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
531 userImgArea.setRect(userImgArea.getX(), userImgArea.getY(), |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
532 areaWidth, areaHeight); |
73 | 533 } else { |
534 // crop to fit | |
85 | 535 areaWidth = paramDW * paramWS; |
536 areaHeight = paramDH * paramWS; | |
100 | 537 // reset user area size |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
538 userImgArea.setRect(userImgArea.getX(), userImgArea.getY(), |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
539 areaWidth, areaHeight); |
73 | 540 scaleX = 1f; |
541 scaleY = 1f; | |
542 scaleXY = 1f; | |
100 | 543 } |
85 | 544 |
100 | 545 // enlarge image area for rotations to cover additional pixels |
546 Rectangle2D outerUserImgArea = userImgArea; | |
547 Rectangle2D innerUserImgArea = userImgArea; | |
548 if (wholeRotArea) { | |
549 if (paramROT != 0) { | |
550 try { | |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
551 // rotate user area coordinates around center of user |
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
552 // area |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
553 AffineTransform rotTrafo = AffineTransform |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
554 .getRotateInstance(Math.toRadians(paramROT), |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
555 userImgArea.getCenterX(), userImgArea |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
556 .getCenterY()); |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
557 // get bounds from rotated end position |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
558 innerUserImgArea = rotTrafo.createTransformedShape( |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
559 userImgArea).getBounds2D(); |
100 | 560 // get bounds from back-rotated bounds |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
561 outerUserImgArea = rotTrafo.createInverse() |
100 | 562 .createTransformedShape(innerUserImgArea) |
563 .getBounds2D(); | |
564 } catch (NoninvertibleTransformException e1) { | |
565 // this shouldn't happen anyway | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
566 logger.error(e1); |
100 | 567 } |
568 } | |
73 | 569 } |
1 | 570 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
571 logger.debug("Scale " + scaleXY + "(" + scaleX + "," + scaleY |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
572 + ") on " + outerUserImgArea); |
1 | 573 |
73 | 574 // clip area at the image border |
100 | 575 outerUserImgArea = outerUserImgArea.createIntersection(imgBounds); |
85 | 576 |
73 | 577 // check image parameters sanity |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
578 if ((outerUserImgArea.getWidth() < 1) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
579 || (outerUserImgArea.getHeight() < 1) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
580 || (scaleXY * outerUserImgArea.getWidth() < 2) |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
581 || (scaleXY * outerUserImgArea.getHeight() < 2)) { |
181 | 582 logger.error("ERROR: invalid scale parameter set!"); |
73 | 583 throw new ImageOpException("Invalid scale parameter set!"); |
584 } | |
1 | 585 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
586 /* |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
587 * submit the image worker job |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
588 */ |
85 | 589 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
590 DigilibWorker job = new DigilibImageWorker(dlConfig, response, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
591 mimeType, scaleQual, dlRequest, paramROT, paramCONT, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
592 paramBRGT, paramRGBM, paramRGBA, fileToLoad, scaleXY, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
593 outerUserImgArea, innerUserImgArea, minSubsample, |
303 | 594 wholeRotArea, forceJPEG); |
85 | 595 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
596 job.run(); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
597 if (job.hasError()) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
598 throw new ImageOpException(job.getError().toString()); |
79
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
599 } |
63c8186455c1
Servlet version 1.6b. Further cleanup and new functionality:
robcast
parents:
73
diff
changeset
|
600 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
601 logger.debug("servlet done in " |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
602 + (System.currentTimeMillis() - startTime)); |
73 | 603 |
170
d40922628e4a
Servlet Version 1.16b2 with new DigilibParameter code.
robcast
parents:
161
diff
changeset
|
604 /* error handling */ |
1 | 605 |
73 | 606 } // end of "big" try |
156 | 607 catch (IOException e) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
608 logger.error("ERROR: File IO Error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
609 digilibError(errorMsgHtml, ERROR_FILE, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
610 "ERROR: File IO Error: " + e, response); |
73 | 611 } catch (AuthOpException e) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
612 logger.error("ERROR: Authorization error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
613 digilibError(errorMsgHtml, ERROR_AUTH, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
614 "ERROR: Authorization error: " + e, response); |
73 | 615 } catch (ImageOpException e) { |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
616 logger.error("ERROR: Image Error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
617 digilibError(errorMsgHtml, ERROR_IMAGE, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
618 "ERROR: Image Operation Error: " + e, response); |
73 | 619 } catch (RuntimeException e) { |
620 // JAI likes to throw RuntimeExceptions ;-( | |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
621 logger.error("ERROR: Other Image Error: " + e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
622 digilibError(errorMsgHtml, ERROR_IMAGE, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
623 "ERROR: Other Image Operation Error: " + e, response); |
73 | 624 } |
625 } | |
1 | 626 |
298
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
627 /** |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
628 * Sends an error to the client as text or image. |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
629 * |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
630 * @param asHTML |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
631 * @param type |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
632 * @param msg |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
633 * @param response |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
634 */ |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
635 public void digilibError(boolean asHTML, int type, String msg, |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
636 HttpServletResponse response) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
637 try { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
638 File img = null; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
639 if (type == ERROR_AUTH) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
640 if (msg == null) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
641 msg = "ERROR: Unauthorized access!"; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
642 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
643 img = denyImgFile; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
644 } else { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
645 if (msg == null) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
646 msg = "ERROR: Other image error!"; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
647 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
648 img = this.errorImgFile; |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
649 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
650 if (asHTML && (img != null)) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
651 ServletOps.htmlMessage(msg, response); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
652 } else { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
653 ServletOps.sendFile(img, null, response); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
654 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
655 } catch (IOException e) { |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
656 logger.error("Error sending error!", e); |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
657 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
658 |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
659 } |
1ecaf9c1fd8a
Servlet version 1.5.0b -- the beginning of the next generation :-)
robcast
parents:
288
diff
changeset
|
660 |
73 | 661 } //Scaler class |