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.
|
||||
# Mar 13, 2013 1793 bsteffen Performance improvements for
|
||||
# TCMWindTool
|
||||
# Apr 24, 2013 1947 randerso Fix UVToMagDir to work with scalar arguments
|
||||
# Cleaned up some constants
|
||||
#
|
||||
########################################################################
|
||||
import types, string, time, sys
|
||||
|
@ -49,6 +51,7 @@ from math import *
|
|||
from numpy import *
|
||||
import os
|
||||
import numpy
|
||||
import math
|
||||
import re
|
||||
import jep
|
||||
import BaseTool, Exceptions
|
||||
|
@ -788,19 +791,26 @@ class SmartScript(BaseTool.BaseTool):
|
|||
## Conversion methods
|
||||
|
||||
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
|
||||
u = - u
|
||||
v = - v
|
||||
speed = numpy.sqrt(u * u + v * v)
|
||||
dir = numpy.arctan2(u, v) * RAD_TO_DEG
|
||||
# adjust values so that 0<dir<360
|
||||
dir[numpy.greater_equal(dir, 360)] -= 360
|
||||
dir[numpy.less(dir, 0)] += 360
|
||||
u = -u
|
||||
v = -v
|
||||
if type(u) is numpy.ndarray or type(v) is numpy.ndarray:
|
||||
speed = numpy.sqrt(u * u + v * v)
|
||||
dir = numpy.arctan2(u, v) * RAD_TO_DEG
|
||||
dir[numpy.greater_equal(dir, 360)] -= 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)
|
||||
|
||||
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
|
||||
uw = - sin(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):
|
||||
# Convert from meters/sec to Kts
|
||||
return value_Msec * 1.944
|
||||
return value_Msec * 3600.0 / 1852.0
|
||||
|
||||
def convertKtoF(self, t_K):
|
||||
# Convert the temperature from Kelvin to Fahrenheit
|
||||
|
@ -830,7 +840,7 @@ class SmartScript(BaseTool.BaseTool):
|
|||
|
||||
def convertFtToM(self, value_Ft):
|
||||
# Convert the value in Feet to Meters
|
||||
return value_Ft/3.28084
|
||||
return value_Ft * 0.3048
|
||||
|
||||
#########################################################################
|
||||
## Error Handling ##
|
||||
|
|
|
@ -59,6 +59,8 @@ import com.raytheon.uf.viz.core.rsc.capabilities.AbstractCapability;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* Sep 5, 2007 chammack Initial Creation.
|
||||
* Apr 9, 2009 1288 rjpeter Added iterator implementation to fix remove.
|
||||
* Apr 24, 2013 1950 bsteffen Sort resources before instantiation.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
* @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 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> postAddListeners;
|
||||
|
@ -868,17 +897,16 @@ public class ResourceList extends CopyOnWriteArrayList<ResourcePair> implements
|
|||
boolean fireListeners) {
|
||||
List<ResourcePair> orderedList = null;
|
||||
synchronized (resourcesToInstantiate) {
|
||||
if (descriptor.getTimeMatcher() != null) {
|
||||
orderedList = new ArrayList<ResourcePair>(descriptor
|
||||
.getTimeMatcher().getResourceLoadOrder(
|
||||
resourcesToInstantiate));
|
||||
} else {
|
||||
orderedList = new ArrayList<ResourcePair>(
|
||||
resourcesToInstantiate);
|
||||
}
|
||||
orderedList = new ArrayList<ResourcePair>(resourcesToInstantiate);
|
||||
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();
|
||||
List<ResourcePair> noTimes = new ArrayList<ResourcePair>();
|
||||
List<ResourcePair> successful = new ArrayList<ResourcePair>();
|
||||
|
@ -1025,4 +1053,6 @@ public class ResourceList extends CopyOnWriteArrayList<ResourcePair> implements
|
|||
}
|
||||
return resources;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -74,6 +74,7 @@ import com.raytheon.uf.viz.monitor.ffmp.ui.dialogs.FfmpTableConfigData;
|
|||
* Apr 12, 2013 1902 mpduff Code Cleanup.
|
||||
* Apr 15, 2013 1890 dhladky Added another constant fix.
|
||||
* 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>
|
||||
*
|
||||
* @author dhladky
|
||||
|
@ -104,7 +105,7 @@ public class FFMPDataGenerator {
|
|||
|
||||
private final String huc;
|
||||
|
||||
private final List<DomainXML> domains;
|
||||
private final ArrayList<DomainXML> domains;
|
||||
|
||||
private final double sliderTime;
|
||||
|
||||
|
@ -177,6 +178,12 @@ public class FFMPDataGenerator {
|
|||
ffmpTableCfgData = tableConfig.getTableConfigData(siteKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate the FFMP Data.
|
||||
*
|
||||
* @return FFMPTableData object
|
||||
* @throws Exception
|
||||
*/
|
||||
public FFMPTableData generateFFMPData() throws Exception {
|
||||
// You should always have at least a QPE data source
|
||||
FFMPTableData tData = null;
|
||||
|
@ -256,8 +263,9 @@ public class FFMPDataGenerator {
|
|||
* is in the CWA
|
||||
*/
|
||||
|
||||
List<Long> pfafs = ft.getAggregatePfafs(
|
||||
key, siteKey, huc);
|
||||
ArrayList<Long> pfafs = ft
|
||||
.getAggregatePfafs(key, siteKey,
|
||||
huc);
|
||||
|
||||
boolean isVGB = false;
|
||||
if (ft.checkVGBsInAggregate(key, siteKey,
|
||||
|
@ -493,7 +501,9 @@ public class FFMPDataGenerator {
|
|||
forced = forceUtil.isForced();
|
||||
}
|
||||
|
||||
if ((!forcedPfafs.isEmpty()) && forced && centeredAggregationKey == null) {
|
||||
if ((!forcedPfafs.isEmpty()) && forced
|
||||
&& centeredAggregationKey == null
|
||||
&& !pfafList.isEmpty()) {
|
||||
// Recalculate the guidance using the forced
|
||||
// value(s)
|
||||
guidance = guidRecords
|
||||
|
@ -506,7 +516,9 @@ public class FFMPDataGenerator {
|
|||
guidance,
|
||||
forcedPfafs,
|
||||
resource.getGuidSourceExpiration(guidType));
|
||||
} else if (!forcedPfafs.isEmpty() && centeredAggregationKey == null) {
|
||||
} else if (!forcedPfafs.isEmpty()
|
||||
&& centeredAggregationKey == null
|
||||
&& !pfafList.isEmpty()) {
|
||||
guidance = guidRecords
|
||||
.get(guidType)
|
||||
.getBasinData(ALL)
|
||||
|
@ -518,7 +530,8 @@ public class FFMPDataGenerator {
|
|||
forcedPfafs,
|
||||
resource.getGuidSourceExpiration(guidType));
|
||||
forced = true;
|
||||
} else if (!pfafList.isEmpty() && centeredAggregationKey == null) {
|
||||
} else if (!pfafList.isEmpty()
|
||||
&& centeredAggregationKey == null) {
|
||||
guidance = guidRecords
|
||||
.get(guidType)
|
||||
.getBasinData(ALL)
|
||||
|
@ -659,7 +672,9 @@ public class FFMPDataGenerator {
|
|||
forced = forceUtil.isForced();
|
||||
}
|
||||
|
||||
if ((!forcedPfafs.isEmpty()) && forced && centeredAggregationKey == null) {
|
||||
if ((!forcedPfafs.isEmpty()) && forced
|
||||
&& centeredAggregationKey == null
|
||||
&& !pfafList.isEmpty()) {
|
||||
// Recalculate the guidance using the forced
|
||||
// value(s)
|
||||
guidance = guidRecords
|
||||
|
@ -672,7 +687,9 @@ public class FFMPDataGenerator {
|
|||
guidance,
|
||||
forcedPfafs,
|
||||
resource.getGuidSourceExpiration(guidType));
|
||||
} else if (!forcedPfafs.isEmpty() && centeredAggregationKey == null) {
|
||||
} else if (!forcedPfafs.isEmpty()
|
||||
&& centeredAggregationKey == null
|
||||
&& !pfafList.isEmpty()) {
|
||||
guidance = guidRecords
|
||||
.get(guidType)
|
||||
.getBasinData(ALL)
|
||||
|
@ -684,7 +701,8 @@ public class FFMPDataGenerator {
|
|||
forcedPfafs,
|
||||
resource.getGuidSourceExpiration(guidType));
|
||||
forced = true;
|
||||
} else if (!pfafList.isEmpty() && centeredAggregationKey == null) {
|
||||
} else if (!pfafList.isEmpty()
|
||||
&& centeredAggregationKey == null) {
|
||||
guidance = guidRecords
|
||||
.get(guidType)
|
||||
.getBasinData(ALL)
|
||||
|
|
|
@ -353,11 +353,11 @@ public class ProductScriptsDialog extends CaveJFACEDialog {
|
|||
|
||||
start = start - 3;
|
||||
cmd = cmd.substring(0, start) + returnMsg;
|
||||
|
||||
TaskManager.getInstance().createScriptTask(name, cmd);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.getInstance().createScriptTask(name, cmd);
|
||||
|
||||
} catch (Exception e) {
|
||||
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(),
|
||||
e);
|
||||
|
|
|
@ -19,6 +19,7 @@
|
|||
**/
|
||||
package com.raytheon.viz.mpe.ui;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
|
@ -99,7 +100,8 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
|
|||
* ------------ ---------- ----------- --------------------------
|
||||
* Dec 18, 2012 mschenke Initial creation
|
||||
* 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>
|
||||
*
|
||||
|
@ -979,6 +981,13 @@ public class MPEDisplayManager {
|
|||
APPLICATION_NAME, cvUse, durationInHrs * 60 * 60, "E",
|
||||
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;
|
||||
float[] red = new float[numColors];
|
||||
float[] green = new float[numColors];
|
||||
|
@ -1002,6 +1011,9 @@ public class MPEDisplayManager {
|
|||
// display
|
||||
entry.setDisplayValue(dataToDisplay
|
||||
.convert((short) displayToData.convert(threshold)));
|
||||
if (displayField != DisplayFieldData.Index) {
|
||||
entry.setLabel(format.format(threshold));
|
||||
}
|
||||
}
|
||||
entry.setPixelValue((double) i);
|
||||
|
||||
|
@ -1022,7 +1034,7 @@ public class MPEDisplayManager {
|
|||
params.setColorMapMax(params.getDataMax());
|
||||
|
||||
// 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()
|
||||
.toArray(new MPERadarLoc[0]);
|
||||
DataMappingEntry[] entries = dm.getEntries().toArray(
|
||||
|
@ -1037,7 +1049,7 @@ public class MPEDisplayManager {
|
|||
entries[i].setLabel("");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return params;
|
||||
}
|
||||
|
|
|
@ -61,6 +61,8 @@ import com.raytheon.viz.ui.editor.IMultiPaneEditor;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Sep 23, 2008 randerso Initial creation
|
||||
* Apr 30, 2013 lbousaidi made seconds in the date/Time
|
||||
* fields visible.
|
||||
* </pre>
|
||||
*
|
||||
* @author randerso
|
||||
|
@ -259,7 +261,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
|
|||
lastSave = new Label(statusComp, SWT.NONE);
|
||||
lastSave.setText("NA");
|
||||
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
|
||||
data.widthHint = 120;
|
||||
data.widthHint = 140;
|
||||
lastSave.setLayoutData(data);
|
||||
|
||||
Label lab2 = new Label(statusComp, SWT.NONE);
|
||||
|
@ -268,7 +270,7 @@ public class ChooseDataPeriodDialog extends CaveJFACEDialog {
|
|||
lastExec = new Label(statusComp, SWT.NONE);
|
||||
lastExec.setText("NA");
|
||||
data = new GridData(SWT.DEFAULT, SWT.DEFAULT, false, false);
|
||||
data.widthHint = 120;
|
||||
data.widthHint = 140;
|
||||
lastExec.setLayoutData(data);
|
||||
|
||||
Label lab3 = new Label(statusComp, SWT.NONE);
|
||||
|
|
|
@ -69,6 +69,8 @@ import com.raytheon.viz.ui.dialogs.CaveSWTDialog;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* 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>
|
||||
*
|
||||
* @author randerso
|
||||
|
@ -179,8 +181,7 @@ public class Display7x7Dialog extends CaveSWTDialog {
|
|||
|
||||
if (gData != null) {
|
||||
workingGage = new MPEDataManager.MPEGageData();
|
||||
workingGage = gData;
|
||||
undoEn = true;
|
||||
workingGage = gData;
|
||||
} else if (editGage.containsKey(selectedGage.getId())) {
|
||||
workingGage = editGage.get(selectedGage.getId());
|
||||
undoEn = true;
|
||||
|
@ -482,6 +483,14 @@ public class Display7x7Dialog extends CaveSWTDialog {
|
|||
undoMissing.setEnabled(undoEn);
|
||||
String wid = workingGage.getId();
|
||||
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();
|
||||
workingGage.setManedit(true);
|
||||
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));
|
||||
if (gageVal.equalsIgnoreCase("bad")) {
|
||||
setBad.setText("Set Not Bad");
|
||||
}
|
||||
if (gageVal.equalsIgnoreCase("missing")) {
|
||||
setMissing.setEnabled(false);
|
||||
}
|
||||
}
|
||||
|
||||
undoMissing.setEnabled(false);
|
||||
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.ohd.AppsDefaults;
|
||||
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.DrawableString;
|
||||
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
|
||||
* 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.
|
||||
* Apr 19, 2013 1920 mpduff Fixed gage color contrast, add e to display value of manually edited gages.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -349,10 +351,10 @@ public class MPEGageResource extends AbstractMPEInputResource implements
|
|||
MPEDisplayManager.GageMissingOptions gm = MPEDisplayManager
|
||||
.getGageMissing();
|
||||
boolean displayIsEdit = false;
|
||||
if (paintProps.getDataTime() != null
|
||||
&& displayMgr.getCurrentEditDate() != null) {
|
||||
displayIsEdit = displayMgr.getCurrentEditDate().equals(
|
||||
paintProps.getDataTime().getRefTime());
|
||||
DataTime paintTime = paintProps.getFramesInfo().getCurrentFrame();
|
||||
Date editTime = displayMgr.getCurrentEditDate();
|
||||
if (paintTime != null && editTime != null) {
|
||||
displayIsEdit = editTime.equals(paintTime.getRefTime());
|
||||
}
|
||||
boolean xor = MPEDisplayManager.getGageColor() == GageColor.Contrast
|
||||
&& displayIsEdit;
|
||||
|
@ -420,6 +422,9 @@ public class MPEGageResource extends AbstractMPEInputResource implements
|
|||
}
|
||||
|
||||
if (isGageIdsDisplayed || isGageValuesDisplayed) {
|
||||
if (gageData.isManedit()) {
|
||||
gageValue = gageValue.concat("e");
|
||||
}
|
||||
DrawableString string = new DrawableString(
|
||||
new String[] { gageValue, gageId, }, gageColor);
|
||||
string.font = font;
|
||||
|
|
|
@ -71,6 +71,7 @@ import com.vividsolutions.jts.geom.Polygon;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Apr 8, 2009 snaples Initial creation
|
||||
* May 2, 2013 15970 snaples Updated setColor to use the correct color.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -96,7 +97,7 @@ public class PlotMeanAreaPrecipResource extends
|
|||
|
||||
private ColorMapParameters parameters = new ColorMapParameters();
|
||||
|
||||
private List<Colorvalue> colorSet;
|
||||
private final List<Colorvalue> colorSet;
|
||||
|
||||
public PlotMeanAreaPrecipResource(MPEDisplayManager displayMgr,
|
||||
List<Colorvalue> colorSet) {
|
||||
|
@ -542,12 +543,23 @@ public class PlotMeanAreaPrecipResource extends
|
|||
if (i == colorMap.getColors().size()) {
|
||||
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 (i == 0){
|
||||
gcol = convertC(colorMap.getColors().get(i));
|
||||
} else {
|
||||
gcol = convertC(colorMap.getColors().get(i - 1));
|
||||
}
|
||||
break;
|
||||
} else if (value < entry.getDisplayValue()) {
|
||||
gcol = convertC(colorMap.getColors().get(i));
|
||||
break;
|
||||
if (i == 0){
|
||||
gcol = convertC(colorMap.getColors().get(i));
|
||||
} else {
|
||||
gcol = convertC(colorMap.getColors().get(i - 1));
|
||||
}
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
|
|
@ -319,6 +319,7 @@ import com.raytheon.viz.ui.dialogs.SWTMessageBox;
|
|||
* is not a valid WMO heading.
|
||||
* 31JAN2013 1563 rferrel Force location of airport tooltip.
|
||||
* 31JAN2013 1568 rferrel Spell checker now tied to this dialog instead of parent.
|
||||
* 26Apr2013 16123 snaples Removed setFocus to TextEditor in postExecute method.
|
||||
* </pre>
|
||||
*
|
||||
* @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.
|
||||
*/
|
||||
private AtomicInteger updateCount = new AtomicInteger(0);
|
||||
private final AtomicInteger updateCount = new AtomicInteger(0);
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
private ProductQueryJob productQueryJob = new ProductQueryJob(this);
|
||||
private final ProductQueryJob productQueryJob = new ProductQueryJob(this);
|
||||
|
||||
/**
|
||||
* 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() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent event) {
|
||||
String tmp = afosCmdTF.getText();
|
||||
tmp = tmp.trim();
|
||||
|
@ -3253,6 +3256,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
});
|
||||
|
||||
wmoTtaaiiTF.addModifyListener(new ModifyListener() {
|
||||
@Override
|
||||
public void modifyText(ModifyEvent event) {
|
||||
if (wmoTtaaiiTF.getCaretPosition() == wmoTtaaiiTF
|
||||
.getTextLimit()) {
|
||||
|
@ -3262,10 +3266,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
});
|
||||
|
||||
wmoTtaaiiTF.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent event) {
|
||||
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
||||
ccccTF.setText(ccccTF.getText().toUpperCase());
|
||||
|
@ -3320,10 +3326,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
});
|
||||
|
||||
ccccTF.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent event) {
|
||||
wmoTtaaiiTF.setText(wmoTtaaiiTF.getText().toUpperCase());
|
||||
ccccTF.setText(ccccTF.getText().toUpperCase());
|
||||
|
@ -3381,10 +3389,12 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
});
|
||||
|
||||
awipsIdTF.addSelectionListener(new SelectionListener() {
|
||||
@Override
|
||||
public void widgetSelected(SelectionEvent event) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void widgetDefaultSelected(SelectionEvent event) {
|
||||
awipsIdTF.setText(awipsIdTF.getText().trim().toUpperCase());
|
||||
int charCount = awipsIdTF.getCharCount();
|
||||
|
@ -3794,6 +3804,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
// });
|
||||
|
||||
textEditor.addVerifyKeyListener(new VerifyKeyListener() {
|
||||
@Override
|
||||
public void verifyKey(VerifyEvent event) {
|
||||
// Ignore edit keys when not in edit mode.
|
||||
if (textEditor.getEditable() == false) {
|
||||
|
@ -3925,6 +3936,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
mi.setEnabled(isPopItemDefault[items.indexOf(pi)]);
|
||||
}
|
||||
mi.addListener(SWT.Selection, new Listener() {
|
||||
@Override
|
||||
public void handleEvent(Event event) {
|
||||
handleSelection(event);
|
||||
}
|
||||
|
@ -5769,6 +5781,7 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
/**
|
||||
* Set the dispaly model's AFOS command for this editor.
|
||||
*/
|
||||
@Override
|
||||
public void setAfosCmdField(String cmd) {
|
||||
afosCmdTF.setText(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.
|
||||
*/
|
||||
@Override
|
||||
public void executeCommand(ICommand command) {
|
||||
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
|
||||
* information.
|
||||
*/
|
||||
@Override
|
||||
public void requestDone(ICommand command,
|
||||
final List<StdTextProduct> prodList, final boolean isObsUpdated) {
|
||||
boolean enterEditor = false;
|
||||
|
@ -6012,11 +6027,6 @@ public class TextEditorDialog extends CaveSWTDialog implements VerifyListener,
|
|||
} else {
|
||||
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
|
||||
public void run() {
|
||||
getDisplay().syncExec(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!shell.isDisposed()) {
|
||||
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.
|
||||
* 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.
|
||||
* Apr 24, 2013 1944 jsanchez Updated calculateLocationPortion visibility to public.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -119,10 +120,26 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
|||
int gid = getGid(ptFields, attributes);
|
||||
ClosestPoint cp = new ClosestPoint(name, point, population, warngenlev,
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
|
@ -148,7 +165,8 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
|||
|
||||
/**
|
||||
* 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 attributes
|
||||
|
@ -158,17 +176,12 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
|||
private List<String> getPartOfArea(Set<String> ptFields,
|
||||
Map<String, Object> attributes, Geometry geom) {
|
||||
List<String> partOfArea = null;
|
||||
|
||||
String userDir = String.valueOf(attributes.get(useDirectionField))
|
||||
.toLowerCase();
|
||||
boolean userDirections = Boolean.valueOf(userDir)
|
||||
|| userDir.equals("t") || userDir.equals("1");
|
||||
if (userDirections) {
|
||||
if (useDirections(attributes.get(useDirectionField))) {
|
||||
PreparedGeometry prepGeom = PreparedGeometryFactory.prepare(geom);
|
||||
if (prepGeom.intersects(searchArea) && !prepGeom.within(searchArea)) {
|
||||
Geometry intersection = searchArea.intersection(geom);
|
||||
partOfArea = GisUtil.asStringList(calculateLocationPortion(
|
||||
geom, intersection, gc));
|
||||
geom, null, intersection, gc));
|
||||
|
||||
if (attributes.get(suppressedDirectionsField) != null) {
|
||||
String suppressedDirections = String.valueOf(
|
||||
|
@ -243,15 +256,20 @@ public class DbAreaSourceDataAdaptor extends AbstractDbSourceDataAdaptor {
|
|||
* Calculates the cardinal directions of a location.
|
||||
*
|
||||
* @param geom
|
||||
* @param point
|
||||
* @param intersection
|
||||
* @param gc
|
||||
* @return
|
||||
*/
|
||||
private static EnumSet<Direction> calculateLocationPortion(Geometry geom,
|
||||
Geometry intersection, GeodeticCalculator gc) {
|
||||
public static EnumSet<Direction> calculateLocationPortion(Geometry geom,
|
||||
Coordinate point, Geometry intersection, GeodeticCalculator gc) {
|
||||
EnumSet<Direction> directions = EnumSet.noneOf(Direction.class);
|
||||
Coordinate geomCentroid = geom.convexHull().getCentroid()
|
||||
.getCoordinate();
|
||||
Coordinate geomCentroid = null;
|
||||
if (point != null) {
|
||||
geomCentroid = point;
|
||||
} else {
|
||||
geomCentroid = geom.convexHull().getCentroid().getCoordinate();
|
||||
}
|
||||
Coordinate intersectCentroid = intersection.convexHull().getCentroid()
|
||||
.getCoordinate();
|
||||
|
||||
|
|
|
@ -73,6 +73,7 @@ import com.raytheon.viz.warngen.PreferenceUtil;
|
|||
import com.raytheon.viz.warngen.WarngenException;
|
||||
import com.raytheon.viz.warngen.config.AbstractDbSourceDataAdaptor;
|
||||
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.AdjustAngle;
|
||||
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.
|
||||
* 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.
|
||||
* Apr 24, 2013 1943 jsanchez Calculated partOfArea for a storm location over an urban bound area.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -723,10 +725,21 @@ public class Wx {
|
|||
latLonToLocal);
|
||||
|
||||
double distance = localDistanceGeom.distance(localPt);
|
||||
// Tests if storm location is over an urban bound area
|
||||
if (cp.prepGeom != null
|
||||
&& cp.prepGeom.intersects(stormLocation)) {
|
||||
distance = 0;
|
||||
// Tests if storm location is over an urban bound area even if
|
||||
// it may be outside the warning polygon
|
||||
if (cp.prepGeom != null && config.isTrackEnabled()
|
||||
&& 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 (allowDuplicates) {
|
||||
|
|
|
@ -58,6 +58,8 @@ import org.opengis.referencing.operation.MathTransform;
|
|||
import com.raytheon.uf.common.activetable.ActiveTableRecord;
|
||||
import com.raytheon.uf.common.dataplugin.warning.AbstractWarningRecord;
|
||||
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.DialogConfiguration;
|
||||
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/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/24/2013 1943 jsanchez Replaced used of areaConfig with areaSource.
|
||||
* </pre>
|
||||
*
|
||||
* @author mschenke
|
||||
|
@ -2562,8 +2565,13 @@ public class WarngenLayer extends AbstractStormTrackResource {
|
|||
}
|
||||
|
||||
private String getFips(GeospatialData data) {
|
||||
return (String) data.attributes.get(configuration.getAreaConfig()
|
||||
.getFipsField());
|
||||
for (AreaSourceConfiguration areaSource : configuration
|
||||
.getAreaSources()) {
|
||||
if (areaSource.getType() == AreaType.HATCHING) {
|
||||
return (String) data.attributes.get(areaSource.getFipsField());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String getFips(Geometry g) {
|
||||
|
|
|
@ -204,23 +204,14 @@ public class WrapUtil implements ICommonPatterns {
|
|||
|
||||
if (bestDelim != null) {
|
||||
failed = false;
|
||||
int next = indexIgnoringLockMarkers(line,
|
||||
bestP + bestDelim.length(), 0);
|
||||
int next = bestP + bestDelim.length();
|
||||
int segmentEnd = " ".equals(bestDelim) ? bestP : next;
|
||||
appendRTrim(line, start, segmentEnd, sb);
|
||||
start = splitEndOfLine(line, next, inBullet, sb);
|
||||
|
||||
// Remove any leading space at the start of the next line.
|
||||
while (next < line.length() && line.charAt(next) == ' ')
|
||||
next = indexIgnoringLockMarkers(line, next, 1);
|
||||
|
||||
if (next < line.length()) {
|
||||
sb.append('\n');
|
||||
if (inBullet) {
|
||||
sb.append(INDENT);
|
||||
allowLength = maxLength - INDENT.length();
|
||||
}
|
||||
if (inBullet) {
|
||||
allowLength = maxLength - INDENT.length();
|
||||
}
|
||||
start = next;
|
||||
} else if (! failed) {
|
||||
/*
|
||||
* Failed to wrap before the margin. Try again, wrapping the
|
||||
|
@ -316,4 +307,54 @@ public class WrapUtil implements ICommonPatterns {
|
|||
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
|
||||
* Feb 12, 2013 1500 mschenke Refactored to not request full records and only request full
|
||||
* record when actually retrieving for use
|
||||
* Apr 22, 2013 jsanchez Set the issue time for follow up warnings.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -303,6 +304,7 @@ public class CurrentWarnings {
|
|||
if (getAction(warning.getAct()) == WarningAction.EXT) {
|
||||
if (rval != null) {
|
||||
rval.setEndTime(warning.getEndTime());
|
||||
rval.setIssueTime(warning.getInsertTime());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -317,6 +319,7 @@ public class CurrentWarnings {
|
|||
rval.setUgczones(warning.getUgczones());
|
||||
rval.setLoc(warning.getLoc());
|
||||
rval.setRawmessage(warning.getRawmessage());
|
||||
rval.setIssueTime(warning.getInsertTime());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@ import com.raytheon.viz.warnings.DateUtil;
|
|||
* May 6, 2008 bwoodle Initial creation
|
||||
* Dec 28 2012 DR15599 mgamazaychikov Updated method getListCounties to fix the problem
|
||||
* with generated list of counties.
|
||||
* Apr 25,2013 1877 jsanchez Sorted the UGC line for cancellations.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -170,6 +171,7 @@ public class FipsUtil {
|
|||
}
|
||||
}
|
||||
|
||||
Collections.sort(countiesOrZones);
|
||||
rval.append(simplifyHeader(getUgcLine(countiesOrZones)));
|
||||
rval.append(du
|
||||
.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]");
|
||||
matchStr = "";
|
||||
for (String line : lines) {
|
||||
matchStr += line;
|
||||
matchStr += line;
|
||||
}
|
||||
|
||||
String[] ranges = matchStr.split("[-]");
|
||||
|
@ -376,12 +378,12 @@ public class FipsUtil {
|
|||
for (String range : ranges) {
|
||||
if (Character.isLetter(range.charAt(0))) {
|
||||
/*
|
||||
* range starts with a character - get the new
|
||||
* state or marine zone name
|
||||
* range starts with a character - get the new state or marine
|
||||
* zone name
|
||||
*/
|
||||
if (curState != null) {
|
||||
for (String zone: curList) {
|
||||
rval.add(curState+zone);
|
||||
for (String zone : curList) {
|
||||
rval.add(curState + zone);
|
||||
}
|
||||
}
|
||||
curState = range.substring(0, 3);
|
||||
|
@ -406,8 +408,8 @@ public class FipsUtil {
|
|||
}
|
||||
}
|
||||
if (curState != null) {
|
||||
for (String zone: curList) {
|
||||
rval.add(curState+zone);
|
||||
for (String zone : curList) {
|
||||
rval.add(curState + zone);
|
||||
}
|
||||
}
|
||||
return rval;
|
||||
|
|
|
@ -77,7 +77,8 @@ import com.vividsolutions.jts.geom.prep.PreparedGeometryFactory;
|
|||
* Sep 26, 2012 jsanchez Refactored AbstractWarningResource and AbstractWatchesResource into this class.
|
||||
* 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.
|
||||
*
|
||||
* Remove frameAltered condition in matchesFrame. It prevented entries from being displayed.
|
||||
* Check if geometry is null when inspecting.
|
||||
* </pre>
|
||||
*
|
||||
* @author jsanchez
|
||||
|
@ -106,8 +107,6 @@ public abstract class AbstractWWAResource extends
|
|||
|
||||
protected Date timeAltered;
|
||||
|
||||
protected Date frameAltered;
|
||||
|
||||
/**
|
||||
* was the alter a partial cancel? if it was then a matching CON should
|
||||
* be processed and added
|
||||
|
@ -218,7 +217,8 @@ public abstract class AbstractWWAResource extends
|
|||
|
||||
WarningEntry entry = entryMap.get(key);
|
||||
AbstractWarningRecord record = entry.record;
|
||||
if (matchesFrame(entry, time, framePeriod, lastFrame)) {
|
||||
if (matchesFrame(entry, time, framePeriod, lastFrame)
|
||||
&& record.getGeometry() != null) {
|
||||
|
||||
Geometry recordGeom = record.getGeometry();
|
||||
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
|
||||
} else if (entry.altered) {
|
||||
if (frameStart.getTime() >= refTime.getTime()
|
||||
&& frameStart.getTime() <= (entry.timeAltered.getTime())
|
||||
&& frameStart.getTime() < entry.frameAltered.getTime()) {
|
||||
&& frameStart.getTime() < entry.timeAltered.getTime()) {
|
||||
return true;
|
||||
}
|
||||
} 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
|
||||
* NEW warning when CAN warning is issued
|
||||
* 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>
|
||||
*
|
||||
* @author jsanchez
|
||||
|
@ -201,14 +202,21 @@ public class WarningsResource extends AbstractWWAResource {
|
|||
if (wfs != null) {
|
||||
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);
|
||||
geo = (Geometry) record.getGeometry().clone();
|
||||
|
||||
JTSCompiler jtsCompiler = new JTSCompiler(null, wfs, descriptor);
|
||||
jtsCompiler.handle(geo);
|
||||
wfs.compile();
|
||||
entry.wireframeShape = wfs;
|
||||
JTSCompiler jtsCompiler = new JTSCompiler(null, wfs,
|
||||
descriptor);
|
||||
jtsCompiler.handle(geo);
|
||||
wfs.compile();
|
||||
entry.wireframeShape = wfs;
|
||||
} else {
|
||||
// Prevents sampling and a label to be painted
|
||||
entry.record.setGeometry(null);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
statusHandler.handle(Priority.ERROR,
|
||||
"Error creating wireframe", e);
|
||||
|
@ -243,28 +251,18 @@ public class WarningsResource extends AbstractWWAResource {
|
|||
// changing end time
|
||||
entry.timeAltered = warnrec.getStartTime()
|
||||
.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
|
||||
// expiration time for
|
||||
// NEW warning when CAN warning is issued
|
||||
if (act == WarningAction.CAN
|
||||
&& WarningAction.valueOf(entry.record
|
||||
.getAct()) == WarningAction.CAN) {
|
||||
entry.record.setEndTime((Calendar) warnrec
|
||||
.getStartTime().clone());
|
||||
}
|
||||
|
||||
if (!rec.getCountyheader().equals(
|
||||
warnrec.getCountyheader())
|
||||
&& act == WarningAction.CAN) {
|
||||
entry.partialCancel = true;
|
||||
// expiration time for NEW warning when CAN
|
||||
// warning is issued
|
||||
if (act == WarningAction.CAN) {
|
||||
if (!rec.getCountyheader().equals(
|
||||
warnrec.getCountyheader())) {
|
||||
entry.partialCancel = true;
|
||||
} else {
|
||||
// complete cancellation
|
||||
createShape = warnrec;
|
||||
}
|
||||
}
|
||||
|
||||
// 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,
|
||||
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
||||
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):
|
||||
self.setupBLCube(t_FHAG2, t_BL030, t_BL3060, t_BL6090, t_BL90120,
|
||||
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
||||
|
@ -374,17 +374,17 @@ class DGEXForecaster(Forecaster):
|
|||
#
|
||||
# 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)
|
||||
#
|
||||
# off the DGEX gridpoints need no weather
|
||||
#
|
||||
wxgrid = zeros(self._empty.shape, dtype = byte)
|
||||
keys = ['<NoCov>:<NoWx>:<NoInten>:<NoVis>:', ]
|
||||
# wxgrid=where(less(sli_MB1000500,-18.0),0,wxgrid)
|
||||
wxgrid[less(sli_MB1000500, -18.0)] = 0
|
||||
# wxgrid=where(less(sli_MB0500,-18.0),0,wxgrid)
|
||||
wxgrid[less(sli_MB0500, -18.0)] = 0
|
||||
#
|
||||
# Match PoP, and remove non-occurring wx
|
||||
#
|
||||
|
@ -439,13 +439,13 @@ class DGEXForecaster(Forecaster):
|
|||
# the instability. SChc for LI <-1, Chc for LI<-3,
|
||||
# Lkly for LI<-5, Def for LI<-8
|
||||
#
|
||||
thunder = where(less_equal(sli_MB1000500, -1), 1, 0)
|
||||
# thunder=where(less_equal(sli_MB1000500,-3),2,thunder)
|
||||
# thunder=where(less_equal(sli_MB1000500,-5),3,thunder)
|
||||
# thunder=where(less_equal(sli_MB1000500,-8),4,thunder)
|
||||
thunder[less_equal(sli_MB1000500, -3)] = 2
|
||||
thunder[less_equal(sli_MB1000500, -5)] = 3
|
||||
thunder[less_equal(sli_MB1000500, -8)] = 4
|
||||
thunder = where(less_equal(sli_MB0500, -1), 1, 0)
|
||||
# thunder=where(less_equal(sli_MB0500,-3),2,thunder)
|
||||
# thunder=where(less_equal(sli_MB0500,-5),3,thunder)
|
||||
# thunder=where(less_equal(sli_MB0500,-8),4,thunder)
|
||||
thunder[less_equal(sli_MB0500, -3)] = 2
|
||||
thunder[less_equal(sli_MB0500, -5)] = 3
|
||||
thunder[less_equal(sli_MB0500, -8)] = 4
|
||||
|
||||
tprobs = ["None", "SChc", "Chc", "Lkly", "Def"]
|
||||
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,
|
||||
rh_BL90120, rh_BL120150, rh_BL150180, wind_FHAG10, wind_BL030,
|
||||
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,
|
||||
t_BL120150, t_BL150180, rh_FHAG2, rh_BL030, rh_BL3060, rh_BL6090,
|
||||
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
|
||||
# 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_MB1000500, -3), lal+1, lal)
|
||||
lal=where(less(sli_MB1000500, -5), lal+1, lal)
|
||||
lal=where(less(sli_MB0500, 0), lal+1, lal)
|
||||
lal=where(less(sli_MB0500, -3), lal+1, lal)
|
||||
lal=where(less(sli_MB0500, -5), lal+1, lal)
|
||||
#
|
||||
# Add more when RH at top of BL is greater than
|
||||
# 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))
|
||||
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
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
|
|
|
@ -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,
|
||||
d2dParmName);
|
||||
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));
|
||||
}
|
||||
|
||||
String uD2dParmName = getD2DParmName(uatts.getShort_name());
|
||||
String vD2dParmName = getD2DParmName(vatts.getShort_name());
|
||||
String uGfeParmName = uatts.getShort_name();
|
||||
String uD2dParmName = getD2DParmName(uGfeParmName);
|
||||
|
||||
String vGfeParmName = vatts.getShort_name();
|
||||
String vD2dParmName = getD2DParmName(vGfeParmName);
|
||||
|
||||
D2DParm d2dParm = new D2DParm(pid, gpi, possibleInventorySlots,
|
||||
uD2dParmName, vD2dParmName);
|
||||
this.gfeParms.put(pid, d2dParm);
|
||||
this.d2dParms.put(compositeName(uatts.getShort_name(), level), d2dParm);
|
||||
this.d2dParms.put(compositeName(vatts.getShort_name(), level), d2dParm);
|
||||
this.d2dParms.put(compositeName(uGfeParmName, level), d2dParm);
|
||||
this.d2dParms.put(compositeName(vGfeParmName, level), d2dParm);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -187,7 +187,7 @@ public class GfeIngestNotificationFilter {
|
|||
String otherComponent = null;
|
||||
String[] components = parm.getComponents();
|
||||
if (components.length > 1) {
|
||||
if (components[0].equals(gfeParamName)) {
|
||||
if (components[0].equals(d2dParamName)) {
|
||||
otherComponent = components[1];
|
||||
} else {
|
||||
otherComponent = components[0];
|
||||
|
@ -207,7 +207,7 @@ public class GfeIngestNotificationFilter {
|
|||
if (otherTimes == null
|
||||
|| !otherTimes.remove(fcstHour)) {
|
||||
// need to wait for other component
|
||||
ParmID compPid = new ParmID(gfeParamName,
|
||||
ParmID compPid = new ParmID(d2dParamName,
|
||||
parmID.getDbId(), parmID.getParmLevel());
|
||||
Set<Integer> times = windComps.get(compPid);
|
||||
if (times == null) {
|
||||
|
|
|
@ -249,13 +249,13 @@
|
|||
<Level key="FHAG4000">
|
||||
<DatabaseLevel levelName="FHAG" levelOneValue="4000.0" unit="m"/>
|
||||
</Level>
|
||||
<Level key="FHAG030">
|
||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="30.0" unit="m"/>
|
||||
<Level key="FHAG01000">
|
||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="1000.0" unit="m"/>
|
||||
</Level>
|
||||
<Level key="FHAG3000">
|
||||
<Level key="FHAG03000">
|
||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="3000.0" unit="m"/>
|
||||
</Level>
|
||||
<Level key="FHAG6000">
|
||||
<Level key="FHAG06000">
|
||||
<DatabaseLevel levelName="FHAG" levelOneValue="0.0" levelTwoValue="6000.0" unit="m"/>
|
||||
</Level>
|
||||
<Level key="FRZ">
|
||||
|
@ -399,9 +399,6 @@
|
|||
<Level key="MB1100">
|
||||
<DatabaseLevel levelName="MB" levelOneValue="1100.0" unit="hPa"/>
|
||||
</Level>
|
||||
<Level key="MB50100">
|
||||
<DatabaseLevel levelName="MB" levelOneValue="1000.0" levelTwoValue="500.0" unit="hPa"/>
|
||||
</Level>
|
||||
<Level key="MB0500">
|
||||
<DatabaseLevel levelName="MB" levelOneValue="1000.0" levelTwoValue="500.0" unit="hPa"/>
|
||||
</Level>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -417,7 +417,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -592,7 +592,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 6000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG6000</level>
|
||||
<level>FHAG06000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
<?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">
|
||||
<valtimeMINUSreftime>
|
||||
<fcst>0</fcst>
|
||||
|
@ -154,9 +160,9 @@
|
|||
<valid_range>1000.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG030</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
<?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">
|
||||
<valtimeMINUSreftime>
|
||||
<fcst>0</fcst>
|
||||
|
@ -154,9 +160,9 @@
|
|||
<valid_range>1000.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG030</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
|
|
@ -58,7 +58,7 @@
|
|||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG3000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
<?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">
|
||||
<valtimeMINUSreftime>
|
||||
<fcst>0</fcst>
|
||||
|
@ -56,9 +62,9 @@
|
|||
<valid_range>1000.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG030</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
|
|
@ -1,4 +1,10 @@
|
|||
<?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">
|
||||
<valtimeMINUSreftime>
|
||||
<fcst>0</fcst>
|
||||
|
@ -138,9 +144,9 @@
|
|||
<valid_range>1000.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>FHAG 0>30</levelsDesc>
|
||||
<levelsDesc>FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>FHAG030</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<gridParameterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="parameterInfo">
|
||||
|
@ -363,9 +369,9 @@
|
|||
<valid_range>20.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>MB 50>100</levelsDesc>
|
||||
<levelsDesc>MB 0>500</levelsDesc>
|
||||
<levels>
|
||||
<level>MB50100</level>
|
||||
<level>MB0500</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
</gridParamInfo>
|
||||
|
|
|
@ -49,9 +49,10 @@
|
|||
<valid_range>1000.0</valid_range>
|
||||
<fillValue>-99999.0</fillValue>
|
||||
<n3D>0</n3D>
|
||||
<levelsDesc>SFC</levelsDesc>
|
||||
<levelsDesc>FHAG 1000 FHAG 3000</levelsDesc>
|
||||
<levels>
|
||||
<level>SFC</level>
|
||||
<level>FHAG01000</level>
|
||||
<level>FHAG03000</level>
|
||||
</levels>
|
||||
</gridParameterInfo>
|
||||
<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
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Mar 29, 2012 #14691 Qinglu Lin Added feAreaField and its getter and setter, etc.
|
||||
* Apr 24, 2014 1943 jsanchez Removed unused areaType.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -39,13 +40,6 @@ public class AreaSourceConfiguration {
|
|||
@XmlElement
|
||||
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
|
||||
private String variable;
|
||||
|
||||
|
@ -277,12 +271,4 @@ public class AreaSourceConfiguration {
|
|||
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.
|
||||
* Aug 26, 2008 #1502 bclement Added JAXB annotations
|
||||
* May 26, 2010 #4649 Qinglu Lin Made including TO.A and SV.A mandatory
|
||||
* Apr 24, 2013 1943 jsanchez Marked areaConfig as Deprecated.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -83,6 +84,7 @@ public class WarngenConfiguration implements ISerializableObject {
|
|||
private AreaSourceConfiguration hatchedAreaSource;
|
||||
|
||||
@XmlElement
|
||||
@Deprecated
|
||||
private AreaConfiguration areaConfig;
|
||||
|
||||
@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
|
||||
// configuration files. 12.10 will drop the use of 'areaConfig'.
|
||||
// AreaConfiguration is deprecated. This is only meant for backwards
|
||||
// compatibility while areaConfig is phased out with updated templates from the template team.
|
||||
if (config.getAreaConfig() != null) {
|
||||
ArrayList<AreaSourceConfiguration> areaSources = null;
|
||||
|
||||
|
@ -217,18 +219,12 @@ public class WarngenConfiguration implements ISerializableObject {
|
|||
config.setAreaSources(areaSources
|
||||
.toArray(new AreaSourceConfiguration[areaSources.size()]));
|
||||
}
|
||||
// 12.9 section end
|
||||
|
||||
for (AreaSourceConfiguration asc : config.getAreaSources()) {
|
||||
if (asc.getAreaSource() == null) {
|
||||
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) {
|
||||
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
|
||||
*/
|
||||
@Deprecated
|
||||
public AreaConfiguration getAreaConfig() {
|
||||
return areaConfig;
|
||||
}
|
||||
|
@ -262,6 +262,7 @@ public class WarngenConfiguration implements ISerializableObject {
|
|||
* @param areaConfig
|
||||
* the areaConfig to set
|
||||
*/
|
||||
@Deprecated
|
||||
public void setAreaConfig(AreaConfiguration areaConfig) {
|
||||
this.areaConfig = areaConfig;
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ import java.awt.Point;
|
|||
import java.util.Arrays;
|
||||
import java.util.LinkedHashSet;
|
||||
|
||||
|
||||
import com.raytheon.uf.common.serialization.ISerializableObject;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerialize;
|
||||
import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
||||
|
@ -39,6 +40,7 @@ import com.raytheon.uf.common.serialization.annotations.DynamicSerializeElement;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Jul 27, 2009 chammack Initial creation
|
||||
* Jun 18, 2013 DR 15662 dhuffman Cross section terrain disappears if baseline is too short.
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -91,9 +93,26 @@ public class Request implements ISerializableObject {
|
|||
Request request = new Request();
|
||||
request.type = Type.POINT;
|
||||
request.points = new LinkedHashSet<Point>(Arrays.asList(points))
|
||||
.toArray(new Point[points.length]);
|
||||
.toArray(new Point[points.length]);
|
||||
|
||||
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.
|
||||
|
|
|
@ -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.Priority;
|
||||
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.vividsolutions.jts.geom.Coordinate;
|
||||
|
||||
|
@ -65,6 +64,8 @@ import com.vividsolutions.jts.geom.Coordinate;
|
|||
* Nov 19, 2011 dhladky Initial Creation.
|
||||
* Oct 09, 2012 15168 wkwock Fix incorrect values.
|
||||
* 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>
|
||||
*
|
||||
|
@ -96,6 +97,15 @@ public class MpeRUCFreezingLevel {
|
|||
public static String[] models = new String[] { "RUC236" };
|
||||
|
||||
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");
|
||||
|
||||
// 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
|
||||
* 02/01/13 1569 D. Hladky Added constants
|
||||
* 02/25/13 1660 D. Hladky FFTI design change to help mosaic processing.
|
||||
* 05/01/2013 15684 zhao Unlock when Exception caught
|
||||
* </pre>
|
||||
*
|
||||
* @author dhladky
|
||||
|
@ -363,13 +364,23 @@ public class FFMPProcessor {
|
|||
.getRawGeometries(dataKey,
|
||||
domain.getCwa());
|
||||
}
|
||||
|
||||
sbl = (new RadarSBLGenerator(config)
|
||||
.generate(sourceId,
|
||||
map.keySet(),
|
||||
cwaGeometries, radarRec));
|
||||
generator.setSourceBinList(sbl);
|
||||
isSBL = true;
|
||||
//DR15684
|
||||
try {
|
||||
sbl = (new RadarSBLGenerator(config)
|
||||
.generate(sourceId,
|
||||
map.keySet(),
|
||||
cwaGeometries, radarRec));
|
||||
} 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 {
|
||||
continue;
|
||||
|
|
|
@ -65,6 +65,7 @@ import com.vividsolutions.jts.geom.GeometryFactory;
|
|||
import com.vividsolutions.jts.geom.LinearRing;
|
||||
import com.vividsolutions.jts.geom.Point;
|
||||
import com.vividsolutions.jts.geom.Polygon;
|
||||
import com.vividsolutions.jts.geom.TopologyException;
|
||||
|
||||
/**
|
||||
* Creates a SourceBinList for given radar and set of basins.
|
||||
|
@ -75,6 +76,7 @@ import com.vividsolutions.jts.geom.Polygon;
|
|||
* Date Ticket# Engineer Description
|
||||
* ------------ ---------- ----------- --------------------------
|
||||
* Sep 6, 2011 10593 dfriedma Initial creation
|
||||
* May 1, 2013 15684 zhao Add code to handle possible TopologyException
|
||||
*
|
||||
* </pre>
|
||||
*
|
||||
|
@ -227,7 +229,15 @@ public class RadarSBLGenerator {
|
|||
if (i >= 0 && i < searchGridLen && j >= 0 && j < searchGridLen) {
|
||||
for (Long pfaf : searchGrid[j * searchGridLen + i]) {
|
||||
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;
|
||||
lastBasinGeometry = geom;
|
||||
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
|
||||
* nearest-neighbor resampling.i
|
||||
* 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>
|
||||
*
|
||||
|
@ -313,7 +314,7 @@ public class TopoQuery implements ITopoQuery {
|
|||
index += 2;
|
||||
}
|
||||
|
||||
Request request = Request.buildPointRequest(points);
|
||||
Request request = Request.buildXsectPointRequest(points);
|
||||
ShortDataRecord record = (ShortDataRecord) dataStore.retrieve("/",
|
||||
"full", request);
|
||||
short[] data = record.getShortData();
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
# Authors: Virgil Middendorf (BYZ), Steve Sigler (MSO) #
|
||||
# Contributers: Ahmad Garabi, Ken Sargeant, Dave Pike, Dave Rosenberg, #
|
||||
# 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 #
|
||||
# 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 #
|
||||
# awips1 code. #
|
||||
# 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
|
||||
# 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"
|
||||
|
||||
# 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
|
||||
mkdir -p ${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