From f2ce64ce07ed5f04f60e881a0199291060833b49 Mon Sep 17 00:00:00 2001 From: sukeshsangam Date: Fri, 17 Dec 2021 02:21:10 -0600 Subject: [PATCH 1/4] openseadragon viewer --- Dockerfile | 16 +- docs/docs.iml | 57 - docs/pom.xml | 4 +- .../.data_preparation.py.swp | Bin 0 -> 12288 bytes .../MagickSlicer | 1 + .../data_preparation.py | 24 + pom.xml | 4 +- render-app/pom.xml | 2 +- render-app/render-app.iml | 67 - render-ws-java-client/pom.xml | 2 +- .../render-ws-java-client.iml | 127 - render-ws-spark-client/pom.xml | 4 +- .../render-ws-spark-client.iml | 221 - render-ws/pom.xml | 10 +- render-ws/render-ws.iml | 129 - .../render/service/OpenseadragonService.java | 150 + .../render/service/RenderDataService.java | 2 + .../render/service/TileDataService.java | 3 + .../src/main/scripts/docker/render-config.sh | 15 + render-ws/src/main/scripts/install.sh | 2 +- .../jetty/resources/render-server.properties | 6 + render-ws/src/main/webapp/script/LICENSE.txt | 28 + .../src/main/webapp/script/changelog.txt | 528 + .../script/images/button_grouphover.png | Bin 0 -> 1506 bytes .../webapp/script/images/button_hover.png | Bin 0 -> 1827 bytes .../webapp/script/images/button_pressed.png | Bin 0 -> 1895 bytes .../main/webapp/script/images/button_rest.png | Bin 0 -> 1066 bytes .../webapp/script/images/flip_grouphover.png | Bin 0 -> 4920 bytes .../main/webapp/script/images/flip_hover.png | Bin 0 -> 4920 bytes .../webapp/script/images/flip_pressed.png | Bin 0 -> 4920 bytes .../main/webapp/script/images/flip_rest.png | Bin 0 -> 4920 bytes .../script/images/fullpage_grouphover.png | Bin 0 -> 1085 bytes .../webapp/script/images/fullpage_hover.png | Bin 0 -> 2184 bytes .../webapp/script/images/fullpage_pressed.png | Bin 0 -> 2225 bytes .../webapp/script/images/fullpage_rest.png | Bin 0 -> 1309 bytes .../webapp/script/images/home_grouphover.png | Bin 0 -> 1062 bytes .../main/webapp/script/images/home_hover.png | Bin 0 -> 2091 bytes .../webapp/script/images/home_pressed.png | Bin 0 -> 2138 bytes .../main/webapp/script/images/home_rest.png | Bin 0 -> 1258 bytes .../webapp/script/images/next_grouphover.png | Bin 0 -> 1918 bytes .../main/webapp/script/images/next_hover.png | Bin 0 -> 2358 bytes .../webapp/script/images/next_pressed.png | Bin 0 -> 2411 bytes .../main/webapp/script/images/next_rest.png | Bin 0 -> 2027 bytes .../script/images/previous_grouphover.png | Bin 0 -> 1933 bytes .../webapp/script/images/previous_hover.png | Bin 0 -> 2361 bytes .../webapp/script/images/previous_pressed.png | Bin 0 -> 2413 bytes .../webapp/script/images/previous_rest.png | Bin 0 -> 2029 bytes .../script/images/rotateleft_grouphover.png | Bin 0 -> 1731 bytes .../webapp/script/images/rotateleft_hover.png | Bin 0 -> 2094 bytes .../script/images/rotateleft_pressed.png | Bin 0 -> 2036 bytes .../webapp/script/images/rotateleft_rest.png | Bin 0 -> 1779 bytes .../script/images/rotateright_grouphover.png | Bin 0 -> 1800 bytes .../script/images/rotateright_hover.png | Bin 0 -> 2158 bytes .../script/images/rotateright_pressed.png | Bin 0 -> 2039 bytes .../webapp/script/images/rotateright_rest.png | Bin 0 -> 1812 bytes .../script/images/zoomin_grouphover.png | Bin 0 -> 1060 bytes .../webapp/script/images/zoomin_hover.png | Bin 0 -> 2116 bytes .../webapp/script/images/zoomin_pressed.png | Bin 0 -> 2159 bytes .../main/webapp/script/images/zoomin_rest.png | Bin 0 -> 1262 bytes .../script/images/zoomout_grouphover.png | Bin 0 -> 977 bytes .../webapp/script/images/zoomout_hover.png | Bin 0 -> 1926 bytes .../webapp/script/images/zoomout_pressed.png | Bin 0 -> 1997 bytes .../webapp/script/images/zoomout_rest.png | Bin 0 -> 1153 bytes .../src/main/webapp/script/janelia-render.js | 59 +- .../openseadragon-bin-2.4.2/LICENSE.txt | 28 + .../openseadragon-bin-2.4.2/changelog.txt | 528 + .../images/button_grouphover.png | Bin 0 -> 1506 bytes .../images/button_hover.png | Bin 0 -> 1827 bytes .../images/button_pressed.png | Bin 0 -> 1895 bytes .../images/button_rest.png | Bin 0 -> 1066 bytes .../images/flip_grouphover.png | Bin 0 -> 4920 bytes .../images/flip_hover.png | Bin 0 -> 4920 bytes .../images/flip_pressed.png | Bin 0 -> 4920 bytes .../images/flip_rest.png | Bin 0 -> 4920 bytes .../images/fullpage_grouphover.png | Bin 0 -> 1085 bytes .../images/fullpage_hover.png | Bin 0 -> 2184 bytes .../images/fullpage_pressed.png | Bin 0 -> 2225 bytes .../images/fullpage_rest.png | Bin 0 -> 1309 bytes .../images/home_grouphover.png | Bin 0 -> 1062 bytes .../images/home_hover.png | Bin 0 -> 2091 bytes .../images/home_pressed.png | Bin 0 -> 2138 bytes .../images/home_rest.png | Bin 0 -> 1258 bytes .../images/next_grouphover.png | Bin 0 -> 1918 bytes .../images/next_hover.png | Bin 0 -> 2358 bytes .../images/next_pressed.png | Bin 0 -> 2411 bytes .../images/next_rest.png | Bin 0 -> 2027 bytes .../images/previous_grouphover.png | Bin 0 -> 1933 bytes .../images/previous_hover.png | Bin 0 -> 2361 bytes .../images/previous_pressed.png | Bin 0 -> 2413 bytes .../images/previous_rest.png | Bin 0 -> 2029 bytes .../images/rotateleft_grouphover.png | Bin 0 -> 1731 bytes .../images/rotateleft_hover.png | Bin 0 -> 2094 bytes .../images/rotateleft_pressed.png | Bin 0 -> 2036 bytes .../images/rotateleft_rest.png | Bin 0 -> 1779 bytes .../images/rotateright_grouphover.png | Bin 0 -> 1800 bytes .../images/rotateright_hover.png | Bin 0 -> 2158 bytes .../images/rotateright_pressed.png | Bin 0 -> 2039 bytes .../images/rotateright_rest.png | Bin 0 -> 1812 bytes .../images/zoomin_grouphover.png | Bin 0 -> 1060 bytes .../images/zoomin_hover.png | Bin 0 -> 2116 bytes .../images/zoomin_pressed.png | Bin 0 -> 2159 bytes .../images/zoomin_rest.png | Bin 0 -> 1262 bytes .../images/zoomout_grouphover.png | Bin 0 -> 977 bytes .../images/zoomout_hover.png | Bin 0 -> 1926 bytes .../images/zoomout_pressed.png | Bin 0 -> 1997 bytes .../images/zoomout_rest.png | Bin 0 -> 1153 bytes .../openseadragon-bin-2.4.2/openseadragon.js | 22789 ++++++++++++++++ .../openseadragon.js.map | 1 + .../openseadragon.min.js | 9 + .../openseadragon.min.js.map | 1 + .../src/main/webapp/script/openseadragon.js | 22789 ++++++++++++++++ .../main/webapp/script/openseadragon.js.map | 1 + .../main/webapp/script/openseadragon.min.js | 9 + .../webapp/script/openseadragon.min.js.map | 1 + render-ws/src/main/webapp/view/index.html | 30 + .../src/main/webapp/view/openseadragon.html | 101 + render-ws/src/main/webapp/view/stacks.html | 143 +- render.iml | 12 +- trakem2-scripts/pom.xml | 4 +- trakem2-scripts/trakem2-scripts.iml | 142 - 120 files changed, 47280 insertions(+), 769 deletions(-) delete mode 100644 docs/docs.iml create mode 100644 openseadragon/derived_data_preparation_code/.data_preparation.py.swp create mode 160000 openseadragon/derived_data_preparation_code/MagickSlicer create mode 100755 openseadragon/derived_data_preparation_code/data_preparation.py delete mode 100644 render-app/render-app.iml delete mode 100644 render-ws-java-client/render-ws-java-client.iml delete mode 100644 render-ws-spark-client/render-ws-spark-client.iml delete mode 100644 render-ws/render-ws.iml create mode 100644 render-ws/src/main/java/org/janelia/render/service/OpenseadragonService.java create mode 100644 render-ws/src/main/webapp/script/LICENSE.txt create mode 100644 render-ws/src/main/webapp/script/changelog.txt create mode 100644 render-ws/src/main/webapp/script/images/button_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/button_hover.png create mode 100644 render-ws/src/main/webapp/script/images/button_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/button_rest.png create mode 100644 render-ws/src/main/webapp/script/images/flip_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/flip_hover.png create mode 100644 render-ws/src/main/webapp/script/images/flip_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/flip_rest.png create mode 100644 render-ws/src/main/webapp/script/images/fullpage_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/fullpage_hover.png create mode 100644 render-ws/src/main/webapp/script/images/fullpage_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/fullpage_rest.png create mode 100644 render-ws/src/main/webapp/script/images/home_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/home_hover.png create mode 100644 render-ws/src/main/webapp/script/images/home_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/home_rest.png create mode 100644 render-ws/src/main/webapp/script/images/next_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/next_hover.png create mode 100644 render-ws/src/main/webapp/script/images/next_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/next_rest.png create mode 100644 render-ws/src/main/webapp/script/images/previous_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/previous_hover.png create mode 100644 render-ws/src/main/webapp/script/images/previous_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/previous_rest.png create mode 100644 render-ws/src/main/webapp/script/images/rotateleft_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/rotateleft_hover.png create mode 100644 render-ws/src/main/webapp/script/images/rotateleft_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/rotateleft_rest.png create mode 100644 render-ws/src/main/webapp/script/images/rotateright_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/rotateright_hover.png create mode 100644 render-ws/src/main/webapp/script/images/rotateright_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/rotateright_rest.png create mode 100644 render-ws/src/main/webapp/script/images/zoomin_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/zoomin_hover.png create mode 100644 render-ws/src/main/webapp/script/images/zoomin_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/zoomin_rest.png create mode 100644 render-ws/src/main/webapp/script/images/zoomout_grouphover.png create mode 100644 render-ws/src/main/webapp/script/images/zoomout_hover.png create mode 100644 render-ws/src/main/webapp/script/images/zoomout_pressed.png create mode 100644 render-ws/src/main/webapp/script/images/zoomout_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/LICENSE.txt create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/changelog.txt create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/button_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/button_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/button_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/button_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/flip_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/flip_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/flip_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/flip_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/fullpage_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/fullpage_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/fullpage_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/fullpage_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/home_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/home_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/home_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/home_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/next_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/next_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/next_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/next_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/previous_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/previous_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/previous_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/previous_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateleft_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateleft_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateleft_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateleft_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateright_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateright_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateright_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/rotateright_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomin_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomin_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomin_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomin_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomout_grouphover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomout_hover.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomout_pressed.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/images/zoomout_rest.png create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/openseadragon.js create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/openseadragon.js.map create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/openseadragon.min.js create mode 100644 render-ws/src/main/webapp/script/openseadragon-bin-2.4.2/openseadragon.min.js.map create mode 100644 render-ws/src/main/webapp/script/openseadragon.js create mode 100644 render-ws/src/main/webapp/script/openseadragon.js.map create mode 100644 render-ws/src/main/webapp/script/openseadragon.min.js create mode 100644 render-ws/src/main/webapp/script/openseadragon.min.js.map create mode 100644 render-ws/src/main/webapp/view/openseadragon.html delete mode 100644 trakem2-scripts/trakem2-scripts.iml diff --git a/Dockerfile b/Dockerfile index d7ac048a4..77ba410f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,7 @@ COPY . /var/www/render/ RUN mvn clean # use -T 1C option to multi-thread maven, using 1 thread per available core -RUN mvn -T 1C -Dproject.build.sourceEncoding=UTF-8 package && \ +RUN mvn -T 1C -Dproject.build.sourceEncoding=UTF-8 -Dmaven.test.skip=true package && \ mkdir -p /root/render-lib && \ mv */target/*.*ar /root/render-lib && \ printf "\nsaved the following build artifacts:\n\n" && \ @@ -49,13 +49,13 @@ RUN mvn -T 1C -Dproject.build.sourceEncoding=UTF-8 package && \ # Once web service application is built, set up jetty server and deploy application to it. # NOTE: jetty version should be kept in sync with values in render/render-ws/pom.xml and render/render-ws/src/main/scripts/install.sh -FROM jetty:9.4.43-jdk8-slim as render-ws +FROM jetty:9.4.9-jre8-alpine as render-ws # add packages not included in alpine: # curl and coreutils for gnu readlink # fontconfig and ttf-dejavu for bounding box renderer ( see https://github.com/docker-library/openjdk/pull/202 ) USER root -RUN apt-get update && apt-get install -y curl coreutils fontconfig ttf-dejavu +RUN apk add --no-cache curl coreutils fontconfig ttf-dejavu WORKDIR $JETTY_BASE @@ -69,10 +69,10 @@ RUN ls -al $JETTY_BASE/* && \ COPY --from=builder /root/render-lib/render-ws-*.war webapps/render-ws.war COPY render-ws/src/main/scripts/docker /render-docker RUN chown -R jetty:jetty $JETTY_BASE - +RUN chmod -R 777 $JETTY_BASE EXPOSE 8080 -ENV JAVA_OPTIONS="-Xms3g -Xmx3g -server -Djava.awt.headless=true" \ +ENV JAVA_OPTIONS="-Xms45g -Xmx45g -server -Djava.awt.headless=true" \ JETTY_THREADPOOL_MIN_THREADS="10" \ JETTY_THREADPOOL_MAX_THREADS="200" \ LOG_ACCESS_ROOT_APPENDER="STDOUT" \ @@ -89,6 +89,12 @@ ENV JAVA_OPTIONS="-Xms3g -Xmx3g -server -Djava.awt.headless=true" \ NDVIZHOST="" \ NDVIZPORT="" \ NDVIZ_URL="" \ + VIEW_OPENSEADRAGON_HOST_AND_PORT="" \ + VIEW_DATA_PREP="" \ + VIEW_DATA_PREPSH="" \ + VIEW_OPENSEADRAGON_DATA_HOST="" \ + VIEW_OPENSEADRAGON_DATA_SOURCE_FOLDER="" \ + VIEW_OPENSEADRAGON_DATA_DESTINATION_FOLDER="" \ VIEW_CATMAID_HOST_AND_PORT="" \ VIEW_DYNAMIC_RENDER_HOST_AND_PORT="" \ VIEW_RENDER_STACK_OWNER="" \ diff --git a/docs/docs.iml b/docs/docs.iml deleted file mode 100644 index 52599092d..000000000 --- a/docs/docs.iml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/pom.xml b/docs/pom.xml index 348dbe7f2..a0efe5b37 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -54,7 +54,7 @@ Administrative elements required by org.scijava.maven.plugin.enforcer.RequireElements that have to be copied. Too bad they can't just be taken from parent pom. --> - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render 2014 see parent see parent @@ -69,4 +69,4 @@ Howard Hughes Medical Institute - \ No newline at end of file + diff --git a/openseadragon/derived_data_preparation_code/.data_preparation.py.swp b/openseadragon/derived_data_preparation_code/.data_preparation.py.swp new file mode 100644 index 0000000000000000000000000000000000000000..53def8d70b8fb2f66e92cc700f4e6d1ca9617a5b GIT binary patch literal 12288 zcmeHNPjB2r6rUpTSCpc1L7XOzifwITcM~Mqh!wqnRMe^!X;ITETDAteqe!wCqL|1bQ{iyH!=cDBk%uvp{E)@{IMPwSkgSMgq`AoZLlLuZSsN5b%cEG? zGGG~4&A{oK+gsgotFJq2^tH1$SDRU_Wxz6E8L$jk1}p=X0n318z%uYuGN6l7UFsSO)%w3`8*@*Ippx2f+OQ zfA;tPqcep33j73o4}1fB0h|UNzCy^?z#Ujb&UZ-LK&6u1Jc0lz&@$Y;P9*aI#DZvh_g$8&@{0KNq710Mo!0DnG9$S=T; zfITb&mI2Ga)5HL+k9Bh{B+oTvhxXCn6RO0mLE2B}DR?j^>sKY{1Qa;TMF zY?O+X6Opt>Ri=xS4}#sRH?H@0cdsl*#8Qk^6IjcmoknsThn}PJS!Wy6!B21?Fi$P~ z4XWk=jcMa}t`%~3GB{vEy+hl|8)8v@Uy5u|!%80Xd;r!&ABgw}({{x)$NYC(+M()5 z1(8e+?{xPexrG$fnDcw{I43wa(N#5HGr+Zi<>J7Zqbo;scjcJt&O}HvGn)_8E6p>O>A!9S0uF@Z%ZSc~?3vaiwvPl@&)W`aQ z(jCt9^RrL^DAO$SoF~w6cr{A+aJ-xHA(LTN3Y)5w0yUyer)pvB-xVo37duV}P4m1u zPQN8@?JvsPwXCIg?01lRMdEZE#EhBJJg?dwtH8}}ydLS1x56OE#xa*3+9g4@>fMkN zwn5oFu5@3FORY3%dyea4>=r&d$o8A&wQi0v)5csd8|i`IAS~*X(M;TgMuZS9689| zRl_J{y)H`D6VAUTN!H7^%~Qcrv#4_SEKuhElZ~_B`5)|=Dtw>w?m-y!R*x>)dH8y-m4G^KH_iX%M|x#OQ~R2-o> zI}tF+5V2SGVIL@w-*JtM+HZzjP(y}#Z%MZY-K{0vE$FH|@0lqt#)iXYTf=i`d{S>=hijDZK^zKhP$d} zv`p|2-FeMu=}|M>u&Nm?Eoz2~GBL?x<@y9)R2eN$^ijqr&k7+mHCasR>-sZjCJHsX QG7Ftu2.3.0 A collection of tools and HTTP services (APIs) for rendering transformed image tiles. - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render.git 2014 Janelia Research Campus @@ -79,7 +79,7 @@ - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render.git diff --git a/render-app/pom.xml b/render-app/pom.xml index 062cc95e2..a72d46777 100644 --- a/render-app/pom.xml +++ b/render-app/pom.xml @@ -131,7 +131,7 @@ Administrative elements required by org.scijava.maven.plugin.enforcer.RequireElements that have to be copied. Too bad they can't just be taken from parent pom. --> - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render 2014 see parent see parent diff --git a/render-app/render-app.iml b/render-app/render-app.iml deleted file mode 100644 index 18f35b357..000000000 --- a/render-app/render-app.iml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/render-ws-java-client/pom.xml b/render-ws-java-client/pom.xml index 57330f5e8..6c0417930 100644 --- a/render-ws-java-client/pom.xml +++ b/render-ws-java-client/pom.xml @@ -124,7 +124,7 @@ Administrative elements required by org.scijava.maven.plugin.enforcer.RequireElements that have to be copied. Too bad they can't just be taken from parent pom. --> - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render 2014 see parent see parent diff --git a/render-ws-java-client/render-ws-java-client.iml b/render-ws-java-client/render-ws-java-client.iml deleted file mode 100644 index 04731ee8e..000000000 --- a/render-ws-java-client/render-ws-java-client.iml +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/render-ws-spark-client/pom.xml b/render-ws-spark-client/pom.xml index 2fe9e3b0d..82e96b1d4 100644 --- a/render-ws-spark-client/pom.xml +++ b/render-ws-spark-client/pom.xml @@ -205,7 +205,7 @@ Administrative elements required by org.scijava.maven.plugin.enforcer.RequireElements that have to be copied. Too bad they can't just be taken from parent pom. --> - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render 2014 see parent see parent @@ -220,4 +220,4 @@ Howard Hughes Medical Institute - \ No newline at end of file + diff --git a/render-ws-spark-client/render-ws-spark-client.iml b/render-ws-spark-client/render-ws-spark-client.iml deleted file mode 100644 index 266fb3bac..000000000 --- a/render-ws-spark-client/render-ws-spark-client.iml +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/render-ws/pom.xml b/render-ws/pom.xml index a41e53f41..4e84e9e5c 100644 --- a/render-ws/pom.xml +++ b/render-ws/pom.xml @@ -122,6 +122,12 @@ ${resteasy.version} + + com.jcraft + jsch + 0.1.53 + + @@ -238,7 +244,7 @@ 3.13.2.Final - 9.4.43.v20210629 + 9.4.9.v20180320 gpl_v2 Howard Hughes Medical Institute @@ -247,7 +253,7 @@ Administrative elements required by org.scijava.maven.plugin.enforcer.RequireElements that have to be copied. Too bad they can't just be taken from parent pom. --> - https://github.com/saalfeldlab/render + https://github.com/sukeshsangam/render 2014 see parent see parent diff --git a/render-ws/render-ws.iml b/render-ws/render-ws.iml deleted file mode 100644 index 60096d6c3..000000000 --- a/render-ws/render-ws.iml +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/render-ws/src/main/java/org/janelia/render/service/OpenseadragonService.java b/render-ws/src/main/java/org/janelia/render/service/OpenseadragonService.java new file mode 100644 index 000000000..5f0857faa --- /dev/null +++ b/render-ws/src/main/java/org/janelia/render/service/OpenseadragonService.java @@ -0,0 +1,150 @@ +package org.janelia.render.service; + +import java.net.UnknownHostException; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import javax.ws.rs.BeanParam; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.FormParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.janelia.alignment.ImageAndMask; +import org.janelia.alignment.RenderParameters; +import org.janelia.alignment.spec.ChannelSpec; +import org.janelia.alignment.spec.TileSpec; +import org.janelia.alignment.spec.TransformSpecMetaData; +import org.janelia.alignment.spec.stack.StackId; +import org.janelia.alignment.spec.stack.StackMetaData; +import org.janelia.render.service.dao.RenderDao; +import org.janelia.render.service.model.ObjectNotFoundException; +import org.janelia.render.service.model.RenderQueryParameters; +import org.janelia.render.service.util.RenderServiceUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import com.jcraft.jsch.ChannelExec; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.JSchException; +import com.jcraft.jsch.Session; +import java.net.InetAddress; +import java.net.UnknownHostException; + +@Path("/") +@Api(tags = {"Openseadragon API's"}) +public class OpenseadragonService { + + private final RenderDao renderDao; + private final RenderDataService renderDataService; + + @SuppressWarnings({"UnusedDeclaration", "WeakerAccess"}) + public OpenseadragonService() + throws UnknownHostException { + this(RenderDao.build()); + } + + private OpenseadragonService(final RenderDao renderDao) { + this.renderDao = renderDao; + this.renderDataService = new RenderDataService(renderDao); + } + + + @Path("v1/openseadragon") + @POST + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation( + value = "Get test service") + @ApiResponses(value = { + @ApiResponse(code = 404, message = "test service not found"), + }) + public String getTestService(@FormParam("clustername") final String clustername, + @FormParam("username") final String username, + @FormParam("password") final String password, + @FormParam("StackOwner") final String stackowner, + @FormParam("StackProject") final String stackproject, + @FormParam("Stack") final String stack, + @FormParam("data_prep") final String data_prep, + @FormParam("data_prepsh") final String data_prepsh, + @FormParam("openseadragonDataDestinationFolder") final String openseadragonDataDestinationFolder, + @FormParam("openseadragonDataHost") final String openseadragonDataHost, + @FormParam("openseadragonDataSourceFolder") final String openseadragonDataSourceFolder, + @FormParam("renderHost") final String renderHost) { + String return_error = ""; + LOG.info("getTestService: entry, clustername={}, username={}, password={}", + clustername, username, password); + JSch jsch = new JSch(); + Session session; + //String JSerror=" "; + //String IOerror=" "; + String line=""; + try { + + // Open a Session to remote SSH server and Connect. + // Set User and IP of the remote host and SSH port. + session = jsch.getSession(username, clustername, 22); + // When we do SSH to a remote host for the 1st time or if key at the remote host + // changes, we will be prompted to confirm the authenticity of remote host. + // This check feature is controlled by StrictHostKeyChecking ssh parameter. + // By default StrictHostKeyChecking is set to yes as a security measure. + session.setConfig("StrictHostKeyChecking", "no"); + //Set password + session.setPassword(password); + session.connect(); + + // create the execution channel over the session + ChannelExec channelExec = (ChannelExec) session.openChannel("exec"); + // Set the command to execute on the channel and execute the command + channelExec.setCommand("bsub -P test -R 'rusage[mem=6000]' -q standard 'python3 "+data_prep+" "+stackowner+" "+stackproject+" "+stack+" " + +data_prep+" "+data_prepsh+" "+openseadragonDataDestinationFolder+" "+openseadragonDataHost+" "+openseadragonDataSourceFolder+ + " "+renderHost+"'"); + channelExec.connect(); + + // Get an InputStream from this channel and read messages, generated + // by the executing command, from the remote side. + InputStream in = channelExec.getInputStream(); + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + + while ((line = reader.readLine()) != null) { + System.out.println(line); + } + + // Command execution completed here. + + // Retrieve the exit status of the executed command + int exitStatus = channelExec.getExitStatus(); + if (exitStatus > 0) { + System.out.println("Remote script exec error! " + exitStatus); + return_error= "Remote script exec error! "; + } + //Disconnect the Session + session.disconnect(); + } catch (JSchException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + + + //return clustername+" "+username+" "+password+" "+stackowner+" "+stackproject+" "+stack+ " "+return_error+" "+line; + return line; + //return host_name; + } + + private static final Logger LOG = LoggerFactory.getLogger(OpenseadragonService.class); +} \ No newline at end of file diff --git a/render-ws/src/main/java/org/janelia/render/service/RenderDataService.java b/render-ws/src/main/java/org/janelia/render/service/RenderDataService.java index 6a7cac37c..25643ed10 100644 --- a/render-ws/src/main/java/org/janelia/render/service/RenderDataService.java +++ b/render-ws/src/main/java/org/janelia/render/service/RenderDataService.java @@ -111,6 +111,8 @@ public Response getLayoutFileForZ(@PathParam("owner") final String owner, return getLayoutFileForZRange(owner, project, stack, z, z, format, uriInfo); } + + @Path("v1/owner/{owner}/project/{project}/stack/{stack}/zRange/{minZ},{maxZ}/layoutFile") @GET @Produces(MediaType.TEXT_PLAIN) diff --git a/render-ws/src/main/java/org/janelia/render/service/TileDataService.java b/render-ws/src/main/java/org/janelia/render/service/TileDataService.java index dd7d94573..992c3f509 100644 --- a/render-ws/src/main/java/org/janelia/render/service/TileDataService.java +++ b/render-ws/src/main/java/org/janelia/render/service/TileDataService.java @@ -8,8 +8,10 @@ import javax.ws.rs.BeanParam; import javax.ws.rs.DELETE; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; +import javax.ws.rs.FormParam; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; @@ -84,6 +86,7 @@ public TileSpec getTileSpec(@PathParam("owner") final String owner, return tileSpec; } + @Path("v1/owner/{owner}/project/{project}/stack/{stack}/tile/{tileId}") @DELETE @ApiOperation( diff --git a/render-ws/src/main/scripts/docker/render-config.sh b/render-ws/src/main/scripts/docker/render-config.sh index 841b958bb..3d9d9989f 100755 --- a/render-ws/src/main/scripts/docker/render-config.sh +++ b/render-ws/src/main/scripts/docker/render-config.sh @@ -32,6 +32,13 @@ NDVIZHOST=$(stripQuotes ${NDVIZHOST}) NDVIZPORT=$(stripQuotes ${NDVIZPORT}) NDVIZ_URL=$(stripQuotes ${NDVIZ_URL}) + +VIEW_OPENSEADRAGON_HOST_AND_PORT=$(stripQuotes ${VIEW_OPENSEADRAGON_HOST_AND_PORT}) +VIEW_OPENSEADRAGON_DATA_HOST=$(stripQuotes ${VIEW_OPENSEADRAGON_DATA_HOST}) +VIEW_OPENSEADRAGON_DATA_SOURCE_FOLDER=$(stripQuotes ${VIEW_OPENSEADRAGON_DATA_SOURCE_FOLDER}) +VIEW_OPENSEADRAGON_DATA_DESTINATION_FOLDER=$(stripQuotes ${VIEW_OPENSEADRAGON_DATA_DESTINATION_FOLDER}) +VIEW_OPENSEADRAGON_PYTHON_FILE=$(stripQuotes ${VIEW_OPENSEADRAGON_PYTHON_FILE}) +VIEW_OPENSEADRAGON_MAGIC_SLICER=$(stripQuotes ${VIEW_OPENSEADRAGON_MAGIC_SLICER}) VIEW_CATMAID_HOST_AND_PORT=$(stripQuotes ${VIEW_CATMAID_HOST_AND_PORT}) VIEW_DYNAMIC_RENDER_HOST_AND_PORT=$(stripQuotes ${VIEW_DYNAMIC_RENDER_HOST_AND_PORT}) VIEW_RENDER_STACK_OWNER=$(stripQuotes ${VIEW_RENDER_STACK_OWNER}) @@ -39,6 +46,8 @@ VIEW_RENDER_STACK_PROJECT=$(stripQuotes ${VIEW_RENDER_STACK_PROJECT}) VIEW_RENDER_STACK=$(stripQuotes ${VIEW_RENDER_STACK}) VIEW_MATCH_OWNER=$(stripQuotes ${VIEW_MATCH_OWNER}) VIEW_MATCH_COLLECTION=$(stripQuotes ${VIEW_MATCH_COLLECTION}) +VIEW_DATA_PREP=$(stripQuotes ${VIEW_DATA_PREP}) +VIEW_DATA_PREPSH=$(stripQuotes ${VIEW_DATA_PREPSH}) WEB_SERVICE_MAX_TILE_SPECS_TO_RENDER=$(stripQuotes ${WEB_SERVICE_MAX_TILE_SPECS_TO_RENDER}) WEB_SERVICE_MAX_IMAGE_PROCESSOR_GB=$(stripQuotes ${WEB_SERVICE_MAX_IMAGE_PROCESSOR_GB}) @@ -147,6 +156,12 @@ if [ -z "${NDVIZ_URL}" ] & [ -n "${NDVIZHOST}" ]; then fi sed -i """ + s@view.openseadragonHost=.*@view.openseadragonHost=${VIEW_OPENSEADRAGON_HOST_AND_PORT}@ + s@view.data_prep=.*@view.data_prep=${VIEW_DATA_PREP}@ + s@view.data_prepsh=.*@view.data_prepsh=${VIEW_DATA_PREPSH}@ + s@view.openseadragonDataHost=.*@view.openseadragonDataHost=${VIEW_OPENSEADRAGON_DATA_HOST}@ + s@view.openseadragonDataSourceFolder=.*@view.openseadragonDataSourceFolder=${VIEW_OPENSEADRAGON_DATA_SOURCE_FOLDER}@ + s@view.openseadragonDataDestinationFolder=.*@view.openseadragonDataDestinationFolder=${VIEW_OPENSEADRAGON_DATA_DESTINATION_FOLDER}@ s@view.catmaidHost=.*@view.catmaidHost=${VIEW_CATMAID_HOST_AND_PORT}@ s@view.dynamicRenderHost=.*@view.dynamicRenderHost=${VIEW_DYNAMIC_RENDER_HOST_AND_PORT}@ s@view.matchOwner=.*@view.matchOwner=${VIEW_MATCH_OWNER}@ diff --git a/render-ws/src/main/scripts/install.sh b/render-ws/src/main/scripts/install.sh index 77bf6e2a3..54b91d1b8 100755 --- a/render-ws/src/main/scripts/install.sh +++ b/render-ws/src/main/scripts/install.sh @@ -1,7 +1,7 @@ #!/bin/bash JDK_VERSION="jdk1.8.0_131" -JETTY_VERSION="9.4.43.v20210629" # NOTE: jetty version should be kept in sync with values in render/render-ws/pom.xml and render/Dockerfile +JETTY_VERSION="9.4.9.v20180320" # NOTE: jetty version should be kept in sync with values in render/render-ws/pom.xml and render/Dockerfile JETTY_DIST="jetty-distribution-${JETTY_VERSION}" # URL for JDK 8 diff --git a/render-ws/src/main/scripts/jetty/resources/render-server.properties b/render-ws/src/main/scripts/jetty/resources/render-server.properties index a6f3c6b05..7da8a45f0 100644 --- a/render-ws/src/main/scripts/jetty/resources/render-server.properties +++ b/render-ws/src/main/scripts/jetty/resources/render-server.properties @@ -1,5 +1,11 @@ # Default View Properties (host values have form renderer-catmaid:8000) view.dynamicRenderHost= +view.openseadragonHost=localhost:8090 +view.data_prep= +view.data_prepsh= +view.openseadragonDataHost= +view.openseadragonDataSourceFolder= +view.openseadragonDataDestinationFolder= view.catmaidHost= view.ndvizHost= diff --git a/render-ws/src/main/webapp/script/LICENSE.txt b/render-ws/src/main/webapp/script/LICENSE.txt new file mode 100644 index 000000000..d4e256082 --- /dev/null +++ b/render-ws/src/main/webapp/script/LICENSE.txt @@ -0,0 +1,28 @@ +Copyright (C) 2009 CodePlex Foundation +Copyright (C) 2010-2013 OpenSeadragon contributors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +- Neither the name of CodePlex Foundation nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. diff --git a/render-ws/src/main/webapp/script/changelog.txt b/render-ws/src/main/webapp/script/changelog.txt new file mode 100644 index 000000000..603e9e9f5 --- /dev/null +++ b/render-ws/src/main/webapp/script/changelog.txt @@ -0,0 +1,528 @@ +OPENSEADRAGON CHANGELOG +======================= + +2.4.2: + +* Add support for IIIF Image API 3.0 beta (#1764) +* You can now crop an image with arbitrary polygons (#1772) +* Improved support for using the Reference Strip in an OpenSeadragon Viewer inside a Web Component (#1676) +* Added setWidth and setHeight methods to Navigator (#1686) +* Improvements to docs (#1696, #1698, #1716, #1719) +* Now passing Viewer AJAX configs down to ReferenceStrip thumbnails (#1701) +* The ReferenceStrip now honors the useCanvas option from the Viewer (#1742) +* Fixed: Navigator was still resizing after you explicitly set its width and height with navigatorWidth and navigatorHeight (#1686) +* Fixed issues with touches on iOS 13 and iPad (#1754, #1756) +* No longer throwing an exception on pages that have malformed URL parameters (#1758) +* Fixed an issue with flipping the viewport on high pixel density screens (#1779) +* Removed use of deprecated imageSmoothingEnabled prefixes (#1740) + +2.4.1: + +* You can now turn off the default canvas image smoothing, if you want sharp pixels when zoomed in past 100% (#1507, #1593, #1595, #1647, #1648) +* Fixed problem with navigator highlight rectangle when returning from full screen with a custom navigator location (#1515) +* Added option to set rotation increment for nav buttons and keyboard (#1524) +* Fixed issue with flipping and opacity with multi-image (#1549) +* Removed vestigial button group label element that was causing issues for accessibility tools (#1560) +* Fixed a bug causing Viewer.areControlsEnabled to throw an exception (#1562) +* Added tileFormat option to IIIFTileSource so you can specify the tile format (#1625) +* Now using canonical URIs more consistently in IIIF to make caching and processing time easier on the server side (#1625) +* Added support for IIIF's new preferredFormats property (#1656) + +2.4.0: + +* BREAKING CHANGE: Viewer's canvas-double-click event is now fired before it initiates the zoom (#1288) +* You can now flip the viewport to get a mirror image of the original (#1441) +* You can now prevent canvas-double-click events from zooming on a per-event basis (#1288) +* Fixed: Opacity 0 images were causing unnecessary redraws (#1319) +* The "page" event is now fired after the page index has been updated (#1330) +* Added option pixelsPerArrowPress that sets the speed of arrow keys (#1364) +* Improved IIIF options.maxLevel calculation (#1401) +* Added canvas-key events, along with the ability to cancel key actions (#1414) +* Added optional zoom in the middle of the image instead of pointer position (#1423) +* Now supporting square edge tiles that are padded rather than cropped (#1426) +* Fixed an issue causing the simple image tileSource to sometimes show duplicate copies (#1370) +* Fixed an issue causing seams to appear in semi-transparent PNG tiled images (#1470) +* Added visual customization options for the navigator (#1480) +* You can now prevent canvas-drag events on the navigator (#1484) +* You can now prevent canvas-click events on the navigator (#1416) +* The navigator can now be restricted to just horizontal or just vertical panning (#1416) +* Fixed DziTileSource so it doesn't load levels above maxLevel or below minLevel, if set (#1492) + +2.3.1: + +* Debug mode now uses different colors for different tiled images (customizable via debugGridColor) (#1271) +* Fixed a problem with preventDefaultAction for the canvas-drag event (#1278) +* Fixed an issue causing double images with certain aspect ratios (#1280) +* Fixed: placeholderFillStyle had no effect (#1286) +* Fixed seams that appear in wrap mode on Safari and Firefox (#1305) + +2.3.0: + +* BREAKING CHANGE: Tile.distance has been removed (#1027) +* BREAKING CHANGE: Viewer's canvas-click event is now fired before it initiates the zoom (#1148) +* BREAKING CHANGE: Viewer's canvas-drag event is now fired before it pans (#1149) +* Added Zoomify tile source (#863) +* You can now set the rotation of individual tiled images (#1006) +* Added getFullyLoaded method and "fully-loaded-change" event to TiledImage to know when tiles are fully loaded (#837, #1073) +* You can now preload images without drawing them to the screen (#1071) +* Added support for commonjs (#984) +* Added an option to addTiledImage to change the crossOriginPolicy (#981) +* You can now load tiles via AJAX and custom AJAX request headers (#1055) +* Added ability to provide thumbnail URLs for reference strip (#1241) +* Improved panning constraints for constrainDuringPan (#1133 and #1245) +* You can now prevent canvas-click events from zooming on a per-event basis (#1148) +* You can now prevent canvas-drag events from panning on a per-event basis (#1149) +* The navigationControlAnchor option now works for custom toolbar as well (#1004) +* LegacyTileSource now allows any image URLs regardless of type (#1056) +* Enabled configuration of ImageLoader timeout (#1192) +* Viewer.open() now supports an initialPage argument for sequenceMode (#1196) +* New events for opacity and compositeOperation changes (#1203) +* Added support for setting debug mode after the Viewer object has been constructed (#1224) +* Added functions for dynamically adding and removing the reference strip in sequence mode (#1213) +* Better calculation for TileCache release cutoff (#1214) +* The navigator now picks up opacity and compositeOperation changes (#1203) +* Improved calculation for determining which level to load first (#1198) +* Added fix for supporting weird filenames that look like JSONs (#1189) +* Improved DziTileSource guessing of tilesUrl (#1074) +* The Viewer's tileSources option is now smarter about detecting JSON vs XML vs URL (#999) +* Better compression for our UI images (#1134) +* Optimization: Use the squared distance when comparing tiles (#1027) +* Now clamping pixel ratio density to a minimum of 1, fixing display issues on low density devices (#1200) +* More forgiving check for DZI schema (#1249) +* ImageTileSource now works in IE8 (#1041) +* Fixed CORS bug in IE 10 (#967) +* Fixed issue with tiles not appearing with wrapHorizontal/wrapVertical if you pan too far away from the origin (#987, #1066) +* Fixed: Initial tile load wasn't happening in parallel (#1014) +* Fixed problem with "sparse image" DZI files (#995) +* Fix IndexSizeError on IE and Edge that occurred under certain circumstances (e.g. multi-image with transparency) (#1035) +* Fixed error in IE8 when zooming in (due to edge smoothing) (#1064) +* Fixed issue with OpenSeadragon.version in the minified JavaScript (#1099) +* Fixed smoothTileEdgesMinZoom performance degradation on single-tile images (#1101) +* Fixed issue with tiles not appearing after rotation (#1102) +* Fixed: The navigator wasn't respecting the constrainDuringPan setting (#1104) +* Fixed an issue causing overlays to be mis-positioned in some circumstances (#1119) +* Fixed: ImageTileSource would sometimes produce a double image (#1123) +* Fixed: console.debug caused exceptions on IE10 (#1129) +* Fixed: the reference strip would leak memory when opening new sets of images (#1175) +* Fixed: zoomTo/zoomBy ignore refPoint if immediately is true (#1184) +* Fixed: IIPImageServer didn't work with the latest OSD release (#1199) +* Fixed: setItemIndex method not working with navigator inside "open" event (#1201) +* Fixed: The reference strip didn't show the initial page if it wasn't the first page (#1208) +* Fixed: Sometimes the image would stick to the mouse when right-clicking and left-clicking simultaneously (#1223) +* Fixed issue with transparent images sometimes disappearing on Safari (#1222) +* Fixed: One image failing to load could cause the others to never load (#1229) +* Fixed: Mouse up outside map will cause "canvas-drag" event to stick (#1133) +* Fixed more issues with tracking multiple pointers (#1244) + +2.2.1: + +* Fixed problems with zoom/pan constraints with certain extreme settings (#965) +* Fixed an issue causing the browser to crash on iOS (#966) + +2.2.0: + +* BREAKING CHANGE: Viewport.homeBounds, Viewport.contentSize, Viewport.contentAspectX and + Viewport.contentAspectY have been removed. (#846) +* BREAKING CHANGE: The Overlay.getBounds method now takes the viewport as parameter. (#896) +* DEPRECATION: Overlay.scales, Overlay.bounds and Overlay.position have been deprecated. (#896) + * Overlay.width !== null should be used to test whether the overlay scales horizontally + * Overlay.height !== null should be used to test whether the overlay scales vertically + * The Overlay.getBounds method should be used to get the bounds of the overlay in viewport coordinates + * Overlay.location replaces Overlay.position +* DEPRECATION: Viewport.setHomeBounds has been deprecated (#846) +* DEPRECATION: the Viewport constructor is now ignoring the contentSize option (#846) +* Tile edge smoothing at high zoom (#764) +* Fixed issue with reference strip popping up virtual keyboard on mobile devices (#779) +* Now supporting rotation in the Rect class (#782) +* Drag outside of iframe now works better, as long as both pages are on the same domain (#790) +* Coordinate conversion now takes rotation into account (#796) +* Support tile-less IIIF as per LegacyTileSource (#816) +* You can now give an empty string to the tabIndex option (#805) +* Fixed issue with rotation and clicking in the navigator (#807) +* Broadened the check for mime type in LegacyTileSource URLs to allow query strings (#819) +* Added globalCompositeOperation option for tiledImage, to allow for different transfer modes (#814) +* Added Viewer.addSimpleImage method for easily adding non-tiled images (#827) +* DziTileSource now works properly with DZI files that have no extension (#835) +* Fixed content clipping with rotation (#463, #567 and #833) +* Fixed navigator not being rotated when viewport rotation is set in constructor (#840) +* Fixed: Viewer.setMouseNavEnabled wasn't affecting all of the viewer's trackers (#845) +* Fixed: with scrollToZoom disabled, the viewer caused page scrolling to slow down (#858) +* Added Viewer.getOverlayById and Overlay.getBounds functions (#853) +* Tiled images with 0 opacity no longer load their tiles or do drawing calculations (#859) +* Fixed issue with edge smoothing with PNG tiles at high zoom (#860) +* Fixed: Images with transparency were clearing images layered below them (#861) +* Fixed issue causing HTML pages to jump unwantedly to the reference strip upon loading (#872) +* Added addOnceHandler method to EventSource (#887) +* Added TiledImage.fitBounds method (#888) +* Overlays can now be scaled in a single dimension by providing a point location and either width or height (#896) +* Added full rotation support to overlays (#729, #193) +* Viewport.goHome() now takes clipping into account (#910) +* Improved zoom to point (#923) +* Optimized sketch canvas clearing and blending for images with opacity or transfer modes (#927) +* Now taking rotation into account in viewport getBounds and fitBounds methods (#934) +* Added option to disable navigator auto-fade (#935) +* Fixed issue with maintaining viewport position with full screen (#940) +* Fixed an issue with simultaneous touch events (#930) +* Avoid loading clipped out tiles (#939) +* Improved precision for subtle moves with fitBounds (#939) +* Fixed an issue in viewer.addTiledImage with replace:true when viewer has navigator (#948) + +2.1.0: + +* BREAKING CHANGE: the tile does not hold a reference to its image anymore. Only the tile cache keep a reference to images. +* BREAKING CHANGE: TileSource.tileSize no longer exists; use TileSource.getTileWidth() and TileSource.getTileHeight() instead. +* DEPRECATION: let ImageRecord.getRenderedContext create the rendered context instead of using ImageRecord.setRenderedContext +* DEPRECATION: TileSource.getTileSize() is deprecated. Use TileSource.getTileWidth() and TileSource.getTileHeight() instead. +* Changed resize behaviour to prevent "snapping" to world bounds when constraints allow more space (#711) +* Added support for non-square tiles (#673) + * TileSource.Options objects can now optionally provide tileWidth/tileHeight instead of tileSize for non-square tile support. + * IIIFTileSources will now respect non-square tiles if available. +* Added new tile source for simple images: ImageTileSource (#760) +* Optimized adding large numbers of items to the world with collectionMode (#735) +* Registers as an AMD module where possible (#719) +* Added "tile-loaded" event on the viewer allowing to modify a tile before it is marked ready to be drawn (#659) +* Added "tile-unloaded" event on the viewer allowing to free up memory one has allocated on a tile (#659) +* Added 'tile-load-failed' event (#725) +* Added additional coordinates conversion methods to TiledImage (#662) +* Added `preserveImageSizeOnResize` option (#666) +* Added collectionColumns as a configuration parameter (#680) +* Added option in addTiledImage to replace tiledImage at index (#706) +* Added autoRefigureSizes flag to World for optimizing mass rearrangements (#715) +* You can now change viewport margins after the viewer is created (#721) +* Added a patch to help slow down the scroll devices that fire too fast (#754) +* Fixed flickering tiles with useCanvas=false when no cache is used (#661) +* 'display: none' no longer gets reset on overlays during draw (#668) +* Better error reporting for tile load failures (#679) +* Added XDomainRequest as fallback method for ajax requests if XMLHttpRequest fails (for IE < 10) (#693) +* Now avoiding using eval when JSON.parse is available (#696) +* Rotation now works properly on retina display (#708) +* Fixed issue with tiledImages loading tiles at every level instead of just the best level (#728) +* Fixed placeholderFillStyle flicker (#727) +* Fix for Chrome (v45) issue that key is sometimes undefined outside of the for-in loop (#730) +* World.removeAll now cancels any in-flight image loads; same for Viewer.open and Viewer.close (#734) +* Fixed overlays position (use rounding instead of flooring and ceiling) (#741) +* Fixed issue with including overlays in your tileSources array when creating/opening in the viewer (#745) +* Fixed issue in iOS devices that would cause all touch events to fail after a Multitasking Gesture was triggered (#744) +* Fixed an issue with TiledImage setPosition/setWidth/setHeight not reliably triggering a redraw (#720) +* Fixed zooming in with plus key on a Swedish keyboard (#763) + +2.0.0: + +* True multi-image mode (#450) + * BREAKING CHANGE: Passing an array for the tileSources option is no longer enough to trigger sequence mode; you have to set the sequenceMode option to true as well + * BREAKING CHANGE: Navigator no longer sends an open event when its viewer opens + * BREAKING CHANGE: Viewer.drawers and Viewer.drawersContainer no longer exist + * BREAKING CHANGE: A Viewer's Drawer and Viewport are now made once per Viewer and reused for every image that Viewer opens (rather than being recreated for every open); this means if you change Viewer options between opens, the behavior is different now. + * DEPRECATION: use Viewer.addTiledImage instead of Viewer.addLayer + * addTiledImage supports positioning config properties + * DEPRECATION: use World.getItemAt instead of Viewer.getLayerAtLevel + * DEPRECATION: use World.getIndexOfItem instead of Viewer.getLevelOfLayer + * DEPRECATION: use World.getItemCount instead of Viewer.getLayersCount + * DEPRECATION: use World.setItemIndex instead of Viewer.setLayerLevel + * DEPRECATION: use World.removeItem instead of Viewer.removeLayer + * DEPRECATION: use World.needsDraw instead of Drawer.needsUpdate + * DEPRECATION: use TileCache.numTilesLoaded instead of Drawer.numTilesLoaded + * DEPRECATION: use World.resetItems instead of Drawer.reset + * DEPRECATION: use Drawer.clear and World.draw instead of Drawer.update + * DEPRECATION: the layersAspectRatioEpsilon option is no longer necessary + * DEPRECATION: Viewer's add-layer event is now World's add-item event + * DEPRECATION: Viewer's layer-level-changed event is now World's item-index-change event + * DEPRECATION: Viewer's remove-layer event is now World's remove-item event + * DEPRECATION: Viewer's add-layer-failed event is now add-item-failed + * DEPRECATION: TileSourceCollection has been retired in favor of World + * DEPRECATION: collectionMode no longer draws outlines or reflections for items + * Drawer has been split into three classes: + * TiledImage, tile management and positioning for a single tiled image + * TileCache, tile caching for all images + * Drawer, tile drawing for all images + * New class: World, keeps track of multiple images in the scene + * Viewer now has world and tileCache properties + * Rect and Point now have clone functions + * New Viewport method for managing homeBounds as well as constraints: setHomeBounds + * Viewport.open supports positioning config properties + * For multi-image open, drawing isn't started until all tileSources have been opened + * You can specify a clip area for each image (only works on browsers that support the HTML5 canvas) (#594) + * Added placeholderFillStyle so image rectangles can be drawn even before their tiles load (#635) + * Ability to set opacity on individual TiledImages (#644) +* Margins option to push the home region in from the edges of the Viewer (#505) +* Rect and Point toString() functions are now consistent: rounding values to nearest hundredth +* Overlays appear in the DOM immediately on open or addOverlay (#507) +* imageLoaderLimit now works (#544) +* Turning off scrollToZoom in gestureSettings now allows scroll events to propagate +* You can now set a minZoomLevel that's greater than the home zoom level +* Added union() to OpenSeadragon.Rect +* Fixed an error in fitBounds if the new and old bounds were extremely close in size +* Added ajaxWithCredentials option (#543) +* Added viewport-change event for after the viewport changes but before it's drawn +* A spring's current value is now updated immediately on reset (#524) +* Fixed an error in fitBounds that occurred sometimes with immediately = true +* Added support for HDPI (retina) displays (#583) +* Corrected IIIF tile source to use canonical syntax (#586) +* Fixed x/y typo that caused horizontal reference strip to be rendered only relative to height (#595) +* Fixed Firefox 35 not able to open local files (#588) +* Fixed an issue with zero size viewers in IE8 (#609) +* Fixed: Cross Origin policy not working (#613) +* Optimized tile loading by clearing the queue on a re-draw when imageLoaderLimit is set (#616) +* Now animating zoom spring exponentially (#631) +* Added http://editorconfig.org/ config file (#637) +* Keyboard pan speed is now the same regardless of zoom level (#645) + +1.2.1: + +* Added preserveOverlays option (#561) +* Fixed: DZI tilesource was broken on IE8/IE9 (#563) +* Exposed secondary pointer button (middle, right, etc.) events from MouseTracker and through viewer (#479) +* MouseTracker - Improved IE 8 compatibility (#562) +* MouseTracker - Improved IE 9+ compatibility (#564) +* MouseTracker - Simulated touchenter/touchleave events now bubble to parent element MouseTrackers (#566) +* MouseTracker - Improved multitouch support in enter/exit event handlers (#566) +* MouseTracker - orphaned tracked touch pointers removed (fix for #539) +* MouseTracker - removed touchenter/touchleave event support since the events don't exist on any known platform and have been removed from the W3C specification (#566) +* Removed Viewer onContainerPress/onContainerRelease handlers (and the associated 'container-release' event ) that were never fired due to the canvas (child) element capturing the DOM events (#566) +* Added 'canvas-enter', 'canvas-exit', and 'canvas-press' events to Viewer (#566) +* ButtonGroup - removed obsolete MouseTracker event handlers (#566) +* MouseTracker - added keydown and keyup handlers (#568) +* Modifier keys ignored in keyboard navigation handlers (#503) +* Requesting keyboard focus when viewer is clicked (#537) +* Arrow key navigation fixed across platforms (#565) +* Removed textarea element from viewer DOM. Viewer.canvas now handles keyboard navigation (#569) +* Removed 'position' property from MouseTracker keyDownHandler/keyUpHandler/keyHandler functions (#573) +* Fixed pointer event model detection for IE 10 and IE 11 (#571) +* Added setMouseNavEnabled() support to Navigator (#572) +* MouseTracker now defaults to tracking on (#558) +* Removed Viewer focusHandler/onCanvasFocus (#577) +* Added tabIndex option to viewer (#577) + +1.2.0: + +* New combined IIIF TileSource for 1.0 through 2.0 (#441) + * BREAKING CHANGE: Removed IIIF1_1TileSource (now that IIIFTileSource supports all versions) +* Allowed TileSources to have dynamic tileSize via source.getTileSize(level) (#441) + * DEPRECATION: Use .getTileSize(level) instead of .tileSize +* Fix for IIPServer-style urls when using DZI (#413) +* Fix memory leak while destroying the viewer (#421) +* Added fitBoundsWithConstraints() to the viewport (#423) +* Fixed MouseTracker cross-browser issues with tracking pointers over and out of the tracked element (pull request #448, fix for #152, #404, #420, and #427) +* Fixed incorrect flick direction after image is rotated (#452) +* Debug mode now works with rotate images (#453) +* Now supporting dzi xml with namespaces (#462) +* You can now rotate the navigator along with the main viewer (#455) +* Viewport.setRotation now allows all rotation angles (#466) +* Pinch rotate is now available (defaults to off) (#468) +* Added option for home button to fill viewer (#474) +* Better handling of mid-update image loaded callbacks (#409) +* Tracked pointers are now cleaned up when Viewer.setMouseNavEnabled(false) is called (#518) +* Added explicit pointer capture for touch event model touchstart events (#552) + +1.1.1: + +* Fixed issue with dragging the navigator highlight on Webkit browsers (#395) +* Improved Viewer Options Support in Gesture Handling (#399) + +1.1.0: + +* BREAKING CHANGE: the openseadragon-canvas element now has two child divs. This means: (#298) + * The drawer element is no longer accessible via viewer.canvas.firstChild but via viewer.drawersContainer.firstChild or viewer.drawer.canvas. + * The overlays elements are no longer accessible via viewer.canvas.childNodes but via viewer.overlaysContainer.childNodes or viewer.currentOverlays[i].element. +* BREAKING CHANGE: Pseudo full screen mode on IE<11 using activex has been dropped. OpenSeadragon will run in full page if full screen mode is requested. +* BREAKING CHANGE: MouseTracker touch pinch gestures are no longer converted to scroll events. MouseTracker.pinchHandler should be used instead. (#369) +* DEPRECATION: overlay functions have been moved from Drawer to Viewer (#331) +* DEPRECATION: OpenSeadragon.cancelFullScreen has been renamed OpenSeadragon.exitFullScreen (#358) +* DEPRECATION: The 'isTouchEvent' property passed in MouseTracker events is deprecated and has been replaced with 'pointerType', which is a String value "mouse", "touch", "pen", etc. to support multiple simultaneous pointing devices (#369) +* DEPRECATION: The 'buttonDownAny' property passed in MouseTracker enter and exit events (enterHandler/exitHandler) is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369) +* DEPRECATION: The 'buttonDownAny' property passed in Viewer's 'container-enter' and 'container-exit' events is deprecated and has been replaced with 'buttons', which indicates the button(s) currently pressed (#369) +* Added layers support. Multiple images can now been displayed on top of each other with transparency via the Viewer.addLayer method (#298) +* Improved overlay functions (#331) +* Fixed: Nav button highlight states aren't quite aligned on Firefox (#303) +* Added ControlAnchor options for default controls (#304) +* Enabled basic cross-domain tile loading without tainting canvas (works in Chrome and Firefox) (#308) +* Added crossOriginPolicy drawer configuration to enable or disable CORS image requests (#364) +* Disabled CORS by default (#377) +* Added a ControlAnchor.ABSOLUTE enumeration. Enables absolute positioning of control elements in the viewer (#310) +* Added a 'navigator-scroll' event to Navigator. Fired when mousewheel events occur in the navigator (#310) +* Added a navigatorMaintainSizeRatio option. If set to true, the navigator minimap resizes when the viewer element is resized (#310) +* Added 'ABSOLUTE' as a navigatorPosition option, along with corresponding navigatorTop, navigatorLeft options. Allows the navigator minimap to be placed anywhere in the viewer (#310) +* Enhanced the navigatorTop, navigatorLeft, navigatorHeight, and navigatorWidth options to allow a number for pixel units or a string for other element units (%, em, etc.) (#310) +* Additional enhancements for IIIF support (#315) +* Fixed: Setting degrees in Viewer constructor has no effect (#336) +* Added pre-draw event for tiles to allow applications to alter the image (#348) +* Added optional Rotate Left/Right buttons to standard controls (#341) +* Added optimization for large numbers of overlays: `checkResize = false` option for OpenSeadragon.Overlay (#365) +* Updated full screen API, adding support for Opera and IE11 and allowing keyboard input in Chrome (#358) +* Various fixes to bring OpenSeadragon into W3C compliance (#375) +* Added separate flags for turning off each of the nav buttons (#376) +* Added support for query parameters in DZI tileSource URL (#378) +* Enhanced MouseTracker for multi-touch (#369) + * Added support for tracking multiple touch-points on multiple/simultaneous pointing devices + * Added support for the W3C Pointer Events event model. Enables touch/multi-touch on IE10+ + * Added a dragEndHandler event callback, called when a drag gesture ends + * Added a pinchHandler event callback, called as a pinch gesture (2 touch points) is occurring + * Added real-time velocity (speed and direction) tracking to drag operations. 'speed' and 'direction' values are passed in the dragHandler and dragEndHandler event data +* Enhanced Viewer for multi-touch (#369) + * Added pinch zoom with the new MouseTracker pinchHandler. The 'pan' and 'zoom' Viewer events can be used to detect changes resulting in pinch gestures + * Added a "canvas-pinch" event fired by the pinch event handler + * Added flick gesture with the new MouseTracker dragEndHandler + * Added a "canvas-drag-end" event fired by the drag-end event handler + * Added a GestureSettings class for per-device gesture options. Currently has settings to enable/disable zoom-on-scroll, zoom-on-pinch, zoom-on-click, and flick gesture settings. + * Added GestureSettings objects for mouse, touch, and pen devices to the Viewer options giving users the ability to customize gesture handling in the viewer + * Added velocity (speed and direction) properties to the "canvas-drag" event +* Added double-click gesture detection to MouseTracker with corresponding dblClickHandler event callback (#392) +* Added zoom on double-click feature to Viewer, with corresponding dblClickToZoom option added to the GestureSettings class (#392) +* Made it possible to run OpenSeadragon from local filesystem on some browsers (#379) + +1.0.0: + +NOTE: This version has a number of breaking changes to the API, mostly in event handling. See below. + +* BREAKING CHANGE: All EventSource and MouseTracker event handler method signatures changed to 'handlerMethod(event)' where event == { eventSource, userData, ... } (#251) (Also fixes #23, #224, #239) + * The new eventSource property in the event object replaces the old eventSource parameter that was passed to handler methods. + * Where the event object duplicated the eventSource value, those properties have been removed. This affects the following events: + * All Button events - 'button' property removed + * All Viewer (Viewer, Drawer, Viewport) events - 'viewer' property removed +* BREAKING CHANGE: Renamed EventHandler to EventSource (#225) +* BREAKING CHANGE: Event names changed for consistency: changed to lower case, compound names hyphenated, and "on" prefixes removed (#226): + * Viewer "animationstart" changed to "animation-start" + * Viewer "animationfinish" changed to "animation-finish" + * Button "onPress" changed to "press" + * Button "onRelease" changed to "release" + * Button "onClick" changed to "click" + * Button "onEnter" changed to "enter" + * Button "onExit" changed to "exit" + * Button "onFocus" changed to "focus" + * Button "onBlur" changed to "blur" +* BREAKING CHANGE: Numerous improvements to fullPage/fullScreen (#256): + * Retains zoom/pan position better when switching into and out of fullPage. + * Retains scroll position when switching back out. + * More resilient to styling variations on the page. + * setFullPage no longer automatically engages fullScreen; there's now a separate setFullScreen. + * 'fullpage' event is now 'full-page'. + * The `fullpage` property of the 'full-page' event is now `fullPage`. + * There is now a 'full-screen' event with a `fullScreen` property (true if it has gone to full screen). + * There are now 'pre-full-page' and 'pre-full-screen' events that include a `preventDefaultAction` property you can set in your handler to cancel. They also have `fullPage` and `fullScreen` properties respectively, to indicate if they are going into or out of the mode. +* BREAKING CHANGE: Removed the 'onPageChange' callback from the viewer options. Viewer.goToPage() now raises the 'page' event only (#285) +* Major documentation improvements (#281) +* MouseTracker now passes the original event objects to its handler methods (#23) +* MouseTracker now supports an optional 'moveHandler' method for tracking mousemove events (#215) +* Added stopHandler to MouseTracker. (#262) +* Fixed: Element-relative mouse coordinates now correct if the element and/or page is scrolled (using new OpenSeadragon.getElementOffset() method) (#131) +* Fixed: Pinch zoom event issue, regressive issue from previous event system changes (#244) +* Added IIIF Image API 1.1 Tile Source (#230) +* IIIF 1.0 now uses pixel based syntax (#249) +* Fixed: Touch event issue where no canvas-click events were being raised (#240) +* Check that zoom reference point is valid before using it in zoomTo and zoomBy (#247) +* Added a number of easier coordinate conversion methods to viewport (#243) +* Added the ability to create a viewer and start at a specified page (#252) +* Fixed image resolve issue with collection mode (#255) +* DOM events are now passed through as 'event.originalEvent' in viewer and button events where appropriate. (#257) Affects the following events: + * Viewer: 'canvas-release', 'canvas-click', 'canvas-drag', 'canvas-scroll', 'container-enter', 'container-exit', 'container-release' + * Button: 'enter', 'exit', 'press', 'release', 'focus', 'blur', 'click' +* Fixed: IE 10 not reading DZI file correctly in certain circumstances (#218) +* Added support for the 'wheel' DOM mousewheel event (#261) +* Fix for non-canvas tile rendering at large size (#264) +* Drawer now uses an HTML5 canvas element whenever it's available. Can be overridden with the Viewer.useCanvas option (#191) +* Added a boolean preventDefaultAction property (default false) to the event object passed to MouseTracker handler methods. (#270) Implemented in the following MouseTracker subscribers: + * Viewer.keyboardCommandArea.innerTracker.focusHandler: preventDefaultAction == true prevents scrolling viewer into view + * Viewer.keyboardCommandArea.innerTracker.keyHandler: preventDefaultAction == true prevents viewer keyboard navigation + * Viewer.innerTracker.clickHandler: preventDefaultAction == true prevents viewer zoom on click + * Viewer.innerTracker.dragHandler: preventDefaultAction == true prevents viewer panning with mouse/touch + * Viewer.innerTracker.scrollHandler: preventDefaultAction == true prevents viewer zooming on mousewheel/pinch +* Fixed: IE8 error with custom buttons - "Object doesn't support this action" (#279) +* Support IIIF servers that don't report tile dimensions (#286) +* Added an autoResize option. Default is true. When set to false, the viewer takes no action when its container element is resized. (#291) +* Added a static 'version' property to OpenSeadragon. Useful for plugins that require specific OpenSeadragon versions. (#292) + +0.9.131: + +* Fixed: canvas-click event shouldn't fire as you drag (#198) +* Fixed: LegacyTileSource doesn't fail gracefully when no supported file formats are found (#202) +* Added an optional userData argument to EventHandler.addHandler() which is passed unchanged to the handler method (#203) +* Fixed AJAX error reporting on IE8 (#208) +* Added viewportToImageRectangle method, and updated imageToViewportRectangle, imageToViewportCoordinates, and viewportToImageCoordinates to be more flexible with params (#212) +* Fixed: Viewer is not responsive (css) after returning from full screen (#222) + +0.9.130: + +* Added partial support for rotation (just 90 degree increments for now). (#185) +* Hiding and restoring broke the viewer; fixed (#177) +* You can now provide an onDraw function for overlays to do custom overlay manipulation (#160) +* Added a destroy function on the viewer to clean up and remove elements (#179) +* Fixed: navigatorPosition option corrected. (#163) +* OpenSeadragon.now() returned undefined the first time; fixed +* onTouchEnd did not call the correct mouse up handler; fixed (#159) +* Touch events no longer capture mouse (was causing issues on devices that support both) (#168) +* Clicking on a button control no longer refreshes page (#184) +* Drawer now works when the page is rtl (#187) +* Fixed a situation that could throw errors in touch handling (#188) + +0.9.129: + +* Fixed: navigator image not updating when base zoom image is changed (#147) +* Fixed tile rendering issue at lower zoom levels with the IIIF TileSource (#55) +* On IE, ajax errors would cause an exception to be thrown; fixed (#144) +* Faster and more consistent millisecond getter (#138) +* Fixed an error when using navPrevNextWrap on single images (#135) +* Various fixes to our timer handling (#133) +* Now generating source map for openseadragon.min.js (#51) +* Fix for calculating overlay width / height (#142) +* JSHint tidying (#136) +* Improved Ajax method (#149) +* Overhauled AJAX error reporting (#151) + +0.9.128: + +* The navigator is now off by default (#102) +* Reverted minPixelRatio to 0.5 for better quality (#116) +* Sometimes tiles wouldn't resolve if you used the blendTime option; fixed. (#95) +* You can now choose to have previous and next buttons wrap using the config.navPrevNextWrap. (#114) +* You can now specify an ID for a div to hold the navigator (#46) +* You can now click in the navigator to go to a new location (#46) +* Keyboard handling is now done in the viewer rather than navigator (#46) +* Additional navigator fixes (#46) +* Drawer events now fire properly (#94) +* Fixed an error in EventHandler.removeHandler() (#48) +* Better requestAnimationFrame detection on older Firefox (#103) +* More efficient navigator loading (#115) +* Simplified element opacity setting implementation (#123) + +0.9.127: + +* Fixed a problem with getString when the string property is a sub-property. (#64) +* Fixed: Tooltips for Navigation Controls not displaying (#63) +* Cleaned up some diagnostic code that was broken. +* Added fullpage class to viewer element when in fullpage mode (#61) +* Reverted to original New BSD license; cleaned up license declarations (#89) + +0.9.126: + +* DZI JSONp was broken; fixed. + +0.9.125: + +* Fully deprecated OpenSeadragon.createFromDZI, safely deprecated Viewer.openTileSource and + Viewer.openDZI to use Viewer.open internally. (#53 & #54). +* Full page bug fix for when viewer is child of document body (#43). +* Overlays for DZI bug fix (#45). +* DziTileSource: avoid changing relative paths (#56). +* Fix typo in preserveViewport handling (#77). +* Fix updateMulti timer leak after multiple Viewer.open() calls (#76). +* Minor documentation fixes. + +0.9.124: + +* Performance enhancements. + + +0.9.123: + +* Real fullscreen support. + + +0.9.122: + +* Performance enhancements. + + +0.9.121: + +* Touch pan now works on Android. +* Pinch zoom is better on all devices. diff --git a/render-ws/src/main/webapp/script/images/button_grouphover.png b/render-ws/src/main/webapp/script/images/button_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..9db590ea2adb845fc875b2e3a1fc45ad2a5fc8c8 GIT binary patch literal 1506 zcmV<81s(c{P);M1%f1T;mr?<=Ha+c?L;^&`#KKSXUpPrTg1t>37V40yV4#or#e*E#rTU>{zSFhgW zP$<;V_kB_-7K@ZjCifmZc<{GZUw!qH4?q0yFcD>y%ups6Gl(rALXSQ6ShE{$xZ$3L z4IAEUSr)+w;$R3BLI_e&sZ@%#ZQJ(oyYIgH{>LAGypM=dPzK6LpkgVIxCoH&>eZ_k zckI~lb%x-<7(}_DLY?#9Fcd43${X2YXY(jFqV|dAZymF zxw%c7HZRz=O@%^%^7%Z&C?Fj~fd=BgbsUFcu^3gaUVU7jK7BGj{P4q8mEbx=DU8XL z@Q*+KI2Mk)6Ap(Ng6&rW8$*XuVC+!Mnl%YAtZv=9+mkZACHM@hS z2OvgA^n2>s1jkbbclp>7t1z)_*|KeF$?J7UcSbL0p*nTy{GT6yB;+^K-&jcj7^Oh? zw+zFp3%N&4n>L+AMAe`ukE0b(VVRtH?z!iBVtTr2346|5Q7cD3SHZtiK>Qqbxj};l zZHEmT)?I^f)HIo#aay--J&s*b^X(M@!+r`PAN;N*$hKUvh08y}xkZ++0pj2q=e8~H zS^883E;nx6nDb{S5k(Y?a>gMov}x*sr1g{WxUd|DLLrCj0tRD7eGP#NX zlgERK~Xvi?Ezli)#YZBFEZ|(Y0Lkw1Q`Z@t^{#@0RAxn{Vua;K6yyt~A&cOh0YhxN#qx-=S?KSl+qXfz86c z#X;7OYu~;-KSVXk%M!bY=h5e%e@<}y8?3JNL{tvNp^S9N(_w@rXEy?G(-G0$bzLs! zsx4fSIBM0ZMJG<2V3?K1k01Yth|VyK+Hk4dQ7~lcQK-W4y?gi088Bc#@ZfYh%{g?@ zj&ShyfnNqKhRVy!--E+EMP<^JG?X*Llze)eJbCg2lCEsircI;!_3KB~s#Rkk)vwMg z20$MQTFTQ;Kg}!XJ-GV^5uJuApoF&L^UvjsufrkPc49>wMBA^6Xxg=FS5-v==~Kt| zxu>Dy2R#TIDSGk67dhu%LVNj9f|N5zsVl}kaLN8RA~!-c9LH&dy~rJ~ec{xpQ>jar zEaC28jaGiW5;Oo=FRloci$0e)vuV=FYz+Rv^Yd625E!+2`^i&s$9?*jGbH$r+&xrs2seKkIE7AhWz3`Ra^#=ifM|V4z=Pu#lUIk zh#Vv#<&%B*`3jhEB07*qo IM6N<$g437j#Q*>R literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/button_hover.png b/render-ws/src/main/webapp/script/images/button_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..645c241b9fd4ceb3b2dc44ad9dc81c323ccdf803 GIT binary patch literal 1827 zcmV+;2i*9HP)Kn2s5j9y2q;GEZPKnIyKmyRNg-y0dZ~ zy?I(F=~JzDpuhQTH-vEJRrEXfjDOJ@iahXr_?mMvTyT9>WGIJlNQcP%n>_5X4l~sG zp`_?xN+?e-;B9Yv+sGT<@P-X(nhIkK?cTlnQ}$|$f$GZk>Wr-?AwirNc#$c8CDSsL4$;ZlOlku0Eh{$nAs8-ER2B}NEvOB z8m25k*GMsYtP{?xZ*O?|)1SV>rPJ|3%BO^)WYqTU+n*5~yCv=(m(nOLNu>m%!301M zGyq};{cl-X@v#gmh{(cPW`Gq9dXm7ThI+?Aa})dHEnBuc-pSkzAoLExL8{=jmaevn zLwAPBp#?S*u?PYovGV4)=73nSu?`^sFbDuMF);%YBnA>BhyjqvIO{Ciq}3Lc`ED2l z8`c4cyohv&)!rtNW!YHJTnKEVDY2MZUQhu1cqk~Mm9G$p`Tu8kQbLMmN@SL0Wl05E z&sB#+Xf+vHT3TX}^hKO3D@mG^lsKbO1l`jpaUz$K&~!Q-6s-7AD5zGewbUo#5z`IW zWI~c)oJmO{nHWSelS@|i-5=X4bS~JT@u^d%4x9`}(#@rwG#yP+)0xQ_KrmBW%EZ3@ zSlVbb^0P2|3T5n_ciwr^txw+2dEs1tKG|;t35HYvDFF%uAPEpyt^6wD!hjP2MqnO&h{*l|dTQ}R~I1LD>0aOK0 zaovGcUfM}fdCK!2cd9n2 zvoLc)Tpftee+Q-l33d`TA~2jtZ1Lc{?7r(CWBZz|_AagUegI9MO3#rF$rK+&>h*e4 z22tnY`rOv1J-HokjM7L$z*JYH;H21rGQm1dOAL?%X$jR)iyN!5{np=BA3WJy-qY*# zt_4tcEIK;59Urfj3_Fk$I-DAD>d*I#v06uCPut$B42+mp2Iat^9D)EQNJEGN22We_ z!~4VIAN_TBq`uhuTaqMKdXbi+Gn`7{9(ZW~TXK{gHKo+Fd#K+&H7Z{E;g>E=y?RG7 z`lwM|wkd%vKoSs&alkUG|7@46A8VK!wAL3h^U2(EvXpyP^jc&nzYliAj;f<3 zrJRZ5_@zRKCo=Qwqt@$atjw~p#O98JNQ^PZn0cS;Hv%~62XFiC6Di)1ul1-BIATvZ zN6AUe0jMx@>Ztoc5>Gcr@8KU+iW8DvD0Du;*UhmV-e1<{sZ6O!f_F; RjBo$|002ovPDHLkV1lbmc`X0{ literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/button_pressed.png b/render-ws/src/main/webapp/script/images/button_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b1d7d0c94a08de3cc8a851523620f88df16db1 GIT binary patch literal 1895 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 literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/flip_grouphover.png b/render-ws/src/main/webapp/script/images/flip_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..24c110c892c8f9210beefc92531111e6c8148329 GIT binary patch literal 4920 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 LSiP(Fsh|EA06U4g literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/flip_pressed.png b/render-ws/src/main/webapp/script/images/flip_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..026d55ec06395b5873780dfe0039c6b672a3fa3e GIT binary patch literal 4920 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 KMNUMnLSTZq6&5D| literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/fullpage_pressed.png b/render-ws/src/main/webapp/script/images/fullpage_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa182aea98eb7884d7e82dc07f4975c02303564 GIT binary patch literal 2225 zcmV;i2u}BjP)X*utmM|~A_~PW% zS6{tvb93{=z|A%7-m<<@3W32?H;+ySOy9e1-MURT-+c4Z&p!Js1;8Dml+-Vgp^%|@ zVO)0EWy!0qy6Uhh$2fY`Hy_XJ+PbN>zq30Q6az_uKqSCTjbbCJvLjl@w71SWaK(nU z-QV1E&pnGi{q)l=069fLQ4EEG;X?EaM9dF9_+Z|=IkV4O^3DtU?OMKkRR8WCUQA~L z@_eZ)6^$TC0>nT}=S(k;F{`mkluw$pW7Ph~eD~@bZ+>*sO*btAkPW5WQbN3h3=7c} zrh2M_$G5gz@Xa$1oY40D()#{wol?)Z!3eJT4Z7{uo0h22%%IvZMN%_@gdkyLy+CyK zk=xx-)t}zgI_<#2cN=OqmbwyBemFu3WMN<=`{IY2sEo6B(H zDPsZ&3B85N*9akzh#b8j3x>lwMJi&rlb)g_jW!f`d3QKbMuowv2S9)yGWJ ztN>sRJ5WomCZ@(b&fToZ`g-8?_fcxcS|O%2lT$sG-d$%?yu5-gKXR<_VupP5+Ya70 z;N#*WYDI08lzz5=F|ndJtbs&!&1TB3-!3!TIxuK2k`?60f)xaTHB5wlOolR3!TN_ar2NCnO`yM>d;9i4z|TC6Y>|@;qj`iE5oWwcu8RqK>##t1)IU3}Or} zG3m1DaUb_xSu2S%oN>b{T1|{!`Bn#icU^|X$J*R!WdHg9T5zXMXF;5M{r&wOhNYB@ z9HhOyz01?}bfVrutOhJrFUeBv85Kmt0HzVj#w94xYJqqWb802terPs?kT~+Z@A2Au zdm)GrZ!yVfA{zYvSS?th*`#hyq}9V_qMKbvNg1(v_3EwdIlj$mt{@}9$*3Zxmq}up zkHKW}0;_u@ZS*+XkQLOI$zxWliP=-j5Dm8^>1Fug|Lt;4@i7(j#fH>2^{_*mUZ4;^ zCLMA{#DB2?9Voyp8(=2|$LoUtZAQI7#$1Oi7(} z)v^!O@azE47s?bA#c0ozzR!eTr_<@Ikj$IEN%{vJF|MJO`!Qtm5afe20b)?d9~csY zkU)W;=Pbk%jo4E;vGcg=mc84yJGH@e-HiZxB0}y^&qQUSkx@Cd412P9f8gaW)4Rq@ z8&ffERI(V@5W zeA6D^a^b($etOS~o91V8`K3aL9X}x=6!Ir8S;5Aq0l1-o(voD!baT)#S*)&{JrHZA6DRNC2DPdSa}=#j`H@W zrJ}`ugrSHCfkF(I_$%HL(SPzSk-s*-zrlY4x#}XU2!muN00000NkvXXu0mjf3ARyj literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/fullpage_rest.png b/render-ws/src/main/webapp/script/images/fullpage_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..bfab64339211da4c3220a209dda18efb1ae99389 GIT binary patch literal 1309 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 VQ~vuQ5gh;k002ovPDHLkV1msc@dy9_ literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/home_pressed.png b/render-ws/src/main/webapp/script/images/home_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..00c349b0dd9ad581d2c48a6d7120ca0e266c4951 GIT binary patch literal 2138 zcmV-g2&MOlP) zr*iP%rM?nmX7uT`p7oybUkK8JGYWbJ7p6W;q6APw$1L!(rzEJH!QFR7f>Ojs_;86A z+KK=@gPf*BFbnF-U;gsQ>t6S|zIMA!UDqYcmoG1^TD7X?3%C-;$Mp$IouW){3H<{f z_(0~WtFC(1=;-J&CRGrwhYuCQ-eeZi4SFT)H1Yif~C3R96 z;=_Ci?ZY4baOTP@uY7UZ(q6Ic@rN#%Ik>OCGM$fjZBGzRKnMrZ6%v`3uFqSrXmY`& z&)c#mckJ<>|NQ6cR;*Yt1E3*kN!q@U7ZxI?Afn%Y|NYCBU4GfSH{5;wvyX1xd{*UH zfwfC@k2tPSrHVozhyVx$p(>+lB0`PfG*6s+?$}w+dF7M0+IF*|%zy9WfB*Gsb5Cs?tQ?vaYR&fMF~uEHO?OZ?cvjK9K27HtMe|~u zaINlme7a2R{8YM9I=bM(=e?LMSiIDg&r=?N2rpAere{|4KmPHL=U#sCMel#|pTB+M zv9&v+-b~HQQq>)`EZ#3AlDZ~hstQw6iK!^WfC2-Q8-xhM5rUSR9xu#VO{cJE;j>=Y z@&snLZQE83RT=MH+P+9PE9ako{&P3n`L|b0ZQdJ|f7ls~7~Vk26p54$MOPSA89<5r zC*ZXNcS^PpMZwi37mO%ea|CG?8n(N6uhurTS6p`4Wx0R+;~z%@4|1^lMX$^#68*aC zu6rIUO?+_diPaZ)6J@z1nm0Tzg3N+Ao9t6Hdq~&%&QGZ3f~a!q;i7)-C23|xHNss& zJO>b-pn`KsJrAVPfWhn-8|-6db~L|b%a%LyrtEt+yXIM6G;$6HAd8^LXB*MnIkdUxp+rNfX!{Y01Usr z?f|aaS5Q;W?$Z+I#1*5@P!v<49t0)hRWV3v3uKG}Fak1ELTHb&X7XbF<)dS<#@_ux zDHox4WRfP;vnE@$vq%+1L6@LR_jvhZQ~2iHhZq*e6l)|x6pK->)gbNMF=16_BD$_8 z0qCI@Dtawb=RFe@c3r3C0-QrTNO|2uqLo{N-!FfXeC7L(qEe}#6O6GSb0U;d)a!LT zx$Y3&_uU8C=A&C#b8HjZ(+3Ez6^JEThUa-kNQ4}(v`MX26B))yEFy@-1k{K}>-9-; z{zx0=el&x3eS9UlVVMjUT`+`drGy=Os_4c!i(~ld=NF68qmzVLHr3KXFjG*XxO1{S z-uS&+h+?tW%tmxO(x+0Z4QQ5t7IQJbA83yl2*$ZfqIl}IOVJ53awobGu_!K|uVXSR zP$|2VG65^5l3J8GGPBO9G*_a-C&$7$aH=R7(oV43~&@ zn;ZIt24Bq zWG13g2t-c`qDUE86$r*mzKtLK=`eouhl2=)a5=!6o#$=t_v7g(srC<-?pQs3NG?;p z+e-NG@G}!^7wrQF4s2aJZ*c9q7mvP5Ei@n^4ybA)Yt-=IPZvV5On?x0O&h%3p4(sk z>!qNoCPiErZWG+Df~g)XO+#Yw2!6DtxIUlHj|X}i`?#-z0Ls|dScz+W=EYZxo-;yA zai9TWacHWG;k1jPsExr$6GJgc!p3mI!BG6^a|2cb8Lc5DTc8bscr=THi6uur_2aD% z6$*tN0A?knfRrZ@$IDDx(#qv>o4$85dEkd1z38nYc`s$V1qfjSt}V9&p#MIb2>)>u ze)r2-3M?yw^3eIkw_myG0l7S50LqeDpzG_I8HDB@QYw||Tu^8AKH)z9rAvnTnHxd9 z1x`E=g@aH55Ds*<5Fh}+1<)c;8wR4WVT`BFnSS-Po9@XSEAFvvdoO@OS18c&iC!`Y zHOWMlVWHl1t2aGTI=bk>Mad;+Wzt3+40R6P%YNXgnS$qeHO_faa>Rd7tCEVp^+kF$YKO5nhDLfsV`FP7D zYG}|8&)RNiy!Fm-ygj*8c=-3}1`pu*+pxrcC3<}&qK4`HmB{}w{u>wk7w8WF@?bSV QcK`qY07*qoM6N<$f~LC{^Z)<= literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/home_rest.png b/render-ws/src/main/webapp/script/images/home_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac397da6208b3c05f89f49b5482e3340e6bf530 GIT binary patch literal 1258 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 literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/next_pressed.png b/render-ws/src/main/webapp/script/images/next_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5297c52661475ec06ad3ca43c3494abd49cb1220 GIT binary patch literal 2411 zcmV-x36%DUP)`+p+jt9VuE#LM090CN2my$&*zntQXM&RBwT)OnHMTU9im9t;NT#;_~MH>0OJE6 z_>4I|K5FK2R&s1)q)#cuJ>^oVG+Qf`O4XxBE5YW?_jv%kC{sbPSo8~pg8yt%^jt*l zxZ@5Mr(OQ?mwy=e)_1@B#&svGTOYLQ`KiPE`u%pBfd~Wn)r(r%#e)YAK6=Hq*X}s` zwA0D}{0MJ&c-SqM%OQZETk5&UP=_cg9+iZzS+mCc$*+Gs^uc$%10@38Uet%?5eBYw0a=- zmECvW@}&b0PYf+iR*3sym@#CS;)b#rK@h3sFYwQs)l!JP-L z`R~8}wbKFSWH#GeSXgl55~>)8r|O|vtwsQhjT<+v86WKb;`ZBb_}rd5?jG^xn<~qM zKVVxb#Uc^Tv}Cjrk=7a^aTRc(T7D2Vrxtjlx+SZ<;G=JR^_$%v{q(2$%+pTWp74DY zl}tw^TNa@R&3m&F_lfbvFMd1o(GS1xlSdxB_g6%L6^U#;rX)PchXo9T2~HyVwuv464*B@ziS zH#aAL``e$q!E9H*dE}8t-rAg+VFQK{3`Y`aX%H8pBfu!S)r>K4P7zB+iog`WA`b#I zV}K^tgMgc0xeS_|m9}r+S zpF1>^ashM*BWOjYyH`H@&e!If(^GG*P8CK(t*QDAOGg=DQVK9r5EBASFc9y^@a2Yq z3ImvAKnEe(O%0_3Efm+jPteu2PS4C_hVqFG8%8su`wD0Z-){j}o-Fl*%tXCH8D#kC ze15z>S6&q^)>(>pkdlH-+aNn@la+NyCQUFyfH-@+?X_OIIaZk?iyIgwQ&%fhU7uB2 z`MwSVUt_+dGsErUj?X3Y`+&(nHI1luL^SH`3DXp9ejV80x91{lR>(z!qN2PhF7TmUOFSNBg z6Tocdl8)egK*AF3hERsFyrGgn&k9VF`+ktp&AP3tvj`eKHN%E->>TakNp{;rn+GJ3 zOeG+M5%&y1YX!y#rD6qlZaIM4w;bT_d;Kc*+5TiWJl70Wt))9fG=r8Yw6*~*l}2<| zFNr+maYok_wOTDCn4*Ni$PyZiTo!s&R++BS^$!(+MjL<~!D3{D7onCIO53PZJ>0wF zQ5xHjWgnK7vZbbuJLif5&m|yW!st2&>Mc`eH5${HpI>aJBy&?4lTyNGcG7@hfxSA( z@u!cD=)mHTl2iAlqBUS}!epg|3vM`uSFKLt3mY=}LrJOCY?NK$aVKps&*4$BT_0#_ zNC|jYSx+icYi353rc1N=0b1xEFp)Of+;K=tQ)8V)c=eE@MM8iZOveMg(leG|*epS- zJ~f7quTAQNuhFjh@KRuDQ&2V|*8XKbKm*Qn&1y(m183&cOe`OB0%Gr7mG{Q zf#UnhRdBSSv1YWk@!s;qr(Cz=y0t@g>0qT*0WcdMYy9ra=m;fwU+7@Y-FvLOcXhUJ z^V)p+z_a)#t!R$YFiw(G8abH@NQ7u}#8cl}CsMDI7% z=H|lu2>i{D9Ne38=&m=9<<`H>2-es^gDH!^B?EPx|I<@wAkIwaYZzL?&N(>D?Wt?G z9oe?;K;dvcXV(k!tyY(e?(n3{l!0jSa$cW3zp!J+)TUD)n&)TmBjrw6*YlA?N zhzVMfdVFWnE9KFlhVr!*A&^KrG@s1P{qKs&yKjB)@Sd@pIWt*r)c`aj-0ss*{#0jq z?RFc&2IW%Jp4igx0!#3<>j#F8OHfhi-%hsgFY5y*-&T6yq|5hC0D7;K#`I#tn+H&f=qc0Fp9AxF z>@CM}?5y3)6lO7$S~c>{PrfSk)~~&L_ziCvw?+qLm|~vCl+s{~0BPuAi!JP}xHH#2 zRNiyyebc)!zj$!KL0Ji7damkM0d%OxCGww(3@wj(EM$%6cxum7Eel}yEpHlo-P!?T zEX9#Ynk;9VT)JKuG~8fewxt&*7yX5Yw-%2AD31?YwV7JD*laF|G;Gp*jz<5HH{<{S002ovPDHLkV1jO%l3M@( literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/next_rest.png b/render-ws/src/main/webapp/script/images/next_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c5a3ca732014d06beb4fea48ba424ae9650a6d GIT binary patch literal 2027 zcmVHrK?Y}fL(f7Mk$*a7qo_255sbrGQ z?bGL?d$iAKDuf*s&F*lu@tO)r}iB2CrVdI`H7Z1Lx?`qqXktZl|N8!@Ya= zu5;(k9Vbp!@QKO9iEP`pO%G*H|M8E1Z28My{xWCElqr)6g+dEN(!P&>%*7r)eAsjL z?AhBNe)!?3_uhN&K9B2y_V)JL{rmSl8TLFv>P19|zd=Zh2@@uy|Ms`PwSDuO-<&^j z;>7v3ZFlRso&q{#0!)*ue1k$kwOaKC2L~S>IB?+f`t|G2?b@~L&ZSG222irr)6-KA z33*9E#*2s$bCb|y-+ue;1wZ@Q&wh{OOH+2L-84+)d7cC6s3KPpiE|r* zOJXWibv=|>7hMENb{E@Mot7GyMhjEoyM&ZZ?yKBmmT zzC?NYsJy5Xc5ppOMv*HD>CCB9r;etVlvtG;sUoZAW0@!qio{${5bzt>EnpV;uJGi^ zlQL=)@YNuVpEQ1SsX~e&P517=Uq-@MEEXd&unLXMPoOfHj0xH)Jr^nOSQskVTvGl0 z{S}&788w8Mjwvw>3ot1nhF+Odxh#s)QAxQi7<(w zh=!!Kp`jr~5=uEMCQ^{9jvYJh8q((&Ci!A$31f00=o4Oj#flY8RAZHK>5lTA0NjF9nf-@g5X?&wu2rAAre#KVThj~{=AUU8cwl`1lU7B?Xd0hdCk z;A1=+>yg>BXJ24pRZ)&=GC5A@B>1olmwk+PLJB0v&<6rm<#B+z#i3}pT%MQZ0|Q4M zR+pq^vO#jjh!QtRMwDRznP2|$mnX=xK8_7Kd8G4=D4o52{kqE$;|U9@p-}ALl^_Fw z075SN$i2yvCqDpFSbdgU7yzCm^`l3RTn*!SpgqGFr>LGmQH_I^j=5o8WeI=z=FOWm zhCPxHqLBC!_{k0&0H5lS7b6h63@KO25a*W2%nBPxEs*d%3jrnxiu}5alW#;_$P{<% z*kMs=kEFjcMo85`sLsPpZrw1I)Il|rcoq>76`qS|45rgx@`SEq z?b@{gs@$R_JjCCi)C#Bp_j$^Q`Bahv`znfGMV-t+*nLS_IY!t{JH3N$1qWUh2y%KafbdWx90P^Qgn2L*QE z3=?NiA;z z!yY4{%E=Kywgiv^1&{_oD1B9cT7!@q6ml^V)sTo2FX>PGCl2T#sgwYf(kTo@QgqZ5 z6Q;>8d9MhkF9&zbrO!A#mu!wBA^|@6pSUC;ff2$CiCMrD(AuM&I0~@`oEY2?{wMx> z`w3NwV1&>^MCQj3Cji3tUy!K;84IN1NT{ZVP~f$his3Wc{{d&lSLL-$7lZ%+002ov JPDHLkV1m9S(G>sy literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/previous_grouphover.png b/render-ws/src/main/webapp/script/images/previous_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..5e0fda1b5f6263456ff4a17eb3200462e9df54fa GIT binary patch literal 1933 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 literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/previous_pressed.png b/render-ws/src/main/webapp/script/images/previous_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..75c7e7d253ba307c55b9b1bdb2d53bbe2dddbf33 GIT binary patch literal 2413 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 LNkvXXu0mjf369FO literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/rotateleft_grouphover.png b/render-ws/src/main/webapp/script/images/rotateleft_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..302ac6285f316bea6a9445c2b992a79d21bb88c9 GIT binary patch literal 1731 zcmV;!20ZzRP)X+Wiylk&@larb^_2%}e zb5XZPifAV7)q-u>g0R=j4~b4h88~K@X0^=&v{_SJiS7wSCnG~}40-@ASBn&(EfNVJ zY1R~BDHfTGG*BTDy$pJP^2sNc4j(>zt1pA+rTx^@)O>&Hsi!_^2*iLcu0)8G*Bv1l zfrtzA1o}Mv^wZlHFJ63?Qfh3!e*IMc{{21tECNfVQlh=RT>)M)nXLNq%P()c>86{0 zz*alZ0dxX!AlV%u8G%SIpzoeNdtT|=x9^5w!-h#i!gmH$L|_sIBPm5v_4W0lp`l^d zh7B7o!*&bMW=O@lBP62`*|%@su0ewaO&B$5RLXH2p4!6$eIk5#U|MVcGrpr-*OmB= zgRm(Os$98p7%{9 zO(hZua*`xU#fYx1E-L5^9Xiy5kI`R!_0@H{Q7E?z`{) znu-wNKIB@;D8sh*!i5X(9x-Bs#A#Dhgz?|GbB8J}E|$f`MIvmYMvWF@$BxyVot=I~ zSxGHG!b9~5_;XJ_`Q+Cu0zxTb zu`Wr~Xe5NN1>koy{Al3w7*huXw#U?|rGGtRz zlOJn3BAJek4j#@s>7&tV|UO2S%NT0Hzs z3Kf^wzkh!W;Y`6Vn`5tZB)A%LGmv4wV4N9y1(h_)H-%2>hXd+}k3Ray#f7NPKKmRG zeMY?e^2_SO4?jpdrm|2%LkW+{k{p#nWin*(K#kubqxlDbq|}T%APqE5=AqxD&O7gX ziSpMaB_$q-pLN#R8uyX&%{O2B&I=0*X)^YNhLhCfgD^uSr%ajRq9R=uz<1w$_Y{XL!X6`RWm1N1?3rht`4;VaA3CcG zxm`G9xC9Z92$bSQ>AF1--fNPvSlmNSu!MaglP6Dhp&;(Hoeq*X>%$K}+-(h6fjZg= zH$1x=|M0^PUv1j7=}gQt13-qCp+t_b8e|YQ5@Wtl6^4ai__#NF_G||sRcr$o&KmBy z=bjtPfYl7N1T&3ACi6Seu3fv{!IX9;mG1H_Mc?LFw24k?^f`RJ>3{^vTgO3|Gjs!$tB!==8 z9Hu~`2|eXW&d(%5M4Evk66y~OG{pLE-n{udD6#^ueH{4y`|sa0rQ2!3(HimXAo_cg zA=S^Uea!D&t9hFCkS5a+;l1h4y-`|InoTAZ^^NlX^{)Nz{}xP7i0GUPv Z`vpbOG?l!-l_CHD002ovPDHLkV1goEL{R_$ literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/rotateleft_hover.png b/render-ws/src/main/webapp/script/images/rotateleft_hover.png new file mode 100644 index 0000000000000000000000000000000000000000..e757d87a673323d6e8704e1ba4be0df689fdaf0c GIT binary patch literal 2094 zcmV+}2+{Y6P)BUZQC~f|Jt@~+qP{V+rn7b6SLD;Yu%MyovBn;rYe_sD^HB4 zzOV7E5R4a+zD<#iPJ#68-y4!Z4cuTETtn928S*3WlGj~>m3)q-< zAtVaJum_+|kT8%^qlC!c(wfh|=}pHUdi?S4)P=%cV2raM@QE=)5=|+Uw(UZiRI3|* z^Ru76`%Rzv^z8sThOWUkgob#O5E(=SEbfx{a;tB73rsVOd8|0m^L2g{zp1p~I$#f+mThb}tO7 z^{}w#o(`QgE8Cg3U|v)%Z#?GQbFTqVON2TpA@Fo%hBj9B)*t-fb29I(oLSktUT$CA z?KXDk{L{!yrJe#-9g-g=gfMrZh7U+HY-)^q4vg@C`NkDL|eCO zE~BAhEaDomq88)C&1N&z+i&a6v7Ls$GF!Olvddobk#BwL{-j0W@a|4`(;_=^GfOkI zYOV9cladqWHUnng@u1)vH%sFCK8DHIEkv}#ZLh&CyCJx2aTatL3wqpW3mb5{k3S}z za;Zs*#f1R8p~?&no@BZ_>AmQOAN;`6LZw))Qtoyhd_u>in9M~rTE1kvYPFhZHk)X* zTD!RKp_qL1>lR<#ZaMDkl4aQ?!Ga1$tHw~T8?iw6k3FKiN+pbxVjp|eD=z`yCNg|f zn+7thIBV7^q}vTpsUq4kMFZ}lH`|I&Jh&R)b^l_~XbED1bUyceumhHMovZh1k!ZUU zqO6rFcL?eYhIX5yQU;wjKiYGzy^a9z?Lk#W$|TS@3^@-1ts70ox{*+uCG{U5s*sV< z=?B!=N540Z5rUD~x)pTq{FHT&t5nz#ij}2eeh3l8+LV#1pr_*~n(n}`$e>N>5E;e9 ze1I?|g(bC3JBr6^BHFtl>f_bZsl?LhzjFrWE3WzOs=VcQiU(6P9T zg{8I4wc^v?8-~tMCkT>^l!>E|MPW#&)`A1Jh_%I=l*tX8$ww((efCym@emiDuv35W zg=_Rr-}#t6@5G&m<9M3wC7@Rfm_0iX!d8||w6F*S)0)R&M0!$1qvjz#LPqyLU}UJs zW`#uvB?N*gFkYiHUSm@?r^t&>E$Jhd_z3UFzya{mqpN896u-ZvfPS8=Sag3|bBhBY zq<^7S&SRY@q|z{Il%S(zs#`YSG}Y^I<$0FKhoEAh-z%YeC1ZS0+hFkvx!)jsU5PKRY1^*VsCPkPu&_f93o!Q=Pb^Nvch zi5q(X%bamC;eCmT5Ugm(8G(ERUNBOIzQ{w{ZIo*QAAQayEDU0xf$56%U(cR@0&eI9 zq}*)brWC6abzBopUhQinH*|2Rr!S?^a`Jo;2S5wI4nwkr>FdlUBtBIo70S$QdSH zd-W-wyLDsd0MF&P`uN2-_waehu`UobF$l48Xv!>pdFOU~`{qq(`!SAOpYX%-u$TQ>efhU*zMt&6e$tNC_^X5Qm$aFr zb(s-M*Flsa9+K()ee0$%R+I@&YD!DX>^ek@zoPulueJYo|AqJu|35Q++vpgOU5t^x Y0z3gJtqq~URsaA107*qoM6N<$g3o3lEC2ui literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/rotateleft_pressed.png b/render-ws/src/main/webapp/script/images/rotateleft_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..1480b1ae48975d491769388c758f1acd39cac296 GIT binary patch literal 2036 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 V+AcUF<%a+O002ovPDHLkV1ktsRHgs` literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/rotateright_grouphover.png b/render-ws/src/main/webapp/script/images/rotateright_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..9e71371209a165941aeb234f59ab46ebd977e822 GIT binary patch literal 1800 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 literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/zoomout_grouphover.png b/render-ws/src/main/webapp/script/images/zoomout_grouphover.png new file mode 100644 index 0000000000000000000000000000000000000000..b588ecf77670d984c29ae63728b44eb7ad087ef6 GIT binary patch literal 977 zcmV;?11|iDP)Rx7s6&iK*kw65H}=1}$ulG4-;F=*CM3Ww zDt6$(FtutG&&*~pr@s7Y|2x0Y7c>S8z{L6cf{NEHJfie^Q4l-Jq?+7A_iuQ6BvC8_ zr7;!`*_vB2xJ0p!M#r`FD(oP-e0y`=w(uM+W#rsB{!0 zpAZoV#$s^eSx3{I3^oRs+Dr8pW$|RO@$^Iz&e$Rg2?PR445Ri;x(UX_u#=s!IKm~5 zO&<(Aa@cx@L;*foY$A#%Osqz-F&phE(;FO+!(}J^S;W5XUl<3NOu%CtNcCEmR>kcMB9G>o`UnkK|X49D> z`tduvM^T_88>OQd35(%>%o)C)o)V`WDWoUsnLKmHa9SuxGN|-yJW88>`jKt|^4gO? z4BjO7ANy&cgqNNTvXaHX0bjZ|C7lOrz>UDDfaFb>_z z>LKc8*3m~5)fNKWvI?SN#|=i$$ig8*R+PcPirbWrhb!`u_*GpsUn{9vaSs<~$*y|g)-*K{hNEHXu{nySbM7bLP!)<(Dn7&o95 zGMR8EZgSsDx!!`B)7bA2Q(bVTyz}mRe`70pF90-CsW?x_ne&cGMV@-1m~&}`P)Vu(B+s^JpVwXx4xgSQk9Km73X0brv=rDSh^ z${QwT5jWp_^A+8}&U4^}9=9s@3UtXKrWFSu4vImmG6Z==w-Tl$rpYKt#2HnS4z+l5 zZ|R`@S01x=?b-`|`O9D4mR`s*BLytyTHzLV@#4jo`!C&6sg0IFGM7Oj1%$B&LF7UZ z&Vpgo!kZ$#1`cF>lWwRvpiDT*SfI25D)bmd1!h9eVsqr}B20;9=eO2ttq(~gFiCizIV%k} z+$F5G>iFZ2-#;Vc?5?kqcNguq-+m`}!!P;a2*D%LrTvRyc1;)@}0EqwF zlE?xU1Ee(Q$QU`JbP`HMaY8E57>)ogThQy<>Ktw_9FwqTZdfV_n}xUg5x-l4I%=i6f_zQ zh~rp%@bpFelM5E8XlD&rH9^!(UaC7nsb%Fh5u8f~>-9RZIAVU>bT}$>I0tVg<}o&K z`}Xb79;H$Vn$0G(M{u~pf>0cS5LBq3KrwH|u5QWZyz%qj+SAk1^$3wVbRbAe#*vXT zCfO;gg!$G-_cOd(AbJRM1tkP}TGH|87-yvJxQ&qUScAtUuNxlOlMNv!So?ljjE|4^ zjq#4eFN9oBXzLm{e4@q=9<0N9K($tZTq{w{#X1dgJ)t^bBp^OI!$i`Y-A`+OJrPf) zrl!)T@ci#4vY3qGQcSYz!8YS++hGw6L4j~SU3Y< z4uZcd!H24TV`OA-2LQ-a#>^#SEb4&=9@x3hKA+e)xUzF~_vlPfA^ALq2*oafdn*3a&5y~Ktjse2&`5=(MYRu8du0+!)ZgEK=Qrq}6Muee!&@~H zmO?-vAAq&CVyRS)1R1mpE+bGG07^Dnpom~BRIs@PN8nbd+-czXGOu0xm-5cBYV)2j z44(#o$&65(sSNSCs+J5z(%LlCU@yh5&@XHG(e)XtB{h z+3t>f?oaN}FlMP+YH3bI@;=Dlc&j2Teo8Sz z!AdQ&xkN;XWimZToDyUR_tdIzm_I1Rv~`I|y5q1VU>QlPP-`QtMy6+aLrvTpZ*O^9 zgYV?@+A2k+=(pM4&Mnp6{HN>=lR;ZdyTp6(lZcr2Cz1Cy-u?mq3jpalfBHQLp8x;= M07*qoM6N<$g7xO3{Qv*} literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/zoomout_pressed.png b/render-ws/src/main/webapp/script/images/zoomout_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..679c5cdab467bd848b8623b86ffde3bd5abe9149 GIT binary patch literal 1997 zcmV;;2Qv7HP)kpI+MqnCl%GK{^AcNA#mXiLT6y8e- zVX&G!^{G!yKIb{l>1i|?EDS^Z=Rf~hxccg=%SIs71cuPiBDGeTcnRlaFMCs#OY#Lk5Mw4*otW6$D+vwfw7rKD^~LWO{+fI9+{-JO;0%=lbp?_&<1zC3-y z7r*$$+yC{ie=Pz)Ra4hAjF4;`#uYUWxzkldMAG#X=Dn`nW6XG#4%wTC8 z{Z^0Llo@&P4L|(qvoGI#SAXf^0$F8Wc5@L9SYFugxT;q;vd4B*m#}48p|UH1R0~D) zm*zW5g{jQW$2^f|Hf##@cv>uu0XT}1DhjRO&FrZn5D~v zD^$BBR4QBb?L%km#^I};wr}6QT>#LgNoX96FzsP{X3RMG$xnXr7+#ot`NWO4?2xlX z-6gi{a~zd)9AuVYXbBENi*UYz&~RjghzfN{#DElIQUaE$;Br6B`+K<8JG^xG@ZqJ^ zDIZ;jqM3;Wn!yLq{NJUtq|X z0^;YFWN%@5*XGTeHvvFW<7w>30*WFoGjDjq8-~i$7xq?X=Gwe^5OmotBy}U)=D2`w2}gy?gX<7G7Ea+$ig!gP`_!3nIiWI&6ow6qMj-8KQO(G)8b z3eXylepo-UbpUo-hzJBcO$BNla8P4u~?!3;G_t+6X2dM2R`qo6Z zPro~utO4_qlDJcYQBJU7)FY7qKucGy5ELqq?Ey3jHE7i9;B|*cNyK!I1D66-&@Wq# ztioi7l~Koz9lNl;XV1m;!|gll*;%mGg~+S`03?K^8iZvuV+l1QJV0UTW*=#vSrJWgF7>i^Qw~_R;mEZAwVY0|6hBM0#H6e z(o4Z|-(dcC-#&X$cT-cQ(Q>|t-41w@bUJN&ZEbyfM#Bw`uVvB-n%%=ajk`u1045L| zX+!&X2EKNOyy2?bCl1$YwJ887XqGi~lO+|E!3bhvVxpkz9&h)7;Vna~unwRKEJYxU zjQAfC%+aL{fEn>$Um~#>~R3d8JVh)ks6A~{P!M(h~epZ+kM;< zhBMtk$s_OqJ@ucBI!3~7)-}yi03d1+--5K$1ErCj`Def9&>t6;@~5SgGXRh`S*d9n zEi&;}5xsU)6tUozvlKq|$r}gyM3{tX9f&DF3xIJ1izig{kqK#`o?U#^GM8+y?a;kdiAqxSN2fs+T=95zKt>tH%!?zfimw zhT&>9a;t+jGFHO1$YAswtnoA{O`0**<$2x?T@E(uPdU)p)!Sh?bGf?zx0@HUQp&PY zDzBL|0?V3`DNRP=4&-aUs#qG&kci+SVn?$iB54{6HNK%5p?2@DD)AZOM#$DU5p0bW z+3?6T5|~E)2#uIkm+s&7)`%H|q4lmE8Ulm7pV!+fOSNA94XdFdm@KqNJOn?9L?iwu fk%ur4?q~cPu=JgC>T4o300000NkvXXu0mjf>sHZU literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/images/zoomout_rest.png b/render-ws/src/main/webapp/script/images/zoomout_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ac4abd825fd63e7bc20b18a4d51efa9dae14e4 GIT binary patch literal 1153 zcmV-{1b+L8P)2*9_UPD%ZCltSt617U5%%#aT4fu1mtAbzmaZ^D&-8S6RsE?`!)yHS5oX^0 zN?_Pg4PHUmW^GHuGyv;=C!?X>_npx&1BV4}zA_DI6lC|4HdnE2C~S=b=iKahQwbOB z_3B$8Bm`28&tYK9cv)f2a!uykN{ins})N|m2}yZ_5KD~Jt!)s`Bjv9!XyZsOK6 z_dSJ=5-|lLFalRh@K*JsFCYHwjg4rbjRXR+Ct_PjyqAwVcI<`DBnj145)3wTXhm)TN>FN3Ffu#8h_{NMexrsm5lTF5-+!hypqlg0ukPEe$j zOmxU`m3&h)gKy@MNz(BfbiE|N+pDJ604Wj;&S6_G+h4Qmv{ z$LkJUd-$AFjv^?Hz&5MkmnOap>qR6G8a2EaELeG$?RNlGS}93v8*a@{K9~LB?`RdO zXrPT0s-s~B``@ZHeZXFsW<3$x6oF3_)+|4{q4WdFsG1E-f{bRcu9#T0|FPpd3e&A8 zVtg`h?Rjrf{#C9)1r0<<`kKLkQf)&1w8t@%W1^KNq%aII-&q)I?|G*v{u%#@5^4y| z4oJgksH3Zt;?~E(#PXrO3#n2PM#g#0n<>oAeK_+_T=^yWSxc%2ds#N!i!IpjkwM;? z7&~eFfb+creZUM7Sz6={_B*ru2-2+E z*pT$+FYV~?)iRB(>7C(1lWOEP4&QC4%w@o^QpzBqdWv1Wn3&q^VzOJsu!H&^Vcl}W T`Qdz700000NkvXXu0mjfB_}SI literal 0 HcmV?d00001 diff --git a/render-ws/src/main/webapp/script/janelia-render.js b/render-ws/src/main/webapp/script/janelia-render.js index 591374f28..059cf72f4 100644 --- a/render-ws/src/main/webapp/script/janelia-render.js +++ b/render-ws/src/main/webapp/script/janelia-render.js @@ -68,6 +68,10 @@ var JaneliaScriptUtilities = function() { return this.getCatmaidUrl(catmaidBaseUrl, stackId, stackVersion, centerX, centerY, z, scaleLevel); }; + this.prepareOpenseadragonDataUrl = function(){ + + + }; this.getSelectedValue = function(selectId) { var selectElement = document.getElementById(selectId); return selectElement.options[selectElement.selectedIndex].value; @@ -165,8 +169,12 @@ var JaneliaQueryParameters = function() { var re = /([^&=]+)=([^&]*)/g; var m; while (m = re.exec(queryString)) { + console.log(m); this.map[decodeURIComponent(m[1])] = decodeURIComponent(m[2]); } + console.log(queryString); + console.log("helloooooo") + console.log(this.map); }; JaneliaQueryParameters.prototype.getSearch = function() { @@ -436,9 +444,15 @@ var JaneliaRenderServiceDataUI = function(queryParameters, ownerSelectId, projec this.util = new JaneliaScriptUtilities(); this.shortbaseUrl = this.util.getShortRenderHost(); this.queryParameters = queryParameters; + this.openseadragonHost = queryParameters.map['openseadragonHost']; + this.data_prep = queryParameters.map['data_prep']; + this.data_prepsh = queryParameters.map['data_prepsh']; this.catmaidHost = queryParameters.map['catmaidHost']; this.ndvizHost = queryParameters.map['ndvizHost']; this.dynamicRenderHost = queryParameters.map['dynamicRenderHost']; + this.openseadragonDataHost = queryParameters.map['openseadragonDataHost']; + this.openseadragonDataSourceFolder = queryParameters.map['openseadragonDataSourceFolder']; + this.openseadragonDataDestinationFolder = queryParameters.map['openseadragonDataDestinationFolder']; this.renderServiceData = new JaneliaRenderServiceData(queryParameters.map[ownerSelectId], queryParameters.map[projectSelectId], @@ -530,6 +544,19 @@ JaneliaRenderServiceDataUI.prototype.isNdvizHostDefined = function() { }; +JaneliaRenderServiceDataUI.prototype.isOpenseadragonHostDefined = function() { + //console.log("this is openseadragon"); + //console.log(this.openseadragonHost); + return typeof this.openseadragonHost !== 'undefined'; +}; + +JaneliaRenderServiceDataUI.prototype.isOpenseadragonDataHostDefined = function() { + // console.log("this is openseadragonDataHost"); + //console.log(this.openseadragonDataHost); + return typeof this.openseadragonDataHost !== 'undefined'; +}; + + JaneliaRenderServiceDataUI.prototype.isCatmaidHostDefined = function() { return typeof this.catmaidHost !== 'undefined'; }; @@ -543,6 +570,12 @@ JaneliaRenderServiceDataUI.prototype.buildStackQueryParameters = function(owner, ['renderStackProject', project], ['renderStack', stack], ['dynamicRenderHost', this.dynamicRenderHost], + ['openseadragonHost', this.openseadragonHost], + ['data_prep', this.data_prep], + ['data_prepsh', this.data_prepsh], + ['openseadragonDataHost', this.openseadragonDataHost], + ['openseadragonDataSourceFolder', this.openseadragonDataSourceFolder], + ['openseadragonDataDestinationFolder', this.openseadragonDataDestinationFolder], ['catmaidHost', this.catmaidHost], ['ndvizHost', this.ndvizHost] ]; @@ -628,7 +661,7 @@ JaneliaRenderServiceDataUI.prototype.getStackSummaryHtml = function(ownerUrl, st var detailsQueryString = '?' + this.buildStackQueryParameters(stackId.owner, stackId.project, stackId.stack); //noinspection HtmlUnknownTarget - var detailsLinkPrefix = ''; + var detailsLinkPrefix = ''; var detailsLink = detailsLinkPrefix + stackId.stack +''; var linksHtml = '