Zapisanie dwóch wartości w jednej zmiennej liczbowej

0

Witam,

Aktualnie pracuję na Free Pascalu, ale chodzi mi o takie coś:
Mam typ TColor (w FP jest to: TColor = -$7FFFFFFF-1..$7FFFFFFF ). SizeOf zwraca mi że ma 4 bajty. I teraz czy mógłbym zapisać taki kolor w Longint czy innym 8 bajtowym typie + dodatkową wartość o rozmiarze 1 bajta a potem odczytać te dwie wartości? Chodzi o to że chciałbym stworzyć typ TAlphaColor = longint który będzie potrafił przechować standardowy kolor + kanał alpha (od 0 do 255, czyli bajt)

Pozdrawiam

0

TColor już ma w sobie kanał alpha.

0

jak się nie walnąłem to

var
  x: LongInt;
  Color: TColor;
  Alpha: Byte;
begin
  x := Integer(color) + ((Alpha and $FF) shl 32);

  Color := x and $FFFFFFFF;
  Alpha := (x shr 32) and $FF;
0
_13th_Dragon napisał(a):

TColor już ma w sobie kanał alpha.

Free Pascalu TColor to tylko RGB

Co do rozwiązania, przy "rozkodowywaniu" alpha jest ok, ale kolor jest inny od tego co zapisałem

0

Chodzi mi o taki test:

  // Zapis
  c := clGreen;
  Alpha := 15;
  x := Integer(c) + ((Alpha and $FF) shl 32);

  // Odczyt
  c := x and $FFFFFFFF;
  Alpha := (x shr 32) and $FF;

  // Sprawdzenie
  bOk := (c=clGreen) and (Alpha=15);   

Dostaję że c<>clGreen

0

Nie, dostajesz że Alpha<>15.
Ponieważ nieuważnie przeczytałeś propozycję od @Misiekd.

0

Nie bardzo rozumiem co robi kod zaproponowany przez misiekd. Jeżeli Alpha jest różne od 15 (to jest jakaś losowa liczba) no to chyba też źle, czy nie? Chciałbym z tej zmiennej wyciągnąć te same dwie wartości (kolo i wartość alpha) które do niej zapisałem.

0

Wszyscy to dawno zrozumieli i propozycja od @Misiekd to robi i robi to poprawnie, zaś twoja modyfikacja jego pomysłu jest niepoprawna.

0

Ale ja przecież nic nie modyfikowałem

0

Jakiego typu masz x? 32 bitowy? To gdzie ma się zmieścić twoja Alpha? Zamień 32 na 24 (w obu miejscach) wg mojej rady lub zrób x 64-bitowym.

0

X był u mnie 64 bitowy ale żadna z kombinacji nie dawała rezultatu jaki oczekiwałem. Ostatecznie poradziłem sobie metodą Move():

var
  c: TColor;
  Alpha: Byte;  
  x: Int64;
begin
  // Inicjalizacja losowych wartości
  c := clGreen;
  Alpha := 15;

  // Zapis
  Move(c,x,SizeOf(c)); // kolor to pierwsze 4 bajty
  Move(Alpha,PChar(@x)[SizeOf(c)],SizeOf(Alpha)); // kanał alpha zapisujemy zaraz za kolorem jako 5 bajt

  // Odczyt
  Move(x,c,SizeOf(c)); // pierwsze 4 bajty to kolor
  Move(PChar(@x)[SizeOf(c)],Alpha,SizeOf(Alpha)); // 5 bajt to kanał alpha
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1