From 524e29c4dfcbe713fc25075c9e1c566370062a55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Revel?= Date: Wed, 4 Jun 2008 01:53:20 +0000 Subject: [PATCH] - fixed alpha bitmap drawing - fixed polygon drawing - newstyle throbber, loosely copied from the gtk one. svn path=/trunk/netsurf/; revision=4259 --- beos/beos_bitmap.cpp | 6 ++- beos/beos_gui.cpp | 32 ++++++++++++- beos/beos_plotters.cpp | 40 ++++++++++++++-- beos/beos_scaffolding.cpp | 4 +- beos/beos_throbber.cpp | 79 +++++++++++++++++++++++++++++++- beos/beos_throbber.h | 3 +- beos/res/throbber.gif | Bin 5175 -> 0 bytes beos/res/throbber/throbber0.png | Bin 0 -> 521 bytes beos/res/throbber/throbber1.png | Bin 0 -> 820 bytes beos/res/throbber/throbber2.png | Bin 0 -> 812 bytes beos/res/throbber/throbber3.png | Bin 0 -> 826 bytes beos/res/throbber/throbber4.png | Bin 0 -> 818 bytes beos/res/throbber/throbber5.png | Bin 0 -> 815 bytes beos/res/throbber/throbber6.png | Bin 0 -> 839 bytes beos/res/throbber/throbber7.png | Bin 0 -> 811 bytes beos/res/throbber/throbber8.png | Bin 0 -> 833 bytes 16 files changed, 155 insertions(+), 9 deletions(-) delete mode 100644 beos/res/throbber.gif create mode 100644 beos/res/throbber/throbber0.png create mode 100644 beos/res/throbber/throbber1.png create mode 100644 beos/res/throbber/throbber2.png create mode 100644 beos/res/throbber/throbber3.png create mode 100644 beos/res/throbber/throbber4.png create mode 100644 beos/res/throbber/throbber5.png create mode 100644 beos/res/throbber/throbber6.png create mode 100644 beos/res/throbber/throbber7.png create mode 100644 beos/res/throbber/throbber8.png diff --git a/beos/beos_bitmap.cpp b/beos/beos_bitmap.cpp index 6f950394f..3ccf591e3 100644 --- a/beos/beos_bitmap.cpp +++ b/beos/beos_bitmap.cpp @@ -97,8 +97,10 @@ static inline void nsbeos_rgba_to_bgra(void *src, void *dst, int width, int heig to[x].g = from[x].g; to[x].r = from[x].r; to[x].a = from[x].a; + /* if (from[x].a == 0) *(rgb_color *)&to[x] = B_TRANSPARENT_32_BIT; + */ } from += rowstride; to += rowstride; @@ -168,7 +170,7 @@ bool bitmap_test_opaque(struct bitmap *bitmap) { assert(bitmap); /* todo: test if bitmap as opaque */ - return bitmap->opaque; + return false;//bitmap->opaque; } @@ -181,7 +183,7 @@ bool bitmap_get_opaque(struct bitmap *bitmap) { assert(bitmap); /* todo: get whether bitmap is opaque */ - return bitmap->opaque; + return false;//bitmap->opaque; } diff --git a/beos/beos_gui.cpp b/beos/beos_gui.cpp index 601bdb5b6..2ea0043d7 100644 --- a/beos/beos_gui.cpp +++ b/beos/beos_gui.cpp @@ -334,8 +334,38 @@ void gui_init(int argc, char** argv) //nsbeos_completion_init(); + + /* This is an ugly hack to just get the new-style throbber going. + * It, along with the PNG throbber loader, need making more generic. + */ + { +#define STROF(n) #n +#define FIND_THROB(n) find_resource(filenames[(n)], \ + "throbber/throbber" STROF(n) ".png", \ + "./beos/res/throbber/throbber" STROF(n) ".png") + char filenames[9][PATH_MAX]; + FIND_THROB(0); + FIND_THROB(1); + FIND_THROB(2); + FIND_THROB(3); + FIND_THROB(4); + FIND_THROB(5); + FIND_THROB(6); + FIND_THROB(7); + FIND_THROB(8); + nsbeos_throbber_initialise_from_png(9, + filenames[0], filenames[1], filenames[2], filenames[3], + filenames[4], filenames[5], filenames[6], filenames[7], + filenames[8]); +#undef FIND_THROB +#undef STROF + } + +#if 0 find_resource(buf, "throbber.gif", "./beos/res/throbber.gif"); - nsbeos_throbber_initialise(buf); + nsbeos_throbber_initialise_from_gif(buf); +#endif + if (nsbeos_throbber == NULL) die("Unable to load throbber image.\n"); diff --git a/beos/beos_plotters.cpp b/beos/beos_plotters.cpp index 0cfee16a0..89266d64c 100644 --- a/beos/beos_plotters.cpp +++ b/beos/beos_plotters.cpp @@ -107,6 +107,9 @@ const struct plotter_table nsbeos_plotters = { }; +// #pragma mark - implementation + + BView *nsbeos_current_gc(void) { return current_view; @@ -158,9 +161,14 @@ bool nsbeos_plot_rectangle(int x0, int y0, int width, int height, nsbeos_set_colour(c); + float pensize = view->PenSize(); + view->SetPenSize(line_width); + BRect rect(x0, y0, x0 + width - 1, y0 + height - 1); view->StrokeRect(rect, pat); + view->SetPenSize(pensize); + //nsbeos_current_gc_unlock(); #if 0 /* GTK */ @@ -200,10 +208,15 @@ bool nsbeos_plot_line(int x0, int y0, int x1, int y1, int width, nsbeos_set_colour(c); + float pensize = view->PenSize(); + view->SetPenSize(width); + BPoint start(x0, y0); BPoint end(x1, y1); view->StrokeLine(start, end, pat); + view->SetPenSize(pensize); + //nsbeos_current_gc_unlock(); #if 0 /* GTK */ @@ -236,8 +249,20 @@ bool nsbeos_plot_polygon(int *p, unsigned int n, colour fill) return false; } - rgb_color color = nsbeos_rgb_colour(fill); + nsbeos_set_colour(fill); + BPoint points[n]; + + for (i = 0; i < n; i++) { + points[i] = BPoint(p[2 * i], p[2 * i + 1]); + } + + if (fill == TRANSPARENT) + view->StrokePolygon(points, (int32)n); + else + view->FillPolygon(points, (int32)n); + +#if 0 view->BeginLineArray(n); for (i = 0; i < n; i++) { @@ -247,6 +272,7 @@ bool nsbeos_plot_polygon(int *p, unsigned int n, colour fill) } view->EndLineArray(); +#endif //nsbeos_current_gc_unlock(); @@ -467,21 +493,29 @@ static bool nsbeos_plot_bbitmap(int x, int y, int width, int height, } drawing_mode oldmode = view->DrawingMode(); - view->SetDrawingMode(B_OP_OVER); + source_alpha alpha; + alpha_function func; + view->GetBlendingMode(&alpha, &func); + //view->SetDrawingMode(B_OP_OVER); + view->SetDrawingMode(B_OP_ALPHA); + view->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); // XXX DrawBitmap() resamples if rect doesn't match, // but doesn't do any filtering // XXX: use Zeta API if available ? BRect rect(x, y, x + width - 1, y + height - 1); + /* rgb_color old = view->LowColor(); if (bg != TRANSPARENT) { view->SetLowColor(nsbeos_rgb_colour(bg)); view->FillRect(rect, B_SOLID_LOW); } + */ view->DrawBitmap(b, rect); // maybe not needed? - view->SetLowColor(old); + //view->SetLowColor(old); + view->SetBlendingMode(alpha, func); view->SetDrawingMode(oldmode); //nsbeos_current_gc_unlock(); diff --git a/beos/beos_scaffolding.cpp b/beos/beos_scaffolding.cpp index 7bda4e4d7..79162ef71 100644 --- a/beos/beos_scaffolding.cpp +++ b/beos/beos_scaffolding.cpp @@ -527,6 +527,7 @@ void nsbeos_scaffolding_dispatch_event(nsbeos_scaffolding *scaffold, BMessage *m url = data; } else url << path.Path(); + browser_window_go(bw, url.String(), 0, true); break; } @@ -1303,7 +1304,8 @@ nsbeos_scaffolding *nsbeos_new_scaffolding(struct gui_window *toplevel) toolbar->AddChild(g->throbber); g->throbber->SetViewColor(toolbar->ViewColor()); g->throbber->SetLowColor(toolbar->ViewColor()); - g->throbber->SetDrawingMode(B_OP_OVER); + g->throbber->SetDrawingMode(B_OP_ALPHA); + g->throbber->SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY); /* set up the throbber. */ g->throbber->SetBitmap(nsbeos_throbber->framedata[0]); g->throb_frame = 0; diff --git a/beos/beos_throbber.cpp b/beos/beos_throbber.cpp index 69cc09076..672ec7be3 100644 --- a/beos/beos_throbber.cpp +++ b/beos/beos_throbber.cpp @@ -18,6 +18,7 @@ #include #include +#include extern "C" { #include "utils/log.h" #include "image/gifread.h" @@ -25,9 +26,85 @@ extern "C" { #include "beos/beos_throbber.h" #include "beos/beos_bitmap.h" +#include +#include + struct nsbeos_throbber *nsbeos_throbber = NULL; -bool nsbeos_throbber_initialise(const char *fn) +/** + * Creates the throbber using a PNG for each frame. The number of frames must + * be at least two. The first frame is the inactive frame, others are the + * active frames. + * + * \param frames The number of frames. Must be at least two. + * \param ... Filenames of PNGs containing frames. + * \return true on success. + */ +bool nsbeos_throbber_initialise_from_png(const int frames, ...) +{ + va_list filenames; + status_t err; + struct nsbeos_throbber *throb; /**< structure we generate */ + bool errors_when_loading = false; /**< true if a frame failed */ + + if (frames < 2) { + /* we need at least two frames - one for idle, one for active */ + LOG(("Insufficent number of frames in throbber animation!")); + LOG(("(called with %d frames, where 2 is a minimum.)", + frames)); + return false; + } + + throb = (struct nsbeos_throbber *)malloc(sizeof(throb)); + throb->nframes = frames; + throb->framedata = (BBitmap **)malloc(sizeof(BBitmap *) * throb->nframes); + + va_start(filenames, frames); + + for (int i = 0; i < frames; i++) { + const char *fn = va_arg(filenames, const char *); + BFile file(fn, B_READ_ONLY); + throb->framedata[i] = NULL; + err = file.InitCheck(); + if (err < B_OK) { + LOG(("Error when loading %s: %s", fn, strerror(err))); + errors_when_loading = true; + continue; + } + throb->framedata[i] = BTranslationUtils::GetBitmap(&file); + if (throb->framedata[i] == NULL) { + LOG(("Error when loading %s: GetBitmap() returned NULL", fn)); + errors_when_loading = true; + } + } + + va_end(filenames); + + if (errors_when_loading == true) { + for (int i = 0; i < frames; i++) { + delete throb->framedata[i]; + } + + free(throb->framedata); + free(throb); + + return false; + } + + nsbeos_throbber = throb; + + return true; +} + +/** + * Creates the throbber using a single GIF, using the first frame as the + * inactive throbber, and the others for the active animation. The GIF must + * therefor have at least two frames. + * + * \param fn Filename of GIF to use. It must have at least two frames. + * \return true on success. + */ +bool nsbeos_throbber_initialise_from_gif(const char *fn) { /* disect the GIF provided by filename in *fn into a series of * BBitmap for use later. diff --git a/beos/beos_throbber.h b/beos/beos_throbber.h index 47f8249e6..5c890f9fe 100644 --- a/beos/beos_throbber.h +++ b/beos/beos_throbber.h @@ -29,7 +29,8 @@ struct nsbeos_throbber extern struct nsbeos_throbber *nsbeos_throbber; -bool nsbeos_throbber_initialise(const char *fn); +bool nsbeos_throbber_initialise_from_gif(const char *fn); +bool nsbeos_throbber_initialise_from_png(const int frames, ...); void nsbeos_throbber_finalise(void); #endif /* __BEOS_THROBBER_H__ */ diff --git a/beos/res/throbber.gif b/beos/res/throbber.gif deleted file mode 100644 index f9d0c152dd3d2e62b7839f8b7dd7f50955893df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5175 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 diff --git a/beos/res/throbber/throbber0.png b/beos/res/throbber/throbber0.png new file mode 100644 index 0000000000000000000000000000000000000000..7c79be47b14426b6c2621959c54a7283e8b9dc6f GIT binary patch literal 521 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAwFmfwxZb~iAIKbVFz2(v2B0H! zOM?7@85o(ESy-V^Vr!z2$bk1-t8~+MEnFnC5!jR(TxZG0w{FdsJ53xS;L(IG}L; zlq)(n-a4yk=IvRzPj)p4!$8c=}XAOSPp>;7JqrX&a_YGjX9}qv;HsVx7SVIf3ZPwHoYi#vbSTsW5=Nw4~gF1H&;(Y+k6N(Ww5Av+O>n53oPDR pow&39e!-%r>;C`aj9$0q2`~F+rHA+C94`RHrl+f)%Q~loCIDWup2GkD literal 0 HcmV?d00001 diff --git a/beos/res/throbber/throbber1.png b/beos/res/throbber/throbber1.png new file mode 100644 index 0000000000000000000000000000000000000000..b5b83a46502d58e9f2a24dbb96eea5b148b2b9b3 GIT binary patch literal 820 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbQ|Pfzc?yC&U%Vr3$!z|2|dB8T^Lq zxZM^CbY)sekY8|L|HPTI<}O^Za`onY2Tz_kd*$}Cm+!y+{m;P2#LU9V#=*(O&BMzl zAS5gzCN3cgSX^3GURhP|Dw8k+Xd`2ix4VnP?95g(C=q3jdH_cqZ?lVU2 zD!x%Ccs0t;m_(^e5j(x+yDu=SmVC-gN#eRpb~s(kP)>0?FC zywBYKwyimqyQSyI&PQ3QyP~2G*Ti1xUH62;mMezG%)y3(O~LobHKVTTpbANE7pIF) za~3AbJzOqpV!|5zM0o=L9J8eB248r(QkLJ@_3$q9hD95cH!JL$u{8V9;!hd#gu8f+ zd5RyL{h5Bb#w#fF#LS7|8fpQ5+)Vz_Dj=CYNWHgDT=Wph1H5oe#@U&N9DiMncr<4S)+_iex%4u` zr-$ojl<_6KWqIOE7w7t(dwVu{--7gtbKj1p3hj{4Y1)zhvEeOeCEHQmwR?I)vKBw! zTK6Jh-h{ozpS?5Q#RU2}*nL6aBSXwBbC^u2gG>tD;Jd$(O#CE%(TtVeffw^YuU( z(_;sIvT@zb51DHaJe6N0erfvijZ#~}?u3^e)7!PC>*9HZFLsHIQ~!SU{*bgvz-J$0 XpPBE2R=4ZApv30s>gTe~DWM4fRo~T@ literal 0 HcmV?d00001 diff --git a/beos/res/throbber/throbber3.png b/beos/res/throbber/throbber3.png new file mode 100644 index 0000000000000000000000000000000000000000..5d458ac0bc3eca522cf4d26b342154cdf2d20955 GIT binary patch literal 826 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 literal 0 HcmV?d00001