// Path: src/main/java/com/nextgis/maplib/api/IJSONStore.java
// public interface IJSONStore
// {
//     /**
//      * Store object in json
//      * @return json object with stored data
//      * @throws JSONException
//      */
//     JSONObject toJSON()
//             throws JSONException;
// 
//     /**
//      * Restore object from json
//      * @param jsonObject where the stored data are
//      * @throws JSONException
//      */
//     void fromJSON(JSONObject jsonObject)
//             throws JSONException;
// }
// 
// Path: src/main/java/com/nextgis/maplib/datasource/GeoGeometry.java
// public abstract class GeoGeometry
//         implements Serializable
// {
//     protected static final long serialVersionUID = -1241179697270831761L;
//     protected int mCRS;
// 
// 
//     public boolean project(int toCrs)
//     {
//         return (mCRS == CRS_WGS84 && toCrs == CRS_WEB_MERCATOR ||
//                 mCRS == CRS_WEB_MERCATOR && toCrs == CRS_WGS84) && rawProject(toCrs);
//     }
// 
// 
//     protected boolean rawProject(int toCrs)
//     {
//         mCRS = toCrs;
//         return true;
//     }
// 
// 
//     public abstract GeoEnvelope getEnvelope();
// 
// 
//     public void setCRS(int crs)
//     {
//         mCRS = crs;
//     }
// 
// 
//     public int getCRS()
//     {
//         return mCRS;
//     }
// 
// 
//     public JSONObject toJSON()
//             throws JSONException
//     {
//         JSONObject jsonOutObject = new JSONObject();
//         jsonOutObject.put(GEOJSON_TYPE, typeToJSON());
//         jsonOutObject.put(GEOJSON_COORDINATES, coordinatesToJSON());
// 
//         return jsonOutObject;
//     }
// 
// 
//     public String typeToJSON()
//     {
//         switch (getType()) {
//             case GTPoint:
//                 return GEOJSON_TYPE_Point;
//             case GTLineString:
//                 return GEOJSON_TYPE_LineString;
//             case GTPolygon:
//                 return GEOJSON_TYPE_Polygon;
//             case GTMultiPoint:
//                 return GEOJSON_TYPE_MultiPoint;
//             case GTMultiLineString:
//                 return GEOJSON_TYPE_MultiLineString;
//             case GTMultiPolygon:
//                 return GEOJSON_TYPE_MultiPolygon;
//             case GTGeometryCollection:
//                 return GEOJSON_TYPE_GeometryCollection;
//             case GTNone:
//             default:
//                 return "";
//         }
//     }
// 
// 
//     public abstract JSONArray coordinatesToJSON()
//             throws JSONException, ClassCastException;
// 
// 
//     public abstract int getType();
// 
// 
//     public abstract void setCoordinatesFromJSON(JSONArray coordinates)
//             throws JSONException;
// 
//     public abstract void setCoordinatesFromJSONStream(JsonReader reader, int crs)
//             throws IOException;
// 
//     public abstract void setCoordinatesFromWKT(String wkt, int crs);
// 
// 
//     public byte[] toBlobOld()
//             throws IOException
//     {
//         ByteArrayOutputStream out = new ByteArrayOutputStream();
//         ObjectOutputStream os = new ObjectOutputStream(out);
//         os.writeObject(this);
//         return out.toByteArray();
//     }
// 
// 
//     public byte[] toBlob()
//             throws IOException
//     {
//         ByteArrayOutputStream out = new ByteArrayOutputStream();
//         DataOutputStream dataOutputStream = new DataOutputStream(out);
//         write(dataOutputStream);
//         return out.toByteArray();
//     }
// 
// 
//     public abstract String toWKT(boolean full);
// 
// 
//     public boolean equals(Object o)
//     {
//         if (super.equals(o)) {
//             return true;
//         }
//         GeoGeometry other = (GeoGeometry) o;
//         return null != other && getType() == other.getType() && mCRS == other.getCRS();
//     }
// 
// 
//     public boolean intersects(GeoEnvelope envelope)
//     {
//         return getEnvelope().intersects(envelope);
//     }
// 
// 
//     /**
//      * Make deep copy of geometry
//      *
//      * @return The geometry copy
//      */
//     public abstract GeoGeometry copy();
// 
//     /**
//      * remove all points from geometry
//      */
//     public abstract void clear();
// 
//     public abstract GeoGeometry simplify(double tolerance);
// 
//     public abstract GeoGeometry clip(GeoEnvelope envelope);
// 
//     public void write(DataOutputStream stream) throws IOException{
//         stream.writeInt(getType());
//         stream.writeInt(mCRS);
//     }
// 
//     public void read(DataInputStream stream) throws IOException{
//         mCRS = stream.readInt();
//     }
// 
//     public abstract boolean isValid();
// 
//     public abstract double distance(GeoGeometry geometry);
// }


import static com.nextgis.maplib.util.Constants.JSON_COLOR_KEY;
import static com.nextgis.maplib.util.Constants.JSON_OUTALPHA_KEY;
import static com.nextgis.maplib.util.Constants.JSON_OUTCOLOR_KEY;
import static com.nextgis.maplib.util.Constants.JSON_WIDTH_KEY;
import com.nextgis.maplib.api.IJSONStore;
import com.nextgis.maplib.datasource.GeoGeometry;
import org.json.JSONException;
import org.json.JSONObject;
import static com.nextgis.maplib.util.Constants.JSON_ALPHA_KEY;
    public int getColor() {
        return mColor;
    }

    public void setColor(int color) {
        mColor = color;
    }

    public int getOutColor() {
        return mOutColor;
    }

    public void setOutColor(int outColor) {
        mOutColor = outColor;
    }

    public float getWidth() {
        return mWidth;
    }

    public void setWidth(float width) {
        mWidth = width;
    }

    public Style(final int color, int outColor) {
        this();
        mColor = color;
        mOutColor = outColor;
    }

// Path: src/main/java/com/nextgis/maplib/api/IJSONStore.java
// public interface IJSONStore
// {
//     /**
//      * Store object in json
//      * @return json object with stored data
//      * @throws JSONException
//      */
//     JSONObject toJSON()
//             throws JSONException;
// 
//     /**
//      * Restore object from json
//      * @param jsonObject where the stored data are
//      * @throws JSONException
//      */
//     void fromJSON(JSONObject jsonObject)
//             throws JSONException;
// }
// 
// Path: src/main/java/com/nextgis/maplib/datasource/GeoGeometry.java
// public abstract class GeoGeometry
//         implements Serializable
// {
//     protected static final long serialVersionUID = -1241179697270831761L;
//     protected int mCRS;
// 
// 
//     public boolean project(int toCrs)
//     {
//         return (mCRS == CRS_WGS84 && toCrs == CRS_WEB_MERCATOR ||
//                 mCRS == CRS_WEB_MERCATOR && toCrs == CRS_WGS84) && rawProject(toCrs);
//     }
// 
// 
//     protected boolean rawProject(int toCrs)
//     {
//         mCRS = toCrs;
//         return true;
//     }
// 
// 
//     public abstract GeoEnvelope getEnvelope();
// 
// 
//     public void setCRS(int crs)
//     {
//         mCRS = crs;
//     }
// 
// 
//     public int getCRS()
//     {
//         return mCRS;
//     }
// 
// 
//     public JSONObject toJSON()
//             throws JSONException
//     {
//         JSONObject jsonOutObject = new JSONObject();
//         jsonOutObject.put(GEOJSON_TYPE, typeToJSON());
//         jsonOutObject.put(GEOJSON_COORDINATES, coordinatesToJSON());
// 
//         return jsonOutObject;
//     }
// 
// 
//     public String typeToJSON()
//     {
//         switch (getType()) {
//             case GTPoint:
//                 return GEOJSON_TYPE_Point;
//             case GTLineString:
//                 return GEOJSON_TYPE_LineString;
//             case GTPolygon:
//                 return GEOJSON_TYPE_Polygon;
//             case GTMultiPoint:
//                 return GEOJSON_TYPE_MultiPoint;
//             case GTMultiLineString:
//                 return GEOJSON_TYPE_MultiLineString;
//             case GTMultiPolygon:
//                 return GEOJSON_TYPE_MultiPolygon;
//             case GTGeometryCollection:
//                 return GEOJSON_TYPE_GeometryCollection;
//             case GTNone:
//             default:
//                 return "";
//         }
//     }
// 
// 
//     public abstract JSONArray coordinatesToJSON()
//             throws JSONException, ClassCastException;
// 
// 
//     public abstract int getType();
// 
// 
//     public abstract void setCoordinatesFromJSON(JSONArray coordinates)
//             throws JSONException;
// 
//     public abstract void setCoordinatesFromJSONStream(JsonReader reader, int crs)
//             throws IOException;
// 
//     public abstract void setCoordinatesFromWKT(String wkt, int crs);
// 
// 
//     public byte[] toBlobOld()
//             throws IOException
//     {
//         ByteArrayOutputStream out = new ByteArrayOutputStream();
//         ObjectOutputStream os = new ObjectOutputStream(out);
//         os.writeObject(this);
//         return out.toByteArray();
//     }
// 
// 
//     public byte[] toBlob()
//             throws IOException
//     {
//         ByteArrayOutputStream out = new ByteArrayOutputStream();
//         DataOutputStream dataOutputStream = new DataOutputStream(out);
//         write(dataOutputStream);
//         return out.toByteArray();
//     }
// 
// 
//     public abstract String toWKT(boolean full);
// 
// 
//     public boolean equals(Object o)
//     {
//         if (super.equals(o)) {
//             return true;
//         }
//         GeoGeometry other = (GeoGeometry) o;
//         return null != other && getType() == other.getType() && mCRS == other.getCRS();
//     }
// 
// 
//     public boolean intersects(GeoEnvelope envelope)
//     {
//         return getEnvelope().intersects(envelope);
//     }
// 
// 
//     /**
//      * Make deep copy of geometry
//      *
//      * @return The geometry copy
//      */
//     public abstract GeoGeometry copy();
// 
//     /**
//      * remove all points from geometry
//      */
//     public abstract void clear();
// 
//     public abstract GeoGeometry simplify(double tolerance);
// 
//     public abstract GeoGeometry clip(GeoEnvelope envelope);
// 
//     public void write(DataOutputStream stream) throws IOException{
//         stream.writeInt(getType());
//         stream.writeInt(mCRS);
//     }
// 
//     public void read(DataInputStream stream) throws IOException{
//         mCRS = stream.readInt();
//     }
// 
//     public abstract boolean isValid();
// 
//     public abstract double distance(GeoGeometry geometry);
// }


// Path: src/main/java/com/nextgis/maplib/display/Style.java
import static com.nextgis.maplib.util.Constants.JSON_COLOR_KEY;
import static com.nextgis.maplib.util.Constants.JSON_OUTALPHA_KEY;
import static com.nextgis.maplib.util.Constants.JSON_OUTCOLOR_KEY;
import static com.nextgis.maplib.util.Constants.JSON_WIDTH_KEY;
import com.nextgis.maplib.api.IJSONStore;
import com.nextgis.maplib.datasource.GeoGeometry;
import org.json.JSONException;
import org.json.JSONObject;
import static com.nextgis.maplib.util.Constants.JSON_ALPHA_KEY;

    public int getColor() {
        return mColor;
    }

    public void setColor(int color) {
        mColor = color;
    }

    public int getOutColor() {
        return mOutColor;
    }

    public void setOutColor(int outColor) {
        mOutColor = outColor;
    }

    public float getWidth() {
        return mWidth;
    }

    public void setWidth(float width) {
        mWidth = width;
    }

    public Style(final int color, int outColor) {
        this();
        mColor = color;
        mOutColor = outColor;
    }

    public abstract void onDraw(GeoGeometry geoGeometry, GISDisplay display);