Refactoring Rendering context
This commit is contained in:
parent
f8e6288b63
commit
b79e23b468
6 changed files with 197 additions and 118 deletions
|
@ -30,9 +30,6 @@ IconDrawInfo::IconDrawInfo()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderingContext::RenderingContext()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
RenderingContext::~RenderingContext()
|
RenderingContext::~RenderingContext()
|
||||||
{
|
{
|
||||||
|
@ -48,14 +45,6 @@ bool RenderingContext::interrupted()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float getDensityValue(RenderingContext* rc, float val)
|
|
||||||
{
|
|
||||||
if (rc->highResMode && rc->density > 1)
|
|
||||||
return val * rc->density * rc->mapTextSize;
|
|
||||||
else
|
|
||||||
return val * rc->mapTextSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
ElapsedTimer::ElapsedTimer()
|
ElapsedTimer::ElapsedTimer()
|
||||||
: elapsedTime(0)
|
: elapsedTime(0)
|
||||||
, enableFlag(true)
|
, enableFlag(true)
|
||||||
|
@ -168,9 +157,6 @@ double checkLatitude(double latitude) {
|
||||||
return latitude;
|
return latitude;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline double toRadians(double angdeg) {
|
|
||||||
return angdeg / 180 * M_PI;
|
|
||||||
}
|
|
||||||
|
|
||||||
int get31TileNumberX(double longitude){
|
int get31TileNumberX(double longitude){
|
||||||
longitude = checkLongitude(longitude);
|
longitude = checkLongitude(longitude);
|
||||||
|
|
|
@ -91,6 +91,9 @@ using namespace std;
|
||||||
|
|
||||||
struct RenderingContext;
|
struct RenderingContext;
|
||||||
|
|
||||||
|
inline double toRadians(double angdeg) {
|
||||||
|
return angdeg / 180 * M_PI;
|
||||||
|
}
|
||||||
|
|
||||||
class ElapsedTimer
|
class ElapsedTimer
|
||||||
{
|
{
|
||||||
|
@ -150,18 +153,9 @@ struct IconDrawInfo
|
||||||
|
|
||||||
struct RenderingContext
|
struct RenderingContext
|
||||||
{
|
{
|
||||||
RenderingContext();
|
private :
|
||||||
virtual ~RenderingContext();
|
// parameters
|
||||||
|
|
||||||
virtual bool interrupted();
|
|
||||||
virtual SkBitmap* getCachedBitmap(const std::string& bitmapResource);
|
|
||||||
virtual std::string getTranslatedString(const std::string& src);
|
|
||||||
bool useEnglishNames;
|
bool useEnglishNames;
|
||||||
|
|
||||||
std::vector<TextDrawInfo*> textToDraw;
|
|
||||||
std::vector<IconDrawInfo> iconsToDraw;
|
|
||||||
bool highResMode;
|
|
||||||
float mapTextSize;
|
|
||||||
float density;
|
float density;
|
||||||
|
|
||||||
float leftX;
|
float leftX;
|
||||||
|
@ -171,8 +165,13 @@ struct RenderingContext
|
||||||
|
|
||||||
int zoom;
|
int zoom;
|
||||||
float rotate;
|
float rotate;
|
||||||
float tileDivisor;
|
// int shadowRenderingMode = 0; // no shadow (minumum CPU)
|
||||||
|
// int shadowRenderingMode = 1; // classic shadow (the implementaton in master)
|
||||||
|
// int shadowRenderingMode = 2; // blur shadow (most CPU, but still reasonable)
|
||||||
|
// int shadowRenderingMode = 3; solid border (CPU use like classic version or even smaller)
|
||||||
|
int shadowRenderingMode;
|
||||||
|
|
||||||
|
public:
|
||||||
// debug purpose
|
// debug purpose
|
||||||
int pointCount;
|
int pointCount;
|
||||||
int pointInsideCount;
|
int pointInsideCount;
|
||||||
|
@ -182,22 +181,102 @@ struct RenderingContext
|
||||||
class ElapsedTimer textRendering;
|
class ElapsedTimer textRendering;
|
||||||
class ElapsedTimer nativeOperations;
|
class ElapsedTimer nativeOperations;
|
||||||
|
|
||||||
// use to calculate points
|
// because they used in 3rd party functions
|
||||||
float calcX;
|
public :
|
||||||
float calcY;
|
static const int TILE_SIZE = 256;
|
||||||
|
|
||||||
|
|
||||||
|
// calculated
|
||||||
|
float tileDivisor;
|
||||||
float cosRotateTileSize;
|
float cosRotateTileSize;
|
||||||
float sinRotateTileSize;
|
float sinRotateTileSize;
|
||||||
|
|
||||||
int shadowRenderingMode;
|
std::vector<TextDrawInfo*> textToDraw;
|
||||||
|
std::vector<IconDrawInfo> iconsToDraw;
|
||||||
|
// use to calculate points
|
||||||
|
float calcX;
|
||||||
|
float calcY;
|
||||||
|
|
||||||
// not expect any shadow
|
// not expect any shadow
|
||||||
int shadowLevelMin;
|
int shadowLevelMin;
|
||||||
int shadowLevelMax;
|
int shadowLevelMax;
|
||||||
|
|
||||||
};
|
public:
|
||||||
|
RenderingContext() : shadowLevelMax(0), shadowLevelMin(256), density(true), useEnglishNames(false){
|
||||||
|
setRotate(0);
|
||||||
|
setZoom(15);
|
||||||
|
}
|
||||||
|
virtual ~RenderingContext();
|
||||||
|
|
||||||
float getDensityValue(RenderingContext* rc, float val);
|
virtual bool interrupted();
|
||||||
|
virtual SkBitmap* getCachedBitmap(const std::string& bitmapResource);
|
||||||
|
virtual std::string getTranslatedString(const std::string& src);
|
||||||
|
|
||||||
|
void setZoom(int z) {
|
||||||
|
this->zoom = z;
|
||||||
|
this->tileDivisor = (1 << (31 - z));
|
||||||
|
}
|
||||||
|
void setRotate(float rot) {
|
||||||
|
this->rotate = rot;
|
||||||
|
this->cosRotateTileSize = cos(toRadians(rot)) * TILE_SIZE;
|
||||||
|
this->sinRotateTileSize = sin(toRadians(rot)) * TILE_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setLocation(double leftX, double topY) {
|
||||||
|
this->leftX = leftX;
|
||||||
|
this->topY = topY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDimension(int width, int height) {
|
||||||
|
this->width = width;
|
||||||
|
this->height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int getShadowRenderingMode(){
|
||||||
|
return shadowRenderingMode;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int getWidth(){
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int getHeight(){
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline int getZoom() {
|
||||||
|
return zoom;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float getLeft() {
|
||||||
|
return leftX;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline float getTop() {
|
||||||
|
return topY;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setShadowRenderingMode(int mode){
|
||||||
|
this->shadowRenderingMode = mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setDensityScale(float val) {
|
||||||
|
density = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getDensityValue(float val) {
|
||||||
|
return val * density;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setUseEnglishNames(bool b){
|
||||||
|
this->useEnglishNames = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isUsingEnglishNames(){
|
||||||
|
return this->useEnglishNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
SkBitmap* getCachedBitmap(RenderingContext* rc, const std::string& bitmapResource);
|
SkBitmap* getCachedBitmap(RenderingContext* rc, const std::string& bitmapResource);
|
||||||
|
|
||||||
|
|
|
@ -32,8 +32,6 @@ extern "C" JNIEXPORT void JNICALL Java_net_osmand_plus_render_NativeOsmandLibrar
|
||||||
jobject obj, jint searchResult) {
|
jobject obj, jint searchResult) {
|
||||||
ResultPublisher* result = (ResultPublisher*) searchResult;
|
ResultPublisher* result = (ResultPublisher*) searchResult;
|
||||||
if(result != NULL){
|
if(result != NULL){
|
||||||
// destructor will delete result
|
|
||||||
// deleteObjects(result->result);
|
|
||||||
delete result;
|
delete result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -177,7 +175,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLib
|
||||||
RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest);
|
RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest);
|
||||||
JNIRenderingContext rc;
|
JNIRenderingContext rc;
|
||||||
pullFromJavaRenderingContext(ienv, renderingContext, &rc);
|
pullFromJavaRenderingContext(ienv, renderingContext, &rc);
|
||||||
rc.useEnglishNames = useEnglishNames;
|
rc.setUseEnglishNames(useEnglishNames);
|
||||||
ResultPublisher* result = ((ResultPublisher*) searchResult);
|
ResultPublisher* result = ((ResultPublisher*) searchResult);
|
||||||
// std::vector <BaseMapDataObject* > mapDataObjects = marshalObjects(binaryMapDataObjects);
|
// std::vector <BaseMapDataObject* > mapDataObjects = marshalObjects(binaryMapDataObjects);
|
||||||
|
|
||||||
|
@ -263,7 +261,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_net_osmand_plus_render_NativeOsmandLib
|
||||||
RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest);
|
RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest);
|
||||||
JNIRenderingContext rc;
|
JNIRenderingContext rc;
|
||||||
pullFromJavaRenderingContext(ienv, renderingContext, &rc);
|
pullFromJavaRenderingContext(ienv, renderingContext, &rc);
|
||||||
rc.useEnglishNames = useEnglishNames;
|
rc.setUseEnglishNames(useEnglishNames);
|
||||||
ResultPublisher* result = ((ResultPublisher*) searchResult);
|
ResultPublisher* result = ((ResultPublisher*) searchResult);
|
||||||
// std::vector <BaseMapDataObject* > mapDataObjects = marshalObjects(binaryMapDataObjects);
|
// std::vector <BaseMapDataObject* > mapDataObjects = marshalObjects(binaryMapDataObjects);
|
||||||
|
|
||||||
|
@ -329,8 +327,6 @@ jfieldID jfield_RenderingContext_density = NULL;
|
||||||
jfieldID jfield_RenderingContext_highResMode = NULL;
|
jfieldID jfield_RenderingContext_highResMode = NULL;
|
||||||
jfieldID jfield_RenderingContext_mapTextSize = NULL;
|
jfieldID jfield_RenderingContext_mapTextSize = NULL;
|
||||||
jfieldID jfield_RenderingContext_shadowRenderingMode = NULL;
|
jfieldID jfield_RenderingContext_shadowRenderingMode = NULL;
|
||||||
jfieldID jfield_RenderingContext_shadowLevelMin = NULL;
|
|
||||||
jfieldID jfield_RenderingContext_shadowLevelMax = NULL;
|
|
||||||
jfieldID jfield_RenderingContext_ctx = NULL;
|
jfieldID jfield_RenderingContext_ctx = NULL;
|
||||||
jfieldID jfield_RenderingContext_textRenderingTime = NULL;
|
jfieldID jfield_RenderingContext_textRenderingTime = NULL;
|
||||||
jfieldID jfield_RenderingContext_lastRenderedKey = NULL;
|
jfieldID jfield_RenderingContext_lastRenderedKey = NULL;
|
||||||
|
@ -356,8 +352,6 @@ void loadJniRenderingContext(JNIEnv* env)
|
||||||
jfield_RenderingContext_highResMode = getFid(env, jclass_RenderingContext, "highResMode", "Z" );
|
jfield_RenderingContext_highResMode = getFid(env, jclass_RenderingContext, "highResMode", "Z" );
|
||||||
jfield_RenderingContext_mapTextSize = getFid(env, jclass_RenderingContext, "mapTextSize", "F" );
|
jfield_RenderingContext_mapTextSize = getFid(env, jclass_RenderingContext, "mapTextSize", "F" );
|
||||||
jfield_RenderingContext_shadowRenderingMode = getFid(env, jclass_RenderingContext, "shadowRenderingMode", "I" );
|
jfield_RenderingContext_shadowRenderingMode = getFid(env, jclass_RenderingContext, "shadowRenderingMode", "I" );
|
||||||
jfield_RenderingContext_shadowLevelMin = getFid(env, jclass_RenderingContext, "shadowLevelMin", "I" );
|
|
||||||
jfield_RenderingContext_shadowLevelMax = getFid(env, jclass_RenderingContext, "shadowLevelMax", "I" );
|
|
||||||
jfield_RenderingContext_ctx = getFid(env, jclass_RenderingContext, "ctx", "Landroid/content/Context;" );
|
jfield_RenderingContext_ctx = getFid(env, jclass_RenderingContext, "ctx", "Landroid/content/Context;" );
|
||||||
jfield_RenderingContext_textRenderingTime = getFid(env, jclass_RenderingContext, "textRenderingTime", "I" );
|
jfield_RenderingContext_textRenderingTime = getFid(env, jclass_RenderingContext, "textRenderingTime", "I" );
|
||||||
jfield_RenderingContext_lastRenderedKey = getFid(env, jclass_RenderingContext, "lastRenderedKey", "I" );
|
jfield_RenderingContext_lastRenderedKey = getFid(env, jclass_RenderingContext, "lastRenderedKey", "I" );
|
||||||
|
@ -374,32 +368,22 @@ void loadJniRenderingContext(JNIEnv* env)
|
||||||
void pullFromJavaRenderingContext(JNIEnv* env, jobject jrc, JNIRenderingContext* rc)
|
void pullFromJavaRenderingContext(JNIEnv* env, jobject jrc, JNIRenderingContext* rc)
|
||||||
{
|
{
|
||||||
rc->env = env;
|
rc->env = env;
|
||||||
rc->leftX = env->GetFloatField( jrc, jfield_RenderingContext_leftX );
|
rc->setLocation(env->GetFloatField( jrc, jfield_RenderingContext_leftX ), env->GetFloatField( jrc, jfield_RenderingContext_topY ));
|
||||||
rc->topY = env->GetFloatField( jrc, jfield_RenderingContext_topY );
|
rc->setDimension(env->GetIntField( jrc, jfield_RenderingContext_width ), env->GetIntField( jrc, jfield_RenderingContext_height ));
|
||||||
rc->width = env->GetIntField( jrc, jfield_RenderingContext_width );
|
|
||||||
rc->height = env->GetIntField( jrc, jfield_RenderingContext_height );
|
|
||||||
|
|
||||||
rc->zoom = env->GetIntField( jrc, jfield_RenderingContext_zoom );
|
rc->setZoom(env->GetIntField( jrc, jfield_RenderingContext_zoom ));
|
||||||
rc->rotate = env->GetFloatField( jrc, jfield_RenderingContext_rotate );
|
rc->setRotate(env->GetFloatField( jrc, jfield_RenderingContext_rotate ));
|
||||||
rc->tileDivisor = env->GetFloatField( jrc, jfield_RenderingContext_tileDivisor );
|
|
||||||
|
|
||||||
rc->pointCount = env->GetIntField( jrc, jfield_RenderingContext_pointCount );
|
float density = env->GetFloatField( jrc, jfield_RenderingContext_density );
|
||||||
rc->pointInsideCount = env->GetIntField( jrc, jfield_RenderingContext_pointInsideCount );
|
bool highResMode = env->GetBooleanField( jrc, jfield_RenderingContext_highResMode );
|
||||||
rc->visible = env->GetIntField( jrc, jfield_RenderingContext_visible );
|
float mapTextSize = env->GetFloatField( jrc, jfield_RenderingContext_mapTextSize );
|
||||||
rc->allObjects = env->GetIntField( jrc, jfield_RenderingContext_allObjects );
|
if (highResMode && density > 1) {
|
||||||
|
rc->setDensityScale(density * mapTextSize);
|
||||||
rc->cosRotateTileSize = env->GetFloatField( jrc, jfield_RenderingContext_cosRotateTileSize );
|
} else {
|
||||||
rc->sinRotateTileSize = env->GetFloatField( jrc, jfield_RenderingContext_sinRotateTileSize );
|
rc->setDensityScale(mapTextSize);
|
||||||
rc->density = env->GetFloatField( jrc, jfield_RenderingContext_density );
|
}
|
||||||
rc->highResMode = env->GetBooleanField( jrc, jfield_RenderingContext_highResMode );
|
rc->setShadowRenderingMode(env->GetIntField( jrc, jfield_RenderingContext_shadowRenderingMode ));
|
||||||
rc->mapTextSize = env->GetFloatField( jrc, jfield_RenderingContext_mapTextSize );
|
|
||||||
|
|
||||||
rc->shadowRenderingMode = env->GetIntField( jrc, jfield_RenderingContext_shadowRenderingMode );
|
|
||||||
rc->shadowLevelMin = env->GetIntField( jrc, jfield_RenderingContext_shadowLevelMin );
|
|
||||||
rc->shadowLevelMax = env->GetIntField( jrc, jfield_RenderingContext_shadowLevelMax );
|
|
||||||
rc->androidContext = env->GetObjectField(jrc, jfield_RenderingContext_ctx );
|
rc->androidContext = env->GetObjectField(jrc, jfield_RenderingContext_ctx );
|
||||||
rc->lastRenderedKey = 0;
|
|
||||||
|
|
||||||
rc->javaRenderingContext = jrc;
|
rc->javaRenderingContext = jrc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,7 +441,7 @@ SkBitmap* JNIRenderingContext::getCachedBitmap(const std::string& bitmapResource
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string JNIRenderingContext::getTranslatedString(const std::string& name) {
|
std::string JNIRenderingContext::getTranslatedString(const std::string& name) {
|
||||||
if (this->useEnglishNames) {
|
if (this->isUsingEnglishNames()) {
|
||||||
jstring n = this->env->NewStringUTF(name.c_str());
|
jstring n = this->env->NewStringUTF(name.c_str());
|
||||||
std::string res = getString(this->env,
|
std::string res = getString(this->env,
|
||||||
(jstring) this->env->CallStaticObjectMethod(jclass_JUnidecode, jmethod_JUnidecode_unidecode, n));
|
(jstring) this->env->CallStaticObjectMethod(jclass_JUnidecode, jmethod_JUnidecode_unidecode, n));
|
||||||
|
|
|
@ -123,6 +123,43 @@ void printFileInformation(const char* fileName, VerboseInfo* verbose) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SkColor defaultMapColor = SK_ColorLTGRAY;
|
||||||
|
void runSimpleRendering(int zoom, int left, int right, int top, int bottom, int rowBytes) {
|
||||||
|
// TODO
|
||||||
|
initBinaryMapFile("");
|
||||||
|
// TODO not implemented (read storage from file)
|
||||||
|
RenderingRulesStorage* st = NULL; //createRenderingRulesStorage(env, storage);
|
||||||
|
RenderingRuleSearchRequest* req = new RenderingRuleSearchRequest(st);
|
||||||
|
// TODO init rule search request
|
||||||
|
// initRenderingRuleSearchRequest(env, res, renderingRuleSearchRequest);
|
||||||
|
|
||||||
|
SearchQuery q(left, right, top, bottom, req, new ResultPublisher());
|
||||||
|
q.zoom = zoom;
|
||||||
|
ResultPublisher* res = searchObjectsForRendering(&q, req, true, "Nothing found");
|
||||||
|
|
||||||
|
SkBitmap* bitmap = new SkBitmap();
|
||||||
|
bitmap->setConfig(SkBitmap::kRGB_565_Config, 800, 800, rowBytes);
|
||||||
|
// size_t bitmapDataSize = bitmap->getSize();
|
||||||
|
// void* bitmapData bitmapData = malloc(bitmapDataSize);
|
||||||
|
// bitmap->setPixels(bitmapData);
|
||||||
|
|
||||||
|
osmand_log_print(LOG_INFO, "Initializing rendering");
|
||||||
|
ElapsedTimer initObjects;
|
||||||
|
initObjects.start();
|
||||||
|
|
||||||
|
RenderingContext rc;
|
||||||
|
osmand_log_print(LOG_INFO, "Rendering image");
|
||||||
|
initObjects.pause();
|
||||||
|
SkCanvas* canvas = new SkCanvas(*bitmap);
|
||||||
|
canvas->drawColor(defaultMapColor);
|
||||||
|
doRendering(res->result, canvas, req, &rc);
|
||||||
|
|
||||||
|
osmand_log_print(LOG_INFO, "End Rendering image");
|
||||||
|
osmand_log_print(LOG_INFO, "Native ok (init %d, rendering %d) ", initObjects.getElapsedTime(),
|
||||||
|
rc.nativeOperations.getElapsedTime());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
if (argc <= 1) {
|
if (argc <= 1) {
|
||||||
printUsage("");
|
printUsage("");
|
||||||
|
|
|
@ -34,12 +34,12 @@ void calcPoint(std::pair<int, int> c, RenderingContext* rc)
|
||||||
float tx = c.first/ (rc->tileDivisor);
|
float tx = c.first/ (rc->tileDivisor);
|
||||||
float ty = c.second / (rc->tileDivisor);
|
float ty = c.second / (rc->tileDivisor);
|
||||||
|
|
||||||
float dTileX = tx - rc->leftX;
|
float dTileX = tx - rc->getLeft();
|
||||||
float dTileY = ty - rc->topY;
|
float dTileY = ty - rc->getTop();
|
||||||
rc->calcX = rc->cosRotateTileSize * dTileX - rc->sinRotateTileSize * dTileY;
|
rc->calcX = rc->cosRotateTileSize * dTileX - rc->sinRotateTileSize * dTileY;
|
||||||
rc->calcY = rc->sinRotateTileSize * dTileX + rc->cosRotateTileSize * dTileY;
|
rc->calcY = rc->sinRotateTileSize * dTileX + rc->cosRotateTileSize * dTileY;
|
||||||
|
|
||||||
if (rc->calcX >= 0 && rc->calcX < rc->width && rc->calcY >= 0 && rc->calcY < rc->height)
|
if (rc->calcX >= 0 && rc->calcX < rc->getWidth()&& rc->calcY >= 0 && rc->calcY < rc->getHeight())
|
||||||
rc->pointInsideCount++;
|
rc->pointInsideCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ int updatePaint(RenderingRuleSearchRequest* req, SkPaint* paint, int ind, int ar
|
||||||
}
|
}
|
||||||
|
|
||||||
// do not check shadow color here
|
// do not check shadow color here
|
||||||
if (rc->shadowRenderingMode == 1 && ind == 0)
|
if (rc->getShadowRenderingMode() == 1 && ind == 0)
|
||||||
{
|
{
|
||||||
int shadowColor = req->getIntPropertyValue(req->props()->R_SHADOW_COLOR);
|
int shadowColor = req->getIntPropertyValue(req->props()->R_SHADOW_COLOR);
|
||||||
int shadowLayer = req->getIntPropertyValue(req->props()->R_SHADOW_RADIUS);
|
int shadowLayer = req->getIntPropertyValue(req->props()->R_SHADOW_RADIUS);
|
||||||
|
@ -187,7 +187,7 @@ void renderText(MapDataObject* obj, RenderingRuleSearchRequest* req, RenderingCo
|
||||||
if (it->second.length() > 0) {
|
if (it->second.length() > 0) {
|
||||||
std::string name = it->second;
|
std::string name = it->second;
|
||||||
name =rc->getTranslatedString(name);
|
name =rc->getTranslatedString(name);
|
||||||
req->setInitialTagValueZoom(tag, value, rc->zoom, obj);
|
req->setInitialTagValueZoom(tag, value, rc->getZoom(), obj);
|
||||||
req->setIntFilter(req->props()->R_TEXT_LENGTH, name.length());
|
req->setIntFilter(req->props()->R_TEXT_LENGTH, name.length());
|
||||||
std::string tagName = it->first == "name" ? "" : it->first;
|
std::string tagName = it->first == "name" ? "" : it->first;
|
||||||
req->setStringFilter(req->props()->R_NAME_TAG, tagName);
|
req->setStringFilter(req->props()->R_NAME_TAG, tagName);
|
||||||
|
@ -211,7 +211,7 @@ void renderText(MapDataObject* obj, RenderingRuleSearchRequest* req, RenderingCo
|
||||||
void drawPolylineShadow(SkCanvas* cv, SkPaint* paint, RenderingContext* rc, SkPath* path, int shadowColor, int shadowRadius)
|
void drawPolylineShadow(SkCanvas* cv, SkPaint* paint, RenderingContext* rc, SkPath* path, int shadowColor, int shadowRadius)
|
||||||
{
|
{
|
||||||
// blurred shadows
|
// blurred shadows
|
||||||
if (rc->shadowRenderingMode == 2 && shadowRadius > 0) {
|
if (rc->getShadowRenderingMode() == 2 && shadowRadius > 0) {
|
||||||
// simply draw shadow? difference from option 3 ?
|
// simply draw shadow? difference from option 3 ?
|
||||||
// paint->setColor(0xffffffff);
|
// paint->setColor(0xffffffff);
|
||||||
paint->setLooper(new SkBlurDrawLooper(shadowRadius, 0, 0, shadowColor))->unref();
|
paint->setLooper(new SkBlurDrawLooper(shadowRadius, 0, 0, shadowColor))->unref();
|
||||||
|
@ -219,7 +219,7 @@ void drawPolylineShadow(SkCanvas* cv, SkPaint* paint, RenderingContext* rc, SkPa
|
||||||
}
|
}
|
||||||
|
|
||||||
// option shadow = 3 with solid border
|
// option shadow = 3 with solid border
|
||||||
if (rc->shadowRenderingMode == 3 && shadowRadius > 0) {
|
if (rc->getShadowRenderingMode() == 3 && shadowRadius > 0) {
|
||||||
paint->setLooper(NULL);
|
paint->setLooper(NULL);
|
||||||
paint->setStrokeWidth(paint->getStrokeWidth() + shadowRadius * 2);
|
paint->setStrokeWidth(paint->getStrokeWidth() + shadowRadius * 2);
|
||||||
// paint->setColor(0xffbababa);
|
// paint->setColor(0xffbababa);
|
||||||
|
@ -281,14 +281,14 @@ void drawPolyline(MapDataObject* mObj, RenderingRuleSearchRequest* req, SkCanvas
|
||||||
std::string tag = pair.first;
|
std::string tag = pair.first;
|
||||||
std::string value = pair.second;
|
std::string value = pair.second;
|
||||||
|
|
||||||
req->setInitialTagValueZoom(tag, value, rc->zoom, mObj);
|
req->setInitialTagValueZoom(tag, value, rc->getZoom(), mObj);
|
||||||
req->setIntFilter(req->props()->R_LAYER, layer);
|
req->setIntFilter(req->props()->R_LAYER, layer);
|
||||||
bool rendered = req->searchRule(2);
|
bool rendered = req->searchRule(2);
|
||||||
if (!rendered || !updatePaint(req, paint, 0, 0, rc)) {
|
if (!rendered || !updatePaint(req, paint, 0, 0, rc)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int oneway = 0;
|
int oneway = 0;
|
||||||
if (rc->zoom >= 16 && pair.first == "highway") {
|
if (rc->getZoom() >= 16 && pair.first == "highway") {
|
||||||
if (mObj->containsAdditional("oneway", "yes")) {
|
if (mObj->containsAdditional("oneway", "yes")) {
|
||||||
oneway = 1;
|
oneway = 1;
|
||||||
} else if (mObj->containsAdditional("oneway", "-1")) {
|
} else if (mObj->containsAdditional("oneway", "-1")) {
|
||||||
|
@ -345,7 +345,7 @@ void drawPolygon(MapDataObject* mObj, RenderingRuleSearchRequest* req, SkCanvas*
|
||||||
std::string tag = pair.first;
|
std::string tag = pair.first;
|
||||||
std::string value = pair.second;
|
std::string value = pair.second;
|
||||||
|
|
||||||
req->setInitialTagValueZoom(tag, value, rc->zoom, mObj);
|
req->setInitialTagValueZoom(tag, value, rc->getZoom(), mObj);
|
||||||
bool rendered = req->searchRule(3);
|
bool rendered = req->searchRule(3);
|
||||||
|
|
||||||
float xText = 0;
|
float xText = 0;
|
||||||
|
@ -397,7 +397,7 @@ void drawPoint(MapDataObject* mObj, RenderingRuleSearchRequest* req, SkCanvas* c
|
||||||
std::string tag = pair.first;
|
std::string tag = pair.first;
|
||||||
std::string value = pair.second;
|
std::string value = pair.second;
|
||||||
|
|
||||||
req->setInitialTagValueZoom(tag, value, rc->zoom, mObj);
|
req->setInitialTagValueZoom(tag, value, rc->getZoom(), mObj);
|
||||||
req->searchRule(1);
|
req->searchRule(1);
|
||||||
std::string resId = req->getStringPropertyValue(req-> props()-> R_ICON);
|
std::string resId = req->getStringPropertyValue(req-> props()-> R_ICON);
|
||||||
SkBitmap* bmp = getCachedBitmap(rc, resId);
|
SkBitmap* bmp = getCachedBitmap(rc, resId);
|
||||||
|
@ -452,9 +452,9 @@ void drawObject(RenderingContext* rc, MapDataObject* mObj, SkCanvas* cv, Renderi
|
||||||
|
|
||||||
void drawIconsOverCanvas(RenderingContext* rc, SkCanvas* canvas)
|
void drawIconsOverCanvas(RenderingContext* rc, SkCanvas* canvas)
|
||||||
{
|
{
|
||||||
int skewConstant = (int) getDensityValue(rc, 16);
|
int skewConstant = (int) rc->getDensityValue(16);
|
||||||
int iconsW = rc -> width / skewConstant;
|
int iconsW = rc -> getWidth() / skewConstant;
|
||||||
int iconsH = rc -> height / skewConstant;
|
int iconsH = rc -> getHeight() / skewConstant;
|
||||||
int len = (iconsW * iconsH) / 32;
|
int len = (iconsW * iconsH) / 32;
|
||||||
int alreadyDrawnIcons[len];
|
int alreadyDrawnIcons[len];
|
||||||
memset(alreadyDrawnIcons, 0, sizeof(int)*len);
|
memset(alreadyDrawnIcons, 0, sizeof(int)*len);
|
||||||
|
@ -464,30 +464,26 @@ void drawIconsOverCanvas(RenderingContext* rc, SkCanvas* canvas)
|
||||||
for(;ji< rc->iconsToDraw.size(); ji++)
|
for(;ji< rc->iconsToDraw.size(); ji++)
|
||||||
{
|
{
|
||||||
IconDrawInfo icon = rc->iconsToDraw.at(ji);
|
IconDrawInfo icon = rc->iconsToDraw.at(ji);
|
||||||
if (icon.y >= 0 && icon.y < rc -> height && icon.x >= 0 && icon.x < rc -> width &&
|
if (icon.y >= 0 && icon.y < rc->getHeight() && icon.x >= 0 && icon.x < rc->getWidth() && icon.bmp != NULL) {
|
||||||
icon.bmp != NULL) {
|
int z = (((int) icon.x / skewConstant) + ((int) icon.y / skewConstant) * iconsW);
|
||||||
int z = (((int) icon.x / skewConstant) + ((int) icon.y / skewConstant) * iconsW);
|
int i = z / 32;
|
||||||
int i = z / 32;
|
if (i >= len) {
|
||||||
if (i >= len) {
|
continue;
|
||||||
continue;
|
}
|
||||||
}
|
int ind = alreadyDrawnIcons[i];
|
||||||
int ind = alreadyDrawnIcons[i];
|
int b = z % 32;
|
||||||
int b = z % 32;
|
// check bit b if it is set
|
||||||
// check bit b if it is set
|
if (((ind >> b) & 1) == 0) {
|
||||||
if (((ind >> b) & 1) == 0) {
|
alreadyDrawnIcons[i] = ind | (1 << b);
|
||||||
alreadyDrawnIcons[i] = ind | (1 << b);
|
SkBitmap* ico = icon.bmp;
|
||||||
SkBitmap* ico = icon.bmp;
|
float left = icon.x - rc->getDensityValue(ico->width() / 2);
|
||||||
if(rc->highResMode) {
|
float top = icon.y - rc->getDensityValue(ico->height() / 2);
|
||||||
float left = icon.x - getDensityValue(rc, ico->width() / 2);
|
SkRect r = SkRect::MakeXYWH(left, top, rc->getDensityValue(ico->width()),
|
||||||
float top = icon.y - getDensityValue(rc, ico->height() / 2);
|
rc->getDensityValue(ico->height()));
|
||||||
SkRect r = SkRect::MakeXYWH(left, top, getDensityValue(rc, ico->width()), getDensityValue(rc, ico->height()));
|
PROFILE_NATIVE_OPERATION(rc, canvas->drawBitmapRect(*ico, (SkIRect*) NULL, r, &p));
|
||||||
PROFILE_NATIVE_OPERATION(rc, canvas->drawBitmapRect(*ico, (SkIRect*) NULL, r, &p));
|
}
|
||||||
} else {
|
|
||||||
PROFILE_NATIVE_OPERATION(rc, canvas->drawBitmap(*ico, icon.x - ico->width() / 2, icon.y - ico->height() / 2, &p));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if(rc->interrupted()){
|
if (rc->interrupted()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -508,7 +504,7 @@ HMAP::hash_map<int, std::vector<int> > sortObjectsByProperOrder(std::vector <Map
|
||||||
for (; j < sizeTypes; j++) {
|
for (; j < sizeTypes; j++) {
|
||||||
int layer = mobj->getSimpleLayer();
|
int layer = mobj->getSimpleLayer();
|
||||||
tag_value pair = mobj->types[j];
|
tag_value pair = mobj->types[j];
|
||||||
req->setTagValueZoomLayer(pair.first, pair.second, rc->zoom, layer, mobj);
|
req->setTagValueZoomLayer(pair.first, pair.second, rc->getZoom(), layer, mobj);
|
||||||
req->setIntFilter(req->props()->R_AREA, mobj->area);
|
req->setIntFilter(req->props()->R_AREA, mobj->area);
|
||||||
req->setIntFilter(req->props()->R_POINT, mobj->points.size() == 1);
|
req->setIntFilter(req->props()->R_POINT, mobj->points.size() == 1);
|
||||||
req->setIntFilter(req->props()->R_CYCLE, mobj->cycle());
|
req->setIntFilter(req->props()->R_CYCLE, mobj->cycle());
|
||||||
|
@ -548,7 +544,7 @@ void doRendering(std::vector <MapDataObject* > mapDataObjects, SkCanvas* canvas,
|
||||||
bool shadowDrawn = false;
|
bool shadowDrawn = false;
|
||||||
|
|
||||||
for (std::set<int>::iterator ks = keys.begin(); ks != keys.end(); ks++) {
|
for (std::set<int>::iterator ks = keys.begin(); ks != keys.end(); ks++) {
|
||||||
if (!shadowDrawn && *ks >= rc->shadowLevelMin && *ks <= rc->shadowLevelMax && rc->shadowRenderingMode > 1) {
|
if (!shadowDrawn && *ks >= rc->shadowLevelMin && *ks <= rc->shadowLevelMax && rc->getShadowRenderingMode() > 1) {
|
||||||
for (std::set<int>::iterator ki = ks; ki != keys.end(); ki++) {
|
for (std::set<int>::iterator ki = ks; ki != keys.end(); ki++) {
|
||||||
if (*ki > rc->shadowLevelMax || rc->interrupted()) {
|
if (*ki > rc->shadowLevelMax || rc->interrupted()) {
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -227,8 +227,8 @@ bool calculatePathToRotate(RenderingContext* rc, TextDrawInfo* p) {
|
||||||
|
|
||||||
float normalTextLen = 1.5 * textw;
|
float normalTextLen = 1.5 * textw;
|
||||||
for (i = 0; i < len; i++) {
|
for (i = 0; i < len; i++) {
|
||||||
bool inside = points[i].fX >= 0 && points[i].fX <= rc->width &&
|
bool inside = points[i].fX >= 0 && points[i].fX <= rc->getWidth() &&
|
||||||
points[i].fY >= 0 && points[i].fY <= rc->height;
|
points[i].fY >= 0 && points[i].fY <= rc->getHeight();
|
||||||
if (i > 0) {
|
if (i > 0) {
|
||||||
float d = sqrt(
|
float d = sqrt(
|
||||||
(points[i].fX - points[i - 1].fX) * (points[i].fX - points[i - 1].fX)
|
(points[i].fX - points[i - 1].fX) * (points[i].fX - points[i - 1].fX)
|
||||||
|
@ -411,7 +411,7 @@ bool findTextIntersection(SkCanvas* cv, RenderingContext* rc, quad_tree<TextDraw
|
||||||
SkPaint* paintText, SkPaint* paintIcon) {
|
SkPaint* paintText, SkPaint* paintIcon) {
|
||||||
paintText->measureText(text->text.c_str(), text->text.length(), &text->bounds);
|
paintText->measureText(text->text.c_str(), text->text.length(), &text->bounds);
|
||||||
// make wider
|
// make wider
|
||||||
text->bounds.inset(-getDensityValue(rc, 3), -getDensityValue(rc, 10));
|
text->bounds.inset(-rc->getDensityValue( 3), -rc->getDensityValue(10));
|
||||||
|
|
||||||
bool display = calculatePathToRotate(rc, text);
|
bool display = calculatePathToRotate(rc, text);
|
||||||
if (!display) {
|
if (!display) {
|
||||||
|
@ -437,7 +437,7 @@ bool findTextIntersection(SkCanvas* cv, RenderingContext* rc, quad_tree<TextDraw
|
||||||
}
|
}
|
||||||
if(text->minDistance > 0) {
|
if(text->minDistance > 0) {
|
||||||
SkRect boundsSearch = text->bounds;
|
SkRect boundsSearch = text->bounds;
|
||||||
boundsSearch.inset(-getDensityValue(rc, max(5.0f, text->minDistance)), -getDensityValue(rc, 15));
|
boundsSearch.inset(-rc->getDensityValue(max(5.0f, text->minDistance)), -rc->getDensityValue(15));
|
||||||
boundIntersections.query_in_box(boundsSearch, searchText);
|
boundIntersections.query_in_box(boundsSearch, searchText);
|
||||||
// drawTestBox(cv, &boundsSearch, text->pathRotate, paintIcon, text->text, paintText);
|
// drawTestBox(cv, &boundsSearch, text->pathRotate, paintIcon, text->text, paintText);
|
||||||
for (uint i = 0; i < searchText.size(); i++) {
|
for (uint i = 0; i < searchText.size(); i++) {
|
||||||
|
@ -460,7 +460,7 @@ bool textOrder(TextDrawInfo* text1, TextDrawInfo* text2) {
|
||||||
|
|
||||||
SkTypeface* serif = SkTypeface::CreateFromName("Droid Serif", SkTypeface::kNormal);
|
SkTypeface* serif = SkTypeface::CreateFromName("Droid Serif", SkTypeface::kNormal);
|
||||||
void drawTextOverCanvas(RenderingContext* rc, SkCanvas* cv) {
|
void drawTextOverCanvas(RenderingContext* rc, SkCanvas* cv) {
|
||||||
SkRect r = SkRect::MakeLTRB(0, 0, rc->width, rc->height);
|
SkRect r = SkRect::MakeLTRB(0, 0, rc->getWidth(), rc->getHeight());
|
||||||
r.inset(-100, -100);
|
r.inset(-100, -100);
|
||||||
quad_tree<TextDrawInfo*> boundsIntersect(r, 4, 0.6);
|
quad_tree<TextDrawInfo*> boundsIntersect(r, 4, 0.6);
|
||||||
|
|
||||||
|
@ -484,7 +484,7 @@ void drawTextOverCanvas(RenderingContext* rc, SkCanvas* cv) {
|
||||||
TextDrawInfo* text = rc->textToDraw.at(i);
|
TextDrawInfo* text = rc->textToDraw.at(i);
|
||||||
if (text->text.length() > 0) {
|
if (text->text.length() > 0) {
|
||||||
// sest text size before finding intersection (it is used there)
|
// sest text size before finding intersection (it is used there)
|
||||||
float textSize = getDensityValue(rc, text->textSize);
|
float textSize = rc->getDensityValue(text->textSize);
|
||||||
paintText.setTextSize(textSize);
|
paintText.setTextSize(textSize);
|
||||||
paintText.setFakeBoldText(text->bold);
|
paintText.setFakeBoldText(text->bold);
|
||||||
paintText.setColor(text->textColor);
|
paintText.setColor(text->textColor);
|
||||||
|
@ -520,15 +520,12 @@ void drawTextOverCanvas(RenderingContext* rc, SkCanvas* cv) {
|
||||||
if (text->shieldRes.length() > 0) {
|
if (text->shieldRes.length() > 0) {
|
||||||
SkBitmap* ico = getCachedBitmap(rc, text->shieldRes);
|
SkBitmap* ico = getCachedBitmap(rc, text->shieldRes);
|
||||||
if (ico != NULL) {
|
if (ico != NULL) {
|
||||||
if(rc->highResMode) {
|
float left = text->centerX - rc->getDensityValue(ico->width() / 2) - 0.5f;
|
||||||
float left = text->centerX - getDensityValue(rc, ico->width() / 2) - 0.5f;
|
float top = text->centerY - rc->getDensityValue(ico->height() / 2)
|
||||||
float top =text->centerY - getDensityValue(rc, ico->height() / 2) - getDensityValue(rc, 4.5f);
|
- rc->getDensityValue(4.5f);
|
||||||
SkRect r = SkRect::MakeXYWH(left, top, getDensityValue(rc, ico->width()), getDensityValue(rc, ico->height()));
|
SkRect r = SkRect::MakeXYWH(left, top, rc->getDensityValue(ico->width()),
|
||||||
PROFILE_NATIVE_OPERATION(rc, cv->drawBitmapRect(*ico, (SkIRect*) NULL, r, &paintIcon));
|
rc->getDensityValue(ico->height()));
|
||||||
} else {
|
PROFILE_NATIVE_OPERATION(rc, cv->drawBitmapRect(*ico, (SkIRect*) NULL, r, &paintIcon));
|
||||||
PROFILE_NATIVE_OPERATION(rc, cv->drawBitmap(*ico, text->centerX - ico->width() / 2 - 0.5f,
|
|
||||||
text->centerY - ico->height() / 2 - getDensityValue(rc, 4.5f), &paintIcon));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drawWrappedText(rc, cv, text, textSize, paintText);
|
drawWrappedText(rc, cv, text, textSize, paintText);
|
||||||
|
|
Loading…
Reference in a new issue