bicycle/src/CardSuit.m3


Copyright (C) 1994, Digital Equipment Corp.
Copyright 1990 David Lemke and Network Computing Devices
 Copyright (c) 1989, Donald R. Woods and Sun Microsystems, Inc.       

MODULE CardSuit;

IMPORT Pixmap, PixmapFromXData;

FROM Card IMPORT Suit, Family;

VAR
  mu := NEW(MUTEX);
  inited := FALSE;
  acepix, rankpix, pippix, rankxip, pipxip: ARRAY Suit OF Pixmap.T;

TYPE SuitData = ARRAY Suit OF PixmapFromXData.T;

CONST
  PipData = SuitData{Spade, Heart, Diamond, Club};
  RankData = SuitData{SmallSpade, SmallHeart, SmallDiamond, SmallClub};

PROCEDURE Init() =
  BEGIN
    FOR s := FIRST(Suit) TO LAST(Suit) DO
      VAR halftone := s = Family.Hearts OR s = Family.Diamonds; BEGIN
        rankpix[s] := PixmapFromXData.P(RankData[s], halftone);
        rankxip[s] := PixmapFromXData.Flip(RankData[s], halftone);
        pippix[s] := PixmapFromXData.P(PipData[s], halftone);
        pipxip[s] := PixmapFromXData.Flip(PipData[s], halftone)
      END;
      IF s = Family.Spades THEN
        acepix[s] := PixmapFromXData.P(BigSpade)
      ELSE
        acepix[s] := pippix[s]
      END
    END;
    inited := TRUE
  END Init;

PROCEDURE AcePix(s: Suit): Pixmap.T =
  BEGIN
    LOCK mu DO
      IF NOT inited THEN Init() END;
      RETURN acepix[s]
    END
  END AcePix;

PROCEDURE RankPix(s: Suit): Pixmap.T =
  BEGIN
    LOCK mu DO
      IF NOT inited THEN Init() END;
      RETURN rankpix[s]
    END
  END RankPix;

PROCEDURE RankXip(s: Suit): Pixmap.T =
  BEGIN
    LOCK mu DO
      IF NOT inited THEN Init() END;
      RETURN rankxip[s]
    END
  END RankXip;

PROCEDURE PipPix(s: Suit): Pixmap.T =
  BEGIN
    LOCK mu DO
      IF NOT inited THEN Init() END;
      RETURN pippix[s]
    END
  END PipPix;

PROCEDURE PipXip(s: Suit): Pixmap.T =
  BEGIN
    LOCK mu DO
      IF NOT inited THEN Init() END;
      RETURN pipxip[s]
    END
  END PipXip;

CONST Spade = PixmapFromXData.T{15, 19,
  "80 00 80 00 c0 01 c0 01 e0 03 f0 07 " &
  "f0 07 f8 0f fc 1f fe 3f fe 3f ff 7f " &
  "ff 7f ff 7f ff 7f be 3e 9c 1c c0 01 " &
  "e0 03 "};

CONST BigSpade = PixmapFromXData.T{39, 52,
  "00 00 08 00 00 00 00 08 00 00 00 00 " &
  "08 00 00 00 00 1c 00 00 00 00 1c 00 " &
  "00 00 00 1c 00 00 00 00 3e 00 00 00 " &
  "00 3e 00 00 00 00 7f 00 00 00 00 7f " &
  "00 00 00 80 ff 00 00 00 c0 ff 01 00 " &
  "00 c0 ff 01 00 00 e0 ff 03 00 00 f0 " &
  "ff 07 00 00 f0 ff 07 00 00 f8 ff 0f " &
  "00 00 fc ff 1f 00 00 fe ff 3f 00 00 " &
  "ff ff 7f 00 80 ff ff ff 00 c0 ff ff " &
  "ff 01 e0 ff ff ff 03 f0 ff ff ff 07 " &
  "f8 ff ff ff 0f f8 ff ff ff 0f fc ff " &
  "ff ff 1f fc ff ff ff 1f fe ff ff ff " &
  "3f fe ff ff ff 3f fe ff ff ff 3f ff " &
  "ff ff ff 7f ff ff ff ff 7f ff ff ff " &
  "ff 7f ff ff ff ff 7f ff ff ff ff 7f " &
  "fe ff ff ff 3f fe ff ff ff 3f fc ff " &
  "be ff 1f fc 7f 1c ff 1f f8 3f 1c fe " &
  "0f f0 1f 1c fc 07 c0 07 1c f0 01 00 " &
  "00 1c 00 00 00 00 3e 00 00 00 00 3e " &
  "00 00 00 00 7f 00 00 00 00 7f 00 00 " &
  "00 80 ff 00 00 00 c0 ff 01 00 00 e0 " &
  "ff 03 00 00 f0 ff 07 00 "};

CONST SmallSpade = PixmapFromXData.T{9, 12,
  "10 00 10 00 38 00 38 00 7c 00 fe 00 " &
  "ff 01 ff 01 ff 01 d6 00 10 00 38 00 "};

CONST Heart = PixmapFromXData.T{15, 17,
  "1c 1c 3e 3e 7f 7f 7f 7f ff 7f ff 7f " &
  "fe 3f fe 3f fc 1f f8 0f f0 07 f0 07 " &
  "e0 03 c0 01 c0 01 80 00 80 00 "};

CONST SmallHeart = PixmapFromXData.T{9, 11,
  "c6 00 ef 01 ff 01 ff 01 fe 00 fe 00 " &
  "7c 00 38 00 38 00 10 00 10 00 "};

CONST Club = PixmapFromXData.T{15, 16,
  "c0 81 e0 83 f0 87 f0 87 f0 87 e0 83 " &
  "dc 9d fe bf ff ff ff ff ff ff be 3e " &
  "9c 1c c0 81 c0 81 e0 83 "};

CONST SmallClub = PixmapFromXData.T{9, 11,
  "38 00 7c 00 7c 00 38 00 d6 00 ff 81 " &
  "ff 81 ff 81 d6 00 00 00 38 00 "};

CONST Diamond = PixmapFromXData.T{13, 19,
  "40 00 40 00 e0 00 e0 00 f0 01 f8 03 " &
  "f8 03 fc 07 fe 0f ff 1f fe 0f fc 07 " &
  "f8 03 f8 03 f0 01 e0 00 e0 00 40 00 " &
  "40 00 "};

CONST SmallDiamond = PixmapFromXData.T{7, 12,
  "08 08 1c 1c 3e 7f 3e 1c 1c 08 08 00 "};

BEGIN
  PixWidth[Family.Spades] := Spade.width;
  PixWidth[Family.Hearts] := Heart.width;
  PixWidth[Family.Diamonds] := Diamond.width;
  PixWidth[Family.Clubs] := Club.width;
  PixHeight[Family.Spades] := Spade.height;
  PixHeight[Family.Hearts] := Heart.height;
  PixHeight[Family.Diamonds] := Diamond.height;
  PixHeight[Family.Clubs] := Club.height;
END CardSuit.

interface Card is in: