%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="java.io.File"%>
<%@page import="java.io.FileFilter"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.net.URL"%>
<%@page import="java.awt.image.BufferedImage"%>
<%@page import="java.awt.Graphics2D"%>
<%@page import="javax.imageio.ImageIO"%>
<%@page import="java.util.Arrays"%>
<%@page import="java.util.Comparator"%>
<%@page import="java.util.Enumeration"%>
<%
final int tileMax[] = { 2, 3, 4, 5, 7, 9, 11, 14, 17, 22 };
int xStart = 0;
int yStart = 0;
int zoom = 5;
String image=request.getParameter("i");
String outFormat=request.getParameter("of");
if (outFormat == null) outFormat = "png";
try { zoom = Integer.parseInt(request.getParameter("z")); } catch (Exception e){}
int xEnd = tileMax[zoom];
int yEnd = tileMax[zoom];
try { xStart = Integer.parseInt(request.getParameter("xs")); } catch (Exception e){}
try { yStart = Integer.parseInt(request.getParameter("ys")); } catch (Exception e){}
try { xEnd = Integer.parseInt(request.getParameter("xe")); } catch (Exception e){}
try { yEnd = Integer.parseInt(request.getParameter("ye")); } catch (Exception e){}
final String sinaiticusBaseURL = "http://www.codex-sinaiticus.net/handler/manuscriptImage.ashx?z=" + zoom;
if (image == null) return;
if (xStart < 0) xStart = 0;
if (xStart > tileMax[zoom]) xStart = tileMax[zoom];
if (yStart < 0) yStart = 0;
if (yStart > tileMax[zoom]) yStart = tileMax[zoom];
if (xEnd < 0) xEnd = 0;
if (xEnd > tileMax[zoom]) xEnd = tileMax[zoom];
if (yEnd < 0) yStart = 0;
if (yEnd > tileMax[zoom]) yEnd = tileMax[zoom];
if (((xEnd-xStart) * (yEnd-yStart)) > 101) return;
xEnd++;
yEnd++;
try {
String imageBaseURL = sinaiticusBaseURL + "&image="+image;
BufferedImage fullImage = null;
Graphics2D g = null;
int tileWidth = 0;
int tileHeight = 0;
for (int i = xStart; i < xEnd; i++) {
for (int j = yStart; j < yEnd; j++) {
String imageURL = imageBaseURL + "&x="+Integer.toString(i) + "&y="+Integer.toString(j);
BufferedImage tile = ImageIO.read(new URL(imageURL));
if (i == xStart && j == yStart) {
tileWidth = tile.getWidth();
tileHeight = tile.getHeight();
fullImage = new BufferedImage(tileWidth * (xEnd-xStart), tileHeight * (yEnd-yStart), BufferedImage.TYPE_INT_RGB);
g = fullImage.createGraphics();
}
g.drawImage(tile, (i-xStart)*tileWidth, (j-yStart)*tileHeight, tileWidth, tileHeight, null);
}
}
if (g != null) g.dispose();
response.setContentType("image/png");
OutputStream os = response.getOutputStream();
ImageIO.write(fullImage, outFormat, os);
os.close();
}
catch (Exception e) {e.printStackTrace();}
%>