static void drawVertices(JNIEnv* env, jobject, jlong canvasHandle, jint modeHandle, jint vertexCount, jfloatArray jverts, jint vertIndex, jfloatArray jtexs, jint texIndex, jintArray jcolors, jint colorIndex, jshortArray jindices, jint indexIndex, jint indexCount, jlong paintHandle) { AutoJavaFloatArray vertA(env, jverts, vertIndex + vertexCount); AutoJavaFloatArray texA(env, jtexs, texIndex + vertexCount); AutoJavaIntArray colorA(env, jcolors, colorIndex + vertexCount); AutoJavaShortArray indexA(env, jindices, indexIndex + indexCount); const float* verts = vertA.ptr() + vertIndex; const float* texs = texA.ptr() + vertIndex; const int* colors = NULL; const uint16_t* indices = NULL; if (jcolors != NULL) { colors = colorA.ptr() + colorIndex; } if (jindices != NULL) { indices = (const uint16_t*)(indexA.ptr() + indexIndex); } SkCanvas::VertexMode mode = static_cast<SkCanvas::VertexMode>(modeHandle); const Paint* paint = reinterpret_cast<Paint*>(paintHandle); get_canvas(canvasHandle)->drawVertices(mode, vertexCount, verts, texs, colors, indices, indexCount, *paint); }
static void drawVertices(JNIEnv* env, jobject, SkCanvas* canvas, SkCanvas::VertexMode mode, int vertexCount, jfloatArray jverts, int vertIndex, jfloatArray jtexs, int texIndex, jintArray jcolors, int colorIndex, jshortArray jindices, int indexIndex, int indexCount, const SkPaint* paint) { AutoJavaFloatArray vertA(env, jverts, vertIndex + vertexCount); AutoJavaFloatArray texA(env, jtexs, texIndex + vertexCount); AutoJavaIntArray colorA(env, jcolors, colorIndex + vertexCount); AutoJavaShortArray indexA(env, jindices, indexIndex + indexCount); const int ptCount = vertexCount >> 1; SkPoint* verts; SkPoint* texs = NULL; #ifdef SK_SCALAR_IS_FLOAT verts = (SkPoint*)(vertA.ptr() + vertIndex); if (jtexs != NULL) { texs = (SkPoint*)(texA.ptr() + texIndex); } #else int count = ptCount; // for verts if (jtexs != NULL) { count += ptCount; // += for texs } SkAutoMalloc storage(count * sizeof(SkPoint)); verts = (SkPoint*)storage.get(); const float* src = vertA.ptr() + vertIndex; for (int i = 0; i < ptCount; i++) { verts[i].set(SkFloatToFixed(src[0]), SkFloatToFixed(src[1])); src += 2; } if (jtexs != NULL) { texs = verts + ptCount; src = texA.ptr() + texIndex; for (int i = 0; i < ptCount; i++) { texs[i].set(SkFloatToFixed(src[0]), SkFloatToFixed(src[1])); src += 2; } } #endif const SkColor* colors = NULL; const uint16_t* indices = NULL; if (jcolors != NULL) { colors = (const SkColor*)(colorA.ptr() + colorIndex); } if (jindices != NULL) { indices = (const uint16_t*)(indexA.ptr() + indexIndex); } canvas->drawVertices(mode, ptCount, verts, texs, colors, NULL, indices, indexCount, *paint); }
int main(int argc,const char* argv[]) { _START_EASYLOGGINGPP(argc,argv); el::Loggers::addFlag(el::LoggingFlag::ColoredTerminalOutput); el::Loggers::reconfigureAllLoggers(el::ConfigurationType::Format, "%datetime : %msg"); /* parse command line */ LOG(INFO) << "Parsing command line arguments"; cmdargs_t args = parse_args(argc,argv); /* parse the collection */ LOG(INFO) << "Parsing collection directory " << args.collection_dir; collection col(args.collection_dir); /* load pattern file */ auto patterns = pattern_parser::parse_file<false>(args.pattern_file); LOG(INFO) << "Parsed " << patterns.size() << " patterns from file " << args.pattern_file; /* filter patterns */ if (args.patterns_per_bucket != 0) { std::sort(patterns.begin(), patterns.end(), [](const pattern_t& a, const pattern_t& b) { return a.bucket < b.bucket; }); size_t freq = 0; size_t cnt = 0; size_t bucket = patterns[0].bucket; auto itr = patterns.begin(); while (itr != patterns.end()) { if (itr->bucket != bucket) { LOG(INFO) << "bucket = " << bucket << " cnt = " << cnt; bucket = itr->bucket; freq = 0; cnt = 0; } if (freq >= args.patterns_per_bucket) { itr = patterns.erase(itr); } else { itr++; cnt++; } freq++; } LOG(INFO) << "bucket = " << bucket << " cnt = " << cnt; LOG(INFO) << "Filtered " << patterns.size() << " patterns"; } /* load indexes and test */ using invidx_typeA = index_invidx<uniform_eliasfano_list<128>,optpfor_list<128,false>>; invidx_typeA indexA(col); using invidx_typeB = index_invidx<eliasfano_skip_list<64,true>,optpfor_list<128,false>>; invidx_typeB indexB(col); compare_index(indexA,indexB,patterns); return 0; }