On Sat, 1 Feb 2020 19:40:27 -0500
George Koehler wrote:

> On Mon, 27 Jan 2020 00:37:46 +0100
> Charlene Wendling <juliana...@posteo.jp> wrote:
> 
> > I tried playing it on macppc, but:
> > 
> > - it's broken with Perl 5.30: ...
> > - there are graphic issues: the title screen is black. The
> > directional arrow that helps throwing bubbles is invisible. Also
> > libpng complains about some interlaced PNGs, the below diff
> > deinterlace them.
> 
> After I fixed devel/p5-SDL on my amd64 desktop, I learned that
> games/frozen-bubble is broken with clang.  After I apply cwen's diff,
> I must either build frozen-bubble with COMPILER=ports-gcc, or add the
> patch (below) for clang.  I don't see graphic problems on amd64; the
> title screen and the arrow look good.  --George

It works fine on amd64, has no further regressions on powerpc, and
i'm fine with your clang fix. Obviously, powerpc issues should not
hinder the x86 fix, and i've no objection to see that diff committed
after devel/p5-SDL is committed.

For everyone's convenience, here is a diff with the Perl 5.30 fixes
and the clang one combined.

Charlène.


Index: Makefile
===================================================================
RCS file: /cvs/ports/games/frozen-bubble/Makefile,v
retrieving revision 1.28
diff -u -p -u -p -r1.28 Makefile
--- Makefile    17 Jul 2019 14:49:22 -0000      1.28
+++ Makefile    2 Feb 2020 14:05:17 -0000
@@ -6,7 +6,7 @@ COMMENT-server =        server for the frozen-b
 VER =                  2.2.0
 DISTNAME =             frozen-bubble-${VER}
 PKGNAME-main =         ${DISTNAME}
-REVISION-main =                14
+REVISION-main =                15
 PKGNAME-server =       frozen-bubble-server-${VER}
 REVISION-server =      10
 CATEGORIES =           games
@@ -29,6 +29,9 @@ BUILD_DEPENDS =               devel/p5-SDL \
                        devel/p5-Locale-gettext \
                        devel/gettext,-tools
 
+# Needed for post-patch deinterlacing
+BUILD_DEPENDS +=       graphics/ImageMagick
+
 RUN_DEPENDS-main =     devel/p5-SDL \
                        devel/p5-Locale-gettext \
                        ${BASE_PKGPATH},-server
@@ -46,5 +49,14 @@ WANTLIB-main =               SDL SDL_Pango SDL_mixer 
 WANTLIB-server =       c glib-2.0 intl pthread
 
 MULTI_PACKAGES =       -main -server
+
+# fix "Interlace handling should be turned on when using png_read_image"
+post-patch:
+       @cd ${WRKSRC} && for interlaced in      gfx/flags/flag-de.png \
+                                               gfx/flags/flag-fi.png \
+                                               gfx/flags/flag-no.png; \
+       do \
+               ${LOCALBASE}/bin/mogrify -interlace none $${interlaced} ;\
+       done
 
 .include <bsd.port.mk>
Index: patches/patch-c_stuff_fb_c_stuff_xs
===================================================================
RCS file: patches/patch-c_stuff_fb_c_stuff_xs
diff -N patches/patch-c_stuff_fb_c_stuff_xs
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-c_stuff_fb_c_stuff_xs 2 Feb 2020 14:05:17 -0000
@@ -0,0 +1,125 @@
+$OpenBSD$
+
+Fix build with clang: it errors when functions are inside other
+functions.  Rename sqr(int) to prevent conflict with sqr(float).
+
+Index: c_stuff/fb_c_stuff.xs
+--- c_stuff/fb_c_stuff.xs.orig
++++ c_stuff/fb_c_stuff.xs
+@@ -94,17 +94,17 @@ int rand_(double val) { return 1+(int) (val*rand()/(RA
+ 
+ /* -------------- Double Store ------------------ */
+ 
++static void copy_line(int l, SDL_Surface * s, SDL_Surface * img) {
++      memcpy(s->pixels + l*img->pitch, img->pixels + l*img->pitch, 
img->pitch);
++}
++static void copy_column(int c, SDL_Surface * s, SDL_Surface * img) {
++      int bpp = img->format->BytesPerPixel;
++      for (y=0; y<YRES; y++)
++              memcpy(s->pixels + y*img->pitch + c*bpp, img->pixels + 
y*img->pitch + c*bpp, bpp);
++}
++
+ void store_effect(SDL_Surface * s, SDL_Surface * img)
+ {
+-      void copy_line(int l) {
+-              memcpy(s->pixels + l*img->pitch, img->pixels + l*img->pitch, 
img->pitch);
+-      }
+-      void copy_column(int c) {
+-              int bpp = img->format->BytesPerPixel;
+-              for (y=0; y<YRES; y++)
+-                      memcpy(s->pixels + y*img->pitch + c*bpp, img->pixels + 
y*img->pitch + c*bpp, bpp);
+-      }
+-
+       int step = 0;
+       int store_thickness = 15;
+ 
+@@ -116,8 +116,8 @@ void store_effect(SDL_Surface * s, SDL_Surface * img)
+                       for (i=0; i<=YRES/2/store_thickness; i++) {
+                               int v = step - i;
+                               if (v >= 0 && v < store_thickness) {
+-                                      copy_line(i*store_thickness + v);
+-                                      copy_line(YRES - 1 - (i*store_thickness 
+ v));
++                                      copy_line(i*store_thickness + v, s, 
img);
++                                      copy_line(YRES - 1 - (i*store_thickness 
+ v), s, img);
+                               }
+                       }
+                       step++;
+@@ -133,8 +133,8 @@ void store_effect(SDL_Surface * s, SDL_Surface * img)
+                       for (i=0; i<=XRES/2/store_thickness; i++) {
+                               int v = step - i;
+                               if (v >= 0 && v < store_thickness) {
+-                                      copy_column(i*store_thickness + v);
+-                                      copy_column(XRES - 1 - 
(i*store_thickness + v));
++                                      copy_column(i*store_thickness + v, s, 
img);
++                                      copy_column(XRES - 1 - 
(i*store_thickness + v), s, img);
+                               }
+                       }
+                       step++;
+@@ -176,21 +176,22 @@ void bars_effect(SDL_Surface * s, SDL_Surface * img)
+ 
+ /* -------------- Squares ------------------ */
+ 
++static const int squares_size = 32;
++
++static int fillrect(int i, int j, SDL_Surface * s, SDL_Surface * img, int 
bpp) {
++      int c, v;
++      if (i >= XRES/squares_size || j >= YRES/squares_size)
++              return 0;
++      v = i*squares_size*bpp + j*squares_size*img->pitch;
++      for (c=0; c<squares_size; c++)
++              memcpy(s->pixels + v + c*img->pitch, img->pixels + v + 
c*img->pitch, squares_size*bpp);
++      return 1;
++}
++
+ void squares_effect(SDL_Surface * s, SDL_Surface * img)
+ {
+       int bpp = img->format->BytesPerPixel;
+-      const int squares_size = 32;
+ 
+-      int fillrect(int i, int j) {
+-              int c, v;
+-              if (i >= XRES/squares_size || j >= YRES/squares_size)
+-                      return 0;
+-              v = i*squares_size*bpp + j*squares_size*img->pitch;
+-              for (c=0; c<squares_size; c++)
+-                      memcpy(s->pixels + v + c*img->pitch, img->pixels + v + 
c*img->pitch, squares_size*bpp);
+-              return 1;
+-      }
+-
+       int still_moving = 1;
+ 
+       for (i=0; still_moving; i++) {
+@@ -200,7 +201,7 @@ void squares_effect(SDL_Surface * s, SDL_Surface * img
+ 
+               still_moving = 0;
+               for (j=i; j>=0; j--) {
+-                      if (fillrect(j, k))
++                      if (fillrect(j, k, s, img, bpp))
+                               still_moving = 1;
+                       k++;
+               }
+@@ -212,20 +213,20 @@ void squares_effect(SDL_Surface * s, SDL_Surface * img
+ 
+ /* -------------- Circle ------------------ */
+ 
++static int sqi(int v) { return v*v; }
++
+ int * circle_steps;
+ const int circle_max_steps = 40;
+ void circle_init(void)
+ {
+-      int sqr(int v) { return v*v; }
+-
+       circle_steps = malloc(XRES * YRES * sizeof(int));
+       if (!circle_steps)
+               fb__out_of_memory();
+ 
+       for (y=0; y<YRES; y++)
+               for (x=0; x<XRES; x++) {
+-                      int max = sqrt(sqr(XRES/2) + sqr(YRES/2));
+-                      int value = sqrt(sqr(x-XRES/2) + sqr(y-YRES/2));
++                      int max = sqrt(sqi(XRES/2) + sqi(YRES/2));
++                      int value = sqrt(sqi(x-XRES/2) + sqi(y-YRES/2));
+                       circle_steps[x+y*XRES] = 
(max-value)*circle_max_steps/max;
+               }
+ }
Index: patches/patch-c_stuff_lib_FBLE_pm
===================================================================
RCS file: patches/patch-c_stuff_lib_FBLE_pm
diff -N patches/patch-c_stuff_lib_FBLE_pm
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-c_stuff_lib_FBLE_pm   2 Feb 2020 14:05:17 -0000
@@ -0,0 +1,34 @@
+$OpenBSD$
+
+Perl 5.30+ prohibits using my() in false conditionals
+
+Index: c_stuff/lib/FBLE.pm
+--- c_stuff/lib/FBLE.pm.orig
++++ c_stuff/lib/FBLE.pm
+@@ -31,6 +31,8 @@
+ 
+ package FBLE;
+ 
++use feature qw(state);
++
+ use POSIX(qw(floor ceil));
+ use SDL;
+ use SDL::App;
+@@ -1405,7 +1407,7 @@ sub display_levelset_screenshot {
+                    $rect{middle}->y + $rect{middle}->height/2 - 
$rect{screenshot}->height/8 - 3 + $widgetMove);
+ 
+ 
+-    my %shrinks if 0;
++    state %shrinks;
+     my $current_nb = $start_level || 1;
+     if (!exists $shrinks{$name}{$current_nb}) {
+         my $surf = SDL::Surface->new(-name => 
"$FPATH/gfx/menu/please_wait.png");
+@@ -1417,7 +1419,7 @@ sub display_levelset_screenshot {
+         $app->update($rect{middle});
+ 
+         #- sorta "read ahead": will compute next 10 levels screenshots as well
+-        my $s_save if 0;
++        state $s_save;
+         if (!$s_save) {
+             $s_save = SDL::Surface->new(-name => 
"$FPATH/gfx/level_editor.png");
+         }
Index: patches/patch-frozen-bubble
===================================================================
RCS file: patches/patch-frozen-bubble
diff -N patches/patch-frozen-bubble
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-frozen-bubble 2 Feb 2020 14:05:17 -0000
@@ -0,0 +1,52 @@
+$OpenBSD$
+
+Perl 5.30+ prohibits using my() in false conditionals
+
+Index: frozen-bubble
+--- frozen-bubble.orig
++++ frozen-bubble
+@@ -47,6 +47,8 @@ use vars qw($TARGET_ANIM_SPEED $BUBBLE_SIZE $ROW_SIZE 
+             $lev_number $playermalus $mptrainingdiff $loaded_levelset 
$direct_levelset $chainreaction %chains %img_mini $frame $sock $gameserver 
$mynick
+             $continuegamewhenplayersleave $singleplayertargetting $mylatitude 
$mylongitude %autokick $replayparam $autorecord $comment $saveframes 
$saveframesbase $saveframescounter);
+ 
++use feature qw(state);
++
+ use Getopt::Long;
+ use Data::Dumper;
+ use Locale::gettext;
+@@ -269,7 +271,7 @@ sub play_music($) {
+     $app->delay(400);
+     $app->delay(10) while $mixer->playing_music;  #- mikmod will segfault if 
we try to load a music while old one is still fading out
+     my %musics = (intro => '/snd/introzik.ogg', main1p => 
'/snd/frozen-mainzik-1p.ogg', main2p => '/snd/frozen-mainzik-2p.xm');
+-    my $mus if 0;                                 #- I need to keep a 
reference on the music or it will be collected at the end of this function, 
thus I manually collect previous music
++    state $mus;                                 #- I need to keep a reference 
on the music or it will be collected at the end of this function, thus I 
manually collect previous music
+     if (@playlist) {
+       my $tryanother = sub {
+           my $elem = chomp_(shift @playlist);
+@@ -3488,7 +3490,7 @@ sub choose_1p_game_mode() {
+         };
+ 
+         my $img = $imgbin{'1p_panel'};
+-        my $save if 0;
++        state $save;
+         my $drect = SDL::Rect->new(-width => $img->width, -height => 
$img->height,
+                                    -x => $MENUPOS{xpos_panel}, '-y' => 
$MENUPOS{ypos_panel});
+         if ($save) {
+@@ -5573,7 +5575,7 @@ sub menu {
+                        'highscores' => { pos => 8, type => 'run',
+                                          run => sub { 
$menu_display_highscores->() } },
+                      );
+-    my $current_pos if 0; $current_pos ||= 1;
++    state $current_pos; $current_pos ||= 1;
+     my @menu_invalids;
+     $invalidate_all = sub { push @menu_invalids, $menu_entries{$_}->{pos} 
foreach keys %menu_entries };
+ 
+@@ -5724,7 +5726,7 @@ sub menu {
+       }
+ 
+       if ($graphics_level > 1) {
+-          my $banner_pos if 0;
++          state $banner_pos;
+           $banner_pos ||= 670;
+           foreach my $b (keys %banners) {
+               my $xpos = $banners{$b} - $banner_pos;







Reply via email to