/* * Class: org_coolreader_crengine_Engine * Method: drawBookCoverInternal * Signature: (Landroid/graphics/Bitmap;[BLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V */ JNIEXPORT void JNICALL Java_org_coolreader_crengine_Engine_drawBookCoverInternal (JNIEnv * _env, jobject _engine, jobject bitmap, jbyteArray _data, jstring _fontFace, jstring _title, jstring _authors, jstring _seriesName, jint seriesNumber, jint bpp) { CRJNIEnv env(_env); //CRLog::debug("drawBookCoverInternal called"); lString8 fontFace = UnicodeToUtf8(env.fromJavaString(_fontFace)); lString16 title = env.fromJavaString(_title); lString16 authors = env.fromJavaString(_authors); lString16 seriesName = env.fromJavaString(_seriesName); LVStreamRef stream; LVImageSourceRef image; if (_data != NULL && _env->GetArrayLength(_data) > 0) { stream = env.jbyteArrayToStream(_data); if (!stream.isNull()) image = LVCreateStreamImageSource(stream); } LVDrawBuf * drawbuf = BitmapAccessorInterface::getInstance()->lock(_env, bitmap); if (drawbuf != NULL) { int factor = 1; int dx = drawbuf->GetWidth(); int dy = drawbuf->GetHeight(); int MIN_WIDTH = 300; int MIN_HEIGHT = 400; if (dx < MIN_WIDTH || dy < MIN_HEIGHT) { if (dx * 2 < MIN_WIDTH || dy * 2 < MIN_HEIGHT) { dx *= 3; dy *= 3; factor = 3; } else { dx *= 2; dy *= 2; factor = 2; } } LVDrawBuf * drawbuf2 = drawbuf; if (factor > 1) drawbuf2 = new LVColorDrawBuf(dx, dy, drawbuf->GetBitsPerPixel()); if (bpp >= 16) { // native color resolution LVDrawBookCover(*drawbuf2, image, fontFace, title, authors, seriesName, seriesNumber); } else { LVGrayDrawBuf grayBuf(drawbuf2->GetWidth(), drawbuf2->GetHeight(), bpp); LVDrawBookCover(grayBuf, image, fontFace, title, authors, seriesName, seriesNumber); grayBuf.DrawTo(drawbuf2, 0, 0, 0, NULL); } if (factor > 1) { drawbuf->DrawRescaled(drawbuf2, 0, 0, drawbuf->GetWidth(), drawbuf->GetHeight(), 0); delete drawbuf2; } //CRLog::trace("getPageImageInternal calling bitmap->unlock"); BitmapAccessorInterface::getInstance()->unlock(_env, bitmap, drawbuf); } else { CRLog::error("bitmap accessor is invalid"); } //CRLog::debug("drawBookCoverInternal finished"); }
bool getPageImageTexture(LVDocView * docview, int width, int height, int bpp, PageImageTextureInfo & ti) { ti.textureId = 0; ti.dx = width; ti.dy = height; ti.tdx = nextPOT(width); ti.tdy = nextPOT(height); LVColorDrawBuf buf(ti.tdx, ti.tdy, 32); if (bpp >= 16) { docview->Draw(buf, false); } else { LVGrayDrawBuf grayBuf(width, height, bpp); docview->Draw(grayBuf); grayBuf.DrawTo(&buf, 0, 0, 0, NULL); } ti.textureId = crCreateTextureRGBA(ti.tdx, ti.tdy, (lUInt32*)buf.GetScanLine(0)); return ti.textureId != 0; }