diff --git a/djvu.c b/djvu.c
index 53b1298ab..9253b404e 100644
--- a/djvu.c
+++ b/djvu.c
@@ -15,6 +15,7 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
+#include
#include
#include
@@ -185,7 +186,7 @@ static int openPage(lua_State *L) {
luaL_getmetatable(L, "djvupage");
lua_setmetatable(L, -2);
- /* djvulibre counts page starts form 0 */
+ /* djvulibre counts page starts from 0 */
page->page_ref = ddjvu_page_create_by_pageno(doc->doc_ref, pageno - 1);
while (! ddjvu_page_decoding_done(page->page_ref))
handle(L, doc->context, TRUE);
@@ -196,7 +197,7 @@ static int openPage(lua_State *L) {
page->doc = doc;
page->num = pageno;
- /* djvulibre counts page starts form 0 */
+ /* djvulibre counts page starts from 0 */
while((r=ddjvu_document_get_pageinfo(doc->doc_ref, pageno - 1,
&(page->info)))context, TRUE);
@@ -376,6 +377,15 @@ static int drawPage(lua_State *L) {
DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage");
DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext");
BlitBuffer *bb = (BlitBuffer*) luaL_checkudata(L, 3, "blitbuffer");
+ int render_mode = (int) luaL_checkint(L, 6);
+ ddjvu_render_mode_t djvu_render_mode;
+ unsigned char adjusted_low[16], adjusted_high[16];
+ int i, adjust_pixels = 0;
+
+ if (render_mode)
+ djvu_render_mode = DDJVU_RENDER_BLACK;
+ else
+ djvu_render_mode = DDJVU_RENDER_COLOR;
ddjvu_format_t *pixelformat;
ddjvu_rect_t pagerect, renderrect;
@@ -422,7 +432,7 @@ static int drawPage(lua_State *L) {
*/
ddjvu_page_render(page->page_ref,
- DDJVU_RENDER_COLOR,
+ djvu_render_mode,
&pagerect,
&renderrect,
pixelformat,
@@ -436,12 +446,26 @@ static int drawPage(lua_State *L) {
int x_offset = MAX(0, dc->offset_x);
int y_offset = MAX(0, dc->offset_y);
+ /* prepare the tables for adjusting the intensity of pixels */
+ if (dc->gamma != -1.0) {
+ for (i=0; i<16; i++) {
+ adjusted_low[i] = MIN(15, (unsigned char)floorf(dc->gamma * (float)i));
+ adjusted_high[i] = adjusted_low[i] << 4;
+ }
+ adjust_pixels = 1;
+ }
+
bbptr += bb->pitch * y_offset;
for(y = y_offset; y < bb->h; y++) {
/* bbptr's line width is half of pmptr's */
for(x = x_offset/2; x < (bb->w / 2); x++) {
- bbptr[x] = 255 - (((pmptr[x*2 + 1 - x_offset] & 0xF0) >> 4) |
- (pmptr[x*2 - x_offset] & 0xF0));
+ int p = x*2 - x_offset;
+ unsigned char low = 15 - (pmptr[p + 1] >> 4);
+ unsigned char high = 15 - (pmptr[p] >> 4);
+ if (adjust_pixels)
+ bbptr[x] = adjusted_high[high] | adjusted_low[low];
+ else
+ bbptr[x] = (high << 4) | low;
}
if(bb->w & 1) {
bbptr[x] = 255 - (pmptr[x*2] & 0xF0);