13.4.1-5 baseline
Former-commit-id: 2d978fe3d2cf99e04040d191e040dbcb84a60b9a
This commit is contained in:
parent
1a6fd7edfd
commit
85bbf6d242
50 changed files with 1867 additions and 242 deletions
|
@ -42,6 +42,8 @@
|
||||||
# improve performance.
|
# improve performance.
|
||||||
# Mar 13, 2013 1793 bsteffen Performance improvements for
|
# Mar 13, 2013 1793 bsteffen Performance improvements for
|
||||||
# TCMWindTool
|
# TCMWindTool
|
||||||
|
# Apr 24, 2013 1947 randerso Fix UVToMagDir to work with scalar arguments
|
||||||
|
# Cleaned up some constants
|
||||||
#
|
#
|
||||||
########################################################################
|
########################################################################
|
||||||
import types, string, time, sys
|
import types, string, time, sys
|
||||||
|
@ -49,6 +51,7 @@ from math import *
|
||||||
from numpy import *
|
from numpy import *
|
||||||
import os
|
import os
|
||||||
import numpy
|
import numpy
|
||||||
|
import math
|
||||||
import re
|
import re
|
||||||
import jep
|
import jep
|
||||||
import BaseTool, Exceptions
|
import BaseTool, Exceptions
|
||||||
|
@ -788,19 +791,26 @@ class SmartScript(BaseTool.BaseTool):
|
||||||
## Conversion methods
|
## Conversion methods
|
||||||
|
|
||||||
def UVToMagDir(self, u, v):
|
def UVToMagDir(self, u, v):
|
||||||
RAD_TO_DEG = 57.29577951308232
|
RAD_TO_DEG = 180.0 / numpy.pi
|
||||||
# Sign change to make math to meteor. coords work
|
# Sign change to make math to meteor. coords work
|
||||||
u = - u
|
u = -u
|
||||||
v = - v
|
v = -v
|
||||||
speed = numpy.sqrt(u * u + v * v)
|
if type(u) is numpy.ndarray or type(v) is numpy.ndarray:
|
||||||
dir = numpy.arctan2(u, v) * RAD_TO_DEG
|
speed = numpy.sqrt(u * u + v * v)
|
||||||
# adjust values so that 0<dir<360
|
dir = numpy.arctan2(u, v) * RAD_TO_DEG
|
||||||
dir[numpy.greater_equal(dir, 360)] -= 360
|
dir[numpy.greater_equal(dir, 360)] -= 360
|
||||||
dir[numpy.less(dir, 0)] += 360
|
dir[numpy.less(dir, 0)] += 360
|
||||||
|
else:
|
||||||
|
speed = math.sqrt(u * u + v * v)
|
||||||
|
dir = math.atan2(u, v) * RAD_TO_DEG
|
||||||
|
while dir < 0.0:
|
||||||
|
dir = dir + 360.0
|
||||||
|
while dir >= 360.0:
|
||||||
|
dir = dir - 360.0
|
||||||
return (speed, dir)
|
return (speed, dir)
|
||||||
|
|
||||||
def MagDirToUV(self, mag, dir):
|
def MagDirToUV(self, mag, dir):
|
||||||
DEG_TO_RAD = 0.017453292519943295
|
DEG_TO_RAD = numpy.pi / 180.0
|
||||||
# Note sign change for components so math to meteor. coords works
|
# Note sign change for components so math to meteor. coords works
|
||||||
uw = - sin(dir * DEG_TO_RAD) * mag
|
uw = - sin(dir * DEG_TO_RAD) * mag
|
||||||
vw = - cos(dir * DEG_TO_RAD) * mag
|
vw = - cos(dir * DEG_TO_RAD) * mag
|
||||||
|
@ -808,7 +818,7 @@ class SmartScript(BaseTool.BaseTool):
|
||||||
|
|
||||||
def convertMsecToKts(self, value_Msec):
|
def convertMsecToKts(self, value_Msec):
|
||||||
# Convert from meters/sec to Kts
|
# Convert from meters/sec to Kts
|
||||||
return value_Msec * 1.944
|
return value_Msec * 3600.0 / 1852.0
|
||||||
|
|
||||||
def convertKtoF(self, t_K):
|
def convertKtoF(self, t_K):
|
||||||
# Convert the temperature from Kelvin to Fahrenheit
|
# Convert the temperature from Kelvin to Fahrenheit
|
||||||
|
@ -830,7 +840,7 @@ class SmartScript(BaseTool.BaseTool):
|
||||||
|
|
||||||
def convertFtToM(self, value_Ft):
|
def convertFtToM(self, value_Ft):
|
||||||
# Convert the value in Feet to Meters
|
# Convert the value in Feet to Meters
|
||||||
return value_Ft/3.28084
|
return value_Ft * 0.3048
|
||||||
|
|
||||||
#########################################################################
|
#########################################################################
|
||||||
## Error Handling ##
|
## Error Handling ##
|
||||||
|
|
|
@ -59,6 +59,8 @@ import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Sep 5, 2007 chammack Initial Creation.
|
* Sep 5, 2007 chammack Initial Creation.
|
||||||
* Apr 9, 2009 1288 rjpeter Added iterator implementation to fix remove.
|
* Apr 9, 2009 1288 rjpeter Added iterator implementation to fix remove.
|
||||||
|
* Apr 24, 2013 1950 bsteffen Sort resources before instantiation.
|
||||||
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author chammack
|
* @author chammack
|
||||||
|
@ -76,6 +78,33 @@ public class ResourceList extends CopyOnWriteArrayList<ResourcePair> implements
|
||||||
|
|
||||||
private static final int LOWEST = RenderingOrderFactory.ResourceOrder.LOWEST.value;
|
private static final int LOWEST = RenderingOrderFactory.ResourceOrder.LOWEST.value;
|
||||||
|
|
||||||
|
private static final Comparator<ResourcePair> INSTANTIATION_ORDERER = new Comparator<ResourcePair>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(ResourcePair rp1, ResourcePair rp2) {
|
||||||
|
if (rp1.getProperties().isSystemResource()) {
|
||||||
|
if (rp2.getProperties().isSystemResource()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (rp2.getProperties().isSystemResource()) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (rp1.getProperties().isMapLayer()) {
|
||||||
|
if (rp2.getProperties().isMapLayer()) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (rp2.getProperties().isMapLayer()) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
private final transient Set<AddListener> preAddListeners;
|
private final transient Set<AddListener> preAddListeners;
|
||||||
|
|
||||||
private final transient Set<AddListener> postAddListeners;
|
private final transient Set<AddListener> postAddListeners;
|
||||||
|
@ -868,17 +897,16 @@ public class ResourceList extends CopyOnWriteArrayList<ResourcePair> implements
|
||||||
boolean fireListeners) {
|
boolean fireListeners) {
|
||||||
List<ResourcePair> orderedList = null;
|
List<ResourcePair> orderedList = null;
|
||||||
synchronized (resourcesToInstantiate) {
|
synchronized (resourcesToInstantiate) {
|
||||||
if (descriptor.getTimeMatcher() != null) {
|
orderedList = new ArrayList<ResourcePair>(resourcesToInstantiate);
|
||||||
orderedList = new ArrayList<ResourcePair>(descriptor
|
|
||||||
.getTimeMatcher().getResourceLoadOrder(
|
|
||||||
resourcesToInstantiate));
|
|
||||||
} else {
|
|
||||||
orderedList = new ArrayList<ResourcePair>(
|
|
||||||
resourcesToInstantiate);
|
|
||||||
}
|
|
||||||
resourcesToInstantiate.removeAll(orderedList);
|
resourcesToInstantiate.removeAll(orderedList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Collections.sort(orderedList, INSTANTIATION_ORDERER);
|
||||||
|
if (descriptor.getTimeMatcher() != null) {
|
||||||
|
orderedList = new ArrayList<ResourcePair>(descriptor
|
||||||
|
.getTimeMatcher().getResourceLoadOrder(orderedList));
|
||||||
|
}
|
||||||
|
|
||||||
Iterator<ResourcePair> iterator = orderedList.iterator();
|
Iterator<ResourcePair> iterator = orderedList.iterator();
|
||||||
List<ResourcePair> noTimes = new ArrayList<ResourcePair>();
|
List<ResourcePair> noTimes = new ArrayList<ResourcePair>();
|
||||||
List<ResourcePair> successful = new ArrayList<ResourcePair>();
|
List<ResourcePair> successful = new ArrayList<ResourcePair>();
|
||||||
|
@ -1025,4 +1053,6 @@ public class ResourceList extends CopyOnWriteArrayList<ResourcePair> implements
|
||||||
}
|
}
|
||||||
return resources;
|
return resources;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,6 +74,7 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FfmpTableConfigData;
|
||||||
* Apr 12, 2013 1902 mpduff Code Cleanup.
|
* Apr 12, 2013 1902 mpduff Code Cleanup.
|
||||||
* Apr 15, 2013 1890 dhladky Added another constant fix.
|
* Apr 15, 2013 1890 dhladky Added another constant fix.
|
||||||
* Apr 15, 2013 1911 dhladky Fixed forced FFG for centered aggregates.
|
* Apr 15, 2013 1911 dhladky Fixed forced FFG for centered aggregates.
|
||||||
|
* Apr 24, 2013 1946 mpduff Fixed FFFG value for ALL when an aggregate is forced
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author dhladky
|
* @author dhladky
|
||||||
|
@ -104,7 +105,7 @@ public class FFMPDataGenerator {
|
||||||
|
|
||||||
private final String huc;
|
private final String huc;
|
||||||
|
|
||||||
private final List<DomainXML> domains;
|
private final ArrayList<DomainXML> domains;
|
||||||
|
|
||||||
private final double sliderTime;
|
private final double sliderTime;
|
||||||
|
|
||||||
|
@ -177,6 +178,12 @@ public class FFMPDataGenerator {
|
||||||
ffmpTableCfgData = tableConfig.getTableConfigData(siteKey);
|
ffmpTableCfgData = tableConfig.getTableConfigData(siteKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate the FFMP Data.
|
||||||
|
*
|
||||||
|
* @return FFMPTableData object
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
public FFMPTableData generateFFMPData() throws Exception {
|
public FFMPTableData generateFFMPData() throws Exception {
|
||||||
// You should always have at least a QPE data source
|
// You should always have at least a QPE data source
|
||||||
FFMPTableData tData = null;
|
FFMPTableData tData = null;
|
||||||
|
@ -256,8 +263,9 @@ public class FFMPDataGenerator {
|
||||||
* is in the CWA
|
* is in the CWA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
List<Long> pfafs = ft.getAggregatePfafs(
|
ArrayList<Long> pfafs = ft
|
||||||
key, siteKey, huc);
|
.getAggregatePfafs(key, siteKey,
|
||||||
|
huc);
|
||||||
|
|
||||||
boolean isVGB = false;
|
boolean isVGB = false;
|
||||||
if (ft.checkVGBsInAggregate(key, siteKey,
|
if (ft.checkVGBsInAggregate(key, siteKey,
|
||||||
|
@ -493,7 +501,9 @@ public class FFMPDataGenerator {
|
||||||
forced = forceUtil.isForced();
|
forced = forceUtil.isForced();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!forcedPfafs.isEmpty()) && forced && centeredAggregationKey == null) {
|
if ((!forcedPfafs.isEmpty()) && forced
|
||||||
|
&& centeredAggregationKey == null
|
||||||
|
&& !pfafList.isEmpty()) {
|
||||||
// Recalculate the guidance using the forced
|
// Recalculate the guidance using the forced
|
||||||
// value(s)
|
// value(s)
|
||||||
guidance = guidRecords
|
guidance = guidRecords
|
||||||
|
@ -506,7 +516,9 @@ public class FFMPDataGenerator {
|
||||||
guidance,
|
guidance,
|
||||||
forcedPfafs,
|
forcedPfafs,
|
||||||
resource.getGuidSourceExpiration(guidType));
|
resource.getGuidSourceExpiration(guidType));
|
||||||
} else if (!forcedPfafs.isEmpty() && centeredAggregationKey == null) {
|
} else if (!forcedPfafs.isEmpty()
|
||||||
|
&& centeredAggregationKey == null
|
||||||
|
&& !pfafList.isEmpty()) {
|
||||||
guidance = guidRecords
|
guidance = guidRecords
|
||||||
.get(guidType)
|
.get(guidType)
|
||||||
.getBasinData(ALL)
|
.getBasinData(ALL)
|
||||||
|
@ -518,7 +530,8 @@ public class FFMPDataGenerator {
|
||||||
forcedPfafs,
|
forcedPfafs,
|
||||||
resource.getGuidSourceExpiration(guidType));
|
resource.getGuidSourceExpiration(guidType));
|
||||||
forced = true;
|
forced = true;
|
||||||
} else if (!pfafList.isEmpty() && centeredAggregationKey == null) {
|
} else if (!pfafList.isEmpty()
|
||||||
|
&& centeredAggregationKey == null) {
|
||||||
guidance = guidRecords
|
guidance = guidRecords
|
||||||
.get(guidType)
|
.get(guidType)
|
||||||
.getBasinData(ALL)
|
.getBasinData(ALL)
|
||||||
|
@ -659,7 +672,9 @@ public class FFMPDataGenerator {
|
||||||
forced = forceUtil.isForced();
|
forced = forceUtil.isForced();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!forcedPfafs.isEmpty()) && forced && centeredAggregationKey == null) {
|
if ((!forcedPfafs.isEmpty()) && forced
|
||||||
|
&& centeredAggregationKey == null
|
||||||
|
&& !pfafList.isEmpty()) {
|
||||||
// Recalculate the guidance using the forced
|
// Recalculate the guidance using the forced
|
||||||
// value(s)
|
// value(s)
|
||||||
guidance = guidRecords
|
guidance = guidRecords
|
||||||
|
@ -672,7 +687,9 @@ public class FFMPDataGenerator {
|
||||||
guidance,
|
guidance,
|
||||||
forcedPfafs,
|
forcedPfafs,
|
||||||
resource.getGuidSourceExpiration(guidType));
|
resource.getGuidSourceExpiration(guidType));
|
||||||
} else if (!forcedPfafs.isEmpty() && centeredAggregationKey == null) {
|
} else if (!forcedPfafs.isEmpty()
|
||||||
|
&& centeredAggregationKey == null
|
||||||
|
&& !pfafList.isEmpty()) {
|
||||||
guidance = guidRecords
|
guidance = guidRecords
|
||||||
.get(guidType)
|
.get(guidType)
|
||||||
.getBasinData(ALL)
|
.getBasinData(ALL)
|
||||||
|
@ -684,7 +701,8 @@ public class FFMPDataGenerator {
|
||||||
forcedPfafs,
|
forcedPfafs,
|
||||||
resource.getGuidSourceExpiration(guidType));
|
resource.getGuidSourceExpiration(guidType));
|
||||||
forced = true;
|
forced = true;
|
||||||
} else if (!pfafList.isEmpty() && centeredAggregationKey == null) {
|
} else if (!pfafList.isEmpty()
|
||||||
|
&& centeredAggregationKey == null) {
|
||||||
guidance = guidRecords
|
guidance = guidRecords
|
||||||
.get(guidType)
|
.get(guidType)
|
||||||
.getBasinData(ALL)
|
.getBasinData(ALL)
|
||||||
|
|
|
@ -353,11 +353,11 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
|
||||||
|
|
||||||
start = start - 3;
|
start = start - 3;
|
||||||
cmd = cmd.substring(0, start) + returnMsg;
|
cmd = cmd.substring(0, start) + returnMsg;
|
||||||
|
}
|
||||||
TaskManager.getInstance().createScriptTask(name, cmd);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TaskManager.getInstance().createScriptTask(name, cmd);
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
||||||
e);
|
e);
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
**/
|
**/
|
||||||
package com.raytheon.viz.mpe.ui;
|
package com.raytheon.viz.mpe.ui;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -99,7 +100,8 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Dec 18, 2012 mschenke Initial creation
|
* Dec 18, 2012 mschenke Initial creation
|
||||||
* Mar 14, 2013 1457 mpduff Reset the gages on the resource.
|
* Mar 14, 2013 1457 mpduff Reset the gages on the resource.
|
||||||
* Apr 18, 2013 1920 mpduff Added updateGages method to reload the gage data.
|
* Apr 18, 2013 1920 mpduff Added updateGages method to reload the gage data,
|
||||||
|
* fix formatting of legend for Base field Height.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -979,6 +981,13 @@ public class MPEDisplayManager {
|
||||||
APPLICATION_NAME, cvUse, durationInHrs * 60 * 60, "E",
|
APPLICATION_NAME, cvUse, durationInHrs * 60 * 60, "E",
|
||||||
pColorSetGroup).toArray(new Colorvalue[0]);
|
pColorSetGroup).toArray(new Colorvalue[0]);
|
||||||
|
|
||||||
|
DisplayFieldData displayField = DisplayFieldData.fromString(cvUse);
|
||||||
|
|
||||||
|
if (displayField == DisplayFieldData.Height) {
|
||||||
|
params.setFormatString("0");
|
||||||
|
}
|
||||||
|
DecimalFormat format = new DecimalFormat(params.getFormatString());
|
||||||
|
|
||||||
int numColors = colorSet.length;
|
int numColors = colorSet.length;
|
||||||
float[] red = new float[numColors];
|
float[] red = new float[numColors];
|
||||||
float[] green = new float[numColors];
|
float[] green = new float[numColors];
|
||||||
|
@ -1002,6 +1011,9 @@ public class MPEDisplayManager {
|
||||||
// display
|
// display
|
||||||
entry.setDisplayValue(dataToDisplay
|
entry.setDisplayValue(dataToDisplay
|
||||||
.convert((short) displayToData.convert(threshold)));
|
.convert((short) displayToData.convert(threshold)));
|
||||||
|
if (displayField != DisplayFieldData.Index) {
|
||||||
|
entry.setLabel(format.format(threshold));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
entry.setPixelValue((double) i);
|
entry.setPixelValue((double) i);
|
||||||
|
|
||||||
|
@ -1022,7 +1034,7 @@ public class MPEDisplayManager {
|
||||||
params.setColorMapMax(params.getDataMax());
|
params.setColorMapMax(params.getDataMax());
|
||||||
|
|
||||||
// Check for Index parameter and set labels to radar sites
|
// Check for Index parameter and set labels to radar sites
|
||||||
if (DisplayFieldData.fromString(cvUse) == DisplayFieldData.Index) {
|
if (displayField == DisplayFieldData.Index) {
|
||||||
MPERadarLoc[] radars = MPEDataManager.getInstance().getRadars()
|
MPERadarLoc[] radars = MPEDataManager.getInstance().getRadars()
|
||||||
.toArray(new MPERadarLoc[0]);
|
.toArray(new MPERadarLoc[0]);
|
||||||
DataMappingEntry[] entries = dm.getEntries().toArray(
|
DataMappingEntry[] entries = dm.getEntries().toArray(
|
||||||
|
@ -1037,7 +1049,7 @@ public class MPEDisplayManager {
|
||||||
entries[i].setLabel("");
|
entries[i].setLabel("");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return params;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,8 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Sep 23, 2008 randerso Initial creation
|
* Sep 23, 2008 randerso Initial creation
|
||||||
|
* Apr 30, 2013 lbousaidi made seconds in the date/Time
|
||||||
|
* fields visible.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author randerso
|
* @author randerso
|
||||||
|
@ -259,7 +261,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
|
||||||
lastSave = new Label(statusComp, SWT.NONE);
|
lastSave = new Label(statusComp, SWT.NONE);
|
||||||
lastSave.setText("NA");
|
lastSave.setText("NA");
|
||||||
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
|
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
|
||||||
data.widthHint = 120;
|
data.widthHint = 140;
|
||||||
lastSave.setLayoutData(data);
|
lastSave.setLayoutData(data);
|
||||||
|
|
||||||
Label lab2 = new Label(statusComp, SWT.NONE);
|
Label lab2 = new Label(statusComp, SWT.NONE);
|
||||||
|
@ -268,7 +270,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
|
||||||
lastExec = new Label(statusComp, SWT.NONE);
|
lastExec = new Label(statusComp, SWT.NONE);
|
||||||
lastExec.setText("NA");
|
lastExec.setText("NA");
|
||||||
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
|
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
|
||||||
data.widthHint = 120;
|
data.widthHint = 140;
|
||||||
lastExec.setLayoutData(data);
|
lastExec.setLayoutData(data);
|
||||||
|
|
||||||
Label lab3 = new Label(statusComp, SWT.NONE);
|
Label lab3 = new Label(statusComp, SWT.NONE);
|
||||||
|
|
|
@ -69,6 +69,8 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Sep 2, 2008 randerso Initial creation
|
* Sep 2, 2008 randerso Initial creation
|
||||||
|
* May 01,2013 15920 lbousaidi gages get updated after clicking on
|
||||||
|
* Regenerate Hour Fields without closing 7x7 Gui.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author randerso
|
* @author randerso
|
||||||
|
@ -179,8 +181,7 @@ public class Display7x7Dialog extends CaveSWTDialog {
|
||||||
|
|
||||||
if (gData != null) {
|
if (gData != null) {
|
||||||
workingGage = new MPEDataManager.MPEGageData();
|
workingGage = new MPEDataManager.MPEGageData();
|
||||||
workingGage = gData;
|
workingGage = gData;
|
||||||
undoEn = true;
|
|
||||||
} else if (editGage.containsKey(selectedGage.getId())) {
|
} else if (editGage.containsKey(selectedGage.getId())) {
|
||||||
workingGage = editGage.get(selectedGage.getId());
|
workingGage = editGage.get(selectedGage.getId());
|
||||||
undoEn = true;
|
undoEn = true;
|
||||||
|
@ -482,6 +483,14 @@ public class Display7x7Dialog extends CaveSWTDialog {
|
||||||
undoMissing.setEnabled(undoEn);
|
undoMissing.setEnabled(undoEn);
|
||||||
String wid = workingGage.getId();
|
String wid = workingGage.getId();
|
||||||
editGage.put(wid, workingGage);
|
editGage.put(wid, workingGage);
|
||||||
|
|
||||||
|
if (!editGage.isEmpty()) {
|
||||||
|
Iterator<MPEGageData> x = editGage.values().iterator();
|
||||||
|
for (int i = 0; i < editGage.size(); i++) {
|
||||||
|
MPEGageData gd = x.next();
|
||||||
|
MPEDataManager.getInstance().addEditedGage(gd);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -557,6 +566,14 @@ public class Display7x7Dialog extends CaveSWTDialog {
|
||||||
oldManedit = workingGage.isManedit();
|
oldManedit = workingGage.isManedit();
|
||||||
workingGage.setManedit(true);
|
workingGage.setManedit(true);
|
||||||
editGage.put(wid, workingGage);
|
editGage.put(wid, workingGage);
|
||||||
|
|
||||||
|
if (!editGage.isEmpty()) {
|
||||||
|
Iterator<MPEGageData> x = editGage.values().iterator();
|
||||||
|
for (int i = 0; i < editGage.size(); i++) {
|
||||||
|
MPEGageData gd = x.next();
|
||||||
|
MPEDataManager.getInstance().addEditedGage(gd);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -890,10 +907,9 @@ public class Display7x7Dialog extends CaveSWTDialog {
|
||||||
valueLabel.setText(String.format("%4.2f", scaleVal / 100.0f));
|
valueLabel.setText(String.format("%4.2f", scaleVal / 100.0f));
|
||||||
if (gageVal.equalsIgnoreCase("bad")) {
|
if (gageVal.equalsIgnoreCase("bad")) {
|
||||||
setBad.setText("Set Not Bad");
|
setBad.setText("Set Not Bad");
|
||||||
}
|
}
|
||||||
if (gageVal.equalsIgnoreCase("missing")) {
|
|
||||||
setMissing.setEnabled(false);
|
undoMissing.setEnabled(false);
|
||||||
}
|
|
||||||
updateGridField(displayTypes[prodSetCbo.getSelectionIndex()]);
|
updateGridField(displayTypes[prodSetCbo.getSelectionIndex()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ import com.raytheon.uf.common.colormap.Color;
|
||||||
import com.raytheon.uf.common.geospatial.ReferencedCoordinate;
|
import com.raytheon.uf.common.geospatial.ReferencedCoordinate;
|
||||||
import com.raytheon.uf.common.ohd.AppsDefaults;
|
import com.raytheon.uf.common.ohd.AppsDefaults;
|
||||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
|
import com.raytheon.uf.common.time.DataTime;
|
||||||
import com.raytheon.uf.viz.core.DrawableCircle;
|
import com.raytheon.uf.viz.core.DrawableCircle;
|
||||||
import com.raytheon.uf.viz.core.DrawableString;
|
import com.raytheon.uf.viz.core.DrawableString;
|
||||||
import com.raytheon.uf.viz.core.IExtent;
|
import com.raytheon.uf.viz.core.IExtent;
|
||||||
|
@ -95,6 +96,7 @@ import com.vividsolutions.jts.index.strtree.STRtree;
|
||||||
* Sep 5, 2012 15079 snaples Added constant for Milli to inches conversion factor
|
* Sep 5, 2012 15079 snaples Added constant for Milli to inches conversion factor
|
||||||
* Feb 12, 2013 15773 snaples Updated addPoints to display PC gages when token is set to use PC data.
|
* Feb 12, 2013 15773 snaples Updated addPoints to display PC gages when token is set to use PC data.
|
||||||
* Mar 14, 2013 1457 mpduff Fixed various bugs.
|
* Mar 14, 2013 1457 mpduff Fixed various bugs.
|
||||||
|
* Apr 19, 2013 1920 mpduff Fixed gage color contrast, add e to display value of manually edited gages.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -349,10 +351,10 @@ public class MPEGageResource extends AbstractMPEInputResource implements
|
||||||
MPEDisplayManager.GageMissingOptions gm = MPEDisplayManager
|
MPEDisplayManager.GageMissingOptions gm = MPEDisplayManager
|
||||||
.getGageMissing();
|
.getGageMissing();
|
||||||
boolean displayIsEdit = false;
|
boolean displayIsEdit = false;
|
||||||
if (paintProps.getDataTime() != null
|
DataTime paintTime = paintProps.getFramesInfo().getCurrentFrame();
|
||||||
&& displayMgr.getCurrentEditDate() != null) {
|
Date editTime = displayMgr.getCurrentEditDate();
|
||||||
displayIsEdit = displayMgr.getCurrentEditDate().equals(
|
if (paintTime != null && editTime != null) {
|
||||||
paintProps.getDataTime().getRefTime());
|
displayIsEdit = editTime.equals(paintTime.getRefTime());
|
||||||
}
|
}
|
||||||
boolean xor = MPEDisplayManager.getGageColor() == GageColor.Contrast
|
boolean xor = MPEDisplayManager.getGageColor() == GageColor.Contrast
|
||||||
&& displayIsEdit;
|
&& displayIsEdit;
|
||||||
|
@ -420,6 +422,9 @@ public class MPEGageResource extends AbstractMPEInputResource implements
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isGageIdsDisplayed || isGageValuesDisplayed) {
|
if (isGageIdsDisplayed || isGageValuesDisplayed) {
|
||||||
|
if (gageData.isManedit()) {
|
||||||
|
gageValue = gageValue.concat("e");
|
||||||
|
}
|
||||||
DrawableString string = new DrawableString(
|
DrawableString string = new DrawableString(
|
||||||
new String[] { gageValue, gageId, }, gageColor);
|
new String[] { gageValue, gageId, }, gageColor);
|
||||||
string.font = font;
|
string.font = font;
|
||||||
|
|
|
@ -71,6 +71,7 @@ import com.vividsolutions.jts.geom.Polygon;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Apr 8, 2009 snaples Initial creation
|
* Apr 8, 2009 snaples Initial creation
|
||||||
|
* May 2, 2013 15970 snaples Updated setColor to use the correct color.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -96,7 +97,7 @@ public class PlotMeanAreaPrecipResource extends
|
||||||
|
|
||||||
private ColorMapParameters parameters = new ColorMapParameters();
|
private ColorMapParameters parameters = new ColorMapParameters();
|
||||||
|
|
||||||
private List<Colorvalue> colorSet;
|
private final List<Colorvalue> colorSet;
|
||||||
|
|
||||||
public PlotMeanAreaPrecipResource(MPEDisplayManager displayMgr,
|
public PlotMeanAreaPrecipResource(MPEDisplayManager displayMgr,
|
||||||
List<Colorvalue> colorSet) {
|
List<Colorvalue> colorSet) {
|
||||||
|
@ -542,12 +543,23 @@ public class PlotMeanAreaPrecipResource extends
|
||||||
if (i == colorMap.getColors().size()) {
|
if (i == colorMap.getColors().size()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// DR 15970
|
||||||
|
// Adjusted the index value of the color returned, was
|
||||||
|
// returning one level higher than value should have.
|
||||||
if (value == entry.getDisplayValue()) {
|
if (value == entry.getDisplayValue()) {
|
||||||
|
if (i == 0){
|
||||||
gcol = convertC(colorMap.getColors().get(i));
|
gcol = convertC(colorMap.getColors().get(i));
|
||||||
|
} else {
|
||||||
|
gcol = convertC(colorMap.getColors().get(i - 1));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
} else if (value < entry.getDisplayValue()) {
|
} else if (value < entry.getDisplayValue()) {
|
||||||
gcol = convertC(colorMap.getColors().get(i));
|
if (i == 0){
|
||||||
break;
|
gcol = convertC(colorMap.getColors().get(i));
|
||||||
|
} else {
|
||||||
|
gcol = convertC(colorMap.getColors().get(i - 1));
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -319,6 +319,7 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox;
|
||||||
* is not a valid WMO heading.
|
* is not a valid WMO heading.
|
||||||
* 31JAN2013 1563 rferrel Force location of airport tooltip.
|
* 31JAN2013 1563 rferrel Force location of airport tooltip.
|
||||||
* 31JAN2013 1568 rferrel Spell checker now tied to this dialog instead of parent.
|
* 31JAN2013 1568 rferrel Spell checker now tied to this dialog instead of parent.
|
||||||
|
* 26Apr2013 16123 snaples Removed setFocus to TextEditor in postExecute method.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author lvenable
|
* @author lvenable
|
||||||
|
@ -1101,7 +1102,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
/**
|
/**
|
||||||
* flag to indicate it a product request is from the GUI or an updated ob.
|
* flag to indicate it a product request is from the GUI or an updated ob.
|
||||||
*/
|
*/
|
||||||
private AtomicInteger updateCount = new AtomicInteger(0);
|
private final AtomicInteger updateCount = new AtomicInteger(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The expire notification when editing a warn gen product.
|
* The expire notification when editing a warn gen product.
|
||||||
|
@ -1199,7 +1200,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
/**
|
/**
|
||||||
* Job to handle query for products off the UI thread.
|
* Job to handle query for products off the UI thread.
|
||||||
*/
|
*/
|
||||||
private ProductQueryJob productQueryJob = new ProductQueryJob(this);
|
private final ProductQueryJob productQueryJob = new ProductQueryJob(this);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Flag to indicate if the dialog is in wait mode.
|
* Flag to indicate if the dialog is in wait mode.
|
||||||
|
@ -3175,10 +3176,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
afosCmdTF.addSelectionListener(new SelectionListener() {
|
afosCmdTF.addSelectionListener(new SelectionListener() {
|
||||||
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
String tmp = afosCmdTF.getText();
|
String tmp = afosCmdTF.getText();
|
||||||
tmp = tmp.trim();
|
tmp = tmp.trim();
|
||||||
|
@ -3253,6 +3256,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
wmoTtaaiiTF.addModifyListener(new ModifyListener() {
|
wmoTtaaiiTF.addModifyListener(new ModifyListener() {
|
||||||
|
@Override
|
||||||
public void modifyText(ModifyEvent event) {
|
public void modifyText(ModifyEvent event) {
|
||||||
if (wmoTtaaiiTF.getCaretPosition() == wmoTtaaiiTF
|
if (wmoTtaaiiTF.getCaretPosition() == wmoTtaaiiTF
|
||||||
.getTextLimit()) {
|
.getTextLimit()) {
|
||||||
|
@ -3262,10 +3266,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
wmoTtaaiiTF.addSelectionListener(new SelectionListener() {
|
wmoTtaaiiTF.addSelectionListener(new SelectionListener() {
|
||||||
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
||||||
ccccTF.setText(ccccTF.getText().toUpperCase());
|
ccccTF.setText(ccccTF.getText().toUpperCase());
|
||||||
|
@ -3320,10 +3326,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
ccccTF.addSelectionListener(new SelectionListener() {
|
ccccTF.addSelectionListener(new SelectionListener() {
|
||||||
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
||||||
ccccTF.setText(ccccTF.getText().toUpperCase());
|
ccccTF.setText(ccccTF.getText().toUpperCase());
|
||||||
|
@ -3381,10 +3389,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
});
|
});
|
||||||
|
|
||||||
awipsIdTF.addSelectionListener(new SelectionListener() {
|
awipsIdTF.addSelectionListener(new SelectionListener() {
|
||||||
|
@Override
|
||||||
public void widgetSelected(SelectionEvent event) {
|
public void widgetSelected(SelectionEvent event) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void widgetDefaultSelected(SelectionEvent event) {
|
public void widgetDefaultSelected(SelectionEvent event) {
|
||||||
awipsIdTF.setText(awipsIdTF.getText().trim().toUpperCase());
|
awipsIdTF.setText(awipsIdTF.getText().trim().toUpperCase());
|
||||||
int charCount = awipsIdTF.getCharCount();
|
int charCount = awipsIdTF.getCharCount();
|
||||||
|
@ -3794,6 +3804,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
// });
|
// });
|
||||||
|
|
||||||
textEditor.addVerifyKeyListener(new VerifyKeyListener() {
|
textEditor.addVerifyKeyListener(new VerifyKeyListener() {
|
||||||
|
@Override
|
||||||
public void verifyKey(VerifyEvent event) {
|
public void verifyKey(VerifyEvent event) {
|
||||||
// Ignore edit keys when not in edit mode.
|
// Ignore edit keys when not in edit mode.
|
||||||
if (textEditor.getEditable() == false) {
|
if (textEditor.getEditable() == false) {
|
||||||
|
@ -3925,6 +3936,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
mi.setEnabled(isPopItemDefault[items.indexOf(pi)]);
|
mi.setEnabled(isPopItemDefault[items.indexOf(pi)]);
|
||||||
}
|
}
|
||||||
mi.addListener(SWT.Selection, new Listener() {
|
mi.addListener(SWT.Selection, new Listener() {
|
||||||
|
@Override
|
||||||
public void handleEvent(Event event) {
|
public void handleEvent(Event event) {
|
||||||
handleSelection(event);
|
handleSelection(event);
|
||||||
}
|
}
|
||||||
|
@ -5769,6 +5781,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
/**
|
/**
|
||||||
* Set the dispaly model's AFOS command for this editor.
|
* Set the dispaly model's AFOS command for this editor.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void setAfosCmdField(String cmd) {
|
public void setAfosCmdField(String cmd) {
|
||||||
afosCmdTF.setText(cmd);
|
afosCmdTF.setText(cmd);
|
||||||
TextDisplayModel.getInstance().setAfosCommand(token, cmd);
|
TextDisplayModel.getInstance().setAfosCommand(token, cmd);
|
||||||
|
@ -5795,6 +5808,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
/**
|
/**
|
||||||
* Convience method to execuete comand without updating ObsUpdated.
|
* Convience method to execuete comand without updating ObsUpdated.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void executeCommand(ICommand command) {
|
public void executeCommand(ICommand command) {
|
||||||
executeCommand(command, false);
|
executeCommand(command, false);
|
||||||
}
|
}
|
||||||
|
@ -5831,6 +5845,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
* Request for product(s) is finish now update the display with the
|
* Request for product(s) is finish now update the display with the
|
||||||
* information.
|
* information.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public void requestDone(ICommand command,
|
public void requestDone(ICommand command,
|
||||||
final List<StdTextProduct> prodList, final boolean isObsUpdated) {
|
final List<StdTextProduct> prodList, final boolean isObsUpdated) {
|
||||||
boolean enterEditor = false;
|
boolean enterEditor = false;
|
||||||
|
@ -6012,11 +6027,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
} else {
|
} else {
|
||||||
resendWarningProductnItem.setEnabled(true);
|
resendWarningProductnItem.setEnabled(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always give focus to textEditor after populating it.
|
|
||||||
if (validExecuteCommand) {
|
|
||||||
textEditor.setFocus();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7181,6 +7191,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
getDisplay().syncExec(new Runnable() {
|
getDisplay().syncExec(new Runnable() {
|
||||||
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!shell.isDisposed()) {
|
if (!shell.isDisposed()) {
|
||||||
if (autoSave == AutoSaveTask.this) {
|
if (autoSave == AutoSaveTask.this) {
|
||||||
|
|
|
@ -41,6 +41,7 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
|
||||||
* Feb 13, 2012 1605 jsanchez Calculated the point based on lat,lon values.
|
* Feb 13, 2012 1605 jsanchez Calculated the point based on lat,lon values.
|
||||||
* Mar 25, 2013 1810 jsanchez Allowed other values to be accepted as a true value for useDirs.
|
* Mar 25, 2013 1810 jsanchez Allowed other values to be accepted as a true value for useDirs.
|
||||||
* Mar 25, 2013 1605 jsanchez Set ClosestPoint's prepGeom.
|
* Mar 25, 2013 1605 jsanchez Set ClosestPoint's prepGeom.
|
||||||
|
* Apr 24, 2013 1944 jsanchez Updated calculateLocationPortion visibility to public.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -119,10 +120,26 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
int gid = getGid(ptFields, attributes);
|
int gid = getGid(ptFields, attributes);
|
||||||
ClosestPoint cp = new ClosestPoint(name, point, population, warngenlev,
|
ClosestPoint cp = new ClosestPoint(name, point, population, warngenlev,
|
||||||
partOfArea, gid);
|
partOfArea, gid);
|
||||||
cp.setPrepGeom(PreparedGeometryFactory.prepare(ptRslt.geometry));
|
|
||||||
|
// Used to determine if a storm location is within an urban bound area
|
||||||
|
if (useDirections(attributes.get(useDirectionField))) {
|
||||||
|
cp.setPrepGeom(PreparedGeometryFactory.prepare(ptRslt.geometry));
|
||||||
|
}
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts DB value (i.e. 1, t, true) to a boolean true
|
||||||
|
*
|
||||||
|
* @param useDirectionValue
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
private boolean useDirections(Object useDirectionValue) {
|
||||||
|
String userDir = String.valueOf(useDirectionValue).toLowerCase();
|
||||||
|
return Boolean.valueOf(userDir) || userDir.equals("t")
|
||||||
|
|| userDir.equals("1");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Processes the filter to set the localized site.
|
* Processes the filter to set the localized site.
|
||||||
*/
|
*/
|
||||||
|
@ -148,7 +165,8 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the part of area impacted if the userDirectionField is set to
|
* Determines the part of area impacted if the userDirectionField is set to
|
||||||
* true.
|
* true. This method only takes into account areas within the warning
|
||||||
|
* polygon.
|
||||||
*
|
*
|
||||||
* @param ptFields
|
* @param ptFields
|
||||||
* @param attributes
|
* @param attributes
|
||||||
|
@ -158,17 +176,12 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
private List<String> getPartOfArea(Set<String> ptFields,
|
private List<String> getPartOfArea(Set<String> ptFields,
|
||||||
Map<String, Object> attributes, Geometry geom) {
|
Map<String, Object> attributes, Geometry geom) {
|
||||||
List<String> partOfArea = null;
|
List<String> partOfArea = null;
|
||||||
|
if (useDirections(attributes.get(useDirectionField))) {
|
||||||
String userDir = String.valueOf(attributes.get(useDirectionField))
|
|
||||||
.toLowerCase();
|
|
||||||
boolean userDirections = Boolean.valueOf(userDir)
|
|
||||||
|| userDir.equals("t") || userDir.equals("1");
|
|
||||||
if (userDirections) {
|
|
||||||
PreparedGeometry prepGeom = PreparedGeometryFactory.prepare(geom);
|
PreparedGeometry prepGeom = PreparedGeometryFactory.prepare(geom);
|
||||||
if (prepGeom.intersects(searchArea) && !prepGeom.within(searchArea)) {
|
if (prepGeom.intersects(searchArea) && !prepGeom.within(searchArea)) {
|
||||||
Geometry intersection = searchArea.intersection(geom);
|
Geometry intersection = searchArea.intersection(geom);
|
||||||
partOfArea = GisUtil.asStringList(calculateLocationPortion(
|
partOfArea = GisUtil.asStringList(calculateLocationPortion(
|
||||||
geom, intersection, gc));
|
geom, null, intersection, gc));
|
||||||
|
|
||||||
if (attributes.get(suppressedDirectionsField) != null) {
|
if (attributes.get(suppressedDirectionsField) != null) {
|
||||||
String suppressedDirections = String.valueOf(
|
String suppressedDirections = String.valueOf(
|
||||||
|
@ -243,15 +256,20 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
||||||
* Calculates the cardinal directions of a location.
|
* Calculates the cardinal directions of a location.
|
||||||
*
|
*
|
||||||
* @param geom
|
* @param geom
|
||||||
|
* @param point
|
||||||
* @param intersection
|
* @param intersection
|
||||||
* @param gc
|
* @param gc
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
private static EnumSet<Direction> calculateLocationPortion(Geometry geom,
|
public static EnumSet<Direction> calculateLocationPortion(Geometry geom,
|
||||||
Geometry intersection, GeodeticCalculator gc) {
|
Coordinate point, Geometry intersection, GeodeticCalculator gc) {
|
||||||
EnumSet<Direction> directions = EnumSet.noneOf(Direction.class);
|
EnumSet<Direction> directions = EnumSet.noneOf(Direction.class);
|
||||||
Coordinate geomCentroid = geom.convexHull().getCentroid()
|
Coordinate geomCentroid = null;
|
||||||
.getCoordinate();
|
if (point != null) {
|
||||||
|
geomCentroid = point;
|
||||||
|
} else {
|
||||||
|
geomCentroid = geom.convexHull().getCentroid().getCoordinate();
|
||||||
|
}
|
||||||
Coordinate intersectCentroid = intersection.convexHull().getCentroid()
|
Coordinate intersectCentroid = intersection.convexHull().getCentroid()
|
||||||
.getCoordinate();
|
.getCoordinate();
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,7 @@ import com.raytheon.viz.warngen.PreferenceUtil;
|
||||||
import com.raytheon.viz.warngen.WarngenException;
|
import com.raytheon.viz.warngen.WarngenException;
|
||||||
import com.raytheon.viz.warngen.config.AbstractDbSourceDataAdaptor;
|
import com.raytheon.viz.warngen.config.AbstractDbSourceDataAdaptor;
|
||||||
import com.raytheon.viz.warngen.config.DataAdaptorFactory;
|
import com.raytheon.viz.warngen.config.DataAdaptorFactory;
|
||||||
|
import com.raytheon.viz.warngen.config.DbAreaSourceDataAdaptor;
|
||||||
import com.raytheon.viz.warngen.util.Abbreviation;
|
import com.raytheon.viz.warngen.util.Abbreviation;
|
||||||
import com.raytheon.viz.warngen.util.AdjustAngle;
|
import com.raytheon.viz.warngen.util.AdjustAngle;
|
||||||
import com.raytheon.viz.warnings.DateUtil;
|
import com.raytheon.viz.warnings.DateUtil;
|
||||||
|
@ -106,6 +107,7 @@ import com.vividsolutions.jts.geom.Point;
|
||||||
* Feb 12, 2013 1600 jsanchez Used adjustAngle method from AbstractStormTrackResource.
|
* Feb 12, 2013 1600 jsanchez Used adjustAngle method from AbstractStormTrackResource.
|
||||||
* Mar 5, 2013 1600 jsanchez Used AdjustAngle instead of AbstractStormTrackResource to handle angle adjusting.
|
* Mar 5, 2013 1600 jsanchez Used AdjustAngle instead of AbstractStormTrackResource to handle angle adjusting.
|
||||||
* Mar 25, 2013 1605 jsanchez Checks if a storm location is over an urban bound area.
|
* Mar 25, 2013 1605 jsanchez Checks if a storm location is over an urban bound area.
|
||||||
|
* Apr 24, 2013 1943 jsanchez Calculated partOfArea for a storm location over an urban bound area.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -723,10 +725,21 @@ public class Wx {
|
||||||
latLonToLocal);
|
latLonToLocal);
|
||||||
|
|
||||||
double distance = localDistanceGeom.distance(localPt);
|
double distance = localDistanceGeom.distance(localPt);
|
||||||
// Tests if storm location is over an urban bound area
|
// Tests if storm location is over an urban bound area even if
|
||||||
if (cp.prepGeom != null
|
// it may be outside the warning polygon
|
||||||
&& cp.prepGeom.intersects(stormLocation)) {
|
if (cp.prepGeom != null && config.isTrackEnabled()
|
||||||
distance = 0;
|
&& isWithinPolygon == false) {
|
||||||
|
// When isWithinPolygon is true, partOfArea
|
||||||
|
// has already been set in DbAreaSoureDataAdapter
|
||||||
|
Point reference = gf.createPoint(coords[i]);
|
||||||
|
if (cp.prepGeom.intersects(reference)) {
|
||||||
|
cp.partOfArea = GisUtil
|
||||||
|
.asStringList(DbAreaSourceDataAdaptor
|
||||||
|
.calculateLocationPortion(
|
||||||
|
cp.prepGeom.getGeometry(),
|
||||||
|
cp.point, reference, gc));
|
||||||
|
distance = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (distance <= thresholdInMeters) {
|
if (distance <= thresholdInMeters) {
|
||||||
if (allowDuplicates) {
|
if (allowDuplicates) {
|
||||||
|
|
|
@ -58,6 +58,8 @@ import org.opengis.referencing.operation.MathTransform;
|
||||||
import com.raytheon.uf.common.activetable.ActiveTableRecord;
|
import com.raytheon.uf.common.activetable.ActiveTableRecord;
|
||||||
import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord;
|
import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord;
|
||||||
import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction;
|
import com.raytheon.uf.common.dataplugin.warning.WarningRecord.WarningAction;
|
||||||
|
import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration;
|
||||||
|
import com.raytheon.uf.common.dataplugin.warning.config.AreaSourceConfiguration.AreaType;
|
||||||
import com.raytheon.uf.common.dataplugin.warning.config.BulletActionGroup;
|
import com.raytheon.uf.common.dataplugin.warning.config.BulletActionGroup;
|
||||||
import com.raytheon.uf.common.dataplugin.warning.config.DialogConfiguration;
|
import com.raytheon.uf.common.dataplugin.warning.config.DialogConfiguration;
|
||||||
import com.raytheon.uf.common.dataplugin.warning.config.GridSpacing;
|
import com.raytheon.uf.common.dataplugin.warning.config.GridSpacing;
|
||||||
|
@ -170,6 +172,7 @@ import com.vividsolutions.jts.io.WKTReader;
|
||||||
* 04/10/2013 DR 16044 D. Friedman Fix NPE in getAllFipsInArea.
|
* 04/10/2013 DR 16044 D. Friedman Fix NPE in getAllFipsInArea.
|
||||||
* 04/11/2013 1894 jsanchez Kept tracked of the currently loaded custom maps.
|
* 04/11/2013 1894 jsanchez Kept tracked of the currently loaded custom maps.
|
||||||
* 04/12/1013 DR 16045 Qinglu Lin Updated AreaHatcher's run() by calling removeDuplicateCoordinate().
|
* 04/12/1013 DR 16045 Qinglu Lin Updated AreaHatcher's run() by calling removeDuplicateCoordinate().
|
||||||
|
* 04/24/2013 1943 jsanchez Replaced used of areaConfig with areaSource.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author mschenke
|
* @author mschenke
|
||||||
|
@ -2562,8 +2565,13 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getFips(GeospatialData data) {
|
private String getFips(GeospatialData data) {
|
||||||
return (String) data.attributes.get(configuration.getAreaConfig()
|
for (AreaSourceConfiguration areaSource : configuration
|
||||||
.getFipsField());
|
.getAreaSources()) {
|
||||||
|
if (areaSource.getType() == AreaType.HATCHING) {
|
||||||
|
return (String) data.attributes.get(areaSource.getFipsField());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getFips(Geometry g) {
|
private String getFips(Geometry g) {
|
||||||
|
|
|
@ -204,23 +204,14 @@ public class WrapUtil implements ICommonPatterns {
|
||||||
|
|
||||||
if (bestDelim != null) {
|
if (bestDelim != null) {
|
||||||
failed = false;
|
failed = false;
|
||||||
int next = indexIgnoringLockMarkers(line,
|
int next = bestP + bestDelim.length();
|
||||||
bestP + bestDelim.length(), 0);
|
|
||||||
int segmentEnd = " ".equals(bestDelim) ? bestP : next;
|
int segmentEnd = " ".equals(bestDelim) ? bestP : next;
|
||||||
appendRTrim(line, start, segmentEnd, sb);
|
appendRTrim(line, start, segmentEnd, sb);
|
||||||
|
start = splitEndOfLine(line, next, inBullet, sb);
|
||||||
|
|
||||||
// Remove any leading space at the start of the next line.
|
if (inBullet) {
|
||||||
while (next < line.length() && line.charAt(next) == ' ')
|
allowLength = maxLength - INDENT.length();
|
||||||
next = indexIgnoringLockMarkers(line, next, 1);
|
|
||||||
|
|
||||||
if (next < line.length()) {
|
|
||||||
sb.append('\n');
|
|
||||||
if (inBullet) {
|
|
||||||
sb.append(INDENT);
|
|
||||||
allowLength = maxLength - INDENT.length();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
start = next;
|
|
||||||
} else if (! failed) {
|
} else if (! failed) {
|
||||||
/*
|
/*
|
||||||
* Failed to wrap before the margin. Try again, wrapping the
|
* Failed to wrap before the margin. Try again, wrapping the
|
||||||
|
@ -316,4 +307,54 @@ public class WrapUtil implements ICommonPatterns {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle whitespace and lock markers between line breaks. Adds line break
|
||||||
|
* and indentation for the next line as necessary.
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>If there is nothing but whitespace and lock markers remaining, append
|
||||||
|
* all of it to the current line so as to not create an extra empty blank
|
||||||
|
* line.</li>
|
||||||
|
* <li>If there is an end-lock marker, include it on the current line and
|
||||||
|
* break after it.</li>
|
||||||
|
* <li>If there is a start-lock marker, break before it.
|
||||||
|
* </ul>
|
||||||
|
*
|
||||||
|
* @return The index in text at which processing for the next line should
|
||||||
|
* begin.
|
||||||
|
*/
|
||||||
|
private static int splitEndOfLine(String text, int start, boolean inBullet, StringBuilder sb) {
|
||||||
|
int goodBreak = start;
|
||||||
|
int i = start;
|
||||||
|
|
||||||
|
while (i < text.length()) {
|
||||||
|
if (Character.isWhitespace(text.charAt(i))) {
|
||||||
|
++i;
|
||||||
|
} else if (text.startsWith(LOCK_START, i)) {
|
||||||
|
goodBreak = i;
|
||||||
|
i += LOCK_START.length();
|
||||||
|
break;
|
||||||
|
} else if (text.startsWith(LOCK_END, i)) {
|
||||||
|
i += LOCK_END.length();
|
||||||
|
goodBreak = i;
|
||||||
|
break;
|
||||||
|
} else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= text.length())
|
||||||
|
goodBreak = i;
|
||||||
|
if (goodBreak >= start) {
|
||||||
|
appendRTrim(text, start, goodBreak, sb);
|
||||||
|
}
|
||||||
|
if (i < text.length()) {
|
||||||
|
sb.append('\n');
|
||||||
|
if (inBullet) {
|
||||||
|
sb.append(INDENT);
|
||||||
|
}
|
||||||
|
appendRTrim(text, goodBreak, i, sb);
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -68,6 +68,7 @@ import com.vividsolutions.jts.geom.Geometry;
|
||||||
* Mar 28, 2011 mschenke Initial creation
|
* Mar 28, 2011 mschenke Initial creation
|
||||||
* Feb 12, 2013 1500 mschenke Refactored to not request full records and only request full
|
* Feb 12, 2013 1500 mschenke Refactored to not request full records and only request full
|
||||||
* record when actually retrieving for use
|
* record when actually retrieving for use
|
||||||
|
* Apr 22, 2013 jsanchez Set the issue time for follow up warnings.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -303,6 +304,7 @@ public class CurrentWarnings {
|
||||||
if (getAction(warning.getAct()) == WarningAction.EXT) {
|
if (getAction(warning.getAct()) == WarningAction.EXT) {
|
||||||
if (rval != null) {
|
if (rval != null) {
|
||||||
rval.setEndTime(warning.getEndTime());
|
rval.setEndTime(warning.getEndTime());
|
||||||
|
rval.setIssueTime(warning.getInsertTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -317,6 +319,7 @@ public class CurrentWarnings {
|
||||||
rval.setUgczones(warning.getUgczones());
|
rval.setUgczones(warning.getUgczones());
|
||||||
rval.setLoc(warning.getLoc());
|
rval.setLoc(warning.getLoc());
|
||||||
rval.setRawmessage(warning.getRawmessage());
|
rval.setRawmessage(warning.getRawmessage());
|
||||||
|
rval.setIssueTime(warning.getInsertTime());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,6 +50,7 @@ import com.raytheon.viz.warnings.DateUtil;
|
||||||
* May 6, 2008 bwoodle Initial creation
|
* May 6, 2008 bwoodle Initial creation
|
||||||
* Dec 28 2012 DR15599 mgamazaychikov Updated method getListCounties to fix the problem
|
* Dec 28 2012 DR15599 mgamazaychikov Updated method getListCounties to fix the problem
|
||||||
* with generated list of counties.
|
* with generated list of counties.
|
||||||
|
* Apr 25,2013 1877 jsanchez Sorted the UGC line for cancellations.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -170,6 +171,7 @@ public class FipsUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Collections.sort(countiesOrZones);
|
||||||
rval.append(simplifyHeader(getUgcLine(countiesOrZones)));
|
rval.append(simplifyHeader(getUgcLine(countiesOrZones)));
|
||||||
rval.append(du
|
rval.append(du
|
||||||
.format(endtime, new SimpleDateFormat("ddHHmm"), interval)
|
.format(endtime, new SimpleDateFormat("ddHHmm"), interval)
|
||||||
|
@ -362,12 +364,12 @@ public class FipsUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* DR15599 - completely re-did how rval is calculated.
|
* DR15599 - completely re-did how rval is calculated.
|
||||||
*/
|
*/
|
||||||
String[] lines = matchStr.split("[\n]");
|
String[] lines = matchStr.split("[\n]");
|
||||||
matchStr = "";
|
matchStr = "";
|
||||||
for (String line : lines) {
|
for (String line : lines) {
|
||||||
matchStr += line;
|
matchStr += line;
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] ranges = matchStr.split("[-]");
|
String[] ranges = matchStr.split("[-]");
|
||||||
|
@ -376,12 +378,12 @@ public class FipsUtil {
|
||||||
for (String range : ranges) {
|
for (String range : ranges) {
|
||||||
if (Character.isLetter(range.charAt(0))) {
|
if (Character.isLetter(range.charAt(0))) {
|
||||||
/*
|
/*
|
||||||
* range starts with a character - get the new
|
* range starts with a character - get the new state or marine
|
||||||
* state or marine zone name
|
* zone name
|
||||||
*/
|
*/
|
||||||
if (curState != null) {
|
if (curState != null) {
|
||||||
for (String zone: curList) {
|
for (String zone : curList) {
|
||||||
rval.add(curState+zone);
|
rval.add(curState + zone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
curState = range.substring(0, 3);
|
curState = range.substring(0, 3);
|
||||||
|
@ -406,8 +408,8 @@ public class FipsUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (curState != null) {
|
if (curState != null) {
|
||||||
for (String zone: curList) {
|
for (String zone : curList) {
|
||||||
rval.add(curState+zone);
|
rval.add(curState + zone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rval;
|
return rval;
|
||||||
|
|
|
@ -77,7 +77,8 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
|
||||||
* Sep 26, 2012 jsanchez Refactored AbstractWarningResource and AbstractWatchesResource into this class.
|
* Sep 26, 2012 jsanchez Refactored AbstractWarningResource and AbstractWatchesResource into this class.
|
||||||
* Apr 11, 2013 1877 jsanchez Updated conditions for matching a frame.
|
* Apr 11, 2013 1877 jsanchez Updated conditions for matching a frame.
|
||||||
* Apr 18, 2013 1877 jsanchez Had the child classes set the comparator. Fixed a null pointer.
|
* Apr 18, 2013 1877 jsanchez Had the child classes set the comparator. Fixed a null pointer.
|
||||||
*
|
* Remove frameAltered condition in matchesFrame. It prevented entries from being displayed.
|
||||||
|
* Check if geometry is null when inspecting.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author jsanchez
|
* @author jsanchez
|
||||||
|
@ -106,8 +107,6 @@ public abstract class AbstractWWAResource extends
|
||||||
|
|
||||||
protected Date timeAltered;
|
protected Date timeAltered;
|
||||||
|
|
||||||
protected Date frameAltered;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* was the alter a partial cancel? if it was then a matching CON should
|
* was the alter a partial cancel? if it was then a matching CON should
|
||||||
* be processed and added
|
* be processed and added
|
||||||
|
@ -218,7 +217,8 @@ public abstract class AbstractWWAResource extends
|
||||||
|
|
||||||
WarningEntry entry = entryMap.get(key);
|
WarningEntry entry = entryMap.get(key);
|
||||||
AbstractWarningRecord record = entry.record;
|
AbstractWarningRecord record = entry.record;
|
||||||
if (matchesFrame(entry, time, framePeriod, lastFrame)) {
|
if (matchesFrame(entry, time, framePeriod, lastFrame)
|
||||||
|
&& record.getGeometry() != null) {
|
||||||
|
|
||||||
Geometry recordGeom = record.getGeometry();
|
Geometry recordGeom = record.getGeometry();
|
||||||
for (int i = 0; i < recordGeom.getNumGeometries(); i++) {
|
for (int i = 0; i < recordGeom.getNumGeometries(); i++) {
|
||||||
|
@ -448,8 +448,7 @@ public abstract class AbstractWWAResource extends
|
||||||
// version only in the frames prior to the time it was altered
|
// version only in the frames prior to the time it was altered
|
||||||
} else if (entry.altered) {
|
} else if (entry.altered) {
|
||||||
if (frameStart.getTime() >= refTime.getTime()
|
if (frameStart.getTime() >= refTime.getTime()
|
||||||
&& frameStart.getTime() <= (entry.timeAltered.getTime())
|
&& frameStart.getTime() < entry.timeAltered.getTime()) {
|
||||||
&& frameStart.getTime() < entry.frameAltered.getTime()) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (refTime.equals(paintTime)
|
} else if (refTime.equals(paintTime)
|
||||||
|
|
|
@ -58,7 +58,8 @@ import com.vividsolutions.jts.geom.Geometry;
|
||||||
* Jun 04, 2012 DR14992 mgamazaychikov Fix the problem with plotting expiration time for
|
* Jun 04, 2012 DR14992 mgamazaychikov Fix the problem with plotting expiration time for
|
||||||
* NEW warning when CAN warning is issued
|
* NEW warning when CAN warning is issued
|
||||||
* Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class.
|
* Sep 27, 2012 1149 jsanchez Refactored methods from AbstractWarningsResource into this class.
|
||||||
* Arp 18, 2013 1877 jsanchez Ordered the records the same for update and initial load.
|
* Apr 18, 2013 1877 jsanchez Ordered the records the same for update and initial load.
|
||||||
|
* Removed no longer needed frameAltered. Do not set wire frame for a CAN.
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author jsanchez
|
* @author jsanchez
|
||||||
|
@ -201,14 +202,21 @@ public class WarningsResource extends AbstractWWAResource {
|
||||||
if (wfs != null) {
|
if (wfs != null) {
|
||||||
wfs.dispose();
|
wfs.dispose();
|
||||||
}
|
}
|
||||||
|
WarningAction act = WarningAction.valueOf(record.getAct());
|
||||||
|
// Do not paint a wire frame shape for a CAN
|
||||||
|
if (act != WarningAction.CAN) {
|
||||||
|
wfs = target.createWireframeShape(false, descriptor);
|
||||||
|
geo = (Geometry) record.getGeometry().clone();
|
||||||
|
|
||||||
wfs = target.createWireframeShape(false, descriptor);
|
JTSCompiler jtsCompiler = new JTSCompiler(null, wfs,
|
||||||
geo = (Geometry) record.getGeometry().clone();
|
descriptor);
|
||||||
|
jtsCompiler.handle(geo);
|
||||||
JTSCompiler jtsCompiler = new JTSCompiler(null, wfs, descriptor);
|
wfs.compile();
|
||||||
jtsCompiler.handle(geo);
|
entry.wireframeShape = wfs;
|
||||||
wfs.compile();
|
} else {
|
||||||
entry.wireframeShape = wfs;
|
// Prevents sampling and a label to be painted
|
||||||
|
entry.record.setGeometry(null);
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
statusHandler.handle(Priority.ERROR,
|
statusHandler.handle(Priority.ERROR,
|
||||||
"Error creating wireframe", e);
|
"Error creating wireframe", e);
|
||||||
|
@ -243,28 +251,18 @@ public class WarningsResource extends AbstractWWAResource {
|
||||||
// changing end time
|
// changing end time
|
||||||
entry.timeAltered = warnrec.getStartTime()
|
entry.timeAltered = warnrec.getStartTime()
|
||||||
.getTime();
|
.getTime();
|
||||||
// prevents the original entry and the modified
|
|
||||||
// entry to be displayed in the same frame
|
|
||||||
entry.frameAltered = frames[info
|
|
||||||
.getFrameIndex()].getRefTime();
|
|
||||||
|
|
||||||
// if cancellation, set end time to start time
|
|
||||||
// of this action
|
|
||||||
|
|
||||||
// DR14992: fix the problem with plotting
|
// DR14992: fix the problem with plotting
|
||||||
// expiration time for
|
// expiration time for NEW warning when CAN
|
||||||
// NEW warning when CAN warning is issued
|
// warning is issued
|
||||||
if (act == WarningAction.CAN
|
if (act == WarningAction.CAN) {
|
||||||
&& WarningAction.valueOf(entry.record
|
if (!rec.getCountyheader().equals(
|
||||||
.getAct()) == WarningAction.CAN) {
|
warnrec.getCountyheader())) {
|
||||||
entry.record.setEndTime((Calendar) warnrec
|
entry.partialCancel = true;
|
||||||
.getStartTime().clone());
|
} else {
|
||||||
}
|
// complete cancellation
|
||||||
|
createShape = warnrec;
|
||||||
if (!rec.getCountyheader().equals(
|
}
|
||||||
warnrec.getCountyheader())
|
|
||||||
&& act == WarningAction.CAN) {
|
|
||||||
entry.partialCancel = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if it's a con, need to have a new entry for a
|
// if it's a con, need to have a new entry for a
|
||||||
|
|
BIN
deltaScripts/13.4.1/.removeHdffileidColumn.sh.swp
Normal file
BIN
deltaScripts/13.4.1/.removeHdffileidColumn.sh.swp
Normal file
Binary file not shown.
34
edexOsgi/build.edex/esb/data/utility/edex_static/base/smartinit/DGEX.py
Executable file → Normal file
34
edexOsgi/build.edex/esb/data/utility/edex_static/base/smartinit/DGEX.py
Executable file → Normal file
|
@ -237,7 +237,7 @@ class DGEXForecaster(Forecaster):
|
||||||
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
||||||
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
||||||
wind_BL3060, wind_BL6090, wind_BL90120, wind_BL120150, wind_BL150180,
|
wind_BL3060, wind_BL6090, wind_BL90120, wind_BL120150, wind_BL150180,
|
||||||
p_SFC, PoP, T, RH, sli_MB1000500, stopo, topo, gh_c, t_c, rh_c, wind_c,
|
p_SFC, PoP, T, RH, sli_MB0500, stopo, topo, gh_c, t_c, rh_c, wind_c,
|
||||||
ctime):
|
ctime):
|
||||||
self.setupBLCube(t_FHAG2, t_BL030, t_BL3060, t_BL6090, t_BL90120,
|
self.setupBLCube(t_FHAG2, t_BL030, t_BL3060, t_BL6090, t_BL90120,
|
||||||
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
||||||
|
@ -374,17 +374,17 @@ class DGEXForecaster(Forecaster):
|
||||||
#
|
#
|
||||||
# Where LI<2, make showers
|
# Where LI<2, make showers
|
||||||
#
|
#
|
||||||
sli_MB1000500=where(less(sli_MB1000500,-18.0),10.0,sli_MB1000500)
|
sli_MB0500=where(less(sli_MB0500,-18.0),10.0,sli_MB0500)
|
||||||
|
|
||||||
convecMask = less(sli_MB1000500, 2)
|
convecMask = less(sli_MB0500, 2)
|
||||||
wx=where(convecMask,wx+6,wx)
|
wx=where(convecMask,wx+6,wx)
|
||||||
#
|
#
|
||||||
# off the DGEX gridpoints need no weather
|
# off the DGEX gridpoints need no weather
|
||||||
#
|
#
|
||||||
wxgrid = zeros(self._empty.shape, dtype = byte)
|
wxgrid = zeros(self._empty.shape, dtype = byte)
|
||||||
keys = ['<NoCov>:<NoWx>:<NoInten>:<NoVis>:', ]
|
keys = ['<NoCov>:<NoWx>:<NoInten>:<NoVis>:', ]
|
||||||
# wxgrid=where(less(sli_MB1000500,-18.0),0,wxgrid)
|
# wxgrid=where(less(sli_MB0500,-18.0),0,wxgrid)
|
||||||
wxgrid[less(sli_MB1000500, -18.0)] = 0
|
wxgrid[less(sli_MB0500, -18.0)] = 0
|
||||||
#
|
#
|
||||||
# Match PoP, and remove non-occurring wx
|
# Match PoP, and remove non-occurring wx
|
||||||
#
|
#
|
||||||
|
@ -439,13 +439,13 @@ class DGEXForecaster(Forecaster):
|
||||||
# the instability. SChc for LI <-1, Chc for LI<-3,
|
# the instability. SChc for LI <-1, Chc for LI<-3,
|
||||||
# Lkly for LI<-5, Def for LI<-8
|
# Lkly for LI<-5, Def for LI<-8
|
||||||
#
|
#
|
||||||
thunder = where(less_equal(sli_MB1000500, -1), 1, 0)
|
thunder = where(less_equal(sli_MB0500, -1), 1, 0)
|
||||||
# thunder=where(less_equal(sli_MB1000500,-3),2,thunder)
|
# thunder=where(less_equal(sli_MB0500,-3),2,thunder)
|
||||||
# thunder=where(less_equal(sli_MB1000500,-5),3,thunder)
|
# thunder=where(less_equal(sli_MB0500,-5),3,thunder)
|
||||||
# thunder=where(less_equal(sli_MB1000500,-8),4,thunder)
|
# thunder=where(less_equal(sli_MB0500,-8),4,thunder)
|
||||||
thunder[less_equal(sli_MB1000500, -3)] = 2
|
thunder[less_equal(sli_MB0500, -3)] = 2
|
||||||
thunder[less_equal(sli_MB1000500, -5)] = 3
|
thunder[less_equal(sli_MB0500, -5)] = 3
|
||||||
thunder[less_equal(sli_MB1000500, -8)] = 4
|
thunder[less_equal(sli_MB0500, -8)] = 4
|
||||||
|
|
||||||
tprobs = ["None", "SChc", "Chc", "Lkly", "Def"]
|
tprobs = ["None", "SChc", "Chc", "Lkly", "Def"]
|
||||||
for ith in range(1, 5):
|
for ith in range(1, 5):
|
||||||
|
@ -992,7 +992,7 @@ class DGEXForecaster(Forecaster):
|
||||||
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
||||||
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
||||||
wind_BL3060, wind_BL6090, wind_BL90120, wind_BL120150, wind_BL150180,
|
wind_BL3060, wind_BL6090, wind_BL90120, wind_BL120150, wind_BL150180,
|
||||||
p_SFC, sli_MB1000500, tp_SFC, stopo, topo, gh_c, t_c, rh_c, wind_c, ctime):
|
p_SFC, sli_MB0500, tp_SFC, stopo, topo, gh_c, t_c, rh_c, wind_c, ctime):
|
||||||
self.setupBLCube(t_FHAG2, t_BL030, t_BL3060, t_BL6090, t_BL90120,
|
self.setupBLCube(t_FHAG2, t_BL030, t_BL3060, t_BL6090, t_BL90120,
|
||||||
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
||||||
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
||||||
|
@ -1004,9 +1004,9 @@ class DGEXForecaster(Forecaster):
|
||||||
# only thing we have is boundary layer lifted index
|
# only thing we have is boundary layer lifted index
|
||||||
# set LAL to 2 if LI<0, 3 if LI<-3, 4 if LI<-5
|
# set LAL to 2 if LI<0, 3 if LI<-3, 4 if LI<-5
|
||||||
#
|
#
|
||||||
lal=where(less(sli_MB1000500, 0), lal+1, lal)
|
lal=where(less(sli_MB0500, 0), lal+1, lal)
|
||||||
lal=where(less(sli_MB1000500, -3), lal+1, lal)
|
lal=where(less(sli_MB0500, -3), lal+1, lal)
|
||||||
lal=where(less(sli_MB1000500, -5), lal+1, lal)
|
lal=where(less(sli_MB0500, -5), lal+1, lal)
|
||||||
#
|
#
|
||||||
# Add more when RH at top of BL is greater than
|
# Add more when RH at top of BL is greater than
|
||||||
# than 70% and RH at bottom of BL is less than 30
|
# than 70% and RH at bottom of BL is less than 30
|
||||||
|
@ -1019,7 +1019,7 @@ class DGEXForecaster(Forecaster):
|
||||||
#
|
#
|
||||||
V = logical_and(greater(BLR[5], 80), less(BLR[0], 20))
|
V = logical_and(greater(BLR[5], 80), less(BLR[0], 20))
|
||||||
lal=where(V,lal+1,lal)
|
lal=where(V,lal+1,lal)
|
||||||
lal=where(less(sli_MB1000500,-18.0),1,lal)
|
lal=where(less(sli_MB0500,-18.0),1,lal)
|
||||||
return lal
|
return lal
|
||||||
|
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|
|
@ -421,12 +421,13 @@ public class D2DGridDatabase extends VGridDatabase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String d2dParmName = getD2DParmName(atts.getShort_name());
|
String gfeParmName = atts.getShort_name();
|
||||||
|
String d2dParmName = getD2DParmName(gfeParmName);
|
||||||
|
|
||||||
D2DParm d2dParm = new D2DParm(pid, gpi, possibleInventorySlots,
|
D2DParm d2dParm = new D2DParm(pid, gpi, possibleInventorySlots,
|
||||||
d2dParmName);
|
d2dParmName);
|
||||||
this.gfeParms.put(pid, d2dParm);
|
this.gfeParms.put(pid, d2dParm);
|
||||||
this.d2dParms.put(compositeName(atts.getShort_name(), level), d2dParm);
|
this.d2dParms.put(compositeName(gfeParmName, level), d2dParm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -464,14 +465,17 @@ public class D2DGridDatabase extends VGridDatabase {
|
||||||
availableTimes.get(i));
|
availableTimes.get(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
String uD2dParmName = getD2DParmName(uatts.getShort_name());
|
String uGfeParmName = uatts.getShort_name();
|
||||||
String vD2dParmName = getD2DParmName(vatts.getShort_name());
|
String uD2dParmName = getD2DParmName(uGfeParmName);
|
||||||
|
|
||||||
|
String vGfeParmName = vatts.getShort_name();
|
||||||
|
String vD2dParmName = getD2DParmName(vGfeParmName);
|
||||||
|
|
||||||
D2DParm d2dParm = new D2DParm(pid, gpi, possibleInventorySlots,
|
D2DParm d2dParm = new D2DParm(pid, gpi, possibleInventorySlots,
|
||||||
uD2dParmName, vD2dParmName);
|
uD2dParmName, vD2dParmName);
|
||||||
this.gfeParms.put(pid, d2dParm);
|
this.gfeParms.put(pid, d2dParm);
|
||||||
this.d2dParms.put(compositeName(uatts.getShort_name(), level), d2dParm);
|
this.d2dParms.put(compositeName(uGfeParmName, level), d2dParm);
|
||||||
this.d2dParms.put(compositeName(vatts.getShort_name(), level), d2dParm);
|
this.d2dParms.put(compositeName(vGfeParmName, level), d2dParm);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -187,7 +187,7 @@ public class GfeIngestNotificationFilter {
|
||||||
String otherComponent = null;
|
String otherComponent = null;
|
||||||
String[] components = parm.getComponents();
|
String[] components = parm.getComponents();
|
||||||
if (components.length > 1) {
|
if (components.length > 1) {
|
||||||
if (components[0].equals(gfeParamName)) {
|
if (components[0].equals(d2dParamName)) {
|
||||||
otherComponent = components[1];
|
otherComponent = components[1];
|
||||||
} else {
|
} else {
|
||||||
otherComponent = components[0];
|
otherComponent = components[0];
|
||||||
|
@ -207,7 +207,7 @@ public class GfeIngestNotificationFilter {
|
||||||
if (otherTimes == null
|
if (otherTimes == null
|
||||||
|| !otherTimes.remove(fcstHour)) {
|
|| !otherTimes.remove(fcstHour)) {
|
||||||
// need to wait for other component
|
// need to wait for other component
|
||||||
ParmID compPid = new ParmID(gfeParamName,
|
ParmID compPid = new ParmID(d2dParamName,
|
||||||
parmID.getDbId(), parmID.getParmLevel());
|
parmID.getDbId(), parmID.getParmLevel());
|
||||||
Set<Integer> times = windComps.get(compPid);
|
Set<Integer> times = windComps.get(compPid);
|
||||||
if (times == null) {
|
if (times == null) {
|
||||||
|
|
|
@ -249,13 +249,13 @@
|
||||||
<Level key="FHAG4000">
|
<Level key="FHAG4000">
|
||||||
<DatabaseLevel levelName="FHAG" levelOneValue="4000.0" unit="m"/>
|
<DatabaseLevel levelName="FHAG" levelOneValue="4000.0" unit="m"/>
|
||||||
</Level>
|
</Level>
|
||||||
<Level key="FHAG030">
|
<Level key="FHAG01000">
|
||||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="30.0" unit="m"/>
|
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="1000.0" unit="m"/>
|
||||||
</Level>
|
</Level>
|
||||||
<Level key="FHAG3000">
|
<Level key="FHAG03000">
|
||||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="3000.0" unit="m"/>
|
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="3000.0" unit="m"/>
|
||||||
</Level>
|
</Level>
|
||||||
<Level key="FHAG6000">
|
<Level key="FHAG06000">
|
||||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="6000.0" unit="m"/>
|
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="6000.0" unit="m"/>
|
||||||
</Level>
|
</Level>
|
||||||
<Level key="FRZ">
|
<Level key="FRZ">
|
||||||
|
@ -399,9 +399,6 @@
|
||||||
<Level key="MB1100">
|
<Level key="MB1100">
|
||||||
<DatabaseLevel levelName="MB" levelOneValue="1100.0" unit="hPa"/>
|
<DatabaseLevel levelName="MB" levelOneValue="1100.0" unit="hPa"/>
|
||||||
</Level>
|
</Level>
|
||||||
<Level key="MB50100">
|
|
||||||
<DatabaseLevel levelName="MB" levelOneValue="1000.0" levelTwoValue="500.0" unit="hPa"/>
|
|
||||||
</Level>
|
|
||||||
<Level key="MB0500">
|
<Level key="MB0500">
|
||||||
<DatabaseLevel levelName="MB" levelOneValue="1000.0" levelTwoValue="500.0" unit="hPa"/>
|
<DatabaseLevel levelName="MB" levelOneValue="1000.0" levelTwoValue="500.0" unit="hPa"/>
|
||||||
</Level>
|
</Level>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -417,7 +417,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -592,7 +592,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 6000</levelsDesc>
|
<levelsDesc>FHAG 6000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG6000</level>
|
<level>FHAG06000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
REVISION HISTORY
|
||||||
|
|
||||||
|
Date Ticket# Engineer Description
|
||||||
|
04/17/2013 #1913 randerso Corrected heli level
|
||||||
|
-->
|
||||||
<gridParamInfo xmlns:ns2="group">
|
<gridParamInfo xmlns:ns2="group">
|
||||||
<valtimeMINUSreftime>
|
<valtimeMINUSreftime>
|
||||||
<fcst>0</fcst>
|
<fcst>0</fcst>
|
||||||
|
@ -154,9 +160,9 @@
|
||||||
<valid_range>1000.0</valid_range>
|
<valid_range>1000.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG030</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
REVISION HISTORY
|
||||||
|
|
||||||
|
Date Ticket# Engineer Description
|
||||||
|
04/17/2013 #1913 randerso Corrected heli level
|
||||||
|
-->
|
||||||
<gridParamInfo xmlns:ns2="group">
|
<gridParamInfo xmlns:ns2="group">
|
||||||
<valtimeMINUSreftime>
|
<valtimeMINUSreftime>
|
||||||
<fcst>0</fcst>
|
<fcst>0</fcst>
|
||||||
|
@ -154,9 +160,9 @@
|
||||||
<valid_range>1000.0</valid_range>
|
<valid_range>1000.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG030</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
|
|
@ -58,7 +58,7 @@
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 3000</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG3000</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
REVISION HISTORY
|
||||||
|
|
||||||
|
Date Ticket# Engineer Description
|
||||||
|
04/17/2013 #1913 randerso Corrected heli level
|
||||||
|
-->
|
||||||
<gridParamInfo xmlns:ns2="group">
|
<gridParamInfo xmlns:ns2="group">
|
||||||
<valtimeMINUSreftime>
|
<valtimeMINUSreftime>
|
||||||
<fcst>0</fcst>
|
<fcst>0</fcst>
|
||||||
|
@ -56,9 +62,9 @@
|
||||||
<valid_range>1000.0</valid_range>
|
<valid_range>1000.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG030</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
|
|
@ -1,4 +1,10 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
REVISION HISTORY
|
||||||
|
|
||||||
|
Date Ticket# Engineer Description
|
||||||
|
04/17/2013 #1913 randerso Corrected heli level
|
||||||
|
-->
|
||||||
<gridParamInfo xmlns:ns2="group">
|
<gridParamInfo xmlns:ns2="group">
|
||||||
<valtimeMINUSreftime>
|
<valtimeMINUSreftime>
|
||||||
<fcst>0</fcst>
|
<fcst>0</fcst>
|
||||||
|
@ -138,9 +144,9 @@
|
||||||
<valid_range>1000.0</valid_range>
|
<valid_range>1000.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
<levelsDesc>FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>FHAG030</level>
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
@ -363,9 +369,9 @@
|
||||||
<valid_range>20.0</valid_range>
|
<valid_range>20.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>MB 50>100</levelsDesc>
|
<levelsDesc>MB 0>500</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>MB50100</level>
|
<level>MB0500</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
</gridParamInfo>
|
</gridParamInfo>
|
||||||
|
|
|
@ -49,9 +49,10 @@
|
||||||
<valid_range>1000.0</valid_range>
|
<valid_range>1000.0</valid_range>
|
||||||
<fillValue>-99999.0</fillValue>
|
<fillValue>-99999.0</fillValue>
|
||||||
<n3D>0</n3D>
|
<n3D>0</n3D>
|
||||||
<levelsDesc>SFC</levelsDesc>
|
<levelsDesc>FHAG 1000 FHAG 3000</levelsDesc>
|
||||||
<levels>
|
<levels>
|
||||||
<level>SFC</level>
|
<level>FHAG01000</level>
|
||||||
|
<level>FHAG03000</level>
|
||||||
</levels>
|
</levels>
|
||||||
</gridParameterInfo>
|
</gridParameterInfo>
|
||||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||||
|
|
|
@ -22,6 +22,7 @@ import com.raytheon.uf.common.dataquery.requests.RequestableMetadataMarshaller;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Mar 29, 2012 #14691 Qinglu Lin Added feAreaField and its getter and setter, etc.
|
* Mar 29, 2012 #14691 Qinglu Lin Added feAreaField and its getter and setter, etc.
|
||||||
|
* Apr 24, 2014 1943 jsanchez Removed unused areaType.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -39,13 +40,6 @@ public class AreaSourceConfiguration {
|
||||||
@XmlElement
|
@XmlElement
|
||||||
private AreaType type = AreaType.HATCHING;
|
private AreaType type = AreaType.HATCHING;
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO This is for 12.9 to be backwards compatible. This will be removed in
|
|
||||||
* 12.10
|
|
||||||
*/
|
|
||||||
@XmlElement
|
|
||||||
private AreaType areaType;
|
|
||||||
|
|
||||||
@XmlAttribute
|
@XmlAttribute
|
||||||
private String variable;
|
private String variable;
|
||||||
|
|
||||||
|
@ -277,12 +271,4 @@ public class AreaSourceConfiguration {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AreaType getAreaType() {
|
|
||||||
return areaType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAreaType(AreaType areaType) {
|
|
||||||
this.areaType = areaType;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
* Nov 21, 2007 chammack Initial Creation.
|
* Nov 21, 2007 chammack Initial Creation.
|
||||||
* Aug 26, 2008 #1502 bclement Added JAXB annotations
|
* Aug 26, 2008 #1502 bclement Added JAXB annotations
|
||||||
* May 26, 2010 #4649 Qinglu Lin Made including TO.A and SV.A mandatory
|
* May 26, 2010 #4649 Qinglu Lin Made including TO.A and SV.A mandatory
|
||||||
|
* Apr 24, 2013 1943 jsanchez Marked areaConfig as Deprecated.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -83,6 +84,7 @@ public class WarngenConfiguration implements ISerializableObject {
|
||||||
private AreaSourceConfiguration hatchedAreaSource;
|
private AreaSourceConfiguration hatchedAreaSource;
|
||||||
|
|
||||||
@XmlElement
|
@XmlElement
|
||||||
|
@Deprecated
|
||||||
private AreaConfiguration areaConfig;
|
private AreaConfiguration areaConfig;
|
||||||
|
|
||||||
@XmlElementWrapper(name = "bulletActionGroups")
|
@XmlElementWrapper(name = "bulletActionGroups")
|
||||||
|
@ -201,8 +203,8 @@ public class WarngenConfiguration implements ISerializableObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO This section is for 12.9 to be backwards compatible with old
|
// AreaConfiguration is deprecated. This is only meant for backwards
|
||||||
// configuration files. 12.10 will drop the use of 'areaConfig'.
|
// compatibility while areaConfig is phased out with updated templates from the template team.
|
||||||
if (config.getAreaConfig() != null) {
|
if (config.getAreaConfig() != null) {
|
||||||
ArrayList<AreaSourceConfiguration> areaSources = null;
|
ArrayList<AreaSourceConfiguration> areaSources = null;
|
||||||
|
|
||||||
|
@ -217,18 +219,12 @@ public class WarngenConfiguration implements ISerializableObject {
|
||||||
config.setAreaSources(areaSources
|
config.setAreaSources(areaSources
|
||||||
.toArray(new AreaSourceConfiguration[areaSources.size()]));
|
.toArray(new AreaSourceConfiguration[areaSources.size()]));
|
||||||
}
|
}
|
||||||
// 12.9 section end
|
|
||||||
|
|
||||||
for (AreaSourceConfiguration asc : config.getAreaSources()) {
|
for (AreaSourceConfiguration asc : config.getAreaSources()) {
|
||||||
if (asc.getAreaSource() == null) {
|
if (asc.getAreaSource() == null) {
|
||||||
asc.setAreaSource(config.getGeospatialConfig().getAreaSource());
|
asc.setAreaSource(config.getGeospatialConfig().getAreaSource());
|
||||||
}
|
}
|
||||||
|
|
||||||
// 12.9. 12.10 get rid of 'areaType'
|
|
||||||
if (asc.getAreaType() != null) {
|
|
||||||
asc.setType(asc.getAreaType());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (asc.getType() == AreaType.HATCHING) {
|
if (asc.getType() == AreaType.HATCHING) {
|
||||||
config.setHatchedAreaSource(asc);
|
config.setHatchedAreaSource(asc);
|
||||||
}
|
}
|
||||||
|
@ -252,8 +248,12 @@ public class WarngenConfiguration implements ISerializableObject {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* This method is depreciated. Please use AreaSourceConfiguration. The type
|
||||||
|
* AreaType.HATCHING will determine which area source is for hatching.
|
||||||
|
*
|
||||||
* @return the areaConfig
|
* @return the areaConfig
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public AreaConfiguration getAreaConfig() {
|
public AreaConfiguration getAreaConfig() {
|
||||||
return areaConfig;
|
return areaConfig;
|
||||||
}
|
}
|
||||||
|
@ -262,6 +262,7 @@ public class WarngenConfiguration implements ISerializableObject {
|
||||||
* @param areaConfig
|
* @param areaConfig
|
||||||
* the areaConfig to set
|
* the areaConfig to set
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setAreaConfig(AreaConfiguration areaConfig) {
|
public void setAreaConfig(AreaConfiguration areaConfig) {
|
||||||
this.areaConfig = areaConfig;
|
this.areaConfig = areaConfig;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.awt.Point;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
|
||||||
|
|
||||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
|
@ -39,6 +40,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Jul 27, 2009 chammack Initial creation
|
* Jul 27, 2009 chammack Initial creation
|
||||||
|
* Jun 18, 2013 DR 15662 dhuffman Cross section terrain disappears if baseline is too short.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -91,9 +93,26 @@ public class Request implements ISerializableObject {
|
||||||
Request request = new Request();
|
Request request = new Request();
|
||||||
request.type = Type.POINT;
|
request.type = Type.POINT;
|
||||||
request.points = new LinkedHashSet<Point>(Arrays.asList(points))
|
request.points = new LinkedHashSet<Point>(Arrays.asList(points))
|
||||||
.toArray(new Point[points.length]);
|
.toArray(new Point[points.length]);
|
||||||
|
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build a request that asks for specific cross points to be returned
|
||||||
|
*
|
||||||
|
* @param points
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public static Request buildXsectPointRequest(Point... points) {
|
||||||
|
Request request = new Request();
|
||||||
|
request.type = Type.POINT;
|
||||||
|
request.points = new Point[points.length];
|
||||||
|
for(int x=0; x<points.length; x++)
|
||||||
|
request.points[x] = new Point(points[x]);
|
||||||
|
|
||||||
|
return request;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build a request that asks for all x values at a provided set of y values.
|
* Build a request that asks for all x values at a provided set of y values.
|
||||||
|
|
|
@ -51,7 +51,6 @@ import com.raytheon.uf.common.status.IUFStatusHandler;
|
||||||
import com.raytheon.uf.common.status.UFStatus;
|
import com.raytheon.uf.common.status.UFStatus;
|
||||||
import com.raytheon.uf.common.status.UFStatus.Priority;
|
import com.raytheon.uf.common.status.UFStatus.Priority;
|
||||||
import com.raytheon.uf.common.util.FileUtil;
|
import com.raytheon.uf.common.util.FileUtil;
|
||||||
import com.raytheon.uf.edex.core.props.PropertiesFactory;
|
|
||||||
import com.raytheon.uf.edex.dat.utils.FreezingLevel;
|
import com.raytheon.uf.edex.dat.utils.FreezingLevel;
|
||||||
import com.vividsolutions.jts.geom.Coordinate;
|
import com.vividsolutions.jts.geom.Coordinate;
|
||||||
|
|
||||||
|
@ -65,6 +64,8 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* Nov 19, 2011 dhladky Initial Creation.
|
* Nov 19, 2011 dhladky Initial Creation.
|
||||||
* Oct 09, 2012 15168 wkwock Fix incorrect values.
|
* Oct 09, 2012 15168 wkwock Fix incorrect values.
|
||||||
* Jan 10, 2013 1448 bgonzale Made methods that are used internally private.
|
* Jan 10, 2013 1448 bgonzale Made methods that are used internally private.
|
||||||
|
* Apr 17, 2013 15914 snaples Updated constructor to check for and
|
||||||
|
* create stationFilePath directory if not found.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -96,6 +97,15 @@ public class MpeRUCFreezingLevel {
|
||||||
public static String[] models = new String[] { "RUC236" };
|
public static String[] models = new String[] { "RUC236" };
|
||||||
|
|
||||||
public MpeRUCFreezingLevel() {
|
public MpeRUCFreezingLevel() {
|
||||||
|
// DR 15914
|
||||||
|
// make sure directory exists, if not make directory before
|
||||||
|
// opening file.
|
||||||
|
File pn = new File(stationFilePath);
|
||||||
|
if (pn.exists() == false) {
|
||||||
|
pn.mkdir();
|
||||||
|
}
|
||||||
|
pn = null;
|
||||||
|
|
||||||
this.stationFile = new File(stationFilePath+"/"+mpeSiteId+"_freezing_station_list");
|
this.stationFile = new File(stationFilePath+"/"+mpeSiteId+"_freezing_station_list");
|
||||||
|
|
||||||
// correct env vairiable dqcPreprocessorBasetime if needed. Default to 12z
|
// correct env vairiable dqcPreprocessorBasetime if needed. Default to 12z
|
||||||
|
|
|
@ -97,6 +97,7 @@ import com.vividsolutions.jts.geom.Polygon;
|
||||||
* 10/25/12 DR 15514 G. Zhang Fix ConcurrentModificationException
|
* 10/25/12 DR 15514 G. Zhang Fix ConcurrentModificationException
|
||||||
* 02/01/13 1569 D. Hladky Added constants
|
* 02/01/13 1569 D. Hladky Added constants
|
||||||
* 02/25/13 1660 D. Hladky FFTI design change to help mosaic processing.
|
* 02/25/13 1660 D. Hladky FFTI design change to help mosaic processing.
|
||||||
|
* 05/01/2013 15684 zhao Unlock when Exception caught
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* @author dhladky
|
* @author dhladky
|
||||||
|
@ -363,13 +364,23 @@ public class FFMPProcessor {
|
||||||
.getRawGeometries(dataKey,
|
.getRawGeometries(dataKey,
|
||||||
domain.getCwa());
|
domain.getCwa());
|
||||||
}
|
}
|
||||||
|
//DR15684
|
||||||
sbl = (new RadarSBLGenerator(config)
|
try {
|
||||||
.generate(sourceId,
|
sbl = (new RadarSBLGenerator(config)
|
||||||
map.keySet(),
|
.generate(sourceId,
|
||||||
cwaGeometries, radarRec));
|
map.keySet(),
|
||||||
generator.setSourceBinList(sbl);
|
cwaGeometries, radarRec));
|
||||||
isSBL = true;
|
} catch (Exception e) {
|
||||||
|
statusHandler.handle(Priority.WARN, "caught an Exception while generating Source Bin List");
|
||||||
|
e.printStackTrace();
|
||||||
|
if (!checkLockStatus()) {
|
||||||
|
ClusterLockUtils.unlock(sourceBinTaskName, sourceId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sbl != null) {
|
||||||
|
generator.setSourceBinList(sbl);
|
||||||
|
isSBL = true;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -65,6 +65,7 @@ import com.vividsolutions.jts.geom.GeometryFactory;
|
||||||
import com.vividsolutions.jts.geom.LinearRing;
|
import com.vividsolutions.jts.geom.LinearRing;
|
||||||
import com.vividsolutions.jts.geom.Point;
|
import com.vividsolutions.jts.geom.Point;
|
||||||
import com.vividsolutions.jts.geom.Polygon;
|
import com.vividsolutions.jts.geom.Polygon;
|
||||||
|
import com.vividsolutions.jts.geom.TopologyException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a SourceBinList for given radar and set of basins.
|
* Creates a SourceBinList for given radar and set of basins.
|
||||||
|
@ -75,6 +76,7 @@ import com.vividsolutions.jts.geom.Polygon;
|
||||||
* Date Ticket# Engineer Description
|
* Date Ticket# Engineer Description
|
||||||
* ------------ ---------- ----------- --------------------------
|
* ------------ ---------- ----------- --------------------------
|
||||||
* Sep 6, 2011 10593 dfriedma Initial creation
|
* Sep 6, 2011 10593 dfriedma Initial creation
|
||||||
|
* May 1, 2013 15684 zhao Add code to handle possible TopologyException
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -227,7 +229,15 @@ public class RadarSBLGenerator {
|
||||||
if (i >= 0 && i < searchGridLen && j >= 0 && j < searchGridLen) {
|
if (i >= 0 && i < searchGridLen && j >= 0 && j < searchGridLen) {
|
||||||
for (Long pfaf : searchGrid[j * searchGridLen + i]) {
|
for (Long pfaf : searchGrid[j * searchGridLen + i]) {
|
||||||
Geometry geom = xformedBasinMap.get(pfaf);
|
Geometry geom = xformedBasinMap.get(pfaf);
|
||||||
if (geom.contains(p)) {
|
//DR15684
|
||||||
|
boolean geomContainsPointP = false;
|
||||||
|
try {
|
||||||
|
geomContainsPointP = geom.contains(p);
|
||||||
|
} catch (TopologyException e) {
|
||||||
|
logger.warn(String.format("RadarSBLGenerator: caught a TopologyException: %s", e.getMessage()));
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
if (geomContainsPointP) {
|
||||||
//lastPfaf = pfaf;
|
//lastPfaf = pfaf;
|
||||||
lastBasinGeometry = geom;
|
lastBasinGeometry = geom;
|
||||||
lastSBEL = sbeMap.get(pfaf);
|
lastSBEL = sbeMap.get(pfaf);
|
||||||
|
|
|
@ -89,6 +89,7 @@ import com.vividsolutions.jts.geom.Coordinate;
|
||||||
* 03/09/2012 DR 14581 D. Friedman Fix grid referencing and use custom
|
* 03/09/2012 DR 14581 D. Friedman Fix grid referencing and use custom
|
||||||
* nearest-neighbor resampling.i
|
* nearest-neighbor resampling.i
|
||||||
* 01/14/2013 #1469 bkowal Removed the hdf5 data directory.
|
* 01/14/2013 #1469 bkowal Removed the hdf5 data directory.
|
||||||
|
* 04/18/2013 DR 15662 dhuffman Cross section terrain disappears if baseline is too short.
|
||||||
*
|
*
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
|
@ -313,7 +314,7 @@ public class TopoQuery implements ITopoQuery {
|
||||||
index += 2;
|
index += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Request request = Request.buildPointRequest(points);
|
Request request = Request.buildXsectPointRequest(points);
|
||||||
ShortDataRecord record = (ShortDataRecord) dataStore.retrieve("/",
|
ShortDataRecord record = (ShortDataRecord) dataStore.retrieve("/",
|
||||||
"full", request);
|
"full", request);
|
||||||
short[] data = record.getShortData();
|
short[] data = record.getShortData();
|
||||||
|
|
|
@ -8,9 +8,9 @@
|
||||||
# Authors: Virgil Middendorf (BYZ), Steve Sigler (MSO) #
|
# Authors: Virgil Middendorf (BYZ), Steve Sigler (MSO) #
|
||||||
# Contributers: Ahmad Garabi, Ken Sargeant, Dave Pike, Dave Rosenberg, #
|
# Contributers: Ahmad Garabi, Ken Sargeant, Dave Pike, Dave Rosenberg, #
|
||||||
# Tim Barker, Maureen Ballard, Jay Smith, Dave Tomalak, #
|
# Tim Barker, Maureen Ballard, Jay Smith, Dave Tomalak, #
|
||||||
# Evelyn Bersack, Juliya Dynina #
|
# Evelyn Bersack, Juliya Dynina, Jianning Zeng #
|
||||||
# #
|
# #
|
||||||
# Date of last revision: 11/02/12 #
|
# Date of last revision: 04/22/13 #
|
||||||
# #
|
# #
|
||||||
# Script description: This script can create a netcdf file containing IFPS #
|
# Script description: This script can create a netcdf file containing IFPS #
|
||||||
# grids, quality control the netcdf file, send the file to a local rsync #
|
# grids, quality control the netcdf file, send the file to a local rsync #
|
||||||
|
@ -142,6 +142,7 @@
|
||||||
# the hard-coded path to /awips2/fxa/bin with $FXA_BIN. Removed #
|
# the hard-coded path to /awips2/fxa/bin with $FXA_BIN. Removed #
|
||||||
# awips1 code. #
|
# awips1 code. #
|
||||||
# 11/02/12: Restored error checking for AWIPS2. #
|
# 11/02/12: Restored error checking for AWIPS2. #
|
||||||
|
# 04/22/13: Update the permission of the log directories. #
|
||||||
################################################################################
|
################################################################################
|
||||||
# check to see if site id was passed as argument
|
# check to see if site id was passed as argument
|
||||||
# if not then exit from the script
|
# if not then exit from the script
|
||||||
|
@ -176,6 +177,11 @@ currdate=$(date -u +%Y%m%d)
|
||||||
export LOG_FILE="${DXwrkDir}/log/${currdate}/netcdf_rsync.log"
|
export LOG_FILE="${DXwrkDir}/log/${currdate}/netcdf_rsync.log"
|
||||||
|
|
||||||
# check to see if log directory structure exists.
|
# check to see if log directory structure exists.
|
||||||
|
if [ ! -d ${DXwrkDir}/log ] ;then
|
||||||
|
mkdir -p ${DXwrkDir}/log
|
||||||
|
chmod 777 ${DXwrkDir}/log
|
||||||
|
chown awips:fxalpha ${DXwrkDir}/log
|
||||||
|
fi
|
||||||
if [ ! -d ${DXwrkDir}/log/${currdate} ] ;then
|
if [ ! -d ${DXwrkDir}/log/${currdate} ] ;then
|
||||||
mkdir -p ${DXwrkDir}/log/${currdate}
|
mkdir -p ${DXwrkDir}/log/${currdate}
|
||||||
chmod 777 ${DXwrkDir}/log/${currdate}
|
chmod 777 ${DXwrkDir}/log/${currdate}
|
||||||
|
|
|
@ -0,0 +1,921 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999-2000 Image Power, Inc. and the University of
|
||||||
|
* British Columbia.
|
||||||
|
* Copyright (c) 2001-2002 Michael David Adams.
|
||||||
|
* All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* __START_OF_JASPER_LICENSE__
|
||||||
|
*
|
||||||
|
* JasPer License Version 2.0
|
||||||
|
*
|
||||||
|
* Copyright (c) 2001-2006 Michael David Adams
|
||||||
|
* Copyright (c) 1999-2000 Image Power, Inc.
|
||||||
|
* Copyright (c) 1999-2000 The University of British Columbia
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person (the
|
||||||
|
* "User") obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without restriction,
|
||||||
|
* including without limitation the rights to use, copy, modify, merge,
|
||||||
|
* publish, distribute, and/or sell copies of the Software, and to permit
|
||||||
|
* persons to whom the Software is furnished to do so, subject to the
|
||||||
|
* following conditions:
|
||||||
|
*
|
||||||
|
* 1. The above copyright notices and this permission notice (which
|
||||||
|
* includes the disclaimer below) shall be included in all copies or
|
||||||
|
* substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* 2. The name of a copyright holder shall not be used to endorse or
|
||||||
|
* promote products derived from the Software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
|
||||||
|
* LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
|
||||||
|
* THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
|
||||||
|
* "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||||
|
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
|
||||||
|
* INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
|
||||||
|
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE
|
||||||
|
* PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
|
||||||
|
* THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
|
||||||
|
* EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
|
||||||
|
* BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
|
||||||
|
* PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS
|
||||||
|
* GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
|
||||||
|
* ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE
|
||||||
|
* IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
|
||||||
|
* SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
|
||||||
|
* AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
|
||||||
|
* SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
|
||||||
|
* THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
|
||||||
|
* PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
|
||||||
|
* RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
|
||||||
|
*
|
||||||
|
* __END_OF_JASPER_LICENSE__
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JP2 Library
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Includes.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "jasper/jas_stream.h"
|
||||||
|
#include "jasper/jas_malloc.h"
|
||||||
|
#include "jasper/jas_debug.h"
|
||||||
|
|
||||||
|
#include "jp2_cod.h"
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Function prototypes.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
#define ONES(n) ((1 << (n)) - 1)
|
||||||
|
|
||||||
|
jp2_boxinfo_t *jp2_boxinfolookup(int type);
|
||||||
|
|
||||||
|
static int jp2_getuint8(jas_stream_t *in, uint_fast8_t *val);
|
||||||
|
static int jp2_getuint16(jas_stream_t *in, uint_fast16_t *val);
|
||||||
|
static int jp2_getuint32(jas_stream_t *in, uint_fast32_t *val);
|
||||||
|
static int jp2_getuint64(jas_stream_t *in, uint_fast64_t *val);
|
||||||
|
static int jp2_putuint8(jas_stream_t *out, uint_fast8_t val);
|
||||||
|
static int jp2_putuint16(jas_stream_t *out, uint_fast16_t val);
|
||||||
|
static int jp2_putuint32(jas_stream_t *out, uint_fast32_t val);
|
||||||
|
static int jp2_putuint64(jas_stream_t *out, uint_fast64_t val);
|
||||||
|
|
||||||
|
static int jp2_getint(jas_stream_t *in, int s, int n, int_fast32_t *val);
|
||||||
|
|
||||||
|
jp2_box_t *jp2_box_get(jas_stream_t *in);
|
||||||
|
void jp2_box_dump(jp2_box_t *box, FILE *out);
|
||||||
|
|
||||||
|
static int jp2_jp_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_jp_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static int jp2_ftyp_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_ftyp_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static int jp2_ihdr_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_ihdr_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static void jp2_bpcc_destroy(jp2_box_t *box);
|
||||||
|
static int jp2_bpcc_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_bpcc_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static int jp2_colr_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_colr_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static void jp2_colr_dumpdata(jp2_box_t *box, FILE *out);
|
||||||
|
static void jp2_colr_destroy(jp2_box_t *box);
|
||||||
|
static void jp2_cdef_destroy(jp2_box_t *box);
|
||||||
|
static int jp2_cdef_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_cdef_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static void jp2_cdef_dumpdata(jp2_box_t *box, FILE *out);
|
||||||
|
static void jp2_cmap_destroy(jp2_box_t *box);
|
||||||
|
static int jp2_cmap_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_cmap_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static void jp2_cmap_dumpdata(jp2_box_t *box, FILE *out);
|
||||||
|
static void jp2_pclr_destroy(jp2_box_t *box);
|
||||||
|
static int jp2_pclr_getdata(jp2_box_t *box, jas_stream_t *in);
|
||||||
|
static int jp2_pclr_putdata(jp2_box_t *box, jas_stream_t *out);
|
||||||
|
static void jp2_pclr_dumpdata(jp2_box_t *box, FILE *out);
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Local data.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
jp2_boxinfo_t jp2_boxinfos[] = {
|
||||||
|
{JP2_BOX_JP, "JP", 0,
|
||||||
|
{0, 0, jp2_jp_getdata, jp2_jp_putdata, 0}},
|
||||||
|
{JP2_BOX_FTYP, "FTYP", 0,
|
||||||
|
{0, 0, jp2_ftyp_getdata, jp2_ftyp_putdata, 0}},
|
||||||
|
{JP2_BOX_JP2H, "JP2H", JP2_BOX_SUPER,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_IHDR, "IHDR", 0,
|
||||||
|
{0, 0, jp2_ihdr_getdata, jp2_ihdr_putdata, 0}},
|
||||||
|
{JP2_BOX_BPCC, "BPCC", 0,
|
||||||
|
{0, jp2_bpcc_destroy, jp2_bpcc_getdata, jp2_bpcc_putdata, 0}},
|
||||||
|
{JP2_BOX_COLR, "COLR", 0,
|
||||||
|
{0, jp2_colr_destroy, jp2_colr_getdata, jp2_colr_putdata, jp2_colr_dumpdata}},
|
||||||
|
{JP2_BOX_PCLR, "PCLR", 0,
|
||||||
|
{0, jp2_pclr_destroy, jp2_pclr_getdata, jp2_pclr_putdata, jp2_pclr_dumpdata}},
|
||||||
|
{JP2_BOX_CMAP, "CMAP", 0,
|
||||||
|
{0, jp2_cmap_destroy, jp2_cmap_getdata, jp2_cmap_putdata, jp2_cmap_dumpdata}},
|
||||||
|
{JP2_BOX_CDEF, "CDEF", 0,
|
||||||
|
{0, jp2_cdef_destroy, jp2_cdef_getdata, jp2_cdef_putdata, jp2_cdef_dumpdata}},
|
||||||
|
{JP2_BOX_RES, "RES", JP2_BOX_SUPER,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_RESC, "RESC", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_RESD, "RESD", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_JP2C, "JP2C", JP2_BOX_NODATA,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_JP2I, "JP2I", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_XML, "XML", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_UUID, "UUID", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_UINF, "UINF", JP2_BOX_SUPER,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_ULST, "ULST", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{JP2_BOX_URL, "URL", 0,
|
||||||
|
{0, 0, 0, 0, 0}},
|
||||||
|
{0, 0, 0, {0, 0, 0, 0, 0}},
|
||||||
|
};
|
||||||
|
|
||||||
|
jp2_boxinfo_t jp2_boxinfo_unk = {
|
||||||
|
0, "Unknown", 0, {0, 0, 0, 0, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Box constructor.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
jp2_box_t *jp2_box_create(int type)
|
||||||
|
{
|
||||||
|
jp2_box_t *box;
|
||||||
|
jp2_boxinfo_t *boxinfo;
|
||||||
|
|
||||||
|
if (!(box = jas_malloc(sizeof(jp2_box_t)))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
memset(box, 0, sizeof(jp2_box_t));
|
||||||
|
box->type = type;
|
||||||
|
box->len = 0;
|
||||||
|
if (!(boxinfo = jp2_boxinfolookup(type))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
box->info = boxinfo;
|
||||||
|
box->ops = &boxinfo->ops;
|
||||||
|
return box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Box destructor.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
void jp2_box_destroy(jp2_box_t *box)
|
||||||
|
{
|
||||||
|
if (box->ops->destroy) {
|
||||||
|
(*box->ops->destroy)(box);
|
||||||
|
}
|
||||||
|
jas_free(box);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_bpcc_destroy(jp2_box_t *box)
|
||||||
|
{
|
||||||
|
jp2_bpcc_t *bpcc = &box->data.bpcc;
|
||||||
|
if (bpcc->bpcs) {
|
||||||
|
jas_free(bpcc->bpcs);
|
||||||
|
bpcc->bpcs = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_cdef_destroy(jp2_box_t *box)
|
||||||
|
{
|
||||||
|
jp2_cdef_t *cdef = &box->data.cdef;
|
||||||
|
if (cdef->ents) {
|
||||||
|
jas_free(cdef->ents);
|
||||||
|
cdef->ents = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Box input.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
jp2_box_t *jp2_box_get(jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_box_t *box;
|
||||||
|
jp2_boxinfo_t *boxinfo;
|
||||||
|
jas_stream_t *tmpstream;
|
||||||
|
uint_fast32_t len;
|
||||||
|
uint_fast64_t extlen;
|
||||||
|
bool dataflag;
|
||||||
|
|
||||||
|
box = 0;
|
||||||
|
tmpstream = 0;
|
||||||
|
|
||||||
|
if (!(box = jas_malloc(sizeof(jp2_box_t)))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
box->ops = &jp2_boxinfo_unk.ops;
|
||||||
|
if (jp2_getuint32(in, &len) || jp2_getuint32(in, &box->type)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
boxinfo = jp2_boxinfolookup(box->type);
|
||||||
|
box->info = boxinfo;
|
||||||
|
box->ops = &boxinfo->ops;
|
||||||
|
box->len = len;
|
||||||
|
if (box->len == 1) {
|
||||||
|
if (jp2_getuint64(in, &extlen)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (extlen > 0xffffffffUL) {
|
||||||
|
jas_eprintf("warning: cannot handle large 64-bit box length\n");
|
||||||
|
extlen = 0xffffffffUL;
|
||||||
|
}
|
||||||
|
box->len = extlen;
|
||||||
|
box->datalen = extlen - JP2_BOX_HDRLEN(true);
|
||||||
|
} else {
|
||||||
|
box->datalen = box->len - JP2_BOX_HDRLEN(false);
|
||||||
|
}
|
||||||
|
if (box->len != 0 && box->len < 8) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataflag = !(box->info->flags & (JP2_BOX_SUPER | JP2_BOX_NODATA));
|
||||||
|
|
||||||
|
if (dataflag) {
|
||||||
|
if (!(tmpstream = jas_stream_memopen(0, 0))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (jas_stream_copy(tmpstream, in, box->datalen)) {
|
||||||
|
jas_eprintf("cannot copy box data\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jas_stream_rewind(tmpstream);
|
||||||
|
|
||||||
|
if (box->ops->getdata) {
|
||||||
|
if ((*box->ops->getdata)(box, tmpstream)) {
|
||||||
|
jas_eprintf("cannot parse box data\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
jas_stream_close(tmpstream);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jas_getdbglevel() >= 1) {
|
||||||
|
jp2_box_dump(box, stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return box;
|
||||||
|
abort();
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (box) {
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
}
|
||||||
|
if (tmpstream) {
|
||||||
|
jas_stream_close(tmpstream);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void jp2_box_dump(jp2_box_t *box, FILE *out)
|
||||||
|
{
|
||||||
|
jp2_boxinfo_t *boxinfo;
|
||||||
|
boxinfo = jp2_boxinfolookup(box->type);
|
||||||
|
assert(boxinfo);
|
||||||
|
|
||||||
|
fprintf(out, "JP2 box: ");
|
||||||
|
fprintf(out, "type=%c%s%c (0x%08x); length=%d\n", '"', boxinfo->name,
|
||||||
|
'"', box->type, box->len);
|
||||||
|
if (box->ops->dumpdata) {
|
||||||
|
(*box->ops->dumpdata)(box, out);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_jp_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_jp_t *jp = &box->data.jp;
|
||||||
|
if (jp2_getuint32(in, &jp->magic)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_ftyp_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_ftyp_t *ftyp = &box->data.ftyp;
|
||||||
|
unsigned int i;
|
||||||
|
if (jp2_getuint32(in, &ftyp->majver) || jp2_getuint32(in, &ftyp->minver)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
ftyp->numcompatcodes = (box->datalen - 8) / 4;
|
||||||
|
if (ftyp->numcompatcodes > JP2_FTYP_MAXCOMPATCODES) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < ftyp->numcompatcodes; ++i) {
|
||||||
|
if (jp2_getuint32(in, &ftyp->compatcodes[i])) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_ihdr_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_ihdr_t *ihdr = &box->data.ihdr;
|
||||||
|
if (jp2_getuint32(in, &ihdr->height) || jp2_getuint32(in, &ihdr->width) ||
|
||||||
|
jp2_getuint16(in, &ihdr->numcmpts) || jp2_getuint8(in, &ihdr->bpc) ||
|
||||||
|
jp2_getuint8(in, &ihdr->comptype) || jp2_getuint8(in, &ihdr->csunk) ||
|
||||||
|
jp2_getuint8(in, &ihdr->ipr)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_bpcc_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_bpcc_t *bpcc = &box->data.bpcc;
|
||||||
|
unsigned int i;
|
||||||
|
bpcc->numcmpts = box->datalen;
|
||||||
|
if (!(bpcc->bpcs = jas_malloc(bpcc->numcmpts * sizeof(uint_fast8_t)))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < bpcc->numcmpts; ++i) {
|
||||||
|
if (jp2_getuint8(in, &bpcc->bpcs[i])) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_colr_dumpdata(jp2_box_t *box, FILE *out)
|
||||||
|
{
|
||||||
|
jp2_colr_t *colr = &box->data.colr;
|
||||||
|
fprintf(out, "method=%d; pri=%d; approx=%d\n", (int)colr->method, (int)colr->pri, (int)colr->approx);
|
||||||
|
switch (colr->method) {
|
||||||
|
case JP2_COLR_ENUM:
|
||||||
|
fprintf(out, "csid=%d\n", (int)colr->csid);
|
||||||
|
break;
|
||||||
|
case JP2_COLR_ICC:
|
||||||
|
jas_memdump(out, colr->iccp, colr->iccplen);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_colr_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_colr_t *colr = &box->data.colr;
|
||||||
|
colr->csid = 0;
|
||||||
|
colr->iccp = 0;
|
||||||
|
colr->iccplen = 0;
|
||||||
|
|
||||||
|
if (jp2_getuint8(in, &colr->method) || jp2_getuint8(in, &colr->pri) ||
|
||||||
|
jp2_getuint8(in, &colr->approx)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
switch (colr->method) {
|
||||||
|
case JP2_COLR_ENUM:
|
||||||
|
if (jp2_getuint32(in, &colr->csid)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case JP2_COLR_ICC:
|
||||||
|
colr->iccplen = box->datalen - 3;
|
||||||
|
if (!(colr->iccp = jas_malloc(colr->iccplen * sizeof(uint_fast8_t)))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (jas_stream_read(in, colr->iccp, colr->iccplen) != colr->iccplen) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_cdef_dumpdata(jp2_box_t *box, FILE *out)
|
||||||
|
{
|
||||||
|
jp2_cdef_t *cdef = &box->data.cdef;
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < cdef->numchans; ++i) {
|
||||||
|
fprintf(out, "channo=%d; type=%d; assoc=%d\n",
|
||||||
|
cdef->ents[i].channo, cdef->ents[i].type, cdef->ents[i].assoc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_colr_destroy(jp2_box_t *box)
|
||||||
|
{
|
||||||
|
jp2_colr_t *colr = &box->data.colr;
|
||||||
|
if (colr->iccp) {
|
||||||
|
jas_free(colr->iccp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_cdef_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_cdef_t *cdef = &box->data.cdef;
|
||||||
|
jp2_cdefchan_t *chan;
|
||||||
|
unsigned int channo;
|
||||||
|
if (jp2_getuint16(in, &cdef->numchans)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!(cdef->ents = jas_malloc(cdef->numchans * sizeof(jp2_cdefchan_t)))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (channo = 0; channo < cdef->numchans; ++channo) {
|
||||||
|
chan = &cdef->ents[channo];
|
||||||
|
if (jp2_getuint16(in, &chan->channo) || jp2_getuint16(in, &chan->type) ||
|
||||||
|
jp2_getuint16(in, &chan->assoc)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Box output.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
int jp2_box_put(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jas_stream_t *tmpstream;
|
||||||
|
bool extlen;
|
||||||
|
bool dataflag;
|
||||||
|
|
||||||
|
tmpstream = 0;
|
||||||
|
|
||||||
|
dataflag = !(box->info->flags & (JP2_BOX_SUPER | JP2_BOX_NODATA));
|
||||||
|
|
||||||
|
if (dataflag) {
|
||||||
|
tmpstream = jas_stream_memopen(0, 0);
|
||||||
|
if (box->ops->putdata) {
|
||||||
|
if ((*box->ops->putdata)(box, tmpstream)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
box->len = jas_stream_tell(tmpstream) + JP2_BOX_HDRLEN(false);
|
||||||
|
jas_stream_rewind(tmpstream);
|
||||||
|
}
|
||||||
|
extlen = (box->len >= (((uint_fast64_t)1) << 32)) != 0;
|
||||||
|
if (jp2_putuint32(out, extlen ? 1 : box->len)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (jp2_putuint32(out, box->type)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
if (extlen) {
|
||||||
|
if (jp2_putuint64(out, box->len)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dataflag) {
|
||||||
|
if (jas_stream_copy(out, tmpstream, box->len - JP2_BOX_HDRLEN(false))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jas_stream_close(tmpstream);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
abort();
|
||||||
|
|
||||||
|
error:
|
||||||
|
|
||||||
|
if (tmpstream) {
|
||||||
|
jas_stream_close(tmpstream);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_jp_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jp2_jp_t *jp = &box->data.jp;
|
||||||
|
if (jp2_putuint32(out, jp->magic)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_ftyp_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jp2_ftyp_t *ftyp = &box->data.ftyp;
|
||||||
|
unsigned int i;
|
||||||
|
if (jp2_putuint32(out, ftyp->majver) || jp2_putuint32(out, ftyp->minver)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < ftyp->numcompatcodes; ++i) {
|
||||||
|
if (jp2_putuint32(out, ftyp->compatcodes[i])) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_ihdr_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jp2_ihdr_t *ihdr = &box->data.ihdr;
|
||||||
|
if (jp2_putuint32(out, ihdr->height) || jp2_putuint32(out, ihdr->width) ||
|
||||||
|
jp2_putuint16(out, ihdr->numcmpts) || jp2_putuint8(out, ihdr->bpc) ||
|
||||||
|
jp2_putuint8(out, ihdr->comptype) || jp2_putuint8(out, ihdr->csunk) ||
|
||||||
|
jp2_putuint8(out, ihdr->ipr)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_bpcc_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jp2_bpcc_t *bpcc = &box->data.bpcc;
|
||||||
|
unsigned int i;
|
||||||
|
for (i = 0; i < bpcc->numcmpts; ++i) {
|
||||||
|
if (jp2_putuint8(out, bpcc->bpcs[i])) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_colr_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jp2_colr_t *colr = &box->data.colr;
|
||||||
|
if (jp2_putuint8(out, colr->method) || jp2_putuint8(out, colr->pri) ||
|
||||||
|
jp2_putuint8(out, colr->approx)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
switch (colr->method) {
|
||||||
|
case JP2_COLR_ENUM:
|
||||||
|
if (jp2_putuint32(out, colr->csid)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case JP2_COLR_ICC:
|
||||||
|
if (jas_stream_write(out, colr->iccp,
|
||||||
|
JAS_CAST(int, colr->iccplen)) != JAS_CAST(int, colr->iccplen))
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_cdef_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
jp2_cdef_t *cdef = &box->data.cdef;
|
||||||
|
unsigned int i;
|
||||||
|
jp2_cdefchan_t *ent;
|
||||||
|
|
||||||
|
if (jp2_putuint16(out, cdef->numchans)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < cdef->numchans; ++i) {
|
||||||
|
ent = &cdef->ents[i];
|
||||||
|
if (jp2_putuint16(out, ent->channo) ||
|
||||||
|
jp2_putuint16(out, ent->type) ||
|
||||||
|
jp2_putuint16(out, ent->assoc)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Input operations for primitive types.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
static int jp2_getuint8(jas_stream_t *in, uint_fast8_t *val)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (val) {
|
||||||
|
*val = c;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_getuint16(jas_stream_t *in, uint_fast16_t *val)
|
||||||
|
{
|
||||||
|
uint_fast16_t v;
|
||||||
|
int c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = (v << 8) | c;
|
||||||
|
if (val) {
|
||||||
|
*val = v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_getuint32(jas_stream_t *in, uint_fast32_t *val)
|
||||||
|
{
|
||||||
|
uint_fast32_t v;
|
||||||
|
int c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = (v << 8) | c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = (v << 8) | c;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = (v << 8) | c;
|
||||||
|
if (val) {
|
||||||
|
*val = v;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_getuint64(jas_stream_t *in, uint_fast64_t *val)
|
||||||
|
{
|
||||||
|
uint_fast64_t tmpval;
|
||||||
|
int i;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
tmpval = 0;
|
||||||
|
for (i = 0; i < 8; ++i) {
|
||||||
|
tmpval <<= 8;
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
tmpval |= (c & 0xff);
|
||||||
|
}
|
||||||
|
*val = tmpval;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Output operations for primitive types.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
static int jp2_putuint8(jas_stream_t *out, uint_fast8_t val)
|
||||||
|
{
|
||||||
|
if (jas_stream_putc(out, val & 0xff) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_putuint16(jas_stream_t *out, uint_fast16_t val)
|
||||||
|
{
|
||||||
|
if (jas_stream_putc(out, (val >> 8) & 0xff) == EOF ||
|
||||||
|
jas_stream_putc(out, val & 0xff) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_putuint32(jas_stream_t *out, uint_fast32_t val)
|
||||||
|
{
|
||||||
|
if (jas_stream_putc(out, (val >> 24) & 0xff) == EOF ||
|
||||||
|
jas_stream_putc(out, (val >> 16) & 0xff) == EOF ||
|
||||||
|
jas_stream_putc(out, (val >> 8) & 0xff) == EOF ||
|
||||||
|
jas_stream_putc(out, val & 0xff) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_putuint64(jas_stream_t *out, uint_fast64_t val)
|
||||||
|
{
|
||||||
|
if (jp2_putuint32(out, (val >> 32) & 0xffffffffUL) ||
|
||||||
|
jp2_putuint32(out, val & 0xffffffffUL)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Miscellaneous code.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
jp2_boxinfo_t *jp2_boxinfolookup(int type)
|
||||||
|
{
|
||||||
|
jp2_boxinfo_t *boxinfo;
|
||||||
|
for (boxinfo = jp2_boxinfos; boxinfo->name; ++boxinfo) {
|
||||||
|
if (boxinfo->type == type) {
|
||||||
|
return boxinfo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &jp2_boxinfo_unk;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void jp2_cmap_destroy(jp2_box_t *box)
|
||||||
|
{
|
||||||
|
jp2_cmap_t *cmap = &box->data.cmap;
|
||||||
|
if (cmap->ents) {
|
||||||
|
jas_free(cmap->ents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_cmap_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_cmap_t *cmap = &box->data.cmap;
|
||||||
|
jp2_cmapent_t *ent;
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
cmap->numchans = (box->datalen) / 4;
|
||||||
|
if (!(cmap->ents = jas_malloc(cmap->numchans * sizeof(jp2_cmapent_t)))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < cmap->numchans; ++i) {
|
||||||
|
ent = &cmap->ents[i];
|
||||||
|
if (jp2_getuint16(in, &ent->cmptno) ||
|
||||||
|
jp2_getuint8(in, &ent->map) ||
|
||||||
|
jp2_getuint8(in, &ent->pcol)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_cmap_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
/* Eliminate compiler warning about unused variables. */
|
||||||
|
box = 0;
|
||||||
|
out = 0;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_cmap_dumpdata(jp2_box_t *box, FILE *out)
|
||||||
|
{
|
||||||
|
jp2_cmap_t *cmap = &box->data.cmap;
|
||||||
|
unsigned int i;
|
||||||
|
jp2_cmapent_t *ent;
|
||||||
|
fprintf(out, "numchans = %d\n", (int) cmap->numchans);
|
||||||
|
for (i = 0; i < cmap->numchans; ++i) {
|
||||||
|
ent = &cmap->ents[i];
|
||||||
|
fprintf(out, "cmptno=%d; map=%d; pcol=%d\n",
|
||||||
|
(int) ent->cmptno, (int) ent->map, (int) ent->pcol);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_pclr_destroy(jp2_box_t *box)
|
||||||
|
{
|
||||||
|
jp2_pclr_t *pclr = &box->data.pclr;
|
||||||
|
if (pclr->lutdata) {
|
||||||
|
jas_free(pclr->lutdata);
|
||||||
|
}
|
||||||
|
if (pclr->bpc)
|
||||||
|
jas_free(pclr->bpc);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_pclr_getdata(jp2_box_t *box, jas_stream_t *in)
|
||||||
|
{
|
||||||
|
jp2_pclr_t *pclr = &box->data.pclr;
|
||||||
|
int lutsize;
|
||||||
|
unsigned int i;
|
||||||
|
unsigned int j;
|
||||||
|
int_fast32_t x;
|
||||||
|
|
||||||
|
pclr->lutdata = 0;
|
||||||
|
|
||||||
|
if (jp2_getuint16(in, &pclr->numlutents) ||
|
||||||
|
jp2_getuint8(in, &pclr->numchans)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
lutsize = pclr->numlutents * pclr->numchans;
|
||||||
|
if (!(pclr->lutdata = jas_malloc(lutsize * sizeof(int_fast32_t)))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!(pclr->bpc = jas_malloc(pclr->numchans * sizeof(uint_fast8_t)))) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
for (i = 0; i < pclr->numchans; ++i) {
|
||||||
|
if (jp2_getuint8(in, &pclr->bpc[i])) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i = 0; i < pclr->numlutents; ++i) {
|
||||||
|
for (j = 0; j < pclr->numchans; ++j) {
|
||||||
|
if (jp2_getint(in, (pclr->bpc[j] & 0x80) != 0,
|
||||||
|
(pclr->bpc[j] & 0x7f) + 1, &x)) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
pclr->lutdata[i * pclr->numchans + j] = x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_pclr_putdata(jp2_box_t *box, jas_stream_t *out)
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
jp2_pclr_t *pclr = &box->data.pclr;
|
||||||
|
#endif
|
||||||
|
/* Eliminate warning about unused variable. */
|
||||||
|
box = 0;
|
||||||
|
out = 0;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void jp2_pclr_dumpdata(jp2_box_t *box, FILE *out)
|
||||||
|
{
|
||||||
|
jp2_pclr_t *pclr = &box->data.pclr;
|
||||||
|
unsigned int i;
|
||||||
|
int j;
|
||||||
|
fprintf(out, "numents=%d; numchans=%d\n", (int) pclr->numlutents,
|
||||||
|
(int) pclr->numchans);
|
||||||
|
for (i = 0; i < pclr->numlutents; ++i) {
|
||||||
|
for (j = 0; j < pclr->numchans; ++j) {
|
||||||
|
fprintf(out, "LUT[%d][%d]=%d\n", i, j, pclr->lutdata[i * pclr->numchans + j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int jp2_getint(jas_stream_t *in, int s, int n, int_fast32_t *val)
|
||||||
|
{
|
||||||
|
int c;
|
||||||
|
int i;
|
||||||
|
uint_fast32_t v;
|
||||||
|
int m;
|
||||||
|
|
||||||
|
m = (n + 7) / 8;
|
||||||
|
|
||||||
|
v = 0;
|
||||||
|
for (i = 0; i < m; ++i) {
|
||||||
|
if ((c = jas_stream_getc(in)) == EOF) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
v = (v << 8) | c;
|
||||||
|
}
|
||||||
|
v &= ONES(n);
|
||||||
|
if (s) {
|
||||||
|
int sb;
|
||||||
|
sb = v & (1 << (8 * m - 1));
|
||||||
|
*val = ((~v) + 1) & ONES(8 * m);
|
||||||
|
if (sb) {
|
||||||
|
*val = -*val;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*val = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
jp2_cdefchan_t *jp2_cdef_lookup(jp2_cdef_t *cdef, int channo)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
jp2_cdefchan_t *cdefent;
|
||||||
|
for (i = 0; i < cdef->numchans; ++i) {
|
||||||
|
cdefent = &cdef->ents[i];
|
||||||
|
if (cdefent->channo == JAS_CAST(unsigned int, channo)) {
|
||||||
|
return cdefent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,436 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999-2000 Image Power, Inc. and the University of
|
||||||
|
* British Columbia.
|
||||||
|
* Copyright (c) 2001-2003 Michael David Adams.
|
||||||
|
* All rights reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* __START_OF_JASPER_LICENSE__
|
||||||
|
*
|
||||||
|
* JasPer License Version 2.0
|
||||||
|
*
|
||||||
|
* Copyright (c) 2001-2006 Michael David Adams
|
||||||
|
* Copyright (c) 1999-2000 Image Power, Inc.
|
||||||
|
* Copyright (c) 1999-2000 The University of British Columbia
|
||||||
|
*
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person (the
|
||||||
|
* "User") obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without restriction,
|
||||||
|
* including without limitation the rights to use, copy, modify, merge,
|
||||||
|
* publish, distribute, and/or sell copies of the Software, and to permit
|
||||||
|
* persons to whom the Software is furnished to do so, subject to the
|
||||||
|
* following conditions:
|
||||||
|
*
|
||||||
|
* 1. The above copyright notices and this permission notice (which
|
||||||
|
* includes the disclaimer below) shall be included in all copies or
|
||||||
|
* substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* 2. The name of a copyright holder shall not be used to endorse or
|
||||||
|
* promote products derived from the Software without specific prior
|
||||||
|
* written permission.
|
||||||
|
*
|
||||||
|
* THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
|
||||||
|
* LICENSE. NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
|
||||||
|
* THIS DISCLAIMER. THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
|
||||||
|
* "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
|
||||||
|
* BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||||
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO
|
||||||
|
* EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
|
||||||
|
* INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
|
||||||
|
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
||||||
|
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
||||||
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. NO ASSURANCES ARE
|
||||||
|
* PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
|
||||||
|
* THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
|
||||||
|
* EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
|
||||||
|
* BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
|
||||||
|
* PROPERTY RIGHTS OR OTHERWISE. AS A CONDITION TO EXERCISING THE RIGHTS
|
||||||
|
* GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
|
||||||
|
* ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY. THE SOFTWARE
|
||||||
|
* IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
|
||||||
|
* SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
|
||||||
|
* AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
|
||||||
|
* SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
|
||||||
|
* THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
|
||||||
|
* PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
|
||||||
|
* RISK ACTIVITIES"). THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
|
||||||
|
*
|
||||||
|
* __END_OF_JASPER_LICENSE__
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JP2 Library
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Includes.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include "jasper/jas_malloc.h"
|
||||||
|
#include "jasper/jas_image.h"
|
||||||
|
#include "jasper/jas_stream.h"
|
||||||
|
#include "jasper/jas_cm.h"
|
||||||
|
#include "jasper/jas_icc.h"
|
||||||
|
#include "jp2_cod.h"
|
||||||
|
|
||||||
|
static uint_fast32_t jp2_gettypeasoc(int colorspace, int ctype);
|
||||||
|
static int clrspctojp2(jas_clrspc_t clrspc);
|
||||||
|
|
||||||
|
/******************************************************************************\
|
||||||
|
* Functions.
|
||||||
|
\******************************************************************************/
|
||||||
|
|
||||||
|
int jp2_encode(jas_image_t *image, jas_stream_t *out, char *optstr)
|
||||||
|
{
|
||||||
|
jp2_box_t *box;
|
||||||
|
jp2_ftyp_t *ftyp;
|
||||||
|
jp2_ihdr_t *ihdr;
|
||||||
|
jas_stream_t *tmpstream;
|
||||||
|
int allcmptssame;
|
||||||
|
jp2_bpcc_t *bpcc;
|
||||||
|
long len;
|
||||||
|
uint_fast16_t cmptno;
|
||||||
|
jp2_colr_t *colr;
|
||||||
|
char buf[4096];
|
||||||
|
uint_fast32_t overhead;
|
||||||
|
jp2_cdefchan_t *cdefchanent;
|
||||||
|
jp2_cdef_t *cdef;
|
||||||
|
int i;
|
||||||
|
uint_fast32_t typeasoc;
|
||||||
|
jas_iccprof_t *iccprof;
|
||||||
|
jas_stream_t *iccstream;
|
||||||
|
int pos;
|
||||||
|
int needcdef;
|
||||||
|
int prec;
|
||||||
|
int sgnd;
|
||||||
|
|
||||||
|
box = 0;
|
||||||
|
tmpstream = 0;
|
||||||
|
|
||||||
|
allcmptssame = 1;
|
||||||
|
sgnd = jas_image_cmptsgnd(image, 0);
|
||||||
|
prec = jas_image_cmptprec(image, 0);
|
||||||
|
for (i = 1; i < jas_image_numcmpts(image); ++i) {
|
||||||
|
if (jas_image_cmptsgnd(image, i) != sgnd ||
|
||||||
|
jas_image_cmptprec(image, i) != prec) {
|
||||||
|
allcmptssame = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Output the signature box. */
|
||||||
|
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_JP))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
box->data.jp.magic = JP2_JP_MAGIC;
|
||||||
|
if (jp2_box_put(box, out)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
|
||||||
|
/* Output the file type box. */
|
||||||
|
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_FTYP))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
ftyp = &box->data.ftyp;
|
||||||
|
ftyp->majver = JP2_FTYP_MAJVER;
|
||||||
|
ftyp->minver = JP2_FTYP_MINVER;
|
||||||
|
ftyp->numcompatcodes = 1;
|
||||||
|
ftyp->compatcodes[0] = JP2_FTYP_COMPATCODE;
|
||||||
|
if (jp2_box_put(box, out)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate the data portion of the JP2 header box.
|
||||||
|
* We cannot simply output the header for this box
|
||||||
|
* since we do not yet know the correct value for the length
|
||||||
|
* field.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!(tmpstream = jas_stream_memopen(0, 0))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate image header box. */
|
||||||
|
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_IHDR))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
ihdr = &box->data.ihdr;
|
||||||
|
ihdr->width = jas_image_width(image);
|
||||||
|
ihdr->height = jas_image_height(image);
|
||||||
|
ihdr->numcmpts = jas_image_numcmpts(image);
|
||||||
|
ihdr->bpc = allcmptssame ? JP2_SPTOBPC(jas_image_cmptsgnd(image, 0),
|
||||||
|
jas_image_cmptprec(image, 0)) : JP2_IHDR_BPCNULL;
|
||||||
|
ihdr->comptype = JP2_IHDR_COMPTYPE;
|
||||||
|
ihdr->csunk = 0;
|
||||||
|
ihdr->ipr = 0;
|
||||||
|
if (jp2_box_put(box, tmpstream)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
|
||||||
|
/* Generate bits per component box. */
|
||||||
|
|
||||||
|
if (!allcmptssame) {
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_BPCC))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
bpcc = &box->data.bpcc;
|
||||||
|
bpcc->numcmpts = jas_image_numcmpts(image);
|
||||||
|
if (!(bpcc->bpcs = jas_malloc(bpcc->numcmpts *
|
||||||
|
sizeof(uint_fast8_t)))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
for (cmptno = 0; cmptno < bpcc->numcmpts; ++cmptno) {
|
||||||
|
bpcc->bpcs[cmptno] = JP2_SPTOBPC(jas_image_cmptsgnd(image,
|
||||||
|
cmptno), jas_image_cmptprec(image, cmptno));
|
||||||
|
}
|
||||||
|
if (jp2_box_put(box, tmpstream)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Generate color specification box. */
|
||||||
|
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_COLR))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
colr = &box->data.colr;
|
||||||
|
switch (jas_image_clrspc(image)) {
|
||||||
|
case JAS_CLRSPC_SRGB:
|
||||||
|
case JAS_CLRSPC_SYCBCR:
|
||||||
|
case JAS_CLRSPC_SGRAY:
|
||||||
|
colr->method = JP2_COLR_ENUM;
|
||||||
|
colr->csid = clrspctojp2(jas_image_clrspc(image));
|
||||||
|
colr->pri = JP2_COLR_PRI;
|
||||||
|
colr->approx = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
colr->method = JP2_COLR_ICC;
|
||||||
|
colr->pri = JP2_COLR_PRI;
|
||||||
|
colr->approx = 0;
|
||||||
|
iccprof = jas_iccprof_createfromcmprof(jas_image_cmprof(image));
|
||||||
|
assert(iccprof);
|
||||||
|
iccstream = jas_stream_memopen(0, 0);
|
||||||
|
assert(iccstream);
|
||||||
|
if (jas_iccprof_save(iccprof, iccstream))
|
||||||
|
abort();
|
||||||
|
if ((pos = jas_stream_tell(iccstream)) < 0)
|
||||||
|
abort();
|
||||||
|
colr->iccplen = pos;
|
||||||
|
colr->iccp = jas_malloc(pos);
|
||||||
|
assert(colr->iccp);
|
||||||
|
jas_stream_rewind(iccstream);
|
||||||
|
if (jas_stream_read(iccstream, colr->iccp, colr->iccplen) != colr->iccplen)
|
||||||
|
abort();
|
||||||
|
jas_stream_close(iccstream);
|
||||||
|
jas_iccprof_destroy(iccprof);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (jp2_box_put(box, tmpstream)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
|
||||||
|
needcdef = 1;
|
||||||
|
switch (jas_clrspc_fam(jas_image_clrspc(image))) {
|
||||||
|
case JAS_CLRSPC_FAM_RGB:
|
||||||
|
if (jas_image_cmpttype(image, 0) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R) &&
|
||||||
|
jas_image_cmpttype(image, 1) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G) &&
|
||||||
|
jas_image_cmpttype(image, 2) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B))
|
||||||
|
needcdef = 0;
|
||||||
|
break;
|
||||||
|
case JAS_CLRSPC_FAM_YCBCR:
|
||||||
|
if (jas_image_cmpttype(image, 0) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_Y) &&
|
||||||
|
jas_image_cmpttype(image, 1) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_CB) &&
|
||||||
|
jas_image_cmpttype(image, 2) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_YCBCR_CR))
|
||||||
|
needcdef = 0;
|
||||||
|
break;
|
||||||
|
case JAS_CLRSPC_FAM_GRAY:
|
||||||
|
if (jas_image_cmpttype(image, 0) ==
|
||||||
|
JAS_IMAGE_CT_COLOR(JAS_IMAGE_CT_GRAY_Y))
|
||||||
|
needcdef = 0;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needcdef) {
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_CDEF))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
cdef = &box->data.cdef;
|
||||||
|
cdef->numchans = jas_image_numcmpts(image);
|
||||||
|
cdef->ents = jas_malloc(cdef->numchans * sizeof(jp2_cdefchan_t));
|
||||||
|
for (i = 0; i < jas_image_numcmpts(image); ++i) {
|
||||||
|
cdefchanent = &cdef->ents[i];
|
||||||
|
cdefchanent->channo = i;
|
||||||
|
typeasoc = jp2_gettypeasoc(jas_image_clrspc(image), jas_image_cmpttype(image, i));
|
||||||
|
cdefchanent->type = typeasoc >> 16;
|
||||||
|
cdefchanent->assoc = typeasoc & 0x7fff;
|
||||||
|
}
|
||||||
|
if (jp2_box_put(box, tmpstream)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Determine the total length of the JP2 header box. */
|
||||||
|
|
||||||
|
len = jas_stream_tell(tmpstream);
|
||||||
|
jas_stream_rewind(tmpstream);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Output the JP2 header box and all of the boxes which it contains.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_JP2H))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
box->len = len + JP2_BOX_HDRLEN(false);
|
||||||
|
if (jp2_box_put(box, out)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
|
||||||
|
if (jas_stream_copy(out, tmpstream, len)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
jas_stream_close(tmpstream);
|
||||||
|
tmpstream = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Output the contiguous code stream box.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (!(box = jp2_box_create(JP2_BOX_JP2C))) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
box->len = 0;
|
||||||
|
if (jp2_box_put(box, out)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
box = 0;
|
||||||
|
|
||||||
|
/* Output the JPEG-2000 code stream. */
|
||||||
|
|
||||||
|
overhead = jas_stream_getrwcount(out);
|
||||||
|
sprintf(buf, "%s\n_jp2overhead=%lu\n", (optstr ? optstr : ""),
|
||||||
|
(unsigned long) overhead);
|
||||||
|
|
||||||
|
if (jpc_encode(image, out, buf)) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
abort();
|
||||||
|
|
||||||
|
error:
|
||||||
|
|
||||||
|
if (box) {
|
||||||
|
jp2_box_destroy(box);
|
||||||
|
}
|
||||||
|
if (tmpstream) {
|
||||||
|
jas_stream_close(tmpstream);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint_fast32_t jp2_gettypeasoc(int colorspace, int ctype)
|
||||||
|
{
|
||||||
|
int type;
|
||||||
|
int asoc;
|
||||||
|
|
||||||
|
if (ctype & JAS_IMAGE_CT_OPACITY) {
|
||||||
|
type = JP2_CDEF_TYPE_OPACITY;
|
||||||
|
asoc = JP2_CDEF_ASOC_ALL;
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
|
||||||
|
type = JP2_CDEF_TYPE_UNSPEC;
|
||||||
|
asoc = JP2_CDEF_ASOC_NONE;
|
||||||
|
switch (jas_clrspc_fam(colorspace)) {
|
||||||
|
case JAS_CLRSPC_FAM_RGB:
|
||||||
|
switch (JAS_IMAGE_CT_COLOR(ctype)) {
|
||||||
|
case JAS_IMAGE_CT_RGB_R:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_RGB_R;
|
||||||
|
break;
|
||||||
|
case JAS_IMAGE_CT_RGB_G:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_RGB_G;
|
||||||
|
break;
|
||||||
|
case JAS_IMAGE_CT_RGB_B:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_RGB_B;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case JAS_CLRSPC_FAM_YCBCR:
|
||||||
|
switch (JAS_IMAGE_CT_COLOR(ctype)) {
|
||||||
|
case JAS_IMAGE_CT_YCBCR_Y:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_YCBCR_Y;
|
||||||
|
break;
|
||||||
|
case JAS_IMAGE_CT_YCBCR_CB:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_YCBCR_CB;
|
||||||
|
break;
|
||||||
|
case JAS_IMAGE_CT_YCBCR_CR:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_YCBCR_CR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case JAS_CLRSPC_FAM_GRAY:
|
||||||
|
type = JP2_CDEF_TYPE_COLOR;
|
||||||
|
asoc = JP2_CDEF_GRAY_Y;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
done:
|
||||||
|
return (type << 16) | asoc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int clrspctojp2(jas_clrspc_t clrspc)
|
||||||
|
{
|
||||||
|
switch (clrspc) {
|
||||||
|
case JAS_CLRSPC_SRGB:
|
||||||
|
return JP2_COLR_SRGB;
|
||||||
|
case JAS_CLRSPC_SYCBCR:
|
||||||
|
return JP2_COLR_SYCC;
|
||||||
|
case JAS_CLRSPC_SGRAY:
|
||||||
|
return JP2_COLR_SGRAY;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue