extern "C" JNIEXPORT jint JNICALL Java_net_osmand_plus_render_NativeOsmandLibrary_searchNativeObjectsForRendering(JNIEnv* ienv, jobject obj, jint sleft, jint sright, jint stop, jint sbottom, jint zoom, jobject renderingRuleSearchRequest, bool skipDuplicates, jobject objInterrupted, jstring msgNothingFound) { RenderingRuleSearchRequest* req = initSearchRequest(ienv, renderingRuleSearchRequest); jclass clObjInterrupted = ienv->GetObjectClass(objInterrupted); jfieldID interruptedField = getFid(ienv, clObjInterrupted, "interrupted", "Z"); ienv->DeleteLocalRef(clObjInterrupted); SearchQuery q(sleft, sright, stop, sbottom, req, objInterrupted, interruptedField, ienv); q.zoom = zoom; SearchResult* res = searchObjectsForRendering(&q, req, skipDuplicates, getString(ienv, msgNothingFound)); delete req; return (jint) res; }
void runSimpleRendering( string renderingFileName, string resourceDir, RenderingInfo* info) { SkColor defaultMapColor = SK_ColorLTGRAY; if (info->width > 10000 || info->height > 10000) { osmand_log_print(LOG_ERROR, "We don't rendering images more than 10000x10000 "); return; } osmand_log_print(LOG_INFO, "Rendering info bounds(%d, %d, %d, %d) zoom(%d), width/height(%d/%d) tilewidth/tileheight(%d/%d) fileName(%s)", info->left, info->top, info->right, info->bottom, info->zoom, info->width, info->height, info->tileWX, info->tileHY, info->tileFileName.c_str()); RenderingRulesStorage* st = new RenderingRulesStorage(renderingFileName.c_str()); st->parseRulesFromXmlInputStream(renderingFileName.c_str(), NULL); RenderingRuleSearchRequest* searchRequest = new RenderingRuleSearchRequest(st); ResultPublisher* publisher = new ResultPublisher(); SearchQuery q(floor(info->left), floor(info->right), ceil(info->top), ceil(info->bottom), searchRequest, publisher); q.zoom = info->zoom; ResultPublisher* res = searchObjectsForRendering(&q, true, "Nothing found"); osmand_log_print(LOG_INFO, "Found %d objects", res->result.size()); SkBitmap* bitmap = new SkBitmap(); bitmap->setConfig(SkBitmap::kRGB_565_Config, info->width, info->height); size_t bitmapDataSize = bitmap->getSize(); void* bitmapData = malloc(bitmapDataSize); bitmap->setPixels(bitmapData); osmand_log_print(LOG_INFO, "Initializing rendering style and rendering context"); ElapsedTimer initObjects; initObjects.start(); RenderingContext rc; rc.setDefaultIconsDir(resourceDir); searchRequest->clearState(); searchRequest->setIntFilter(st->PROPS.R_MINZOOM, info->zoom); if (searchRequest->searchRenderingAttribute(A_DEFAULT_COLOR)) { defaultMapColor = searchRequest->getIntPropertyValue(searchRequest->props()->R_ATTR_COLOR_VALUE); } searchRequest->clearState(); searchRequest->setIntFilter(st->PROPS.R_MINZOOM, info->zoom); if (searchRequest->searchRenderingAttribute(A_SHADOW_RENDERING)) { rc.setShadowRenderingMode(searchRequest->getIntPropertyValue(searchRequest->props()->R_ATTR_INT_VALUE)); //rc.setShadowRenderingColor(searchRequest->getIntPropertyValue(searchRequest->props()->R_SHADOW_COLOR)); } rc.setLocation( ((double)info->left)/getPowZoom(31-info->zoom), ((double)info->top)/getPowZoom(31-info->zoom) ); rc.setDimension(info->width, info->height); rc.setZoom(info->zoom); rc.setRotate(0); rc.setDensityScale(1); osmand_log_print(LOG_INFO, "Rendering image"); initObjects.pause(); SkCanvas* canvas = new SkCanvas(*bitmap); canvas->drawColor(defaultMapColor); doRendering(res->result, canvas, searchRequest, &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()); SkImageEncoder* enc = SkImageEncoder::Create(SkImageEncoder::kPNG_Type); if (enc != NULL && !enc->encodeFile(info->tileFileName.c_str(), *bitmap, 100)) { osmand_log_print(LOG_ERROR, "FAIL to save tile to %s", info->tileFileName.c_str()); } else { osmand_log_print(LOG_INFO, "Tile successfully saved to %s", info->tileFileName.c_str()); } delete enc; delete publisher; delete searchRequest; delete st; delete canvas; delete bitmap; free(bitmapData); return; }