1 /*****************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// __ \_/ ___\| |/ /| __ \ / __ \ \/ /
5 * Jukebox | | ( (__) ) \___| ( | \_\ ( (__) ) (
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2009 Andrew Mahone
14 * This program is free software; you can redistribute it and/or
15 * modify it under the terms of the GNU General Public License
16 * as published by the Free Software Foundation; either version 2
17 * of the License, or (at your option) any later version.
19 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
20 * KIND, either express or implied.
22 ****************************************************************************/
25 #include "lib/jpeg_mem.h"
28 static unsigned char output
;
29 static int output_y
= 0;
31 static unsigned char *plugin_buf
;
34 /* a null output plugin to save memory and better isolate scale cost */
35 static unsigned int get_size_null(struct bitmap
*bm
)
41 static void output_row_null(uint32_t row
, void * row_in
,
42 struct scaler_context
*ctx
)
45 uint32_t *in
= (uint32_t *)row_in
;
47 uint32_t *lim
= in
+ ctx
->bm
->width
* 3;
49 uint32_t *lim
= in
+ ctx
->bm
->width
;
52 output
= SC_OUT(*in
++, ctx
);
56 struct img_part
*store_part_null(void *args
)
60 part
.buf
= (typeof(part
.buf
))plugin_buf
;
64 const struct custom_format format_null
= {
72 .output_row_32
= output_row_null
,
74 .get_size
= get_size_null
77 #define lcd_printf(...) \
79 rb->lcd_putsxyf(0, output_y, __VA_ARGS__); \
80 rb->lcd_update_rect(0, output_y, LCD_WIDTH, font_h); \
84 /* this is the plugin entry point */
85 enum plugin_status
plugin_start(const void* parameter
)
87 size_t plugin_buf_len
;
88 plugin_buf
= (unsigned char *)rb
->plugin_get_buffer(&plugin_buf_len
);
91 struct rowset rset
= {
97 rb
->lcd_set_drawmode(DRMODE_SOLID
|DRMODE_INVERSEVID
);
98 rb
->lcd_fillrect(0, 0, LCD_WIDTH
, LCD_HEIGHT
);
99 rb
->lcd_set_drawmode(DRMODE_SOLID
);
100 rb
->lcd_getstringsize("A", NULL
, &font_h
);
101 bm
.data
= plugin_buf
;
103 for (in
= 64; in
< 1025; in
<<= 2)
105 for (out
= 64; out
< 257; out
<<= 1)
109 lcd_printf("timing %dx%d->%dx>%d scale", in
, in
, out
, out
);
112 t2
= *(rb
->current_tick
);
113 in_dim
.width
= in_dim
.height
= in
;
114 bm
.width
= bm
.height
= rset
.rowstop
= out
;
115 while (t2
!= (t1
= *(rb
->current_tick
)));
116 t_end
= t1
+ 10 * HZ
;
118 resize_on_load(&bm
, false, &in_dim
, &rset
, (unsigned char *)plugin_buf
, plugin_buf_len
, &format_null
, IF_PIX_FMT(0,) store_part_null
, NULL
);
120 t2
= *(rb
->current_tick
);
121 } while (TIME_BEFORE(t2
, t_end
) || count
< 10);
128 lcd_printf("%01d.%03d secs/scale", (int)t1
, (int)t2
);
129 if (!(bm
.width
&& bm
.height
))
134 while (rb
->get_action(CONTEXT_STD
,1) != ACTION_STD_OK
) rb
->yield();