Skip to content

Commit

Permalink
Rough mhtml image rendering.
Browse files Browse the repository at this point in the history
  • Loading branch information
indigoparadox committed May 20, 2024
1 parent 046fa2a commit 7f48edc
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 20 deletions.
14 changes: 6 additions & 8 deletions src/mhtml.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
f( 7, SPAN, void* none;, INLINE ) \
f( 8, BR, void* none;, INLINE ) \
f( 9, STYLE, void* none;, NONE ) \
f( 10, IMG, void* none;, BLOCK )
f( 10, IMG, char src[MHTML_SRC_HREF_SZ_MAX + 1]; size_t src_sz;, BLOCK )

#define MHTML_PARSER_PSTATE_TABLE( f ) \
f( MHTML_PSTATE_NONE, 0 ) \
Expand Down Expand Up @@ -122,8 +122,6 @@ struct MHTML_TAG_BASE {
size_t classes_sz;
char id[MCSS_ID_SZ_MAX + 1];
size_t id_sz;
char src_href[MHTML_SRC_HREF_SZ_MAX + 1];
size_t src_href_sz;
};

#define MHTML_TAG_TABLE_STRUCT( tag_id, tag_name, fields, disp ) \
Expand Down Expand Up @@ -548,10 +546,10 @@ MERROR_RETVAL mhtml_push_attrib_val( struct MHTML_PARSER* parser ) {

} else if( MHTML_ATTRIB_KEY_SRC == parser->attrib_key ) {
strncpy(
parser->tags[parser->tag_iter].base.src_href,
parser->tags[parser->tag_iter].IMG.src,
parser->token,
MHTML_SRC_HREF_SZ_MAX );
parser->tags[parser->tag_iter].base.src_href_sz = parser->token_sz;
parser->tags[parser->tag_iter].IMG.src_sz = parser->token_sz;
}

cleanup:
Expand Down Expand Up @@ -833,13 +831,13 @@ void mhtml_dump_tree(
}

if(
0 < parser->tags[iter].base.src_href_sz &&
0 < parser->tags[iter].IMG.src_sz &&
strlen( dump_line ) + 13 /* (src/href: ) */
+ strlen( parser->tags[iter].base.src_href ) < MHTML_DUMP_LINE_SZ
+ strlen( parser->tags[iter].IMG.src ) < MHTML_DUMP_LINE_SZ
) {
maug_snprintf( &(dump_line[strlen( dump_line )]),
MHTML_DUMP_LINE_SZ - strlen( dump_line ),
" (src/href: %s)", parser->tags[iter].base.src_href );
" (src/href: %s)", parser->tags[iter].IMG.src );
}

}
Expand Down
56 changes: 47 additions & 9 deletions src/mhtmr.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ struct MHTMR_RENDER_NODE {
ssize_t parent;
ssize_t first_child;
ssize_t next_sibling;
struct RETROFLAT_BITMAP bitmap;
};

struct MHTMR_RENDER_TREE {
Expand Down Expand Up @@ -341,8 +342,26 @@ MERROR_RETVAL mhtmr_tree_create(
mhtmr_node( tree, node_new_idx )->tag = tag_iter_idx;

debug_printf( MHTMR_TRACE_LVL,
"rendering node " SSIZE_T_FMT " under node " SSIZE_T_FMT,
node_new_idx, node_idx );
"rendering node " SSIZE_T_FMT " (%s) under node " SSIZE_T_FMT,
node_new_idx,
gc_mhtml_tag_names[mhtml_tag( parser, tag_iter_idx )->base.type],
node_idx );

/* Tag-specific rendering preparations. */
if( MHTML_TAG_TYPE_IMG == mhtml_tag( parser, tag_iter_idx )->base.type ) {
/* Load the image for rendering later. */
retval = retroflat_load_bitmap(
mhtml_tag( parser, tag_iter_idx )->IMG.src,
&(mhtmr_node( tree, node_new_idx )->bitmap),
RETROFLAT_FLAGS_LITERAL_PATH );
if( MERROR_OK == retval ) {
debug_printf( MHTMR_TRACE_LVL, "loaded img: %s",
mhtml_tag( parser, tag_iter_idx )->IMG.src );
} else {
error_printf( "could not load img: %s",
mhtml_tag( parser, tag_iter_idx )->IMG.src );
}
}

mhtmr_tree_create( parser, tree, x, y, w, h,
tag_iter_idx, node_new_idx, d + 1 );
Expand Down Expand Up @@ -477,6 +496,21 @@ MERROR_RETVAL mhtmr_tree_size(

maug_munlock( mhtml_tag( parser, tag_idx )->TEXT.content, tag_content );

} else if(
0 <= tag_idx &&
MHTML_TAG_TYPE_IMG == mhtml_tag( parser, tag_idx )->base.type
) {

if( retroflat_bitmap_ok( &(mhtmr_node( tree, node_idx )->bitmap) ) ) {
mhtmr_node( tree, node_idx )->w =
retroflat_bitmap_w( &(mhtmr_node( tree, node_idx )->bitmap) );
mhtmr_node( tree, node_idx )->h =
retroflat_bitmap_h( &(mhtmr_node( tree, node_idx )->bitmap) );
}

debug_printf( MHTMR_TRACE_LVL, "TEXT w: " SIZE_T_FMT,
mhtmr_node( tree, node_idx )->w );

} else {
/* Get sizing of child nodes. */

Expand Down Expand Up @@ -811,13 +845,17 @@ void mhtmr_tree_draw(

} else if( MHTML_TAG_TYPE_IMG == tag->base.type ) {
/* TODO: Load and blit the image. */
retroflat_rect(
NULL, RETROFLAT_COLOR_MAGENTA,
mhtmr_node( tree, node_idx )->x,
mhtmr_node( tree, node_idx )->y,
/* mhtmr_node( tree, node_idx )->w,
mhtmr_node( tree, node_idx )->h, */ 16, 16,
RETROFLAT_FLAGS_FILL );

if( retroflat_bitmap_ok( &(mhtmr_node( tree, node_idx )->bitmap) ) ) {
retroflat_blit_bitmap(
NULL, &(mhtmr_node( tree, node_idx )->bitmap),
0, 0,
mhtmr_node( tree, node_idx )->x,
mhtmr_node( tree, node_idx )->y,
16, 16
/* mhtmr_node( tree, node_idx )->w,
mhtmr_node( tree, node_idx )->h */ );
}

} else {
if( RETROFLAT_COLOR_NULL != node->bg ) {
Expand Down
18 changes: 15 additions & 3 deletions src/retroflt.h
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,11 @@ typedef int8_t RETROFLAT_COLOR;
*/
#define RETROFLAT_FLAGS_ALL_CAPS 0x02

/**
* \brief Flag for retroflat_load_bitmap() to not use assets path.
*/
#define RETROFLAT_FLAGS_LITERAL_PATH 0x02

/**
* \brief Flag for retroflat_string() and retroflat_string_sz() to print
* text as outline-only.
Expand Down Expand Up @@ -5290,9 +5295,16 @@ MERROR_RETVAL retroflat_load_bitmap(

/* Build the path to the bitmap. */
memset( filename_path, '\0', RETROFLAT_PATH_MAX + 1 );
maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s%c%s.%s",
g_retroflat_state->assets_path, RETROFLAT_PATH_SEP,
filename, RETROFLAT_BITMAP_EXT );
if(
RETROFLAT_FLAGS_LITERAL_PATH ==
(RETROFLAT_FLAGS_LITERAL_PATH & flags)
) {
maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s", filename );
} else {
maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s%c%s.%s",
g_retroflat_state->assets_path, RETROFLAT_PATH_SEP,
filename, RETROFLAT_BITMAP_EXT );
}

debug_printf( 1, "retroflat: loading bitmap: %s", filename_path );

Expand Down

0 comments on commit 7f48edc

Please sign in to comment.