diff --git a/tim2view.lpi b/tim2view.lpi index 934cb8c..d678536 100644 --- a/tim2view.lpi +++ b/tim2view.lpi @@ -27,7 +27,7 @@ - + diff --git a/utim.pas b/utim.pas index 1fdf91a..78f67cf 100644 --- a/utim.pas +++ b/utim.pas @@ -105,7 +105,10 @@ type IMAGE: PIMAGEHeader; dwSize: Integer; DATA: PTIMDataArray; - bGOOD: Boolean; + + UseExtClut: Boolean; + ExtCLUT: PCLUTHeader; + ExtCLUT_DATA: PCLUT_COLORS; end; PTIM = ^TTIM; @@ -149,15 +152,15 @@ uses function ConvertTIMColor(COLOR: word): TCLUT_COLOR; begin - Result.R := (COLOR and $1F) * 8; - Result.G := ((COLOR and $3E0) shr 5) * 8; - Result.B := ((COLOR and $7C00) shr 10) * 8; + Result.R := (COLOR and $1F) shl 3; + Result.G := ((COLOR and $3E0) shr 5) shl 3; + Result.B := ((COLOR and $7C00) shr 10) shl 3; Result.STP := ((COLOR and $8000) shr 15); end; function ConvertCLUTColor(COLOR: TCLUT_COLOR): word; begin - Result := Word(COLOR.STP shl 15) or Word((COLOR.B div 8) shl 10) or Word((COLOR.G div 8) shl 5) or Word(COLOR.R div 8); + Result := Word(COLOR.STP shl 15) or Word((COLOR.B shr 3) shl 10) or Word((COLOR.G shr 3) shl 5) or Word(COLOR.R shr 3); end; function GetCLUTColor(TIM: PTIM; CLUT_NUM, COLOR_NUM: Integer): TCLUT_COLOR; @@ -167,16 +170,19 @@ var begin if (TIM^.HEAD^.bBPP in [cTIM4NC, cTIM8NC]) then begin - Result.R := random($20) * 8; - Result.G := random($20) * 8; - Result.B := random($20) * 8; + Result.R := random($20) shl 3; + Result.G := random($20) shl 3; + Result.B := random($20) shl 3; Result.STP := 1; Exit; end; CLUT_OFFSET := CLUT_NUM * GetTimColorsCount(TIM) * 2; - Move(TIM^.DATA^[SizeOf(TTIMHeader) + SizeOf(TCLUTHeader) + COLOR_NUM * 2 + CLUT_OFFSET], COLOR, 2); + if (not TIM^.UseExtClut) then + Move(TIM^.DATA^[SizeOf(TTIMHeader) + SizeOf(TCLUTHeader) + COLOR_NUM * 2 + CLUT_OFFSET], COLOR, 2) + else + Move(TIM^.ExtCLUT_DATA^[COLOR_NUM * 2 + CLUT_OFFSET], COLOR, sizeof(TCLUT_COLOR)); Result := ConvertTIMColor(COLOR); end; @@ -207,7 +213,7 @@ function GetTIMCLUTSize(TIM: PTIM): Integer; begin Result := 0; if not TIMHasCLUT(TIM) then Exit; - Result := TIM^.CLUT^.wColorsCount * TIM^.CLUT^.wClutsCount * 2 + SizeOf(TCLUTHeader); + Result := GetTimColorsCount(TIM) * GetTimClutsCount(TIM) * 2 + SizeOf(TCLUTHeader); end; function GetTIMIMAGESize(TIM: PTIM): Integer; @@ -247,22 +253,22 @@ end; function CheckCLUTVramX(TIM: PTIM): Boolean; begin - Result := (TIM^.CLUT^.wVRAMX + TIM^.CLUT^.wColorsCount) <= cCLUTColorsMax; + Result := (GetTimClutVRAMX(TIM) + GetTimColorsCount(TIM)) <= cCLUTColorsMax; end; function CheckCLUTVramY(TIM: PTIM): Boolean; begin - Result := (TIM^.CLUT^.wVRAMY + TIM^.CLUT^.wClutsCount) <= cCLUTCountMax; + Result := (GetTimClutVRAMY(TIM) + GetTimClutsCount(TIM)) <= cCLUTCountMax; end; function CheckCLUTColors(TIM: PTIM): Boolean; begin - Result := (TIM^.CLUT^.wColorsCount >= 1) and (TIM^.CLUT^.wColorsCount <= cCLUTColorsMax); + Result := (GetTimColorsCount(TIM) >= 1) and (GetTimColorsCount(TIM) <= cCLUTColorsMax); end; function CheckCLUTCount(TIM: PTIM): Boolean; begin - Result := (TIM^.CLUT^.wClutsCount >= 1) and (TIM^.CLUT^.wClutsCount <= cCLUTCountMax); + Result := (GetTimClutsCount(TIM) >= 1) and (GetTimClutsCount(TIM) <= cCLUTCountMax); end; function IWidthToRWidth(TIM: PTIM): word; @@ -401,10 +407,13 @@ begin if not CheckTIMSize(TIM) then Exit; TIM^.dwSize := GetTIMSize(TIM); - TIM^.bGOOD := TIMIsGood(TIM); Move(PBytesArray(BUFFER)^[TIM_POS], TIM^.DATA^[0], TIM^.dwSize); + TIM^.UseExtClut := False; + TIM^.ExtCLUT := nil; + TIM^.ExtCLUT_DATA := nil; + Result := True; end; @@ -527,7 +536,9 @@ begin Result^.dwSize := 0; Result^.dwTimPosition := 0; Result^.dwTimNumber := 0; - Result^.bGOOD := False; + Result^.UseExtClut := False; + Result^.ExtCLUT := nil; + Result^.ExtCLUT_DATA := nil; New(Result^.DATA); ClearTIM(Result); end; @@ -592,12 +603,18 @@ end; function GetTimColorsCount(TIM: PTIM): word; begin - Result := TIM^.CLUT^.wColorsCount; + if (not TIM^.UseExtClut) then + Result := TIM^.ExtCLUT^.wColorsCount + else + Result := TIM^.CLUT^.wColorsCount; end; function GetTimClutsCount(TIM: PTIM): word; begin - Result := TIM^.CLUT^.wClutsCount; + if (not TIM^.UseExtClut) then + Result := TIM^.ExtCLUT^.wClutsCount + else + Result := TIM^.CLUT^.wClutsCount; end; function GetTimBPP(TIM: PTIM): Integer; @@ -607,17 +624,26 @@ end; function GetTimClutSizeHeader(TIM: PTIM): Integer; begin - Result := TIM^.CLUT^.dwSize; + if (not TIM^.UseExtClut) then + Result := TIM^.ExtCLUT^.dwSize + else + Result := TIM^.CLUT^.dwSize; end; function GetTimClutVRAMX(TIM: PTIM): word; begin - Result := TIM^.CLUT^.wVRAMX; + if (not TIM^.UseExtClut) then + Result := TIM^.ExtCLUT^.wVRAMX + else + Result := TIM^.CLUT^.wVRAMX; end; function GetTimClutVRAMY(TIM: PTIM): word; begin - Result := TIM^.CLUT^.wVRAMY; + if (not TIM^.UseExtClut) then + Result := TIM^.ExtCLUT^.wVRAMY + else + Result := TIM^.CLUT^.wVRAMY; end; function GetTimImageSizeHeader(TIM: PTIM): Integer;