Squashed 'third_party/allwpilib_2016/' content from commit 7f61816

Change-Id: If9d9245880859cdf580f5d7f77045135d0521ce7
git-subtree-dir: third_party/allwpilib_2016
git-subtree-split: 7f618166ed253a24629934fcf89c3decb0528a3b
diff --git a/wpilibc/Athena/include/Vision/VisionAPI.h b/wpilibc/Athena/include/Vision/VisionAPI.h
new file mode 100644
index 0000000..3153f1b
--- /dev/null
+++ b/wpilibc/Athena/include/Vision/VisionAPI.h
@@ -0,0 +1,172 @@
+/*----------------------------------------------------------------------------*/
+/* Copyright (c) FIRST 2014. All Rights Reserved.                             */
+/* Open Source Software - may be modified and shared by FRC teams. The code   */
+/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib.  */
+/*----------------------------------------------------------------------------*/
+
+#pragma once
+
+#include "nivision.h"
+
+/*   Constants */
+
+#define DEFAULT_BORDER_SIZE 3  // VisionAPI.frcCreateImage
+#define DEFAULT_SATURATION_THRESHOLD 40  // TrackAPI.FindColor
+
+/*   Forward Declare Data Structures */
+typedef struct FindEdgeOptions_struct FindEdgeOptions;
+typedef struct CircularEdgeReport_struct CircularEdgeReport;
+
+/*   Data Structures */
+
+/**  frcParticleAnalysis returns this structure */
+typedef struct ParticleAnalysisReport_struct {
+  int imageHeight;
+  int imageWidth;
+  double imageTimestamp;
+  int particleIndex;  // the particle index analyzed
+  /* X-coordinate of the point representing the average position of the
+   * total particle mass, assuming every point in the particle has a constant
+   * density */
+  int center_mass_x;  // MeasurementType: IMAQ_MT_CENTER_OF_MASS_X
+  /* Y-coordinate of the point representing the average position of the
+   * total particle mass, assuming every point in the particle has a constant
+   * density */
+  int center_mass_y;  // MeasurementType: IMAQ_MT_CENTER_OF_MASS_Y
+  double center_mass_x_normalized;  // Center of mass x value normalized to -1.0
+                                    // to +1.0 range
+  double center_mass_y_normalized;  // Center of mass y value normalized to -1.0
+                                    // to +1.0 range
+  /* Area of the particle */
+  double particleArea;  // MeasurementType: IMAQ_MT_AREA
+  /* Bounding Rectangle */
+  Rect boundingRect;  // left/top/width/height
+  /* Percentage of the particle Area covering the Image Area. */
+  double particleToImagePercent;  // MeasurementType: IMAQ_MT_AREA_BY_IMAGE_AREA
+  /* Percentage of the particle Area in relation to its Particle and Holes Area
+   */
+  double particleQuality;  // MeasurementType:
+                           // IMAQ_MT_AREA_BY_PARTICLE_AND_HOLES_AREA
+} ParticleAnalysisReport;
+
+/** Tracking functions return this structure */
+typedef struct ColorReport_struct {
+  int numberParticlesFound;   // Number of particles found for this color
+  int largestParticleNumber;  // The particle index of the largest particle
+  /* Color information */
+  float particleHueMax;   // HistogramReport: hue max
+  float particleHueMin;   // HistogramReport: hue max
+  float particleHueMean;  // HistogramReport: hue mean
+  float particleSatMax;   // HistogramReport: saturation max
+  float particleSatMin;   // HistogramReport: saturation max
+  float particleSatMean;  // HistogramReport: saturation mean
+  float particleLumMax;   // HistogramReport: luminance max
+  float particleLumMin;   // HistogramReport: luminance  max
+  float particleLumMean;  // HistogramReport: luminance mean
+} ColorReport;
+
+/*   Image Management functions */
+
+/* Create: calls imaqCreateImage. Border size is set to some default value */
+Image* frcCreateImage(ImageType type);
+
+/* Dispose: calls imaqDispose */
+int frcDispose(void* object);
+int frcDispose(const char* filename, ...);
+
+/* Copy: calls imaqDuplicateImage */
+int frcCopyImage(Image* dest, const Image* source);
+
+/* Image Extraction: Crop: calls imaqScale */
+int frcCrop(Image* dest, const Image* source, Rect rect);
+
+/* Image Extraction: Scale: calls imaqScale.  Scales entire image */
+int frcScale(Image* dest, const Image* source, int xScale, int yScale,
+             ScalingMode scaleMode);
+
+/* Read Image : calls imaqReadFile */
+int frcReadImage(Image* image, const char* fileName);
+/* Write Image : calls imaqWriteFile */
+int frcWriteImage(const Image* image, const char* fileName);
+
+/*   Measure Intensity functions */
+
+/* Histogram: calls imaqHistogram */
+HistogramReport* frcHistogram(const Image* image, int numClasses, float min,
+                              float max, Rect rect);
+/* Color Histogram: calls imaqColorHistogram2 */
+ColorHistogramReport* frcColorHistogram(const Image* image, int numClasses,
+                                        ColorMode mode, Image* mask);
+
+/* Get Pixel Value: calls imaqGetPixel */
+int frcGetPixelValue(const Image* image, Point pixel, PixelValue* value);
+
+/*   Particle Analysis functions */
+
+/* Particle Filter: calls imaqParticleFilter3 */
+int frcParticleFilter(Image* dest, Image* source,
+                      const ParticleFilterCriteria2* criteria,
+                      int criteriaCount, const ParticleFilterOptions* options,
+                      Rect rect, int* numParticles);
+int frcParticleFilter(Image* dest, Image* source,
+                      const ParticleFilterCriteria2* criteria,
+                      int criteriaCount, const ParticleFilterOptions* options,
+                      int* numParticles);
+/* Morphology: calls imaqMorphology */
+int frcMorphology(Image* dest, Image* source, MorphologyMethod method);
+int frcMorphology(Image* dest, Image* source, MorphologyMethod method,
+                  const StructuringElement* structuringElement);
+/* Reject Border: calls imaqRejectBorder */
+int frcRejectBorder(Image* dest, Image* source);
+int frcRejectBorder(Image* dest, Image* source, int connectivity8);
+/* Count Particles: calls imaqCountParticles */
+int frcCountParticles(Image* image, int* numParticles);
+/* Particle Analysis Report: calls imaqMeasureParticle */
+int frcParticleAnalysis(Image* image, int particleNumber,
+                        ParticleAnalysisReport* par);
+
+/*   Image Enhancement functions */
+
+/* Equalize: calls imaqEqualize */
+int frcEqualize(Image* dest, const Image* source, float min, float max);
+int frcEqualize(Image* dest, const Image* source, float min, float max,
+                const Image* mask);
+
+/* Color Equalize: calls imaqColorEqualize */
+int frcColorEqualize(Image* dest, const Image* source);
+int frcColorEqualize(Image* dest, const Image* source, int colorEqualization);
+
+/*   Image Thresholding & Conversion functions */
+
+/* Smart Threshold: calls imaqLocalThreshold */
+int frcSmartThreshold(Image* dest, const Image* source,
+                      unsigned int windowWidth, unsigned int windowHeight,
+                      LocalThresholdMethod method, double deviationWeight,
+                      ObjectType type);
+int frcSmartThreshold(Image* dest, const Image* source,
+                      unsigned int windowWidth, unsigned int windowHeight,
+                      LocalThresholdMethod method, double deviationWeight,
+                      ObjectType type, float replaceValue);
+
+/* Simple Threshold: calls imaqThreshold */
+int frcSimpleThreshold(Image* dest, const Image* source, float rangeMin,
+                       float rangeMax, float newValue);
+int frcSimpleThreshold(Image* dest, const Image* source, float rangeMin,
+                       float rangeMax);
+
+/* Color/Hue Threshold: calls imaqColorThreshold */
+int frcColorThreshold(Image* dest, const Image* source, ColorMode mode,
+                      const Range* plane1Range, const Range* plane2Range,
+                      const Range* plane3Range);
+int frcColorThreshold(Image* dest, const Image* source, int replaceValue,
+                      ColorMode mode, const Range* plane1Range,
+                      const Range* plane2Range, const Range* plane3Range);
+int frcHueThreshold(Image* dest, const Image* source, const Range* hueRange);
+int frcHueThreshold(Image* dest, const Image* source, const Range* hueRange,
+                    int minSaturation);
+
+/* Extract ColorHue Plane: calls imaqExtractColorPlanes */
+int frcExtractColorPlanes(const Image* image, ColorMode mode, Image* plane1,
+                          Image* plane2, Image* plane3);
+int frcExtractHuePlane(const Image* image, Image* huePlane);
+int frcExtractHuePlane(const Image* image, Image* huePlane, int minSaturation);