- support BITMAP_CLEAR_MEMORY in create_bitmap()

- copying to clipboard now constructs a text_run_array for StyledEdit, that is added to the clipboard. In applications supporting it it pastes the text with the correct fonts and sizes, and the text colors.
- tried to find which line in source code the selection starts to open the editor there, but it's not finished so it's disabled.

svn path=/trunk/netsurf/; revision=5533
This commit is contained in:
François Revel 2008-10-10 21:43:25 +00:00
parent e4fba7f577
commit 4e79ee3d07
8 changed files with 75 additions and 16 deletions

View File

@ -38,6 +38,7 @@ extern "C" {
#include "utils/log.h"
}
#include "beos/beos_bitmap.h"
#include "beos/beos_gui.h"
#include "beos/beos_scaffolding.h"
struct bitmap {
@ -105,14 +106,19 @@ static inline void nsbeos_rgba_to_bgra(void *src, void *dst, int width, int heig
void *bitmap_create(int width, int height, unsigned int state)
{
CALLED();
struct bitmap *bmp = (struct bitmap *)malloc(sizeof(struct bitmap));
if (bmp == NULL)
return NULL;
int32 flags = 0;
if (state & BITMAP_CLEAR_MEMORY)
flags |= B_BITMAP_CLEAR_TO_WHITE;
BRect frame(0, 0, width - 1, height - 1);
//XXX: bytes per row ?
bmp->primary = new BBitmap(frame, 0, B_RGBA32);
bmp->shadow = new BBitmap(frame, 0, B_RGBA32);
bmp->primary = new BBitmap(frame, flags, B_RGBA32);
bmp->shadow = new BBitmap(frame, flags, B_RGBA32);
bmp->pretile_x = bmp->pretile_y = bmp->pretile_xy = NULL;
@ -286,6 +292,7 @@ bool bitmap_save(void *vbitmap, const char *path, unsigned flags)
* \param vbitmap a bitmap, as returned by bitmap_create()
*/
void bitmap_modified(void *vbitmap) {
CALLED();
struct bitmap *bitmap = (struct bitmap *)vbitmap;
// convert the shadow (ABGR) to into the primary bitmap
nsbeos_rgba_to_bgra(bitmap->shadow->Bits(), bitmap->primary->Bits(),

View File

@ -42,8 +42,6 @@ extern "C" {
#include "beos/beos_font.h"
#include "beos/beos_plotters.h"
static void nsfont_style_to_font(BFont &font,
const struct css_style *style);
static bool nsfont_width(const struct css_style *style,
const char *string, size_t length,
int *width);
@ -84,7 +82,7 @@ bool nsfont_width(const struct css_style *style,
return true;
}
nsfont_style_to_font(font, style);
nsbeos_style_to_font(font, style);
*width = (int)font.StringWidth(string, length);
return true;
}
@ -134,7 +132,7 @@ bool nsfont_position_in_string(const struct css_style *style,
int index;
BFont font;
nsfont_style_to_font(font, style);
nsbeos_style_to_font(font, style);
BString str(string);
int32 len = str.CountChars();
float escapements[len];
@ -184,7 +182,7 @@ bool nsfont_split(const struct css_style *style,
int index = 0;
BFont font;
nsfont_style_to_font(font, style);
nsbeos_style_to_font(font, style);
BString str(string);
int32 len = str.CountChars();
float escapements[len];
@ -245,7 +243,7 @@ bool nsfont_paint(const struct css_style *style,
if (length == 0)
return true;
nsfont_style_to_font(font, style);
nsbeos_style_to_font(font, style);
background = nsbeos_rgb_colour(bg);
foreground = nsbeos_rgb_colour(c);
@ -296,7 +294,7 @@ bool nsfont_paint(const struct css_style *style,
* \return a new Pango font description
*/
static void nsfont_style_to_font(BFont &font,
void nsbeos_style_to_font(BFont &font,
const struct css_style *style)
{
float size;
@ -378,7 +376,7 @@ static void nsfont_style_to_font(BFont &font,
if (!face)
face = B_REGULAR_FACE;
//fprintf(stderr, "nsfont_style_to_font: %d, %d, %d -> '%s' %04x\n", style->font_family, style->font_style, style->font_weight, family, face);
//fprintf(stderr, "nsbeos_style_to_font: %d, %d, %d -> '%s' %04x\n", style->font_family, style->font_style, style->font_weight, family, face);
if (family)
font.SetFamilyAndFace((const font_family)family, face);
@ -388,7 +386,7 @@ static void nsfont_style_to_font(BFont &font,
font.SetFace(face);
}
//fprintf(stderr, "nsfont_style_to_font: value %f unit %d\n", style->font_size.value.length.value, style->font_size.value.length.unit);
//fprintf(stderr, "nsbeos_style_to_font: value %f unit %d\n", style->font_size.value.length.value, style->font_size.value.length.unit);
if (style->font_size.value.length.unit == CSS_UNIT_PT)
size = style->font_size.value.length.value;
else
@ -399,7 +397,7 @@ static void nsfont_style_to_font(BFont &font,
if (size < abs(option_font_min_size / 10))
size = option_font_min_size / 10;
//fprintf(stderr, "nsfont_style_to_font: %f %d\n", size, style->font_size.value.length.unit);
//fprintf(stderr, "nsbeos_style_to_font: %f %d\n", size, style->font_size.value.length.unit);
font.SetSize(size);
}

View File

@ -28,3 +28,6 @@ struct css_style;
bool nsfont_paint(const struct css_style *style,
const char *string, size_t length,
int x, int y, colour bg, colour c);
void nsbeos_style_to_font(BFont &font,
const struct css_style *style);

View File

@ -807,7 +807,7 @@ void gui_window_save_as_link(struct gui_window *g, struct content *c)
* Send the source of a content to a text editor.
*/
void nsbeos_gui_view_source(struct content *content)
void nsbeos_gui_view_source(struct content *content, struct selection *selection)
{
char *temp_name;
bool done = false;
@ -867,6 +867,22 @@ void nsbeos_gui_view_source(struct content *content)
BMessage m(B_REFS_RECEIVED);
m.AddRef("refs", &ref);
#if 0
if (selection && selection->defined) {
int32 line = -1;
if (content->type == CONTENT_HTML) {
// XXX: use selection, find line in source code
}
if (content->type == CONTENT_TEXTPLAIN) {
line = MAKELINE_FROM_IDX(start_idx);
}
// not CSS!
if (line > -1)
message.AddInt32("be:line", line);
}
#endif
// apps to try
const char *editorSigs[] = {
"application/x-vnd.beunited.pe",

View File

@ -58,5 +58,5 @@ extern BFilePanel *wndOpenFile;
void nsbeos_pipe_message(BMessage *message, BView *_this, struct gui_window *gui);
void nsbeos_pipe_message_top(BMessage *message, BWindow *_this, struct beos_scaffolding *scaffold);
void nsbeos_gui_view_source(struct content *content);
void nsbeos_gui_view_source(struct content *content, struct selection *selection);

View File

@ -578,7 +578,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m
{
if (!bw || !bw->current_content)
break;
nsbeos_gui_view_source(bw->current_content);
nsbeos_gui_view_source(bw->current_content, bw->sel);
break;
}
case BROWSER_OBJECT:

View File

@ -76,7 +76,7 @@ bool thumbnail_create(struct content *content, struct bitmap *bitmap,
depth = 32;
//depth = (gdk_screen_get_system_visual(gdk_screen_get_default()))->depth;
LOG(("Trying to create a thumbnail bitmap %dx%d for a content of %dx%d@%d",
LOG(("Trying to create a thumbnail bitmap %d x %d for a content of %d x %d @ %d",
width, height,
content->width, content->width, depth));

View File

@ -32,6 +32,7 @@ extern "C" {
#include "utils/utils.h"
}
#include "beos/beos_window.h"
#include "beos/beos_font.h"
#include "beos/beos_gui.h"
#include "beos/beos_scaffolding.h"
#include "beos/beos_plotters.h"
@ -46,6 +47,7 @@ extern "C" {
#include <ScrollBar.h>
#include <String.h>
#include <String.h>
#include <TextView.h>
#include <View.h>
#include <Window.h>
@ -104,6 +106,7 @@ static const rgb_color kWhiteColor = {255, 255, 255, 255};
static struct gui_window *window_list = 0; /**< first entry in win list*/
static BString current_selection;
static BList current_selection_textruns;
static void nsbeos_gui_window_attach_child(struct gui_window *parent,
struct gui_window *child);
@ -1744,6 +1747,10 @@ void gui_drag_save_selection(struct selection *s, struct gui_window *g)
void gui_start_selection(struct gui_window *g)
{
current_selection.Truncate(0);
while (current_selection_textruns.ItemAt(0)) {
text_run *run = (text_run *)current_selection_textruns.RemoveItem(0L);
delete run;
}
if (!g->view->LockLooper())
return;
@ -1773,6 +1780,10 @@ void gui_paste_from_clipboard(struct gui_window *g, int x, int y)
bool gui_empty_clipboard(void)
{
current_selection.Truncate(0);
while (current_selection_textruns.ItemAt(0)) {
text_run *run = (text_run *)current_selection_textruns.RemoveItem(0L);
delete run;
}
return true;
}
@ -1800,6 +1811,17 @@ bool gui_commit_clipboard(void)
clip->AddData("text/plain", B_MIME_TYPE,
current_selection.String(),
current_selection.Length());
int arraySize = sizeof(text_run_array) +
current_selection_textruns.CountItems() * sizeof(text_run);
text_run_array *array = (text_run_array *)malloc(arraySize);
array->count = current_selection_textruns.CountItems();
for (int i = 0; i < array->count; i++)
memcpy(&array->runs[i], current_selection_textruns.ItemAt(i),
sizeof(text_run));
clip->AddData("application/x-vnd.Be-text_run_array", B_MIME_TYPE,
array, arraySize);
free(array);
gui_empty_clipboard();
be_clipboard->Commit();
}
@ -1812,6 +1834,7 @@ static bool copy_handler(const char *text, size_t length, struct box *box,
void *handle, const char *whitespace_text,
size_t whitespace_length)
{
//XXX: handle box->style to StyledEdit / RTF ?
/* add any whitespace which precedes the text from this box */
if (whitespace_text) {
if (!gui_add_to_clipboard(whitespace_text,
@ -1819,6 +1842,18 @@ static bool copy_handler(const char *text, size_t length, struct box *box,
return false;
}
}
// add a text_run for StyledEdit-like text formating
if (box && box->style) {
text_run *run = new text_run;
BFont font;
nsbeos_style_to_font(font, box->style);
run->offset = current_selection.Length();
run->font = font;
run->color = nsbeos_rgb_colour(box->style->color);
current_selection_textruns.AddItem(run);
}
/* add the text from this box */
if (!gui_add_to_clipboard(text, length, box->space))
return false;