diff --git a/VBA.sln b/VBA.sln
index 86673eb4..33c21974 100644
--- a/VBA.sln
+++ b/VBA.sln
@@ -2,10 +2,16 @@ Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VisualBoyAdvance", "VBA.vcproj", "{6D4C5EC8-933F-4C05-A1BF-498E658576DF}"
ProjectSection(ProjectDependencies) = postProject
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092} = {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}
{DB5C12E9-BCD3-4517-8708-475C0D1D88CE} = {DB5C12E9-BCD3-4517-8708-475C0D1D88CE}
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F} = {96E945F7-0377-48DA-A5F8-1C192DE9F25F}
EndProjectSection
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cximage", "src\win32\dependencies\cximage\cximage.vcproj", "{DB5C12E9-BCD3-4517-8708-475C0D1D88CE}"
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\dependencies\zlib\zlib.vcproj", "{B938FBD9-C7F9-4BF7-8C27-68865D1FA092}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "..\dependencies\libpng\libpng.vcproj", "{96E945F7-0377-48DA-A5F8-1C192DE9F25F}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cximage", "..\dependencies\cximage\cximage.vcproj", "{DB5C12E9-BCD3-4517-8708-475C0D1D88CE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -20,6 +26,18 @@ Global
{6D4C5EC8-933F-4C05-A1BF-498E658576DF}.Optimized|Win32.Build.0 = Optimized|Win32
{6D4C5EC8-933F-4C05-A1BF-498E658576DF}.Release|Win32.ActiveCfg = Release|Win32
{6D4C5EC8-933F-4C05-A1BF-498E658576DF}.Release|Win32.Build.0 = Release|Win32
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}.Debug|Win32.ActiveCfg = Debug|Win32
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}.Debug|Win32.Build.0 = Debug|Win32
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}.Optimized|Win32.ActiveCfg = Release|Win32
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}.Optimized|Win32.Build.0 = Release|Win32
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}.Release|Win32.ActiveCfg = Release|Win32
+ {B938FBD9-C7F9-4BF7-8C27-68865D1FA092}.Release|Win32.Build.0 = Release|Win32
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F}.Debug|Win32.ActiveCfg = Debug|Win32
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F}.Debug|Win32.Build.0 = Debug|Win32
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F}.Optimized|Win32.ActiveCfg = Release|Win32
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F}.Optimized|Win32.Build.0 = Release|Win32
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F}.Release|Win32.ActiveCfg = Release|Win32
+ {96E945F7-0377-48DA-A5F8-1C192DE9F25F}.Release|Win32.Build.0 = Release|Win32
{DB5C12E9-BCD3-4517-8708-475C0D1D88CE}.Debug|Win32.ActiveCfg = Debug|Win32
{DB5C12E9-BCD3-4517-8708-475C0D1D88CE}.Debug|Win32.Build.0 = Debug|Win32
{DB5C12E9-BCD3-4517-8708-475C0D1D88CE}.Optimized|Win32.ActiveCfg = Release|Win32
diff --git a/VBA.vcproj b/VBA.vcproj
index a6573a9e..75b42a91 100644
--- a/VBA.vcproj
+++ b/VBA.vcproj
@@ -191,7 +191,7 @@
Name="VCLinkerTool"
RegisterOutput="false"
IgnoreImportLibrary="false"
- AdditionalDependencies="nafxcw.lib LIBCMT.lib Vfw32.Lib OpenGL32.Lib dinput8.lib winmm.lib dxguid.lib ddraw.lib d3d9.lib d3dx9.lib Dsound.lib zlib.lib libpng.lib"
+ AdditionalDependencies="nafxcw.lib LIBCMT.lib Vfw32.Lib OpenGL32.Lib dinput8.lib winmm.lib dxguid.lib ddraw.lib d3d9.lib d3dx9.lib Dsound.lib"
ShowProgress="0"
OutputFile="$(ProjectDir)VisualBoyAdvance.exe"
Version=""
@@ -1118,26 +1118,6 @@
>
-
-
-
-
-
-
-
-
-
-
diff --git a/src/GBAinline.h b/src/GBAinline.h
index b268c6e5..aa863e77 100644
--- a/src/GBAinline.h
+++ b/src/GBAinline.h
@@ -23,7 +23,6 @@
#include "System.h"
#include "Port.h"
#include "RTC.h"
-#include "Sound.h"
extern bool cpuSramEnabled;
extern bool cpuFlashEnabled;
@@ -98,9 +97,9 @@ static inline u32 CPUReadMemory(u32 address)
LinkSStop();
if((address < 0x4000400) && ioReadable[address & 0x3fc]) {
if(ioReadable[(address & 0x3fc) + 2])
- value = soundRead32(address & 0x3fC);
+ value = READ32LE(((u32 *)&ioMem[address & 0x3fC]));
else
- value = soundRead16(address & 0x3fc);
+ value = READ16LE(((u16 *)&ioMem[address & 0x3fc]));
} else goto unreadable;
break;
case 5:
@@ -223,7 +222,7 @@ if((address>=0x4000120||address<=0x4000126)&&lspeed)
LinkSStop();
if((address < 0x4000400) && ioReadable[address & 0x3fe])
{
- value = soundRead16(address & 0x3fe);
+ value = READ16LE(((u16 *)&ioMem[address & 0x3fe]));
if (((address & 0x3fe)>0xFF) && ((address & 0x3fe)<0x10E))
{
if (((address & 0x3fe) == 0x100) && timer0On)
@@ -337,7 +336,7 @@ static inline u8 CPUReadByte(u32 address)
if((address>=0x4000120||address<=0x4000126)&&lspeed)
LinkSStop();
if((address < 0x4000400) && ioReadable[address & 0x3ff])
- return soundRead(address & 0x3ff);
+ return ioMem[address & 0x3ff];
else goto unreadable;
case 5:
return paletteRAM[address & 0x3ff];
diff --git a/src/Gb_Apu/Blip_Buffer.cpp b/src/Gb_Apu/Blip_Buffer.cpp
index 4e106ed8..81da8362 100644
--- a/src/Gb_Apu/Blip_Buffer.cpp
+++ b/src/Gb_Apu/Blip_Buffer.cpp
@@ -320,7 +320,7 @@ void Blip_Synth_::volume_unit( double new_unit )
factor *= 2.0;
}
- // if ( shift )
+ if ( shift )
{
kernel_unit >>= shift;
assert( kernel_unit > 0 ); // fails if volume unit is too low
diff --git a/src/Gb_Apu/Gb_Oscs.cpp b/src/Gb_Apu/Gb_Oscs.cpp
index 4bf97407..da3b8f04 100644
--- a/src/Gb_Apu/Gb_Oscs.cpp
+++ b/src/Gb_Apu/Gb_Oscs.cpp
@@ -198,7 +198,7 @@ void Gb_Noise::run( gb_time_t time, gb_time_t end_time, int playing )
const blip_resampled_time_t resampled_period =
output->resampled_duration( period );
blip_resampled_time_t resampled_time = output->resampled_time( time );
-// unsigned bits = this->bits;
+ unsigned bits = this->bits;
int delta = amp * 2;
do
@@ -216,7 +216,7 @@ void Gb_Noise::run( gb_time_t time, gb_time_t end_time, int playing )
}
while ( time < end_time );
- //this->bits = bits;
+ this->bits = bits;
last_amp = delta >> 1;
}
delay = time - end_time;
diff --git a/src/Sound.cpp b/src/Sound.cpp
index 498ff286..8177ad5e 100644
--- a/src/Sound.cpp
+++ b/src/Sound.cpp
@@ -1,6 +1,7 @@
// VisualBoyAdvance - Nintendo Gameboy/GameboyAdvance (TM) emulator.
// Copyright (C) 1999-2003 Forgotten
// Copyright (C) 2004 Forgotten and the VBA development team
+// Copyright (C) 2004-2006 VBA development team
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
@@ -18,27 +19,22 @@
#include
+#include "Sound.h"
+
#include "GBA.h"
#include "Globals.h"
-#include "Sound.h"
#include "Util.h"
#include "snd_interp.h"
-#include "Gb_Apu/Multi_Buffer.h"
-#include "Gb_Apu/Gb_Apu.h"
-#ifdef _WIN32
-#include
-#endif
#define USE_TICKS_AS 380
#define SOUND_MAGIC 0x60000000
#define SOUND_MAGIC_2 0x30000000
-#define NOISE_MAGIC 5
+#define NOISE_MAGIC 5
extern bool stopState;
-extern bool cpuDmaHack2;
u8 soundWavePattern[4][32] = {
{0x01,0x01,0x01,0x01,
@@ -121,10 +117,6 @@ int soundTicks = soundQuality * USE_TICKS_AS;
int SOUND_CLOCK_TICKS = soundQuality * USE_TICKS_AS;
u32 soundNextPosition = 0;
-Multi_Buffer * apu_out = NULL;
-Gb_Apu * apu = NULL;
-bool apu_saved = false;
-
int soundLevel1 = 0;
int soundLevel2 = 0;
int soundBalance = 0;
@@ -395,69 +387,240 @@ inline int interp_pop(int ch)
// *** End snd_interp code
-static void soundEventGB(u32 address, u8 data)
-{
- if ( apu )
- {
- int divisor = 4 * soundQuality;
- int clock = (SOUND_CLOCK_TICKS - soundTicks + (divisor >> 1)) / divisor;
- apu->write_register(clock, address, data);
- }
- else
- ioMem[address] = data;
-}
-u8 soundRead(u32 address)
-{
- if (address < NR10 || address > 0x9F || !apu) return ioMem[address];
- if (address == NR51) return soundBalance;
- int divisor = 4 * soundQuality;
- int clock = (SOUND_CLOCK_TICKS - soundTicks + (divisor >> 1)) / divisor;
- switch (address)
- {
+
+void soundEvent(u32 address, u8 data)
+{
+ int freq = 0;
+
+ switch(address) {
case NR10:
- return apu->read_register(clock, 0xFF10);
+ data &= 0x7f;
+ sound1SweepATL = sound1SweepATLReload = 344 * ((data >> 4) & 7);
+ sound1SweepSteps = data & 7;
+ sound1SweepUpDown = data & 0x08;
+ sound1SweepStep = 0;
+ ioMem[address] = data;
+ break;
case NR11:
- return apu->read_register(clock, 0xFF11);
+ sound1Wave = soundWavePattern[data >> 6];
+ sound1ATL = 172 * (64 - (data & 0x3f));
+ ioMem[address] = data;
+ break;
case NR12:
- return apu->read_register(clock, 0xFF12);
+ sound1EnvelopeUpDown = data & 0x08;
+ sound1EnvelopeATLReload = 689 * (data & 7);
+ if((data & 0xF8) == 0)
+ sound1EnvelopeVolume = 0;
+ ioMem[address] = data;
+ break;
case NR13:
- return apu->read_register(clock, 0xFF13);
+ freq = (((int)(ioMem[NR14] & 7)) << 8) | data;
+ sound1ATL = 172 * (64 - (ioMem[NR11] & 0x3f));
+ freq = 2048 - freq;
+ if(freq) {
+ sound1Skip = SOUND_MAGIC / freq;
+ } else
+ sound1Skip = 0;
+ ioMem[address] = data;
+ break;
case NR14:
- return apu->read_register(clock, 0xFF14);
+ data &= 0xC7;
+ freq = (((int)(data&7) << 8) | ioMem[NR13]);
+ freq = 2048 - freq;
+ sound1ATL = 172 * (64 - (ioMem[NR11] & 0x3f));
+ sound1Continue = data & 0x40;
+ if(freq) {
+ sound1Skip = SOUND_MAGIC / freq;
+ } else
+ sound1Skip = 0;
+ if(data & 0x80) {
+ ioMem[NR52] |= 1;
+ sound1EnvelopeVolume = ioMem[NR12] >> 4;
+ sound1EnvelopeUpDown = ioMem[NR12] & 0x08;
+ sound1ATL = 172 * (64 - (ioMem[NR11] & 0x3f));
+ sound1EnvelopeATLReload = sound1EnvelopeATL = 689 * (ioMem[NR12] & 7);
+ sound1SweepATL = sound1SweepATLReload = 344 * ((ioMem[NR10] >> 4) & 7);
+ sound1SweepSteps = ioMem[NR10] & 7;
+ sound1SweepUpDown = ioMem[NR10] & 0x08;
+ sound1SweepStep = 0;
+
+ sound1Index = 0;
+ sound1On = 1;
+ }
+ ioMem[address] = data;
+ break;
case NR21:
- return apu->read_register(clock, 0xFF16);
+ sound2Wave = soundWavePattern[data >> 6];
+ sound2ATL = 172 * (64 - (data & 0x3f));
+ ioMem[address] = data;
+ break;
case NR22:
- return apu->read_register(clock, 0xFF17);
+ sound2EnvelopeUpDown = data & 0x08;
+ sound2EnvelopeATLReload = 689 * (data & 7);
+ if((data & 0xF8) == 0)
+ sound2EnvelopeVolume = 0;
+ ioMem[address] = data;
+ break;
case NR23:
- return apu->read_register(clock, 0xFF18);
+ freq = (((int)(ioMem[NR24] & 7)) << 8) | data;
+ sound2ATL = 172 * (64 - (ioMem[NR21] & 0x3f));
+ freq = 2048 - freq;
+ if(freq) {
+ sound2Skip = SOUND_MAGIC / freq;
+ } else
+ sound2Skip = 0;
+ ioMem[address] = data;
+ break;
case NR24:
- return apu->read_register(clock, 0xFF19);
+ data &= 0xC7;
+ freq = (((int)(data&7) << 8) | ioMem[NR23]);
+ freq = 2048 - freq;
+ sound2ATL = 172 * (64 - (ioMem[NR21] & 0x3f));
+ sound2Continue = data & 0x40;
+ if(freq) {
+ sound2Skip = SOUND_MAGIC / freq;
+ } else
+ sound2Skip = 0;
+ if(data & 0x80) {
+ ioMem[NR52] |= 2;
+ sound2EnvelopeVolume = ioMem[NR22] >> 4;
+ sound2EnvelopeUpDown = ioMem[NR22] & 0x08;
+ sound2ATL = 172 * (64 - (ioMem[NR21] & 0x3f));
+ sound2EnvelopeATLReload = sound2EnvelopeATL = 689 * (ioMem[NR22] & 7);
+
+ sound2Index = 0;
+ sound2On = 1;
+ }
+ ioMem[address] = data;
+ break;
case NR30:
- return apu->read_register(clock, 0xFF1A);
+ data &= 0xe0;
+ if(!(data & 0x80)) {
+ ioMem[NR52] &= 0xfb;
+ sound3On = 0;
+ }
+ if(((data >> 6) & 1) != sound3Bank)
+ memcpy(&ioMem[0x90], &sound3WaveRam[(((data >> 6) & 1) * 0x10)^0x10],
+ 0x10);
+ sound3Bank = (data >> 6) & 1;
+ sound3DataSize = (data >> 5) & 1;
+ ioMem[address] = data;
+ break;
case NR31:
- return apu->read_register(clock, 0xFF1B);
+ sound3ATL = 172 * (256-data);
+ ioMem[address] = data;
+ break;
case NR32:
- return apu->read_register(clock, 0xFF1C);
+ data &= 0xe0;
+ sound3OutputLevel = (data >> 5) & 3;
+ sound3ForcedOutput = (data >> 7) & 1;
+ ioMem[address] = data;
+ break;
case NR33:
- return apu->read_register(clock, 0xFF1D);
+ freq = 2048 - (((int)(ioMem[NR34]&7) << 8) | data);
+ if(freq) {
+ sound3Skip = SOUND_MAGIC_2 / freq;
+ } else
+ sound3Skip = 0;
+ ioMem[address] = data;
+ break;
case NR34:
- return apu->read_register(clock, 0xFF1E);
+ data &= 0xc7;
+ freq = 2048 - (((data &7) << 8) | (int)ioMem[NR33]);
+ if(freq) {
+ sound3Skip = SOUND_MAGIC_2 / freq;
+ } else {
+ sound3Skip = 0;
+ }
+ sound3Continue = data & 0x40;
+ if((data & 0x80) && (ioMem[NR30] & 0x80)) {
+ ioMem[NR52] |= 4;
+ sound3ATL = 172 * (256 - ioMem[NR31]);
+ sound3Index = 0;
+ sound3On = 1;
+ }
+ ioMem[address] = data;
+ break;
case NR41:
- return apu->read_register(clock, 0xFF20);
+ data &= 0x3f;
+ sound4ATL = 172 * (64 - (data & 0x3f));
+ ioMem[address] = data;
+ break;
case NR42:
- return apu->read_register(clock, 0xFF21);
+ sound4EnvelopeUpDown = data & 0x08;
+ sound4EnvelopeATLReload = 689 * (data & 7);
+ if((data & 0xF8) == 0)
+ sound4EnvelopeVolume = 0;
+ ioMem[address] = data;
+ break;
case NR43:
- return apu->read_register(clock, 0xFF22);
+ freq = soundFreqRatio[data & 7];
+ sound4NSteps = data & 0x08;
+
+ sound4Skip = (freq << 8) / NOISE_MAGIC;
+
+ sound4Clock = data >> 4;
+
+ freq = freq / soundShiftClock[sound4Clock];
+
+ sound4ShiftSkip = (freq << 8) / NOISE_MAGIC;
+ ioMem[address] = data;
+ break;
case NR44:
- return apu->read_register(clock, 0xFF23);
+ data &= 0xc0;
+ sound4Continue = data & 0x40;
+ if(data & 0x80) {
+ ioMem[NR52] |= 8;
+ sound4EnvelopeVolume = ioMem[NR42] >> 4;
+ sound4EnvelopeUpDown = ioMem[NR42] & 0x08;
+ sound4ATL = 172 * (64 - (ioMem[NR41] & 0x3f));
+ sound4EnvelopeATLReload = sound4EnvelopeATL = 689 * (ioMem[NR42] & 7);
+
+ sound4On = 1;
+
+ sound4Index = 0;
+ sound4ShiftIndex = 0;
+
+ freq = soundFreqRatio[ioMem[NR43] & 7];
+
+ sound4Skip = (freq << 8) / NOISE_MAGIC;
+
+ sound4NSteps = ioMem[NR43] & 0x08;
+
+ freq = freq / soundShiftClock[ioMem[NR43] >> 4];
+
+ sound4ShiftSkip = (freq << 8) / NOISE_MAGIC;
+ if(sound4NSteps)
+ sound4ShiftRight = 0x7fff;
+ else
+ sound4ShiftRight = 0x7f;
+ }
+ ioMem[address] = data;
+ break;
case NR50:
- return apu->read_register(clock, 0xFF24);
+ data &= 0x77;
+ soundLevel1 = data & 7;
+ soundLevel2 = (data >> 4) & 7;
+ ioMem[address] = data;
+ break;
case NR51:
- return apu->read_register(clock, 0xFF25);
+ soundBalance = (data & soundEnableFlag);
+ ioMem[address] = data;
+ break;
case NR52:
- return apu->read_register(clock, 0xFF26);
+ data &= 0x80;
+ data |= ioMem[NR52] & 15;
+ soundMasterOn = data & 0x80;
+ if(!(data & 0x80)) {
+ sound1On = 0;
+ sound2On = 0;
+ sound3On = 0;
+ sound4On = 0;
+ }
+ ioMem[address] = data;
+ break;
case 0x90:
case 0x91:
case 0x92:
@@ -474,108 +637,8 @@ u8 soundRead(u32 address)
case 0x9d:
case 0x9e:
case 0x9f:
- return apu->read_register(clock, 0xFF30 - 0x90 + address);
- }
-
- return ioMem[address];
- }
-
- u16 soundRead16(u32 address)
- {
- address &= ~1;
- u16 temp = soundRead(address);
- temp |= soundRead(address + 1) << 8;
- return temp;
- }
-
- u32 soundRead32(u32 address)
- {
- address &= ~3;
- u32 temp = soundRead16(address);
- temp |= soundRead16(address + 2) << 16;
- return temp;
- }
-
-
- void soundEvent(u32 address, u8 data)
- {
- switch(address) {
- case NR10:
- soundEventGB(0xFF10, data);
- break;
- case NR11:
- soundEventGB(0xFF11, data);
- break;
- case NR12:
- soundEventGB(0xFF12, data);
- break;
- case NR13:
- soundEventGB(0xFF13, data);
- break;
- case NR14:
- soundEventGB(0xFF14, data);
- break;
- case NR21:
- soundEventGB(0xFF16, data);
- break;
- case NR22:
- soundEventGB(0xFF17, data);
- break;
- case NR23:
- soundEventGB(0xFF18, data);
- break;
- case NR24:
- soundEventGB(0xFF19, data);
+ sound3WaveRam[(sound3Bank*0x10)^0x10+(address&15)] = data;
break;
- case NR30:
- soundEventGB(0xFF1A, data);
- break;
- case NR31:
- soundEventGB(0xFF1B, data);
- break;
- case NR32:
- soundEventGB(0xFF1C, data);
- break;
- case NR33:
- soundEventGB(0xFF1D, data);
- break;
- case NR34:
- soundEventGB(0xFF1E, data);
- break;
- case NR41:
- soundEventGB(0xFF20, data);
- break;
- case NR42:
- soundEventGB(0xFF21, data);
- break;
- case NR43:
- soundEventGB(0xFF22, data);
- break;
- case NR44:
- soundEventGB(0xFF23, data);
- break;
- case NR50:
- soundEventGB(0xFF24, data);
- break;
- case NR51:
- soundBalance = data;
- soundEventGB(0xFF25, data & soundEnableFlag);
- break;
- case NR52:
- soundEventGB(0xFF26, data);
- break;
-
- case 0x90:
- case 0x92:
- case 0x94:
- case 0x96:
- case 0x98:
- case 0x9a:
- case 0x9c:
- case 0x9e:
- soundEventGB(0xFF30 + (address & 14), data);
- soundEventGB(0xFF31 + (address & 14), 0); // data >> 8);
- break;
}
}
@@ -584,7 +647,7 @@ void soundEvent(u32 address, u16 data)
switch(address) {
case SGCNT0_H:
data &= 0xFF0F;
- soundControl = data & 0x770F;;
+ soundControl = data & 0x770F;
if(data & 0x0800) {
soundDSFifoAWriteIndex = 0;
soundDSFifoAIndex = 0;
@@ -603,12 +666,7 @@ void soundEvent(u32 address, u16 data)
}
soundDSBEnabled = (data & 0x3000) ? true : false;
soundDSBTimer = (data & 0x4000) ? 1 : 0;
- if (data & 0x8000)
- {
- interp_reset(0);
- interp_reset(1);
- }
- *((u16 *)&ioMem[address]) = data;
+ *((u16 *)&ioMem[address]) = soundControl;
break;
case FIFOA_L:
case FIFOA_H:
@@ -638,33 +696,260 @@ void soundEvent(u32 address, u16 data)
case 0x9a:
case 0x9c:
case 0x9e:
- soundEventGB(0xFF30 + (address & 14), data & 0xff);
- soundEventGB(0xFF31 + (address & 14), data >> 8);
+ *((u16 *)&sound3WaveRam[(sound3Bank*0x10)^0x10+(address&14)]) = data;
+ *((u16 *)&ioMem[address]) = data;
break;
}
}
void soundChannel1()
{
+ int vol = sound1EnvelopeVolume;
+
+ int freq = 0;
+ int value = 0;
+
+ if(sound1On && (sound1ATL || !sound1Continue)) {
+ sound1Index += soundQuality*sound1Skip;
+ sound1Index &= 0x1fffffff;
+
+ value = ((s8)sound1Wave[sound1Index>>24]) * vol;
+ }
+
+ soundBuffer[0][soundIndex] = value;
+
+
+ if(sound1On) {
+ if(sound1ATL) {
+ sound1ATL-=soundQuality;
+
+ if(sound1ATL <=0 && sound1Continue) {
+ ioMem[NR52] &= 0xfe;
+ sound1On = 0;
+ }
+ }
+
+ if(sound1EnvelopeATL) {
+ sound1EnvelopeATL-=soundQuality;
+
+ if(sound1EnvelopeATL<=0) {
+ if(sound1EnvelopeUpDown) {
+ if(sound1EnvelopeVolume < 15)
+ sound1EnvelopeVolume++;
+ } else {
+ if(sound1EnvelopeVolume)
+ sound1EnvelopeVolume--;
+ }
+
+ sound1EnvelopeATL += sound1EnvelopeATLReload;
+ }
+ }
+
+ if(sound1SweepATL) {
+ sound1SweepATL-=soundQuality;
+
+ if(sound1SweepATL<=0) {
+ freq = (((int)(ioMem[NR14]&7) << 8) | ioMem[NR13]);
+
+ int updown = 1;
+
+ if(sound1SweepUpDown)
+ updown = -1;
+
+ int newfreq = 0;
+ if(sound1SweepSteps) {
+ newfreq = freq + updown * freq / (1 << sound1SweepSteps);
+ if(newfreq == freq)
+ newfreq = 0;
+ } else
+ newfreq = freq;
+
+ if(newfreq < 0) {
+ sound1SweepATL += sound1SweepATLReload;
+ } else if(newfreq > 2047) {
+ sound1SweepATL = 0;
+ sound1On = 0;
+ ioMem[NR52] &= 0xfe;
+ } else {
+ sound1SweepATL += sound1SweepATLReload;
+ sound1Skip = SOUND_MAGIC/(2048 - newfreq);
+
+ ioMem[NR13] = newfreq & 0xff;
+ ioMem[NR14] = (ioMem[NR14] & 0xf8) |((newfreq >> 8) & 7);
+ }
+ }
+ }
+ }
}
void soundChannel2()
{
+ // int freq = 0;
+ int vol = sound2EnvelopeVolume;
+
+ int value = 0;
+
+ if(sound2On && (sound2ATL || !sound2Continue)) {
+ sound2Index += soundQuality*sound2Skip;
+ sound2Index &= 0x1fffffff;
+
+ value = ((s8)sound2Wave[sound2Index>>24]) * vol;
+ }
+
+ soundBuffer[1][soundIndex] = value;
+
+ if(sound2On) {
+ if(sound2ATL) {
+ sound2ATL-=soundQuality;
+
+ if(sound2ATL <= 0 && sound2Continue) {
+ ioMem[NR52] &= 0xfd;
+ sound2On = 0;
+ }
+ }
+
+ if(sound2EnvelopeATL) {
+ sound2EnvelopeATL-=soundQuality;
+
+ if(sound2EnvelopeATL <= 0) {
+ if(sound2EnvelopeUpDown) {
+ if(sound2EnvelopeVolume < 15)
+ sound2EnvelopeVolume++;
+ } else {
+ if(sound2EnvelopeVolume)
+ sound2EnvelopeVolume--;
+ }
+ sound2EnvelopeATL += sound2EnvelopeATLReload;
+ }
+ }
+ }
}
void soundChannel3()
{
+ int value = sound3Last;
+
+ if(sound3On && (sound3ATL || !sound3Continue)) {
+ sound3Index += soundQuality*sound3Skip;
+ if(sound3DataSize) {
+ sound3Index &= 0x3fffffff;
+ value = sound3WaveRam[sound3Index>>25];
+ } else {
+ sound3Index &= 0x1fffffff;
+ value = sound3WaveRam[sound3Bank*0x10 + (sound3Index>>25)];
+ }
+
+ if( (sound3Index & 0x01000000)) {
+ value &= 0x0f;
+ } else {
+ value >>= 4;
+ }
+
+ value -= 8;
+ value *= 2;
+
+ if(sound3ForcedOutput) {
+ value = ((value >> 1) + value) >> 1;
+ } else {
+ switch(sound3OutputLevel) {
+ case 0:
+ value = 0;
+ break;
+ case 1:
+ break;
+ case 2:
+ value = (value >> 1);
+ break;
+ case 3:
+ value = (value >> 2);
+ break;
+ }
+ }
+ sound3Last = value;
+ }
+
+ soundBuffer[2][soundIndex] = value;
+
+ if(sound3On) {
+ if(sound3ATL) {
+ sound3ATL-=soundQuality;
+
+ if(sound3ATL <= 0 && sound3Continue) {
+ ioMem[NR52] &= 0xfb;
+ sound3On = 0;
+ }
+ }
+ }
}
void soundChannel4()
{
+ int vol = sound4EnvelopeVolume;
+
+ int value = 0;
+
+ if(sound4Clock <= 0x0c) {
+ if(sound4On && (sound4ATL || !sound4Continue)) {
+ sound4Index += soundQuality*sound4Skip;
+ sound4ShiftIndex += soundQuality*sound4ShiftSkip;
+
+ if(sound4NSteps) {
+ while(sound4ShiftIndex > 0x1fffff) {
+ sound4ShiftRight = (((sound4ShiftRight << 6) ^
+ (sound4ShiftRight << 5)) & 0x40) |
+ (sound4ShiftRight >> 1);
+ sound4ShiftIndex -= 0x200000;
+ }
+ } else {
+ while(sound4ShiftIndex > 0x1fffff) {
+ sound4ShiftRight = (((sound4ShiftRight << 14) ^
+ (sound4ShiftRight << 13)) & 0x4000) |
+ (sound4ShiftRight >> 1);
+
+ sound4ShiftIndex -= 0x200000;
+ }
+ }
+
+ sound4Index &= 0x1fffff;
+ sound4ShiftIndex &= 0x1fffff;
+
+ value = ((sound4ShiftRight & 1)*2-1) * vol;
+ } else {
+ value = 0;
+ }
+ }
+
+ soundBuffer[3][soundIndex] = value;
+
+ if(sound4On) {
+ if(sound4ATL) {
+ sound4ATL-=soundQuality;
+
+ if(sound4ATL <= 0 && sound4Continue) {
+ ioMem[NR52] &= 0xfd;
+ sound4On = 0;
+ }
+ }
+
+ if(sound4EnvelopeATL) {
+ sound4EnvelopeATL-=soundQuality;
+
+ if(sound4EnvelopeATL <= 0) {
+ if(sound4EnvelopeUpDown) {
+ if(sound4EnvelopeVolume < 15)
+ sound4EnvelopeVolume++;
+ } else {
+ if(sound4EnvelopeVolume)
+ sound4EnvelopeVolume--;
+ }
+ sound4EnvelopeATL += sound4EnvelopeATLReload;
+ }
+ }
+ }
}
-inline void soundDirectSoundA()
-{
- directBuffer[0][soundIndex] = interp_pop(0); //soundDSAValue;
-}
+extern bool cpuDmaHack2;
void soundDirectSoundATimer()
{
@@ -690,7 +975,12 @@ void soundDirectSoundATimer()
soundDSAValue = 0;
}
-inline void soundDirectSoundB()
+void soundDirectSoundA()
+{
+ directBuffer[0][soundIndex] = interp_pop(0); //soundDSAValue;
+}
+
+void soundDirectSoundB()
{
directBuffer[1][soundIndex] = interp_pop(1); //soundDSBValue;
}
@@ -742,19 +1032,19 @@ void soundMix()
int ratio = ioMem[0x82] & 3;
int dsaRatio = ioMem[0x82] & 4;
int dsbRatio = ioMem[0x82] & 8;
-
- blip_sample_t out[2] = {0, 0};
-
- if ( ! apu_out ) return;
-
- while (!apu_out->read_samples(&out[0], 2))
- {
- int ticks = SOUND_CLOCK_TICKS / (4 * soundQuality);
- bool was_stereo = apu->end_frame( ticks );
- apu_out->end_frame( ticks, was_stereo );
+
+ if(soundBalance & 16) {
+ cgbRes = ((s8)soundBuffer[0][soundIndex]);
+ }
+ if(soundBalance & 32) {
+ cgbRes += ((s8)soundBuffer[1][soundIndex]);
+ }
+ if(soundBalance & 64) {
+ cgbRes += ((s8)soundBuffer[2][soundIndex]);
+ }
+ if(soundBalance & 128) {
+ cgbRes += ((s8)soundBuffer[3][soundIndex]);
}
-
- cgbRes = out[0];
if((soundControl & 0x0200) && (soundEnableFlag & 0x100)){
if(!dsaRatio)
@@ -771,7 +1061,7 @@ void soundMix()
}
res = (res * 170) >> 8;
- cgbRes = (cgbRes * 52 * 7) >> 8;
+ cgbRes = (cgbRes * 52 * soundLevel1);
switch(ratio) {
case 0:
@@ -830,9 +1120,22 @@ void soundMix()
soundFinalWave[soundBufferIndex++] = res;
res = 0;
- cgbRes = out[1];
+ cgbRes = 0;
- if((soundControl & 0x0100) && (soundEnableFlag & 0x100)){
+ if(soundBalance & 1) {
+ cgbRes = ((s8)soundBuffer[0][soundIndex]);
+ }
+ if(soundBalance & 2) {
+ cgbRes += ((s8)soundBuffer[1][soundIndex]);
+ }
+ if(soundBalance & 4) {
+ cgbRes += ((s8)soundBuffer[2][soundIndex]);
+ }
+ if(soundBalance & 8) {
+ cgbRes += ((s8)soundBuffer[3][soundIndex]);
+ }
+
+ if((soundControl & 0x0100) && (soundEnableFlag & 0x100)){
if(!dsaRatio)
res = ((s16)directBuffer[0][soundIndex])>>1;
else
@@ -847,7 +1150,7 @@ void soundMix()
}
res = (res * 170) >> 8;
- cgbRes = (cgbRes * 52 * 7) >> 8;
+ cgbRes = (cgbRes * 52 * soundLevel1);
switch(ratio) {
case 0:
@@ -916,6 +1219,10 @@ void soundMix()
void normalsoundTick()
{
+ soundChannel1();
+ soundChannel2();
+ soundChannel3();
+ soundChannel4();
soundDirectSoundA();
soundDirectSoundB();
soundMix();
@@ -934,6 +1241,10 @@ void soundTick()
{
if(systemSoundOn) {
if(soundMasterOn && !stopState) {
+ soundChannel1();
+ soundChannel2();
+ soundChannel3();
+ soundChannel4();
soundDirectSoundA();
soundDirectSoundB();
soundMix();
@@ -997,23 +1308,6 @@ void setsoundMasterOn(bool value)
void soundShutdown()
{
systemSoundShutdown();
-
- int i;
- u8 j;
-
- if (apu)
- {
- j = soundRead(NR30);
- if (!(j & 0x40)) soundEvent(NR30, u8(j | 0x40));
- for (i = 0; i < 16; i++) sound3WaveRam[i] = soundRead(i + 0x90);
- soundEvent(NR30, u8(j & ~0x40));
- for (i = 16; i < 32; i++) sound3WaveRam[i] = soundRead(i - 16 + 0x90);
- if (j & 0x40) soundEvent(NR30, j);
- apu_saved = true;
-
- delete apu; apu = NULL;
- }
- if (apu_out) { delete apu_out; apu_out = NULL; }
}
void soundPause()
@@ -1033,8 +1327,8 @@ void soundEnable(int channels)
int c = channels & 0x0f;
soundEnableFlag |= ((channels & 0x30f) |c | (c << 4));
- if(apu)
- soundEventGB(0xFF25, soundBalance & soundEnableFlag);
+ if(ioMem)
+ soundBalance = (ioMem[NR51] & soundEnableFlag);
}
void soundDisable(int channels)
@@ -1042,8 +1336,8 @@ void soundDisable(int channels)
int c = channels & 0x0f;
soundEnableFlag &= (~((channels & 0x30f)|c|(c<<4)));
- if(apu)
- soundEventGB(0xFF25, soundBalance & soundEnableFlag);
+ if(ioMem)
+ soundBalance = (ioMem[NR51] & soundEnableFlag);
}
int soundGetEnable()
@@ -1051,20 +1345,6 @@ int soundGetEnable()
return (soundEnableFlag & 0x30f);
}
-const BOOST::uint8_t sound_data [Gb_Apu::register_count] = {
- 0x80, 0xbf, 0x00, 0x00, 0xbf, // square 1
- 0x00, 0x3f, 0x00, 0x00, 0xbf, // square 2
- 0x40, 0xff, 0x9f, 0x00, 0xbf, // wave
- 0x00, 0xff, 0x00, 0x00, 0xbf, // noise
-
- 0x77, 0xf3, 0xf1, // vin/volume, status, power mode
-
- 0, 0, 0, 0, 0, 0, 0, 0, 0, // unused
-
- 0xac, 0xdd, 0xda, 0x48, 0x36, 0x02, 0xcf, 0x16, // waveform data
- 0x2c, 0x04, 0xe5, 0x2c, 0xac, 0xdd, 0xda, 0x48
-};
-
void soundReset()
{
systemSoundReset();
@@ -1079,8 +1359,7 @@ void soundReset()
soundBufferIndex = 0;
soundLevel1 = 7;
soundLevel2 = 7;
-
- /*
+
sound1On = 0;
sound1ATL = 0;
sound1Skip = 0;
@@ -1137,38 +1416,8 @@ void soundReset()
sound2On = 0;
sound3On = 0;
sound4On = 0;
- */
-
- apu_out->clear();
- apu->reset(true);
-
- int addr = 0;
- while (addr < 0x30) {
- switch (addr)
- {
- case 4:
- case 9:
- case 14:
- case 19:
- apu->write_register( 0, 0xFF10 + addr, 0 );
- break;
-
- default:
- apu->write_register( 0, 0xFF10 + addr, sound_data [ addr ] );
- break;
- }
- addr++;
- }
- apu->write_register( 0, 0xFF1A, 0 );
-
- addr = 0x20;
- while (addr < 0x30) {
- apu->write_register( 0, 0xFF10 + addr, sound_data [ addr ] );
- addr++;
- }
-
- /*addr = 0x90;
+ int addr = 0x90;
while(addr < 0xA0) {
ioMem[addr++] = 0x00;
@@ -1180,7 +1429,6 @@ void soundReset()
sound3WaveRam[addr++] = 0x00;
sound3WaveRam[addr++] = 0xff;
}
- */
memset(soundFinalWave, 0, soundBufferLen);
@@ -1188,69 +1436,17 @@ void soundReset()
soundEchoIndex = 0;
}
-bool soundInit(bool gba)
+bool soundInit()
{
if(systemSoundInit()) {
- memset(soundBuffer[0], 0, 735);
- memset(soundBuffer[1], 0, 735);
- memset(soundBuffer[2], 0, 735);
- memset(soundBuffer[3], 0, 735);
+ memset(soundBuffer[0], 0, 735*2);
+ memset(soundBuffer[1], 0, 735*2);
+ memset(soundBuffer[2], 0, 735*2);
+ memset(soundBuffer[3], 0, 735*2);
memset(soundFinalWave, 0, soundBufferLen);
-
-#if defined(_WIN32) && 0
- _fpreset(); // FUCKO, Direct3D display code does something dirty to FPU
-#endif
- Stereo_Buffer * buf = new Stereo_Buffer;
- apu = new Gb_Apu;
-
- buf->clock_rate( 4194304 );
- buf->set_sample_rate( 44100 / soundQuality , 1000 / 20 );
- buf->bass_freq( 120 );
- buf->set_channel_count(Gb_Apu::osc_count);
- buf->clear();
-
- apu_out = buf;
-
- apu->treble_eq( blip_eq_t( -1.0, 0, 44100 / soundQuality ) );
- apu->reset( gba );
- apu->volume( 1.0 );
-
- for ( int i = apu->osc_count; i--; )
- {
- Multi_Buffer::channel_t ch = apu_out->channel( i );
- apu->osc_output( i, ch.center, ch.left, ch.right );
- }
-
- int addr = 0;
-
- while (addr < 0x30) {
- apu->write_register( 0, 0xFF10 + addr, sound_data [ addr ] );
- addr++;
- }
-
- if (apu_saved)
- {
- int i;
- apu->write_register( 0, 0xFF1A, 0x40);
- for (i = 0; i < 16; i++) apu->write_register( 0, 0xFF30 + i, sound3WaveRam[i]);
- apu->write_register( 0, 0xFF1A, 0);
- for (i = 16; i < 32; i++) apu->write_register( 0, 0xFF30 - 16 + i, sound3WaveRam[i]);
- apu->write_register( 0, 0xFF1A, 0x40);
- }
- else
- {
- apu->write_register( 0, 0xFF1A, 0 );
-
- addr = 0x20;
- while (addr < 0x30) {
- apu->write_register( 0, 0xFF10 + addr, sound_data [ addr ] );
- addr++;
- }
- }
-
- setsoundPaused(true);
+ soundPaused = true;
return true;
}
return false;
@@ -1278,16 +1474,6 @@ void soundSetQuality(int quality)
void soundSaveGame(gzFile gzFile)
{
- int i;
- u8 j;
-
- j = soundRead(NR30);
- if (!(j & 0x40)) soundEvent(NR30, u8(j | 0x40));
- for (i = 0; i < 16; i++) sound3WaveRam[i] = soundRead(i + 0x90);
- soundEvent(NR30, u8(j & ~0x40));
- for (i = 16; i < 32; i++) sound3WaveRam[i] = soundRead(i - 16 + 0x90);
- if (j & 0x40) soundEvent(NR30, j);
-
utilWriteData(gzFile, soundSaveStruct);
utilWriteData(gzFile, soundSaveStructV2);
@@ -1300,9 +1486,9 @@ void soundReadGame(gzFile gzFile, int version)
if(version >= SAVE_GAME_VERSION_3) {
utilReadData(gzFile, soundSaveStructV2);
} else {
-/* sound3Bank = (ioMem[NR30] >> 6) & 1;
+ sound3Bank = (ioMem[NR30] >> 6) & 1;
sound3DataSize = (ioMem[NR30] >> 5) & 1;
- sound3ForcedOutput = (ioMem[NR32] >> 7) & 1;*/
+ sound3ForcedOutput = (ioMem[NR32] >> 7) & 1;
// nothing better to do here...
memcpy(&sound3WaveRam[0x00], &ioMem[0x90], 0x10);
memcpy(&sound3WaveRam[0x10], &ioMem[0x90], 0x10);
@@ -1312,17 +1498,7 @@ void soundReadGame(gzFile gzFile, int version)
int quality = 1;
utilGzRead(gzFile, &quality, sizeof(int));
soundSetQuality(quality);
- apu->reset(true);
-
- int i;
- u8 j = ioMem[NR30];
- for (i = NR10; i <= NR52; i++) soundEvent(i, ioMem[i]);
- if (!(j & 0x40)) soundEventGB(0xFF1A, j | 0x40);
- for (i = 0; i < 16; i++) soundEventGB(0xFF30 + i, sound3WaveRam[i]);
- soundEventGB(0xFF1A, j & ~0x40);
- for (i = 16; i < 32; i++) soundEventGB(0xFF30 - 16 + i, sound3WaveRam[i]);
- if (j & 0x40) soundEventGB(0xFF1A, j);
- //sound1Wave = soundWavePattern[ioMem[NR11] >> 6];
- //sound2Wave = soundWavePattern[ioMem[NR21] >> 6];
-}
\ No newline at end of file
+ sound1Wave = soundWavePattern[ioMem[NR11] >> 6];
+ sound2Wave = soundWavePattern[ioMem[NR21] >> 6];
+}
diff --git a/src/Sound.h b/src/Sound.h
index ee808a34..43d633b4 100644
--- a/src/Sound.h
+++ b/src/Sound.h
@@ -21,6 +21,8 @@
#ifndef VBA_SOUND_H
#define VBA_SOUND_H
+#include "System.h"
+
#define NR10 0x60
#define NR11 0x62
#define NR12 0x63
@@ -51,7 +53,7 @@
extern void setSoundFn();
extern void (*psoundTickfn)();
extern void soundShutdown();
-extern bool soundInit(bool gba=true);
+extern bool soundInit();
extern void soundPause();
extern void soundResume();
extern void soundEnable(int);
@@ -67,13 +69,9 @@ extern void soundSetQuality(int);
extern void setsystemSoundOn(bool value);
extern void setsoundPaused(bool value);
extern void setsoundMasterOn(bool value);
+extern void interp_rate();
-
-//extern int SOUND_TICKS;
extern int SOUND_CLOCK_TICKS;
-extern u8 soundRead(u32);
-extern u16 soundRead16(u32);
-extern u32 soundRead32(u32);
extern int soundTicks;
extern bool soundOffFlag;
extern bool soundPaused;
@@ -89,14 +87,4 @@ extern bool soundEcho;
extern bool soundLowPass;
extern bool soundReverse;
-#include "Gb_Apu/Multi_Buffer.h"
-#include "Gb_Apu/Gb_Apu.h"
-
-extern Multi_Buffer * apu_out;
-extern Gb_Apu * apu;
-
-extern const BOOST::uint8_t sound_data [Gb_Apu::register_count];
-extern void interp_rate();
-
-
#endif // VBA_SOUND_H
diff --git a/src/gb/GB.cpp b/src/gb/GB.cpp
index b81d332a..4536c2db 100644
--- a/src/gb/GB.cpp
+++ b/src/gb/GB.cpp
@@ -998,7 +998,7 @@ void gbWriteMemory(register u16 address, register u8 value)
case 0x3d:
case 0x3e:
case 0x3f: {
- SOUND_EVENT(address,value);
+ gbMemory[address] = value;
return;
}
@@ -1783,11 +1783,6 @@ u8 gbReadMemory(register u16 address)
}
if(address >= 0xff00) {
-
- if (address >= 0xFF10 && address <= 0xFF3F) {
- return gbSoundRead(address);
- }
-
switch(address & 0x00ff) {
case 0x00:
{
@@ -3532,8 +3527,6 @@ static bool gbWriteSaveState(gzFile gzFile)
utilGzWrite(gzFile, &gbDataMMM01, sizeof(gbDataMMM01));
utilGzWrite(gzFile, gbPalette, 128 * sizeof(u16));
-
- for (int i = 0xFF10; i <= 0xFF3F; i++) gbMemory[i] = gbReadMemory(i);
utilGzWrite(gzFile, &gbMemory[0x8000], 0x8000);
@@ -3725,8 +3718,6 @@ static bool gbReadSaveState(gzFile gzFile)
utilGzRead(gzFile, &gbMemory[0x8000], 0x8000);
- for (int i = 0xFF10; i <= 0xFF3F; i++) gbSoundEvent(i, gbMemory[i]);
-
if(gbRamSize && gbRam) {
if (version < 11)
utilGzRead(gzFile, gbRam, gbRamSize);
diff --git a/src/gb/gbSound.cpp b/src/gb/gbSound.cpp
index 6e981fc6..e0f192fd 100644
--- a/src/gb/gbSound.cpp
+++ b/src/gb/gbSound.cpp
@@ -23,9 +23,6 @@
#include "gbGlobals.h"
#include "gbSound.h"
-#include "../Gb_Apu/Multi_Buffer.h"
-#include "../Gb_Apu/Gb_Apu.h"
-
extern u8 soundBuffer[6][735];
extern u16 soundFinalWave[1470];
extern int soundVolume;
@@ -59,9 +56,6 @@ extern int soundBufferIndex;
int soundVIN = 0;
extern int soundDebug;
-extern Multi_Buffer * apu_out;
-extern Gb_Apu * apu;
-
extern int sound1On;
extern int sound1ATL;
int sound1ATLreload;
@@ -138,45 +132,7 @@ extern bool soundLowPass;
extern bool soundReverse;
extern bool soundOffFlag;
-u8 gbSoundRead(u16 address)
-{
- if (address < NR10 || address > 0xFF3F || !apu) return gbMemory[address];
- if (address == NR51) return soundBalance;
-
- int clock = (SOUND_CLOCK_TICKS - soundTicks) * 95 / (24 * (gbSpeed ? 2 : 1));
-
- int ret = apu->read_register(clock, address);
-
- switch ( address )
- {
- case NR10:
- ret |= 0x80; break;
-
- case NR11:
- case NR21:
- ret |= 0x3F; break;
-
- case NR13:
- case NR23:
- case NR31:
- case NR33:
- ret = 0xFF; break;
-
- case NR14:
- case NR24:
- case NR34:
- case NR44:
- ret |= 0xBF; break;
-
- case NR30:
- ret |= 0x7F; break;
-
- case NR32:
- ret |= 0x9F; break;
- }
-
- return ret;
-}
+bool gbDigitalSound = false;
void gbSoundEvent(register u16 address, register int data)
{
@@ -190,58 +146,481 @@ void gbSoundEvent(register u16 address, register int data)
log("Sound event: %08lx %02x\n", address, data);
}
#endif
- if (apu && address >= NR10 && address <= 0xFF3F)
- {
- int clock = (SOUND_CLOCK_TICKS - soundTicks) * 95 / (24 * (gbSpeed ? 2 : 1));
- if (address == NR50)
- {
- apu->write_register(clock, address, data);
+ switch(address) {
+ case NR10:
+ gbMemory[address] = data | 0x80;
+ sound1SweepATL = sound1SweepATLReload = 344 * ((data >> 4) & 7);
+ sound1SweepSteps = data & 7;
+ sound1SweepUpDown = data & 0x08;
+ sound1SweepStep = 0;
+ break;
+ case NR11:
+ gbMemory[address] = data | 0x3f;
+ sound1Wave = soundWavePattern[data >> 6];
+ sound1ATL = sound1ATLreload = 172 * (64 - (data & 0x3f));
+ break;
+ case NR12:
+ sound1EnvelopeVolume = data >> 4;
+ sound1EnvelopeUpDown = data & 0x08;
+ sound1EnvelopeATLReload = sound1EnvelopeATL = 689 * (data & 7);
+ break;
+ case NR13:
+ gbMemory[address] = 0xff;
+ freq1low = data;
+ freq = ((((int)(freq1high & 7)) << 8) | freq1low);
+ sound1ATL = sound1ATLreload;
+ freq = 2048 - freq;
+ if(freq) {
+ sound1Skip = SOUND_MAGIC / freq;
+ } else
+ sound1Skip = 0;
+ break;
+ case NR14:
+ gbMemory[address] = data | 0xbf;
+ freq1high = data;
+ freq = ((((int)(freq1high & 7)) << 8) | freq1low);
+ freq = 2048 - freq;
+ sound1ATL = sound1ATLreload;
+ sound1Continue = data & 0x40;
+ if(freq) {
+ sound1Skip = SOUND_MAGIC / freq;
+ } else
+ sound1Skip = 0;
+ if(data & 0x80) {
+ gbMemory[NR52] |= 1;
+ sound1EnvelopeVolume = gbMemory[NR12] >> 4;
+ sound1EnvelopeUpDown = gbMemory[NR12] & 0x08;
+ sound1EnvelopeATLReload = sound1EnvelopeATL = 689 * (gbMemory[NR12] & 7);
+ sound1SweepATL = sound1SweepATLReload = 344 * ((gbMemory[NR10] >> 4) & 7);
+ sound1SweepSteps = gbMemory[NR10] & 7;
+ sound1SweepUpDown = gbMemory[NR10] & 0x08;
+ sound1SweepStep = 0;
+
+ sound1Index = 0;
+ sound1On = 1;
}
- else if (address == NR51)
- {
- soundBalance = data;
- apu->write_register(clock, address, data & soundEnableFlag);
+ break;
+ case NR21:
+ gbMemory[address] = data | 0x3f;
+ sound2Wave = soundWavePattern[data >> 6];
+ sound2ATL = sound2ATLreload = 172 * (64 - (data & 0x3f));
+ break;
+ case NR22:
+ sound2EnvelopeVolume = data >> 4;
+ sound2EnvelopeUpDown = data & 0x08;
+ sound2EnvelopeATLReload = sound2EnvelopeATL = 689 * (data & 7);
+ break;
+ case NR23:
+ gbMemory[address] = 0xff;
+ freq2low = data;
+ freq = (((int)(freq2high & 7)) << 8) | freq2low;
+ sound2ATL = sound2ATLreload;
+ freq = 2048 - freq;
+ if(freq) {
+ sound2Skip = SOUND_MAGIC / freq;
+ } else
+ sound2Skip = 0;
+ break;
+ case NR24:
+ gbMemory[address] = data | 0xbf;
+ freq2high = data;
+ freq = (((int)(freq2high & 7)) << 8) | freq2low;
+ freq = 2048 - freq;
+ sound2ATL = sound2ATLreload;
+ sound2Continue = data & 0x40;
+ if(freq) {
+ sound2Skip = SOUND_MAGIC / freq;
+ } else
+ sound2Skip = 0;
+ if(data & 0x80) {
+ gbMemory[NR52] |= 2;
+ sound2EnvelopeVolume = gbMemory[NR22] >> 4;
+ sound2EnvelopeUpDown = gbMemory[NR22] & 0x08;
+ sound2ATL = sound2ATLreload;
+ sound2EnvelopeATLReload = sound2EnvelopeATL = 689 * (gbMemory[NR22] & 7);
+
+ sound2Index = 0;
+ sound2On = 1;
}
- else
- apu->write_register(clock, address, data);
+ break;
+ case NR30:
+ gbMemory[address] = data | 0x7f;
+ if(!(data & 0x80)) {
+ gbMemory[NR52] &= 0xfb;
+ sound3On = 0;
+ }
+ break;
+ case NR31:
+ gbMemory[address] = 0xff;
+ sound3ATL = sound3ATLreload = 172 * (256-data);
+ break;
+ case NR32:
+ gbMemory[address] = data | 0x9f;
+ sound3OutputLevel = (data >> 5) & 3;
+ break;
+ case NR33:
+ gbMemory[address] = 0xff;
+ freq3low = data;
+ freq = 2048 - (((int)(freq3high&7) << 8) | freq3low);
+ if(freq) {
+ sound3Skip = SOUND_MAGIC_2 / freq;
+ } else
+ sound3Skip = 0;
+ break;
+ case NR34:
+ gbMemory[address] = data | 0xbf;
+ freq3high = data;
+ freq = 2048 - (((int)(freq3high&7) << 8) | freq3low);
+ if(freq) {
+ sound3Skip = SOUND_MAGIC_2 / freq;
+ } else {
+ sound3Skip = 0;
+ }
+ sound3Continue = data & 0x40;
+ if((data & 0x80) && (gbMemory[NR30] & 0x80)) {
+ gbMemory[NR52] |= 4;
+ sound3ATL = sound3ATLreload;
+ sound3Index = 0;
+ sound3On = 1;
+ }
+ break;
+ case NR41:
+ sound4ATL = sound4ATLreload = 172 * (64 - (data & 0x3f));
+ break;
+ case NR42:
+ sound4EnvelopeVolume = data >> 4;
+ sound4EnvelopeUpDown = data & 0x08;
+ sound4EnvelopeATLReload = sound4EnvelopeATL = 689 * (data & 7);
+ break;
+ case NR43:
+ freq = freq4 = soundFreqRatio[data & 7];
+ sound4NSteps = data & 0x08;
+
+ sound4Skip = (freq << 8) / NOISE_MAGIC;
+
+ sound4Clock = data >> 4;
+
+ freq = freq / soundShiftClock[sound4Clock];
+
+ sound4ShiftSkip = (freq << 8) / NOISE_MAGIC;
+
+ break;
+ case NR44:
+ gbMemory[address] = data | 0xbf;
+ sound4Continue = data & 0x40;
+ if(data & 0x80) {
+ gbMemory[NR52] |= 8;
+ sound4EnvelopeVolume = gbMemory[NR42] >> 4;
+ sound4EnvelopeUpDown = gbMemory[NR42] & 0x08;
+ sound4ATL = sound4ATLreload;
+ sound4EnvelopeATLReload = sound4EnvelopeATL = 689 * (gbMemory[NR42] & 7);
+
+ sound4On = 1;
+
+ sound4Index = 0;
+ sound4ShiftIndex = 0;
+
+ if(sound4NSteps)
+ sound4ShiftRight = 0x7fff;
+ else
+ sound4ShiftRight = 0x7f;
+ }
+ break;
+ case NR50:
+ soundVIN = data & 0x88;
+ soundLevel1 = data & 7;
+ soundLevel2 = (data >> 4) & 7;
+ break;
+ case NR51:
+ soundBalance = (data & soundEnableFlag);
+ break;
+ case NR52:
+ soundMasterOn = data & 0x80;
+ if(!(data & 0x80)) {
+ sound1On = 0;
+ sound2On = 0;
+ sound3On = 0;
+ sound4On = 0;
+ gbMemory[address] &= 0xf0;
+ }
+ gbMemory[address] = data & 0x80 | 0x70 | (gbMemory[address] & 0xf);
+ break;
}
+
+ gbDigitalSound = true;
+
+ if(sound1On && sound1EnvelopeVolume != 0)
+ gbDigitalSound = false;
+ if(sound2On && sound2EnvelopeVolume != 0)
+ gbDigitalSound = false;
+ if(sound3On && sound3OutputLevel != 0)
+ gbDigitalSound = false;
+ if(sound4On && sound4EnvelopeVolume != 0)
+ gbDigitalSound = false;
}
void gbSoundChannel1()
{
+ int vol = sound1EnvelopeVolume;
+
+ int freq = 0;
+
+ int value = 0;
+
+ if(sound1On && (sound1ATL || !sound1Continue)) {
+ sound1Index += soundQuality*sound1Skip;
+ sound1Index &= 0x1fffffff;
+
+ value = ((s8)sound1Wave[sound1Index>>24]) * vol;
+ }
+
+ soundBuffer[0][soundIndex] = value;
+
+
+ if(sound1On) {
+ if(sound1ATL) {
+ sound1ATL-=soundQuality;
+
+ if(sound1ATL <=0 && sound1Continue) {
+ gbMemory[NR52] &= 0xfe;
+ sound1On = 0;
+ }
+ }
+
+ if(sound1EnvelopeATL) {
+ sound1EnvelopeATL-=soundQuality;
+
+ if(sound1EnvelopeATL<=0) {
+ if(sound1EnvelopeUpDown) {
+ if(sound1EnvelopeVolume < 15)
+ sound1EnvelopeVolume++;
+ } else {
+ if(sound1EnvelopeVolume)
+ sound1EnvelopeVolume--;
+ }
+
+ sound1EnvelopeATL += sound1EnvelopeATLReload;
+ }
+ }
+
+ if(sound1SweepATL) {
+ sound1SweepATL-=soundQuality;
+
+ if(sound1SweepATL<=0) {
+ freq = (((int)(freq1high & 7)) << 8) | freq1low;
+
+ int updown = 1;
+
+ if(sound1SweepUpDown)
+ updown = -1;
+
+ int newfreq = 0;
+ if(sound1SweepSteps) {
+ newfreq = freq + updown * freq / (1 << sound1SweepSteps);
+ if(newfreq == freq)
+ newfreq = 0;
+ } else
+ newfreq = freq;
+
+ if(newfreq < 0) {
+ sound1SweepATL += sound1SweepATLReload;
+ } else if(newfreq > 2047) {
+ sound1SweepATL = 0;
+ sound1On = 0;
+ gbMemory[NR52] &= 0xfe;
+ } else {
+ sound1SweepATL += sound1SweepATLReload;
+ sound1Skip = SOUND_MAGIC/(2048 - newfreq);
+
+ freq1low = newfreq & 0xff;
+ freq1high = (freq1high & 0xf8) |((newfreq >> 8) & 7);
+ }
+ }
+ }
+ }
}
void gbSoundChannel2()
{
+ // int freq = 0;
+ int vol = sound2EnvelopeVolume;
+
+ int value = 0;
+
+ if(sound2On && (sound2ATL || !sound2Continue)) {
+ sound2Index += soundQuality*sound2Skip;
+ sound2Index &= 0x1fffffff;
+
+ value = ((s8)sound2Wave[sound2Index>>24]) * vol;
+ }
+
+ soundBuffer[1][soundIndex] = value;
+
+ if(sound2On) {
+ if(sound2ATL) {
+ sound2ATL-=soundQuality;
+
+ if(sound2ATL <= 0 && sound2Continue) {
+ gbMemory[NR52] &= 0xfd;
+ sound2On = 0;
+ }
+ }
+
+ if(sound2EnvelopeATL) {
+ sound2EnvelopeATL-=soundQuality;
+
+ if(sound2EnvelopeATL <= 0) {
+ if(sound2EnvelopeUpDown) {
+ if(sound2EnvelopeVolume < 15)
+ sound2EnvelopeVolume++;
+ } else {
+ if(sound2EnvelopeVolume)
+ sound2EnvelopeVolume--;
+ }
+ sound2EnvelopeATL += sound2EnvelopeATLReload;
+ }
+ }
+ }
}
void gbSoundChannel3()
{
+ int value = 0;
+
+ if(sound3On && (sound3ATL || !sound3Continue)) {
+
+ value = sound3Last;
+
+ sound3Index += soundQuality*sound3Skip;
+ sound3Index &= 0x1fffffff;
+
+ value = gbMemory[0xff30 + (sound3Index>>25)];
+
+ if( (sound3Index & 0x01000000)) {
+ value &= 0x0f;
+ } else {
+ value >>= 4;
+ }
+
+ value -= 8;
+
+ switch(sound3OutputLevel) {
+ case 0:
+ value = 0;
+ break;
+ case 1:
+ break;
+ case 2:
+ value = (value >> 1);
+ break;
+ case 3:
+ value = (value >> 2);
+ break;
+ }
+ sound3Last = value;
+ }
+
+ soundBuffer[2][soundIndex] = value;
+
+ if(sound3On) {
+ if(sound3ATL) {
+ sound3ATL-=soundQuality;
+
+ if(sound3ATL <= 0 && sound3Continue) {
+ gbMemory[NR52] &= 0xfb;
+ sound3On = 0;
+ }
+ }
+ }
}
void gbSoundChannel4()
{
+ int vol = sound4EnvelopeVolume;
+
+ int value = 0;
+
+ if(sound4Clock <= 0x0c) {
+ if(sound4On && (sound4ATL || !sound4Continue)) {
+ sound4Index += soundQuality*sound4Skip;
+ sound4ShiftIndex += soundQuality*sound4ShiftSkip;
+
+ if(sound4NSteps) {
+ while(sound4ShiftIndex > 0x1fffff) {
+ sound4ShiftRight = (((sound4ShiftRight << 6) ^
+ (sound4ShiftRight << 5)) & 0x40) |
+ (sound4ShiftRight >> 1);
+ sound4ShiftIndex -= 0x200000;
+ }
+ } else {
+ while(sound4ShiftIndex > 0x1fffff) {
+ sound4ShiftRight = (((sound4ShiftRight << 14) ^
+ (sound4ShiftRight << 13)) & 0x4000) |
+ (sound4ShiftRight >> 1);
+
+ sound4ShiftIndex -= 0x200000;
+ }
+ }
+
+ sound4Index &= 0x1fffff;
+ sound4ShiftIndex &= 0x1fffff;
+
+ value = ((sound4ShiftRight & 1)*2-1) * vol;
+ } else {
+ value = 0;
+ }
+ }
+
+ soundBuffer[3][soundIndex] = value;
+
+ if(sound4On) {
+ if(sound4ATL) {
+ sound4ATL-=soundQuality;
+
+ if(sound4ATL <= 0 && sound4Continue) {
+ gbMemory[NR52] &= 0xf7;
+ sound4On = 0;
+ }
+ }
+
+ if(sound4EnvelopeATL) {
+ sound4EnvelopeATL-=soundQuality;
+
+ if(sound4EnvelopeATL <= 0) {
+ if(sound4EnvelopeUpDown) {
+ if(sound4EnvelopeVolume < 15)
+ sound4EnvelopeVolume++;
+ } else {
+ if(sound4EnvelopeVolume)
+ sound4EnvelopeVolume--;
+ }
+ sound4EnvelopeATL += sound4EnvelopeATLReload;
+ }
+ }
+ }
}
void gbSoundMix()
{
int res = 0;
-
- blip_sample_t out[2] = {0, 0};
-
- if ( ! apu_out ) return;
-
- while (!apu_out->read_samples(&out[0], 2))
- {
- int ticks = SOUND_CLOCK_TICKS * 95 / (24 * (gbSpeed ? 2 : 1));
- bool was_stereo = apu->end_frame( ticks );
- apu_out->end_frame( ticks, was_stereo );
+ if(soundBalance & 16) {
+ res += ((s8)soundBuffer[0][soundIndex]);
+ }
+ if(soundBalance & 32) {
+ res += ((s8)soundBuffer[1][soundIndex]);
+ }
+ if(soundBalance & 64) {
+ res += ((s8)soundBuffer[2][soundIndex]);
+ }
+ if(soundBalance & 128) {
+ res += ((s8)soundBuffer[3][soundIndex]);
}
- res = out[0];
-
- //res = (res * 7 * 60) >> 8;
+ if(gbDigitalSound)
+ res *= soundLevel1*256;
+ else
+ res *= soundLevel1*60;
if(soundEcho) {
res *= 2;
@@ -285,7 +664,25 @@ void gbSoundMix()
else
soundFinalWave[soundBufferIndex++] = res;
- res = out[1];
+ res = 0;
+
+ if(soundBalance & 1) {
+ res += ((s8)soundBuffer[0][soundIndex]);
+ }
+ if(soundBalance & 2) {
+ res += ((s8)soundBuffer[1][soundIndex]);
+ }
+ if(soundBalance & 4) {
+ res += ((s8)soundBuffer[2][soundIndex]);
+ }
+ if(soundBalance & 8) {
+ res += ((s8)soundBuffer[3][soundIndex]);
+ }
+
+ if(gbDigitalSound)
+ res *= soundLevel2*256;
+ else
+ res *= soundLevel2*60;
if(soundEcho) {
res *= 2;
@@ -337,10 +734,10 @@ void gbSoundTick()
{
if(systemSoundOn) {
if(soundMasterOn) {
- /*gbSoundChannel1();
+ gbSoundChannel1();
gbSoundChannel2();
gbSoundChannel3();
- gbSoundChannel4();*/
+ gbSoundChannel4();
gbSoundMix();
} else {
@@ -366,7 +763,7 @@ void gbSoundTick()
void gbSoundReset()
{
- soundPaused = true;
+ soundPaused = 1;
soundPlay = 0;
SOUND_CLOCK_TICKS = soundQuality * 24;
soundTicks = SOUND_CLOCK_TICKS;
@@ -378,7 +775,7 @@ void gbSoundReset()
soundLevel2 = 7;
soundVIN = 0;
- /*sound1On = 0;
+ sound1On = 0;
sound1ATL = 0;
sound1Skip = 0;
sound1Index = 0;
@@ -424,48 +821,53 @@ void gbSoundReset()
sound4EnvelopeVolume = 0;
sound4EnvelopeATL = 0;
sound4EnvelopeUpDown = 0;
- sound4EnvelopeATLReload = 0;*/
+ sound4EnvelopeATLReload = 0;
// don't translate
if(soundDebug) {
log("*** Sound Init ***\n");
}
+
+ gbSoundEvent(0xff10, 0x80);
+ gbSoundEvent(0xff11, 0xbf);
+ gbSoundEvent(0xff12, 0xf3);
+ gbSoundEvent(0xff14, 0xbf);
+ gbSoundEvent(0xff16, 0x3f);
+ gbSoundEvent(0xff17, 0x00);
+ gbSoundEvent(0xff19, 0xbf);
- if (apu_out)
- {
- apu_out->clear();
- apu->reset(false);
+ gbSoundEvent(0xff1a, 0x7f);
+ gbSoundEvent(0xff1b, 0xff);
+ gbSoundEvent(0xff1c, 0xbf);
+ gbSoundEvent(0xff1e, 0xbf);
- extern const BOOST::uint8_t sound_data[Gb_Apu::end_addr - Gb_Apu::start_addr + 1];
+ gbSoundEvent(0xff20, 0xff);
+ gbSoundEvent(0xff21, 0x00);
+ gbSoundEvent(0xff22, 0x00);
+ gbSoundEvent(0xff23, 0xbf);
+ gbSoundEvent(0xff24, 0x77);
+ gbSoundEvent(0xff25, 0xf3);
- int addr = 0;
-
- while (addr < 0x30) {
- apu->write_register( 0, 0xFF10 + addr, sound_data [ addr ] );
- addr++;
- }
- }
+ if (gbHardware & 0x4)
+ gbSoundEvent(0xff26, 0xf0);
+ else
+ gbSoundEvent(0xff26, 0xf1);
// don't translate
if(soundDebug) {
log("*** Sound Init Complete ***\n");
}
- /*sound1On = 0;
+ sound1On = 0;
sound2On = 0;
sound3On = 0;
- sound4On = 0;*/
+ sound4On = 0;
- if (apu)
- {
- int addr = 0xff30;
+ int addr = 0xff30;
- while(addr < 0xff40) {
- /*gbMemory[addr++] = 0x00;
- gbMemory[addr++] = 0xff;*/
- gbSoundEvent(addr++, 0x00);
- gbSoundEvent(addr++, 0xFF);
- }
+ while(addr < 0xff40) {
+ gbMemory[addr++] = 0x00;
+ gbMemory[addr++] = 0xff;
}
memset(soundFinalWave, 0x00, soundBufferLen);
@@ -475,7 +877,7 @@ void gbSoundReset()
soundEchoIndex = 0;
}
-extern bool soundInit(bool gb);
+extern bool soundInit();
extern void soundShutdown();
void gbSoundSetQuality(int quality)
@@ -486,7 +888,7 @@ void gbSoundSetQuality(int quality)
soundQuality = quality;
soundNextPosition = 0;
if(!soundOffFlag)
- soundInit(false);
+ soundInit();
SOUND_CLOCK_TICKS = (gbSpeed ? 2 : 1) * 24 * soundQuality;
soundIndex = 0;
soundBufferIndex = 0;
diff --git a/src/gb/gbSound.h b/src/gb/gbSound.h
index 27dd0a5b..50658b24 100644
--- a/src/gb/gbSound.h
+++ b/src/gb/gbSound.h
@@ -22,7 +22,6 @@
#define NR12 0xff12
#define NR13 0xff13
#define NR14 0xff14
-#define NR20 0xff15
#define NR21 0xff16
#define NR22 0xff17
#define NR23 0xff18
@@ -32,7 +31,6 @@
#define NR32 0xff1c
#define NR33 0xff1d
#define NR34 0xff1e
-#define NR40 0xff1f
#define NR41 0xff20
#define NR42 0xff21
#define NR43 0xff22
@@ -56,8 +54,6 @@ extern void gbSoundReadGame(int,gzFile);
extern void gbSoundEvent(register u16, register int);
extern void gbSoundSetQuality(int);
-extern u8 gbSoundRead(u16 address);
-
extern int soundTicks;
extern int soundQuality;
extern int SOUND_CLOCK_TICKS;
diff --git a/src/win32/MainWnd.cpp b/src/win32/MainWnd.cpp
index 195c2622..e4c6093c 100644
--- a/src/win32/MainWnd.cpp
+++ b/src/win32/MainWnd.cpp
@@ -620,7 +620,7 @@ bool MainWnd::FileRun()
soundReset();
} else {
if(!soundOffFlag)
- soundInit(!(theApp.cartridgeType==1));
+ soundInit();
theApp.soundInitialized = true;
}
diff --git a/src/win32/dependencies/cximage/cximage.vcproj b/src/win32/dependencies/cximage/cximage.vcproj
deleted file mode 100644
index 9799829a..00000000
--- a/src/win32/dependencies/cximage/cximage.vcproj
+++ /dev/null
@@ -1,367 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/win32/dependencies/cximage/license.txt b/src/win32/dependencies/cximage/license.txt
deleted file mode 100644
index 755e2c41..00000000
--- a/src/win32/dependencies/cximage/license.txt
+++ /dev/null
@@ -1,48 +0,0 @@
-This copy of the CxImage notices is provided for your convenience. In case of
-any discrepancy between this copy and the notices in the file ximage.h that is
-included in the CxImage distribution, the latter shall prevail.
-
-If you modify CxImage you may insert additional notices immediately following
-this sentence.
-
---------------------------------------------------------------------------------
-
-COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
-CxImage version 5.99c 17/Oct/2004
-
-CxImage : Copyright (C) 2001 - 2004, Davide Pizzolato
-
-Original CImage and CImageIterator implementation are:
-Copyright (C) 1995, Alejandro Aguilar Sierra (asierra(at)servidor(dot)unam(dot)mx)
-
-Covered code is provided under this license on an "as is" basis, without warranty
-of any kind, either expressed or implied, including, without limitation, warranties
-that the covered code is free of defects, merchantable, fit for a particular purpose
-or non-infringing. The entire risk as to the quality and performance of the covered
-code is with you. Should any covered code prove defective in any respect, you (not
-the initial developer or any other contributor) assume the cost of any necessary
-servicing, repair or correction. This disclaimer of warranty constitutes an essential
-part of this license. No use of any covered code is authorized hereunder except under
-this disclaimer.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, including commercial applications,
-freely and without fee, subject to the following restrictions:
-
-1. The origin of this software must not be misrepresented; you must not
-claim that you wrote the original software. If you use this software
-in a product, an acknowledgment in the product documentation would be
-appreciated but is not required.
-
-2. Altered source versions must be plainly marked as such, and must not be
-misrepresented as being the original software.
-
-3. This notice may not be removed or altered from any source distribution.
-
---------------------------------------------------------------------------------
-
-Other information: about CxImage, and the latest version, can be found at the
-CxImage home page: http://www.xdp.it
-
---------------------------------------------------------------------------------
diff --git a/src/win32/dependencies/cximage/tif_xfile.cpp b/src/win32/dependencies/cximage/tif_xfile.cpp
deleted file mode 100644
index edfc943e..00000000
--- a/src/win32/dependencies/cximage/tif_xfile.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * TIFF file IO, using CxFile.
- */
-
-#ifdef WIN32
- #include
-#endif
-#include
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_TIF
-
-#include "../tiff/tiffiop.h"
-
-#include "xfile.h"
-
-static tsize_t
-_tiffReadProcEx(thandle_t fd, tdata_t buf, tsize_t size)
-{
- return ((CxFile*)fd)->Read(buf, 1, size);
-}
-
-static tsize_t
-_tiffWriteProcEx(thandle_t fd, tdata_t buf, tsize_t size)
-{
- return ((CxFile*)fd)->Write(buf, 1, size);
-}
-
-static toff_t
-_tiffSeekProcEx(thandle_t fd, toff_t off, int whence)
-{
- if ( off == 0xFFFFFFFF )
- return 0xFFFFFFFF;
- if (!((CxFile*)fd)->Seek(off, whence))
- return 0xFFFFFFFF;
- if (whence == SEEK_SET)
- return off;
-
- return (toff_t)((CxFile*)fd)->Tell();
-}
-
-// Return nonzero if error
-static int
-_tiffCloseProcEx(thandle_t fd)
-{
-// return !((CxFile*)fd)->Close(); // "//" needed for memory files
- return 0;
-}
-
-#include
-
-static toff_t
-_tiffSizeProcEx(thandle_t fd)
-{
- return ((CxFile*)fd)->Size();
-}
-
-static int
-_tiffMapProcEx(thandle_t fd, tdata_t* pbase, toff_t* psize)
-{
- return (0);
-}
-
-static void
-_tiffUnmapProcEx(thandle_t fd, tdata_t base, toff_t size)
-{
-}
-
-// Open a TIFF file descriptor for read/writing.
-/*
-TIFF*
-TIFFOpen(const char* name, const char* mode)
-{
- static const char module[] = "TIFFOpen";
- FILE* stream = fopen(name, mode);
- if (stream == NULL)
- {
- TIFFError(module, "%s: Cannot open", name);
- return NULL;
- }
- return (TIFFFdOpen((int)stream, name, mode));
-}
-*/
-
-TIFF*
-_TIFFFdOpen(int fd, const char* name, const char* mode)
-{
- TIFF* tif;
-
- tif = TIFFClientOpen(name, mode,
- (thandle_t) fd,
- _tiffReadProcEx, _tiffWriteProcEx, _tiffSeekProcEx, _tiffCloseProcEx,
- _tiffSizeProcEx, _tiffMapProcEx, _tiffUnmapProcEx);
- if (tif)
- tif->tif_fd = fd;
- return (tif);
-}
-
-extern "C" TIFF* _TIFFOpenEx(CxFile* stream, const char* mode)
-{
- return (_TIFFFdOpen((int)stream, "TIFF IMAGE", mode));
-}
-
-#ifdef __GNUC__
-extern char* malloc();
-extern char* realloc();
-#else
-#include
-#endif
-
-tdata_t
-_TIFFmalloc(tsize_t s)
-{
- return (malloc((size_t) s));
-}
-
-void
-_TIFFfree(tdata_t p)
-{
- free(p);
-}
-
-tdata_t
-_TIFFrealloc(tdata_t p, tsize_t s)
-{
- return (realloc(p, (size_t) s));
-}
-
-void
-_TIFFmemset(tdata_t p, int v, tsize_t c)
-{
- memset(p, v, (size_t) c);
-}
-
-void
-_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
-{
- memcpy(d, s, (size_t) c);
-}
-
-int
-_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
-{
- return (memcmp(p1, p2, (size_t) c));
-}
-
-static void
-Win32WarningHandler(const char* module, const char* fmt, va_list ap)
-{
-#ifdef _DEBUG
-#if (!defined(_CONSOLE) && defined(WIN32))
- LPTSTR szTitle;
- LPTSTR szTmp;
- LPCTSTR szTitleText = "%s Warning";
- LPCTSTR szDefaultModule = "TIFFLIB";
- szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module;
- if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) +
- lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL)
- return;
- wsprintf(szTitle, szTitleText, szTmp);
- szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR);
- wvsprintf(szTmp, fmt, ap);
- MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION);
- LocalFree(szTitle);
- return;
-#else
- if (module != NULL)
- fprintf(stderr, "%s: ", module);
- fprintf(stderr, "Warning, ");
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ".\n");
-#endif
-#endif
-}
-TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
-
-static void
-Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
-{
-#ifdef _DEBUG
-#if (!defined(_CONSOLE) && defined(WIN32))
- LPTSTR szTitle;
- LPTSTR szTmp;
- LPCTSTR szTitleText = "%s Error";
- LPCTSTR szDefaultModule = "TIFFLIB";
- szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module;
- if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) +
- lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL)
- return;
- wsprintf(szTitle, szTitleText, szTmp);
- szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR);
- wvsprintf(szTmp, fmt, ap);
- MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION);
- LocalFree(szTitle);
- return;
-#else
- if (module != NULL)
- fprintf(stderr, "%s: ", module);
- vfprintf(stderr, fmt, ap);
- fprintf(stderr, ".\n");
-#endif
-#endif
-}
-TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
-
-#endif
-
diff --git a/src/win32/dependencies/cximage/xfile.h b/src/win32/dependencies/cximage/xfile.h
deleted file mode 100644
index af10b031..00000000
--- a/src/win32/dependencies/cximage/xfile.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * File: xfile.h
- * Purpose: General Purpose File Class
- */
-/*
- --------------------------------------------------------------------------------
-
- COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
- CxFile (c) 11/May/2002 Davide Pizzolato - www.xdp.it
- CxFile version 2.00 23/Aug/2002
-
- Special thanks to Chris Shearer Cooper for new features, enhancements and bugfixes
-
- Covered code is provided under this license on an "as is" basis, without warranty
- of any kind, either expressed or implied, including, without limitation, warranties
- that the covered code is free of defects, merchantable, fit for a particular purpose
- or non-infringing. The entire risk as to the quality and performance of the covered
- code is with you. Should any covered code prove defective in any respect, you (not
- the initial developer or any other contributor) assume the cost of any necessary
- servicing, repair or correction. This disclaimer of warranty constitutes an essential
- part of this license. No use of any covered code is authorized hereunder except under
- this disclaimer.
-
- Permission is hereby granted to use, copy, modify, and distribute this
- source code, or portions hereof, for any purpose, including commercial applications,
- freely and without fee, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source distribution.
- --------------------------------------------------------------------------------
- */
-#if !defined(__xfile_h)
-#define __xfile_h
-
-#ifdef WIN32
- #include
-#endif
-
-#include
-#include
-
-#include "ximadef.h"
-
-class DLL_EXP CxFile
-{
-public:
- CxFile(void) { };
- virtual ~CxFile() { };
-
- virtual bool Close() = 0;
- virtual size_t Read(void *buffer, size_t size, size_t count) = 0;
- virtual size_t Write(const void *buffer, size_t size, size_t count) = 0;
- virtual bool Seek(long offset, int origin) = 0;
- virtual long Tell() = 0;
- virtual long Size() = 0;
- virtual bool Flush() = 0;
- virtual bool Eof() = 0;
- virtual long Error() = 0;
- virtual bool PutC(unsigned char c)
- {
- // Default implementation
- size_t nWrote = Write(&c, 1, 1);
- return (bool)(nWrote == 1);
- }
- virtual long GetC() = 0;
-};
-
-#endif //__xfile_h
diff --git a/src/win32/dependencies/cximage/ximabmp.cpp b/src/win32/dependencies/cximage/ximabmp.cpp
deleted file mode 100644
index f723ded2..00000000
--- a/src/win32/dependencies/cximage/ximabmp.cpp
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- * File: ximabmp.cpp
- * Purpose: Platform Independent BMP Image Class Loader and Writer
- * 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximabmp.h"
-
-#if CXIMAGE_SUPPORT_BMP
-
-#include "ximaiter.h"
-
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageBMP::Encode(CxFile * hFile)
-{
-
- if (EncodeSafeCheck(hFile)) return false;
-
- BITMAPFILEHEADER hdr;
-
- hdr.bfType = 0x4d42; // 'BM' WINDOWS_BITMAP_SIGNATURE
- hdr.bfSize = GetSize() + 14 /*sizeof(BITMAPFILEHEADER)*/;
- hdr.bfReserved1 = hdr.bfReserved2 = 0;
- hdr.bfOffBits = 14 /*sizeof(BITMAPFILEHEADER)*/ + head.biSize + GetPaletteSize();
-
- //copy attributes
- memcpy(pDib,&head,sizeof(BITMAPINFOHEADER));
- // Write the file header
- hFile->Write(&hdr,min(14,sizeof(BITMAPFILEHEADER)),1);
- // Write the DIB header and the pixels
- hFile->Write(pDib,GetSize(),1);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_DECODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageBMP::Decode(CxFile * hFile)
-{
- if (hFile == NULL) return false;
-
- BITMAPFILEHEADER bf;
- DWORD off = hFile->Tell(); //
- try {
- if (hFile->Read(&bf,min(14,sizeof(bf)),1)==0) throw "Not a BMP";
- if (bf.bfType != BFT_BITMAP) { //do we have a RC HEADER?
- bf.bfOffBits = 0L;
- hFile->Seek(off,SEEK_SET);
- }
-
- BITMAPINFOHEADER bmpHeader;
- if (!DibReadBitmapInfo(hFile,&bmpHeader)) throw "Error reading BMP info";
- DWORD dwCompression=bmpHeader.biCompression;
- DWORD dwBitCount=bmpHeader.biBitCount; //preserve for BI_BITFIELDS compression
- bool bIsOldBmp = bmpHeader.biSize == sizeof(BITMAPCOREHEADER);
-
- bool bTopDownDib = bmpHeader.biHeight<0; // check if it's a top-down bitmap
- if (bTopDownDib) bmpHeader.biHeight=-bmpHeader.biHeight;
-
- if (info.nEscape == -1) {
- // Return output dimensions only
- head.biWidth = bmpHeader.biWidth;
- head.biHeight = bmpHeader.biHeight;
- throw "output dimensions returned";
- }
-
- if (!Create(bmpHeader.biWidth,bmpHeader.biHeight,bmpHeader.biBitCount,CXIMAGE_FORMAT_BMP))
- throw "Can't allocate memory";
-
- head.biXPelsPerMeter = bmpHeader.biXPelsPerMeter;
- head.biYPelsPerMeter = bmpHeader.biYPelsPerMeter;
- info.xDPI = (long) floor(bmpHeader.biXPelsPerMeter * 254.0 / 10000.0 + 0.5);
- info.yDPI = (long) floor(bmpHeader.biYPelsPerMeter * 254.0 / 10000.0 + 0.5);
-
- if (info.nEscape) throw "Cancelled"; // - cancel decoding
-
- RGBQUAD *pRgb = GetPalette();
- if (pRgb){
- if (bIsOldBmp){
- // convert a old color table (3 byte entries) to a new
- // color table (4 byte entries)
- hFile->Read((void*)pRgb,DibNumColors(&bmpHeader) * sizeof(RGBTRIPLE),1);
- for (int i=DibNumColors(&head)-1; i>=0; i--){
- pRgb[i].rgbRed = ((RGBTRIPLE *)pRgb)[i].rgbtRed;
- pRgb[i].rgbBlue = ((RGBTRIPLE *)pRgb)[i].rgbtBlue;
- pRgb[i].rgbGreen = ((RGBTRIPLE *)pRgb)[i].rgbtGreen;
- pRgb[i].rgbReserved = (BYTE)0;
- }
- } else {
- hFile->Read((void*)pRgb,DibNumColors(&bmpHeader) * sizeof(RGBQUAD),1);
- //force rgbReserved=0, to avoid problems with some WinXp bitmaps
- for (unsigned int i=0; i - cancel decoding
-
- switch (dwBitCount) {
- case 32 :
- if (bf.bfOffBits != 0L) hFile->Seek(off + bf.bfOffBits,SEEK_SET);
- if (dwCompression == BI_BITFIELDS || dwCompression == BI_RGB){
- long imagesize=4*head.biHeight*head.biWidth;
- BYTE* buff32=(BYTE*)malloc(imagesize);
- if (buff32){
- hFile->Read(buff32, imagesize,1); // read in the pixels
- Bitfield2RGB(buff32,0,0,0,32);
- free(buff32);
- } else throw "can't allocate memory";
- } else throw "unknown compression";
- break;
- case 24 :
- if (bf.bfOffBits != 0L) hFile->Seek(off + bf.bfOffBits,SEEK_SET);
- if (dwCompression == BI_RGB){
- hFile->Read(info.pImage, head.biSizeImage,1); // read in the pixels
- } else throw "unknown compression";
- break;
- case 16 :
- {
- DWORD bfmask[3];
- if (dwCompression == BI_BITFIELDS)
- {
- hFile->Read(bfmask, 12, 1);
- } else {
- bfmask[0]=0x7C00; bfmask[1]=0x3E0; bfmask[2]=0x1F; //RGB555
- }
- // bf.bfOffBits required after the bitfield mask
- if (bf.bfOffBits != 0L) hFile->Seek(off + bf.bfOffBits,SEEK_SET);
- // read in the pixels
- hFile->Read(info.pImage, head.biHeight*((head.biWidth+1)/2)*4,1);
- // transform into RGB
- Bitfield2RGB(info.pImage,(WORD)bfmask[0],(WORD)bfmask[1],(WORD)bfmask[2],16);
- break;
- }
- case 8 :
- case 4 :
- case 1 :
- if (bf.bfOffBits != 0L) hFile->Seek(off + bf.bfOffBits,SEEK_SET);
- switch (dwCompression) {
- case BI_RGB :
- hFile->Read(info.pImage, head.biSizeImage,1); // read in the pixels
- break;
- case BI_RLE4 :
- {
- BYTE status_byte = 0;
- BYTE second_byte = 0;
- int scanline = 0;
- int bits = 0;
- BOOL low_nibble = FALSE;
- CImageIterator iter(this);
-
- for (BOOL bContinue = TRUE; bContinue;) {
- hFile->Read(&status_byte, sizeof(BYTE), 1);
- switch (status_byte) {
- case RLE_COMMAND :
- hFile->Read(&status_byte, sizeof(BYTE), 1);
- switch (status_byte) {
- case RLE_ENDOFLINE :
- bits = 0;
- scanline++;
- low_nibble = FALSE;
- break;
- case RLE_ENDOFBITMAP :
- bContinue=FALSE;
- break;
- case RLE_DELTA :
- {
- // read the delta values
- BYTE delta_x;
- BYTE delta_y;
- hFile->Read(&delta_x, sizeof(BYTE), 1);
- hFile->Read(&delta_y, sizeof(BYTE), 1);
- // apply them
- bits += delta_x / 2;
- scanline += delta_y;
- break;
- }
- default :
- hFile->Read(&second_byte, sizeof(BYTE), 1);
- BYTE *sline = iter.GetRow(scanline);
- for (int i = 0; i < status_byte; i++) {
- if (low_nibble) {
- if ((DWORD)(sline+bits) < (DWORD)(info.pImage+head.biSizeImage)){
- *(sline + bits) |= (second_byte & 0x0F);
- }
- if (i != status_byte - 1)
- hFile->Read(&second_byte, sizeof(BYTE), 1);
- bits++;
- } else {
- if ((DWORD)(sline+bits) < (DWORD)(info.pImage+head.biSizeImage)){
- *(sline + bits) = (BYTE)(second_byte & 0xF0);
- }
- }
- low_nibble = !low_nibble;
- }
- if ((((status_byte+1) >> 1) & 1 )== 1)
- hFile->Read(&second_byte, sizeof(BYTE), 1);
- break;
- };
- break;
- default :
- {
- BYTE *sline = iter.GetRow(scanline);
- hFile->Read(&second_byte, sizeof(BYTE), 1);
- for (unsigned i = 0; i < status_byte; i++) {
- if (low_nibble) {
- if ((DWORD)(sline+bits) < (DWORD)(info.pImage+head.biSizeImage)){
- *(sline + bits) |= (second_byte & 0x0F);
- }
- bits++;
- } else {
- if ((DWORD)(sline+bits) < (DWORD)(info.pImage+head.biSizeImage)){
- *(sline + bits) = (BYTE)(second_byte & 0xF0);
- }
- }
- low_nibble = !low_nibble;
- }
- }
- break;
- };
- }
- break;
- }
- case BI_RLE8 :
- {
- BYTE status_byte = 0;
- BYTE second_byte = 0;
- int scanline = 0;
- int bits = 0;
- CImageIterator iter(this);
-
- for (BOOL bContinue = TRUE; bContinue; ) {
- hFile->Read(&status_byte, sizeof(BYTE), 1);
- switch (status_byte) {
- case RLE_COMMAND :
- hFile->Read(&status_byte, sizeof(BYTE), 1);
- switch (status_byte) {
- case RLE_ENDOFLINE :
- bits = 0;
- scanline++;
- break;
- case RLE_ENDOFBITMAP :
- bContinue=FALSE;
- break;
- case RLE_DELTA :
- {
- // read the delta values
- BYTE delta_x;
- BYTE delta_y;
- hFile->Read(&delta_x, sizeof(BYTE), 1);
- hFile->Read(&delta_y, sizeof(BYTE), 1);
- // apply them
- bits += delta_x;
- scanline += delta_y;
- break;
- }
- default :
- hFile->Read((void *)(iter.GetRow(scanline) + bits), sizeof(BYTE) * status_byte, 1);
- // align run length to even number of bytes
- if ((status_byte & 1) == 1)
- hFile->Read(&second_byte, sizeof(BYTE), 1);
- bits += status_byte;
- break;
- };
- break;
- default :
- BYTE *sline = iter.GetRow(scanline);
- hFile->Read(&second_byte, sizeof(BYTE), 1);
- for (unsigned i = 0; i < status_byte; i++) {
- if ((DWORD)bits
-
- } catch (char *message) {
- strncpy(info.szLastError,message,255);
- if (info.nEscape==-1) return true;
- return false;
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/* ReadDibBitmapInfo()
- *
- * Will read a file in DIB format and return a global HANDLE to its
- * BITMAPINFO. This function will work with both "old" and "new"
- * bitmap formats, but will always return a "new" BITMAPINFO.
- */
-bool CxImageBMP::DibReadBitmapInfo(CxFile* fh, BITMAPINFOHEADER *pdib)
-{
- if ((fh==NULL)||(pdib==NULL)) return false;
-
- if (fh->Read(pdib,sizeof(BITMAPINFOHEADER),1)==0) return false;
-
- BITMAPCOREHEADER bc;
-
- switch (pdib->biSize) // what type of bitmap info is this?
- {
- case sizeof(BITMAPINFOHEADER):
- break;
-
- case 64: //sizeof(OS2_BMP_HEADER):
- fh->Seek((long)(64 - sizeof(BITMAPINFOHEADER)),SEEK_CUR);
- break;
-
- case sizeof(BITMAPCOREHEADER):
- bc = *(BITMAPCOREHEADER*)pdib;
- pdib->biSize = bc.bcSize;
- pdib->biWidth = (DWORD)bc.bcWidth;
- pdib->biHeight = (DWORD)bc.bcHeight;
- pdib->biPlanes = bc.bcPlanes;
- pdib->biBitCount = bc.bcBitCount;
- pdib->biCompression = BI_RGB;
- pdib->biSizeImage = 0;
- pdib->biXPelsPerMeter = 0;
- pdib->biYPelsPerMeter = 0;
- pdib->biClrUsed = 0;
- pdib->biClrImportant = 0;
-
- fh->Seek((long)(sizeof(BITMAPCOREHEADER)-sizeof(BITMAPINFOHEADER)), SEEK_CUR);
-
- break;
- default:
- //give a last chance
- if (pdib->biSize>(sizeof(BITMAPINFOHEADER))&&
- (pdib->biSizeImage==(unsigned long)(pdib->biHeight*((((pdib->biBitCount*pdib->biWidth)+31)/32)*4)))&&
- (pdib->biPlanes==1)&&(pdib->biCompression==BI_RGB)&&(pdib->biClrUsed==0))
- {
- fh->Seek((long)(pdib->biSize - sizeof(BITMAPINFOHEADER)),SEEK_CUR);
- break;
- }
- return false;
- }
-
- FixBitmapInfo(pdib);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_DECODE
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_BMP
-////////////////////////////////////////////////////////////////////////////////
diff --git a/src/win32/dependencies/cximage/ximabmp.h b/src/win32/dependencies/cximage/ximabmp.h
deleted file mode 100644
index 2bda4feb..00000000
--- a/src/win32/dependencies/cximage/ximabmp.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * File: ximabmp.h
- * Purpose: BMP Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageBMP (c) 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * Special thanks to Troels Knakkergaard for new features, enhancements and bugfixes
- *
- * original CImageBMP and CImageIterator implementation are:
- * Copyright: (c) 1995, Alejandro Aguilar Sierra
- *
- * ==========================================================
- */
-
-#if !defined(__ximaBMP_h)
-#define __ximaBMP_h
-
-#include "ximage.h"
-
-const int RLE_COMMAND = 0;
-const int RLE_ENDOFLINE = 0;
-const int RLE_ENDOFBITMAP = 1;
-const int RLE_DELTA = 2;
-
-#if !defined(BI_RLE8)
- #define BI_RLE8 1L
-#endif
-#if !defined(BI_RLE4)
- #define BI_RLE4 2L
-#endif
-
-#if CXIMAGE_SUPPORT_BMP
-
-class CxImageBMP: public CxImage
-{
-public:
- CxImageBMP(): CxImage(CXIMAGE_FORMAT_BMP) {};
-
- bool Decode(CxFile * hFile);
- bool Decode(FILE *hFile) { CxIOFile file(hFile); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile);
- bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-
-protected:
- bool DibReadBitmapInfo(CxFile* fh, BITMAPINFOHEADER *pdib);
-};
-
-#define BFT_ICON 0x4349 /* 'IC' */
-#define BFT_BITMAP 0x4d42 /* 'BM' */
-#define BFT_CURSOR 0x5450 /* 'PT' */
-
-#ifndef WIDTHBYTES
-#define WIDTHBYTES(i) ((unsigned)((i+31)&(~31))/8) /* ULONG aligned ! */
-#endif
-
-#endif
-
-#define DibWidthBytesN(lpbi, n) (UINT)WIDTHBYTES((UINT)(lpbi)->biWidth * (UINT)(n))
-#define DibWidthBytes(lpbi) DibWidthBytesN(lpbi, (lpbi)->biBitCount)
-
-#define DibSizeImage(lpbi) ((lpbi)->biSizeImage == 0 \
- ? ((DWORD)(UINT)DibWidthBytes(lpbi) * (DWORD)(UINT)(lpbi)->biHeight) \
- : (lpbi)->biSizeImage)
-
-#define DibNumColors(lpbi) ((lpbi)->biClrUsed == 0 && (lpbi)->biBitCount <= 8 \
- ? (int)(1 << (int)(lpbi)->biBitCount) \
- : (int)(lpbi)->biClrUsed)
-
-#define FixBitmapInfo(lpbi) if ((lpbi)->biSizeImage == 0) \
- (lpbi)->biSizeImage = DibSizeImage(lpbi); \
- if ((lpbi)->biClrUsed == 0) \
- (lpbi)->biClrUsed = DibNumColors(lpbi); \
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximacfg.h b/src/win32/dependencies/cximage/ximacfg.h
deleted file mode 100644
index a28b35ed..00000000
--- a/src/win32/dependencies/cximage/ximacfg.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#if !defined(__ximaCFG_h)
-#define __ximaCFG_h
-
-/////////////////////////////////////////////////////////////////////////////
-// CxImage supported features
-#define CXIMAGE_SUPPORT_ALPHA 1
-#define CXIMAGE_SUPPORT_SELECTION 1
-#define CXIMAGE_SUPPORT_TRANSFORMATION 1
-#define CXIMAGE_SUPPORT_DSP 1
-#define CXIMAGE_SUPPORT_LAYERS 1
-#define CXIMAGE_SUPPORT_INTERPOLATION 1
-
-#define CXIMAGE_SUPPORT_DECODE 1
-#define CXIMAGE_SUPPORT_ENCODE 1 //
-#define CXIMAGE_SUPPORT_WINDOWS 1
-#define CXIMAGE_SUPPORT_WINCE 0 //
-
-/////////////////////////////////////////////////////////////////////////////
-// CxImage supported formats
-#define CXIMAGE_SUPPORT_BMP 1
-#define CXIMAGE_SUPPORT_GIF 1
-#define CXIMAGE_SUPPORT_JPG 0
-#define CXIMAGE_SUPPORT_PNG 0
-#define CXIMAGE_SUPPORT_MNG 0
-#define CXIMAGE_SUPPORT_ICO 1
-#define CXIMAGE_SUPPORT_TIF 0
-#define CXIMAGE_SUPPORT_TGA 1
-#define CXIMAGE_SUPPORT_PCX 1
-#define CXIMAGE_SUPPORT_WBMP 1
-#define CXIMAGE_SUPPORT_WMF 1
-#define CXIMAGE_SUPPORT_J2K 0 // Beta, use JP2
-#define CXIMAGE_SUPPORT_JBG 0 // GPL'd see ../jbig/copying.txt & ../jbig/patents.htm
-
-#define CXIMAGE_SUPPORT_JP2 0
-#define CXIMAGE_SUPPORT_JPC 0
-#define CXIMAGE_SUPPORT_PGX 0
-#define CXIMAGE_SUPPORT_PNM 0
-#define CXIMAGE_SUPPORT_RAS 0
-
-
-/////////////////////////////////////////////////////////////////////////////
-#define CXIMAGE_MAX_MEMORY 256000000
-
-#define CXIMAGE_ERR_NOFILE "null file handler"
-#define CXIMAGE_ERR_NOIMAGE "null image!!!"
-
-/////////////////////////////////////////////////////////////////////////////
-//color to grey mapping
-//#define RGB2GRAY(r,g,b) (((b)*114 + (g)*587 + (r)*299)/1000)
-#define RGB2GRAY(r,g,b) (((b)*117 + (g)*601 + (r)*306) >> 10)
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximadef.h b/src/win32/dependencies/cximage/ximadef.h
deleted file mode 100644
index 6f3d10db..00000000
--- a/src/win32/dependencies/cximage/ximadef.h
+++ /dev/null
@@ -1,197 +0,0 @@
-#if !defined(__ximadefs_h)
-#define __ximadefs_h
-
-#include "ximacfg.h"
-
-#if defined(_AFXDLL)||defined(_USRDLL)
- #define DLL_EXP __declspec(dllexport)
-#elif defined(_MSC_VER)&&(_MSC_VER<1200)
- #define DLL_EXP __declspec(dllimport)
-#else
- #define DLL_EXP
-#endif
-
-#if CXIMAGE_SUPPORT_JP2 || CXIMAGE_SUPPORT_JPC || CXIMAGE_SUPPORT_PGX || CXIMAGE_SUPPORT_PNM || CXIMAGE_SUPPORT_RAS
- #define CXIMAGE_SUPPORT_JASPER 1
-#else
- #define CXIMAGE_SUPPORT_JASPER 0
-#endif
-
-#if CXIMAGE_SUPPORT_DSP
-#undef CXIMAGE_SUPPORT_TRANSFORMATION
- #define CXIMAGE_SUPPORT_TRANSFORMATION 1
-#endif
-
-#if CXIMAGE_SUPPORT_TRANSFORMATION || CXIMAGE_SUPPORT_TIF || CXIMAGE_SUPPORT_TGA || CXIMAGE_SUPPORT_BMP || CXIMAGE_SUPPORT_WINDOWS
- #define CXIMAGE_SUPPORT_BASICTRANSFORMATIONS 1
-#endif
-
-#if CXIMAGE_SUPPORT_DSP || CXIMAGE_SUPPORT_TRANSFORMATION
-#undef CXIMAGE_SUPPORT_INTERPOLATION
- #define CXIMAGE_SUPPORT_INTERPOLATION 1
-#endif
-
-#if CXIMAGE_SUPPORT_WINCE
- #undef CXIMAGE_SUPPORT_WMF
- #define CXIMAGE_SUPPORT_WMF 0
- #undef CXIMAGE_SUPPORT_WINDOWS
- #define CXIMAGE_SUPPORT_WINDOWS 0
-#endif
-
-#ifndef WIN32
- #undef CXIMAGE_SUPPORT_WINDOWS
- #define CXIMAGE_SUPPORT_WINDOWS 0
-#endif
-
-#ifndef min
-#define min(a,b) (((a)<(b))?(a):(b))
-#endif
-#ifndef max
-#define max(a,b) (((a)>(b))?(a):(b))
-#endif
-
-#ifndef PI
- #define PI 3.141592653589793f
-#endif
-
-
-#ifdef WIN32
-#include
-#include
-#endif
-
-#include
-#include
-
-
-#ifdef __BORLANDC__
-
-#ifndef _COMPLEX_DEFINED
-
-typedef struct tagcomplex {
- double x,y;
-} _complex;
-
-#endif
-
-#define _cabs(c) sqrt(c.x*c.x+c.y*c.y)
-
-#endif
-
-
-#ifndef WIN32
-
-#include
-#include
-#include
-
-typedef unsigned char BYTE;
-typedef unsigned short WORD;
-typedef unsigned long DWORD;
-typedef unsigned int UINT;
-
-typedef DWORD COLORREF;
-typedef unsigned int HANDLE;
-typedef void* HRGN;
-
-#ifndef BOOL
-#define BOOL bool
-#endif
-
-#ifndef TRUE
-#define TRUE true
-#endif
-
-#ifndef FALSE
-#define FALSE false
-#endif
-
-#ifndef TCHAR
-#define TCHAR char
-#define _T
-#endif
-
-typedef struct tagRECT
-{
- long left;
- long top;
- long right;
- long bottom;
-} RECT;
-
-typedef struct tagPOINT
-{
- long x;
- long y;
-} POINT;
-
-typedef struct tagRGBQUAD {
- BYTE rgbBlue;
- BYTE rgbGreen;
- BYTE rgbRed;
- BYTE rgbReserved;
-} RGBQUAD;
-
-#pragma pack(1)
-
-typedef struct tagBITMAPINFOHEADER{
- DWORD biSize;
- long biWidth;
- long biHeight;
- WORD biPlanes;
- WORD biBitCount;
- DWORD biCompression;
- DWORD biSizeImage;
- long biXPelsPerMeter;
- long biYPelsPerMeter;
- DWORD biClrUsed;
- DWORD biClrImportant;
-} BITMAPINFOHEADER;
-
-typedef struct tagBITMAPFILEHEADER {
- WORD bfType;
- DWORD bfSize;
- WORD bfReserved1;
- WORD bfReserved2;
- DWORD bfOffBits;
-} BITMAPFILEHEADER;
-
-typedef struct tagBITMAPCOREHEADER {
- DWORD bcSize;
- WORD bcWidth;
- WORD bcHeight;
- WORD bcPlanes;
- WORD bcBitCount;
-} BITMAPCOREHEADER;
-
-typedef struct tagRGBTRIPLE {
- BYTE rgbtBlue;
- BYTE rgbtGreen;
- BYTE rgbtRed;
-} RGBTRIPLE;
-
-#pragma pack()
-
-#define BI_RGB 0L
-#define BI_RLE8 1L
-#define BI_RLE4 2L
-#define BI_BITFIELDS 3L
-
-#define GetRValue(rgb) ((BYTE)(rgb))
-#define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
-#define GetBValue(rgb) ((BYTE)((rgb)>>16))
-#define RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
-
-#ifndef _COMPLEX_DEFINED
-
-typedef struct tagcomplex {
- double x,y;
-} _complex;
-
-#endif
-
-#define _cabs(c) sqrt(c.x*c.x+c.y*c.y)
-
-#endif
-
-#endif //__ximadefs
diff --git a/src/win32/dependencies/cximage/ximadsp.cpp b/src/win32/dependencies/cximage/ximadsp.cpp
deleted file mode 100644
index d6a2ef56..00000000
--- a/src/win32/dependencies/cximage/ximadsp.cpp
+++ /dev/null
@@ -1,2370 +0,0 @@
-// xImaDsp.cpp : DSP functions
-/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-#include "ximaiter.h"
-
-#if CXIMAGE_SUPPORT_DSP
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Converts the image to B&W.
- * The Mean() function can be used for calculating the optimal threshold.
- * \param level: the lightness threshold.
- * \return true if everything is ok
- */
-bool CxImage::Threshold(BYTE level)
-{
- if (!pDib) return false;
- if (head.biBitCount == 1) return true;
-
- GrayScale();
-
- CxImage tmp(head.biWidth,head.biHeight,1);
- if (!tmp.IsValid()) return false;
-
- for (long y=0;ylevel)
- tmp.SetPixelIndex(x,y,1);
- else
- tmp.SetPixelIndex(x,y,0);
- }
- }
- tmp.SetPaletteColor(0,0,0,0);
- tmp.SetPaletteColor(1,255,255,255);
- Transfer(tmp);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Extract RGB channels from the image. Each channel is an 8 bit grayscale image.
- * \param r,g,b: pointers to CxImage objects, to store the splited channels
- * \return true if everything is ok
- */
-bool CxImage::SplitRGB(CxImage* r,CxImage* g,CxImage* b)
-{
- if (!pDib) return false;
- if (r==NULL && g==NULL && b==NULL) return false;
-
- CxImage tmpr(head.biWidth,head.biHeight,8);
- CxImage tmpg(head.biWidth,head.biHeight,8);
- CxImage tmpb(head.biWidth,head.biHeight,8);
-
- RGBQUAD color;
- for(long y=0; yTransfer(tmpr);
- if (g) g->Transfer(tmpg);
- if (b) b->Transfer(tmpb);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Extract CMYK channels from the image. Each channel is an 8 bit grayscale image.
- * \param c,m,y,k: pointers to CxImage objects, to store the splited channels
- * \return true if everything is ok
- */
-bool CxImage::SplitCMYK(CxImage* c,CxImage* m,CxImage* y,CxImage* k)
-{
- if (!pDib) return false;
- if (c==NULL && m==NULL && y==NULL && k==NULL) return false;
-
- CxImage tmpc(head.biWidth,head.biHeight,8);
- CxImage tmpm(head.biWidth,head.biHeight,8);
- CxImage tmpy(head.biWidth,head.biHeight,8);
- CxImage tmpk(head.biWidth,head.biHeight,8);
-
- RGBQUAD color;
- for(long yy=0; yyTransfer(tmpc);
- if (m) m->Transfer(tmpm);
- if (y) y->Transfer(tmpy);
- if (k) k->Transfer(tmpk);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Extract YUV channels from the image. Each channel is an 8 bit grayscale image.
- * \param y,u,v: pointers to CxImage objects, to store the splited channels
- * \return true if everything is ok
- */
-bool CxImage::SplitYUV(CxImage* y,CxImage* u,CxImage* v)
-{
- if (!pDib) return false;
- if (y==NULL && u==NULL && v==NULL) return false;
-
- CxImage tmpy(head.biWidth,head.biHeight,8);
- CxImage tmpu(head.biWidth,head.biHeight,8);
- CxImage tmpv(head.biWidth,head.biHeight,8);
-
- RGBQUAD color;
- for(long yy=0; yyTransfer(tmpy);
- if (u) u->Transfer(tmpu);
- if (v) v->Transfer(tmpv);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Extract YIQ channels from the image. Each channel is an 8 bit grayscale image.
- * \param y,i,q: pointers to CxImage objects, to store the splited channels
- * \return true if everything is ok
- */
-bool CxImage::SplitYIQ(CxImage* y,CxImage* i,CxImage* q)
-{
- if (!pDib) return false;
- if (y==NULL && i==NULL && q==NULL) return false;
-
- CxImage tmpy(head.biWidth,head.biHeight,8);
- CxImage tmpi(head.biWidth,head.biHeight,8);
- CxImage tmpq(head.biWidth,head.biHeight,8);
-
- RGBQUAD color;
- for(long yy=0; yyTransfer(tmpy);
- if (i) i->Transfer(tmpi);
- if (q) q->Transfer(tmpq);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Extract XYZ channels from the image. Each channel is an 8 bit grayscale image.
- * \param x,y,z: pointers to CxImage objects, to store the splited channels
- * \return true if everything is ok
- */
-bool CxImage::SplitXYZ(CxImage* x,CxImage* y,CxImage* z)
-{
- if (!pDib) return false;
- if (x==NULL && y==NULL && z==NULL) return false;
-
- CxImage tmpx(head.biWidth,head.biHeight,8);
- CxImage tmpy(head.biWidth,head.biHeight,8);
- CxImage tmpz(head.biWidth,head.biHeight,8);
-
- RGBQUAD color;
- for(long yy=0; yyTransfer(tmpx);
- if (y) y->Transfer(tmpy);
- if (z) z->Transfer(tmpz);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Extract HSL channels from the image. Each channel is an 8 bit grayscale image.
- * \param h,s,l: pointers to CxImage objects, to store the splited channels
- * \return true if everything is ok
- */
-bool CxImage::SplitHSL(CxImage* h,CxImage* s,CxImage* l)
-{
- if (!pDib) return false;
- if (h==NULL && s==NULL && l==NULL) return false;
-
- CxImage tmph(head.biWidth,head.biHeight,8);
- CxImage tmps(head.biWidth,head.biHeight,8);
- CxImage tmpl(head.biWidth,head.biHeight,8);
-
- RGBQUAD color;
- for(long y=0; yTransfer(tmph);
- if (s) s->Transfer(tmps);
- if (l) l->Transfer(tmpl);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#define HSLMAX 255 /* H,L, and S vary over 0-HSLMAX */
-#define RGBMAX 255 /* R,G, and B vary over 0-RGBMAX */
- /* HSLMAX BEST IF DIVISIBLE BY 6 */
- /* RGBMAX, HSLMAX must each fit in a BYTE. */
-/* Hue is undefined if Saturation is 0 (grey-scale) */
-/* This value determines where the Hue scrollbar is */
-/* initially set for achromatic colors */
-#define HSLUNDEFINED (HSLMAX*2/3)
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::RGBtoHSL(RGBQUAD lRGBColor)
-{
- BYTE R,G,B; /* input RGB values */
- BYTE H,L,S; /* output HSL values */
- BYTE cMax,cMin; /* max and min RGB values */
- WORD Rdelta,Gdelta,Bdelta; /* intermediate value: % of spread from max*/
-
- R = lRGBColor.rgbRed; /* get R, G, and B out of DWORD */
- G = lRGBColor.rgbGreen;
- B = lRGBColor.rgbBlue;
-
- cMax = max( max(R,G), B); /* calculate lightness */
- cMin = min( min(R,G), B);
- L = (BYTE)((((cMax+cMin)*HSLMAX)+RGBMAX)/(2*RGBMAX));
-
- if (cMax==cMin){ /* r=g=b --> achromatic case */
- S = 0; /* saturation */
- H = HSLUNDEFINED; /* hue */
- } else { /* chromatic case */
- if (L <= (HSLMAX/2)) /* saturation */
- S = (BYTE)((((cMax-cMin)*HSLMAX)+((cMax+cMin)/2))/(cMax+cMin));
- else
- S = (BYTE)((((cMax-cMin)*HSLMAX)+((2*RGBMAX-cMax-cMin)/2))/(2*RGBMAX-cMax-cMin));
- /* hue */
- Rdelta = (WORD)((((cMax-R)*(HSLMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin));
- Gdelta = (WORD)((((cMax-G)*(HSLMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin));
- Bdelta = (WORD)((((cMax-B)*(HSLMAX/6)) + ((cMax-cMin)/2) ) / (cMax-cMin));
-
- if (R == cMax)
- H = (BYTE)(Bdelta - Gdelta);
- else if (G == cMax)
- H = (BYTE)((HSLMAX/3) + Rdelta - Bdelta);
- else /* B == cMax */
- H = (BYTE)(((2*HSLMAX)/3) + Gdelta - Rdelta);
-
-// if (H < 0) H += HSLMAX; //always false
- if (H > HSLMAX) H -= HSLMAX;
- }
- RGBQUAD hsl={L,S,H,0};
- return hsl;
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::HueToRGB(float n1,float n2, float hue)
-{
- // fixed implementation for HSL2RGB routine
- float rValue;
-
- if (hue > 360)
- hue = hue - 360;
- else if (hue < 0)
- hue = hue + 360;
-
- if (hue < 60)
- rValue = n1 + (n2-n1)*hue/60.0f;
- else if (hue < 180)
- rValue = n2;
- else if (hue < 240)
- rValue = n1+(n2-n1)*(240-hue)/60;
- else
- rValue = n1;
-
- return rValue;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::HSLtoRGB(COLORREF cHSLColor)
-{
- return HSLtoRGB(RGBtoRGBQUAD(cHSLColor));
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::HSLtoRGB(RGBQUAD lHSLColor)
-{
- // fixed implementation for HSL2RGB routine
- float h,s,l;
- float m1,m2;
- BYTE r,g,b;
-
- h = (float)lHSLColor.rgbRed * 360.0f/255.0f;
- s = (float)lHSLColor.rgbGreen/255.0f;
- l = (float)lHSLColor.rgbBlue/255.0f;
-
- if (l <= 0.5) m2 = l * (1+s);
- else m2 = l + s - l*s;
-
- m1 = 2 * l - m2;
-
- if (s == 0) {
- r=g=b=(BYTE)(l*255.0f);
- } else {
- r = (BYTE)(HueToRGB(m1,m2,h+120) * 255.0f);
- g = (BYTE)(HueToRGB(m1,m2,h) * 255.0f);
- b = (BYTE)(HueToRGB(m1,m2,h-120) * 255.0f);
- }
-
- RGBQUAD rgb = {b,g,r,0};
- return rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::YUVtoRGB(RGBQUAD lYUVColor)
-{
- int U,V,R,G,B;
- float Y = lYUVColor.rgbRed;
- U = lYUVColor.rgbGreen - 128;
- V = lYUVColor.rgbBlue - 128;
-
-// R = (int)(1.164 * Y + 2.018 * U);
-// G = (int)(1.164 * Y - 0.813 * V - 0.391 * U);
-// B = (int)(1.164 * Y + 1.596 * V);
- R = (int)( Y + 1.403f * V);
- G = (int)( Y - 0.344f * U - 0.714f * V);
- B = (int)( Y + 1.770f * U);
-
- R= min(255,max(0,R));
- G= min(255,max(0,G));
- B= min(255,max(0,B));
- RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};
- return rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::RGBtoYUV(RGBQUAD lRGBColor)
-{
- int Y,U,V,R,G,B;
- R = lRGBColor.rgbRed;
- G = lRGBColor.rgbGreen;
- B = lRGBColor.rgbBlue;
-
-// Y = (int)( 0.257 * R + 0.504 * G + 0.098 * B);
-// U = (int)( 0.439 * R - 0.368 * G - 0.071 * B + 128);
-// V = (int)(-0.148 * R - 0.291 * G + 0.439 * B + 128);
- Y = (int)(0.299f * R + 0.587f * G + 0.114f * B);
- U = (int)((B-Y) * 0.565f + 128);
- V = (int)((R-Y) * 0.713f + 128);
-
- Y= min(255,max(0,Y));
- U= min(255,max(0,U));
- V= min(255,max(0,V));
- RGBQUAD yuv={(BYTE)V,(BYTE)U,(BYTE)Y,0};
- return yuv;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::YIQtoRGB(RGBQUAD lYIQColor)
-{
- int I,Q,R,G,B;
- float Y = lYIQColor.rgbRed;
- I = lYIQColor.rgbGreen - 128;
- Q = lYIQColor.rgbBlue - 128;
-
- R = (int)( Y + 0.956f * I + 0.621f * Q);
- G = (int)( Y - 0.273f * I - 0.647f * Q);
- B = (int)( Y - 1.104f * I + 1.701f * Q);
-
- R= min(255,max(0,R));
- G= min(255,max(0,G));
- B= min(255,max(0,B));
- RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};
- return rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::RGBtoYIQ(RGBQUAD lRGBColor)
-{
- int Y,I,Q,R,G,B;
- R = lRGBColor.rgbRed;
- G = lRGBColor.rgbGreen;
- B = lRGBColor.rgbBlue;
-
- Y = (int)( 0.2992f * R + 0.5868f * G + 0.1140f * B);
- I = (int)( 0.5960f * R - 0.2742f * G - 0.3219f * B + 128);
- Q = (int)( 0.2109f * R - 0.5229f * G + 0.3120f * B + 128);
-
- Y= min(255,max(0,Y));
- I= min(255,max(0,I));
- Q= min(255,max(0,Q));
- RGBQUAD yiq={(BYTE)Q,(BYTE)I,(BYTE)Y,0};
- return yiq;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::XYZtoRGB(RGBQUAD lXYZColor)
-{
- int X,Y,Z,R,G,B;
- X = lXYZColor.rgbRed;
- Y = lXYZColor.rgbGreen;
- Z = lXYZColor.rgbBlue;
- double k=1.088751;
-
- R = (int)( 3.240479f * X - 1.537150f * Y - 0.498535f * Z * k);
- G = (int)( -0.969256f * X + 1.875992f * Y + 0.041556f * Z * k);
- B = (int)( 0.055648f * X - 0.204043f * Y + 1.057311f * Z * k);
-
- R= min(255,max(0,R));
- G= min(255,max(0,G));
- B= min(255,max(0,B));
- RGBQUAD rgb={(BYTE)B,(BYTE)G,(BYTE)R,0};
- return rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::RGBtoXYZ(RGBQUAD lRGBColor)
-{
- int X,Y,Z,R,G,B;
- R = lRGBColor.rgbRed;
- G = lRGBColor.rgbGreen;
- B = lRGBColor.rgbBlue;
-
- X = (int)( 0.412453f * R + 0.357580f * G + 0.180423f * B);
- Y = (int)( 0.212671f * R + 0.715160f * G + 0.072169f * B);
- Z = (int)((0.019334f * R + 0.119193f * G + 0.950227f * B)*0.918483657f);
-
- //X= min(255,max(0,X));
- //Y= min(255,max(0,Y));
- //Z= min(255,max(0,Z));
- RGBQUAD xyz={(BYTE)Z,(BYTE)Y,(BYTE)X,0};
- return xyz;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Generates a "rainbow" palette with saturated colors
- * \param correction: 1 generates a single hue spectrum. 0.75 is nice for scientific applications.
- */
-void CxImage::HuePalette(float correction)
-{
- if (head.biClrUsed==0) return;
-
- for(DWORD j=0; j 1.0f) blend = 1.0f;
- int a0 = (int)(256*blend);
- int a1 = 256 - a0;
-
- bool bFullBlend = false;
- if (blend > 0.999f) bFullBlend = true;
-
- RGBQUAD color,hsl;
- if (head.biClrUsed==0){
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; y>8);
- color.rgbBlue = (BYTE)((hsl.rgbBlue * a0 + color.rgbBlue * a1)>>8);
- color.rgbGreen = (BYTE)((hsl.rgbGreen * a0 + color.rgbGreen * a1)>>8);
- SetPixelColor(x,y,color);
- }
- }
- }
- }
- } else {
- for(DWORD j=0; j
- for (int i=0;i<256;i++) {
- cTable[i] = (BYTE)max(0,min(255,(int)((i-128)*c + brightness)));
- }
-
- return Lut(cTable);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return mean lightness of the image. Useful with Threshold() and Light()
- */
-float CxImage::Mean()
-{
- if (!pDib) return 0;
-
- CxImage tmp(*this,true);
- if (!tmp.IsValid()) return false;
-
- tmp.GrayScale();
- float sum=0;
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
- if (xmin==xmax || ymin==ymax) return (float)0.0;
-
- BYTE *iSrc=tmp.info.pImage;
- iSrc += tmp.info.dwEffWidth*ymin; // necessary for selections
-
- for(long y=ymin; y
- for(long x=xmin; x 0 && (y+kmax-1) < head.biHeight && x-k2 > 0 && (x+kmax-1) < head.biWidth)
- {
- b=0;
- iCount = 0;
- iY2 = ((y-k2)*info.dwEffWidth);
- for(long j=-k2;j r) r=c.rgbRed;
- if (c.rgbGreen > g) g=c.rgbGreen;
- if (c.rgbBlue > b) b=c.rgbBlue;
- }
- }
- c.rgbRed = r;
- c.rgbGreen = g;
- c.rgbBlue = b;
- tmp.SetPixelColor(x,y,c);
- }
- }
- }
- Transfer(tmp);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Enhance the variations between adjacent pixels.
- * Similar results can be achieved using Filter(),
- * but the algorithms are different both in Edge() and in Contour().
- * \param Ksize: size of the kernel.
- * \return true if everything is ok
- */
-bool CxImage::Edge(long Ksize)
-{
- if (!pDib) return false;
-
- long k2 = Ksize/2;
- long kmax= Ksize-k2;
- BYTE r,g,b,rr,gg,bb;
- RGBQUAD c;
-
- CxImage tmp(*this,pSelection!=0,true,true);
- if (!tmp.IsValid()) return false;
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; y r) r=c.rgbRed;
- if (c.rgbGreen > g) g=c.rgbGreen;
- if (c.rgbBlue > b) b=c.rgbBlue;
-
- if (c.rgbRed < rr) rr=c.rgbRed;
- if (c.rgbGreen < gg) gg=c.rgbGreen;
- if (c.rgbBlue < bb) bb=c.rgbBlue;
- }
- }
- c.rgbRed = 255-abs(r-rr);
- c.rgbGreen = 255-abs(g-gg);
- c.rgbBlue = 255-abs(b-bb);
- tmp.SetPixelColor(x,y,c);
- }
- }
- }
- Transfer(tmp);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Blends two images
- * \param imgsrc2: image to be mixed with this
- * \param op: blending method; see ImageOpType
- * \param lXOffset, lYOffset: image displacement
- * \param bMixAlpha: if true and imgsrc2 has a valid alpha layer, it will be mixed in the destination image.
- * \return true if everything is ok
- *
- * thanks to Mwolski
- */
-//
-void CxImage::Mix(CxImage & imgsrc2, ImageOpType op, long lXOffset, long lYOffset, bool bMixAlpha)
-{
- long lWide = min(GetWidth(),imgsrc2.GetWidth()-lXOffset);
- long lHeight = min(GetHeight(),imgsrc2.GetHeight()-lYOffset);
-
- bool bEditAlpha = imgsrc2.AlphaIsValid() & bMixAlpha;
-
- if (bEditAlpha && AlphaIsValid()==false){
- AlphaCreate();
- }
-
- RGBQUAD rgbBackgrnd = GetTransColor();
- RGBQUAD rgb1, rgb2, rgbDest;
-
- for(long lY=0;lY>8);
- } else {
- a=255;
- }
-
- if (a==0){ //transparent
- rgbDest = rgb1;
- } else if (a==255){ //opaque
- rgbDest = rgb2;
- } else { //blend
- a1 = (BYTE)~a;
- rgbDest.rgbBlue = (BYTE)((rgb1.rgbBlue*a1+rgb2.rgbBlue*a)>>8);
- rgbDest.rgbGreen = (BYTE)((rgb1.rgbGreen*a1+rgb2.rgbGreen*a)>>8);
- rgbDest.rgbRed = (BYTE)((rgb1.rgbRed*a1+rgb2.rgbRed*a)>>8);
- }
-
- if (bEditAlpha) rgbDest.rgbReserved = (BYTE)(((1+rgb1.rgbReserved)*a)>>8);
- }
- break;
- case OpSrcBlend:
- if(memcmp(&rgb1,&rgbBackgrnd,sizeof(RGBQUAD))==0)
- rgbDest = rgb2;
- else
- {
- long lBDiff = abs(rgb1.rgbBlue - rgbBackgrnd.rgbBlue);
- long lGDiff = abs(rgb1.rgbGreen - rgbBackgrnd.rgbGreen);
- long lRDiff = abs(rgb1.rgbRed - rgbBackgrnd.rgbRed);
-
- double lAverage = (lBDiff+lGDiff+lRDiff)/3;
- double lThresh = 16;
- double dLarge = lAverage/lThresh;
- double dSmall = (lThresh-lAverage)/lThresh;
- double dSmallAmt = dSmall*((double)rgb2.rgbBlue);
-
- if( lAverage < lThresh+1){
- rgbDest.rgbBlue = (BYTE)max(0,min(255,(int)(dLarge*((double)rgb1.rgbBlue) +
- dSmallAmt)));
- rgbDest.rgbGreen = (BYTE)max(0,min(255,(int)(dLarge*((double)rgb1.rgbGreen) +
- dSmallAmt)));
- rgbDest.rgbRed = (BYTE)max(0,min(255,(int)(dLarge*((double)rgb1.rgbRed) +
- dSmallAmt)));
- }
- else
- rgbDest = rgb1;
- }
- break;
- default:
- return;
- }
- SetPixelColor(lX,lY,rgbDest,bEditAlpha);
- }
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-// thanks to Kenneth Ballard
-void CxImage::MixFrom(CxImage & imagesrc2, long lXOffset, long lYOffset)
-{
- RGBQUAD rgbBackgrnd = imagesrc2.GetTransColor();
- RGBQUAD rgb1;
-
- long width = imagesrc2.GetWidth();
- long height = imagesrc2.GetHeight();
-
- int x, y;
-
- for(x = 0; x < width; x++)
- {
- for(y = 0; y < height; y++)
- {
- rgb1 = imagesrc2.GetPixelColor(x, y);
- if(memcmp(&rgb1, &rgbBackgrnd, sizeof(RGBQUAD)) != 0)
- SetPixelColor(x + lXOffset, y + lYOffset, rgb1);
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Adjusts separately the red, green, and blue values in the image.
- * \param r, g, b: can be from -255 to +255.
- * \return true if everything is ok
- */
-bool CxImage::ShiftRGB(long r, long g, long b)
-{
- if (!pDib) return false;
- RGBQUAD color;
- if (head.biClrUsed==0){
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; y
- for (int i=0;i<256;i++) {
- cTable[i] = (BYTE)max(0,min(255,(int)( pow((double)i, dinvgamma) / dMax)));
- }
-
- return Lut(cTable);
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_WINCE == 0
-/**
- * Adjusts the intensity of each pixel to the median intensity of its surrounding pixels.
- * \param Ksize: size of the kernel.
- * \return true if everything is ok
- */
-bool CxImage::Median(long Ksize)
-{
- if (!pDib) return false;
-
- long k2 = Ksize/2;
- long kmax= Ksize-k2;
- long i,j,k;
-
- RGBQUAD* kernel = (RGBQUAD*)malloc(Ksize*Ksize*sizeof(RGBQUAD));
-
- CxImage tmp(*this,pSelection!=0,true,true);
- if (!tmp.IsValid()) return false;
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; y
- for(long x=xmin; xGetWidth();
- h=srcReal->GetHeight();
- } else {
- w=srcImag->GetWidth();
- h=srcImag->GetHeight();
- }
-
- bool bXpow2 = IsPowerof2(w);
- bool bYpow2 = IsPowerof2(h);
- //if bForceFFT, width AND height must be powers of 2
- if (bForceFFT && !(bXpow2 && bYpow2)) {
- long i;
-
- i=0;
- while((1< copy the image
- if (srcReal && dstReal) tmpReal->Copy(*srcReal,true,false,false);
- if (srcImag && dstImag) tmpImag->Copy(*srcImag,true,false,false);
-
- // dst&&src are empty -> create new one, else turn to GrayScale
- if (srcReal==0 && dstReal==0){
- tmpReal = new CxImage(w,h,8);
- tmpReal->Clear(0);
- tmpReal->SetGrayPalette();
- } else {
- if (!tmpReal->IsGrayScale()) tmpReal->GrayScale();
- }
- if (srcImag==0 && dstImag==0){
- tmpImag = new CxImage(w,h,8);
- tmpImag->Clear(0);
- tmpImag->SetGrayPalette();
- } else {
- if (!tmpImag->IsGrayScale()) tmpImag->GrayScale();
- }
-
- if (!(tmpReal->IsValid() && tmpImag->IsValid())){
- if (srcReal==0 && dstReal==0) delete tmpReal;
- if (srcImag==0 && dstImag==0) delete tmpImag;
- return false;
- }
-
- //resample for FFT, if necessary
- tmpReal->Resample(w,h,0);
- tmpImag->Resample(w,h,0);
-
- //ok, here we have 2 (w x h), grayscale images ready for a FFT
-
- double* real;
- double* imag;
- long j,k,m;
-
- _complex **grid;
- //double mean = tmpReal->Mean();
- /* Allocate memory for the grid */
- grid = (_complex **)malloc(w * sizeof(_complex));
- for (k=0;kGetPixelIndex(k,j)-128;
- grid[k][j].y = tmpImag->GetPixelIndex(k,j)-128;
- }
- }
-
- //DFT buffers
- double *real2,*imag2;
- real2 = (double*)malloc(max(w,h) * sizeof(double));
- imag2 = (double*)malloc(max(w,h) * sizeof(double));
-
- /* Transform the rows */
- real = (double *)malloc(w * sizeof(double));
- imag = (double *)malloc(w * sizeof(double));
-
- m=0;
- while((1<SetPixelIndex(k,j,(BYTE)max(0,min(255,(nn*(3+log(_cabs(grid[k][j])))))));
- if (grid[k][j].x==0){
- tmpImag->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128+(atan(grid[k][j].y/0.0000000001)*nn)))));
- } else {
- tmpImag->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128+(atan(grid[k][j].y/grid[k][j].x)*nn)))));
- }
- } else {
- tmpReal->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128 + grid[k][j].x*nn))));
- tmpImag->SetPixelIndex(k,j,(BYTE)max(0,min(255,(128 + grid[k][j].y*nn))));
- }
- }
- }
-
- for (k=0;k> 1;
- j = 0;
- for (i=0;i>= 1;
- }
- j += k;
- }
-
- /* Compute the FFT */
- c1 = -1.0;
- c2 = 0.0;
- l2 = 1;
- for (l=0;lGetWidth();
- long h = r->GetHeight();
-
- Create(w,h,24);
-
- g->Resample(w,h);
- b->Resample(w,h);
-
- if (a) {
- a->Resample(w,h);
-#if CXIMAGE_SUPPORT_ALPHA
- AlphaCreate();
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
-
- RGBQUAD c;
- for (long y=0;y
- for (long x=0;xGetPixelIndex(x,y);
- c.rgbGreen=g->GetPixelIndex(x,y);
- c.rgbBlue=b->GetPixelIndex(x,y);
- switch (colorspace){
- case 1:
- SetPixelColor(x,y,HSLtoRGB(c));
- break;
- case 2:
- SetPixelColor(x,y,YUVtoRGB(c));
- break;
- case 3:
- SetPixelColor(x,y,YIQtoRGB(c));
- break;
- case 4:
- SetPixelColor(x,y,XYZtoRGB(c));
- break;
- default:
- SetPixelColor(x,y,c);
- }
-#if CXIMAGE_SUPPORT_ALPHA
- if (a) AlphaSet(x,y,a->GetPixelIndex(x,y));
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
- }
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Smart blurring to remove small defects, dithering or artifacts.
- * \param radius: normally between 0.01 and 0.5
- * \param niterations: should be trimmed with radius, to avoid blurring should be (radius*niterations)<1
- * \param colorspace: 0 = RGB, 1 = HSL, 2 = YUV, 3 = YIQ, 4 = XYZ
- * \return true if everything is ok
- */
-bool CxImage::Repair(float radius, long niterations, long colorspace)
-{
- if (!IsValid()) return false;
-
- long w = GetWidth();
- long h = GetHeight();
-
- CxImage r,g,b;
-
- r.Create(w,h,8);
- g.Create(w,h,8);
- b.Create(w,h,8);
-
- switch (colorspace){
- case 1:
- SplitHSL(&r,&g,&b);
- break;
- case 2:
- SplitYUV(&r,&g,&b);
- break;
- case 3:
- SplitYIQ(&r,&g,&b);
- break;
- case 4:
- SplitXYZ(&r,&g,&b);
- break;
- default:
- SplitRGB(&r,&g,&b);
- }
-
- for (int i=0; iGetWidth()-1;
- long h = ch->GetHeight()-1;
-
- double correction,ix,iy,ixx,ixy,iyy,den,num;
- int x,y,xy0,xp1,xm1,yp1,ym1;
- for(x=1; xGetPixelIndex(x,y);
- xm1 = ch->GetPixelIndex(x-1,y);
- xp1 = ch->GetPixelIndex(x+1,y);
- ym1 = ch->GetPixelIndex(x,y-1);
- yp1 = ch->GetPixelIndex(x,y+1);
-
- ix= (xp1-xm1)/2.0;
- iy= (yp1-ym1)/2.0;
- ixx= xp1 - 2.0 * xy0 + xm1;
- iyy= yp1 - 2.0 * xy0 + ym1;
- ixy=(ch->GetPixelIndex(x+1,y+1)+ch->GetPixelIndex(x-1,y-1)-
- ch->GetPixelIndex(x-1,y+1)-ch->GetPixelIndex(x+1,y-1))/4.0;
-
- num= (1.0+iy*iy)*ixx - ix*iy*ixy + (1.0+ix*ix)*iyy;
- den= 1.0+ix*ix+iy*iy;
- correction = num/den;
-
- tmp.SetPixelIndex(x,y,(BYTE)min(255,max(0,(xy0 + radius * correction))));
- }
- }
-
- for (x=0;x<=w;x++){
- tmp.SetPixelIndex(x,0,ch->GetPixelIndex(x,0));
- tmp.SetPixelIndex(x,h,ch->GetPixelIndex(x,h));
- }
- for (y=0;y<=h;y++){
- tmp.SetPixelIndex(0,y,ch->GetPixelIndex(0,y));
- tmp.SetPixelIndex(w,y,ch->GetPixelIndex(w,y));
- }
- ch->Transfer(tmp);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Enhance the variations between adjacent pixels.
- * Similar results can be achieved using Filter(),
- * but the algorithms are different both in Edge() and in Contour().
- * \return true if everything is ok
- */
-bool CxImage::Contour()
-{
- if (!pDib) return false;
-
- long Ksize = 3;
- long k2 = Ksize/2;
- long kmax= Ksize-k2;
- long i,j,k;
- BYTE maxr,maxg,maxb;
- RGBQUAD pix1,pix2;
-
- CxImage tmp(*this,pSelection!=0,true,true);
- if (!tmp.IsValid()) return false;
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; ymaxb) maxb = pix2.rgbBlue;
- if ((pix2.rgbGreen-pix1.rgbGreen)>maxg) maxg = pix2.rgbGreen;
- if ((pix2.rgbRed-pix1.rgbRed)>maxr) maxr = pix2.rgbRed;
- }
- }
- pix1.rgbBlue=(BYTE)(255-maxb);
- pix1.rgbGreen=(BYTE)(255-maxg);
- pix1.rgbRed=(BYTE)(255-maxr);
- tmp.SetPixelColor(x,y,pix1);
- }
- }
- }
- Transfer(tmp);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Adds a random offset to each pixel in the image
- * \param radius: maximum pixel displacement
- * \return true if everything is ok
- */
-bool CxImage::Jitter(long radius)
-{
- if (!pDib) return false;
-
- long nx,ny;
-
- CxImage tmp(*this,pSelection!=0,true,true);
- if (!tmp.IsValid()) return false;
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; y y)
- {
- for (row = 0; row < y ; row++)
- {
- scale=0;
- /* find the scale factor */
- for (j = 0; j < y ; j++)
- {
- /* if the index is in bounds, add it to the scale counter */
- if ((j + cmatrix_length/2 - row >= 0) &&
- (j + cmatrix_length/2 - row < cmatrix_length))
- scale += cmatrix[j + cmatrix_length/2 - row];
- }
- for (i = 0; i= row - cmatrix_length/2) &&
- (j <= row + cmatrix_length/2))
- sum += cur_col[j*bytes + i] * cmatrix[j];
- }
- dest_col[row*bytes + i] = (BYTE)(0.5f + sum / scale);
- }
- }
- }
- else
- {
- /* for the edge condition, we only use available info and scale to one */
- for (row = 0; row < cmatrix_middle; row++)
- {
- /* find scale factor */
- scale=0;
- for (j = cmatrix_middle - row; j0; j--)
- {
- sum += *(ctable_p + *cur_col_p1);
- cur_col_p1 += bytes;
- ctable_p += 256;
- }
- cur_col_p++;
- *(dest_col_p++) = (BYTE)(0.5f + sum);
- }
- }
-
- /* for the edge condition , we only use available info, and scale to one */
- for (; row < y; row++)
- {
- /* find scale factor */
- scale=0;
- for (j = 0; j< y-row + cmatrix_middle; j++)
- scale += cmatrix[j];
- for (i = 0; i 255) dest_row[u*3+v] = 255;
- else dest_row[u*3+v] = value;
- }
- }
- }
-
- Transfer(tmp);
-
- return TRUE;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Apply a look up table to the image.
- * \param pLut: BYTE[256] look up table
- * \return true if everything is ok
- */
-bool CxImage::Lut(BYTE* pLut)
-{
- if (!pDib || !pLut) return false;
- RGBQUAD color;
-
- double dbScaler;
- if (head.biClrUsed==0){
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- // faster loop for full image
- BYTE *iSrc=info.pImage;
- for(unsigned long i=0; i < head.biSizeImage ; i++){
- *iSrc++ = pLut[*iSrc];
- }
- return true;
- }
-
- dbScaler = 100.0/ymax;
-
- for(long y=ymin; y
- for(long x=xmin; x
- if (!pDib) return false;
- FloodFill2(x,y,GetPixelColor(x,y),FillColor);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::FloodFill2(int x, int y, RGBQUAD old_color, RGBQUAD new_color)
-{
- // Fill in the actual pixels.
- // Function steps recursively until it finds borders (color that is not old_color)
- if (!IsInside(x,y)) return;
-
- RGBQUAD r = GetPixelColor(x,y);
- COLORREF cr = RGB(r.rgbRed,r.rgbGreen,r.rgbBlue);
-
- if(cr == RGB(old_color.rgbRed,old_color.rgbGreen,old_color.rgbBlue)
- && cr != RGB(new_color.rgbRed,new_color.rgbGreen,new_color.rgbBlue) ) {
-
- // the above if statement, after && is there to prevent
- // stack overflows. The program will continue to find
- // colors if you flood-fill an entire region (entire picture)
-
- SetPixelColor(x,y,new_color);
-
- FloodFill2((x+1),y,old_color,new_color);
- FloodFill2((x-1),y,old_color,new_color);
- FloodFill2(x,(y+1),old_color,new_color);
- FloodFill2(x,(y-1),old_color,new_color);
- }
-}*/
-///////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_DSP
diff --git a/src/win32/dependencies/cximage/ximaenc.cpp b/src/win32/dependencies/cximage/ximaenc.cpp
deleted file mode 100644
index da95578b..00000000
--- a/src/win32/dependencies/cximage/ximaenc.cpp
+++ /dev/null
@@ -1,920 +0,0 @@
-// xImaCodec.cpp : Encode Decode functions
-/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_JPG
-#include "ximajpg.h"
-#endif
-
-#if CXIMAGE_SUPPORT_GIF
-#include "ximagif.h"
-#endif
-
-#if CXIMAGE_SUPPORT_PNG
-#include "ximapng.h"
-#endif
-
-#if CXIMAGE_SUPPORT_MNG
-#include "ximamng.h"
-#endif
-
-#if CXIMAGE_SUPPORT_BMP
-#include "ximabmp.h"
-#endif
-
-#if CXIMAGE_SUPPORT_ICO
-#include "ximaico.h"
-#endif
-
-#if CXIMAGE_SUPPORT_TIF
-#include "ximatif.h"
-#endif
-
-#if CXIMAGE_SUPPORT_TGA
-#include "ximatga.h"
-#endif
-
-#if CXIMAGE_SUPPORT_PCX
-#include "ximapcx.h"
-#endif
-
-#if CXIMAGE_SUPPORT_WBMP
-#include "ximawbmp.h"
-#endif
-
-#if CXIMAGE_SUPPORT_WMF
-#include "ximawmf.h" // - WMF/EMF support
-#endif
-
-#if CXIMAGE_SUPPORT_J2K
-#include "ximaj2k.h"
-#endif
-
-#if CXIMAGE_SUPPORT_JBG
-#include "ximajbg.h"
-#endif
-
-#if CXIMAGE_SUPPORT_JASPER
-#include "ximajas.h"
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImage::EncodeSafeCheck(CxFile *hFile)
-{
- if (hFile==NULL) {
- strcpy(info.szLastError,CXIMAGE_ERR_NOFILE);
- return true;
- }
-
- if (pDib==NULL){
- strcpy(info.szLastError,CXIMAGE_ERR_NOIMAGE);
- return true;
- }
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-//#ifdef WIN32
-//bool CxImage::Save(LPCWSTR filename, DWORD imagetype)
-//{
-// FILE* hFile; //file handle to write the image
-// if ((hFile=_wfopen(filename,L"wb"))==NULL) return false;
-// bool bOK = Encode(hFile,imagetype);
-// fclose(hFile);
-// return bOK;
-//}
-//#endif //WIN32
-////////////////////////////////////////////////////////////////////////////////
-// For UNICODE support: char -> TCHAR
-/**
- * Saves to disk the image in a specific format.
- * \param filename: file name
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- */
-bool CxImage::Save(const TCHAR * filename, DWORD imagetype)
-{
- FILE* hFile; //file handle to write the image
-
-#ifdef WIN32
- if ((hFile=_tfopen(filename,_T("wb")))==NULL) return false; // For UNICODE support
-#else
- if ((hFile=fopen(filename,"wb"))==NULL) return false;
-#endif
-
- bool bOK = Encode(hFile,imagetype);
- fclose(hFile);
- return bOK;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Saves to disk the image in a specific format.
- * \param hFile: file handle, open and enabled for writing.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- */
-bool CxImage::Encode(FILE *hFile, DWORD imagetype)
-{
- CxIOFile file(hFile);
- return Encode(&file,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Saves to memory buffer the image in a specific format.
- * \param buffer: output memory buffer pointer. Must be NULL,
- * the function allocates and fill the memory,
- * the application must free the buffer, see also FreeMemory().
- * \param size: output memory buffer size.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- */
-bool CxImage::Encode(BYTE * &buffer, long &size, DWORD imagetype)
-{
- if (buffer!=NULL){
- strcpy(info.szLastError,"the buffer must be empty");
- return false;
- }
- CxMemFile file;
- file.Open();
- if(Encode(&file,imagetype)){
- buffer=file.GetBuffer();
- size=file.Size();
- return true;
- }
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Saves to disk the image in a specific format.
- * \param hFile: file handle (implemented using CxMemFile or CxIOFile),
- * open and enabled for writing.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- * \sa ENUM_CXIMAGE_FORMATS
- */
-bool CxImage::Encode(CxFile *hFile, DWORD imagetype)
-{
-
-#if CXIMAGE_SUPPORT_BMP
-
- if (imagetype==CXIMAGE_FORMAT_BMP){
- CxImageBMP newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_ICO
- if (imagetype==CXIMAGE_FORMAT_ICO){
- CxImageICO newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_TIF
- if (imagetype==CXIMAGE_FORMAT_TIF){
- CxImageTIF newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_JPG
- if (imagetype==CXIMAGE_FORMAT_JPG){
- CxImageJPG newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_GIF
- if (imagetype==CXIMAGE_FORMAT_GIF){
- CxImageGIF newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_PNG
- if (imagetype==CXIMAGE_FORMAT_PNG){
- CxImagePNG newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_MNG
- if (imagetype==CXIMAGE_FORMAT_MNG){
- CxImageMNG newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_TGA
- if (imagetype==CXIMAGE_FORMAT_TGA){
- CxImageTGA newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_PCX
- if (imagetype==CXIMAGE_FORMAT_PCX){
- CxImagePCX newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_WBMP
- if (imagetype==CXIMAGE_FORMAT_WBMP){
- CxImageWBMP newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS // - WMF/EMF support
- if (imagetype==CXIMAGE_FORMAT_WMF){
- CxImageWMF newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_J2K
- if (imagetype==CXIMAGE_FORMAT_J2K){
- CxImageJ2K newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_JBG
- if (imagetype==CXIMAGE_FORMAT_JBG){
- CxImageJBG newima;
- newima.Ghost(this);
- if (newima.Encode(hFile)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_JASPER
- if (
- #if CXIMAGE_SUPPORT_JP2
- imagetype==CXIMAGE_FORMAT_JP2 ||
- #endif
- #if CXIMAGE_SUPPORT_JPC
- imagetype==CXIMAGE_FORMAT_JPC ||
- #endif
- #if CXIMAGE_SUPPORT_PGX
- imagetype==CXIMAGE_FORMAT_PGX ||
- #endif
- #if CXIMAGE_SUPPORT_PNM
- imagetype==CXIMAGE_FORMAT_PNM ||
- #endif
- #if CXIMAGE_SUPPORT_RAS
- imagetype==CXIMAGE_FORMAT_RAS ||
- #endif
- false ){
- CxImageJAS newima;
- newima.Ghost(this);
- if (newima.Encode(hFile,imagetype)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-
- strcpy(info.szLastError,"Encode: Unknown format");
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Saves to disk or memory pagecount images, referenced by an array of CxImage pointers.
- * \param hFile: file handle.
- * \param pImages: array of CxImage pointers.
- * \param pagecount: number of images.
- * \param imagetype: can be CXIMAGE_FORMAT_TIF or CXIMAGE_FORMAT_GIF.
- * \return true if everything is ok
- */
-bool CxImage::Encode(FILE * hFile, CxImage ** pImages, int pagecount, DWORD imagetype)
-{
- CxIOFile file(hFile);
- return Encode(&file, pImages, pagecount,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Saves to disk or memory pagecount images, referenced by an array of CxImage pointers.
- * \param hFile: file handle (implemented using CxMemFile or CxIOFile).
- * \param pImages: array of CxImage pointers.
- * \param pagecount: number of images.
- * \param imagetype: can be CXIMAGE_FORMAT_TIF or CXIMAGE_FORMAT_GIF.
- * \return true if everything is ok
- */
-bool CxImage::Encode(CxFile * hFile, CxImage ** pImages, int pagecount, DWORD imagetype)
-{
-#if CXIMAGE_SUPPORT_TIF
- if (imagetype==CXIMAGE_FORMAT_TIF){
- CxImageTIF newima;
- newima.Ghost(this);
- if (newima.Encode(hFile,pImages,pagecount)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_GIF
- if (imagetype==CXIMAGE_FORMAT_GIF){
- CxImageGIF newima;
- newima.Ghost(this);
- if (newima.Encode(hFile,pImages,pagecount)){
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
- strcpy(info.szLastError,"Multipage Encode, Unsupported operation for this format");
- return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * exports the image into a RGBA buffer, Useful for OpenGL applications.
- * \param buffer: output memory buffer pointer. Must be NULL,
- * the function allocates and fill the memory,
- * the application must free the buffer, see also FreeMemory().
- * \param size: output memory buffer size.
- * \return true if everything is ok
- */
-bool CxImage::Encode2RGBA(BYTE * &buffer, long &size)
-{
- if (buffer!=NULL){
- strcpy(info.szLastError,"the buffer must be empty");
- return false;
- }
- CxMemFile file;
- file.Open();
- if(Encode2RGBA(&file)){
- buffer=file.GetBuffer();
- size=file.Size();
- return true;
- }
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * exports the image into a RGBA buffer, Useful for OpenGL applications.
- * \param hFile: file handle (implemented using CxMemFile or CxIOFile).
- * \return true if everything is ok
- */
-bool CxImage::Encode2RGBA(CxFile *hFile)
-{
- if (EncodeSafeCheck(hFile)) return false;
-
- for (DWORD y = 0; yPutC(color.rgbRed);
- hFile->PutC(color.rgbGreen);
- hFile->PutC(color.rgbBlue);
- hFile->PutC(color.rgbReserved);
- }
- }
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_DECODE
-////////////////////////////////////////////////////////////////////////////////
-// For UNICODE support: char -> TCHAR
-/**
- * Reads from disk the image in a specific format.
- * - If decoding fails using the specified image format,
- * the function will try the automatic file format recognition.
- *
- * \param filename: file name
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- */
-bool CxImage::Load(const TCHAR * filename, DWORD imagetype)
-//bool CxImage::Load(const char * filename, DWORD imagetype)
-{
- /*FILE* hFile; //file handle to read the image
- if ((hFile=fopen(filename,"rb"))==NULL) return false;
- bool bOK = Decode(hFile,imagetype);
- fclose(hFile);*/
-
- /* automatic file type recognition */
- bool bOK = false;
- if ( imagetype > 0 && imagetype < CMAX_IMAGE_FORMATS ){
- FILE* hFile; //file handle to read the image
-
-#ifdef WIN32
- if ((hFile=_tfopen(filename,_T("rb")))==NULL) return false; // For UNICODE support
-#else
- if ((hFile=fopen(filename,"rb"))==NULL) return false;
-#endif
-
- bOK = Decode(hFile,imagetype);
- fclose(hFile);
- if (bOK) return bOK;
- }
-
- char szError[256];
- strcpy(szError,info.szLastError); //save the first error
-
- // if failed, try automatic recognition of the file...
- FILE* hFile;
-
-#ifdef WIN32
- if ((hFile=_tfopen(filename,_T("rb")))==NULL) return false; // For UNICODE support
-#else
- if ((hFile=fopen(filename,"rb"))==NULL) return false;
-#endif
-
- bOK = Decode(hFile,CXIMAGE_FORMAT_UNKNOWN);
- fclose(hFile);
-
- if (!bOK && imagetype > 0) strcpy(info.szLastError,szError); //restore the first error
-
- return bOK;
-}
-////////////////////////////////////////////////////////////////////////////////
-#ifdef WIN32
-//bool CxImage::Load(LPCWSTR filename, DWORD imagetype)
-//{
-// /*FILE* hFile; //file handle to read the image
-// if ((hFile=_wfopen(filename, L"rb"))==NULL) return false;
-// bool bOK = Decode(hFile,imagetype);
-// fclose(hFile);*/
-//
-// /* automatic file type recognition */
-// bool bOK = false;
-// if ( imagetype > 0 && imagetype < CMAX_IMAGE_FORMATS ){
-// FILE* hFile; //file handle to read the image
-// if ((hFile=_wfopen(filename,L"rb"))==NULL) return false;
-// bOK = Decode(hFile,imagetype);
-// fclose(hFile);
-// if (bOK) return bOK;
-// }
-//
-// char szError[256];
-// strcpy(szError,info.szLastError); //save the first error
-//
-// // if failed, try automatic recognition of the file...
-// FILE* hFile; //file handle to read the image
-// if ((hFile=_wfopen(filename,L"rb"))==NULL) return false;
-// bOK = Decode(hFile,CXIMAGE_FORMAT_UNKNOWN);
-// fclose(hFile);
-//
-// if (!bOK && imagetype > 0) strcpy(info.szLastError,szError); //restore the first error
-//
-// return bOK;
-//}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Loads an image from the application resources.
- * \param hRes: the resource handle returned by FindResource().
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS.
- * \param hModule: NULL for internal resource, or external application/DLL hinstance returned by LoadLibray.
- * \return true if everything is ok
- */
-bool CxImage::LoadResource(HRSRC hRes, DWORD imagetype, HMODULE hModule)
-{
- DWORD rsize=SizeofResource(hModule,hRes);
- HGLOBAL hMem=::LoadResource(hModule,hRes);
- if (hMem){
- char* lpVoid=(char*)LockResource(hMem);
- if (lpVoid){
- // FILE* fTmp=tmpfile(); doesn't work with network
- /*char tmpPath[MAX_PATH] = {0};
- char tmpFile[MAX_PATH] = {0};
- GetTempPath(MAX_PATH,tmpPath);
- GetTempFileName(tmpPath,"IMG",0,tmpFile);
- FILE* fTmp=fopen(tmpFile,"w+b");
- if (fTmp){
- fwrite(lpVoid,rsize,1,fTmp);
- fseek(fTmp,0,SEEK_SET);
- bool bOK = Decode(fTmp,imagetype);
- fclose(fTmp);
- DeleteFile(tmpFile);
- return bOK;
- }*/
-
- CxMemFile fTmp((BYTE*)lpVoid,rsize);
- return Decode(&fTmp,imagetype);
- }
- } else strcpy(info.szLastError,"Unable to load resource!");
- return false;
-}
-#endif //WIN32
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Constructor from file name, see Load()
- * \param filename: file name
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- */
-//
-// > filename: file name
-// > imagetype: specify the image format (CXIMAGE_FORMAT_BMP,...)
-// For UNICODE support: char -> TCHAR
-CxImage::CxImage(const TCHAR * filename, DWORD imagetype)
-//CxImage::CxImage(const char * filename, DWORD imagetype)
-{
- Startup(imagetype);
- Load(filename,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Constructor from file handle, see Decode()
- * \param stream: file handle, with read access.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- */
-CxImage::CxImage(FILE * stream, DWORD imagetype)
-{
- Startup(imagetype);
- Decode(stream,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Constructor from CxFile object, see Decode()
- * \param stream: file handle (implemented using CxMemFile or CxIOFile), with read access.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- */
-CxImage::CxImage(CxFile * stream, DWORD imagetype)
-{
- Startup(imagetype);
- Decode(stream,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Constructor from memory buffer, see Decode()
- * \param buffer: memory buffer
- * \param size: size of buffer
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- */
-CxImage::CxImage(BYTE * buffer, DWORD size, DWORD imagetype)
-{
- Startup(imagetype);
- CxMemFile stream(buffer,size);
- Decode(&stream,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Loads an image from memory buffer
- * \param buffer: memory buffer
- * \param size: size of buffer
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- */
-bool CxImage::Decode(BYTE * buffer, DWORD size, DWORD imagetype)
-{
- CxMemFile file(buffer,size);
- return Decode(&file,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Loads an image from file handle.
- * \param hFile: file handle, with read access.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- */
-bool CxImage::Decode(FILE *hFile, DWORD imagetype)
-{
- CxIOFile file(hFile);
- return Decode(&file,imagetype);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Loads an image from CxFile object
- * \param hFile: file handle (implemented using CxMemFile or CxIOFile), with read access.
- * \param imagetype: file format, see ENUM_CXIMAGE_FORMATS
- * \return true if everything is ok
- * \sa ENUM_CXIMAGE_FORMATS
- */
-bool CxImage::Decode(CxFile *hFile, DWORD imagetype)
-{
-
- if (imagetype==CXIMAGE_FORMAT_UNKNOWN){
- DWORD pos = hFile->Tell();
-#if CXIMAGE_SUPPORT_BMP
- { CxImageBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_JPG
- { CxImageJPG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_ICO
- { CxImageICO newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_GIF
- { CxImageGIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_PNG
- { CxImagePNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_TIF
- { CxImageTIF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_MNG
- { CxImageMNG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_TGA
- { CxImageTGA newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_PCX
- { CxImagePCX newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_WBMP
- { CxImageWBMP newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS
- { CxImageWMF newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_J2K
- { CxImageJ2K newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_JBG
- { CxImageJBG newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
-#if CXIMAGE_SUPPORT_JASPER
- { CxImageJAS newima; newima.CopyInfo(*this); if (newima.Decode(hFile)) { Transfer(newima); return true; } else hFile->Seek(pos,SEEK_SET); }
-#endif
- }
-
-#if CXIMAGE_SUPPORT_BMP
- if (imagetype==CXIMAGE_FORMAT_BMP){
- CxImageBMP newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_JPG
- if (imagetype==CXIMAGE_FORMAT_JPG){
- CxImageJPG newima;
- newima.CopyInfo(*this); //
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_ICO
- if (imagetype==CXIMAGE_FORMAT_ICO){
- CxImageICO newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- info.nNumFrames = newima.info.nNumFrames;
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_GIF
- if (imagetype==CXIMAGE_FORMAT_GIF){
- CxImageGIF newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- info.nNumFrames = newima.info.nNumFrames;
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_PNG
- if (imagetype==CXIMAGE_FORMAT_PNG){
- CxImagePNG newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_TIF
- if (imagetype==CXIMAGE_FORMAT_TIF){
- CxImageTIF newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- info.nNumFrames = newima.info.nNumFrames;
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_MNG
- if (imagetype==CXIMAGE_FORMAT_MNG){
- CxImageMNG newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- info.nNumFrames = newima.info.nNumFrames;
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_TGA
- if (imagetype==CXIMAGE_FORMAT_TGA){
- CxImageTGA newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_PCX
- if (imagetype==CXIMAGE_FORMAT_PCX){
- CxImagePCX newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_WBMP
- if (imagetype==CXIMAGE_FORMAT_WBMP){
- CxImageWBMP newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS // vho - WMF support
- if (imagetype == CXIMAGE_FORMAT_WMF){
- CxImageWMF newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_J2K
- if (imagetype==CXIMAGE_FORMAT_J2K){
- CxImageJ2K newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_JBG
- if (imagetype==CXIMAGE_FORMAT_JBG){
- CxImageJBG newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-#if CXIMAGE_SUPPORT_JASPER
- if (
- #if CXIMAGE_SUPPORT_JP2
- imagetype==CXIMAGE_FORMAT_JP2 ||
- #endif
- #if CXIMAGE_SUPPORT_JPC
- imagetype==CXIMAGE_FORMAT_JPC ||
- #endif
- #if CXIMAGE_SUPPORT_PGX
- imagetype==CXIMAGE_FORMAT_PGX ||
- #endif
- #if CXIMAGE_SUPPORT_PNM
- imagetype==CXIMAGE_FORMAT_PNM ||
- #endif
- #if CXIMAGE_SUPPORT_RAS
- imagetype==CXIMAGE_FORMAT_RAS ||
- #endif
- false ){
- CxImageJAS newima;
- newima.CopyInfo(*this);
- if (newima.Decode(hFile,imagetype)){
- Transfer(newima);
- return true;
- } else {
- strcpy(info.szLastError,newima.GetLastError());
- return false;
- }
- }
-#endif
-
- strcpy(info.szLastError,"Decode: Unknown or wrong format");
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_DECODE
-////////////////////////////////////////////////////////////////////////////////
diff --git a/src/win32/dependencies/cximage/ximaexif.cpp b/src/win32/dependencies/cximage/ximaexif.cpp
deleted file mode 100644
index 17f962a1..00000000
--- a/src/win32/dependencies/cximage/ximaexif.cpp
+++ /dev/null
@@ -1,873 +0,0 @@
-/*
- * File: ximaexif.cpp
- * Purpose: EXIF reader
- * 18/Aug/2002 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- * based on jhead-1.8 by Matthias Wandel
- */
-
-#include "ximajpg.h"
-
-#if CXIMAGEJPG_SUPPORT_EXIF
-
-////////////////////////////////////////////////////////////////////////////////
-CxImageJPG::CxExifInfo::CxExifInfo(EXIFINFO* info)
-{
- if (info) {
- m_exifinfo = info;
- freeinfo = false;
- } else {
- m_exifinfo = new EXIFINFO;
- memset(m_exifinfo,0,sizeof(EXIFINFO));
- freeinfo = true;
- }
-
- m_szLastError[0]='\0';
- ExifImageWidth = MotorolaOrder = 0;
- SectionsRead=0;
- memset(&Sections, 0, MAX_SECTIONS * sizeof(Section_t));
-}
-////////////////////////////////////////////////////////////////////////////////
-CxImageJPG::CxExifInfo::~CxExifInfo()
-{
- for(int i=0;iGetC();
-
- if (a != 0xff || hFile->GetC() != M_SOI){
- return FALSE;
- }
-
- for(;;){
- int itemlen;
- int marker = 0;
- int ll,lh, got;
- BYTE * Data;
-
- if (SectionsRead >= MAX_SECTIONS){
- strcpy(m_szLastError,"Too many sections in jpg file");
- return false;
- }
-
- for (a=0;a<7;a++){
- marker = hFile->GetC();
- if (marker != 0xff) break;
-
- if (a >= 6){
- printf("too many padding bytes\n");
- return false;
- }
- }
-
- if (marker == 0xff){
- // 0xff is legal padding, but if we get that many, something's wrong.
- strcpy(m_szLastError,"too many padding bytes!");
- return false;
- }
-
- Sections[SectionsRead].Type = marker;
-
- // Read the length of the section.
- lh = hFile->GetC();
- ll = hFile->GetC();
-
- itemlen = (lh << 8) | ll;
-
- if (itemlen < 2){
- strcpy(m_szLastError,"invalid marker");
- return false;
- }
-
- Sections[SectionsRead].Size = itemlen;
-
- Data = (BYTE *)malloc(itemlen);
- if (Data == NULL){
- strcpy(m_szLastError,"Could not allocate memory");
- return false;
- }
- Sections[SectionsRead].Data = Data;
-
- // Store first two pre-read bytes.
- Data[0] = (BYTE)lh;
- Data[1] = (BYTE)ll;
-
- got = hFile->Read(Data+2, 1, itemlen-2); // Read the whole section.
- if (got != itemlen-2){
- strcpy(m_szLastError,"Premature end of file?");
- return false;
- }
- SectionsRead += 1;
-
- switch(marker){
-
- case M_SOS: // stop before hitting compressed data
- // If reading entire image is requested, read the rest of the data.
- if (nReadMode & EXIF_READ_IMAGE){
- int cp, ep, size;
- // Determine how much file is left.
- cp = hFile->Tell();
- hFile->Seek(0, SEEK_END);
- ep = hFile->Tell();
- hFile->Seek(cp, SEEK_SET);
-
- size = ep-cp;
- Data = (BYTE *)malloc(size);
- if (Data == NULL){
- strcpy(m_szLastError,"could not allocate data for entire image");
- return false;
- }
-
- got = hFile->Read(Data, 1, size);
- if (got != size){
- strcpy(m_szLastError,"could not read the rest of the image");
- return false;
- }
-
- Sections[SectionsRead].Data = Data;
- Sections[SectionsRead].Size = size;
- Sections[SectionsRead].Type = PSEUDO_IMAGE_MARKER;
- SectionsRead ++;
- }
- return true;
-
- case M_EOI: // in case it's a tables-only JPEG stream
- printf("No image in jpeg!\n");
- return FALSE;
-
- case M_COM: // Comment section
- if (HaveCom || ((nReadMode & EXIF_READ_EXIF) == 0)){
- // Discard this section.
- free(Sections[--SectionsRead].Data);
- Sections[SectionsRead].Data=0;
- }else{
- process_COM(Data, itemlen);
- HaveCom = TRUE;
- }
- break;
-
- case M_JFIF:
- // Regular jpegs always have this tag, exif images have the exif
- // marker instead, althogh ACDsee will write images with both markers.
- // this program will re-create this marker on absence of exif marker.
- // hence no need to keep the copy from the file.
- free(Sections[--SectionsRead].Data);
- Sections[SectionsRead].Data=0;
- break;
-
- case M_EXIF:
- // Seen files from some 'U-lead' software with Vivitar scanner
- // that uses marker 31 for non exif stuff. Thus make sure
- // it says 'Exif' in the section before treating it as exif.
- if ((nReadMode & EXIF_READ_EXIF) && memcmp(Data+2, "Exif", 4) == 0){
- m_exifinfo->IsExif = process_EXIF((BYTE *)Data+2, itemlen);
- }else{
- // Discard this section.
- free(Sections[--SectionsRead].Data);
- Sections[SectionsRead].Data=0;
- }
- break;
-
- case M_SOF0:
- case M_SOF1:
- case M_SOF2:
- case M_SOF3:
- case M_SOF5:
- case M_SOF6:
- case M_SOF7:
- case M_SOF9:
- case M_SOF10:
- case M_SOF11:
- case M_SOF13:
- case M_SOF14:
- case M_SOF15:
- process_SOFn(Data, marker);
- break;
- default:
- // Skip any other sections.
- //if (ShowTags) printf("Jpeg section marker 0x%02x size %d\n",marker, itemlen);
- break;
- }
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/*--------------------------------------------------------------------------
- Process a EXIF marker
- Describes all the drivel that most digital cameras include...
---------------------------------------------------------------------------*/
-bool CxImageJPG::CxExifInfo::process_EXIF(unsigned char * CharBuf, unsigned int length)
-{
- m_exifinfo->FlashUsed = 0;
- /* If it's from a digicam, and it used flash, it says so. */
- m_exifinfo->Comments[0] = '\0'; /* Initial value - null string */
-
- ExifImageWidth = 0;
-
- { /* Check the EXIF header component */
- static const unsigned char ExifHeader[] = "Exif\0\0";
- if (memcmp(CharBuf+0, ExifHeader,6)){
- strcpy(m_szLastError,"Incorrect Exif header");
- return false;
- }
- }
-
- if (memcmp(CharBuf+6,"II",2) == 0){
- MotorolaOrder = 0;
- }else{
- if (memcmp(CharBuf+6,"MM",2) == 0){
- MotorolaOrder = 1;
- }else{
- strcpy(m_szLastError,"Invalid Exif alignment marker.");
- return false;
- }
- }
-
- /* Check the next two values for correctness. */
- if (Get16u(CharBuf+8) != 0x2a){
- strcpy(m_szLastError,"Invalid Exif start (1)");
- return false;
- }
-
- int FirstOffset = Get32u(CharBuf+10);
- /*
- if (FirstOffset < 8 || FirstOffset > 16){
- // I used to ensure this was set to 8 (website I used indicated its 8)
- // but PENTAX Optio 230 has it set differently, and uses it as offset. (Sept 11 2002)
- strcpy(m_szLastError,"Suspicious offset of first IFD value");
- return false;
- }*/
-
- unsigned char * LastExifRefd = CharBuf;
-
- /* First directory starts 16 bytes in. Offsets start at 8 bytes in. */
- if (!ProcessExifDir(CharBuf+14, CharBuf+6, length-6, m_exifinfo, &LastExifRefd))
- return false;
-
- /* give a chance for a second directory */
- if (FirstOffset > 8) {
- if (!ProcessExifDir(CharBuf+14+FirstOffset-8, CharBuf+6, length-6, m_exifinfo, &LastExifRefd))
- return false;
- }
-
- /* This is how far the interesting (non thumbnail) part of the exif went. */
- // int ExifSettingsLength = LastExifRefd - CharBuf;
-
- /* Compute the CCD width, in milimeters. */
- if (m_exifinfo->FocalplaneXRes != 0){
- m_exifinfo->CCDWidth = (float)(ExifImageWidth * m_exifinfo->FocalplaneUnits / m_exifinfo->FocalplaneXRes);
- }
-
- return true;
-}
-//--------------------------------------------------------------------------
-// Get 16 bits motorola order (always) for jpeg header stuff.
-//--------------------------------------------------------------------------
-int CxImageJPG::CxExifInfo::Get16m(void * Short)
-{
- return (((unsigned char *)Short)[0] << 8) | ((unsigned char *)Short)[1];
-}
-////////////////////////////////////////////////////////////////////////////////
-/*--------------------------------------------------------------------------
- Convert a 16 bit unsigned value from file's native byte order
---------------------------------------------------------------------------*/
-int CxImageJPG::CxExifInfo::Get16u(void * Short)
-{
- if (MotorolaOrder){
- return (((unsigned char *)Short)[0] << 8) | ((unsigned char *)Short)[1];
- }else{
- return (((unsigned char *)Short)[1] << 8) | ((unsigned char *)Short)[0];
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/*--------------------------------------------------------------------------
- Convert a 32 bit signed value from file's native byte order
---------------------------------------------------------------------------*/
-long CxImageJPG::CxExifInfo::Get32s(void * Long)
-{
- if (MotorolaOrder){
- return ((( char *)Long)[0] << 24) | (((unsigned char *)Long)[1] << 16)
- | (((unsigned char *)Long)[2] << 8 ) | (((unsigned char *)Long)[3] << 0 );
- }else{
- return ((( char *)Long)[3] << 24) | (((unsigned char *)Long)[2] << 16)
- | (((unsigned char *)Long)[1] << 8 ) | (((unsigned char *)Long)[0] << 0 );
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/*--------------------------------------------------------------------------
- Convert a 32 bit unsigned value from file's native byte order
---------------------------------------------------------------------------*/
-unsigned long CxImageJPG::CxExifInfo::Get32u(void * Long)
-{
- return (unsigned long)Get32s(Long) & 0xffffffff;
-}
-////////////////////////////////////////////////////////////////////////////////
-
-/* Describes format descriptor */
-static const int BytesPerFormat[] = {0,1,1,2,4,8,1,1,2,4,8,4,8};
-#define NUM_FORMATS 12
-
-#define FMT_BYTE 1
-#define FMT_STRING 2
-#define FMT_USHORT 3
-#define FMT_ULONG 4
-#define FMT_URATIONAL 5
-#define FMT_SBYTE 6
-#define FMT_UNDEFINED 7
-#define FMT_SSHORT 8
-#define FMT_SLONG 9
-#define FMT_SRATIONAL 10
-#define FMT_SINGLE 11
-#define FMT_DOUBLE 12
-
-/* Describes tag values */
-
-#define TAG_EXIF_VERSION 0x9000
-#define TAG_EXIF_OFFSET 0x8769
-#define TAG_INTEROP_OFFSET 0xa005
-
-#define TAG_MAKE 0x010F
-#define TAG_MODEL 0x0110
-
-#define TAG_ORIENTATION 0x0112
-#define TAG_XRESOLUTION 0x011A
-#define TAG_YRESOLUTION 0x011B
-#define TAG_RESOLUTIONUNIT 0x0128
-
-#define TAG_EXPOSURETIME 0x829A
-#define TAG_FNUMBER 0x829D
-
-#define TAG_SHUTTERSPEED 0x9201
-#define TAG_APERTURE 0x9202
-#define TAG_BRIGHTNESS 0x9203
-#define TAG_MAXAPERTURE 0x9205
-#define TAG_FOCALLENGTH 0x920A
-
-#define TAG_DATETIME_ORIGINAL 0x9003
-#define TAG_USERCOMMENT 0x9286
-
-#define TAG_SUBJECT_DISTANCE 0x9206
-#define TAG_FLASH 0x9209
-
-#define TAG_FOCALPLANEXRES 0xa20E
-#define TAG_FOCALPLANEYRES 0xa20F
-#define TAG_FOCALPLANEUNITS 0xa210
-#define TAG_EXIF_IMAGEWIDTH 0xA002
-#define TAG_EXIF_IMAGELENGTH 0xA003
-
-/* the following is added 05-jan-2001 vcs */
-#define TAG_EXPOSURE_BIAS 0x9204
-#define TAG_WHITEBALANCE 0x9208
-#define TAG_METERING_MODE 0x9207
-#define TAG_EXPOSURE_PROGRAM 0x8822
-#define TAG_ISO_EQUIVALENT 0x8827
-#define TAG_COMPRESSION_LEVEL 0x9102
-
-#define TAG_THUMBNAIL_OFFSET 0x0201
-#define TAG_THUMBNAIL_LENGTH 0x0202
-
-
-/*--------------------------------------------------------------------------
- Process one of the nested EXIF directories.
---------------------------------------------------------------------------*/
-bool CxImageJPG::CxExifInfo::ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBase, unsigned ExifLength,
- EXIFINFO * const m_exifinfo, unsigned char ** const LastExifRefdP )
-{
- int de;
- int a;
- int NumDirEntries;
- unsigned ThumbnailOffset = 0;
- unsigned ThumbnailSize = 0;
-
- NumDirEntries = Get16u(DirStart);
-
- if ((DirStart+2+NumDirEntries*12) > (OffsetBase+ExifLength)){
- strcpy(m_szLastError,"Illegally sized directory");
- return false;
- }
-
- for (de=0;de= NUM_FORMATS) {
- /* (-1) catches illegal zero case as unsigned underflows to positive large */
- strcpy(m_szLastError,"Illegal format code in EXIF dir");
- return false;
- }
-
- ByteCount = Components * BytesPerFormat[Format];
-
- if (ByteCount > 4){
- unsigned OffsetVal;
- OffsetVal = Get32u(DirEntry+8);
- /* If its bigger than 4 bytes, the dir entry contains an offset.*/
- if (OffsetVal+ByteCount > ExifLength){
- /* Bogus pointer offset and / or bytecount value */
- strcpy(m_szLastError,"Illegal pointer offset value in EXIF.");
- return false;
- }
- ValuePtr = OffsetBase+OffsetVal;
- }else{
- /* 4 bytes or less and value is in the dir entry itself */
- ValuePtr = DirEntry+8;
- }
-
- if (*LastExifRefdP < ValuePtr+ByteCount){
- /* Keep track of last byte in the exif header that was
- actually referenced. That way, we know where the
- discardable thumbnail data begins.
- */
- *LastExifRefdP = ValuePtr+ByteCount;
- }
-
- /* Extract useful components of tag */
- switch(Tag){
-
- case TAG_MAKE:
- strncpy(m_exifinfo->CameraMake, (char*)ValuePtr, 31);
- break;
-
- case TAG_MODEL:
- strncpy(m_exifinfo->CameraModel, (char*)ValuePtr, 39);
- break;
-
- case TAG_EXIF_VERSION:
- strncpy(m_exifinfo->Version,(char*)ValuePtr, 4);
- break;
-
- case TAG_DATETIME_ORIGINAL:
- strncpy(m_exifinfo->DateTime, (char*)ValuePtr, 19);
- break;
-
- case TAG_USERCOMMENT:
- // Olympus has this padded with trailing spaces. Remove these first.
- for (a=ByteCount;;){
- a--;
- if (((char*)ValuePtr)[a] == ' '){
- ((char*)ValuePtr)[a] = '\0';
- }else{
- break;
- }
- if (a == 0) break;
- }
-
- /* Copy the comment */
- if (memcmp(ValuePtr, "ASCII",5) == 0){
- for (a=5;a<10;a++){
- char c;
- c = ((char*)ValuePtr)[a];
- if (c != '\0' && c != ' '){
- strncpy(m_exifinfo->Comments, (char*)ValuePtr+a, 199);
- break;
- }
- }
-
- }else{
- strncpy(m_exifinfo->Comments, (char*)ValuePtr, 199);
- }
- break;
-
- case TAG_FNUMBER:
- /* Simplest way of expressing aperture, so I trust it the most.
- (overwrite previously computd value if there is one)
- */
- m_exifinfo->ApertureFNumber = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_APERTURE:
- case TAG_MAXAPERTURE:
- /* More relevant info always comes earlier, so only
- use this field if we don't have appropriate aperture
- information yet.
- */
- if (m_exifinfo->ApertureFNumber == 0){
- m_exifinfo->ApertureFNumber = (float)exp(ConvertAnyFormat(ValuePtr, Format)*log(2.0f)*0.5);
- }
- break;
-
- case TAG_BRIGHTNESS:
- m_exifinfo->Brightness = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_FOCALLENGTH:
- /* Nice digital cameras actually save the focal length
- as a function of how farthey are zoomed in.
- */
-
- m_exifinfo->FocalLength = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_SUBJECT_DISTANCE:
- /* Inidcates the distacne the autofocus camera is focused to.
- Tends to be less accurate as distance increases.
- */
- m_exifinfo->Distance = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_EXPOSURETIME:
- /* Simplest way of expressing exposure time, so I
- trust it most. (overwrite previously computd value
- if there is one)
- */
- m_exifinfo->ExposureTime =
- (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_SHUTTERSPEED:
- /* More complicated way of expressing exposure time,
- so only use this value if we don't already have it
- from somewhere else.
- */
- if (m_exifinfo->ExposureTime == 0){
- m_exifinfo->ExposureTime = (float)
- (1/exp(ConvertAnyFormat(ValuePtr, Format)*log(2.0f)));
- }
- break;
-
- case TAG_FLASH:
- if ((int)ConvertAnyFormat(ValuePtr, Format) & 7){
- m_exifinfo->FlashUsed = 1;
- }else{
- m_exifinfo->FlashUsed = 0;
- }
- break;
-
- case TAG_ORIENTATION:
- m_exifinfo->Orientation = (int)ConvertAnyFormat(ValuePtr, Format);
- if (m_exifinfo->Orientation < 1 || m_exifinfo->Orientation > 8){
- strcpy(m_szLastError,"Undefined rotation value");
- m_exifinfo->Orientation = 0;
- }
- break;
-
- case TAG_EXIF_IMAGELENGTH:
- case TAG_EXIF_IMAGEWIDTH:
- /* Use largest of height and width to deal with images
- that have been rotated to portrait format.
- */
- a = (int)ConvertAnyFormat(ValuePtr, Format);
- if (ExifImageWidth < a) ExifImageWidth = a;
- break;
-
- case TAG_FOCALPLANEXRES:
- m_exifinfo->FocalplaneXRes = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_FOCALPLANEYRES:
- m_exifinfo->FocalplaneYRes = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_RESOLUTIONUNIT:
- switch((int)ConvertAnyFormat(ValuePtr, Format)){
- case 1: m_exifinfo->ResolutionUnit = 1.0f; break; /* 1 inch */
- case 2: m_exifinfo->ResolutionUnit = 1.0f; break;
- case 3: m_exifinfo->ResolutionUnit = 0.3937007874f; break; /* 1 centimeter*/
- case 4: m_exifinfo->ResolutionUnit = 0.03937007874f; break; /* 1 millimeter*/
- case 5: m_exifinfo->ResolutionUnit = 0.00003937007874f; /* 1 micrometer*/
- }
- break;
-
- case TAG_FOCALPLANEUNITS:
- switch((int)ConvertAnyFormat(ValuePtr, Format)){
- case 1: m_exifinfo->FocalplaneUnits = 1.0f; break; /* 1 inch */
- case 2: m_exifinfo->FocalplaneUnits = 1.0f; break;
- case 3: m_exifinfo->FocalplaneUnits = 0.3937007874f; break; /* 1 centimeter*/
- case 4: m_exifinfo->FocalplaneUnits = 0.03937007874f; break; /* 1 millimeter*/
- case 5: m_exifinfo->FocalplaneUnits = 0.00003937007874f; /* 1 micrometer*/
- }
- break;
-
- // Remaining cases contributed by: Volker C. Schoech
-
- case TAG_EXPOSURE_BIAS:
- m_exifinfo->ExposureBias = (float) ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_WHITEBALANCE:
- m_exifinfo->Whitebalance = (int)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_METERING_MODE:
- m_exifinfo->MeteringMode = (int)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_EXPOSURE_PROGRAM:
- m_exifinfo->ExposureProgram = (int)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_ISO_EQUIVALENT:
- m_exifinfo->ISOequivalent = (int)ConvertAnyFormat(ValuePtr, Format);
- if ( m_exifinfo->ISOequivalent < 50 ) m_exifinfo->ISOequivalent *= 200;
- break;
-
- case TAG_COMPRESSION_LEVEL:
- m_exifinfo->CompressionLevel = (int)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_XRESOLUTION:
- m_exifinfo->Xresolution = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
- case TAG_YRESOLUTION:
- m_exifinfo->Yresolution = (float)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_THUMBNAIL_OFFSET:
- ThumbnailOffset = (unsigned)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- case TAG_THUMBNAIL_LENGTH:
- ThumbnailSize = (unsigned)ConvertAnyFormat(ValuePtr, Format);
- break;
-
- }
-
- if (Tag == TAG_EXIF_OFFSET || Tag == TAG_INTEROP_OFFSET){
- unsigned char * SubdirStart;
- unsigned Offset = Get32u(ValuePtr);
- if (Offset>8){
- SubdirStart = OffsetBase + Offset;
- if (SubdirStart < OffsetBase ||
- SubdirStart > OffsetBase+ExifLength){
- strcpy(m_szLastError,"Illegal subdirectory link");
- return false;
- }
- ProcessExifDir(SubdirStart, OffsetBase, ExifLength, m_exifinfo, LastExifRefdP);
- }
- continue;
- }
- }
-
-
- {
- /* In addition to linking to subdirectories via exif tags,
- there's also a potential link to another directory at the end
- of each directory. This has got to be the result of a
- committee!
- */
- unsigned char * SubdirStart;
- unsigned Offset;
- Offset = Get16u(DirStart+2+12*NumDirEntries);
- if (Offset){
- SubdirStart = OffsetBase + Offset;
- if (SubdirStart < OffsetBase
- || SubdirStart > OffsetBase+ExifLength){
- strcpy(m_szLastError,"Illegal subdirectory link");
- return false;
- }
- ProcessExifDir(SubdirStart, OffsetBase, ExifLength, m_exifinfo, LastExifRefdP);
- }
- }
-
-
- if (ThumbnailSize && ThumbnailOffset){
- if (ThumbnailSize + ThumbnailOffset <= ExifLength){
- /* The thumbnail pointer appears to be valid. Store it. */
- m_exifinfo->ThumbnailPointer = OffsetBase + ThumbnailOffset;
- m_exifinfo->ThumbnailSize = ThumbnailSize;
- }
- }
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/*--------------------------------------------------------------------------
- Evaluate number, be it int, rational, or float from directory.
---------------------------------------------------------------------------*/
-double CxImageJPG::CxExifInfo::ConvertAnyFormat(void * ValuePtr, int Format)
-{
- double Value;
- Value = 0;
-
- switch(Format){
- case FMT_SBYTE: Value = *(signed char *)ValuePtr; break;
- case FMT_BYTE: Value = *(unsigned char *)ValuePtr; break;
-
- case FMT_USHORT: Value = Get16u(ValuePtr); break;
- case FMT_ULONG: Value = Get32u(ValuePtr); break;
-
- case FMT_URATIONAL:
- case FMT_SRATIONAL:
- {
- int Num,Den;
- Num = Get32s(ValuePtr);
- Den = Get32s(4+(char *)ValuePtr);
- if (Den == 0){
- Value = 0;
- }else{
- Value = (double)Num/Den;
- }
- break;
- }
-
- case FMT_SSHORT: Value = (signed short)Get16u(ValuePtr); break;
- case FMT_SLONG: Value = Get32s(ValuePtr); break;
-
- /* Not sure if this is correct (never seen float used in Exif format)
- */
- case FMT_SINGLE: Value = (double)*(float *)ValuePtr; break;
- case FMT_DOUBLE: Value = *(double *)ValuePtr; break;
- }
- return Value;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageJPG::CxExifInfo::process_COM (const BYTE * Data, int length)
-{
- int ch;
- char Comment[MAX_COMMENT+1];
- int nch;
- int a;
-
- nch = 0;
-
- if (length > MAX_COMMENT) length = MAX_COMMENT; // Truncate if it won't fit in our structure.
-
- for (a=2;aComments,Comment);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageJPG::CxExifInfo::process_SOFn (const BYTE * Data, int marker)
-{
- int data_precision, num_components;
-
- data_precision = Data[2];
- m_exifinfo->Height = Get16m((void*)(Data+3));
- m_exifinfo->Width = Get16m((void*)(Data+5));
- num_components = Data[7];
-
- if (num_components == 3){
- m_exifinfo->IsColor = 1;
- }else{
- m_exifinfo->IsColor = 0;
- }
-
- m_exifinfo->Process = marker;
-
- //if (ShowTags) printf("JPEG image is %uw * %uh, %d color components, %d bits per sample\n",
- // ImageInfo.Width, ImageInfo.Height, num_components, data_precision);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * this will work only on a CxImageJPG object, if the image originally has valid EXIF data
- \verbatim
- CxImageJPG jpg;
- CxIOFile in,out;
- in.Open("D:\\exif_in.jpg","rb");
- out.Open("D:\\exif_out.jpg","w+b");
- jpg.Decode(&in);
- if (jpg.IsValid()){
- jpg.RotateLeft();
- jpg.Encode(&out);
- }
- \endverbatim
-*/
-bool CxImageJPG::CxExifInfo::EncodeExif(CxFile * hFile)
-{
- int a;
-
- if (FindSection(M_SOS)==NULL){
- strcpy(m_szLastError,"Can't write exif : didn't read all");
- return false;
- }
-
- // Initial static jpeg marker.
- hFile->PutC(0xff);
- hFile->PutC(0xd8);
-
- if (Sections[0].Type != M_EXIF && Sections[0].Type != M_JFIF){
- // The image must start with an exif or jfif marker. If we threw those away, create one.
- static BYTE JfifHead[18] = {
- 0xff, M_JFIF,
- 0x00, 0x10, 'J' , 'F' , 'I' , 'F' , 0x00, 0x01,
- 0x01, 0x01, 0x01, 0x2C, 0x01, 0x2C, 0x00, 0x00
- };
- hFile->Write(JfifHead, 18, 1);
- }
-
- // Write all the misc sections
- for (a=0;aPutC(0xff);
- hFile->PutC(Sections[a].Type);
- hFile->Write(Sections[a].Data, Sections[a].Size, 1);
- }
-
- // Write the remaining image data.
- hFile->Write(Sections[a].Data, Sections[a].Size, 1);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageJPG::CxExifInfo::DiscardAllButExif()
-{
- Section_t ExifKeeper;
- Section_t CommentKeeper;
- int a;
-
- memset(&ExifKeeper, 0, sizeof(ExifKeeper));
- memset(&CommentKeeper, 0, sizeof(ExifKeeper));
-
- for (a=0;a Use it before Create()
- */
-void CxImage::CopyInfo(const CxImage &src)
-{
- if (pDib==NULL) memcpy(&info,&src.info,sizeof(CXIMAGEINFO));
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \sa Copy
- */
-CxImage& CxImage::operator = (const CxImage& isrc)
-{
- if (this != &isrc) Copy(isrc);
- return *this;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Initializes or rebuilds the image.
- * \param dwWidth: width
- * \param dwHeight: height
- * \param wBpp: bit per pixel, can be 1, 4, 8, 24
- * \param imagetype: (optional) set the image format, see ENUM_CXIMAGE_FORMATS
- * \return pointer to the internal pDib object; NULL if an error occurs.
- */
-void* CxImage::Create(DWORD dwWidth, DWORD dwHeight, DWORD wBpp, DWORD imagetype)
-{
- // destroy the existing image (if any)
- if (!Destroy())
- return NULL;
-
- // prevent further actions if width or height are not vaild
- if ((dwWidth == 0) || (dwHeight == 0)){
- strcpy(info.szLastError,"CxImage::Create : width and height must be greater than zero");
- return NULL;
- }
-
- // Make sure bits per pixel is valid
- if (wBpp <= 1) wBpp = 1;
- else if (wBpp <= 4) wBpp = 4;
- else if (wBpp <= 8) wBpp = 8;
- else wBpp = 24;
-
- // limit memory requirements (and also a check for bad parameters)
- if (((dwWidth*dwHeight*wBpp)>>8) > CXIMAGE_MAX_MEMORY){
- strcpy(info.szLastError,"CXIMAGE_MAX_MEMORY exceeded");
- return NULL;
- }
-
- // set the correct bpp value
- switch (wBpp){
- case 1:
- head.biClrUsed = 2; break;
- case 4:
- head.biClrUsed = 16; break;
- case 8:
- head.biClrUsed = 256; break;
- default:
- head.biClrUsed = 0;
- }
-
- //set the common image informations
- info.dwEffWidth = ((((wBpp * dwWidth) + 31) / 32) * 4);
- info.dwType = imagetype;
-
- // initialize BITMAPINFOHEADER
- head.biSize = sizeof(BITMAPINFOHEADER); //
- head.biWidth = dwWidth; // fill in width from parameter
- head.biHeight = dwHeight; // fill in height from parameter
- head.biPlanes = 1; // must be 1
- head.biBitCount = (WORD)wBpp; // from parameter
- head.biCompression = BI_RGB;
- head.biSizeImage = info.dwEffWidth * dwHeight;
-// head.biXPelsPerMeter = 0; See SetXDPI
-// head.biYPelsPerMeter = 0; See SetYDPI
- head.biClrImportant = 0;
-
- pDib = malloc(GetSize()); // alloc memory block to store our bitmap
- if (!pDib){
- strcpy(info.szLastError,"CxImage::Create can't allocate memory");
- return NULL;
- }
-
- //clear the palette
- RGBQUAD* pal=GetPalette();
- if (pal) memset(pal,0,GetPaletteSize());
- //Destroy the existing selection
-#if CXIMAGE_SUPPORT_SELECTION
- if (pSelection) SelectionDelete();
-#endif //CXIMAGE_SUPPORT_SELECTION
- //Destroy the existing alpha channel
-#if CXIMAGE_SUPPORT_ALPHA
- if (pAlpha) AlphaDelete();
-#endif //CXIMAGE_SUPPORT_ALPHA
-
- // use our bitmap info structure to fill in first part of
- // our DIB with the BITMAPINFOHEADER
- BITMAPINFOHEADER* lpbi;
- lpbi = (BITMAPINFOHEADER*)(pDib);
- *lpbi = head;
-
- info.pImage=GetBits();
-
- return pDib; //return handle to the DIB
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return pointer to the image pixels. USE CAREFULLY
- */
-BYTE* CxImage::GetBits(DWORD row)
-{
- if (pDib){
- if (row) {
- if (row<(DWORD)head.biHeight){
- return ((BYTE*)pDib + *(DWORD*)pDib + GetPaletteSize() + (info.dwEffWidth * row));
- } else {
- return NULL;
- }
- } else {
- return ((BYTE*)pDib + *(DWORD*)pDib + GetPaletteSize());
- }
- }
- return NULL;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return the size in bytes of the internal pDib object
- */
-long CxImage::GetSize()
-{
- return head.biSize + head.biSizeImage + GetPaletteSize();
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Checks if the coordinates are inside the image
- * \return true if x and y are both inside the image
- */
-bool CxImage::IsInside(long x, long y)
-{
- return (0<=y && y 0) bval = 255;
- }
- if (GetBpp() == 4){
- bval = (BYTE)(17*(0x0F & bval));
- }
-
- memset(info.pImage,bval,head.biSizeImage);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Transfers the image from an existing source image. The source becomes empty.
- * \return true if everything is ok
- */
-bool CxImage::Transfer(CxImage &from)
-{
- if (!Destroy())
- return false;
-
- memcpy(&head,&from.head,sizeof(BITMAPINFOHEADER));
- memcpy(&info,&from.info,sizeof(CXIMAGEINFO));
-
- pDib = from.pDib;
- pSelection = from.pSelection;
- pAlpha = from.pAlpha;
- pLayers = from.pLayers;
-
- memset(&from.head,0,sizeof(BITMAPINFOHEADER));
- memset(&from.info,0,sizeof(CXIMAGEINFO));
- from.pDib = from.pSelection = from.pAlpha = NULL;
- from.pLayers = NULL;
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * (this) points to the same pDib owned by (*from), the image remains in (*from)
- * but (this) has the access to the pixels. Use carefully !!!
- */
-void CxImage::Ghost(CxImage *from)
-{
- if (from){
- memcpy(&head,&from->head,sizeof(BITMAPINFOHEADER));
- memcpy(&info,&from->info,sizeof(CXIMAGEINFO));
- pDib = from->pDib;
- pSelection = from->pSelection;
- pAlpha = from->pAlpha;
- pLayers = from->pLayers;
- info.pGhost=from;
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * turns a 16 or 32 bit bitfield image into a RGB image
- */
-void CxImage::Bitfield2RGB(BYTE *src, WORD redmask, WORD greenmask, WORD bluemask, BYTE bpp)
-{
- switch (bpp){
- case 16:
- {
- DWORD ns[3]={0,0,0};
- // compute the number of shift for each mask
- for (int i=0;i<16;i++){
- if ((redmask>>i)&0x01) ns[0]++;
- if ((greenmask>>i)&0x01) ns[1]++;
- if ((bluemask>>i)&0x01) ns[2]++;
- }
- ns[1]+=ns[0]; ns[2]+=ns[1]; ns[0]=8-ns[0]; ns[1]-=8; ns[2]-=8;
- // dword aligned width for 16 bit image
- long effwidth2=(((head.biWidth + 1) / 2) * 4);
- WORD w;
- long y2,y3,x2,x3;
- BYTE *p=info.pImage;
- // scan the buffer in reverse direction to avoid reallocations
- for (long y=head.biHeight-1; y>=0; y--){
- y2=effwidth2*y;
- y3=info.dwEffWidth*y;
- for (long x=head.biWidth-1; x>=0; x--){
- x2 = 2*x+y2;
- x3 = 3*x+y3;
- w = (WORD)(src[x2]+256*src[1+x2]);
- p[ x3]=(BYTE)((w & bluemask)<>ns[1]);
- p[2+x3]=(BYTE)((w & redmask)>>ns[2]);
- }
- }
- break;
- }
- case 32:
- {
- // dword aligned width for 32 bit image
- long effwidth4 = head.biWidth * 4;
- long y4,y3,x4,x3;
- BYTE *p=info.pImage;
- // scan the buffer in reverse direction to avoid reallocations
- for (long y=head.biHeight-1; y>=0; y--){
- y4=effwidth4*y;
- y3=info.dwEffWidth*y;
- for (long x=head.biWidth-1; x>=0; x--){
- x4 = 4*x+y4;
- x3 = 3*x+y3;
- p[ x3]=src[ x4];
- p[1+x3]=src[1+x4];
- p[2+x3]=src[2+x4];
- }
- }
- }
-
- }
- return;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Creates an image from a generic buffer
- * \param pArray: source memory buffer
- * \param dwWidth: image width
- * \param dwHeight: image height
- * \param dwBitsperpixel: can be 1,4,8,24,32
- * \param dwBytesperline: line alignment, in bytes, for a single row stored in pArray
- * \param bFlipImage: tune this parameter if the image is upsidedown
- * \return true if everything is ok
- */
-bool CxImage::CreateFromArray(BYTE* pArray,DWORD dwWidth,DWORD dwHeight,DWORD dwBitsperpixel, DWORD dwBytesperline, bool bFlipImage)
-{
- if (pArray==NULL) return false;
- if (!((dwBitsperpixel==1)||(dwBitsperpixel==4)||(dwBitsperpixel==8)||
- (dwBitsperpixel==24)||(dwBitsperpixel==32))) return false;
-
- if (!Create(dwWidth,dwHeight,dwBitsperpixel)) return false;
-
- if (dwBitsperpixel<24) SetGrayPalette();
-
-#if CXIMAGE_SUPPORT_ALPHA
- if (dwBitsperpixel==32) AlphaCreate();
-#endif //CXIMAGE_SUPPORT_ALPHA
-
- BYTE *dst,*src;
-
- for (DWORD y = 0; yrgbRed,c1->rgbGreen,c1->rgbBlue);
- int g2 = (int)RGB2GRAY(c2->rgbRed,c2->rgbGreen,c2->rgbBlue);
-
- return (g1-g2);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * simply calls "if (memblock) free(memblock);".
- * Useful when calling Encode for a memory buffer,
- * from a DLL compiled with different memory management options.
- * CxImage::FreeMemory will use the same memory environment used by Encode.
- */
-void CxImage::FreeMemory(void* memblock)
-{
- if (memblock)
- free(memblock);
-}
-////////////////////////////////////////////////////////////////////////////////
-//EOF
diff --git a/src/win32/dependencies/cximage/ximage.h b/src/win32/dependencies/cximage/ximage.h
deleted file mode 100644
index 8d3af351..00000000
--- a/src/win32/dependencies/cximage/ximage.h
+++ /dev/null
@@ -1,648 +0,0 @@
-/*
- * File: ximage.h
- * Purpose: General Purpose Image Class
- */
-/*
- --------------------------------------------------------------------------------
-
- COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
- CxImage version 5.99c 17/Oct/2004
-
- CxImage : Copyright (C) 2001 - 2004, Davide Pizzolato
-
- Original CImage and CImageIterator implementation are:
- Copyright (C) 1995, Alejandro Aguilar Sierra (asierra(at)servidor(dot)unam(dot)mx)
-
- Covered code is provided under this license on an "as is" basis, without warranty
- of any kind, either expressed or implied, including, without limitation, warranties
- that the covered code is free of defects, merchantable, fit for a particular purpose
- or non-infringing. The entire risk as to the quality and performance of the covered
- code is with you. Should any covered code prove defective in any respect, you (not
- the initial developer or any other contributor) assume the cost of any necessary
- servicing, repair or correction. This disclaimer of warranty constitutes an essential
- part of this license. No use of any covered code is authorized hereunder except under
- this disclaimer.
-
- Permission is hereby granted to use, copy, modify, and distribute this
- source code, or portions hereof, for any purpose, including commercial applications,
- freely and without fee, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source distribution.
-
- --------------------------------------------------------------------------------
-
- Other information: about CxImage, and the latest version, can be found at the
- CxImage home page: http://www.xdp.it
-
- --------------------------------------------------------------------------------
- */
-#if !defined(__CXIMAGE_H)
-#define __CXIMAGE_H
-
-#if _MSC_VER > 1000
-#pragma once
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-#include "xfile.h"
-#include "xiofile.h"
-#include "xmemfile.h"
-#include "ximadef.h" // adjust some #define
-
-/* see "ximacfg.h" for CxImage configuration options */
-
-/////////////////////////////////////////////////////////////////////////////
-// CxImage formats enumerator
-enum ENUM_CXIMAGE_FORMATS{
-CXIMAGE_FORMAT_UNKNOWN,
-#if CXIMAGE_SUPPORT_BMP
-CXIMAGE_FORMAT_BMP,
-#endif
-#if CXIMAGE_SUPPORT_GIF
-CXIMAGE_FORMAT_GIF,
-#endif
-#if CXIMAGE_SUPPORT_JPG
-CXIMAGE_FORMAT_JPG,
-#endif
-#if CXIMAGE_SUPPORT_PNG
-CXIMAGE_FORMAT_PNG,
-#endif
-#if CXIMAGE_SUPPORT_MNG
-CXIMAGE_FORMAT_MNG,
-#endif
-#if CXIMAGE_SUPPORT_ICO
-CXIMAGE_FORMAT_ICO,
-#endif
-#if CXIMAGE_SUPPORT_TIF
-CXIMAGE_FORMAT_TIF,
-#endif
-#if CXIMAGE_SUPPORT_TGA
-CXIMAGE_FORMAT_TGA,
-#endif
-#if CXIMAGE_SUPPORT_PCX
-CXIMAGE_FORMAT_PCX,
-#endif
-#if CXIMAGE_SUPPORT_WBMP
-CXIMAGE_FORMAT_WBMP,
-#endif
-#if CXIMAGE_SUPPORT_WMF
-CXIMAGE_FORMAT_WMF,
-#endif
-#if CXIMAGE_SUPPORT_J2K
-CXIMAGE_FORMAT_J2K,
-#endif
-#if CXIMAGE_SUPPORT_JBG
-CXIMAGE_FORMAT_JBG,
-#endif
-#if CXIMAGE_SUPPORT_JP2
-CXIMAGE_FORMAT_JP2,
-#endif
-#if CXIMAGE_SUPPORT_JPC
-CXIMAGE_FORMAT_JPC,
-#endif
-#if CXIMAGE_SUPPORT_PGX
-CXIMAGE_FORMAT_PGX,
-#endif
-#if CXIMAGE_SUPPORT_PNM
-CXIMAGE_FORMAT_PNM,
-#endif
-#if CXIMAGE_SUPPORT_RAS
-CXIMAGE_FORMAT_RAS,
-#endif
-CMAX_IMAGE_FORMATS
-};
-
-/////////////////////////////////////////////////////////////////////////////
-// CxImage class
-/////////////////////////////////////////////////////////////////////////////
-class DLL_EXP CxImage
-{
-//extensible information collector
-typedef struct tagCxImageInfo {
- DWORD dwEffWidth; ///< DWORD aligned scan line width
- BYTE* pImage; ///< THE IMAGE BITS
- CxImage* pGhost; ///< if this is a ghost, pGhost points to the body
- CxImage* pParent; ///< if this is a layer, pParent points to the body
- DWORD dwType; ///< original image format
- char szLastError[256]; ///< debugging
- long nProgress; ///< monitor
- long nEscape; ///< escape
- long nBkgndIndex; ///< used for GIF, PNG, MNG
- RGBQUAD nBkgndColor; ///< used for RGB transparency
- BYTE nQuality; ///< used for JPEG
- BYTE nJpegScale; ///< used for JPEG [ignacio]
- long nFrame; ///< used for TIF, GIF, MNG : actual frame
- long nNumFrames; ///< used for TIF, GIF, MNG : total number of frames
- DWORD dwFrameDelay; ///< used for GIF, MNG
- long xDPI; ///< horizontal resolution
- long yDPI; ///< vertical resolution
- RECT rSelectionBox; ///< bounding rectangle
- BYTE nAlphaMax; ///< max opacity (fade)
- bool bAlphaPaletteEnabled; ///< true if alpha values in the palette are enabled.
- bool bEnabled; ///< enables the painting functions
- long xOffset;
- long yOffset;
- DWORD dwCodecOpt[CMAX_IMAGE_FORMATS]; ///< for GIF, TIF : 0=def.1=unc,2=fax3,3=fax4,4=pack,5=jpg
- RGBQUAD last_c; ///< for GetNearestIndex optimization
- BYTE last_c_index;
- bool last_c_isvalid;
- long nNumLayers;
- DWORD dwFlags; ///< 0x??00000 = reserved, 0x00??0000 = blend mode, 0x0000???? = layer id - user flags
-
-} CXIMAGEINFO;
-
-public:
- //public structures
-struct rgb_color { BYTE r,g,b; };
-
-#if CXIMAGE_SUPPORT_WINDOWS
-// text placement data
-// members must be initialized with the InitTextInfo(&this) function.
-typedef struct tagCxTextInfo
-{
- TCHAR text[4096]; ///< text (char -> TCHAR for UNICODE [Cesar M])
- LOGFONT lfont; ///< font and codepage data
- COLORREF fcolor; ///< foreground color
- long align; ///< DT_CENTER, DT_RIGHT, DT_LEFT aligment for multiline text
- BYTE opaque; ///< text has background or hasn't. Default is true.
- ///< data for background (ignored if .opaque==FALSE)
- COLORREF bcolor; ///< background color
- float b_opacity; ///< opacity value for background between 0.0-1.0 Default is 0. (opaque)
- BYTE b_outline; ///< outline width for background (zero: no outline)
- BYTE b_round; ///< rounding radius for background rectangle. % of the height, between 0-50. Default is 10.
- ///< (backgr. always has a frame: width = 3 pixel + 10% of height by default.)
-} CXTEXTINFO;
-#endif
-
-public:
-/** \addtogroup Constructors */ //@{
- CxImage(DWORD imagetype = 0);
- CxImage(DWORD dwWidth, DWORD dwHeight, DWORD wBpp, DWORD imagetype = 0);
- CxImage(const CxImage &src, bool copypixels = true, bool copyselection = true, bool copyalpha = true);
- CxImage(const TCHAR * filename, DWORD imagetype); // For UNICODE support: char -> TCHAR
- CxImage(FILE * stream, DWORD imagetype);
- CxImage(CxFile * stream, DWORD imagetype);
- CxImage(BYTE * buffer, DWORD size, DWORD imagetype);
- virtual ~CxImage() { Destroy(); };
- CxImage& operator = (const CxImage&);
-//@}
-
-/** \addtogroup Initialization */ //@{
- void* Create(DWORD dwWidth, DWORD dwHeight, DWORD wBpp, DWORD imagetype = 0);
- bool Destroy();
- void Clear(BYTE bval=0);
- void Copy(const CxImage &src, bool copypixels = true, bool copyselection = true, bool copyalpha = true);
- bool Transfer(CxImage &from);
- bool CreateFromArray(BYTE* pArray,DWORD dwWidth,DWORD dwHeight,DWORD dwBitsperpixel, DWORD dwBytesperline, bool bFlipImage);
- bool CreateFromMatrix(BYTE** ppMatrix,DWORD dwWidth,DWORD dwHeight,DWORD dwBitsperpixel, DWORD dwBytesperline, bool bFlipImage);
- void FreeMemory(void* memblock);
-//@}
-
-/** \addtogroup Attributes */ //@{
- long GetSize();
- BYTE* GetBits(DWORD row = 0);
- BYTE GetColorType();
- void* GetDIB() const;
- DWORD GetHeight() const;
- DWORD GetWidth() const;
- DWORD GetEffWidth() const;
- DWORD GetNumColors() const;
- WORD GetBpp() const;
- DWORD GetType() const;
- const char* GetLastError();
- const TCHAR* GetVersion();
- const float GetVersionNumber();
-
- DWORD GetFrameDelay() const;
- void SetFrameDelay(DWORD d);
-
- void GetOffset(long *x,long *y);
- void SetOffset(long x,long y);
-
- BYTE GetJpegQuality() const;
- void SetJpegQuality(BYTE q);
-
- BYTE GetJpegScale() const;
- void SetJpegScale(BYTE q);
-
- long GetXDPI() const;
- long GetYDPI() const;
- void SetXDPI(long dpi);
- void SetYDPI(long dpi);
-
- DWORD GetClrImportant() const;
- void SetClrImportant(DWORD ncolors = 0);
-
- long GetProgress() const;
- long GetEscape() const;
- void SetProgress(long p);
- void SetEscape(long i);
-
- long GetTransIndex() const;
- RGBQUAD GetTransColor();
- void SetTransIndex(long idx);
- void SetTransColor(RGBQUAD rgb);
- bool IsTransparent() const;
-
- DWORD GetCodecOption(DWORD imagetype = 0);
- bool SetCodecOption(DWORD opt, DWORD imagetype = 0);
-
- DWORD GetFlags() const;
- void SetFlags(DWORD flags, bool bLockReservedFlags = true);
-
- //void* GetUserData() const {return info.pUserData;}
- //void SetUserData(void* pUserData) {info.pUserData = pUserData;}
-//@}
-
-/** \addtogroup Palette
- * These functions have no effects on RGB images and in this case the returned value is always 0.
- * @{ */
- bool IsGrayScale();
- bool IsIndexed() const;
- bool IsSamePalette(CxImage &img, bool bCheckAlpha = true);
- DWORD GetPaletteSize();
- RGBQUAD* GetPalette() const;
- RGBQUAD GetPaletteColor(BYTE idx);
- bool GetPaletteColor(BYTE i, BYTE* r, BYTE* g, BYTE* b);
- BYTE GetNearestIndex(RGBQUAD c);
- void BlendPalette(COLORREF cr,long perc);
- void SetGrayPalette();
- void SetPalette(DWORD n, BYTE *r, BYTE *g, BYTE *b);
- void SetPalette(RGBQUAD* pPal,DWORD nColors=256);
- void SetPalette(rgb_color *rgb,DWORD nColors=256);
- void SetPaletteColor(BYTE idx, BYTE r, BYTE g, BYTE b, BYTE alpha=0);
- void SetPaletteColor(BYTE idx, RGBQUAD c);
- void SetPaletteColor(BYTE idx, COLORREF cr);
- void SwapIndex(BYTE idx1, BYTE idx2);
- void SetStdPalette();
-//@}
-
-/** \addtogroup Pixel */ //@{
- bool IsInside(long x, long y);
- bool IsTransparent(long x,long y);
- RGBQUAD GetPixelColor(long x,long y, bool bGetAlpha = true);
- BYTE GetPixelIndex(long x,long y);
- BYTE GetPixelGray(long x, long y);
- void SetPixelColor(long x,long y,RGBQUAD c, bool bSetAlpha = false);
- void SetPixelColor(long x,long y,COLORREF cr);
- void SetPixelIndex(long x,long y,BYTE i);
- void DrawLine(int StartX, int EndX, int StartY, int EndY, RGBQUAD color, bool bSetAlpha=false);
- void DrawLine(int StartX, int EndX, int StartY, int EndY, COLORREF cr);
- void BlendPixelColor(long x,long y,RGBQUAD c, float blend, bool bSetAlpha = false);
-//@}
-
-protected:
-/** \addtogroup Protected */ //@{
- BYTE BlindGetPixelIndex(const long x,const long y);
- RGBQUAD BlindGetPixelColor(const long x,const long y);
- void *BlindGetPixelPointer(const long x,const long y);
-//@}
-
-public:
-
-#if CXIMAGE_SUPPORT_INTERPOLATION
-/** \addtogroup Interpolation */ //@{
- //overflow methods:
- enum OverflowMethod {
- OM_COLOR=1,
- OM_BACKGROUND=2,
- OM_TRANSPARENT=3,
- OM_WRAP=4,
- OM_REPEAT=5,
- OM_MIRROR=6
- };
- void OverflowCoordinates(float &x, float &y, OverflowMethod const ofMethod);
- void OverflowCoordinates(long &x, long &y, OverflowMethod const ofMethod);
- RGBQUAD GetPixelColorWithOverflow(long x, long y, OverflowMethod const ofMethod=OM_BACKGROUND, RGBQUAD* const rplColor=0);
- //interpolation methods:
- enum InterpolationMethod {
- IM_NEAREST_NEIGHBOUR=1,
- IM_BILINEAR =2,
- IM_BSPLINE =3,
- IM_BICUBIC =4,
- IM_BICUBIC2 =5,
- IM_LANCZOS =6,
- IM_BOX =7,
- IM_HERMITE =8,
- IM_HAMMING =9,
- IM_SINC =10,
- IM_BLACKMAN =11,
- IM_BESSEL =12,
- IM_GAUSSIAN =13,
- IM_QUADRATIC =14,
- IM_MITCHELL =15,
- IM_CATROM =16
- };
- RGBQUAD GetPixelColorInterpolated(float x,float y, InterpolationMethod const inMethod=IM_BILINEAR, OverflowMethod const ofMethod=OM_BACKGROUND, RGBQUAD* const rplColor=0);
- RGBQUAD GetAreaColorInterpolated(float const xc, float const yc, float const w, float const h, InterpolationMethod const inMethod, OverflowMethod const ofMethod=OM_BACKGROUND, RGBQUAD* const rplColor=0);
-//@}
-
-protected:
-/** \addtogroup Protected */ //@{
- void AddAveragingCont(RGBQUAD const &color, float const surf, float &rr, float &gg, float &bb, float &aa);
-//@}
-
-/** \addtogroup Kernels */ //@{
-public:
- static float KernelBSpline(const float x);
- static float KernelLinear(const float t);
- static float KernelCubic(const float t);
- static float KernelGeneralizedCubic(const float t, const float a=-1);
- static float KernelLanczosSinc(const float t, const float r = 3);
- static float KernelBox(const float x);
- static float KernelHermite(const float x);
- static float KernelHamming(const float x);
- static float KernelSinc(const float x);
- static float KernelBlackman(const float x);
- static float KernelBessel_J1(const float x);
- static float KernelBessel_P1(const float x);
- static float KernelBessel_Q1(const float x);
- static float KernelBessel_Order1(float x);
- static float KernelBessel(const float x);
- static float KernelGaussian(const float x);
- static float KernelQuadratic(const float x);
- static float KernelMitchell(const float x);
- static float KernelCatrom(const float x);
-//@}
-#endif //CXIMAGE_SUPPORT_INTERPOLATION
-
-/** \addtogroup Painting */ //@{
-#if CXIMAGE_SUPPORT_WINCE
- long Blt(HDC pDC, long x=0, long y=0);
-#endif
-#if CXIMAGE_SUPPORT_WINDOWS
- HBITMAP MakeBitmap(HDC hdc = NULL);
- HANDLE CopyToHandle();
- bool CreateFromHANDLE(HANDLE hMem); //Windows objects (clipboard)
- bool CreateFromHBITMAP(HBITMAP hbmp, HPALETTE hpal=0); //Windows resource
- bool CreateFromHICON(HICON hico);
- long Draw(HDC hdc, long x=0, long y=0, long cx = -1, long cy = -1, RECT* pClipRect = 0, bool bSmooth = false);
- long Draw(HDC hdc, const RECT& rect, RECT* pClipRect=NULL, bool bSmooth = false);
- long Stretch(HDC hdc, long xoffset, long yoffset, long xsize, long ysize, DWORD dwRop = SRCCOPY);
- long Stretch(HDC hdc, const RECT& rect, DWORD dwRop = SRCCOPY);
- long Tile(HDC hdc, RECT *rc);
- long Draw2(HDC hdc, long x=0, long y=0, long cx = -1, long cy = -1);
- long Draw2(HDC hdc, const RECT& rect);
- //long DrawString(HDC hdc, long x, long y, const char* text, RGBQUAD color, const char* font, long lSize=0, long lWeight=400, BYTE bItalic=0, BYTE bUnderline=0, bool bSetAlpha=false);
- long DrawString(HDC hdc, long x, long y, const TCHAR* text, RGBQUAD color, const TCHAR* font, long lSize=0, long lWeight=400, BYTE bItalic=0, BYTE bUnderline=0, bool bSetAlpha=false);
- // extensions
- long DrawStringEx(HDC hdc, long x, long y, CXTEXTINFO *pTextType, bool bSetAlpha=false );
- void InitTextInfo( CXTEXTINFO *txt );
-#endif //CXIMAGE_SUPPORT_WINDOWS
-//@}
-
- // file operations
-#if CXIMAGE_SUPPORT_DECODE
-/** \addtogroup Decode */ //@{
-#ifdef WIN32
- //bool Load(LPCWSTR filename, DWORD imagetype=0);
- bool LoadResource(HRSRC hRes, DWORD imagetype, HMODULE hModule=NULL);
-#endif
- // For UNICODE support: char -> TCHAR
- bool Load(const TCHAR* filename, DWORD imagetype=0);
- //bool Load(const char * filename, DWORD imagetype=0);
- bool Decode(FILE * hFile, DWORD imagetype);
- bool Decode(CxFile * hFile, DWORD imagetype);
- bool Decode(BYTE * buffer, DWORD size, DWORD imagetype);
-//@}
-#endif //CXIMAGE_SUPPORT_DECODE
-
-#if CXIMAGE_SUPPORT_ENCODE
-protected:
-/** \addtogroup Protected */ //@{
- bool EncodeSafeCheck(CxFile *hFile);
-//@}
-
-public:
-/** \addtogroup Encode */ //@{
-#ifdef WIN32
- //bool Save(LPCWSTR filename, DWORD imagetype=0);
-#endif
- // For UNICODE support: char -> TCHAR
- bool Save(const TCHAR* filename, DWORD imagetype);
- //bool Save(const char * filename, DWORD imagetype=0);
- bool Encode(FILE * hFile, DWORD imagetype);
- bool Encode(CxFile * hFile, DWORD imagetype);
- bool Encode(CxFile * hFile, CxImage ** pImages, int pagecount, DWORD imagetype);
- bool Encode(FILE *hFile, CxImage ** pImages, int pagecount, DWORD imagetype);
- bool Encode(BYTE * &buffer, long &size, DWORD imagetype);
-
- bool Encode2RGBA(CxFile *hFile);
- bool Encode2RGBA(BYTE * &buffer, long &size);
-//@}
-#endif //CXIMAGE_SUPPORT_ENCODE
-
-/** \addtogroup Attributes */ //@{
- //misc.
- bool IsValid() const;
- bool IsEnabled() const;
- void Enable(bool enable=true);
-
- // frame operations
- long GetNumFrames() const;
- long GetFrame() const;
- void SetFrame(long nFrame);
-//@}
-
-#if CXIMAGE_SUPPORT_BASICTRANSFORMATIONS
-/** \addtogroup BasicTransformations */ //@{
- bool GrayScale();
- bool Flip();
- bool Mirror();
- bool Negative();
- bool RotateLeft(CxImage* iDst = NULL);
- bool RotateRight(CxImage* iDst = NULL);
-//@}
-#endif //CXIMAGE_SUPPORT_BASICTRANSFORMATIONS
-
-#if CXIMAGE_SUPPORT_TRANSFORMATION
-/** \addtogroup Transformations */ //@{
- // image operations
- bool Rotate(float angle, CxImage* iDst = NULL);
- bool Rotate2(float angle, CxImage *iDst = NULL, InterpolationMethod inMethod=IM_BILINEAR,
- OverflowMethod ofMethod=OM_BACKGROUND, RGBQUAD *replColor=0,
- bool const optimizeRightAngles=true, bool const bKeepOriginalSize=false);
- bool Rotate180(CxImage* iDst = NULL);
- bool Resample(long newx, long newy, int mode = 1, CxImage* iDst = NULL);
- bool Resample2(long newx, long newy, InterpolationMethod const inMethod=IM_BICUBIC2,
- OverflowMethod const ofMethod=OM_REPEAT, CxImage* const iDst = NULL,
- bool const disableAveraging=false);
- bool DecreaseBpp(DWORD nbit, bool errordiffusion, RGBQUAD* ppal = 0, DWORD clrimportant = 0);
- bool IncreaseBpp(DWORD nbit);
- bool Dither(long method = 0);
- bool Crop(long left, long top, long right, long bottom, CxImage* iDst = NULL);
- bool Crop(const RECT& rect, CxImage* iDst = NULL);
- bool CropRotatedRectangle( long topx, long topy, long width, long height, float angle, CxImage* iDst = NULL);
- bool Skew(float xgain, float ygain, long xpivot=0, long ypivot=0, bool bEnableInterpolation = false);
- bool Expand(long left, long top, long right, long bottom, RGBQUAD canvascolor, CxImage* iDst = 0);
- bool Expand(long newx, long newy, RGBQUAD canvascolor, CxImage* iDst = 0);
- bool Thumbnail(long newx, long newy, RGBQUAD canvascolor, CxImage* iDst = 0);
- bool CircleTransform(int type,long rmax=0,float Koeff=1.0f);
- bool RedEyeRemove();
- bool QIShrink(long newx, long newy, CxImage* const iDst = NULL);
-//@}
-#endif //CXIMAGE_SUPPORT_TRANSFORMATION
-
-#if CXIMAGE_SUPPORT_DSP
-/** \addtogroup DSP */ //@{
- bool Contour();
- bool HistogramStretch(long method = 0);
- bool HistogramEqualize();
- bool HistogramNormalize();
- bool HistogramRoot();
- bool HistogramLog();
- long Histogram(long* red, long* green = 0, long* blue = 0, long* gray = 0, long colorspace = 0);
- bool Jitter(long radius=2);
- bool Repair(float radius = 0.25f, long niterations = 1, long colorspace = 0);
- bool Combine(CxImage* r,CxImage* g,CxImage* b,CxImage* a, long colorspace = 0);
- bool FFT2(CxImage* srcReal, CxImage* srcImag, CxImage* dstReal, CxImage* dstImag, long direction = 1, bool bForceFFT = true, bool bMagnitude = true);
- bool Noise(long level);
- bool Median(long Ksize=3);
- bool Gamma(float gamma);
- bool ShiftRGB(long r, long g, long b);
- bool Threshold(BYTE level);
- bool Colorize(BYTE hue, BYTE sat, float blend = 1.0f);
- bool Light(long brightness, long contrast = 0);
- float Mean();
- bool Filter(long* kernel, long Ksize, long Kfactor, long Koffset);
- bool Erode(long Ksize=2);
- bool Dilate(long Ksize=2);
- bool Edge(long Ksize=2);
- void HuePalette(float correction=1);
- enum ImageOpType { OpAdd, OpAnd, OpXor, OpOr, OpMask, OpSrcCopy, OpDstCopy, OpSub, OpSrcBlend, OpScreen };
- void Mix(CxImage & imgsrc2, ImageOpType op, long lXOffset = 0, long lYOffset = 0, bool bMixAlpha = false);
- void MixFrom(CxImage & imagesrc2, long lXOffset, long lYOffset);
- bool UnsharpMask(float radius = 5.0, float amount = 0.5, int threshold = 0);
- bool Lut(BYTE* pLut);
- bool Lut(BYTE* pLutR, BYTE* pLutG, BYTE* pLutB, BYTE* pLutA = 0);
-//@}
-
-protected:
-/** \addtogroup Protected */ //@{
- bool IsPowerof2(long x);
- bool FFT(int dir,int m,double *x,double *y);
- bool DFT(int dir,long m,double *x1,double *y1,double *x2,double *y2);
- bool RepairChannel(CxImage *ch, float radius);
- //
- int gen_convolve_matrix (float radius, float **cmatrix_p);
- float* gen_lookup_table (float *cmatrix, int cmatrix_length);
- void blur_line (float *ctable, float *cmatrix, int cmatrix_length, BYTE* cur_col, BYTE* dest_col, int y, long bytes);
-//@}
-
-public:
-/** \addtogroup ColorSpace */ //@{
- bool SplitRGB(CxImage* r,CxImage* g,CxImage* b);
- bool SplitYUV(CxImage* y,CxImage* u,CxImage* v);
- bool SplitHSL(CxImage* h,CxImage* s,CxImage* l);
- bool SplitYIQ(CxImage* y,CxImage* i,CxImage* q);
- bool SplitXYZ(CxImage* x,CxImage* y,CxImage* z);
- bool SplitCMYK(CxImage* c,CxImage* m,CxImage* y,CxImage* k);
- static RGBQUAD HSLtoRGB(COLORREF cHSLColor);
- static RGBQUAD RGBtoHSL(RGBQUAD lRGBColor);
- static RGBQUAD HSLtoRGB(RGBQUAD lHSLColor);
- static RGBQUAD YUVtoRGB(RGBQUAD lYUVColor);
- static RGBQUAD RGBtoYUV(RGBQUAD lRGBColor);
- static RGBQUAD YIQtoRGB(RGBQUAD lYIQColor);
- static RGBQUAD RGBtoYIQ(RGBQUAD lRGBColor);
- static RGBQUAD XYZtoRGB(RGBQUAD lXYZColor);
- static RGBQUAD RGBtoXYZ(RGBQUAD lRGBColor);
-#endif //CXIMAGE_SUPPORT_DSP
- static RGBQUAD RGBtoRGBQUAD(COLORREF cr);
- static COLORREF RGBQUADtoRGB (RGBQUAD c);
-//@}
-
-#if CXIMAGE_SUPPORT_SELECTION
-/** \addtogroup Selection */ //@{
- bool SelectionClear();
- bool SelectionCreate();
- bool SelectionDelete();
- bool SelectionInvert();
- bool SelectionAddRect(RECT r);
- bool SelectionAddEllipse(RECT r);
- bool SelectionAddPolygon(POINT *points, long npoints);
- bool SelectionAddColor(RGBQUAD c);
- bool SelectionAddPixel(int x, int y);
- bool SelectionCopy(CxImage &from);
- bool SelectionIsInside(long x, long y);
- bool SelectionIsValid();
- void SelectionGetBox(RECT& r);
- bool SelectionToHRGN(HRGN& region);
- bool SelectionSplit(CxImage *dest);
-//@}
-#endif //CXIMAGE_SUPPORT_SELECTION
-
-#if CXIMAGE_SUPPORT_ALPHA
-/** \addtogroup Alpha */ //@{
- void AlphaClear();
- void AlphaCreate();
- void AlphaDelete();
- void AlphaInvert();
- bool AlphaMirror();
- bool AlphaFlip();
- bool AlphaCopy(CxImage &from);
- bool AlphaSplit(CxImage *dest);
- void AlphaStrip();
- void AlphaSet(BYTE level);
- bool AlphaSet(CxImage &from);
- void AlphaSet(const long x,const long y,const BYTE level);
- BYTE AlphaGet(const long x,const long y);
- BYTE AlphaGetMax() const;
- void AlphaSetMax(BYTE nAlphaMax);
- bool AlphaIsValid();
- BYTE* AlphaGetPointer(const long x = 0,const long y = 0);
-
- void AlphaPaletteClear();
- void AlphaPaletteEnable(bool enable=true);
- bool AlphaPaletteIsEnabled();
- bool AlphaPaletteIsValid();
- bool AlphaPaletteSplit(CxImage *dest);
-//@}
-
-protected:
-/** \addtogroup Protected */ //@{
- BYTE BlindAlphaGet(const long x,const long y);
-//@}
-#endif //CXIMAGE_SUPPORT_ALPHA
-
-public:
-#if CXIMAGE_SUPPORT_LAYERS
-/** \addtogroup Layers */ //@{
- bool LayerCreate(long position = -1);
- bool LayerDelete(long position = -1);
- void LayerDeleteAll();
- CxImage* GetLayer(long position);
- CxImage* GetParent() const;
- long GetNumLayers() const;
-//@}
-#endif //CXIMAGE_SUPPORT_LAYERS
-
-protected:
-/** \addtogroup Protected */ //@{
- void Startup(DWORD imagetype = 0);
- void CopyInfo(const CxImage &src);
- void Ghost(CxImage *src);
- void RGBtoBGR(BYTE *buffer, int length);
- static float HueToRGB(float n1,float n2, float hue);
- void Bitfield2RGB(BYTE *src, WORD redmask, WORD greenmask, WORD bluemask, BYTE bpp);
- static int CompareColors(const void *elem1, const void *elem2);
-
- void* pDib; //contains the header, the palette, the pixels
- BITMAPINFOHEADER head; //standard header
- CXIMAGEINFO info; //extended information
- BYTE* pSelection; //selected region
- BYTE* pAlpha; //alpha channel
- CxImage** pLayers; //generic layers
-//@}
-};
-
-////////////////////////////////////////////////////////////////////////////
-#endif // !defined(__CXIMAGE_H)
diff --git a/src/win32/dependencies/cximage/ximagif.cpp b/src/win32/dependencies/cximage/ximagif.cpp
deleted file mode 100644
index e9aee917..00000000
--- a/src/win32/dependencies/cximage/ximagif.cpp
+++ /dev/null
@@ -1,1564 +0,0 @@
-/*
- * File: ximagif.cpp
- * Purpose: Platform Independent GIF Image Class Loader and Writer
- * 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximagif.h"
-
-#if CXIMAGE_SUPPORT_GIF
-
-#include "ximaiter.h"
-
-#if CXIMAGE_SUPPORT_WINCE
- #define assert(s)
-#else
- #include
-#endif
-
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageGIF::Decode(CxFile *fp)
-{
- /* AD - for transparency */
- struct_dscgif dscgif;
- struct_image image;
- struct_TabCol TabCol;
-
- if (fp == NULL) return false;
-
- fp->Read(&dscgif,/*sizeof(dscgif)*/13,1);
- //if (strncmp(dscgif.header,"GIF8",3)!=0) {
- if (strncmp(dscgif.header,"GIF8",4)!=0) return FALSE;
-
- if (info.nEscape == -1) {
- // Return output dimensions only
- head.biWidth = dscgif.scrwidth;
- head.biHeight = dscgif.scrheight;
- return true;
- }
-
- /* AD - for interlace */
- TabCol.sogct = (short)(1 << ((dscgif.pflds & 0x07)+1));
- TabCol.colres = (short)(((dscgif.pflds & 0x70) >> 3) + 1);
-
- // assume that the image is a truecolor-gif if
- // 1) no global color map found
- // 2) (image.w, image.h) of the 1st image != (dscgif.scrwidth, dscgif.scrheight)
- long bTrueColor=0;
- CxImage* imaRGB=NULL;
-
- // Global colour map?
- if (dscgif.pflds & 0x80)
- fp->Read(TabCol.paleta,sizeof(struct rgb_color)*TabCol.sogct,1);
- else
- bTrueColor++; //first chance for a truecolor gif
-
- long first_transparent_index;
-
- int iImage = 0;
- info.nNumFrames=get_num_frames(fp,&TabCol,&dscgif);
-
- if ((info.nFrame<0)||(info.nFrame>=info.nNumFrames)) return false;
-
- //it cannot be a true color GIF with only one frame
- if (info.nNumFrames == 1)
- bTrueColor=0;
-
- char ch;
- bool bPreviousWasNull = true;
- int prevdispmeth = 0;
-
- for (BOOL bContinue = TRUE; bContinue; )
- {
- if (fp->Read(&ch, sizeof(ch), 1) != 1) {break;}
-
- if (info.nEscape > 0) return false; // - cancel decoding
- if (bPreviousWasNull || ch==0)
- {
- switch (ch)
- {
- case '!': // extension
- {
- bContinue = DecodeExtension(fp);
- break;
- }
- case ',': // image
- {
- assert(sizeof(image) == 9);
- fp->Read(&image,sizeof(image),1);
- //avoid byte order problems with Solaris
- BYTE *byteData = (BYTE *) & image;
- image.l = byteData[0]+byteData[1]*256;
- image.t = byteData[2]+byteData[3]*256;
- image.w = byteData[4]+byteData[5]*256;
- image.h = byteData[6]+byteData[7]*256;
-
- if (((image.l + image.w) > dscgif.scrwidth)||((image.t + image.h) > dscgif.scrheight))
- break;
-
- // check if it could be a truecolor gif
- if ((iImage==0) && (image.w != dscgif.scrwidth) && (image.h != dscgif.scrheight))
- bTrueColor++;
-
- // Local colour map?
- if (image.pf & 0x80) {
- TabCol.sogct = (short)(1 << ((image.pf & 0x07) +1));
- assert(3 == sizeof(struct rgb_color));
- fp->Read(TabCol.paleta,sizeof(struct rgb_color)*TabCol.sogct,1);
- //log << "Local colour map" << endl;
- }
-
- int bpp; // select the correct bit per pixel value
- if (TabCol.sogct <= 2) bpp = 1;
- else if (TabCol.sogct <= 16) bpp = 4;
- else bpp = 8;
-
- CxImageGIF backimage;
- backimage.CopyInfo(*this);
- if (iImage==0){
- //first frame: build image background
- backimage.Create(dscgif.scrwidth, dscgif.scrheight, bpp, CXIMAGE_FORMAT_GIF);
- first_transparent_index = info.nBkgndIndex;
- backimage.Clear((BYTE)gifgce.transpcolindex);
- } else {
- //generic frame: handle disposal method from previous one
- /*Values : 0 - No disposal specified. The decoder is
- not required to take any action.
- 1 - Do not dispose. The graphic is to be left
- in place.
- 2 - Restore to background color. The area used by the
- graphic must be restored to the background color.
- 3 - Restore to previous. The decoder is required to
- restore the area overwritten by the graphic with
- what was there prior to rendering the graphic.
- */
- backimage.Copy(*this);
- if (prevdispmeth==2){
- backimage.Clear((BYTE)first_transparent_index);
- }
- }
-
- //active frame
- Create(image.w, image.h, bpp, CXIMAGE_FORMAT_GIF);
-
- if ((image.pf & 0x80) || (dscgif.pflds & 0x80)) {
- unsigned char r[256], g[256], b[256];
- int i, has_white = 0;
-
- for (i=0; i < TabCol.sogct; i++) {
- r[i] = TabCol.paleta[i].r;
- g[i] = TabCol.paleta[i].g;
- b[i] = TabCol.paleta[i].b;
-
- if (RGB(r[i],g[i],b[i]) == 0xFFFFFF) has_white = 1;
- }
-
- // Force transparency colour white...
- //if (0) if (info.nBkgndIndex != -1)
- // r[info.nBkgndIndex] = g[info.nBkgndIndex] = b[info.nBkgndIndex] = 255;
- // Fill in with white // AD
- if (info.nBkgndIndex != -1) {
- while (i < 256) {
- has_white = 1;
- r[i] = g[i] = b[i] = 255;
- i++;
- }
- }
-
- // Force last colour to white... // AD
- //if ((info.nBkgndIndex != -1) && !has_white) {
- // r[255] = g[255] = b[255] = 255;
- //}
-
- SetPalette((info.nBkgndIndex != -1 ? 256 : TabCol.sogct), r, g, b);
- }
-
- CImageIterator* iter = new CImageIterator(this);
- iter->Upset();
- int badcode=0;
- ibf = GIFBUFTAM+1;
-
- interlaced = image.pf & 0x40;
- iheight = image.h;
- istep = 8;
- iypos = 0;
- ipass = 0;
-
- long pos_start = fp->Tell();
- //if (interlaced) log << "Interlaced" << endl;
- decoder(fp, iter, image.w, badcode);
- delete iter;
-
- if (info.nEscape) return false; // - cancel decoding
-
- if (bTrueColor<2 ){ //standard GIF: mix frame with background
- backimage.GifMix(*this,image);
- backimage.SetTransIndex(first_transparent_index);
- backimage.SetPalette(GetPalette());
- Transfer(backimage);
- } else { //it's a truecolor gif!
- //force full image decoding
- info.nFrame=info.nNumFrames-1;
- //build the RGB image
- if (imaRGB==NULL) imaRGB = new CxImage(dscgif.scrwidth,dscgif.scrheight,24,CXIMAGE_FORMAT_GIF);
- //copy the partial image into the full RGB image
- for(long y=0;ySetPixelColor(x+image.l,dscgif.scrheight-1-image.t-y,GetPixelColor(x,image.h-y-1));
- }
- }
- }
-
- prevdispmeth = gifgce.dispmeth;
-
- //restore the correct position in the file for the next image
- if (badcode){
- seek_next_image(fp,pos_start);
- } else {
- fp->Seek(-(ibfmax - ibf - 1), SEEK_CUR);
- }
-
- if (info.nFrame==iImage) bContinue=false; else iImage++;
-
- break;
- }
- case ';': //terminator
- bContinue=false;
- break;
- default:
- bPreviousWasNull = (ch==0);
- break;
- }
- }
- }
-
- if (bTrueColor>=2 && imaRGB){
- if (gifgce.transpcolflag){
- imaRGB->SetTransColor(GetPaletteColor((BYTE)info.nBkgndIndex));
- imaRGB->SetTransIndex(0);
- }
- Transfer(*imaRGB);
- }
- delete imaRGB;
-
- return true;
-
-}
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageGIF::DecodeExtension(CxFile *fp)
-{
- bool bContinue;
- unsigned char count;
- unsigned char fc;
-
- bContinue = (1 == fp->Read(&fc, sizeof(fc), 1));
- if (bContinue) {
- /* AD - for transparency */
- if (fc == 0xF9) {
- bContinue = (1 == fp->Read(&count, sizeof(count), 1));
- if (bContinue) {
- assert(sizeof(gifgce) == 4);
- bContinue = (count == fp->Read(&gifgce, 1, sizeof(gifgce)));
- if (bContinue) {
- if (gifgce.transpcolflag) info.nBkgndIndex = gifgce.transpcolindex;
- info.dwFrameDelay = gifgce.delaytime;
- m_dispmeth = gifgce.dispmeth;
- } } }
-
- if (fc == 0xFE) { // Comment block
- bContinue = (1 == fp->Read(&count, sizeof(count), 1));
- if (bContinue) {
- bContinue = (1 == fp->Read(m_comment, count, 1));
- m_comment[count]='\0';
- } }
-
- if (fc == 0xFF) { // Application Extension block
- bContinue = (1 == fp->Read(&count, sizeof(count), 1));
- if (bContinue) {
- bContinue = (count==11);
- if (bContinue){
- char AppID[11];
- bContinue = (1 == fp->Read(AppID, count, 1));
- if (bContinue) {
- bContinue = (1 == fp->Read(&count, sizeof(count), 1));
- if (bContinue) {
- BYTE* dati = (BYTE*)malloc(count);
- bContinue = (dati!=NULL);
- if (bContinue){
- bContinue = (1 == fp->Read(dati, count, 1));
- if (count>2){
- m_loops = dati[1]+256*dati[2];
- }
- }
- free(dati);
- } } } } }
-
- while (bContinue && fp->Read(&count, sizeof(count), 1) && count) {
- //log << "Skipping " << count << " bytes" << endl;
- fp->Seek(count, SEEK_CUR);
- }
- }
- return bContinue;
-
-}
-
-
-// - This external (machine specific) function is expected to return
-// either the next BYTE from the GIF file, or a negative error number.
-int CxImageGIF::get_byte(CxFile* file)
-{
- if (ibf>=GIFBUFTAM){
- // FW 06/02/98 >>>
- ibfmax = file->Read( buf , 1 , GIFBUFTAM) ;
- if( ibfmax < GIFBUFTAM ) buf[ ibfmax ] = 255 ;
- // FW 06/02/98 <<<
- ibf = 0;
- }
- if (ibf>=ibfmax) return -1; // avoid overflows
- return buf[ibf++];
-}
-////////////////////////////////////////////////////////////////////////////////
-/* - This function takes a full line of pixels (one BYTE per pixel) and
- * displays them (or does whatever your program wants with them...). It
- * should return zero, or negative if an error or some other event occurs
- * which would require aborting the decode process... Note that the length
- * passed will almost always be equal to the line length passed to the
- * decoder function, with the sole exception occurring when an ending code
- * occurs in an odd place in the GIF file... In any case, linelen will be
- * equal to the number of pixels passed...
-*/
-int CxImageGIF::out_line(CImageIterator* iter, unsigned char *pixels, int linelen)
-{
- // for 1 & 4 bpp images, the pixels are compressed
- if (head.biBitCount < 8){
- for(long x=0;x> 3);
- if (head.biBitCount==4){
- pos = (BYTE)(4*(1-x%2));
- *iDst &= ~(0x0F<SetY(iheight-iypos-1);
- iter->SetRow(pixels, linelen);
-
- if ((iypos += istep) >= iheight) {
- do {
- if (ipass++ > 0) istep /= 2;
- iypos = istep / 2;
- }
- while (iypos > iheight);
- }
- return 0;
- } else {
- if (iter->ItOK()) {
- iter->SetRow(pixels, linelen);
- (void)iter->PrevRow();
- return 0;
- } else {
- // puts("chafeo");
- return -1;
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-// SaveFile - writes GIF87a gif file
-// Randy Spann 6/15/97
-// R.Spann@ConnRiver.net
-bool CxImageGIF::Encode(CxFile * fp)
-{
- if (EncodeSafeCheck(fp)) return false;
-
- if(head.biBitCount > 8) {
- //strcpy(info.szLastError,"GIF Images must be 8 bit or less");
- //return FALSE;
- return EncodeRGB(fp);
- }
-
- EncodeHeader(fp);
-
- EncodeExtension(fp);
-
- EncodeComment(fp);
-
- EncodeBody(fp);
-
- fp->PutC(';'); // Write the GIF file terminator
-
- return true; // done!
-}
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageGIF::Encode(CxFile * fp, CxImage ** pImages, int pagecount, bool bLocalColorMap)
-{
- try{
- if (fp==NULL) throw "invalid file pointer";
- if (pImages==NULL || pagecount==0 || pImages[0]==NULL) throw "multipage GIF, no images!";
-
- CxImageGIF ghost;
-
- //write the first image
- ghost.Ghost(pImages[0]);
- ghost.EncodeHeader(fp);
-
- if (m_loops!=1){
- ghost.SetLoops(max(0,m_loops-1));
- ghost.EncodeLoopExtension(fp);
- }
-
- ghost.SetDisposalMethod(GetDisposalMethod());
- ghost.EncodeExtension(fp);
-
- EncodeComment(fp);
-
- ghost.EncodeBody(fp);
-
- for (int i=2; i<=pagecount; i++){
- if (pImages[i-1]==NULL) throw "Bad image pointer";
- ghost.Ghost(pImages[i-1]);
-
- ghost.SetDisposalMethod(GetDisposalMethod());
- ghost.EncodeExtension(fp);
-
- ghost.EncodeBody(fp,bLocalColorMap);
- }
-
- fp->PutC(';'); // Write the GIF file terminator
-
- } catch (char *message) {
- strncpy(info.szLastError,message,255);
- return false;
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::EncodeHeader(CxFile *fp)
-{
- fp->Write("GIF89a",1,6); //GIF Header
-
- Putword(head.biWidth,fp); //Logical screen descriptor
- Putword(head.biHeight,fp);
-
- BYTE Flags;
- if (head.biClrUsed==0){
- Flags=0x11;
- } else {
- Flags = 0x80;
- Flags |=(head.biBitCount - 1) << 5;
- Flags |=(head.biBitCount - 1);
- }
-
- fp->PutC(Flags); //GIF "packed fields"
- fp->PutC(0); //GIF "BackGround"
- fp->PutC(0); //GIF "pixel aspect ratio"
-
- if (head.biClrUsed!=0){
- RGBQUAD* pPal = GetPalette();
- for(DWORD i=0; iPutC(pPal[i].rgbRed);
- fp->PutC(pPal[i].rgbGreen);
- fp->PutC(pPal[i].rgbBlue);
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::EncodeExtension(CxFile *fp)
-{
- // TRK BEGIN : transparency
- fp->PutC('!');
- fp->PutC(TRANSPARENCY_CODE);
-
- gifgce.transpcolflag = (info.nBkgndIndex != -1) ? 1 : 0;
- gifgce.userinputflag = 0;
- gifgce.dispmeth = m_dispmeth;
- gifgce.res = 0;
- gifgce.delaytime = (WORD)info.dwFrameDelay;
- gifgce.transpcolindex = (BYTE)info.nBkgndIndex;
- fp->PutC(sizeof(gifgce));
- fp->Write(&gifgce, sizeof(gifgce), 1);
- fp->PutC(0);
- // TRK END
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::EncodeLoopExtension(CxFile *fp)
-{
- fp->PutC('!'); //byte 1 : 33 (hex 0x21) GIF Extension code
- fp->PutC(255); //byte 2 : 255 (hex 0xFF) Application Extension Label
- fp->PutC(11); //byte 3 : 11 (hex (0x0B) Length of Application Block (eleven bytes of data to follow)
- fp->Write("NETSCAPE2.0",11,1);
- fp->PutC(3); //byte 15 : 3 (hex 0x03) Length of Data Sub-Block (three bytes of data to follow)
- fp->PutC(1); //byte 16 : 1 (hex 0x01)
- Putword(m_loops,fp); //bytes 17 to 18 : 0 to 65535, an unsigned integer in lo-hi byte format.
- //This indicate the number of iterations the loop should be executed.
- fp->PutC(0); //bytes 19 : 0 (hex 0x00) a Data Sub-block Terminator.
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::EncodeBody(CxFile *fp, bool bLocalColorMap)
-{
- curx = 0;
- cury = head.biHeight - 1; //because we read the image bottom to top
- CountDown = (long)head.biWidth * (long)head.biHeight;
-
- fp->PutC(',');
-
- Putword(info.xOffset,fp);
- Putword(info.yOffset,fp);
- Putword(head.biWidth,fp);
- Putword(head.biHeight,fp);
-
- BYTE Flags=0x00; //non-interlaced (0x40 = interlaced) (0x80 = LocalColorMap)
- if (bLocalColorMap) { Flags|=0x80; Flags|=head.biBitCount-1; }
- fp->PutC(Flags);
-
- if (bLocalColorMap){
- Flags|=0x87;
- RGBQUAD* pPal = GetPalette();
- for(DWORD i=0; iPutC(pPal[i].rgbRed);
- fp->PutC(pPal[i].rgbGreen);
- fp->PutC(pPal[i].rgbBlue);
- }
- }
-
- int InitCodeSize = head.biBitCount <=1 ? 2 : head.biBitCount;
- // Write out the initial code size
- fp->PutC((BYTE)InitCodeSize);
-
- // Go and actually compress the data
- switch (GetCodecOption(CXIMAGE_FORMAT_GIF))
- {
- case 1: //uncompressed
- compressNONE(InitCodeSize+1, fp);
- break;
- case 2: //RLE
- compressRLE(InitCodeSize+1, fp);
- break;
- default: //LZW
- compressLZW(InitCodeSize+1, fp);
- }
-
- // Write out a Zero-length packet (to end the series)
- fp->PutC(0);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::EncodeComment(CxFile *fp)
-{
- unsigned long n = (unsigned long) strlen(m_comment);
- if (n>255) n=255;
- if (n) {
- fp->PutC('!'); //extension code:
- fp->PutC(254); //comment extension
- fp->PutC((BYTE)n); //size of comment
- fp->Write(m_comment,n,1);
- fp->PutC(0); //block terminator
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageGIF::EncodeRGB(CxFile *fp)
-{
- EncodeHeader(fp);
-
-// EncodeLoopExtension(fp);
-
- EncodeComment(fp);
-
- unsigned long w,h;
- w=h=0;
- const long cellw = 17;
- const long cellh = 15;
- CxImageGIF tmp;
- for (long y=0;yPutC(';'); // Write the GIF file terminator
-
- return true; // done!
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-// Return the next pixel from the image
-// fix for 1 & 4 bpp images
-int CxImageGIF::GifNextPixel( )
-{
- if( CountDown == 0 ) return EOF;
- --CountDown;
- int r = GetPixelIndex(curx,cury);
- // Bump the current X position
- ++curx;
- if( curx == head.biWidth ){
- curx = 0;
- cury--; //bottom to top
- }
- return r;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::Putword(int w, CxFile *fp )
-{
- fp->PutC((BYTE)(w & 0xff));
- fp->PutC((BYTE)((w / 256) & 0xff));
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::compressNONE( int init_bits, CxFile* outfile)
-{
- register long c;
- register long ent;
-
- // g_init_bits - initial number of bits
- // g_outfile - pointer to output file
- g_init_bits = init_bits;
- g_outfile = outfile;
-
- // Set up the necessary values
- cur_accum = cur_bits = clear_flg = 0;
- maxcode = (short)MAXCODE(n_bits = g_init_bits);
- code_int maxmaxcode = (code_int)1 << MAXBITSCODES;
-
- ClearCode = (1 << (init_bits - 1));
- EOFCode = ClearCode + 1;
- free_ent = (short)(ClearCode + 2);
-
- a_count=0;
- ent = GifNextPixel( );
-
- output( (code_int)ClearCode );
-
- while ( ent != EOF ) {
- c = GifNextPixel();
-
- output ( (code_int) ent );
- ent = c;
- if ( free_ent < maxmaxcode ) {
- free_ent++;
- } else {
- free_ent=(short)(ClearCode+2);
- clear_flg=1;
- output((code_int)ClearCode);
- }
- }
- // Put out the final code.
- output( (code_int) EOFCode );
-}
-////////////////////////////////////////////////////////////////////////////////
-
-/***************************************************************************
- *
- * GIFCOMPR.C - LZW GIF Image compression routines
- *
- ***************************************************************************/
-
-void CxImageGIF::compressLZW( int init_bits, CxFile* outfile)
-{
- register long fcode;
- register long c;
- register long ent;
- register long hshift;
- register long disp;
- register long i;
-
- // g_init_bits - initial number of bits
- // g_outfile - pointer to output file
- g_init_bits = init_bits;
- g_outfile = outfile;
-
- // Set up the necessary values
- cur_accum = cur_bits = clear_flg = 0;
- maxcode = (short)MAXCODE(n_bits = g_init_bits);
- code_int maxmaxcode = (code_int)1 << MAXBITSCODES;
-
- ClearCode = (1 << (init_bits - 1));
- EOFCode = ClearCode + 1;
- free_ent = (short)(ClearCode + 2);
-
- a_count=0;
- ent = GifNextPixel( );
-
- hshift = 0;
- for ( fcode = (long) HSIZE; fcode < 65536L; fcode *= 2L ) ++hshift;
- hshift = 8 - hshift; /* set hash code range bound */
- cl_hash((long)HSIZE); /* clear hash table */
- output( (code_int)ClearCode );
-
- while ( (c = GifNextPixel( )) != EOF ) {
-
- fcode = (long) (((long) c << MAXBITSCODES) + ent);
- i = (((code_int)c << hshift) ^ ent); /* xor hashing */
-
- if ( HashTabOf (i) == fcode ) {
- ent = CodeTabOf (i);
- continue;
- } else if ( (long)HashTabOf (i) < 0 ) /* empty slot */
- goto nomatch;
- disp = HSIZE - i; /* secondary hash (after G. Knott) */
- if ( i == 0 ) disp = 1;
-probe:
- if ( (i -= disp) < 0 ) i += HSIZE;
- if ( HashTabOf (i) == fcode ) { ent = CodeTabOf (i); continue; }
- if ( (long)HashTabOf (i) > 0 ) goto probe;
-nomatch:
- output ( (code_int) ent );
- ent = c;
- if ( free_ent < maxmaxcode ) {
- CodeTabOf (i) = free_ent++; /* code -> hashtable */
- HashTabOf (i) = fcode;
- } else {
- cl_hash((long)HSIZE);
- free_ent=(short)(ClearCode+2);
- clear_flg=1;
- output((code_int)ClearCode);
- }
- }
- // Put out the final code.
- output( (code_int)ent );
- output( (code_int) EOFCode );
-}
-////////////////////////////////////////////////////////////////////////////////
-
-static const unsigned long code_mask[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
- 0x001F, 0x003F, 0x007F, 0x00FF,
- 0x01FF, 0x03FF, 0x07FF, 0x0FFF,
- 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
-
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::output( code_int code)
-{
- cur_accum &= code_mask[ cur_bits ];
-
- if( cur_bits > 0 )
- cur_accum |= ((long)code << cur_bits);
- else
- cur_accum = code;
-
- cur_bits += n_bits;
-
- while( cur_bits >= 8 ) {
- char_out( (unsigned int)(cur_accum & 0xff) );
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- /*
- * If the next entry is going to be too big for the code size,
- * then increase it, if possible.
- */
-
- if ( free_ent > maxcode || clear_flg ) {
- if( clear_flg ) {
- maxcode = (short)MAXCODE(n_bits = g_init_bits);
- clear_flg = 0;
- } else {
- ++n_bits;
- if ( n_bits == MAXBITSCODES )
- maxcode = (code_int)1 << MAXBITSCODES; /* should NEVER generate this code */
- else
- maxcode = (short)MAXCODE(n_bits);
- }
- }
-
- if( code == EOFCode ) {
- // At EOF, write the rest of the buffer.
- while( cur_bits > 0 ) {
- char_out( (unsigned int)(cur_accum & 0xff) );
- cur_accum >>= 8;
- cur_bits -= 8;
- }
-
- flush_char();
- g_outfile->Flush();
-
- if(g_outfile->Error()) strcpy(info.szLastError,"Write Error in GIF file");
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-
-void CxImageGIF::cl_hash(register long hsize)
-
-{
- register long *htab_p = htab+hsize;
-
- register long i;
- register long m1 = -1L;
-
- i = hsize - 16;
-
- do {
- *(htab_p-16)=m1;
- *(htab_p-15)=m1;
- *(htab_p-14)=m1;
- *(htab_p-13)=m1;
- *(htab_p-12)=m1;
- *(htab_p-11)=m1;
- *(htab_p-10)=m1;
- *(htab_p-9)=m1;
- *(htab_p-8)=m1;
- *(htab_p-7)=m1;
- *(htab_p-6)=m1;
- *(htab_p-5)=m1;
- *(htab_p-4)=m1;
- *(htab_p-3)=m1;
- *(htab_p-2)=m1;
- *(htab_p-1)=m1;
-
- htab_p-=16;
- } while ((i-=16) >=0);
-
- for (i+=16;i>0;--i)
- *--htab_p=m1;
-}
-
-/*******************************************************************************
-* GIF specific
-*******************************************************************************/
-
-void CxImageGIF::char_out(int c)
-{
- accum[a_count++]=(char)c;
- if (a_count >=254)
- flush_char();
-}
-
-void CxImageGIF::flush_char()
-{
- if (a_count > 0) {
- g_outfile->PutC((BYTE)a_count);
- g_outfile->Write(accum,1,a_count);
- a_count=0;
- }
-}
-
-/*******************************************************************************
-* GIF decoder
-*******************************************************************************/
-/* DECODE.C - An LZW decoder for GIF
- * Copyright (C) 1987, by Steven A. Bennett
- * Copyright (C) 1994, C++ version by Alejandro Aguilar Sierra
-*
- * Permission is given by the author to freely redistribute and include
- * this code in any program as long as this credit is given where due.
- *
- * In accordance with the above, I want to credit Steve Wilhite who wrote
- * the code which this is heavily inspired by...
- *
- * GIF and 'Graphics Interchange Format' are trademarks (tm) of
- * Compuserve, Incorporated, an H&R Block Company.
- *
- * Release Notes: This file contains a decoder routine for GIF images
- * which is similar, structurally, to the original routine by Steve Wilhite.
- * It is, however, somewhat noticably faster in most cases.
- *
- */
-
-////////////////////////////////////////////////////////////////////////////////
-
-short CxImageGIF::init_exp(short size)
-{
- curr_size = (short)(size + 1);
- top_slot = (short)(1 << curr_size);
- clear = (short)(1 << size);
- ending = (short)(clear + 1);
- slot = newcodes = (short)(ending + 1);
- navail_bytes = nbits_left = 0;
-
- memset(stack,0,MAX_CODES + 1);
- memset(prefix,0,MAX_CODES + 1);
- memset(suffix,0,MAX_CODES + 1);
- return(0);
-}
-////////////////////////////////////////////////////////////////////////////////
-
-/* get_next_code()
- * - gets the next code from the GIF file. Returns the code, or else
- * a negative number in case of file errors...
- */
-short CxImageGIF::get_next_code(CxFile* file)
-{
- short i, x;
- DWORD ret;
-
- if (nbits_left == 0) {
- if (navail_bytes <= 0) {
- /* Out of bytes in current block, so read next block */
- pbytes = byte_buff;
- if ((navail_bytes = (short)get_byte(file)) < 0)
- return(navail_bytes);
- else if (navail_bytes) {
- for (i = 0; i < navail_bytes; ++i) {
- if ((x = (short)get_byte(file)) < 0) return(x);
- byte_buff[i] = (BYTE)x;
- }
- }
- }
- b1 = *pbytes++;
- nbits_left = 8;
- --navail_bytes;
- }
-
- if (navail_bytes<0) return ending; // prevent deadlocks (thanks to Mike Melnikov)
-
- ret = b1 >> (8 - nbits_left);
- while (curr_size > nbits_left){
- if (navail_bytes <= 0){
- /* Out of bytes in current block, so read next block*/
- pbytes = byte_buff;
- if ((navail_bytes = (short)get_byte(file)) < 0)
- return(navail_bytes);
- else if (navail_bytes){
- for (i = 0; i < navail_bytes; ++i){
- if ((x = (short)get_byte(file)) < 0) return(x);
- byte_buff[i] = (BYTE)x;
- }
- }
- }
- b1 = *pbytes++;
- ret |= b1 << nbits_left;
- nbits_left += 8;
- --navail_bytes;
- }
- nbits_left = (short)(nbits_left-curr_size);
- ret &= code_mask[curr_size];
- return((short)(ret));
-}
-////////////////////////////////////////////////////////////////////////////////
-
-/* short decoder(linewidth)
- * short linewidth; * Pixels per line of image *
- *
- * - This function decodes an LZW image, according to the method used
- * in the GIF spec. Every *linewidth* "characters" (ie. pixels) decoded
- * will generate a call to out_line(), which is a user specific function
- * to display a line of pixels. The function gets it's codes from
- * get_next_code() which is responsible for reading blocks of data and
- * seperating them into the proper size codes. Finally, get_byte() is
- * the global routine to read the next BYTE from the GIF file.
- *
- * It is generally a good idea to have linewidth correspond to the actual
- * width of a line (as specified in the Image header) to make your own
- * code a bit simpler, but it isn't absolutely necessary.
- *
- * Returns: 0 if successful, else negative. (See ERRS.H)
- *
- */
-/* bad_code_count is incremented each time an out of range code is read.
- * When this value is non-zero after a decode, your GIF file is probably
- * corrupt in some way...
- */
-short CxImageGIF::decoder(CxFile* file, CImageIterator* iter, short linewidth, int &bad_code_count)
-{
- register BYTE *sp, *bufptr;
- BYTE *buf;
- register short code, fc, oc, bufcnt;
- short c, size, ret;
-
- /* Initialize for decoding a new image... */
- bad_code_count = 0;
- if ((size = (short)get_byte(file)) < 0) return(size);
- if (size < 2 || 9 < size) return(BAD_CODE_SIZE);
- // out_line = outline;
- init_exp(size);
- //printf("L %d %x\n",linewidth,size);
-
- /* Initialize in case they forgot to put in a clear code.
- * (This shouldn't happen, but we'll try and decode it anyway...)
- */
- oc = fc = 0;
-
- /* Allocate space for the decode buffer */
- if ((buf = new BYTE[linewidth + 1]) == NULL) return(OUT_OF_MEMORY);
-
- /* Set up the stack pointer and decode buffer pointer */
- sp = stack;
- bufptr = buf;
- bufcnt = linewidth;
-
- /* This is the main loop. For each code we get we pass through the
- * linked list of prefix codes, pushing the corresponding "character" for
- * each code onto the stack. When the list reaches a single "character"
- * we push that on the stack too, and then start unstacking each
- * character for output in the correct order. Special handling is
- * included for the clear code, and the whole thing ends when we get
- * an ending code.
- */
- while ((c = get_next_code(file)) != ending) {
- /* If we had a file error, return without completing the decode*/
- if (c < 0){
- delete[] buf;
- return(0);
- }
- /* If the code is a clear code, reinitialize all necessary items.*/
- if (c == clear){
- curr_size = (short)(size + 1);
- slot = newcodes;
- top_slot = (short)(1 << curr_size);
-
- /* Continue reading codes until we get a non-clear code
- * (Another unlikely, but possible case...)
- */
- while ((c = get_next_code(file)) == clear);
-
- /* If we get an ending code immediately after a clear code
- * (Yet another unlikely case), then break out of the loop.
- */
- if (c == ending) break;
-
- /* Finally, if the code is beyond the range of already set codes,
- * (This one had better NOT happen... I have no idea what will
- * result from this, but I doubt it will look good...) then set it
- * to color zero.
- */
- if (c >= slot) c = 0;
- oc = fc = c;
-
- /* And let us not forget to put the char into the buffer... And
- * if, on the off chance, we were exactly one pixel from the end
- * of the line, we have to send the buffer to the out_line()
- * routine...
- */
- *bufptr++ = (BYTE)c;
- if (--bufcnt == 0) {
- if ((ret = (short)out_line(iter, buf, linewidth)) < 0) {
- delete[] buf;
- return(ret);
- }
- bufptr = buf;
- bufcnt = linewidth;
- }
- } else {
- /* In this case, it's not a clear code or an ending code, so
- * it must be a code code... So we can now decode the code into
- * a stack of character codes. (Clear as mud, right?)
- */
- code = c;
-
- /* Here we go again with one of those off chances... If, on the
- * off chance, the code we got is beyond the range of those already
- * set up (Another thing which had better NOT happen...) we trick
- * the decoder into thinking it actually got the last code read.
- * (Hmmn... I'm not sure why this works... But it does...)
- */
- if (code >= slot) {
- if (code > slot) ++bad_code_count;
- code = oc;
- *sp++ = (BYTE)fc;
- }
-
- /* Here we scan back along the linked list of prefixes, pushing
- * helpless characters (ie. suffixes) onto the stack as we do so.
- */
- while (code >= newcodes) {
- *sp++ = suffix[code];
- code = prefix[code];
- }
-
- /* Push the last character on the stack, and set up the new
- * prefix and suffix, and if the required slot number is greater
- * than that allowed by the current bit size, increase the bit
- * size. (NOTE - If we are all full, we *don't* save the new
- * suffix and prefix... I'm not certain if this is correct...
- * it might be more proper to overwrite the last code...
- */
- *sp++ = (BYTE)code;
- if (slot < top_slot){
- suffix[slot] = (BYTE)(fc = (BYTE)code);
- prefix[slot++] = oc;
- oc = c;
- }
- if (slot >= top_slot){
- if (curr_size < 12) {
- top_slot <<= 1;
- ++curr_size;
- }
- }
-
- /* Now that we've pushed the decoded string (in reverse order)
- * onto the stack, lets pop it off and put it into our decode
- * buffer... And when the decode buffer is full, write another
- * line...
- */
- while (sp > stack) {
- *bufptr++ = *(--sp);
- if (--bufcnt == 0) {
- if ((ret = (short)out_line(iter, buf, linewidth)) < 0) {
- delete[] buf;
- return(ret);
- }
- bufptr = buf;
- bufcnt = linewidth;
- }
- }
- }
- }
- ret = 0;
- if (bufcnt != linewidth)
- ret = (short)out_line(iter, buf, (linewidth - bufcnt));
- delete[] buf;
- return(ret);
-}
-////////////////////////////////////////////////////////////////////////////////
-int CxImageGIF::get_num_frames(CxFile *fp,struct_TabCol* TabColSrc,struct_dscgif* dscgif)
-{
- struct_image image;
-
- long pos=fp->Tell();
- int nframes=0;
-
- struct_TabCol TempTabCol;
- memcpy(&TempTabCol,TabColSrc,sizeof(struct_TabCol));
-
- char ch;
- bool bPreviousWasNull = true;
-
- for (BOOL bContinue = TRUE; bContinue; )
- {
- if (fp->Read(&ch, sizeof(ch), 1) != 1) {break;}
-
- if (bPreviousWasNull || ch==0)
- {
- switch (ch)
- {
- case '!': // extension
- {
- DecodeExtension(fp);
- break;
- }
- case ',': // image
- {
-
- assert(sizeof(image) == 9);
- //log << "Image header" << endl;
- fp->Read(&image,sizeof(image),1);
-
- //avoid byte order problems with Solaris
- BYTE *byteData = (BYTE *) & image;
- image.l = byteData[0]+byteData[1]*256;
- image.t = byteData[2]+byteData[3]*256;
- image.w = byteData[4]+byteData[5]*256;
- image.h = byteData[6]+byteData[7]*256;
-
- if (((image.l + image.w) > dscgif->scrwidth)||((image.t + image.h) > dscgif->scrheight))
- break;
-
- nframes++;
-
- // Local colour map?
- if (image.pf & 0x80) {
- TempTabCol.sogct = (short)(1 << ((image.pf & 0x07) +1));
- assert(3 == sizeof(struct rgb_color));
- fp->Read(TempTabCol.paleta,sizeof(struct rgb_color)*TempTabCol.sogct,1);
- //log << "Local colour map" << endl;
- }
-
- int bpp; // select the correct bit per pixel value
- if (TempTabCol.sogct <= 2) bpp = 1;
- else if (TempTabCol.sogct <= 16) bpp = 4;
- else bpp = 8;
-
- Create(image.w, image.h, bpp, CXIMAGE_FORMAT_GIF);
-
- CImageIterator* iter = new CImageIterator(this);
- iter->Upset();
- int badcode=0;
- ibf = GIFBUFTAM+1;
-
- interlaced = image.pf & 0x40;
- iheight = image.h;
- istep = 8;
- iypos = 0;
- ipass = 0;
-
- long pos_start = fp->Tell();
-
- //if (interlaced) log << "Interlaced" << endl;
- decoder(fp, iter, image.w, badcode);
- delete iter;
-
- if (badcode){
- seek_next_image(fp,pos_start);
- } else {
- fp->Seek(-(ibfmax - ibf - 1), SEEK_CUR);
- }
-
- break;
- }
- case ';': //terminator
- bContinue=false;
- break;
- default:
- bPreviousWasNull = (ch==0);
- break;
- }
- }
- }
-
- fp->Seek(pos,SEEK_SET);
- return nframes;
-}
-////////////////////////////////////////////////////////////////////////////////
-long CxImageGIF::seek_next_image(CxFile* fp, long position)
-{
- fp->Seek(position, SEEK_SET);
- char ch1,ch2;
- ch1=ch2=0;
- while(fp->Read(&ch2,sizeof(char),1)>0){
- if (ch1 == 0 && ch2 == ','){
- fp->Seek(-1,SEEK_CUR);
- return fp->Tell();
- } else {
- ch1 = ch2;
- }
- }
- return -1;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::SetDisposalMethod(int dm)
-{ m_dispmeth=dm; }
-////////////////////////////////////////////////////////////////////////////////
-long CxImageGIF::GetDisposalMethod()
-{ return m_dispmeth; }
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::SetLoops(int loops)
-{ m_loops=loops; }
-////////////////////////////////////////////////////////////////////////////////
-long CxImageGIF::GetLoops()
-{ return m_loops; }
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::SetComment(const char* sz_comment_in)
-{ if (sz_comment_in) strncpy(m_comment,sz_comment_in,255); }
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::GetComment(char* sz_comment_out)
-{ if (sz_comment_out) strncpy(sz_comment_out,m_comment,255); }
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::GifMix(CxImage & imgsrc2, struct_image & imgdesc)
-{
- long ymin = max(0,(long)(GetHeight()-imgdesc.t - imgdesc.h));
- long ymax = GetHeight()-imgdesc.t;
- long xmin = imgdesc.l;
- long xmax = min(GetWidth(), (DWORD)(imgdesc.l + imgdesc.w));
-
- long ibg2= imgsrc2.GetTransIndex();
- BYTE i2;
-
- for(long y = ymin; y < ymax; y++){
- for(long x = xmin; x < xmax; x++){
- i2 = imgsrc2.GetPixelIndex(x-xmin,y-ymin);
- if(i2!=ibg2) SetPixelIndex(x,y,i2);
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/*-----------------------------------------------------------------------
- *
- * miGIF Compression - mouse and ivo's GIF-compatible compression
- *
- * -run length encoding compression routines-
- *
- * Copyright (C) 1998 Hutchison Avenue Software Corporation
- * http://www.hasc.com
- * info@hasc.com
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. This software is provided "AS IS." The Hutchison Avenue
- * Software Corporation disclaims all warranties, either express or implied,
- * including but not limited to implied warranties of merchantability and
- * fitness for a particular purpose, with respect to this code and accompanying
- * documentation.
- *
- * The miGIF compression routines do not, strictly speaking, generate files
- * conforming to the GIF spec, since the image data is not LZW-compressed
- * (this is the point: in order to avoid transgression of the Unisys patent
- * on the LZW algorithm.) However, miGIF generates data streams that any
- * reasonably sane LZW decompresser will decompress to what we want.
- *
- * miGIF compression uses run length encoding. It compresses horizontal runs
- * of pixels of the same color. This type of compression gives good results
- * on images with many runs, for example images with lines, text and solid
- * shapes on a solid-colored background. It gives little or no compression
- * on images with few runs, for example digital or scanned photos.
- *
- * der Mouse
- * mouse@rodents.montreal.qc.ca
- * 7D C8 61 52 5D E7 2D 39 4E F1 31 3E E8 B3 27 4B
- *
- * ivo@hasc.com
- *
- * The Graphics Interchange Format(c) is the Copyright property of
- * CompuServe Incorporated. GIF(sm) is a Service Mark property of
- * CompuServe Incorporated.
- *
- */
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_clear(struct_RLE* rle)
-{
- rle->out_bits = rle->out_bits_init;
- rle->out_bump = rle->out_bump_init;
- rle->out_clear = rle->out_clear_init;
- rle->out_count = 0;
- rle->rl_table_max = 0;
- rle->just_cleared = 1;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_flush(struct_RLE* rle)
-{
- if (rle->rl_count == 1){
- rle_output_plain(rle->rl_pixel,rle);
- rle->rl_count = 0;
- return;
- }
- if (rle->just_cleared){
- rle_flush_fromclear(rle->rl_count,rle);
- } else if ((rle->rl_table_max < 2) || (rle->rl_table_pixel != rle->rl_pixel)) {
- rle_flush_clearorrep(rle->rl_count,rle);
- } else {
- rle_flush_withtable(rle->rl_count,rle);
- }
- rle->rl_count = 0;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_output_plain(int c,struct_RLE* rle)
-{
- rle->just_cleared = 0;
- rle_output(c,rle);
- rle->out_count++;
- if (rle->out_count >= rle->out_bump){
- rle->out_bits ++;
- rle->out_bump += 1 << (rle->out_bits - 1);
- }
- if (rle->out_count >= rle->out_clear){
- rle_output(rle->code_clear,rle);
- rle_clear(rle);
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_flush_fromclear(int count,struct_RLE* rle)
-{
- int n;
-
- rle->out_clear = rle->max_ocodes;
- rle->rl_table_pixel = rle->rl_pixel;
- n = 1;
- while (count > 0){
- if (n == 1){
- rle->rl_table_max = 1;
- rle_output_plain(rle->rl_pixel,rle);
- count --;
- } else if (count >= n){
- rle->rl_table_max = n;
- rle_output_plain(rle->rl_basecode+n-2,rle);
- count -= n;
- } else if (count == 1){
- rle->rl_table_max ++;
- rle_output_plain(rle->rl_pixel,rle);
- count = 0;
- } else {
- rle->rl_table_max ++;
- rle_output_plain(rle->rl_basecode+count-2,rle);
- count = 0;
- }
- if (rle->out_count == 0) n = 1; else n ++;
- }
- rle_reset_out_clear(rle);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_reset_out_clear(struct_RLE* rle)
-{
- rle->out_clear = rle->out_clear_init;
- if (rle->out_count >= rle->out_clear){
- rle_output(rle->code_clear,rle);
- rle_clear(rle);
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_flush_withtable(int count, struct_RLE* rle)
-{
- int repmax;
- int repleft;
- int leftover;
-
- repmax = count / rle->rl_table_max;
- leftover = count % rle->rl_table_max;
- repleft = (leftover ? 1 : 0);
- if (rle->out_count+repmax+repleft > rle->max_ocodes){
- repmax = rle->max_ocodes - rle->out_count;
- leftover = count - (repmax * rle->rl_table_max);
- repleft = 1 + rle_compute_triangle_count(leftover,rle->max_ocodes);
- }
- if (1+rle_compute_triangle_count(count,rle->max_ocodes) < (unsigned int)(repmax+repleft)){
- rle_output(rle->code_clear,rle);
- rle_clear(rle);
- rle_flush_fromclear(count,rle);
- return;
- }
- rle->out_clear = rle->max_ocodes;
- for (;repmax>0;repmax--) rle_output_plain(rle->rl_basecode+rle->rl_table_max-2,rle);
- if (leftover){
- if (rle->just_cleared){
- rle_flush_fromclear(leftover,rle);
- } else if (leftover == 1){
- rle_output_plain(rle->rl_pixel,rle);
- } else {
- rle_output_plain(rle->rl_basecode+leftover-2,rle);
- }
- }
- rle_reset_out_clear(rle);
-}
-////////////////////////////////////////////////////////////////////////////////
-unsigned int CxImageGIF::rle_compute_triangle_count(unsigned int count, unsigned int nrepcodes)
-{
- unsigned int perrep;
- unsigned int cost;
-
- cost = 0;
- perrep = (nrepcodes * (nrepcodes+1)) / 2;
- while (count >= perrep){
- cost += nrepcodes;
- count -= perrep;
- }
- if (count > 0){
- unsigned int n;
- n = rle_isqrt(count);
- while ((n*(n+1)) >= 2*count) n --;
- while ((n*(n+1)) < 2*count) n ++;
- cost += n;
- }
- return(cost);
-}
-////////////////////////////////////////////////////////////////////////////////
-unsigned int CxImageGIF::rle_isqrt(unsigned int x)
-{
- unsigned int r;
- unsigned int v;
-
- if (x < 2) return(x);
- for (v=x,r=1;v;v>>=2,r<<=1) ;
- while (1){
- v = ((x / r) + r) / 2;
- if ((v == r) || (v == r+1)) return(r);
- r = v;
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_flush_clearorrep(int count, struct_RLE* rle)
-{
- int withclr;
- withclr = 1 + rle_compute_triangle_count(count,rle->max_ocodes);
- if (withclr < count) {
- rle_output(rle->code_clear,rle);
- rle_clear(rle);
- rle_flush_fromclear(count,rle);
- } else {
- for (;count>0;count--) rle_output_plain(rle->rl_pixel,rle);
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_write_block(struct_RLE* rle)
-{
- g_outfile->PutC((BYTE)rle->oblen);
- g_outfile->Write(rle->oblock,1,rle->oblen);
- rle->oblen = 0;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_block_out(unsigned char c, struct_RLE* rle)
-{
- rle->oblock[rle->oblen++] = c;
- if (rle->oblen >= 255) rle_write_block(rle);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_block_flush(struct_RLE* rle)
-{
- if (rle->oblen > 0) rle_write_block(rle);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_output(int val, struct_RLE* rle)
-{
- rle->obuf |= val << rle->obits;
- rle->obits += rle->out_bits;
- while (rle->obits >= 8){
- rle_block_out(rle->obuf&0xff,rle);
- rle->obuf >>= 8;
- rle->obits -= 8;
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::rle_output_flush(struct_RLE* rle)
-{
- if (rle->obits > 0) rle_block_out(rle->obuf,rle);
- rle_block_flush(rle);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageGIF::compressRLE( int init_bits, CxFile* outfile)
-{
- g_init_bits = init_bits;
- g_outfile = outfile;
-
- struct_RLE rle;
- rle.code_clear = 1 << (init_bits - 1);
- rle.code_eof = rle.code_clear + 1;
- rle.rl_basecode = rle.code_eof + 1;
- rle.out_bump_init = (1 << (init_bits - 1)) - 1;
- rle.out_clear_init = (init_bits <= 3) ? 9 : (rle.out_bump_init-1);
- rle.out_bits_init = init_bits;
- rle.max_ocodes = (1 << MAXBITSCODES) - ((1 << (rle.out_bits_init - 1)) + 3);
- rle.rl_count = 0;
- rle_clear(&rle);
- rle.obuf = 0;
- rle.obits = 0;
- rle.oblen = 0;
-
- rle_output(rle.code_clear,&rle);
-
- int c;
- while (1){
- c = GifNextPixel();
- if ((rle.rl_count > 0) && (c != rle.rl_pixel)) rle_flush(&rle);
- if (c == EOF) break;
- if (rle.rl_pixel == c){
- rle.rl_count++;
- } else {
- rle.rl_pixel = c;
- rle.rl_count = 1;
- }
- }
- rle_output(rle.code_eof,&rle);
- rle_output_flush(&rle);
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_GIF
diff --git a/src/win32/dependencies/cximage/ximagif.h b/src/win32/dependencies/cximage/ximagif.h
deleted file mode 100644
index cd4f4516..00000000
--- a/src/win32/dependencies/cximage/ximagif.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * File: ximagif.h
- * Purpose: GIF Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageGIF (c) 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * Special thanks to Troels Knakkergaard for new features, enhancements and bugfixes
- *
- * original CImageGIF and CImageIterator implementation are:
- * Copyright: (c) 1995, Alejandro Aguilar Sierra
- *
- * 6/15/97 Randy Spann: Added GIF87a writing support
- * R.Spann@ConnRiver.net
- *
- * DECODE.C - An LZW decoder for GIF
- * Copyright (C) 1987, by Steven A. Bennett
- * Copyright (C) 1994, C++ version by Alejandro Aguilar Sierra
- *
- * In accordance with the above, I want to credit Steve Wilhite who wrote
- * the code which this is heavily inspired by...
- *
- * GIF and 'Graphics Interchange Format' are trademarks (tm) of
- * Compuserve, Incorporated, an H&R Block Company.
- *
- * Release Notes: This file contains a decoder routine for GIF images
- * which is similar, structurally, to the original routine by Steve Wilhite.
- * It is, however, somewhat noticably faster in most cases.
- *
- * ==========================================================
- */
-
-#if !defined(__ximaGIF_h)
-#define __ximaGIF_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_GIF
-
-typedef short int code_int;
-
-/* Various error codes used by decoder */
-#define OUT_OF_MEMORY -10
-#define BAD_CODE_SIZE -20
-#define READ_ERROR -1
-#define WRITE_ERROR -2
-#define OPEN_ERROR -3
-#define CREATE_ERROR -4
-#define MAX_CODES 4095
-#define GIFBUFTAM 16383
-#define TRANSPARENCY_CODE 0xF9
-
-//LZW GIF Image compression
-#define MAXBITSCODES 12
-#define HSIZE 5003 /* 80% occupancy */
-#define MAXCODE(n_bits) (((code_int) 1 << (n_bits)) - 1)
-#define HashTabOf(i) htab[i]
-#define CodeTabOf(i) codetab[i]
-
-
-class CImageIterator;
-class DLL_EXP CxImageGIF: public CxImage
-{
-#pragma pack(1)
-
-typedef struct tag_gifgce{
- BYTE transpcolflag:1;
- BYTE userinputflag:1;
- BYTE dispmeth:3;
- BYTE res:3;
- WORD delaytime;
- BYTE transpcolindex;
-} struct_gifgce;
-
-typedef struct tag_dscgif{ /* Logic Screen Descriptor */
- char header[6]; /* Firma and version */
- WORD scrwidth;
- WORD scrheight;
- char pflds;
- char bcindx;
- char pxasrat;
-} struct_dscgif;
-
-typedef struct tag_image{ /* Image Descriptor */
- WORD l;
- WORD t;
- WORD w;
- WORD h;
- BYTE pf;
-} struct_image;
-
-typedef struct tag_TabCol{ /* Tabla de colores */
- short colres; /* color resolution */
- short sogct; /* size of global color table */
- rgb_color paleta[256]; /* paleta */
-} struct_TabCol;
-
-typedef struct tag_RLE{
- int rl_pixel;
- int rl_basecode;
- int rl_count;
- int rl_table_pixel;
- int rl_table_max;
- int just_cleared;
- int out_bits;
- int out_bits_init;
- int out_count;
- int out_bump;
- int out_bump_init;
- int out_clear;
- int out_clear_init;
- int max_ocodes;
- int code_clear;
- int code_eof;
- unsigned int obuf;
- int obits;
- unsigned char oblock[256];
- int oblen;
-} struct_RLE;
-#pragma pack()
-
-public:
- CxImageGIF(): CxImage(CXIMAGE_FORMAT_GIF) {m_loops=0; m_dispmeth=0; m_comment[0]='\0';}
-
-// bool Load(const char * imageFileName){ return CxImage::Load(imageFileName,CXIMAGE_FORMAT_GIF);}
-// bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,CXIMAGE_FORMAT_GIF);}
-
- bool Decode(CxFile * fp);
- bool Decode(FILE *fp) { CxIOFile file(fp); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * fp);
- bool Encode(CxFile * fp, CxImage ** pImages, int pagecount, bool bLocalColorMap = false);
- bool Encode(FILE *fp) { CxIOFile file(fp); return Encode(&file); }
- bool Encode(FILE *fp, CxImage ** pImages, int pagecount, bool bLocalColorMap = false)
- { CxIOFile file(fp); return Encode(&file, pImages, pagecount, bLocalColorMap); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-
- void SetLoops(int loops);
- long GetLoops();
- void SetComment(const char* sz_comment_in);
- void GetComment(char* sz_comment_out);
- void SetDisposalMethod(int dm);
- long GetDisposalMethod();
-
-protected:
- bool DecodeExtension(CxFile *fp);
- void EncodeHeader(CxFile *fp);
- void EncodeLoopExtension(CxFile *fp);
- void EncodeExtension(CxFile *fp);
- void EncodeBody(CxFile *fp, bool bLocalColorMap = false);
- void EncodeComment(CxFile *fp);
- bool EncodeRGB(CxFile *fp);
- void GifMix(CxImage & imgsrc2, struct_image & imgdesc);
-
- struct_gifgce gifgce;
-
- int curx, cury;
- long CountDown;
- unsigned long cur_accum;
- int cur_bits;
- int interlaced, iypos, istep, iheight, ipass;
- int ibf;
- int ibfmax;
- BYTE buf[GIFBUFTAM + 1];
-// Implementation
- int GifNextPixel ();
- void Putword (int w, CxFile* fp );
- void compressNONE (int init_bits, CxFile* outfile);
- void compressLZW (int init_bits, CxFile* outfile);
- void output (code_int code );
- void cl_hash (long hsize);
- void char_out (int c);
- void flush_char ();
- short init_exp(short size);
- short get_next_code(CxFile*);
- short decoder(CxFile*, CImageIterator* iter, short linewidth, int &bad_code_count);
- int get_byte(CxFile*);
- int out_line(CImageIterator* iter, unsigned char *pixels, int linelen);
- int get_num_frames(CxFile *f,struct_TabCol* TabColSrc,struct_dscgif* dscgif);
- long seek_next_image(CxFile* fp, long position);
-
- short curr_size; /* The current code size */
- short clear; /* Value for a clear code */
- short ending; /* Value for a ending code */
- short newcodes; /* First available code */
- short top_slot; /* Highest code for current size */
- short slot; /* Last read code */
-
- /* The following static variables are used
- * for seperating out codes */
- short navail_bytes; /* # bytes left in block */
- short nbits_left; /* # bits left in current BYTE */
- BYTE b1; /* Current BYTE */
- BYTE byte_buff[257]; /* Current block */
- BYTE *pbytes; /* Pointer to next BYTE in block */
- /* The reason we have these seperated like this instead of using
- * a structure like the original Wilhite code did, is because this
- * stuff generally produces significantly faster code when compiled...
- * This code is full of similar speedups... (For a good book on writing
- * C for speed or for space optomisation, see Efficient C by Tom Plum,
- * published by Plum-Hall Associates...)
- */
- BYTE stack[MAX_CODES + 1]; /* Stack for storing pixels */
- BYTE suffix[MAX_CODES + 1]; /* Suffix table */
- WORD prefix[MAX_CODES + 1]; /* Prefix linked list */
-
-//LZW GIF Image compression routines
- long htab [HSIZE];
- unsigned short codetab [HSIZE];
- int n_bits; /* number of bits/code */
- code_int maxcode; /* maximum code, given n_bits */
- code_int free_ent; /* first unused entry */
- int clear_flg;
- int g_init_bits;
- CxFile* g_outfile;
- int ClearCode;
- int EOFCode;
-
- int a_count;
- char accum[256];
-
- char m_comment[256];
- int m_loops;
- int m_dispmeth;
-
-//RLE compression routines
- void compressRLE( int init_bits, CxFile* outfile);
- void rle_clear(struct_RLE* rle);
- void rle_flush(struct_RLE* rle);
- void rle_flush_withtable(int count, struct_RLE* rle);
- void rle_flush_clearorrep(int count, struct_RLE* rle);
- void rle_flush_fromclear(int count,struct_RLE* rle);
- void rle_output_plain(int c,struct_RLE* rle);
- void rle_reset_out_clear(struct_RLE* rle);
- unsigned int rle_compute_triangle_count(unsigned int count, unsigned int nrepcodes);
- unsigned int rle_isqrt(unsigned int x);
- void rle_write_block(struct_RLE* rle);
- void rle_block_out(unsigned char c, struct_RLE* rle);
- void rle_block_flush(struct_RLE* rle);
- void rle_output(int val, struct_RLE* rle);
- void rle_output_flush(struct_RLE* rle);
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximahist.cpp b/src/win32/dependencies/cximage/ximahist.cpp
deleted file mode 100644
index 8e3542f0..00000000
--- a/src/win32/dependencies/cximage/ximahist.cpp
+++ /dev/null
@@ -1,649 +0,0 @@
-// xImaHist.cpp : histogram functions
-/* 28/01/2004 v1.00 - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_DSP
-
-////////////////////////////////////////////////////////////////////////////////
-long CxImage::Histogram(long* red, long* green, long* blue, long* gray, long colorspace)
-{
- if (!pDib) return 0;
- RGBQUAD color;
-
- if (red) memset(red,0,256*sizeof(long));
- if (green) memset(green,0,256*sizeof(long));
- if (blue) memset(blue,0,256*sizeof(long));
- if (gray) memset(gray,0,256*sizeof(long));
-
- long xmin,xmax,ymin,ymax;
- if (pSelection){
- xmin = info.rSelectionBox.left; xmax = info.rSelectionBox.right;
- ymin = info.rSelectionBox.bottom; ymax = info.rSelectionBox.top;
- } else {
- xmin = ymin = 0;
- xmax = head.biWidth; ymax=head.biHeight;
- }
-
- for(long y=ymin; yn) n=red[i];
- if (green && green[i]>n) n=green[i];
- if (blue && blue[i]>n) n=blue[i];
- if (gray && gray[i]>n) n=gray[i];
- }
-
- return n;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * HistogramStretch
- * \param method: 0 = luminance (default), 1 = linked channels , 2 = independent channels.
- * \return true if everything is ok
- * \author [dave] and [nipper]
- */
-bool CxImage::HistogramStretch(long method)
-{
- if (!pDib) return false;
-
- if ((head.biBitCount==8) && IsGrayScale()){
- // get min/max info
- BYTE minc = 255, maxc = 0;
- BYTE gray;
- long y;
-
- double dbScaler = 50.0/head.biHeight;
-
- for (y=0; y maxc) maxc = gray;
- }
- }
-
- if (minc == 0 && maxc == 255) return true;
-
- // calculate LUT
- BYTE lut[256];
- BYTE range = maxc - minc;
- if (range != 0){
- for (long x = minc; x <= maxc; x++){
- lut[x] = (BYTE)(255 * (x - minc) / range);
- }
- } else lut[minc] = minc;
-
- for (y=0; y
- // get min/max info
- BYTE minc = 255, maxc = 0;
- RGBQUAD color;
- long y;
-
- for (y=0; y maxc) maxc = color.rgbRed;
- if (color.rgbBlue > maxc) maxc = color.rgbBlue;
- if (color.rgbGreen > maxc) maxc = color.rgbGreen;
- }
- }
-
- if (minc == 0 && maxc == 255)
- return true;
-
- // calculate LUT
- BYTE lut[256];
- BYTE range = maxc - minc;
-
- if (range != 0){
- for (long x = minc; x <= maxc; x++){
- lut[x] = (BYTE)(255 * (x - minc) / range);
- }
- } else lut[minc] = minc;
-
- // normalize image
- double dbScaler = 100.0/head.biHeight;
-
- for (y=0; y
- // get min/max info
- BYTE minR = 255, maxR = 0;
- BYTE minG = 255, maxG = 0;
- BYTE minB = 255, maxB = 0;
- RGBQUAD color;
- long y;
-
- for (y=0; y maxR) maxR = color.rgbRed;
- if (color.rgbBlue > maxB) maxB = color.rgbBlue;
- if (color.rgbGreen > maxG) maxG = color.rgbGreen;
- }
- }
-
- if (minR == 0 && maxR == 255 && minG == 0 && maxG == 255 && minB == 0 && maxB == 255)
- return true;
-
- // calculate LUT
- BYTE lutR[256];
- BYTE range = maxR - minR;
- if (range != 0) {
- for (long x = minR; x <= maxR; x++){
- lutR[x] = (BYTE)(255 * (x - minR) / range);
- }
- } else lutR[minR] = minR;
-
- BYTE lutG[256];
- range = maxG - minG;
- if (range != 0) {
- for (long x = minG; x <= maxG; x++){
- lutG[x] = (BYTE)(255 * (x - minG) / range);
- }
- } else lutG[minG] = minG;
-
- BYTE lutB[256];
- range = maxB - minB;
- if (range != 0) {
- for (long x = minB; x <= maxB; x++){
- lutB[x] = (BYTE)(255 * (x - minB) / range);
- }
- } else lutB[minB] = minB;
-
- // normalize image
- double dbScaler = 100.0/head.biHeight;
-
- for (y=0; y
- // S = ( R - C ) ( B - A / D - C )
- double alimit = 0.0;
- double blimit = 255.0;
- double lowerc = 255.0;
- double upperd = 0.0;
- double tmpGray;
-
- RGBQUAD color;
- RGBQUAD yuvClr;
- double stretcheds;
-
- if ( head.biClrUsed == 0 ){
- long x, y, xmin, xmax, ymin, ymax;
- xmin = ymin = 0;
- xmax = head.biWidth;
- ymax = head.biHeight;
-
- for( y = ymin; y < ymax; y++ ){
- info.nProgress = (long)(50*y/ymax);
- if (info.nEscape) break;
- for( x = xmin; x < xmax; x++ ){
- color = GetPixelColor( x, y );
- tmpGray = RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- if ( tmpGray < lowerc ) lowerc = tmpGray;
- if ( tmpGray > upperd ) upperd = tmpGray;
- }
- }
- if (upperd==lowerc) return false;
-
- for( y = ymin; y < ymax; y++ ){
- info.nProgress = (long)(50+50*y/ymax);
- if (info.nEscape) break;
- for( x = xmin; x < xmax; x++ ){
-
- color = GetPixelColor( x, y );
- yuvClr = RGBtoYUV(color);
-
- // Stretch Luminance
- tmpGray = (double)yuvClr.rgbRed;
- stretcheds = (double)(tmpGray - lowerc) * ( (blimit - alimit) / (upperd - lowerc) ); // + alimit;
- if ( stretcheds < 0.0 ) stretcheds = 0.0;
- else if ( stretcheds > 255.0 ) stretcheds = 255.0;
- yuvClr.rgbRed = (BYTE)stretcheds;
-
- color = YUVtoRGB(yuvClr);
- SetPixelColor( x, y, color );
- }
- }
- } else {
- DWORD j;
- for( j = 0; j < head.biClrUsed; j++ ){
- color = GetPaletteColor( (BYTE)j );
- tmpGray = RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- if ( tmpGray < lowerc ) lowerc = tmpGray;
- if ( tmpGray > upperd ) upperd = tmpGray;
- }
- if (upperd==lowerc) return false;
-
- for( j = 0; j < head.biClrUsed; j++ ){
-
- color = GetPaletteColor( (BYTE)j );
- yuvClr = RGBtoYUV( color );
-
- // Stretch Luminance
- tmpGray = (double)yuvClr.rgbRed;
- stretcheds = (double)(tmpGray - lowerc) * ( (blimit - alimit) / (upperd - lowerc) ); // + alimit;
- if ( stretcheds < 0.0 ) stretcheds = 0.0;
- else if ( stretcheds > 255.0 ) stretcheds = 255.0;
- yuvClr.rgbRed = (BYTE)stretcheds;
-
- color = YUVtoRGB(yuvClr);
- SetPaletteColor( (BYTE)j, color );
- }
- }
- }
- }
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-// HistogramEqualize function by : dave(at)posortho(dot)com
-bool CxImage::HistogramEqualize()
-{
- if (!pDib) return false;
-
- int histogram[256];
- int map[256];
- int equalize_map[256];
- int x, y, i, j;
- RGBQUAD color;
- RGBQUAD yuvClr;
- unsigned int YVal, high, low;
-
- memset( &histogram, 0, sizeof(int) * 256 );
- memset( &map, 0, sizeof(int) * 256 );
- memset( &equalize_map, 0, sizeof(int) * 256 );
-
- // form histogram
- for(y=0; y < head.biHeight; y++){
- info.nProgress = (long)(50*y/head.biHeight);
- if (info.nEscape) break;
- for(x=0; x < head.biWidth; x++){
- color = GetPixelColor( x, y );
- YVal = (unsigned int)RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- histogram[YVal]++;
- }
- }
-
- // integrate the histogram to get the equalization map.
- j = 0;
- for(i=0; i <= 255; i++){
- j += histogram[i];
- map[i] = j;
- }
-
- // equalize
- low = map[0];
- high = map[255];
- if (low == high) return false;
- for( i = 0; i <= 255; i++ ){
- equalize_map[i] = (unsigned int)((((double)( map[i] - low ) ) * 255) / ( high - low ) );
- }
-
- // stretch the histogram
- if(head.biClrUsed == 0){ // No Palette
- for( y = 0; y < head.biHeight; y++ ){
- info.nProgress = (long)(50+50*y/head.biHeight);
- if (info.nEscape) break;
- for( x = 0; x < head.biWidth; x++ ){
-
- color = GetPixelColor( x, y );
- yuvClr = RGBtoYUV(color);
-
- yuvClr.rgbRed = (BYTE)equalize_map[yuvClr.rgbRed];
-
- color = YUVtoRGB(yuvClr);
- SetPixelColor( x, y, color );
- }
- }
- } else { // Palette
- for( i = 0; i < (int)head.biClrUsed; i++ ){
-
- color = GetPaletteColor((BYTE)i);
- yuvClr = RGBtoYUV(color);
-
- yuvClr.rgbRed = (BYTE)equalize_map[yuvClr.rgbRed];
-
- color = YUVtoRGB(yuvClr);
- SetPaletteColor( (BYTE)i, color );
- }
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-// HistogramNormalize function by : dave(at)posortho(dot)com
-bool CxImage::HistogramNormalize()
-{
- if (!pDib) return false;
-
- int histogram[256];
- int threshold_intensity, intense;
- int x, y, i;
- unsigned int normalize_map[256];
- unsigned int high, low, YVal;
-
- RGBQUAD color;
- RGBQUAD yuvClr;
-
- memset( &histogram, 0, sizeof( int ) * 256 );
- memset( &normalize_map, 0, sizeof( unsigned int ) * 256 );
-
- // form histogram
- for(y=0; y < head.biHeight; y++){
- info.nProgress = (long)(50*y/head.biHeight);
- if (info.nEscape) break;
- for(x=0; x < head.biWidth; x++){
- color = GetPixelColor( x, y );
- YVal = (unsigned int)RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- histogram[YVal]++;
- }
- }
-
- // find histogram boundaries by locating the 1 percent levels
- threshold_intensity = ( head.biWidth * head.biHeight) / 100;
-
- intense = 0;
- for( low = 0; low < 255; low++ ){
- intense += histogram[low];
- if( intense > threshold_intensity ) break;
- }
-
- intense = 0;
- for( high = 255; high != 0; high--){
- intense += histogram[ high ];
- if( intense > threshold_intensity ) break;
- }
-
- if ( low == high ){
- // Unreasonable contrast; use zero threshold to determine boundaries.
- threshold_intensity = 0;
- intense = 0;
- for( low = 0; low < 255; low++){
- intense += histogram[low];
- if( intense > threshold_intensity ) break;
- }
- intense = 0;
- for( high = 255; high != 0; high-- ){
- intense += histogram [high ];
- if( intense > threshold_intensity ) break;
- }
- }
- if( low == high ) return false; // zero span bound
-
- // Stretch the histogram to create the normalized image mapping.
- for(i = 0; i <= 255; i++){
- if ( i < (int) low ){
- normalize_map[i] = 0;
- } else {
- if(i > (int) high)
- normalize_map[i] = 255;
- else
- normalize_map[i] = ( 255 - 1) * ( i - low) / ( high - low );
- }
- }
-
- // Normalize
- if( head.biClrUsed == 0 ){
- for( y = 0; y < head.biHeight; y++ ){
- info.nProgress = (long)(50+50*y/head.biHeight);
- if (info.nEscape) break;
- for( x = 0; x < head.biWidth; x++ ){
-
- color = GetPixelColor( x, y );
- yuvClr = RGBtoYUV( color );
-
- yuvClr.rgbRed = (BYTE)normalize_map[yuvClr.rgbRed];
-
- color = YUVtoRGB( yuvClr );
- SetPixelColor( x, y, color );
- }
- }
- } else {
- for(i = 0; i < (int)head.biClrUsed; i++){
-
- color = GetPaletteColor( (BYTE)i );
- yuvClr = RGBtoYUV( color );
-
- yuvClr.rgbRed = (BYTE)normalize_map[yuvClr.rgbRed];
-
- color = YUVtoRGB( yuvClr );
- SetPaletteColor( (BYTE)i, color );
- }
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-// HistogramLog function by : dave(at)posortho(dot)com
-bool CxImage::HistogramLog()
-{
- if (!pDib) return false;
-
- //q(i,j) = 255/log(1 + |high|) * log(1 + |p(i,j)|);
- int x, y, i;
- RGBQUAD color;
- RGBQUAD yuvClr;
-
- unsigned int YVal, high = 1;
-
- // Find Highest Luminance Value in the Image
- if( head.biClrUsed == 0 ){ // No Palette
- for(y=0; y < head.biHeight; y++){
- info.nProgress = (long)(50*y/head.biHeight);
- if (info.nEscape) break;
- for(x=0; x < head.biWidth; x++){
- color = GetPixelColor( x, y );
- YVal = (unsigned int)RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- if (YVal > high ) high = YVal;
- }
- }
- } else { // Palette
- for(i = 0; i < (int)head.biClrUsed; i++){
- color = GetPaletteColor((BYTE)i);
- YVal = (unsigned int)RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- if (YVal > high ) high = YVal;
- }
- }
-
- // Logarithm Operator
- double k = 255.0 / ::log( 1.0 + (double)high );
- if( head.biClrUsed == 0 ){
- for( y = 0; y < head.biHeight; y++ ){
- info.nProgress = (long)(50+50*y/head.biHeight);
- if (info.nEscape) break;
- for( x = 0; x < head.biWidth; x++ ){
-
- color = GetPixelColor( x, y );
- yuvClr = RGBtoYUV( color );
-
- yuvClr.rgbRed = (BYTE)(k * ::log( 1.0 + (double)yuvClr.rgbRed ) );
-
- color = YUVtoRGB( yuvClr );
- SetPixelColor( x, y, color );
- }
- }
- } else {
- for(i = 0; i < (int)head.biClrUsed; i++){
-
- color = GetPaletteColor( (BYTE)i );
- yuvClr = RGBtoYUV( color );
-
- yuvClr.rgbRed = (BYTE)(k * ::log( 1.0 + (double)yuvClr.rgbRed ) );
-
- color = YUVtoRGB( yuvClr );
- SetPaletteColor( (BYTE)i, color );
- }
- }
-
- return true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// HistogramRoot function by : dave(at)posortho(dot)com
-bool CxImage::HistogramRoot()
-{
- if (!pDib) return false;
- //q(i,j) = sqrt(|p(i,j)|);
-
- int x, y, i;
- RGBQUAD color;
- RGBQUAD yuvClr;
- double dtmp;
- unsigned int YVal, high = 1;
-
- // Find Highest Luminance Value in the Image
- if( head.biClrUsed == 0 ){ // No Palette
- for(y=0; y < head.biHeight; y++){
- info.nProgress = (long)(50*y/head.biHeight);
- if (info.nEscape) break;
- for(x=0; x < head.biWidth; x++){
- color = GetPixelColor( x, y );
- YVal = (unsigned int)RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- if (YVal > high ) high = YVal;
- }
- }
- } else { // Palette
- for(i = 0; i < (int)head.biClrUsed; i++){
- color = GetPaletteColor((BYTE)i);
- YVal = (unsigned int)RGB2GRAY(color.rgbRed, color.rgbGreen, color.rgbBlue);
- if (YVal > high ) high = YVal;
- }
- }
-
- // Root Operator
- double k = 128.0 / ::log( 1.0 + (double)high );
- if( head.biClrUsed == 0 ){
- for( y = 0; y < head.biHeight; y++ ){
- info.nProgress = (long)(50+50*y/head.biHeight);
- if (info.nEscape) break;
- for( x = 0; x < head.biWidth; x++ ){
-
- color = GetPixelColor( x, y );
- yuvClr = RGBtoYUV( color );
-
- dtmp = k * ::sqrt( (double)yuvClr.rgbRed );
- if ( dtmp > 255.0 ) dtmp = 255.0;
- if ( dtmp < 0 ) dtmp = 0;
- yuvClr.rgbRed = (BYTE)dtmp;
-
- color = YUVtoRGB( yuvClr );
- SetPixelColor( x, y, color );
- }
- }
- } else {
- for(i = 0; i < (int)head.biClrUsed; i++){
-
- color = GetPaletteColor( (BYTE)i );
- yuvClr = RGBtoYUV( color );
-
- dtmp = k * ::sqrt( (double)yuvClr.rgbRed );
- if ( dtmp > 255.0 ) dtmp = 255.0;
- if ( dtmp < 0 ) dtmp = 0;
- yuvClr.rgbRed = (BYTE)dtmp;
-
- color = YUVtoRGB( yuvClr );
- SetPaletteColor( (BYTE)i, color );
- }
- }
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif
diff --git a/src/win32/dependencies/cximage/ximaico.cpp b/src/win32/dependencies/cximage/ximaico.cpp
deleted file mode 100644
index 4523ccf3..00000000
--- a/src/win32/dependencies/cximage/ximaico.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * File: ximaico.cpp
- * Purpose: Platform Independent ICON Image Class Loader and Writer (MS version)
- * 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximaico.h"
-
-#if CXIMAGE_SUPPORT_ICO
-
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageICO::Decode(CxFile *hFile)
-{
- if (hFile==NULL) return false;
-
- DWORD off = hFile->Tell(); //
- int page=info.nFrame; //internal icon structure indexes
-
- // read the first part of the header
- ICONHEADER icon_header;
- hFile->Read(&icon_header,sizeof(ICONHEADER),1);
- // check if it's an icon or a cursor
- if ((icon_header.idReserved == 0) && ((icon_header.idType == 1)||(icon_header.idType == 2))) {
-
- info.nNumFrames = icon_header.idCount;
-
- // load the icon descriptions
- ICONDIRENTRY *icon_list = (ICONDIRENTRY *)malloc(icon_header.idCount * sizeof(ICONDIRENTRY));
- int c;
- for (c = 0; c < icon_header.idCount; c++)
- hFile->Read(icon_list + c, sizeof(ICONDIRENTRY), 1);
-
- if ((page>=0)&&(page
- BITMAPINFOHEADER bih;
- hFile->Seek(off + icon_list[page].dwImageOffset, SEEK_SET);
- hFile->Read(&bih,sizeof(BITMAPINFOHEADER),1);
- c = bih.biBitCount;
-
- // allocate memory for one icon
- Create(icon_list[page].bWidth,icon_list[page].bHeight, c, CXIMAGE_FORMAT_ICO); //image creation
-
- // read the palette
- RGBQUAD pal[256];
- hFile->Read(pal,head.biClrUsed*sizeof(RGBQUAD), 1);
- SetPalette(pal,head.biClrUsed); //palette assign
-
- //read the icon
- if (c<=24){
- hFile->Read(info.pImage, head.biSizeImage, 1);
- } else { // 32 bit icon
- BYTE* dst = info.pImage;
- BYTE* buf=(BYTE*)malloc(4*head.biHeight*head.biWidth);
- BYTE* src = buf;
- hFile->Read(buf, 4*head.biHeight*head.biWidth, 1);
-#if CXIMAGE_SUPPORT_ALPHA
- if (!AlphaIsValid()) AlphaCreate();
-#endif //CXIMAGE_SUPPORT_ALPHA
- for (long y = 0; y < head.biHeight; y++) {
- for(long x=0;xRead(mask, masksize, 1)){
-
- bool bGoodMask=false;
- for (int im=0;im>3)]>>(7-x%8))&0x01)){
- AlphaSet(x,y,0);
- bNeedAlpha=true;
- }
- }
- }
- if (!bNeedAlpha) AlphaDelete();
-#endif //CXIMAGE_SUPPORT_ALPHA
-
- if (c==24){ //check if there is only one transparent color
- RGBQUAD cc,ct;
- long* pcc = (long*)&cc;
- long* pct = (long*)&ct;
- int nTransColors=0;
- for (int y = 0; y < head.biHeight; y++){
- for (int x = 0; x < head.biWidth; x++){
- if (((mask[y*maskwdt+(x>>3)] >> (7-x%8)) & 0x01)){
- cc = GetPixelColor(x,y,false);
- if (nTransColors==0){
- nTransColors++;
- ct = cc;
- } else {
- if (*pct!=*pcc){
- nTransColors++;
- }
- }
- }
- }
- }
- if (nTransColors==1){
- SetTransColor(ct);
- SetTransIndex(0);
-#if CXIMAGE_SUPPORT_ALPHA
- AlphaDelete(); //because we have a unique transparent color in the image
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
- }
-
- // - Transparency support w/o Alpha support
- if (c <= 8){ // only for icons with less than 256 colors (XP icons need alpha).
-
- // find a color index, which is not used in the image
- // it is almost sure to find one, bcs. nobody uses all possible colors for an icon
-
- BYTE colorsUsed[256];
- memset(colorsUsed, 0, sizeof(colorsUsed));
-
- for (int y = 0; y < head.biHeight; y++){
- for (int x = 0; x < head.biWidth; x++){
- colorsUsed[GetPixelIndex(x,y)] = 1;
- }
- }
-
- int iTransIdx = -1;
- for (int x = 0; x < (int)head.biClrUsed; x++){
- if (colorsUsed[x] == 0){
- iTransIdx = x; // this one is not in use. we may use it as transparent color
- break;
- }
- }
-
- // Go thru image and set unused color as transparent index if needed
- if (iTransIdx >= 0){
- bool bNeedTrans = false;
- for (int y = 0; y < head.biHeight; y++){
- for (int x = 0; x < head.biWidth; x++){
- // AND mask (Each Byte represents 8 Pixels)
- if (((mask[y*maskwdt+(x>>3)] >> (7-x%8)) & 0x01)){
- // AND mask is set (!=0). This is a transparent part
- SetPixelIndex(x, y, iTransIdx);
- bNeedTrans = true;
- }
- }
- }
- // set transparent index if needed
- if (bNeedTrans) SetTransIndex(iTransIdx);
-#if CXIMAGE_SUPPORT_ALPHA
- AlphaDelete(); //because we have a transparent color in the palette
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
- }
- } else {
- SetTransIndex(0); //empty mask, set black as transparent color
- Negative();
- }
- }
- free(mask);
-
- free(icon_list);
- // icon has been loaded successfully!
- return true;
- }
- free(icon_list);
- }
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageICO::Encode(CxFile * hFile)
-{
- if (EncodeSafeCheck(hFile)) return false;
-
- //check format limits
- if ((head.biWidth>255)||(head.biHeight>255)){
- strcpy(info.szLastError,"Can't save this image as icon");
- return false;
- }
-
- //prepare the palette struct
- RGBQUAD* pal=GetPalette();
- if (head.biBitCount<=8 && pal==NULL) return false;
-
- int maskwdt=((head.biWidth+31)/32)*4; //mask line width
- int masksize=head.biHeight * maskwdt; //size of mask
- int bitcount=head.biBitCount;
- int imagesize=head.biSizeImage;
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid() && head.biClrUsed==0){
- bitcount=32;
- imagesize=4*head.biHeight*head.biWidth;
- }
-#endif
-
- //fill the icon headers
- ICONHEADER icon_header={0,1,1};
- ICONDIRENTRY icon_list={(BYTE)head.biWidth,(BYTE)head.biHeight,(BYTE)head.biClrUsed ,0,0,(WORD)bitcount,
- sizeof(BITMAPINFOHEADER)+head.biClrUsed*sizeof(RGBQUAD)+
- imagesize+masksize,
- sizeof(ICONHEADER)+sizeof(ICONDIRENTRY)};
- BITMAPINFOHEADER bi={sizeof(BITMAPINFOHEADER),head.biWidth,2*head.biHeight,1,(WORD)bitcount,
- 0,imagesize,0,0,0,0};
-
- hFile->Write(&icon_header,sizeof(ICONHEADER),1); //write the headers
- hFile->Write(&icon_list,sizeof(ICONDIRENTRY),1);
- hFile->Write(&bi,sizeof(BITMAPINFOHEADER),1);
- if (pal) hFile->Write(pal,head.biClrUsed*sizeof(RGBQUAD),1); //write palette
-
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid() && head.biClrUsed==0){
- BYTE* src = info.pImage;
- BYTE* buf=(BYTE*)malloc(imagesize);
- BYTE* dst = buf;
- for (long y = 0; y < head.biHeight; y++) {
- for(long x=0;xWrite(buf,imagesize, 1);
- free(buf);
- } else {
- hFile->Write(info.pImage,imagesize,1); //write image
- }
-#else
- hFile->Write(info.pImage,imagesize,1); //write image
-#endif
-
- //save transparency mask
- BYTE* mask=(BYTE*)calloc(masksize,1); //create empty AND/XOR masks
- if (!mask) return false;
-
- //prepare the variables to build the mask
- BYTE* iDst;
- int pos,i;
- RGBQUAD c={0,0,0,0};
- RGBQUAD ct = GetTransColor();
- long* pc = (long*)&c;
- long* pct= (long*)&ct;
- bool bTransparent = info.nBkgndIndex != -1;
-#if CXIMAGE_SUPPORT_ALPHA
- bool bAlphaPaletteIsValid = AlphaPaletteIsValid();
- bool bAlphaIsValid = AlphaIsValid();
-#endif
- //build the mask
- for (int y = 0; y < head.biHeight; y++) {
- for (int x = 0; x < head.biWidth; x++) {
- i=0;
-#if CXIMAGE_SUPPORT_ALPHA
- if (bAlphaIsValid && AlphaGet(x,y)==0) i=1;
- if (bAlphaPaletteIsValid && GetPixelColor(x,y).rgbReserved==0) i=1;
-#endif
- c=GetPixelColor(x,y,false);
- if (bTransparent && *pc==*pct) i=1;
- iDst = mask + y*maskwdt + (x>>3);
- pos = 7-x%8;
- *iDst &= ~(0x01<Write(mask,masksize,1);
- free(mask);
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_ICO
-
diff --git a/src/win32/dependencies/cximage/ximaico.h b/src/win32/dependencies/cximage/ximaico.h
deleted file mode 100644
index 8f63e060..00000000
--- a/src/win32/dependencies/cximage/ximaico.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * File: ximaico.h
- * Purpose: ICON Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageICO (c) 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- * ==========================================================
- */
-#if !defined(__ximaICO_h)
-#define __ximaICO_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_ICO
-
-class CxImageICO: public CxImage
-{
-typedef struct tagIconDirectoryEntry {
- BYTE bWidth;
- BYTE bHeight;
- BYTE bColorCount;
- BYTE bReserved;
- WORD wPlanes;
- WORD wBitCount;
- DWORD dwBytesInRes;
- DWORD dwImageOffset;
-} ICONDIRENTRY;
-
-typedef struct tagIconDir {
- WORD idReserved;
- WORD idType;
- WORD idCount;
-} ICONHEADER;
-
-public:
- CxImageICO(): CxImage(CXIMAGE_FORMAT_ICO) {}
-
-// bool Load(const char * imageFileName){ return CxImage::Load(imageFileName,CXIMAGE_FORMAT_ICO);}
-// bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,CXIMAGE_FORMAT_ICO);}
- bool Decode(CxFile * hFile);
- bool Decode(FILE *hFile) { CxIOFile file(hFile); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile);
- bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximainfo.cpp b/src/win32/dependencies/cximage/ximainfo.cpp
deleted file mode 100644
index 6535ddea..00000000
--- a/src/win32/dependencies/cximage/ximainfo.cpp
+++ /dev/null
@@ -1,388 +0,0 @@
-// ximainfo.cpp : main attributes
-/* 03/10/2004 v1.00 - Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return the color used for transparency, and/or for background color
- */
-RGBQUAD CxImage::GetTransColor()
-{
- if (head.biBitCount<24 && info.nBkgndIndex != -1) return GetPaletteColor((BYTE)info.nBkgndIndex);
- return info.nBkgndColor;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Gets the index used for transparency. Returns -1 for no transparancy.
- */
-long CxImage::GetTransIndex() const
-{
- return info.nBkgndIndex;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Sets the index used for transparency with 1, 4 and 8 bpp images. Set to -1 to remove the effect.
- */
-void CxImage::SetTransIndex(long idx)
-{
- info.nBkgndIndex = idx;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Sets the color used for transparency with 24 bpp images.
- * You must call SetTransIndex(0) to enable the effect, SetTransIndex(-1) to disable it.
- */
-void CxImage::SetTransColor(RGBQUAD rgb)
-{
- rgb.rgbReserved=0;
- info.nBkgndColor = rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-bool CxImage::IsTransparent() const
-{
- return info.nBkgndIndex>=0; //
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Returns true if the image has 256 colors or less.
- */
-bool CxImage::IsIndexed() const
-{
- return head.biClrUsed!=0;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return 1 = indexed, 2 = RGB, 4 = RGBA
- */
-BYTE CxImage::GetColorType()
-{
- BYTE b = (BYTE)((head.biBitCount>8) ? 2 /*COLORTYPE_COLOR*/ : 1 /*COLORTYPE_PALETTE*/);
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid()) b = 4 /*COLORTYPE_ALPHA*/;
-#endif //CXIMAGE_SUPPORT_ALPHA
- return b;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return Resolution for TIFF, JPEG, PNG and BMP formats.
- */
-long CxImage::GetXDPI() const
-{
- return info.xDPI;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \return Resolution for TIFF, JPEG, PNG and BMP formats.
- */
-long CxImage::GetYDPI() const
-{
- return info.yDPI;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Set resolution for TIFF, JPEG, PNG and BMP formats.
- */
-void CxImage::SetXDPI(long dpi)
-{
- if (dpi<=0) dpi=96;
- info.xDPI = dpi;
- head.biXPelsPerMeter = (long) floor(dpi * 10000.0 / 254.0 + 0.5);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Set resolution for TIFF, JPEG, PNG and BMP formats.
- */
-void CxImage::SetYDPI(long dpi)
-{
- if (dpi<=0) dpi=96;
- info.yDPI = dpi;
- head.biYPelsPerMeter = (long) floor(dpi * 10000.0 / 254.0 + 0.5);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \sa SetFlags
- */
-DWORD CxImage::GetFlags() const
-{
- return info.dwFlags;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Image flags, for future use
- * \param flags
- * - 0x??00000 = reserved for 16 bit, CMYK, multilayer
- * - 0x00??0000 = blend modes
- * - 0x0000???? = layer id or user flags
- *
- * \param bLockReservedFlags protects the "reserved" and "blend modes" flags
- */
-void CxImage::SetFlags(DWORD flags, bool bLockReservedFlags)
-{
- if (bLockReservedFlags) info.dwFlags = flags & 0x0000ffff;
- else info.dwFlags = flags;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \sa SetCodecOption
- */
-DWORD CxImage::GetCodecOption(DWORD imagetype)
-{
- if (imagetype=head.biWidth) x=head.biWidth-(x % head.biWidth + 1);
- if (y<0) y=((-y) % head.biHeight);
- else if (y>=head.biHeight) y=head.biHeight-(y % head.biHeight + 1);
- break;
- default:
- return;
- }//switch
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * See OverflowCoordinates for integer version
- * \author ***bd*** 2.2004
- */
-void CxImage::OverflowCoordinates(float &x, float &y, OverflowMethod const ofMethod)
-{
- if (x>=0 && x=0 && y=head.biWidth) x=head.biWidth-((float)fmod(x, (float) head.biWidth) + 1);
- if (y<0) y=(float)fmod(-y, (float) head.biHeight);
- else if (y>=head.biHeight) y=head.biHeight-((float)fmod(y, (float) head.biHeight) + 1);
- break;
- default:
- return;
- }//switch
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Method return pixel color. Different methods are implemented for out of bounds pixels.
- * If an image has alpha channel, alpha value is returned in .RGBReserved.
- *
- * \param x,y : pixel coordinates
- * \param ofMethod : out-of-bounds method:
- * - OF_WRAP - wrap over to pixels on other side of the image
- * - OF_REPEAT - repeat last pixel on the edge
- * - OF_COLOR - return input value of color
- * - OF_BACKGROUND - return background color (if not set, return input color)
- * - OF_TRANSPARENT - return transparent pixel
- *
- * \param rplColor : input color (returned for out-of-bound coordinates in OF_COLOR mode and if other mode is not applicable)
- *
- * \return color : color of pixel
- * \author ***bd*** 2.2004
- */
-RGBQUAD CxImage::GetPixelColorWithOverflow(long x, long y, OverflowMethod const ofMethod, RGBQUAD* const rplColor)
-{
- RGBQUAD color; //color to return
- if ((!IsInside(x,y)) || pDib==NULL) { //is pixel within bouns?:
- //pixel is out of bounds or no DIB
- if (rplColor!=NULL)
- color=*rplColor;
- else {
- color.rgbRed=color.rgbGreen=color.rgbBlue=255; color.rgbReserved=0; //default replacement colour: white transparent
- }//if
- if (pDib==NULL) return color;
- //pixel is out of bounds:
- switch (ofMethod) {
- case OM_TRANSPARENT:
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid()) {
- //alpha transparency is supported and image has alpha layer
- color.rgbReserved=0;
- } else {
-#endif //CXIMAGE_SUPPORT_ALPHA
- //no alpha transparency
- if (GetTransIndex()>=0) {
- color=GetTransColor(); //single color transparency enabled (return transparent color)
- }//if
-#if CXIMAGE_SUPPORT_ALPHA
- }//if
-#endif //CXIMAGE_SUPPORT_ALPHA
- return color;
- case OM_BACKGROUND:
- //return background color (if it exists, otherwise input value)
- if (info.nBkgndIndex != -1) {
- if (head.biBitCount<24) color = GetPaletteColor((BYTE)info.nBkgndIndex);
- else color = info.nBkgndColor;
- }//if
- return color;
- case OM_REPEAT:
- case OM_WRAP:
- case OM_MIRROR:
- OverflowCoordinates(x,y,ofMethod);
- break;
- default:
- //simply return replacement color (OM_COLOR and others)
- return color;
- }//switch
- }//if
- //just return specified pixel (it's within bounds)
- return BlindGetPixelColor(x,y);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * This method reconstructs image according to chosen interpolation method and then returns pixel (x,y).
- * (x,y) can lie between actual image pixels. If (x,y) lies outside of image, method returns value
- * according to overflow method.
- * This method is very useful for geometrical image transformations, where destination pixel
- * can often assume color value lying between source pixels.
- *
- * \param (x,y) - coordinates of pixel to return
- * GPCI method recreates "analogue" image back from digital data, so x and y
- * are float values and color value of point (1.1,1) will generally not be same
- * as (1,1). Center of first pixel is at (0,0) and center of pixel right to it is (1,0).
- * (0.5,0) is half way between these two pixels.
- * \param inMethod - interpolation (reconstruction) method (kernel) to use:
- * - IM_NEAREST_NEIGHBOUR - returns colour of nearest lying pixel (causes stairy look of
- * processed images)
- * - IM_BILINEAR - interpolates colour from four neighbouring pixels (softens image a bit)
- * - IM_BICUBIC - interpolates from 16 neighbouring pixels (can produce "halo" artifacts)
- * - IM_BICUBIC2 - interpolates from 16 neighbouring pixels (perhaps a bit less halo artifacts
- than IM_BICUBIC)
- * - IM_BSPLINE - interpolates from 16 neighbouring pixels (softens image, washes colours)
- * (As far as I know, image should be prefiltered for this method to give
- * good results... some other time :) )
- * This method uses bicubic interpolation kernel from CXImage 5.99a and older
- * versions.
- * - IM_LANCZOS - interpolates from 12*12 pixels (slow, ringing artifacts)
- *
- * \param ofMethod - overflow method (see comments at GetPixelColorWithOverflow)
- * \param rplColor - pointer to color used for out of borders pixels in OM_COLOR mode
- * (and other modes if colour can't calculated in a specified way)
- *
- * \return interpolated color value (including interpolated alpha value, if image has alpha layer)
- *
- * \author ***bd*** 2.2004
- */
-RGBQUAD CxImage::GetPixelColorInterpolated(
- float x,float y,
- InterpolationMethod const inMethod,
- OverflowMethod const ofMethod,
- RGBQUAD* const rplColor)
-{
- //calculate nearest pixel
- int xi=(int)(x); if (x<0) xi--; //these replace (incredibly slow) floor (Visual c++ 2003, AMD Athlon)
- int yi=(int)(y); if (y<0) yi--;
- RGBQUAD color; //calculated colour
-
- switch (inMethod) {
- case IM_NEAREST_NEIGHBOUR:
- return GetPixelColorWithOverflow((long)(x+0.5f), (long)(y+0.5f), ofMethod, rplColor);
- default: {
- //bilinear interpolation
- if (xi<-1 || xi>=head.biWidth || yi<-1 || yi>=head.biHeight) { //all 4 points are outside bounds?:
- switch (ofMethod) {
- case OM_COLOR: case OM_TRANSPARENT: case OM_BACKGROUND:
- //we don't need to interpolate anything with all points outside in this case
- return GetPixelColorWithOverflow(-999, -999, ofMethod, rplColor);
- default:
- //recalculate coordinates and use faster method later on
- OverflowCoordinates(x,y,ofMethod);
- xi=(int)(x); if (x<0) xi--; //x and/or y have changed ... recalculate xi and yi
- yi=(int)(y); if (y<0) yi--;
- }//switch
- }//if
- //get four neighbouring pixels
- if ((xi+1)=0 && (yi+1)=0 && head.biClrUsed==0) {
- //all pixels are inside RGB24 image... optimize reading (and use fixed point arithmetic)
- WORD wt1=(WORD)((x-xi)*256.0f), wt2=(WORD)((y-yi)*256.0f);
- WORD wd=wt1*wt2>>8;
- WORD wb=wt1-wd;
- WORD wc=wt2-wd;
- WORD wa=256-wt1-wc;
- WORD wrr,wgg,wbb;
- BYTE *pxptr=(BYTE*)info.pImage+yi*info.dwEffWidth+xi*3;
- wbb=wa*(*pxptr++); wgg=wa*(*pxptr++); wrr=wa*(*pxptr++);
- wbb+=wb*(*pxptr++); wgg+=wb*(*pxptr++); wrr+=wb*(*pxptr);
- pxptr+=(info.dwEffWidth-5); //move to next row
- wbb+=wc*(*pxptr++); wgg+=wc*(*pxptr++); wrr+=wc*(*pxptr++);
- wbb+=wd*(*pxptr++); wgg+=wd*(*pxptr++); wrr+=wd*(*pxptr);
- color.rgbRed=(BYTE) (wrr>>8); color.rgbGreen=(BYTE) (wgg>>8); color.rgbBlue=(BYTE) (wbb>>8);
-#if CXIMAGE_SUPPORT_ALPHA
- if (pAlpha) {
- WORD waa;
- //image has alpha layer... we have to do the same for alpha data
- pxptr=AlphaGetPointer(xi,yi); //pointer to first byte
- waa=wa*(*pxptr++); waa+=wb*(*pxptr); //first two pixels
- pxptr+=(head.biWidth-1); //move to next row
- waa+=wc*(*pxptr++); waa+=wd*(*pxptr); //and second row pixels
- color.rgbReserved=(BYTE) (waa>>8);
- } else
-#endif
- { //Alpha not supported or no alpha at all
- color.rgbReserved = 0;
- }
- return color;
- } else {
- //default (slower) way to get pixels (not RGB24 or some pixels out of borders)
- float t1=x-xi, t2=y-yi;
- float d=t1*t2;
- float b=t1-d;
- float c=t2-d;
- float a=1-t1-c;
- RGBQUAD rgb11,rgb21,rgb12,rgb22;
- rgb11=GetPixelColorWithOverflow(xi, yi, ofMethod, rplColor);
- rgb21=GetPixelColorWithOverflow(xi+1, yi, ofMethod, rplColor);
- rgb12=GetPixelColorWithOverflow(xi, yi+1, ofMethod, rplColor);
- rgb22=GetPixelColorWithOverflow(xi+1, yi+1, ofMethod, rplColor);
- //calculate linear interpolation
- color.rgbRed=(BYTE) (a*rgb11.rgbRed+b*rgb21.rgbRed+c*rgb12.rgbRed+d*rgb22.rgbRed);
- color.rgbGreen=(BYTE) (a*rgb11.rgbGreen+b*rgb21.rgbGreen+c*rgb12.rgbGreen+d*rgb22.rgbGreen);
- color.rgbBlue=(BYTE) (a*rgb11.rgbBlue+b*rgb21.rgbBlue+c*rgb12.rgbBlue+d*rgb22.rgbBlue);
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid())
- color.rgbReserved=(BYTE) (a*rgb11.rgbReserved+b*rgb21.rgbReserved+c*rgb12.rgbReserved+d*rgb22.rgbReserved);
- else
-#endif
- { //Alpha not supported or no alpha at all
- color.rgbReserved = 0;
- }
- return color;
- }//if
- }//default
- case IM_BICUBIC:
- case IM_BICUBIC2:
- case IM_BSPLINE:
- case IM_BOX:
- case IM_HERMITE:
- case IM_HAMMING:
- case IM_SINC:
- case IM_BLACKMAN:
- case IM_BESSEL:
- case IM_GAUSSIAN:
- case IM_QUADRATIC:
- case IM_MITCHELL:
- case IM_CATROM:
- //bicubic interpolation(s)
- if (((xi+2)<0) || ((xi-1)>=head.biWidth) || ((yi+2)<0) || ((yi-1)>=head.biHeight)) { //all points are outside bounds?:
- switch (ofMethod) {
- case OM_COLOR: case OM_TRANSPARENT: case OM_BACKGROUND:
- //we don't need to interpolate anything with all points outside in this case
- return GetPixelColorWithOverflow(-999, -999, ofMethod, rplColor);
- break;
- default:
- //recalculate coordinates and use faster method later on
- OverflowCoordinates(x,y,ofMethod);
- xi=(int)(x); if (x<0) xi--; //x and/or y have changed ... recalculate xi and yi
- yi=(int)(y); if (y<0) yi--;
- }//switch
- }//if
-
- //some variables needed from here on
- int xii,yii; //x any y integer indexes for loops
- float kernel, kernelyc; //kernel cache
- float kernelx[12], kernely[4]; //precalculated kernel values
- float rr,gg,bb,aa; //accumulated color values
- //calculate multiplication factors for all pixels
- int i;
- switch (inMethod) {
- case IM_BICUBIC:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelCubic((float)(xi+i-1-x));
- kernely[i]=KernelCubic((float)(yi+i-1-y));
- }//for i
- break;
- case IM_BICUBIC2:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelGeneralizedCubic((float)(xi+i-1-x), -0.5);
- kernely[i]=KernelGeneralizedCubic((float)(yi+i-1-y), -0.5);
- }//for i
- break;
- case IM_BSPLINE:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelBSpline((float)(xi+i-1-x));
- kernely[i]=KernelBSpline((float)(yi+i-1-y));
- }//for i
- break;
- case IM_BOX:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelBox((float)(xi+i-1-x));
- kernely[i]=KernelBox((float)(yi+i-1-y));
- }//for i
- break;
- case IM_HERMITE:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelHermite((float)(xi+i-1-x));
- kernely[i]=KernelHermite((float)(yi+i-1-y));
- }//for i
- break;
- case IM_HAMMING:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelHamming((float)(xi+i-1-x));
- kernely[i]=KernelHamming((float)(yi+i-1-y));
- }//for i
- break;
- case IM_SINC:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelSinc((float)(xi+i-1-x));
- kernely[i]=KernelSinc((float)(yi+i-1-y));
- }//for i
- break;
- case IM_BLACKMAN:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelBlackman((float)(xi+i-1-x));
- kernely[i]=KernelBlackman((float)(yi+i-1-y));
- }//for i
- break;
- case IM_BESSEL:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelBessel((float)(xi+i-1-x));
- kernely[i]=KernelBessel((float)(yi+i-1-y));
- }//for i
- break;
- case IM_GAUSSIAN:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelGaussian((float)(xi+i-1-x));
- kernely[i]=KernelGaussian((float)(yi+i-1-y));
- }//for i
- break;
- case IM_QUADRATIC:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelQuadratic((float)(xi+i-1-x));
- kernely[i]=KernelQuadratic((float)(yi+i-1-y));
- }//for i
- break;
- case IM_MITCHELL:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelMitchell((float)(xi+i-1-x));
- kernely[i]=KernelMitchell((float)(yi+i-1-y));
- }//for i
- break;
- case IM_CATROM:
- for (i=0; i<4; i++) {
- kernelx[i]=KernelCatrom((float)(xi+i-1-x));
- kernely[i]=KernelCatrom((float)(yi+i-1-y));
- }//for i
- break;
- }//switch
- rr=gg=bb=aa=0;
- if (((xi+2)=1 && ((yi+2)=1) && !IsIndexed()) {
- //optimized interpolation (faster pixel reads) for RGB24 images with all pixels inside bounds
- BYTE *pxptr, *pxptra;
- for (yii=yi-1; yii255) rr=255; if (rr<0) rr=0; color.rgbRed=(BYTE) rr;
- if (gg>255) gg=255; if (gg<0) gg=0; color.rgbGreen=(BYTE) gg;
- if (bb>255) bb=255; if (bb<0) bb=0; color.rgbBlue=(BYTE) bb;
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid()) {
- if (aa>255) aa=255; if (aa<0) aa=0; color.rgbReserved=(BYTE) aa;
- } else
-#endif
- { //Alpha not supported or no alpha at all
- color.rgbReserved = 0;
- }
- return color;
- case IM_LANCZOS:
- //lanczos window (16*16) sinc interpolation
- if (((xi+6)<0) || ((xi-5)>=head.biWidth) || ((yi+6)<0) || ((yi-5)>=head.biHeight)) {
- //all points are outside bounds
- switch (ofMethod) {
- case OM_COLOR: case OM_TRANSPARENT: case OM_BACKGROUND:
- //we don't need to interpolate anything with all points outside in this case
- return GetPixelColorWithOverflow(-999, -999, ofMethod, rplColor);
- break;
- default:
- //recalculate coordinates and use faster method later on
- OverflowCoordinates(x,y,ofMethod);
- xi=(int)(x); if (x<0) xi--; //x and/or y have changed ... recalculate xi and yi
- yi=(int)(y); if (y<0) yi--;
- }//switch
- }//if
-
- for (xii=xi-5; xii=0) && ((yi+6)=0) && !IsIndexed()) {
- //optimized interpolation (faster pixel reads) for RGB24 images with all pixels inside bounds
- BYTE *pxptr, *pxptra;
- for (yii=yi-5; yii255) rr=255; if (rr<0) rr=0; color.rgbRed=(BYTE) rr;
- if (gg>255) gg=255; if (gg<0) gg=0; color.rgbGreen=(BYTE) gg;
- if (bb>255) bb=255; if (bb<0) bb=0; color.rgbBlue=(BYTE) bb;
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid()) {
- if (aa>255) aa=255; if (aa<0) aa=0; color.rgbReserved=(BYTE) aa;
- } else
-#endif
- { //Alpha not supported or no alpha at all
- color.rgbReserved = 0;
- }
- return color;
- }//switch
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Helper function for GetAreaColorInterpolated.
- * Adds 'surf' portion of image pixel with color 'color' to (rr,gg,bb,aa).
- */
-void CxImage::AddAveragingCont(RGBQUAD const &color, float const surf, float &rr, float &gg, float &bb, float &aa)
-{
- rr+=color.rgbRed*surf;
- gg+=color.rgbGreen*surf;
- bb+=color.rgbBlue*surf;
-#if CXIMAGE_SUPPORT_ALPHA
- aa+=color.rgbReserved*surf;
-#endif
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * This method is similar to GetPixelColorInterpolated, but this method also properly handles
- * subsampling.
- * If you need to sample original image with interval of more than 1 pixel (as when shrinking an image),
- * you should use this method instead of GetPixelColorInterpolated or aliasing will occur.
- * When area width and height are both less than pixel, this method gets pixel color by interpolating
- * color of frame center with selected (inMethod) interpolation by calling GetPixelColorInterpolated.
- * If width and height are more than 1, method calculates color by averaging color of pixels within area.
- * Interpolation method is not used in this case. Pixel color is interpolated by averaging instead.
- * If only one of both is more than 1, method uses combination of interpolation and averaging.
- * Chosen interpolation method is used, but since it is averaged later on, there is little difference
- * between IM_BILINEAR (perhaps best for this case) and better methods. IM_NEAREST_NEIGHBOUR again
- * leads to aliasing artifacts.
- * This method is a bit slower than GetPixelColorInterpolated and when aliasing is not a problem, you should
- * simply use the later.
- *
- * \param xc, yc - center of (rectangular) area
- * \param w, h - width and height of area
- * \param inMethod - interpolation method that is used, when interpolation is used (see above)
- * \param ofMethod - overflow method used when retrieving individual pixel colors
- * \param rplColor - replacement colour to use, in OM_COLOR
- *
- * \author ***bd*** 2.2004
- */
-RGBQUAD CxImage::GetAreaColorInterpolated(
- float const xc, float const yc, float const w, float const h,
- InterpolationMethod const inMethod,
- OverflowMethod const ofMethod,
- RGBQUAD* const rplColor)
-{
- RGBQUAD color; //calculated colour
-
- if (h<=1 && w<=1) {
- //both width and height are less than one... we will use interpolation of center point
- return GetPixelColorInterpolated(xc, yc, inMethod, ofMethod, rplColor);
- } else {
- //area is wider and/or taller than one pixel:
- CxRect2 area(xc-w/2.0f, yc-h/2.0f, xc+w/2.0f, yc+h/2.0f); //area
- int xi1=(int)(area.botLeft.x+0.49999999f); //low x
- int yi1=(int)(area.botLeft.y+0.49999999f); //low y
-
-
- int xi2=(int)(area.topRight.x+0.5f); //top x
- int yi2=(int)(area.topRight.y+0.5f); //top y (for loops)
-
- float rr,gg,bb,aa; //red, green, blue and alpha components
- rr=gg=bb=aa=0;
- int x,y; //loop counters
- float s=0; //surface of all pixels
- float cps; //surface of current crosssection
- if (h>1 && w>1) {
- //width and height of area are greater than one pixel, so we can employ "ordinary" averaging
- CxRect2 intBL, intTR; //bottom left and top right intersection
- intBL=area.CrossSection(CxRect2(((float)xi1)-0.5f, ((float)yi1)-0.5f, ((float)xi1)+0.5f, ((float)yi1)+0.5f));
- intTR=area.CrossSection(CxRect2(((float)xi2)-0.5f, ((float)yi2)-0.5f, ((float)xi2)+0.5f, ((float)yi2)+0.5f));
- float wBL, wTR, hBL, hTR;
- wBL=intBL.Width(); //width of bottom left pixel-area intersection
- hBL=intBL.Height(); //height of bottom left...
- wTR=intTR.Width(); //width of top right...
- hTR=intTR.Height(); //height of top right...
-
- AddAveragingCont(GetPixelColorWithOverflow(xi1,yi1,ofMethod,rplColor), wBL*hBL, rr, gg, bb, aa); //bottom left pixel
- AddAveragingCont(GetPixelColorWithOverflow(xi2,yi1,ofMethod,rplColor), wTR*hBL, rr, gg, bb, aa); //bottom right pixel
- AddAveragingCont(GetPixelColorWithOverflow(xi1,yi2,ofMethod,rplColor), wBL*hTR, rr, gg, bb, aa); //top left pixel
- AddAveragingCont(GetPixelColorWithOverflow(xi2,yi2,ofMethod,rplColor), wTR*hTR, rr, gg, bb, aa); //top right pixel
- //bottom and top row
- for (x=xi1+1; x255) rr=255; if (rr<0) rr=0; color.rgbRed=(BYTE) rr;
- if (gg>255) gg=255; if (gg<0) gg=0; color.rgbGreen=(BYTE) gg;
- if (bb>255) bb=255; if (bb<0) bb=0; color.rgbBlue=(BYTE) bb;
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid()) {
- if (aa>255) aa=255; if (aa<0) aa=0; color.rgbReserved=(BYTE) aa;
- }//if
-#endif
- }//if
- return color;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBSpline(const float x)
-{
- if (x>2.0f) return 0.0f;
- // thanks to Kristian Kratzenstein
- float a, b, c, d;
- float xm1 = x - 1.0f; // Was calculatet anyway cause the "if((x-1.0f) < 0)"
- float xp1 = x + 1.0f;
- float xp2 = x + 2.0f;
-
- if ((xp2) <= 0.0f) a = 0.0f; else a = xp2*xp2*xp2; // Only float, not float -> double -> float
- if ((xp1) <= 0.0f) b = 0.0f; else b = xp1*xp1*xp1;
- if (x <= 0) c = 0.0f; else c = x*x*x;
- if ((xm1) <= 0.0f) d = 0.0f; else d = xm1*xm1*xm1;
-
- return (0.16666666666666666667f * (a - (4.0f * b) + (6.0f * c) - (4.0f * d)));
-
- /* equivalent
- if (x < -2.0)
- return(0.0f);
- if (x < -1.0)
- return((2.0f+x)*(2.0f+x)*(2.0f+x)*0.16666666666666666667f);
- if (x < 0.0)
- return((4.0f+x*x*(-6.0f-3.0f*x))*0.16666666666666666667f);
- if (x < 1.0)
- return((4.0f+x*x*(-6.0f+3.0f*x))*0.16666666666666666667f);
- if (x < 2.0)
- return((2.0f-x)*(2.0f-x)*(2.0f-x)*0.16666666666666666667f);
- return(0.0f);
- */
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Bilinear interpolation kernel:
- \verbatim
- /
- | 1-t , if 0 <= t <= 1
- h(t) = | t+1 , if -1 <= t < 0
- | 0 , otherwise
- \
- \endverbatim
- * ***bd*** 2.2004
- */
-float CxImage::KernelLinear(const float t)
-{
-// if (0<=t && t<=1) return 1-t;
-// if (-1<=t && t<0) return 1+t;
-// return 0;
-
- //
- if (t < -1.0f)
- return 0.0f;
- if (t < 0.0f)
- return 1.0f+t;
- if (t < 1.0f)
- return 1.0f-t;
- return 0.0f;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Bicubic interpolation kernel (a=-1):
- \verbatim
- /
- | 1-2|t|**2+|t|**3 , if |t| < 1
- h(t) = | 4-8|t|+5|t|**2-|t|**3 , if 1<=|t|<2
- | 0 , otherwise
- \
- \endverbatim
- * ***bd*** 2.2004
- */
-float CxImage::KernelCubic(const float t)
-{
- float abs_t = (float)fabs(t);
- float abs_t_sq = abs_t * abs_t;
- if (abs_t<1) return 1-2*abs_t_sq+abs_t_sq*abs_t;
- if (abs_t<2) return 4 - 8*abs_t +5*abs_t_sq - abs_t_sq*abs_t;
- return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Bicubic kernel (for a=-1 it is the same as BicubicKernel):
- \verbatim
- /
- | (a+2)|t|**3 - (a+3)|t|**2 + 1 , |t| <= 1
- h(t) = | a|t|**3 - 5a|t|**2 + 8a|t| - 4a , 1 < |t| <= 2
- | 0 , otherwise
- \
- \endverbatim
- * Often used values for a are -1 and -1/2.
- */
-float CxImage::KernelGeneralizedCubic(const float t, const float a)
-{
- float abs_t = (float)fabs(t);
- float abs_t_sq = abs_t * abs_t;
- if (abs_t<1) return (a+2)*abs_t_sq*abs_t - (a+3)*abs_t_sq + 1;
- if (abs_t<2) return a*abs_t_sq*abs_t - 5*a*abs_t_sq + 8*a*abs_t - 4*a;
- return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Lanczos windowed sinc interpolation kernel with radius r.
- \verbatim
- /
- h(t) = | sinc(t)*sinc(t/r) , if |t| r) return 0;
- if (t==0) return 1;
- float pit=PI*t;
- float pitd=pit/r;
- return (float)((sin(pit)/pit) * (sin(pitd)/pitd));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBox(const float x)
-{
- if (x < -0.5f)
- return 0.0f;
- if (x < 0.5f)
- return 1.0f;
- return 0.0f;
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelHermite(const float x)
-{
- if (x < -1.0f)
- return 0.0f;
- if (x < 0.0f)
- return (-2.0f*x-3.0f)*x*x+1.0f;
- if (x < 1.0f)
- return (2.0f*x-3.0f)*x*x+1.0f;
- return 0.0f;
-// if (fabs(x)>1) return 0.0f;
-// return(0.5f+0.5f*(float)cos(PI*x));
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelHamming(const float x)
-{
- if (x < -1.0f)
- return 0.0f;
- if (x < 0.0f)
- return 0.92f*(-2.0f*x-3.0f)*x*x+1.0f;
- if (x < 1.0f)
- return 0.92f*(2.0f*x-3.0f)*x*x+1.0f;
- return 0.0f;
-// if (fabs(x)>1) return 0.0f;
-// return(0.54f+0.46f*(float)cos(PI*x));
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelSinc(const float x)
-{
- if (x == 0.0)
- return(1.0);
- return((float)sin(PI*x)/(PI*x));
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBlackman(const float x)
-{
- //if (fabs(x)>1) return 0.0f;
- return (0.42f+0.5f*(float)cos(PI*x)+0.08f*(float)cos(2.0f*PI*x));
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBessel_J1(const float x)
-{
- double p, q;
-
- register long i;
-
- static const double
- Pone[] =
- {
- 0.581199354001606143928050809e+21,
- -0.6672106568924916298020941484e+20,
- 0.2316433580634002297931815435e+19,
- -0.3588817569910106050743641413e+17,
- 0.2908795263834775409737601689e+15,
- -0.1322983480332126453125473247e+13,
- 0.3413234182301700539091292655e+10,
- -0.4695753530642995859767162166e+7,
- 0.270112271089232341485679099e+4
- },
- Qone[] =
- {
- 0.11623987080032122878585294e+22,
- 0.1185770712190320999837113348e+20,
- 0.6092061398917521746105196863e+17,
- 0.2081661221307607351240184229e+15,
- 0.5243710262167649715406728642e+12,
- 0.1013863514358673989967045588e+10,
- 0.1501793594998585505921097578e+7,
- 0.1606931573481487801970916749e+4,
- 0.1e+1
- };
-
- p = Pone[8];
- q = Qone[8];
- for (i=7; i >= 0; i--)
- {
- p = p*x*x+Pone[i];
- q = q*x*x+Qone[i];
- }
- return (float)(p/q);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBessel_P1(const float x)
-{
- double p, q;
-
- register long i;
-
- static const double
- Pone[] =
- {
- 0.352246649133679798341724373e+5,
- 0.62758845247161281269005675e+5,
- 0.313539631109159574238669888e+5,
- 0.49854832060594338434500455e+4,
- 0.2111529182853962382105718e+3,
- 0.12571716929145341558495e+1
- },
- Qone[] =
- {
- 0.352246649133679798068390431e+5,
- 0.626943469593560511888833731e+5,
- 0.312404063819041039923015703e+5,
- 0.4930396490181088979386097e+4,
- 0.2030775189134759322293574e+3,
- 0.1e+1
- };
-
- p = Pone[5];
- q = Qone[5];
- for (i=4; i >= 0; i--)
- {
- p = p*(8.0/x)*(8.0/x)+Pone[i];
- q = q*(8.0/x)*(8.0/x)+Qone[i];
- }
- return (float)(p/q);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBessel_Q1(const float x)
-{
- double p, q;
-
- register long i;
-
- static const double
- Pone[] =
- {
- 0.3511751914303552822533318e+3,
- 0.7210391804904475039280863e+3,
- 0.4259873011654442389886993e+3,
- 0.831898957673850827325226e+2,
- 0.45681716295512267064405e+1,
- 0.3532840052740123642735e-1
- },
- Qone[] =
- {
- 0.74917374171809127714519505e+4,
- 0.154141773392650970499848051e+5,
- 0.91522317015169922705904727e+4,
- 0.18111867005523513506724158e+4,
- 0.1038187585462133728776636e+3,
- 0.1e+1
- };
-
- p = Pone[5];
- q = Qone[5];
- for (i=4; i >= 0; i--)
- {
- p = p*(8.0/x)*(8.0/x)+Pone[i];
- q = q*(8.0/x)*(8.0/x)+Qone[i];
- }
- return (float)(p/q);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBessel_Order1(float x)
-{
- float p, q;
-
- if (x == 0.0)
- return (0.0f);
- p = x;
- if (x < 0.0)
- x=(-x);
- if (x < 8.0)
- return(p*KernelBessel_J1(x));
- q = (float)sqrt(2.0f/(PI*x))*(float)(KernelBessel_P1(x)*(1.0f/sqrt(2.0f)*(sin(x)-cos(x)))-8.0f/x*KernelBessel_Q1(x)*
- (-1.0f/sqrt(2.0f)*(sin(x)+cos(x))));
- if (p < 0.0f)
- q = (-q);
- return (q);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelBessel(const float x)
-{
- if (x == 0.0f)
- return(PI/4.0f);
- return(KernelBessel_Order1(PI*x)/(2.0f*x));
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelGaussian(const float x)
-{
- return (float)(exp(-2.0f*x*x)*0.79788456080287f/*sqrt(2.0f/PI)*/);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelQuadratic(const float x)
-{
- if (x < -1.5f)
- return(0.0f);
- if (x < -0.5f)
- return(0.5f*(x+1.5f)*(x+1.5f));
- if (x < 0.5f)
- return(0.75f-x*x);
- if (x < 1.5f)
- return(0.5f*(x-1.5f)*(x-1.5f));
- return(0.0f);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelMitchell(const float x)
-{
-#define KM_B (1.0f/3.0f)
-#define KM_C (1.0f/3.0f)
-#define KM_P0 (( 6.0f - 2.0f * KM_B ) / 6.0f)
-#define KM_P2 ((-18.0f + 12.0f * KM_B + 6.0f * KM_C) / 6.0f)
-#define KM_P3 (( 12.0f - 9.0f * KM_B - 6.0f * KM_C) / 6.0f)
-#define KM_Q0 (( 8.0f * KM_B + 24.0f * KM_C) / 6.0f)
-#define KM_Q1 ((-12.0f * KM_B - 48.0f * KM_C) / 6.0f)
-#define KM_Q2 (( 6.0f * KM_B + 30.0f * KM_C) / 6.0f)
-#define KM_Q3 (( -1.0f * KM_B - 6.0f * KM_C) / 6.0f)
-
- if (x < -2.0)
- return(0.0f);
- if (x < -1.0)
- return(KM_Q0-x*(KM_Q1-x*(KM_Q2-x*KM_Q3)));
- if (x < 0.0f)
- return(KM_P0+x*x*(KM_P2-x*KM_P3));
- if (x < 1.0f)
- return(KM_P0+x*x*(KM_P2+x*KM_P3));
- if (x < 2.0f)
- return(KM_Q0+x*(KM_Q1+x*(KM_Q2+x*KM_Q3)));
- return(0.0f);
-}
-////////////////////////////////////////////////////////////////////////////////
-float CxImage::KernelCatrom(const float x)
-{
- if (x < -2.0)
- return(0.0f);
- if (x < -1.0)
- return(0.5f*(4.0f+x*(8.0f+x*(5.0f+x))));
- if (x < 0.0)
- return(0.5f*(2.0f+x*x*(-5.0f-3.0f*x)));
- if (x < 1.0)
- return(0.5f*(2.0f+x*x*(-5.0f+3.0f*x)));
- if (x < 2.0)
- return(0.5f*(4.0f+x*(-8.0f+x*(5.0f-x))));
- return(0.0f);
-}
-////////////////////////////////////////////////////////////////////////////////
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximaiter.h b/src/win32/dependencies/cximage/ximaiter.h
deleted file mode 100644
index 39fc5afd..00000000
--- a/src/win32/dependencies/cximage/ximaiter.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * File: ImaIter.h
- * Purpose: Declaration of the Platform Independent Image Base Class
- * Author: Alejandro Aguilar Sierra
- * Created: 1995
- * Copyright: (c) 1995, Alejandro Aguilar Sierra
- *
- * 07/08/2001 Davide Pizzolato - www.xdp.it
- * - removed slow loops
- * - added safe checks
- *
- * Permission is given by the author to freely redistribute and include
- * this code in any program as long as this credit is given where due.
- *
- * COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
- * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
- * THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
- * OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
- * CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
- * THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
- * SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
- * PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
- * THIS DISCLAIMER.
- *
- * Use at your own risk!
- * ==========================================================
- */
-
-#if !defined(__ImaIter_h)
-#define __ImaIter_h
-
-#include "ximage.h"
-#include "ximadef.h"
-
-class CImageIterator
-{
-friend class CxImage;
-protected:
- int Itx, Ity; // Counters
- int Stepx, Stepy;
- BYTE* IterImage; // Image pointer
- CxImage *ima;
-public:
- // Constructors
- CImageIterator ( void );
- CImageIterator ( CxImage *image );
- operator CxImage* ();
-
- // Iterators
- BOOL ItOK ();
- void Reset ();
- void Upset ();
- void SetRow(BYTE *buf, int n);
- void GetRow(BYTE *buf, int n);
- BYTE GetByte( ) { return IterImage[Itx]; }
- void SetByte(BYTE b) { IterImage[Itx] = b; }
- BYTE* GetRow(void);
- BYTE* GetRow(int n);
- BOOL NextRow();
- BOOL PrevRow();
- BOOL NextByte();
- BOOL PrevByte();
-
- void SetSteps(int x, int y=0) { Stepx = x; Stepy = y; }
- void GetSteps(int *x, int *y) { *x = Stepx; *y = Stepy; }
- BOOL NextStep();
- BOOL PrevStep();
-
- void SetY(int y); /* AD - for interlace */
- int GetY() {return Ity;}
- BOOL GetCol(BYTE* pCol, DWORD x);
- BOOL SetCol(BYTE* pCol, DWORD x);
-};
-
-/////////////////////////////////////////////////////////////////////
-inline
-CImageIterator::CImageIterator(void)
-{
- ima = 0;
- IterImage = 0;
- Itx = Ity = 0;
- Stepx = Stepy = 0;
-}
-/////////////////////////////////////////////////////////////////////
-inline
-CImageIterator::CImageIterator(CxImage *imageImpl): ima(imageImpl)
-{
- if (ima) IterImage = ima->GetBits();
- Itx = Ity = 0;
- Stepx = Stepy = 0;
-}
-/////////////////////////////////////////////////////////////////////
-inline
-CImageIterator::operator CxImage* ()
-{
- return ima;
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::ItOK ()
-{
- if (ima) return ima->IsInside(Itx, Ity);
- else return FALSE;
-}
-/////////////////////////////////////////////////////////////////////
-inline void CImageIterator::Reset()
-{
- if (ima) IterImage = ima->GetBits();
- else IterImage=0;
- Itx = Ity = 0;
-}
-/////////////////////////////////////////////////////////////////////
-inline void CImageIterator::Upset()
-{
- Itx = 0;
- Ity = ima->GetHeight()-1;
- IterImage = ima->GetBits() + ima->GetEffWidth()*(ima->GetHeight()-1);
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::NextRow()
-{
- if (++Ity >= (int)ima->GetHeight()) return 0;
- IterImage += ima->GetEffWidth();
- return 1;
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::PrevRow()
-{
- if (--Ity < 0) return 0;
- IterImage -= ima->GetEffWidth();
- return 1;
-}
-/* AD - for interlace */
-inline void CImageIterator::SetY(int y)
-{
- if ((y < 0) || (y > (int)ima->GetHeight())) return;
- Ity = y;
- IterImage = ima->GetBits() + ima->GetEffWidth()*y;
-}
-/////////////////////////////////////////////////////////////////////
-inline void CImageIterator::SetRow(BYTE *buf, int n)
-{
- if (n<0) n = (int)ima->GetEffWidth();
- else n = min(n,(int)ima->GetEffWidth());
-
- if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0)) memcpy(IterImage,buf,n);
-}
-/////////////////////////////////////////////////////////////////////
-inline void CImageIterator::GetRow(BYTE *buf, int n)
-{
- if ((IterImage!=NULL)&&(buf!=NULL)&&(n>0)) memcpy(buf,IterImage,n);
-}
-/////////////////////////////////////////////////////////////////////
-inline BYTE* CImageIterator::GetRow()
-{
- return IterImage;
-}
-/////////////////////////////////////////////////////////////////////
-inline BYTE* CImageIterator::GetRow(int n)
-{
- SetY(n);
- return IterImage;
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::NextByte()
-{
- if (++Itx < (int)ima->GetEffWidth()) return 1;
- else
- if (++Ity < (int)ima->GetHeight()){
- IterImage += ima->GetEffWidth();
- Itx = 0;
- return 1;
- } else
- return 0;
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::PrevByte()
-{
- if (--Itx >= 0) return 1;
- else
- if (--Ity >= 0){
- IterImage -= ima->GetEffWidth();
- Itx = 0;
- return 1;
- } else
- return 0;
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::NextStep()
-{
- Itx += Stepx;
- if (Itx < (int)ima->GetEffWidth()) return 1;
- else {
- Ity += Stepy;
- if (Ity < (int)ima->GetHeight()){
- IterImage += ima->GetEffWidth();
- Itx = 0;
- return 1;
- } else
- return 0;
- }
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::PrevStep()
-{
- Itx -= Stepx;
- if (Itx >= 0) return 1;
- else {
- Ity -= Stepy;
- if (Ity >= 0 && Ity < (int)ima->GetHeight()) {
- IterImage -= ima->GetEffWidth();
- Itx = 0;
- return 1;
- } else
- return 0;
- }
-}
-/////////////////////////////////////////////////////////////////////
-inline BOOL CImageIterator::GetCol(BYTE* pCol, DWORD x)
-{
- if ((pCol==0)||(ima->GetBpp()<8)||(x>=ima->GetWidth()))
- return 0;
- DWORD h = ima->GetHeight();
- //DWORD line = ima->GetEffWidth();
- BYTE bytes = ima->GetBpp()>>3;
- BYTE* pSrc;
- for (DWORD y=0;yGetBits(y) + x*bytes;
- for (BYTE w=0;wGetBpp()<8)||(x>=ima->GetWidth()))
- return 0;
- DWORD h = ima->GetHeight();
- //DWORD line = ima->GetEffWidth();
- BYTE bytes = ima->GetBpp()>>3;
- BYTE* pSrc;
- for (DWORD y=0;yGetBits(y) + x*bytes;
- for (BYTE w=0;wSize();
- src=(BYTE*)malloc(len);
- hFile->Read(src, len, 1);
-
- if (!j2k_decode(src, len, &img, &cp)) {
- free(src);
- throw "failed to decode J2K image!";
- }
-
- free(src);
-
- if (img->numcomps==3 &&
- img->comps[0].dx==img->comps[1].dx &&
- img->comps[1].dx==img->comps[2].dx &&
- img->comps[0].dy==img->comps[1].dy &&
- img->comps[1].dy==img->comps[2].dy &&
- img->comps[0].prec==img->comps[1].prec &&
- img->comps[1].prec==img->comps[2].prec)
- {
- w=CEILDIV(img->x1-img->x0, img->comps[0].dx);
- h=CEILDIV(img->y1-img->y0, img->comps[0].dy);
- max=(1<comps[0].prec)-1;
-
- Create(w,h,24,CXIMAGE_FORMAT_J2K);
-
- RGBQUAD c;
- for (i=0,y=0; ycomps[0].data[i];
- c.rgbGreen = img->comps[1].data[i];
- c.rgbBlue = img->comps[2].data[i];
- SetPixelColor(x,h-1-y,c);
- }
- }
- } else {
- int compno;
- info.nNumFrames = img->numcomps;
- if ((info.nFrame<0)||(info.nFrame>=info.nNumFrames)){
- j2k_destroy(&img,&cp);
- throw "wrong frame!";
- }
- for (compno=0; compno<=info.nFrame; compno++) {
- w=CEILDIV(img->x1-img->x0, img->comps[compno].dx);
- h=CEILDIV(img->y1-img->y0, img->comps[compno].dy);
- max=(1<comps[compno].prec)-1;
- Create(w,h,8,CXIMAGE_FORMAT_J2K);
- SetGrayPalette();
- for (i=0,y=0; ycomps[compno].data[i]);
- }
- }
- }
- }
-
- j2k_destroy(&img,&cp);
-
- } catch (char *message) {
- strncpy(info.szLastError,message,255);
- return FALSE;
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageJ2K::Encode(CxFile * hFile)
-{
- if (EncodeSafeCheck(hFile)) return false;
-
- if (head.biClrUsed!=0 && !IsGrayScale()){
- strcpy(info.szLastError,"J2K can save only RGB or GrayScale images");
- return false;
- }
-
- int i,x,y;
- j2k_image_t *img;
- j2k_cp_t *cp;
- j2k_tcp_t *tcp;
- j2k_tccp_t *tccp;
-
- img = (j2k_image_t *)calloc(sizeof(j2k_image_t),1);
- cp = (j2k_cp_t *)calloc(sizeof(j2k_cp_t),1);
-
- cp->tx0=0; cp->ty0=0;
- cp->tw=1; cp->th=1;
- cp->tcps=(j2k_tcp_t*)calloc(sizeof(j2k_tcp_t),1);
- tcp=&cp->tcps[0];
-
- long w=head.biWidth;
- long h=head.biHeight;
-
- tcp->numlayers=1;
- for (i=0;inumlayers;i++) tcp->rates[i]=(w*h*GetJpegQuality())/600;
-
-
- if (IsGrayScale()) {
- img->x0=0;
- img->y0=0;
- img->x1=w;
- img->y1=h;
- img->numcomps=1;
- img->comps=(j2k_comp_t*)calloc(sizeof(j2k_comp_t),1);
- img->comps[0].data=(int*)calloc(w*h*sizeof(int),1);
- img->comps[0].prec=8;
- img->comps[0].sgnd=0;
- img->comps[0].dx=1;
- img->comps[0].dy=1;
- for (i=0,y=0; ycomps[0].data[i]=GetPixelIndex(x,h-1-y);
- }
- }
- } else if (!IsIndexed()) {
- img->x0=0;
- img->y0=0;
- img->x1=w;
- img->y1=h;
- img->numcomps=3;
- img->comps=(j2k_comp_t*)calloc(img->numcomps*sizeof(j2k_comp_t),1);
- for (i=0; inumcomps; i++) {
- img->comps[i].data=(int*)calloc(w*h*sizeof(int),1);
- img->comps[i].prec=8;
- img->comps[i].sgnd=0;
- img->comps[i].dx=1;
- img->comps[i].dy=1;
- }
- RGBQUAD c;
- for (i=0,y=0; ycomps[0].data[i]=c.rgbRed;
- img->comps[1].data[i]=c.rgbGreen;
- img->comps[2].data[i]=c.rgbBlue;
- }
- }
- } else {
- return 0;
- }
-
- cp->tdx=img->x1-img->x0;
- cp->tdy=img->y1-img->y0;
-
- tcp->csty=0;
- tcp->prg=0;
- tcp->mct=img->numcomps==3?1:0;
- tcp->tccps=(j2k_tccp_t*)calloc(img->numcomps*sizeof(j2k_tccp_t),1);
-
- int ir=0; /* or 1 ???*/
-
- for (i=0; inumcomps; i++) {
- tccp=&tcp->tccps[i];
- tccp->csty=0;
- tccp->numresolutions=6;
- tccp->cblkw=6;
- tccp->cblkh=6;
- tccp->cblksty=0;
- tccp->qmfbid=ir?0:1;
- tccp->qntsty=ir?J2K_CCP_QNTSTY_SEQNT:J2K_CCP_QNTSTY_NOQNT;
- tccp->numgbits=2;
- tccp->roishift=0;
- j2k_calc_explicit_stepsizes(tccp, img->comps[i].prec);
- }
-
- BYTE* dest=(BYTE*)calloc(tcp->rates[tcp->numlayers-1]+2,1);
- long len = j2k_encode(img, cp, dest, tcp->rates[tcp->numlayers-1]+2);
-
- if (len==0) {
- strcpy(info.szLastError,"J2K failed to encode image");
- } else {
- hFile->Write(dest, len, 1);
- }
-
- free(dest);
- j2k_destroy(&img,&cp);
-
- return (len!=0);
-}
-////////////////////////////////////////////////////////////////////////////////
-
-static const double dwt_norms_97[4][10]={
- {1.000, 1.965, 4.177, 8.403, 16.90, 33.84, 67.69, 135.3, 270.6, 540.9},
- {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
- {2.022, 3.989, 8.355, 17.04, 34.27, 68.63, 137.3, 274.6, 549.0},
- {2.080, 3.865, 8.307, 17.18, 34.71, 69.59, 139.3, 278.6, 557.2}
-};
-
-////////////////////////////////////////////////////////////////////////////////
-void CxImageJ2K::j2k_calc_explicit_stepsizes(j2k_tccp_t *tccp, int prec) {
- int numbands, bandno;
- numbands=3*tccp->numresolutions-2;
- for (bandno=0; bandnonumresolutions-1-resno;
- gain=tccp->qmfbid==0?0:(orient==0?0:(orient==1||orient==2?1:2));
- if (tccp->qntsty==J2K_CCP_QNTSTY_NOQNT) {
- stepsize=1.0;
- } else {
- double norm=dwt_norms_97[orient][level];
- stepsize=(1<<(gain+1))/norm;
- }
- j2k_encode_stepsize((int)floor(stepsize*8192.0), prec+gain, &tccp->stepsizes[bandno].expn, &tccp->stepsizes[bandno].mant);
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageJ2K::j2k_encode_stepsize(int stepsize, int numbps, int *expn, int *mant) {
- int p, n;
- p=j2k_floorlog2(stepsize)-13;
- n=11-j2k_floorlog2(stepsize);
- *mant=(n<0?stepsize>>-n:stepsize<1; l++) {
- a>>=1;
- }
- return l;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_J2K
diff --git a/src/win32/dependencies/cximage/ximaj2k.h b/src/win32/dependencies/cximage/ximaj2k.h
deleted file mode 100644
index 9f2642eb..00000000
--- a/src/win32/dependencies/cximage/ximaj2k.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * File: ximaj2k.h
- * Purpose: J2K Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageJ2K (c) 04/Aug/2002 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * based on LIBJ2K Copyright (c) 2001-2002, David Janssens - All rights reserved.
- * ==========================================================
- */
-#if !defined(__ximaJ2K_h)
-#define __ximaJ2K_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_J2K
-
-#define LIBJ2K_EXPORTS
-extern "C" {
-#include "../j2k/j2k.h"
-};
-
-class CxImageJ2K: public CxImage
-{
-public:
- CxImageJ2K(): CxImage(CXIMAGE_FORMAT_J2K) {}
-
-// bool Load(const char * imageFileName){ return CxImage::Load(imageFileName,CXIMAGE_FORMAT_J2K);}
-// bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,CXIMAGE_FORMAT_J2K);}
- bool Decode(CxFile * hFile);
- bool Decode(FILE *hFile) { CxIOFile file(hFile); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile);
- bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-protected:
- void j2k_calc_explicit_stepsizes(j2k_tccp_t *tccp, int prec);
- void j2k_encode_stepsize(int stepsize, int numbps, int *expn, int *mant);
- int j2k_floorlog2(int a);
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximajas.cpp b/src/win32/dependencies/cximage/ximajas.cpp
deleted file mode 100644
index fff99463..00000000
--- a/src/win32/dependencies/cximage/ximajas.cpp
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * File: ximajas.cpp
- * Purpose: Platform Independent JasPer Image Class Loader and Writer
- * 12/Apr/2003 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximajas.h"
-
-#if CXIMAGE_SUPPORT_JASPER
-
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageJAS::Decode(CxFile *hFile, DWORD imagetype)
-{
- if (hFile == NULL) return false;
-
- jas_image_t *image=0;
- jas_stream_t *in=0;
- jas_matrix_t **bufs=0;
- long i,error=0;
- //jas_setdbglevel(0);
-
- try
- {
- if (jas_init())
- throw "cannot initialize jasper";
-
- if (!(in = jas_stream_fdopen(0, "rb")))
- throw "error: cannot open standard input";
-
- CxFileJas src(hFile,in);
-
- if (!(image = jas_image_decode(in, -1, 0)))
- throw "error: cannot load image data";
-
- long x,y,w,h,depth,cmptno;
-
- w = jas_image_cmptwidth(image,0);
- h = jas_image_cmptheight(image,0);
- depth = jas_image_cmptprec(image,0);
-
- if (image->numcmpts_ > 64 || image->numcmpts_ < 0)
- throw "error: too much components";
-
- if (depth!=1 && depth!=4 && depth!=8){
- jas_image_t *newimage;
- jas_cmprof_t *outprof;
- //jas_eprintf("forcing conversion to sRGB\n");
- if (!(outprof = jas_cmprof_createfromclrspc(JAS_CLRSPC_SRGB))) {
- throw "cannot create sRGB profile";
- }
- if (!(newimage = jas_image_chclrspc(image, outprof, JAS_CMXFORM_INTENT_PER))) {
- throw "cannot convert to sRGB";
- }
- jas_image_destroy(image);
- jas_cmprof_destroy(outprof);
- image = newimage;
- }
-
- bufs = (jas_matrix_t **)calloc(image->numcmpts_, sizeof(jas_matrix_t**));
- for (i = 0; i < image->numcmpts_; ++i) {
- if (!(bufs[i] = jas_matrix_create(1, w))) {
- throw "error: cannot allocate memory";
- }
- }
-
- if (image->numcmpts_==3 &&
- image->cmpts_[0]->width_ == image->cmpts_[1]->width_ &&
- image->cmpts_[1]->width_ == image->cmpts_[2]->width_ &&
- image->cmpts_[0]->height_ == image->cmpts_[1]->height_ &&
- image->cmpts_[1]->height_ == image->cmpts_[2]->height_ &&
- image->cmpts_[0]->prec_ == image->cmpts_[1]->prec_ &&
- image->cmpts_[1]->prec_ == image->cmpts_[2]->prec_ )
- {
-
- if(!Create(w,h,24,imagetype))
- throw "Can't allocate memory";
-
- RGBQUAD c;
- for (y=0; ynumcmpts_; ++cmptno) {
- jas_image_readcmpt(image, cmptno, 0, y, w, 1, bufs[cmptno]);
- }
-
- for (x=0; xnumcmpts_;
- if ((info.nFrame<0)||(info.nFrame>=info.nNumFrames)){
- throw "wrong frame!";
- }
- for (cmptno=0; cmptno<=info.nFrame; cmptno++) {
- w = jas_image_cmptwidth(image,cmptno);
- h = jas_image_cmptheight(image,cmptno);
- depth = jas_image_cmptprec(image,cmptno);
- if (depth>8) depth=8;
- if(!Create(w,h,depth,imagetype))
- throw "Can't allocate memory";
- SetGrayPalette();
- for (y=0; ynumcmpts_; ++i){ if (bufs[i]) jas_matrix_destroy(bufs[i]);}
- free(bufs);
- }
- jas_cleanup();
- if (image) jas_image_destroy(image);
- if (in) jas_stream_close(in);
- return (error==0);
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageJAS::Encode(CxFile * hFile, DWORD imagetype)
-{
- if (EncodeSafeCheck(hFile)) return false;
-
- if (head.biClrUsed!=0 && !IsGrayScale()){
- strcpy(info.szLastError,"JasPer can save only RGB or GrayScale images");
- return false;
- }
-
- jas_image_t *image=0;
- jas_stream_t *out=0;
- jas_matrix_t *cmpts[3];
- long x,y,yflip,error=0;
- uint_fast16_t cmptno, numcmpts;
- jas_image_cmptparm_t cmptparms[3], *cmptparm;
-
- try
- {
-
- if (jas_init())
- throw "cannot initialize jasper";
-
- if (!(out = jas_stream_fdopen(0, "wb")))
- throw "error: cannot open standard output";
-
- CxFileJas src(hFile,out);
-
- numcmpts = head.biClrUsed==0 ? 3 : 1;
-
- for (cmptno = 0, cmptparm = cmptparms; cmptno < numcmpts; ++cmptno, ++cmptparm) {
- cmptparm->tlx = 0;
- cmptparm->tly = 0;
- cmptparm->hstep = 1;
- cmptparm->vstep = 1;
- cmptparm->width = head.biWidth;
- cmptparm->height = head.biHeight;
- cmptparm->prec = 8;
- cmptparm->sgnd = false;
- }
-
- /* Create image object. */
- if (!(image = jas_image_create(numcmpts, cmptparms, JAS_CLRSPC_UNKNOWN)))
- throw "error : jas_image_create";
-
- if (numcmpts == 3) {
- jas_image_setclrspc(image, JAS_CLRSPC_SRGB);
- jas_image_setcmpttype(image, 0,
- JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_R));
- jas_image_setcmpttype(image, 1,
- JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_G));
- jas_image_setcmpttype(image, 2,
- JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_RGB_B));
- } else {
- jas_image_setclrspc(image, JAS_CLRSPC_SGRAY);
- jas_image_setcmpttype(image, 0,
- JAS_IMAGE_CT_COLOR(JAS_CLRSPC_CHANIND_GRAY_Y));
- }
-
-
- for (x = 0; x < numcmpts; ++x) { cmpts[x] = 0; }
- /* Create temporary matrices to hold component data. */
- for (x = 0; x < numcmpts; ++x) {
- if (!(cmpts[x] = jas_matrix_create(1, head.biWidth))) {
- throw "error : can't allocate memory";
- }
- }
-
- RGBQUAD c;
- for (y = 0; y < head.biHeight; ++y) {
- for (x = 0; x < head.biWidth; ++x) {
- if (head.biClrUsed==0){
- c = GetPixelColor(x,y);
- jas_matrix_setv(cmpts[0], x, c.rgbRed);
- jas_matrix_setv(cmpts[1], x, c.rgbGreen);
- jas_matrix_setv(cmpts[2], x, c.rgbBlue);
- } else {
- jas_matrix_setv(cmpts[0], x, GetPixelIndex(x,y));
- }
- }
- yflip = head.biHeight - 1 - y;
- for (cmptno = 0; cmptno < numcmpts; ++cmptno) {
- if (jas_image_writecmpt(image, cmptno, 0, yflip, head.biWidth, 1, cmpts[cmptno])) {
- throw "error : jas_image_writecmpt";
- }
- }
- }
-
- char szfmt[4];
- *szfmt = '\0';
-#if CXIMAGE_SUPPORT_JP2
- if (imagetype == CXIMAGE_FORMAT_JP2) strcpy(szfmt,"jp2");
-#endif
-#if CXIMAGE_SUPPORT_JPC
- if (imagetype == CXIMAGE_FORMAT_JPC) strcpy(szfmt,"jpc");
-#endif
-#if CXIMAGE_SUPPORT_RAS
- if (imagetype == CXIMAGE_FORMAT_RAS) strcpy(szfmt,"ras");
-#endif
-#if CXIMAGE_SUPPORT_PNM
- if (imagetype == CXIMAGE_FORMAT_PNM) strcpy(szfmt,"pnm");
-#endif
-#if CXIMAGE_SUPPORT_PGX
- if (imagetype == CXIMAGE_FORMAT_PGX){
- strcpy(szfmt,"pgx");
- if (head.biClrUsed==0) throw "PGX can save only GrayScale images";
- }
-#endif
- int outfmt = jas_image_strtofmt(szfmt);
-
- char szoutopts[16];
- sprintf(szoutopts,"rate=%.3f", info.nQuality/100.0f);
-
- if (jas_image_encode(image, out, outfmt, szoutopts)) {
- throw "error: cannot encode image\n";
- }
- jas_stream_flush(out);
-
- } catch (char *message) {
- strncpy(info.szLastError,message,255);
- error = 1;
- }
-
- for (x = 0; x < numcmpts; ++x) { if (cmpts[x]) { jas_matrix_destroy(cmpts[x]); } }
- jas_cleanup();
- if (image) jas_image_destroy(image);
- if (out) jas_stream_close(out);
-
- return (error==0);
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_JASPER
-
diff --git a/src/win32/dependencies/cximage/ximajas.h b/src/win32/dependencies/cximage/ximajas.h
deleted file mode 100644
index 3fd1414a..00000000
--- a/src/win32/dependencies/cximage/ximajas.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * File: ximajas.h
- * Purpose: Jasper Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageJAS (c) 12/Apr/2003 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * based on JasPer Copyright (c) 2001-2003 Michael David Adams - All rights reserved.
- * ==========================================================
- */
-#if !defined(__ximaJAS_h)
-#define __ximaJAS_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_JASPER
-
-#include "../jasper/include/jasper/jasper.h"
-
-class CxImageJAS: public CxImage
-{
-public:
- CxImageJAS(): CxImage((DWORD)0) {} // cast to DWORD
-
-// bool Load(const char * imageFileName){ return CxImage::Load(imageFileName,0);}
-// bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,0);}
- bool Decode(CxFile * hFile, DWORD imagetype = 0);
- bool Decode(FILE *hFile, DWORD imagetype = 0) { CxIOFile file(hFile); return Decode(&file,imagetype); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile, DWORD imagetype = 0);
- bool Encode(FILE *hFile, DWORD imagetype = 0) { CxIOFile file(hFile); return Encode(&file,imagetype); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-protected:
-
- class CxFileJas
- {
- public:
- CxFileJas(CxFile* pFile,jas_stream_t *stream)
- {
- if (stream->obj_) jas_free(stream->obj_);
- stream->obj_ = pFile;
-
- // - cannot set the stream->ops_->functions here,
- // because this overwrites a static structure in the Jasper library.
- // This structure is used by Jasper for internal operations too, e.g. tempfile.
- // However the ops_ pointer in the stream can be overwritten.
-
- //stream->ops_->close_ = JasClose;
- //stream->ops_->read_ = JasRead;
- //stream->ops_->seek_ = JasSeek;
- //stream->ops_->write_ = JasWrite;
-
- jas_stream_CxFile.close_ = JasClose;
- jas_stream_CxFile.read_ = JasRead;
- jas_stream_CxFile.seek_ = JasSeek;
- jas_stream_CxFile.write_ = JasWrite;
-
- stream->ops_ = &jas_stream_CxFile;
-
- // - end
- }
- static int JasRead(jas_stream_obj_t *obj, char *buf, int cnt)
- { return ((CxFile*)obj)->Read(buf,1,cnt); }
- static int JasWrite(jas_stream_obj_t *obj, char *buf, int cnt)
- { return ((CxFile*)obj)->Write(buf,1,cnt); }
- static long JasSeek(jas_stream_obj_t *obj, long offset, int origin)
- { return ((CxFile*)obj)->Seek(offset,origin); }
- static int JasClose(jas_stream_obj_t *obj)
- { return 1; }
-
- //
- private:
- jas_stream_ops_t jas_stream_CxFile;
- // - end
-
- };
-
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximajbg.cpp b/src/win32/dependencies/cximage/ximajbg.cpp
deleted file mode 100644
index 1866b3ed..00000000
--- a/src/win32/dependencies/cximage/ximajbg.cpp
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * File: ximajbg.cpp
- * Purpose: Platform Independent JBG Image Class Loader and Writer
- * 18/Aug/2002 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximajbg.h"
-
-#if CXIMAGE_SUPPORT_JBG
-
-#include "ximaiter.h"
-
-#define JBIG_BUFSIZE 8192
-
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageJBG::Decode(CxFile *hFile)
-{
- if (hFile == NULL) return false;
-
- struct jbg_dec_state jbig_state;
- unsigned long xmax = 4294967295UL, ymax = 4294967295UL;
- unsigned int len, cnt;
- BYTE *buffer,*p;
- int result;
-
- try
- {
- jbg_dec_init(&jbig_state);
- jbg_dec_maxsize(&jbig_state, xmax, ymax);
-
- buffer = (BYTE*)malloc(JBIG_BUFSIZE);
- if (!buffer) throw "Sorry, not enough memory available!";
-
- result = JBG_EAGAIN;
- do {
- len = hFile->Read(buffer, 1, JBIG_BUFSIZE);
- if (!len) break;
- cnt = 0;
- p = buffer;
- while (len > 0 && (result == JBG_EAGAIN || result == JBG_EOK)) {
- result = jbg_dec_in(&jbig_state, p, len, &cnt);
- p += cnt;
- len -= cnt;
- }
- } while (result == JBG_EAGAIN || result == JBG_EOK);
-
- if (hFile->Error())
- throw "Problem while reading input file";
- if (result != JBG_EOK && result != JBG_EOK_INTR)
- throw "Problem with input file";
-
- int w, h, bpp, planes, ew;
-
- w = jbg_dec_getwidth(&jbig_state);
- h = jbg_dec_getheight(&jbig_state);
- planes = jbg_dec_getplanes(&jbig_state);
- bpp = (planes+7)>>3;
- ew = (w + 7)>>3;
-
- switch (planes){
- case 1:
- {
- BYTE* binary_image = jbg_dec_getimage(&jbig_state, 0);
-
- if (!Create(w,h,1,CXIMAGE_FORMAT_JBG))
- throw "Can't allocate memory";
-
- SetPaletteColor(0,255,255,255);
- SetPaletteColor(1,0,0,0);
-
- CImageIterator iter(this);
- iter.Upset();
- for (int i=0;i>3;
- ew = (w + 7)>>3;
-
- BYTE mask;
- RGBQUAD *rgb = GetPalette();
- if (CompareColors(&rgb[0],&rgb[1])<0) mask=255; else mask=0;
-
- BYTE *buffer = (BYTE*)malloc(ew*h*2);
- if (!buffer) {
- strcpy(info.szLastError,"Sorry, not enough memory available!");
- return false;
- }
-
- for (y=0; yError()){
- strcpy(info.szLastError,"Problem while writing JBG file");
- return false;
- }
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_JBG
-
diff --git a/src/win32/dependencies/cximage/ximajbg.h b/src/win32/dependencies/cximage/ximajbg.h
deleted file mode 100644
index bf1fdca7..00000000
--- a/src/win32/dependencies/cximage/ximajbg.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * File: ximajbg.h
- * Purpose: JBG Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageJBG (c) 18/Aug/2002 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * based on LIBJBG Copyright (c) 2002, Markus Kuhn - All rights reserved.
- * ==========================================================
- */
-#if !defined(__ximaJBG_h)
-#define __ximaJBG_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_JBG
-
-extern "C" {
-#include "../jbig/jbig.h"
-};
-
-class CxImageJBG: public CxImage
-{
-public:
- CxImageJBG(): CxImage(CXIMAGE_FORMAT_JBG) {}
-
-// bool Load(const char * imageFileName){ return CxImage::Load(imageFileName,CXIMAGE_FORMAT_JBG);}
-// bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,CXIMAGE_FORMAT_JBG);}
- bool Decode(CxFile * hFile);
- bool Decode(FILE *hFile) { CxIOFile file(hFile); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile);
- bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-protected:
- static void jbig_data_out(BYTE *buffer, unsigned int len, void *file)
- {((CxFile*)file)->Write(buffer,len,1);}
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximajpg.cpp b/src/win32/dependencies/cximage/ximajpg.cpp
deleted file mode 100644
index e1e2f36a..00000000
--- a/src/win32/dependencies/cximage/ximajpg.cpp
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
- * File: ximajpg.cpp
- * Purpose: Platform Independent JPEG Image Class Loader and Writer
- * 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximajpg.h"
-
-#if CXIMAGE_SUPPORT_JPG
-
-#include "../jpeg/jmorecfg.h"
-
-#include "ximaiter.h"
-
-#include
-
-struct jpg_error_mgr {
- struct jpeg_error_mgr pub; /* "public" fields */
- jmp_buf setjmp_buffer; /* for return to caller */
- char* buffer; /* error message */
-};
-typedef jpg_error_mgr *jpg_error_ptr;
-
-////////////////////////////////////////////////////////////////////////////////
-// Here's the routine that will replace the standard error_exit method:
-////////////////////////////////////////////////////////////////////////////////
-static void
-ima_jpeg_error_exit (j_common_ptr cinfo)
-{
- /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
- jpg_error_ptr myerr = (jpg_error_ptr) cinfo->err;
- /* Create the message */
- myerr->pub.format_message (cinfo, myerr->buffer);
- /* Send it to stderr, adding a newline */
- /* Return control to the setjmp point */
- longjmp(myerr->setjmp_buffer, 1);
-}
-////////////////////////////////////////////////////////////////////////////////
-CxImageJPG::CxImageJPG(): CxImage(CXIMAGE_FORMAT_JPG)
-{
-#if CXIMAGEJPG_SUPPORT_EXIF
- m_exif = NULL;
- memset(&m_exifinfo, 0, sizeof(EXIFINFO));
-#endif
-}
-////////////////////////////////////////////////////////////////////////////////
-CxImageJPG::~CxImageJPG()
-{
-#if CXIMAGEJPG_SUPPORT_EXIF
- if (m_exif) delete m_exif;
-#endif
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGEJPG_SUPPORT_EXIF
-bool CxImageJPG::DecodeExif(CxFile * hFile)
-{
- m_exif = new CxExifInfo(&m_exifinfo);
- if (m_exif){
- long pos=hFile->Tell();
- m_exif->DecodeExif(hFile);
- hFile->Seek(pos,SEEK_SET);
- return m_exif->m_exifinfo->IsExif;
- } else {
- return false;
- }
-}
-#endif //CXIMAGEJPG_SUPPORT_EXIF
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageJPG::Decode(CxFile * hFile)
-{
-
- bool is_exif = false;
-#if CXIMAGEJPG_SUPPORT_EXIF
- is_exif = DecodeExif(hFile);
-#endif
-
- CImageIterator iter(this);
- /* This struct contains the JPEG decompression parameters and pointers to
- * working space (which is allocated as needed by the JPEG library).
- */
- struct jpeg_decompress_struct cinfo;
- /* We use our private extension JPEG error handler. */
- struct jpg_error_mgr jerr;
- jerr.buffer=info.szLastError;
- /* More stuff */
- JSAMPARRAY buffer; /* Output row buffer */
- int row_stride; /* physical row width in output buffer */
-
- /* In this example we want to open the input file before doing anything else,
- * so that the setjmp() error recovery below can assume the file is open.
- * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
- * requires it in order to read binary files.
- */
-
- /* Step 1: allocate and initialize JPEG decompression object */
- /* We set up the normal JPEG error routines, then override error_exit. */
- cinfo.err = jpeg_std_error(&jerr.pub);
- jerr.pub.error_exit = ima_jpeg_error_exit;
-
- /* Establish the setjmp return context for my_error_exit to use. */
- if (setjmp(jerr.setjmp_buffer)) {
- /* If we get here, the JPEG code has signaled an error.
- * We need to clean up the JPEG object, close the input file, and return.
- */
- jpeg_destroy_decompress(&cinfo);
- return 0;
- }
- /* Now we can initialize the JPEG decompression object. */
- jpeg_create_decompress(&cinfo);
-
- /* Step 2: specify data source (eg, a file) */
- //jpeg_stdio_src(&cinfo, infile);
- CxFileJpg src(hFile);
- cinfo.src = &src;
-
- /* Step 3: read file parameters with jpeg_read_header() */
- (void) jpeg_read_header(&cinfo, TRUE);
-
- /* Step 4 handle decoder options*/
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & DECODE_GRAYSCALE) != 0)
- cinfo.out_color_space = JCS_GRAYSCALE;
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & DECODE_QUANTIZE) != 0) {
- cinfo.quantize_colors = TRUE;
- cinfo.desired_number_of_colors = info.nQuality;
- }
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & DECODE_DITHER) != 0)
- cinfo.dither_mode = m_nDither;
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & DECODE_ONEPASS) != 0)
- cinfo.two_pass_quantize = FALSE;
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & DECODE_NOSMOOTH) != 0)
- cinfo.do_fancy_upsampling = FALSE;
-
-//: Load true color images as RGB (no quantize)
-/* Step 4: set parameters for decompression */
-/* if (cinfo.jpeg_color_space!=JCS_GRAYSCALE) {
- * cinfo.quantize_colors = TRUE;
- * cinfo.desired_number_of_colors = 128;
- *}
- */ //
-
- // Set the scale
- cinfo.scale_denom = GetJpegScale();
-
- // Borrowed the idea from GIF implementation
- if (info.nEscape == -1) {
- // Return output dimensions only
- jpeg_calc_output_dimensions(&cinfo);
- head.biWidth = cinfo.output_width;
- head.biHeight = cinfo.output_height;
- jpeg_destroy_decompress(&cinfo);
- return true;
- }
-
- /* Step 5: Start decompressor */
- jpeg_start_decompress(&cinfo);
-
- /* We may need to do some setup of our own at this point before reading
- * the data. After jpeg_start_decompress() we have the correct scaled
- * output image dimensions available, as well as the output colormap
- * if we asked for color quantization.
- */
- //Create the image using output dimensions
- //Create(cinfo.image_width, cinfo.image_height, 8*cinfo.output_components, CXIMAGE_FORMAT_JPG);
- Create(cinfo.output_width, cinfo.output_height, 8*cinfo.output_components, CXIMAGE_FORMAT_JPG);
-
- if (!pDib) longjmp(jerr.setjmp_buffer, 1); // check if the image has been created
-
- if (is_exif){
-#if CXIMAGEJPG_SUPPORT_EXIF
- if ((m_exifinfo.Xresolution != 0.0) && (m_exifinfo.ResolutionUnit != 0))
- SetXDPI((long)(m_exifinfo.Xresolution/m_exifinfo.ResolutionUnit));
- if ((m_exifinfo.Yresolution != 0.0) && (m_exifinfo.ResolutionUnit != 0))
- SetYDPI((long)(m_exifinfo.Yresolution/m_exifinfo.ResolutionUnit));
-#endif
- } else {
- if (cinfo.density_unit==2){
- SetXDPI((long)floor(cinfo.X_density * 254.0 / 10000.0 + 0.5));
- SetYDPI((long)floor(cinfo.Y_density * 254.0 / 10000.0 + 0.5));
- } else {
- SetXDPI(cinfo.X_density);
- SetYDPI(cinfo.Y_density);
- }
- }
-
- if (cinfo.out_color_space==JCS_GRAYSCALE){
- SetGrayPalette();
- head.biClrUsed =256;
- } else {
- if (cinfo.quantize_colors==TRUE){
- SetPalette(cinfo.actual_number_of_colors, cinfo.colormap[0], cinfo.colormap[1], cinfo.colormap[2]);
- head.biClrUsed=cinfo.actual_number_of_colors;
- } else {
- head.biClrUsed=0;
- }
- }
-
- /* JSAMPLEs per row in output buffer */
- row_stride = cinfo.output_width * cinfo.output_components;
-
- /* Make a one-row-high sample array that will go away when done with image */
- buffer = (*cinfo.mem->alloc_sarray)
- ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
-
- /* Step 6: while (scan lines remain to be read) */
- /* jpeg_read_scanlines(...); */
- /* Here we use the library's state variable cinfo.output_scanline as the
- * loop counter, so that we don't have to keep track ourselves.
- */
- iter.Upset();
- while (cinfo.output_scanline < cinfo.output_height) {
-
- if (info.nEscape) longjmp(jerr.setjmp_buffer, 1); // - cancel decoding
-
- (void) jpeg_read_scanlines(&cinfo, buffer, 1);
- // info.nProgress = (long)(100*cinfo.output_scanline/cinfo.output_height);
- // Step 6a: CMYK->RGB */
- if ((cinfo.num_components==4)&&(cinfo.quantize_colors==FALSE)){
- BYTE k,*dst,*src;
- dst=iter.GetRow();
- src=buffer[0];
- for(long x3=0,x4=0; x3<(long)info.dwEffWidth && x4 Step 7A: Swap red and blue components
- // not necessary if swapped red and blue definition in jmorecfg.h;ln322
- if ((cinfo.num_components==3)&&(cinfo.quantize_colors==FALSE)){
- BYTE* r0=GetBits();
- for(long y=0;y - cancel decoding
- RGBtoBGR(r0,3*head.biWidth);
- r0+=info.dwEffWidth;
- }
- }
-
- /* Step 8: Release JPEG decompression object */
- /* This is an important step since it will release a good deal of memory. */
- jpeg_destroy_decompress(&cinfo);
-
- /* At this point you may want to check to see whether any corrupt-data
- * warnings occurred (test whether jerr.pub.num_warnings is nonzero).
- */
-
- /* And we're done! */
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageJPG::Encode(CxFile * hFile)
-{
- if (EncodeSafeCheck(hFile)) return false;
-
- if (head.biClrUsed!=0 && !IsGrayScale()){
- strcpy(info.szLastError,"JPEG can save only RGB or GreyScale images");
- return false;
- }
-
- // necessary for EXIF, and for roll backs
- long pos=hFile->Tell();
-
- /* This struct contains the JPEG compression parameters and pointers to
- * working space (which is allocated as needed by the JPEG library).
- * It is possible to have several such structures, representing multiple
- * compression/decompression processes, in existence at once. We refer
- * to any one struct (and its associated working data) as a "JPEG object".
- */
- struct jpeg_compress_struct cinfo;
- /* This struct represents a JPEG error handler. It is declared separately
- * because applications often want to supply a specialized error handler
- * (see the second half of this file for an example). But here we just
- * take the easy way out and use the standard error handler, which will
- * print a message on stderr and call exit() if compression fails.
- * Note that this struct must live as long as the main JPEG parameter
- * struct, to avoid dangling-pointer problems.
- */
- //struct jpeg_error_mgr jerr;
- /* We use our private extension JPEG error handler. */
- struct jpg_error_mgr jerr;
- jerr.buffer=info.szLastError;
- /* More stuff */
- int row_stride; /* physical row width in image buffer */
- JSAMPARRAY buffer; /* Output row buffer */
-
- /* Step 1: allocate and initialize JPEG compression object */
- /* We have to set up the error handler first, in case the initialization
- * step fails. (Unlikely, but it could happen if you are out of memory.)
- * This routine fills in the contents of struct jerr, and returns jerr's
- * address which we place into the link field in cinfo.
- */
- //cinfo.err = jpeg_std_error(&jerr);
- /* We set up the normal JPEG error routines, then override error_exit. */
- cinfo.err = jpeg_std_error(&jerr.pub);
- jerr.pub.error_exit = ima_jpeg_error_exit;
-
- /* Establish the setjmp return context for my_error_exit to use. */
- if (setjmp(jerr.setjmp_buffer)) {
- /* If we get here, the JPEG code has signaled an error.
- * We need to clean up the JPEG object, close the input file, and return.
- */
- strcpy(info.szLastError, jerr.buffer); //
- jpeg_destroy_compress(&cinfo);
- return 0;
- }
-
- /* Now we can initialize the JPEG compression object. */
- jpeg_create_compress(&cinfo);
- /* Step 2: specify data destination (eg, a file) */
- /* Note: steps 2 and 3 can be done in either order. */
- /* Here we use the library-supplied code to send compressed data to a
- * stdio stream. You can also write your own code to do something else.
- * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
- * requires it in order to write binary files.
- */
-
- //jpeg_stdio_dest(&cinfo, outfile);
- CxFileJpg dest(hFile);
- cinfo.dest = &dest;
-
- /* Step 3: set parameters for compression */
- /* First we supply a description of the input image.
- * Four fields of the cinfo struct must be filled in:
- */
- cinfo.image_width = GetWidth(); // image width and height, in pixels
- cinfo.image_height = GetHeight();
-
- if (IsGrayScale()){
- cinfo.input_components = 1; // # of color components per pixel
- cinfo.in_color_space = JCS_GRAYSCALE; /* colorspace of input image */
- } else {
- cinfo.input_components = 3; // # of color components per pixel
- cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
- }
-
- /* Now use the library's routine to set default compression parameters.
- * (You must set at least cinfo.in_color_space before calling this,
- * since the defaults depend on the source color space.)
- */
- jpeg_set_defaults(&cinfo);
- /* Now you can set any non-default parameters you wish to.
- * Here we just illustrate the use of quality (quantization table) scaling:
- */
-
-//#ifdef C_ARITH_CODING_SUPPORTED
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_ARITHMETIC) != 0)
- cinfo.arith_code = TRUE;
-//#endif
-
-//#ifdef ENTROPY_OPT_SUPPORTED
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_OPTIMIZE) != 0)
- cinfo.optimize_coding = TRUE;
-//#endif
-
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_GRAYSCALE) != 0)
- jpeg_set_colorspace(&cinfo, JCS_GRAYSCALE);
-
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_SMOOTHING) != 0)
- cinfo.smoothing_factor = m_nSmoothing;
-
- jpeg_set_quality(&cinfo, GetJpegQuality(), (GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_BASELINE) != 0);
-
-//#ifdef C_PROGRESSIVE_SUPPORTED
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_PROGRESSIVE) != 0)
- jpeg_simple_progression(&cinfo);
-//#endif
-
-#ifdef C_LOSSLESS_SUPPORTED
- if ((GetCodecOption(CXIMAGE_FORMAT_JPG) & ENCODE_LOSSLESS) != 0)
- jpeg_simple_lossless(&cinfo, m_nPredictor, m_nPointTransform);
-#endif
-
- cinfo.density_unit=1;
- cinfo.X_density=(unsigned short)GetXDPI();
- cinfo.Y_density=(unsigned short)GetYDPI();
-
- /* Step 4: Start compressor */
- /* TRUE ensures that we will write a complete interchange-JPEG file.
- * Pass TRUE unless you are very sure of what you're doing.
- */
- jpeg_start_compress(&cinfo, TRUE);
-
- /* Step 5: while (scan lines remain to be written) */
- /* jpeg_write_scanlines(...); */
- /* Here we use the library's state variable cinfo.next_scanline as the
- * loop counter, so that we don't have to keep track ourselves.
- * To keep things simple, we pass one scanline per call; you can pass
- * more if you wish, though.
- */
- row_stride = info.dwEffWidth; /* JSAMPLEs per row in image_buffer */
-
- // "8+row_stride" fix heap deallocation problem during debug???
- buffer = (*cinfo.mem->alloc_sarray)
- ((j_common_ptr) &cinfo, JPOOL_IMAGE, 8+row_stride, 1);
-
- CImageIterator iter(this);
-
- iter.Upset();
- while (cinfo.next_scanline < cinfo.image_height) {
- // info.nProgress = (long)(100*cinfo.next_scanline/cinfo.image_height);
- iter.GetRow(buffer[0], row_stride);
- // not necessary if swapped red and blue definition in jmorecfg.h;ln322
- if (head.biClrUsed==0){ // swap R & B for RGB images
- RGBtoBGR(buffer[0], row_stride); // Lance : 1998/09/01 : Bug ID: EXP-2.1.1-9
- }
- iter.PrevRow();
- (void) jpeg_write_scanlines(&cinfo, buffer, 1);
- }
-
- /* Step 6: Finish compression */
- jpeg_finish_compress(&cinfo);
-
- /* Step 7: release JPEG compression object */
- /* This is an important step since it will release a good deal of memory. */
- jpeg_destroy_compress(&cinfo);
-
-
-#if CXIMAGEJPG_SUPPORT_EXIF
- if (m_exif && m_exif->m_exifinfo->IsExif){
- // discard useless sections (if any) read from original image
- m_exif->DiscardAllButExif();
- // read new created image, to split the sections
- hFile->Seek(pos,SEEK_SET);
- m_exif->DecodeExif(hFile,EXIF_READ_IMAGE);
- // save back the image, adding EXIF section
- hFile->Seek(pos,SEEK_SET);
- m_exif->EncodeExif(hFile);
- }
-#endif
-
-
- /* And we're done! */
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_JPG
-
diff --git a/src/win32/dependencies/cximage/ximajpg.h b/src/win32/dependencies/cximage/ximajpg.h
deleted file mode 100644
index 8d5f5cec..00000000
--- a/src/win32/dependencies/cximage/ximajpg.h
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- * File: ximajpg.h
- * Purpose: JPG Image Class Loader and Writer
- */
-/* ==========================================================
- * CxImageJPG (c) 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * Special thanks to Troels Knakkergaard for new features, enhancements and bugfixes
- *
- * Special thanks to Chris Shearer Cooper for CxFileJpg tips & code
- *
- * EXIF support based on jhead-1.8 by Matthias Wandel
- *
- * original CImageJPG and CImageIterator implementation are:
- * Copyright: (c) 1995, Alejandro Aguilar Sierra
- *
- * This software is based in part on the work of the Independent JPEG Group.
- * Copyright (C) 1991-1998, Thomas G. Lane.
- * ==========================================================
- */
-#if !defined(__ximaJPEG_h)
-#define __ixmaJPEG_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_JPG
-
-#define CXIMAGEJPG_SUPPORT_EXIF 1
-
-extern "C" {
- #include "../jpeg/jpeglib.h"
- #include "../jpeg/jerror.h"
-}
-
-class DLL_EXP CxImageJPG: public CxImage
-{
-public:
- CxImageJPG();
- ~CxImageJPG();
-
-// bool Load(const char * imageFileName){ return CxImage::Load(imageFileName,CXIMAGE_FORMAT_JPG);}
-// bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,CXIMAGE_FORMAT_JPG);}
- bool Decode(CxFile * hFile);
- bool Decode(FILE *hFile) { CxIOFile file(hFile); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile);
- bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-
-/*
- * EXIF support based on jhead-1.8 by Matthias Wandel
- */
-
-#if CXIMAGEJPG_SUPPORT_EXIF
-
-#define MAX_COMMENT 1000
-#define MAX_SECTIONS 20
-
-typedef struct tag_ExifInfo {
- char Version [5];
- char CameraMake [32];
- char CameraModel [40];
- char DateTime [20];
- int Height, Width;
- int Orientation;
- int IsColor;
- int Process;
- int FlashUsed;
- float FocalLength;
- float ExposureTime;
- float ApertureFNumber;
- float Distance;
- float CCDWidth;
- float ExposureBias;
- int Whitebalance;
- int MeteringMode;
- int ExposureProgram;
- int ISOequivalent;
- int CompressionLevel;
- float FocalplaneXRes;
- float FocalplaneYRes;
- float FocalplaneUnits;
- float Xresolution;
- float Yresolution;
- float ResolutionUnit;
- float Brightness;
- char Comments[MAX_COMMENT];
-
- unsigned char * ThumbnailPointer; /* Pointer at the thumbnail */
- unsigned ThumbnailSize; /* Size of thumbnail. */
-
- bool IsExif;
-} EXIFINFO;
-
-//--------------------------------------------------------------------------
-// JPEG markers consist of one or more 0xFF bytes, followed by a marker
-// code byte (which is not an FF). Here are the marker codes of interest
-// in this program. (See jdmarker.c for a more complete list.)
-//--------------------------------------------------------------------------
-
-#define M_SOF0 0xC0 // Start Of Frame N
-#define M_SOF1 0xC1 // N indicates which compression process
-#define M_SOF2 0xC2 // Only SOF0-SOF2 are now in common use
-#define M_SOF3 0xC3
-#define M_SOF5 0xC5 // NB: codes C4 and CC are NOT SOF markers
-#define M_SOF6 0xC6
-#define M_SOF7 0xC7
-#define M_SOF9 0xC9
-#define M_SOF10 0xCA
-#define M_SOF11 0xCB
-#define M_SOF13 0xCD
-#define M_SOF14 0xCE
-#define M_SOF15 0xCF
-#define M_SOI 0xD8 // Start Of Image (beginning of datastream)
-#define M_EOI 0xD9 // End Of Image (end of datastream)
-#define M_SOS 0xDA // Start Of Scan (begins compressed data)
-#define M_JFIF 0xE0 // Jfif marker
-#define M_EXIF 0xE1 // Exif marker
-#define M_COM 0xFE // COMment
-
-#define PSEUDO_IMAGE_MARKER 0x123; // Extra value.
-
-#define EXIF_READ_EXIF 0x01
-#define EXIF_READ_IMAGE 0x02
-#define EXIF_READ_ALL 0x03
-
-class DLL_EXP CxExifInfo
-{
-
-typedef struct tag_Section_t{
- BYTE* Data;
- int Type;
- unsigned Size;
-} Section_t;
-
-public:
- EXIFINFO* m_exifinfo;
- char m_szLastError[256];
- CxExifInfo(EXIFINFO* info = NULL);
- ~CxExifInfo();
- bool DecodeExif(CxFile * hFile, int nReadMode = EXIF_READ_EXIF);
- bool EncodeExif(CxFile * hFile);
- void DiscardAllButExif();
-protected:
- bool process_EXIF(unsigned char * CharBuf, unsigned int length);
- void process_COM (const BYTE * Data, int length);
- void process_SOFn (const BYTE * Data, int marker);
- int Get16u(void * Short);
- int Get16m(void * Short);
- long Get32s(void * Long);
- unsigned long Get32u(void * Long);
- double ConvertAnyFormat(void * ValuePtr, int Format);
- void* FindSection(int SectionType);
- bool ProcessExifDir(unsigned char * DirStart, unsigned char * OffsetBase, unsigned ExifLength,
- EXIFINFO * const pInfo, unsigned char ** const LastExifRefdP);
- int ExifImageWidth;
- int MotorolaOrder;
- Section_t Sections[MAX_SECTIONS];
- int SectionsRead;
- bool freeinfo;
-};
-
- CxExifInfo* m_exif;
- EXIFINFO m_exifinfo;
- bool DecodeExif(CxFile * hFile);
- bool DecodeExif(FILE * hFile) { CxIOFile file(hFile); return DecodeExif(&file); }
-
-#endif //CXIMAGEJPG_SUPPORT_EXIF
-
-////////////////////////////////////////////////////////////////////////////////////////
-////////////////////// C x F i l e J p g ////////////////////////////////
-////////////////////////////////////////////////////////////////////////////////////////
-
-// thanks to Chris Shearer Cooper
-class CxFileJpg : public jpeg_destination_mgr, public jpeg_source_mgr
- {
-public:
- enum { eBufSize = 4096 };
-
- CxFileJpg(CxFile* pFile)
- {
- m_pFile = pFile;
-
- init_destination = InitDestination;
- empty_output_buffer = EmptyOutputBuffer;
- term_destination = TermDestination;
-
- init_source = InitSource;
- fill_input_buffer = FillInputBuffer;
- skip_input_data = SkipInputData;
- resync_to_restart = jpeg_resync_to_restart; // use default method
- term_source = TermSource;
- next_input_byte = NULL; //* => next byte to read from buffer
- bytes_in_buffer = 0; //* # of bytes remaining in buffer
-
- m_pBuffer = new unsigned char[eBufSize];
- }
- ~CxFileJpg()
- {
- delete [] m_pBuffer;
- }
-
- static void InitDestination(j_compress_ptr cinfo)
- {
- CxFileJpg* pDest = (CxFileJpg*)cinfo->dest;
- pDest->next_output_byte = pDest->m_pBuffer;
- pDest->free_in_buffer = eBufSize;
- }
-
- static boolean EmptyOutputBuffer(j_compress_ptr cinfo)
- {
- CxFileJpg* pDest = (CxFileJpg*)cinfo->dest;
- if (pDest->m_pFile->Write(pDest->m_pBuffer,1,eBufSize)!=(size_t)eBufSize)
- ERREXIT(cinfo, JERR_FILE_WRITE);
- pDest->next_output_byte = pDest->m_pBuffer;
- pDest->free_in_buffer = eBufSize;
- return TRUE;
- }
-
- static void TermDestination(j_compress_ptr cinfo)
- {
- CxFileJpg* pDest = (CxFileJpg*)cinfo->dest;
- size_t datacount = eBufSize - pDest->free_in_buffer;
- /* Write any data remaining in the buffer */
- if (datacount > 0) {
- if (!pDest->m_pFile->Write(pDest->m_pBuffer,1,datacount))
- ERREXIT(cinfo, JERR_FILE_WRITE);
- }
- pDest->m_pFile->Flush();
- /* Make sure we wrote the output file OK */
- if (pDest->m_pFile->Error()) ERREXIT(cinfo, JERR_FILE_WRITE);
- return;
- }
-
- static void InitSource(j_decompress_ptr cinfo)
- {
- CxFileJpg* pSource = (CxFileJpg*)cinfo->src;
- pSource->m_bStartOfFile = TRUE;
- }
-
- static boolean FillInputBuffer(j_decompress_ptr cinfo)
- {
- size_t nbytes;
- CxFileJpg* pSource = (CxFileJpg*)cinfo->src;
- nbytes = pSource->m_pFile->Read(pSource->m_pBuffer,1,eBufSize);
- if (nbytes <= 0){
- if (pSource->m_bStartOfFile) //* Treat empty input file as fatal error
- ERREXIT(cinfo, JERR_INPUT_EMPTY);
- WARNMS(cinfo, JWRN_JPEG_EOF);
- // Insert a fake EOI marker
- pSource->m_pBuffer[0] = (JOCTET) 0xFF;
- pSource->m_pBuffer[1] = (JOCTET) JPEG_EOI;
- nbytes = 2;
- }
- pSource->next_input_byte = pSource->m_pBuffer;
- pSource->bytes_in_buffer = nbytes;
- pSource->m_bStartOfFile = FALSE;
- return TRUE;
- }
-
- static void SkipInputData(j_decompress_ptr cinfo, long num_bytes)
- {
- CxFileJpg* pSource = (CxFileJpg*)cinfo->src;
- if (num_bytes > 0){
- while (num_bytes > (long)pSource->bytes_in_buffer){
- num_bytes -= (long)pSource->bytes_in_buffer;
- FillInputBuffer(cinfo);
- // note we assume that fill_input_buffer will never return FALSE,
- // so suspension need not be handled.
- }
- pSource->next_input_byte += (size_t) num_bytes;
- pSource->bytes_in_buffer -= (size_t) num_bytes;
- }
- }
-
- static void TermSource(j_decompress_ptr cinfo)
- {
- return;
- }
-protected:
- CxFile *m_pFile;
- unsigned char *m_pBuffer;
- bool m_bStartOfFile;
-};
-
-public:
- enum CODEC_OPTION
- {
- ENCODE_BASELINE = 0x1,
- ENCODE_ARITHMETIC = 0x2,
- ENCODE_GRAYSCALE = 0x4,
- ENCODE_OPTIMIZE = 0x8,
- ENCODE_PROGRESSIVE = 0x10,
- ENCODE_LOSSLESS = 0x20,
- ENCODE_SMOOTHING = 0x40,
- DECODE_GRAYSCALE = 0x80,
- DECODE_QUANTIZE = 0x100,
- DECODE_DITHER = 0x200,
- DECODE_ONEPASS = 0x400,
- DECODE_NOSMOOTH = 0x800
- };
-
- int m_nPredictor;
- int m_nPointTransform;
- int m_nSmoothing;
- int m_nQuantize;
- J_DITHER_MODE m_nDither;
-
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximalpha.cpp b/src/win32/dependencies/cximage/ximalpha.cpp
deleted file mode 100644
index b92f33bc..00000000
--- a/src/win32/dependencies/cximage/ximalpha.cpp
+++ /dev/null
@@ -1,321 +0,0 @@
-// xImalpha.cpp : Alpha channel functions
-/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_ALPHA
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * \sa AlphaSetMax
- */
-BYTE CxImage::AlphaGetMax() const
-{
- return info.nAlphaMax;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Sets global Alpha (opacity) value applied to the whole image,
- * valid only for painting functions.
- * \param nAlphaMax: can be from 0 to 255
- */
-void CxImage::AlphaSetMax(BYTE nAlphaMax)
-{
- info.nAlphaMax=nAlphaMax;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Checks if the image has a valid alpha channel.
- */
-bool CxImage::AlphaIsValid()
-{
- return pAlpha!=0;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Enables the alpha palette, so the Draw() function changes its behavior.
- */
-void CxImage::AlphaPaletteEnable(bool enable)
-{
- info.bAlphaPaletteEnabled=enable;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * True if the alpha palette is enabled for painting.
- */
-bool CxImage::AlphaPaletteIsEnabled()
-{
- return info.bAlphaPaletteEnabled;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Inverts the alpha channel.
- */
-void CxImage::AlphaClear()
-{
- if (pAlpha) memset(pAlpha,0,head.biWidth * head.biHeight);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Sets the alpha level for the whole image
- */
-void CxImage::AlphaSet(BYTE level)
-{
- if (pAlpha) memset(pAlpha,level,head.biWidth * head.biHeight);
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Allocates an empty (opaque) alpha channel.
- */
-void CxImage::AlphaCreate()
-{
- if (pAlpha==NULL) {
- pAlpha = (BYTE*)malloc(head.biWidth * head.biHeight);
- if (pAlpha) memset(pAlpha,255,head.biWidth * head.biHeight);
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::AlphaDelete()
-{
- if (pAlpha) { free(pAlpha); pAlpha=0; }
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::AlphaInvert()
-{
- if (pAlpha) {
- BYTE *iSrc=pAlpha;
- long n=head.biHeight*head.biWidth;
- for(long i=0; i < n; i++){
- *iSrc=(BYTE)~(*(iSrc));
- iSrc++;
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Imports an existing alpa channel from another image with the same width and height.
- */
-bool CxImage::AlphaCopy(CxImage &from)
-{
- if (from.pAlpha == NULL || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false;
- if (pAlpha==NULL) pAlpha = (BYTE*)malloc(head.biWidth * head.biHeight);
- if (pAlpha==NULL) return false;
- memcpy(pAlpha,from.pAlpha,head.biWidth * head.biHeight);
- info.nAlphaMax=from.info.nAlphaMax;
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Creates the alpha channel from a gray scale image.
- */
-bool CxImage::AlphaSet(CxImage &from)
-{
- if (!from.IsGrayScale() || head.biWidth != from.head.biWidth || head.biHeight != from.head.biHeight) return false;
- if (pAlpha==NULL) pAlpha = (BYTE*)malloc(head.biWidth * head.biHeight);
- BYTE* src = from.info.pImage;
- BYTE* dst = pAlpha;
- if (src==NULL || dst==NULL) return false;
- for (long y=0; yTransfer(tmp);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Exports the alpha palette channel in a 8bpp grayscale image.
- */
-bool CxImage::AlphaPaletteSplit(CxImage *dest)
-{
- if (!AlphaPaletteIsValid() || !dest) return false;
-
- CxImage tmp(head.biWidth,head.biHeight,8);
- if (!tmp.IsValid()) return false;
-
- for(long y=0; yTransfer(tmp);
-
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_ALPHA
diff --git a/src/win32/dependencies/cximage/ximalyr.cpp b/src/win32/dependencies/cximage/ximalyr.cpp
deleted file mode 100644
index 04301232..00000000
--- a/src/win32/dependencies/cximage/ximalyr.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-// xImaLyr.cpp : Layers functions
-/* 21/04/2003 v1.00 - Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_LAYERS
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * If the object is an internal layer, GetParent return its parent in the hierarchy.
- */
-CxImage* CxImage::GetParent() const
-{
- return info.pParent;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Number of layers allocated directly by the object.
- */
-long CxImage::GetNumLayers() const
-{
- return info.nNumLayers;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Creates an empty layer. If position is less than 0, the new layer will be placed in the last position
- */
-bool CxImage::LayerCreate(long position)
-{
- if ( position < 0 || position > info.nNumLayers ) position = info.nNumLayers;
-
- CxImage** ptmp = (CxImage**)malloc((info.nNumLayers + 1)*sizeof(CxImage**));
- if (ptmp==0) return false;
-
- int i=0;
- for (int n=0; ninfo.pParent = this;
- } else {
- free(ptmp);
- return false;
- }
-
- info.nNumLayers++;
- if (pLayers) free(pLayers);
- pLayers = ptmp;
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Deletes a layer. If position is less than 0, the last layer will be deleted
- */
-bool CxImage::LayerDelete(long position)
-{
- if ( position >= info.nNumLayers ) return false;
- if ( position < 0) position = info.nNumLayers - 1;
-
- CxImage** ptmp = (CxImage**)malloc((info.nNumLayers - 1)*sizeof(CxImage**));
- if (ptmp==0) return false;
-
- int i=0;
- for (int n=0; n<(info.nNumLayers - 1); n++){
- if (position == n){
- delete pLayers[n];
- i=1;
- }
- ptmp[n]=pLayers[n+i];
- }
- if (i==0) delete pLayers[info.nNumLayers - 1];
-
- info.nNumLayers--;
- if (pLayers) free(pLayers);
- pLayers = ptmp;
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::LayerDeleteAll()
-{
- if (pLayers) {
- for(long n=0; n= info.nNumLayers ) return 0;
- if ( position < 0) position = info.nNumLayers - 1;
- return pLayers[position];
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif //CXIMAGE_SUPPORT_LAYERS
diff --git a/src/win32/dependencies/cximage/ximamng.cpp b/src/win32/dependencies/cximage/ximamng.cpp
deleted file mode 100644
index 1c43aa9a..00000000
--- a/src/win32/dependencies/cximage/ximamng.cpp
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * File: ximamng.cpp
- * Purpose: Platform Independent MNG Image Class Loader and Writer
- * Author: 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximamng.h"
-
-#if CXIMAGE_SUPPORT_MNG
-
-////////////////////////////////////////////////////////////////////////////////
-// callbacks for the mng decoder:
-////////////////////////////////////////////////////////////////////////////////
-
-////////////////////////////////////////////////////////////////////////////////
-// memory allocation; data must be zeroed
-static mng_ptr
-mymngalloc( mng_uint32 size )
-{
- return (mng_ptr)calloc(1, size);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// memory deallocation
-static void mymngfree(mng_ptr p, mng_uint32 size)
-{
- free(p);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Stream open/close:
-// since the user is responsible for opening and closing the file,
-// we leave the default implementation open
-static mng_bool mymngopenstream(mng_handle mng) { return MNG_TRUE; }
-static mng_bool mymngopenstreamwrite(mng_handle mng) { return MNG_TRUE; }
-static mng_bool mymngclosestream(mng_handle mng) { return MNG_TRUE; }
-
-////////////////////////////////////////////////////////////////////////////////
-// feed data to the decoder
-static mng_bool mymngreadstream(mng_handle mng, mng_ptr buffer, mng_uint32 size, mng_uint32 *bytesread)
-{
- mngstuff *mymng = (mngstuff *)mng_get_userdata(mng);
- // read the requested amount of data from the file
- *bytesread = mymng->file->Read( buffer, sizeof(BYTE), size);
- return MNG_TRUE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-static mng_bool mymngwritestream (mng_handle mng, mng_ptr pBuf, mng_uint32 iSize, mng_uint32 *iWritten)
-{
- mngstuff *mymng = (mngstuff *)mng_get_userdata(mng);
- // write it
- *iWritten = mymng->file->Write (pBuf, 1, iSize);
- return MNG_TRUE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// the header's been read. set up the display stuff
-static mng_bool mymngprocessheader( mng_handle mng, mng_uint32 width, mng_uint32 height )
-{
- // normally the image buffer is allocated here,
- // but in this module we don't know nothing about
- // the final environment.
-
- mngstuff *mymng = (mngstuff *)mng_get_userdata(mng);
-
- mymng->width = width;
- mymng->height = height;
- mymng->bpp = 24;
- mymng->effwdt = ((((width * mymng->bpp) + 31) >> 5) << 2);
-
- if (mng->bUseBKGD){
- mymng->nBkgndIndex = 0;
- mymng->nBkgndColor.rgbRed = mng->iBGred >> 8;
- mymng->nBkgndColor.rgbGreen =mng->iBGgreen >> 8;
- mymng->nBkgndColor.rgbBlue = mng->iBGblue >> 8;
- }
-
- mymng->image = (BYTE*)malloc(height * mymng->effwdt);
-
- // tell the mng decoder about our bit-depth choice
- mng_set_canvasstyle( mng, MNG_CANVAS_BGR8 );
- return MNG_TRUE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// return a row pointer for the decoder to fill
-static mng_ptr mymnggetcanvasline( mng_handle mng, mng_uint32 line )
-{
- mngstuff *mymng = (mngstuff *)mng_get_userdata(mng);
- return (mng_ptr)(mymng->image + (mymng->effwdt * (mymng->height - 1 - line)));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// timer
-static mng_uint32 mymnggetticks(mng_handle mng)
-{
-#ifdef WIN32
- return (mng_uint32)GetTickCount();
-#else
- return 0;
-#endif
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// Refresh: actual frame need to be updated (Invalidate)
-static mng_bool mymngrefresh(mng_handle mng, mng_uint32 x, mng_uint32 y, mng_uint32 w, mng_uint32 h)
-{
-// mngstuff *mymng = (mngstuff *)mng_get_userdata(mng);
- return MNG_TRUE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// interframe delay callback
-static mng_bool mymngsettimer(mng_handle mng, mng_uint32 msecs)
-{
- mngstuff *mymng = (mngstuff *)mng_get_userdata(mng);
- mymng->delay = msecs; // set the timer for when the decoder wants to be woken
- return MNG_TRUE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-static mng_bool mymngerror(mng_handle mng, mng_int32 code, mng_int8 severity, mng_chunkid chunktype, mng_uint32 chunkseq, mng_int32 extra1, mng_int32 extra2, mng_pchar text)
-{
- //throw (const char *)text;
- return mng_cleanup(&mng); //
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// CxImage members
-////////////////////////////////////////////////////////////////////////////////
-CxImageMNG::CxImageMNG(): CxImage(CXIMAGE_FORMAT_MNG)
-{
- hmng = NULL;
- memset(&mnginfo,0,sizeof(mngstuff));
- mnginfo.nBkgndIndex = -1;
- mnginfo.speed = 1.0f;
-}
-////////////////////////////////////////////////////////////////////////////////
-CxImageMNG::~CxImageMNG()
-{
- // cleanup and return
- if (mnginfo.thread){ //close the animation thread
- mnginfo.animation_enabled=0;
- ResumeThread(mnginfo.thread);
- WaitForSingleObject(mnginfo.thread,500);
- CloseHandle(mnginfo.thread);
- }
- // free objects
- if (mnginfo.image) free(mnginfo.image);
- if (hmng) mng_cleanup(&hmng); //be sure it's not needed any more. (active timers ?)
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageMNG::SetCallbacks(mng_handle mng)
-{
- // set the callbacks
- mng_setcb_errorproc(mng, mymngerror);
- mng_setcb_openstream(mng, mymngopenstream);
- mng_setcb_closestream(mng, mymngclosestream);
- mng_setcb_readdata(mng, mymngreadstream);
- mng_setcb_processheader(mng, mymngprocessheader);
- mng_setcb_getcanvasline(mng, mymnggetcanvasline);
- mng_setcb_refresh(mng, mymngrefresh);
- mng_setcb_gettickcount(mng, mymnggetticks);
- mng_setcb_settimer(mng, mymngsettimer);
- mng_setcb_refresh(mng, mymngrefresh);
-}
-////////////////////////////////////////////////////////////////////////////////
-// can't use the CxImage implementation because it looses mnginfo
-bool CxImageMNG::Load(const char * imageFileName){
- FILE* hFile; //file handle to read the image
- if ((hFile=fopen(imageFileName,"rb"))==NULL) return false;
- bool bOK = Decode(hFile);
- fclose(hFile);
- return bOK;
-}
-////////////////////////////////////////////////////////////////////////////////
-bool CxImageMNG::Decode(CxFile *hFile)
-{
- if (hFile == NULL) return false;
-
- try {
- // set up the mng decoder for our stream
- hmng = mng_initialize(&mnginfo, mymngalloc, mymngfree, MNG_NULL);
- if (hmng == NULL) throw "could not initialize libmng";
-
- // set the file we want to play
- mnginfo.file = hFile;
-
- // Set the colorprofile, lcms uses this:
- mng_set_srgb(hmng, MNG_TRUE );
- // Set white as background color:
- WORD Red,Green,Blue;
- Red = Green = Blue = (255 << 8) + 255;
- mng_set_bgcolor(hmng, Red, Green, Blue );
- // If PNG Background is available, use it:
- mng_set_usebkgd(hmng, MNG_TRUE );
-
- // No need to store chunks:
- mng_set_storechunks(hmng, MNG_FALSE);
- // No need to wait: straight reading
- mng_set_suspensionmode(hmng, MNG_FALSE);
-
- SetCallbacks(hmng);
-
- mng_datap pData = (mng_datap)hmng;
-
- // read in the image
- info.nNumFrames=0;
- mng_readdisplay(hmng);
-
- // read all
- int retval=MNG_NOERROR;
- while(pData->bReading){
- retval = mng_display_resume(hmng);
- info.nNumFrames++;
- }
-
- // single frame check:
- if (retval != MNG_NEEDTIMERWAIT){
- info.nNumFrames--;
- } else {
- mnginfo.animation=1;
- }
-
- if (info.nNumFrames<=0) info.nNumFrames=1;
-
- if (mnginfo.animation_enabled==0){
- // select the frame
- if (info.nFrame>=0 && info.nFramewidth,OffsetH=mymng->height;
-
- BYTE *tmpbuffer = new BYTE[ (mymng->effwdt+1) * mymng->height];
- if( tmpbuffer == 0 ) return;
-
- // Write DEFI chunk.
- mng_putchunk_defi( hMNG, 0, 0, 0, MNG_TRUE, OffsetX, OffsetY, MNG_FALSE, 0, 0, 0, 0 );
-
- // Write Header:
- mng_putchunk_ihdr(
- hMNG,
- OffsetW, OffsetH,
- MNG_BITDEPTH_8,
- MNG_COLORTYPE_RGB,
- MNG_COMPRESSION_DEFLATE,
- MNG_FILTER_ADAPTIVE,
- MNG_INTERLACE_NONE
- );
-
- // transfer data, add Filterbyte:
- for( int Row=0; Row No Filter.
- tmpbuffer[Row*(mymng->effwdt+1)]=0;
- // Copy the scanline: (reverse order)
- memcpy(tmpbuffer+Row*(mymng->effwdt+1)+1,
- mymng->image+((OffsetH-1-(OffsetY+Row))*(mymng->effwdt))+OffsetX,mymng->effwdt);
- // swap red and blue components
- RGBtoBGR(tmpbuffer+Row*(mymng->effwdt+1)+1,mymng->effwdt);
- }
-
- // Compress data with ZLib (Deflate):
- BYTE *dstbuffer = new BYTE[(mymng->effwdt+1)*OffsetH];
- if( dstbuffer == 0 ) return;
- DWORD dstbufferSize=(mymng->effwdt+1)*OffsetH;
-
- // Compress data:
- if(Z_OK != compress2((Bytef *)dstbuffer,(ULONG *)&dstbufferSize,(const Bytef*)tmpbuffer,
- (ULONG) (mymng->effwdt+1)*OffsetH,9 )) return;
-
- // Write Data into MNG File:
- mng_putchunk_idat( hMNG, dstbufferSize, (mng_ptr*)dstbuffer);
- mng_putchunk_iend(hMNG);
-
- // Free the stuff:
- delete [] tmpbuffer;
- delete [] dstbuffer;
-}
-////////////////////////////////////////////////////////////////////////////////
-long CxImageMNG::Resume()
-{
- if (MNG_NEEDTIMERWAIT == mng_display_resume(hmng)){
- if (info.pImage==NULL) Create(mnginfo.width,mnginfo.height,mnginfo.bpp, CXIMAGE_FORMAT_MNG);
- if (IsValid()) memcpy(GetBits(), mnginfo.image, mnginfo.effwdt * mnginfo.height);
- } else {
- mnginfo.animation_enabled = 0;
- }
- return mnginfo.animation_enabled;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImageMNG::SetSpeed(float speed)
-{
- if (speed>10.0) mnginfo.speed = 10.0f;
- else if (speed<0.1) mnginfo.speed = 0.1f;
- else mnginfo.speed=speed;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_MNG
diff --git a/src/win32/dependencies/cximage/ximamng.h b/src/win32/dependencies/cximage/ximamng.h
deleted file mode 100644
index 1b23d4c0..00000000
--- a/src/win32/dependencies/cximage/ximamng.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * File: ximamng.h
- * Purpose: Declaration of the MNG Image Class
- * Author: Davide Pizzolato - www.xdp.it
- * Created: 2001
- */
-/* ==========================================================
- * CxImageMNG (c) 07/Aug/2001 Davide Pizzolato - www.xdp.it
- * For conditions of distribution and use, see copyright notice in ximage.h
- *
- * Special thanks to Frank Haug for suggestions and code.
- *
- * original mng.cpp code created by Nikolaus Brennig, November 14th, 2000.
- *
- * LIBMNG Copyright (c) 2000,2001 Gerard Juyn (gerard@libmng.com)
- * ==========================================================
- */
-
-#if !defined(__ximaMNG_h)
-#define __ximaMNG_h
-
-#include "ximage.h"
-
-#if CXIMAGE_SUPPORT_MNG
-
-//#define MNG_NO_CMS
-#define MNG_SUPPORT_DISPLAY
-#define MNG_SUPPORT_READ
-#define MNG_SUPPORT_WRITE
-#define MNG_ACCESS_CHUNKS
-#define MNG_STORE_CHUNKS
-
-extern "C" {
-#include "../mng/libmng.h"
-#include "../mng/libmng_data.h"
-}
-
-//unsigned long _stdcall RunMNGThread(void *lpParam);
-
-typedef struct tagmngstuff
-{
- CxFile *file;
- BYTE *image;
- HANDLE thread;
- mng_uint32 delay;
- mng_uint32 width;
- mng_uint32 height;
- mng_uint32 effwdt;
- mng_int16 bpp;
- mng_bool animation;
- mng_bool animation_enabled;
- float speed;
- long nBkgndIndex;
- RGBQUAD nBkgndColor;
-} mngstuff;
-
-class CxImageMNG: public CxImage
-{
-public:
- CxImageMNG();
- ~CxImageMNG();
-
- bool Load(const char * imageFileName);
- bool Save(const char * imageFileName){ return CxImage::Save(imageFileName,CXIMAGE_FORMAT_MNG);}
-
- bool Decode(CxFile * hFile);
- bool Decode(FILE *hFile) { CxIOFile file(hFile); return Decode(&file); }
-
-#if CXIMAGE_SUPPORT_ENCODE
- bool Encode(CxFile * hFile);
- bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
-#endif // CXIMAGE_SUPPORT_ENCODE
-
- long Resume();
- void SetSpeed(float speed);
-
- mng_handle hmng;
- mngstuff mnginfo;
-protected:
- void WritePNG(mng_handle hMNG, int Frame, int FrameCount );
- void SetCallbacks(mng_handle mng);
-};
-
-#endif
-
-#endif
diff --git a/src/win32/dependencies/cximage/ximapal.cpp b/src/win32/dependencies/cximage/ximapal.cpp
deleted file mode 100644
index 78cd7053..00000000
--- a/src/win32/dependencies/cximage/ximapal.cpp
+++ /dev/null
@@ -1,707 +0,0 @@
-// xImaPal.cpp : Palette and Pixel functions
-/* 07/08/2001 v1.00 - Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- */
-
-#include "ximage.h"
-
-////////////////////////////////////////////////////////////////////////////////
-/**
- * returns the palette dimension in byte
- */
-DWORD CxImage::GetPaletteSize()
-{
- return (head.biClrUsed * sizeof(RGBQUAD));
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::SetPaletteColor(BYTE idx, BYTE r, BYTE g, BYTE b, BYTE alpha)
-{
- if ((pDib)&&(head.biClrUsed)){
- BYTE* iDst = (BYTE*)(pDib) + sizeof(BITMAPINFOHEADER);
- if (idx=head.biWidth)||(y>=head.biHeight)) {
- if (info.nBkgndIndex != -1) return (BYTE)info.nBkgndIndex;
- else return *info.pImage;
- }
- if (head.biBitCount==8){
- return info.pImage[y*info.dwEffWidth + x];
- } else {
- BYTE pos;
- BYTE iDst= info.pImage[y*info.dwEffWidth + (x*head.biBitCount >> 3)];
- if (head.biBitCount==4){
- pos = (BYTE)(4*(1-x%2));
- iDst &= (0x0F<> pos);
- } else if (head.biBitCount==1){
- pos = (BYTE)(7-x%8);
- iDst &= (0x01<> pos);
- }
- }
- return 0;
-}
-////////////////////////////////////////////////////////////////////////////////
-BYTE CxImage::BlindGetPixelIndex(const long x,const long y)
-{
-#ifdef _DEBUG
- if ((pDib==NULL) || (head.biClrUsed==0) || !IsInside(x,y)) throw 0;
-#endif
-
- if (head.biBitCount==8){
- return info.pImage[y*info.dwEffWidth + x];
- } else {
- BYTE pos;
- BYTE iDst= info.pImage[y*info.dwEffWidth + (x*head.biBitCount >> 3)];
- if (head.biBitCount==4){
- pos = (BYTE)(4*(1-x%2));
- iDst &= (0x0F<> pos);
- } else if (head.biBitCount==1){
- pos = (BYTE)(7-x%8);
- iDst &= (0x01<> pos);
- }
- }
- return 0;
-}
-////////////////////////////////////////////////////////////////////////////////
-RGBQUAD CxImage::GetPixelColor(long x,long y, bool bGetAlpha)
-{
-// RGBQUAD rgb={0,0,0,0};
- RGBQUAD rgb=info.nBkgndColor; //
- if ((pDib==NULL)||(x<0)||(y<0)||
- (x>=head.biWidth)||(y>=head.biHeight)){
- if (info.nBkgndIndex != -1){
- if (head.biBitCount<24) return GetPaletteColor((BYTE)info.nBkgndIndex);
- else return info.nBkgndColor;
- } else if (pDib) return GetPixelColor(0,0);
- return rgb;
- }
-
- if (head.biClrUsed){
- rgb = GetPaletteColor(GetPixelIndex(x,y));
- } else {
- BYTE* iDst = info.pImage + y*info.dwEffWidth + x*3;
- rgb.rgbBlue = *iDst++;
- rgb.rgbGreen= *iDst++;
- rgb.rgbRed = *iDst;
- }
-#if CXIMAGE_SUPPORT_ALPHA
- if (pAlpha && bGetAlpha) rgb.rgbReserved = AlphaGet(x,y);
-#else
- rgb.rgbReserved = 0;
-#endif //CXIMAGE_SUPPORT_ALPHA
- return rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * This is (a bit) faster version of GetPixelColor.
- * It tests bounds only in debug mode (_DEBUG defined).
- *
- * It is an error to request out-of-borders pixel with this method.
- * In DEBUG mode an exception will be thrown, and data will be violated in non-DEBUG mode.
- * \author ***bd*** 2.2004
- */
-RGBQUAD CxImage::BlindGetPixelColor(const long x,const long y)
-{
- RGBQUAD rgb;
-#ifdef _DEBUG
- if ((pDib==NULL) || !IsInside(x,y)) throw 0;
-#endif
-
- if (head.biClrUsed){
- return GetPaletteColor(BlindGetPixelIndex(x,y));
- }
-
- BYTE* iDst = info.pImage + y*info.dwEffWidth + x*3;
- rgb.rgbBlue = *iDst++;
- rgb.rgbGreen= *iDst++;
- rgb.rgbRed = *iDst;
-#if CXIMAGE_SUPPORT_ALPHA
- if (pAlpha) rgb.rgbReserved = pAlpha[x+y*head.biWidth];
-#else
- rgb.rgbReserved = 0;
-#endif //CXIMAGE_SUPPORT_ALPHA
- return rgb;
-}
-////////////////////////////////////////////////////////////////////////////////
-BYTE CxImage::GetPixelGray(long x, long y)
-{
- RGBQUAD color = GetPixelColor(x,y);
- return (BYTE)RGB2GRAY(color.rgbRed,color.rgbGreen,color.rgbBlue);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::SetPixelIndex(long x,long y,BYTE i)
-{
- if ((pDib==NULL)||(head.biClrUsed==0)||
- (x<0)||(y<0)||(x>=head.biWidth)||(y>=head.biHeight)) return ;
-
- if (head.biBitCount==8){
- info.pImage[y*info.dwEffWidth + x]=i;
- return;
- } else {
- BYTE pos;
- BYTE* iDst= info.pImage + y*info.dwEffWidth + (x*head.biBitCount >> 3);
- if (head.biBitCount==4){
- pos = (BYTE)(4*(1-x%2));
- *iDst &= ~(0x0F<=head.biWidth)||(y>=head.biHeight)) return;
- if (head.biClrUsed)
- SetPixelIndex(x,y,GetNearestIndex(c));
- else {
- BYTE* iDst = info.pImage + y*info.dwEffWidth + x*3;
- *iDst++ = c.rgbBlue;
- *iDst++ = c.rgbGreen;
- *iDst = c.rgbRed;
-#if CXIMAGE_SUPPORT_ALPHA
- if (bSetAlpha) AlphaSet(x,y,c.rgbReserved);
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Blends the current pixel color with a new color.
- * \param x,y = pixel
- * \param c = new color
- * \param blend = can be from 0 (no effect) to 1 (full effect).
- * \param bSetAlpha = if true, blends also the alpha component stored in c.rgbReserved
- */
-void CxImage::BlendPixelColor(long x,long y,RGBQUAD c, float blend, bool bSetAlpha)
-{
- if ((pDib==NULL)||(x<0)||(y<0)||
- (x>=head.biWidth)||(y>=head.biHeight)) return;
-
- int a0 = (int)(256*blend);
- int a1 = 256 - a0;
-
- RGBQUAD c0 = BlindGetPixelColor(x,y);
- c.rgbRed = (BYTE)((c.rgbRed * a0 + c0.rgbRed * a1)>>8);
- c.rgbBlue = (BYTE)((c.rgbBlue * a0 + c0.rgbBlue * a1)>>8);
- c.rgbGreen = (BYTE)((c.rgbGreen * a0 + c0.rgbGreen * a1)>>8);
-
- if (head.biClrUsed)
- SetPixelIndex(x,y,GetNearestIndex(c));
- else {
- BYTE* iDst = info.pImage + y*info.dwEffWidth + x*3;
- *iDst++ = c.rgbBlue;
- *iDst++ = c.rgbGreen;
- *iDst = c.rgbRed;
-#if CXIMAGE_SUPPORT_ALPHA
- if (bSetAlpha) AlphaSet(x,y,c.rgbReserved);
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Returns the best palette index that matches a specified color.
- */
-BYTE CxImage::GetNearestIndex(RGBQUAD c)
-{
- if ((pDib==NULL)||(head.biClrUsed==0)) return 0;
-
- // check matching with the previous result
- if (info.last_c_isvalid && (*(long*)&info.last_c == *(long*)&c)) return info.last_c_index;
- info.last_c = c;
- info.last_c_isvalid = true;
-
- BYTE* iDst = (BYTE*)(pDib) + sizeof(BITMAPINFOHEADER);
- long distance=200000;
- int i,j = 0;
- long k,l;
- int m = (int)(head.biClrImportant==0 ? head.biClrUsed : head.biClrImportant);
- for(i=0,l=0;i100) perc=100;
- for(i=0;i=0){
- if (head.biClrUsed){
- if (GetPixelIndex(x,y) == info.nBkgndIndex) return true;
- } else {
- RGBQUAD ct = info.nBkgndColor;
- RGBQUAD c = GetPixelColor(x,y,false);
- if (*(long*)&c==*(long*)&ct) return true;
- }
- }
-
-#if CXIMAGE_SUPPORT_ALPHA
- if (pAlpha) return AlphaGet(x,y)==0;
-#endif
-
- return false;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Checks if image has the same palette, if any.
- * \param img = image to compare.
- * \param bCheckAlpha = check also the rgbReserved field.
- */
-bool CxImage::IsSamePalette(CxImage &img, bool bCheckAlpha)
-{
- if (head.biClrUsed != img.head.biClrUsed)
- return false;
- if (head.biClrUsed == 0)
- return false;
-
- RGBQUAD c1,c2;
- for (DWORD n=0; n256) {
- head.biClrImportant = 0;
- return;
- }
-
- switch(head.biBitCount){
- case 1:
- head.biClrImportant = min(ncolors,2);
- break;
- case 4:
- head.biClrImportant = min(ncolors,16);
- break;
- case 8:
- head.biClrImportant = ncolors;
- break;
- }
- return;
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Returns pointer to pixel. Currently implemented only for truecolor images.
- *
- * \param x,y - coordinates
- *
- * \return pointer to first byte of pixel data
- *
- * \author ***bd*** 2.2004
- */
-void* CxImage::BlindGetPixelPointer(const long x, const long y)
-{
- if (!IsIndexed())
- return info.pImage + y*info.dwEffWidth + x*3;
- else
- return 0;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::DrawLine(int StartX, int EndX, int StartY, int EndY, COLORREF cr)
-{
- DrawLine(StartX, EndX, StartY, EndY, RGBtoRGBQUAD(cr));
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImage::DrawLine(int StartX, int EndX, int StartY, int EndY, RGBQUAD color, bool bSetAlpha)
-{
- if (!pDib) return;
- //////////////////////////////////////////////////////
- // Draws a line using the Bresenham line algorithm
- // Thanks to Jordan DeLozier
- //////////////////////////////////////////////////////
- int x1 = StartX;
- int y1 = StartY;
- int x = x1; // Start x off at the first pixel
- int y = y1; // Start y off at the first pixel
- int x2 = EndX;
- int y2 = EndY;
-
- int xinc1,xinc2,yinc1,yinc2; // Increasing values
- int den, num, numadd,numpixels;
- int deltax = abs(x2 - x1); // The difference between the x's
- int deltay = abs(y2 - y1); // The difference between the y's
-
- // Get Increasing Values
- if (x2 >= x1) { // The x-values are increasing
- xinc1 = 1;
- xinc2 = 1;
- } else { // The x-values are decreasing
- xinc1 = -1;
- xinc2 = -1;
- }
-
- if (y2 >= y1) { // The y-values are increasing
- yinc1 = 1;
- yinc2 = 1;
- } else { // The y-values are decreasing
- yinc1 = -1;
- yinc2 = -1;
- }
-
- // Actually draw the line
- if (deltax >= deltay) // There is at least one x-value for every y-value
- {
- xinc1 = 0; // Don't change the x when numerator >= denominator
- yinc2 = 0; // Don't change the y for every iteration
- den = deltax;
- num = deltax / 2;
- numadd = deltay;
- numpixels = deltax; // There are more x-values than y-values
- }
- else // There is at least one y-value for every x-value
- {
- xinc2 = 0; // Don't change the x for every iteration
- yinc1 = 0; // Don't change the y when numerator >= denominator
- den = deltay;
- num = deltay / 2;
- numadd = deltax;
- numpixels = deltay; // There are more y-values than x-values
- }
-
- for (int curpixel = 0; curpixel <= numpixels; curpixel++)
- {
- // Draw the current pixel
- SetPixelColor(x,y,color,bSetAlpha);
-
- num += numadd; // Increase the numerator by the top of the fraction
- if (num >= den) // Check if numerator >= denominator
- {
- num -= den; // Calculate the new numerator value
- x += xinc1; // Change the x as appropriate
- y += yinc1; // Change the y as appropriate
- }
- x += xinc2; // Change the x as appropriate
- y += yinc2; // Change the y as appropriate
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/**
- * Sets a palette with standard colors for 4 and 8 bpp images.
- */
-void CxImage::SetStdPalette()
-{
- if (!pDib) return;
- switch (head.biBitCount){
- case 8:
- {
- const BYTE pal256[1024] = {0,0,0,0,0,0,128,0,0,128,0,0,0,128,128,0,128,0,0,0,128,0,128,0,128,128,0,0,192,192,192,0,
- 192,220,192,0,240,202,166,0,212,240,255,0,177,226,255,0,142,212,255,0,107,198,255,0,
- 72,184,255,0,37,170,255,0,0,170,255,0,0,146,220,0,0,122,185,0,0,98,150,0,0,74,115,0,0,
- 50,80,0,212,227,255,0,177,199,255,0,142,171,255,0,107,143,255,0,72,115,255,0,37,87,255,0,0,
- 85,255,0,0,73,220,0,0,61,185,0,0,49,150,0,0,37,115,0,0,25,80,0,212,212,255,0,177,177,255,0,
- 142,142,255,0,107,107,255,0,72,72,255,0,37,37,255,0,0,0,254,0,0,0,220,0,0,0,185,0,0,0,150,0,
- 0,0,115,0,0,0,80,0,227,212,255,0,199,177,255,0,171,142,255,0,143,107,255,0,115,72,255,0,
- 87,37,255,0,85,0,255,0,73,0,220,0,61,0,185,0,49,0,150,0,37,0,115,0,25,0,80,0,240,212,255,0,
- 226,177,255,0,212,142,255,0,198,107,255,0,184,72,255,0,170,37,255,0,170,0,255,0,146,0,220,0,
- 122,0,185,0,98,0,150,0,74,0,115,0,50,0,80,0,255,212,255,0,255,177,255,0,255,142,255,0,255,107,255,0,
- 255,72,255,0,255,37,255,0,254,0,254,0,220,0,220,0,185,0,185,0,150,0,150,0,115,0,115,0,80,0,80,0,
- 255,212,240,0,255,177,226,0,255,142,212,0,255,107,198,0,255,72,184,0,255,37,170,0,255,0,170,0,
- 220,0,146,0,185,0,122,0,150,0,98,0,115,0,74,0,80,0,50,0,255,212,227,0,255,177,199,0,255,142,171,0,
- 255,107,143,0,255,72,115,0,255,37,87,0,255,0,85,0,220,0,73,0,185,0,61,0,150,0,49,0,115,0,37,0,
- 80,0,25,0,255,212,212,0,255,177,177,0,255,142,142,0,255,107,107,0,255,72,72,0,255,37,37,0,254,0,
- 0,0,220,0,0,0,185,0,0,0,150,0,0,0,115,0,0,0,80,0,0,0,255,227,212,0,255,199,177,0,255,171,142,0,
- 255,143,107,0,255,115,72,0,255,87,37,0,255,85,0,0,220,73,0,0,185,61,0,0,150,49,0,0,115,37,0,
- 0,80,25,0,0,255,240,212,0,255,226,177,0,255,212,142,0,255,198,107,0,255,184,72,0,255,170,37,0,
- 255,170,0,0,220,146,0,0,185,122,0,0,150,98,0,0,115,74,0,0,80,50,0,0,255,255,212,0,255,255,177,0,
- 255,255,142,0,255,255,107,0,255,255,72,0,255,255,37,0,254,254,0,0,220,220,0,0,185,185,0,0,150,150,0,
- 0,115,115,0,0,80,80,0,0,240,255,212,0,226,255,177,0,212,255,142,0,198,255,107,0,184,255,72,0,
- 170,255,37,0,170,255,0,0,146,220,0,0,122,185,0,0,98,150,0,0,74,115,0,0,50,80,0,0,227,255,212,0,
- 199,255,177,0,171,255,142,0,143,255,107,0,115,255,72,0,87,255,37,0,85,255,0,0,73,220,0,0,61,185,0,
- 0,49,150,0,0,37,115,0,0,25,80,0,0,212,255,212,0,177,255,177,0,142,255,142,0,107,255,107,0,72,255,72,0,
- 37,255,37,0,0,254,0,0,0,220,0,0,0,185,0,0,0,150,0,0,0,115,0,0,0,80,0,0,212,255,227,0,177,255,199,0,
- 142,255,171,0,107,255,143,0,72,255,115,0,37,255,87,0,0,255,85,0,0,220,73,0,0,185,61,0,0,150,49,0,0,
- 115,37,0,0,80,25,0,212,255,240,0,177,255,226,0,142,255,212,0,107,255,198,0,72,255,184,0,37,255,170,0,
- 0,255,170,0,0,220,146,0,0,185,122,0,0,150,98,0,0,115,74,0,0,80,50,0,212,255,255,0,177,255,255,0,
- 142,255,255,0,107,255,255,0,72,255,255,0,37,255,255,0,0,254,254,0,0,220,220,0,0,185,185,0,0,
- 150,150,0,0,115,115,0,0,80,80,0,242,242,242,0,230,230,230,0,218,218,218,0,206,206,206,0,194,194,194,0,
- 182,182,182,0,170,170,170,0,158,158,158,0,146,146,146,0,134,134,134,0,122,122,122,0,110,110,110,0,
- 98,98,98,0,86,86,86,0,74,74,74,0,62,62,62,0,50,50,50,0,38,38,38,0,26,26,26,0,14,14,14,0,240,251,255,0,
- 164,160,160,0,128,128,128,0,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,255,0,255,0,255,255,0,0,255,255,255,0};
- memcpy(GetPalette(),pal256,1024);
- break;
- }
- case 4:
- {
- const BYTE pal16[64]={0,0,0,0,0,0,128,0,0,128,0,0,0,128,128,0,128,0,0,0,128,0,128,0,128,128,0,0,192,192,192,0,
- 128,128,128,0,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,255,0,255,0,255,255,0,0,255,255,255,0};
- memcpy(GetPalette(),pal16,64);
- break;
- }
- }
- return;
-}
-////////////////////////////////////////////////////////////////////////////////
diff --git a/src/win32/dependencies/cximage/ximapcx.cpp b/src/win32/dependencies/cximage/ximapcx.cpp
deleted file mode 100644
index 1717ab64..00000000
--- a/src/win32/dependencies/cximage/ximapcx.cpp
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * File: ximapcx.cpp
- * Purpose: Platform Independent PCX Image Class Loader and Writer
- * 05/Jan/2002 Davide Pizzolato - www.xdp.it
- * CxImage version 5.99c 17/Oct/2004
- *
- * based on ppmtopcx.c - convert a portable pixmap to PCX
- * Copyright (C) 1994 by Ingo Wilken (Ingo.Wilken@informatik.uni-oldenburg.de)
- * based on ppmtopcx.c by Michael Davidson
- */
-
-#include "ximapcx.h"
-
-#if CXIMAGE_SUPPORT_PCX
-
-#include "xmemfile.h"
-
-#define PCX_MAGIC 0X0A // PCX magic number
-#define PCX_256_COLORS 0X0C // magic number for 256 colors
-#define PCX_HDR_SIZE 128 // size of PCX header
-#define PCX_MAXCOLORS 256
-#define PCX_MAXPLANES 4
-#define PCX_MAXVAL 255
-
-////////////////////////////////////////////////////////////////////////////////
-bool CxImagePCX::Decode(CxFile *hFile)
-{
- if (hFile == NULL) return false;
-
- PCXHEADER pcxHeader;
- int i, x, y, y2, nbytes, count, Height, Width;
- BYTE c, ColorMap[PCX_MAXCOLORS][3];
- BYTE *pcximage = NULL, *lpHead1 = NULL, *lpHead2 = NULL;
- BYTE *pcxplanes, *pcxpixels;
-
- try
- {
- if (hFile->Read(&pcxHeader,sizeof(PCXHEADER),1)==0) throw "Can't read PCX image";
-
- if (pcxHeader.Manufacturer != PCX_MAGIC) throw "Error: Not a PCX file";
- // Check for PCX run length encoding
- if (pcxHeader.Encoding != 1) throw "PCX file has unknown encoding scheme";
-
- Width = (pcxHeader.Xmax - pcxHeader.Xmin) + 1;
- Height = (pcxHeader.Ymax - pcxHeader.Ymin) + 1;
- info.xDPI = pcxHeader.Hres;
- info.yDPI = pcxHeader.Vres;
-
- // Check that we can handle this image format
- if (pcxHeader.ColorPlanes > 4)
- throw "Can't handle image with more than 4 planes";
-
- // Create the image
- if (pcxHeader.ColorPlanes >= 3 && pcxHeader.BitsPerPixel == 8){
- Create (Width, Height, 24, CXIMAGE_FORMAT_PCX);
-#if CXIMAGE_SUPPORT_ALPHA
- if (pcxHeader.ColorPlanes==4) AlphaCreate();
-#endif //CXIMAGE_SUPPORT_ALPHA
- } else if (pcxHeader.ColorPlanes == 4 && pcxHeader.BitsPerPixel == 1)
- Create (Width, Height, 4, CXIMAGE_FORMAT_PCX);
- else
- Create (Width, Height, pcxHeader.BitsPerPixel, CXIMAGE_FORMAT_PCX);
-
- if (info.nEscape) throw "Cancelled"; // - cancel decoding
-
- //Read the image and check if it's ok
- nbytes = pcxHeader.BytesPerLine * pcxHeader.ColorPlanes * Height;
- lpHead1 = pcximage = (BYTE*)malloc(nbytes);
- while (nbytes > 0){
- if (hFile == NULL || hFile->Eof()) throw "corrupted PCX";
-
- hFile->Read(&c,1,1);
- if ((c & 0XC0) != 0XC0){ // Repeated group
- *pcximage++ = c;
- --nbytes;
- continue;
- }
- count = c & 0X3F; // extract count
- hFile->Read(&c,1,1);
- if (count > nbytes) throw "repeat count spans end of image";
-
- nbytes -= count;
- while (--count >=0) *pcximage++ = c;
- }
- pcximage = lpHead1;
-
- //store the palette
- for (i = 0; i < 16; i++){
- ColorMap[i][0] = pcxHeader.ColorMap[i][0];
- ColorMap[i][1] = pcxHeader.ColorMap[i][1];
- ColorMap[i][2] = pcxHeader.ColorMap[i][2];
- }
- if (pcxHeader.BitsPerPixel == 8 && pcxHeader.ColorPlanes == 1){
- hFile->Read(&c,1,1);
- if (c != PCX_256_COLORS) throw "bad color map signature";
-
- for (i = 0; i < PCX_MAXCOLORS; i++){
- hFile->Read(&ColorMap[i][0],1,1);
- hFile->Read(&ColorMap[i][1],1,1);
- hFile->Read(&ColorMap[i][2],1,1);
- }
- }
- if (pcxHeader.BitsPerPixel == 1 && pcxHeader.ColorPlanes == 1){
- ColorMap[0][0] = ColorMap[0][1] = ColorMap[0][2] = 0;
- ColorMap[1][0] = ColorMap[1][1] = ColorMap[1][2] = 255;
- }
-
- for (DWORD idx=0; idx - cancel decoding
-
- y2=Height-1-y;
- pcxpixels = lpHead2;
- pcxplanes = pcximage + (y * pcxHeader.BytesPerLine * pcxHeader.ColorPlanes);
-
- if (pcxHeader.ColorPlanes == 3 && pcxHeader.BitsPerPixel == 8){
- // Deal with 24 bit color image
- for (x = 0; x < Width; x++){
- SetPixelColor(x,y2,RGB(pcxplanes[x],pcxplanes[pcxHeader.BytesPerLine + x],pcxplanes[2*pcxHeader.BytesPerLine + x]));
- }
- continue;
-#if CXIMAGE_SUPPORT_ALPHA
- } else if (pcxHeader.ColorPlanes == 4 && pcxHeader.BitsPerPixel == 8){
- for (x = 0; x < Width; x++){
- SetPixelColor(x,y2,RGB(pcxplanes[x],pcxplanes[pcxHeader.BytesPerLine + x],pcxplanes[2*pcxHeader.BytesPerLine + x]));
- AlphaSet(x,y2,pcxplanes[3*pcxHeader.BytesPerLine + x]);
- }
- continue;
-#endif //CXIMAGE_SUPPORT_ALPHA
- } else if (pcxHeader.ColorPlanes == 1) {
- PCX_UnpackPixels(pcxpixels, pcxplanes, pcxHeader.BytesPerLine, pcxHeader.ColorPlanes, pcxHeader.BitsPerPixel);
- } else {
- PCX_PlanesToPixels(pcxpixels, pcxplanes, pcxHeader.BytesPerLine, pcxHeader.ColorPlanes, pcxHeader.BitsPerPixel);
- }
- for (x = 0; x < Width; x++) SetPixelIndex(x,y2,pcxpixels[x]);
- }
-
- } catch (char *message) {
- strncpy(info.szLastError,message,255);
- if (lpHead1){ free(lpHead1); lpHead1 = NULL; }
- if (lpHead2){ free(lpHead2); lpHead2 = NULL; }
- return false;
- }
- if (lpHead1){ free(lpHead1); lpHead1 = NULL; }
- if (lpHead2){ free(lpHead2); lpHead2 = NULL; }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#if CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-bool CxImagePCX::Encode(CxFile * hFile)
-{
- if (EncodeSafeCheck(hFile)) return false;
-
- try {
- PCXHEADER pcxHeader;
- memset(&pcxHeader,0,sizeof(pcxHeader));
- pcxHeader.Manufacturer = PCX_MAGIC;
- pcxHeader.Version = 5;
- pcxHeader.Encoding = 1;
- pcxHeader.Xmin = 0;
- pcxHeader.Ymin = 0;
- pcxHeader.Xmax = (WORD)head.biWidth-1;
- pcxHeader.Ymax = (WORD)head.biHeight-1;
- pcxHeader.Hres = (WORD)info.xDPI;
- pcxHeader.Vres = (WORD)info.yDPI;
- pcxHeader.Reserved = 0;
- pcxHeader.PaletteType = head.biClrUsed==0;
-
- switch(head.biBitCount){
- case 24:
- case 8:
- {
- pcxHeader.BitsPerPixel = 8;
- pcxHeader.ColorPlanes = head.biClrUsed==0 ? 3 : 1;
-#if CXIMAGE_SUPPORT_ALPHA
- if (AlphaIsValid() && head.biClrUsed==0) pcxHeader.ColorPlanes =4;
-#endif //CXIMAGE_SUPPORT_ALPHA
- pcxHeader.BytesPerLine = (WORD)head.biWidth;
- break;
- }
- default: //(4 1)
- pcxHeader.BitsPerPixel = 1;
- pcxHeader.ColorPlanes = head.biClrUsed==16 ? 4 : 1;
- pcxHeader.BytesPerLine = (WORD)((head.biWidth * pcxHeader.BitsPerPixel + 7)>>3);
- }
-
- if (pcxHeader.BitsPerPixel == 1 && pcxHeader.ColorPlanes == 1){
- pcxHeader.ColorMap[0][0] = pcxHeader.ColorMap[0][1] = pcxHeader.ColorMap[0][2] = 0;
- pcxHeader.ColorMap[1][0] = pcxHeader.ColorMap[1][1] = pcxHeader.ColorMap[1][2] = 255;
- }
- if (pcxHeader.BitsPerPixel == 1 && pcxHeader.ColorPlanes == 4){
- RGBQUAD c;
- for (int i = 0; i < 16; i++){
- c=GetPaletteColor(i);
- pcxHeader.ColorMap[i][0] = c.rgbRed;
- pcxHeader.ColorMap[i][1] = c.rgbGreen;
- pcxHeader.ColorMap[i][2] = c.rgbBlue;
- }
- }
-
- pcxHeader.BytesPerLine = (pcxHeader.BytesPerLine + 1)&(~1);
-
- if (hFile->Write(&pcxHeader, sizeof(pcxHeader), 1) == 0 )
- throw "cannot write PCX header";
-
- CxMemFile buffer;
- buffer.Open();
-
- BYTE c,n;
- long x,y;
- if (head.biClrUsed==0){
- for (y = head.biHeight-1; y >=0 ; y--){
- for (int p=0; pWrite(buffer.GetBuffer(false),buffer.Size(),1);
-
- } else if (head.biBitCount==8) {
-
- for (y = head.biHeight-1; y >=0 ; y--){
- c=n=0;
- for (x = 0; xWrite(buffer.GetBuffer(false),buffer.Size(),1);
-
- if (head.biBitCount == 8){
- hFile->PutC(0x0C);
- BYTE* pal = (BYTE*)malloc(768);
- RGBQUAD c;
- for (int i=0;i<256;i++){
- c=GetPaletteColor(i);
- pal[3*i+0] = c.rgbRed;
- pal[3*i+1] = c.rgbGreen;
- pal[3*i+2] = c.rgbBlue;
- }
- hFile->Write(pal,768,1);
- free(pal);
- }
- } else { //(head.biBitCount==4) || (head.biBitCount==1)
-
- RGBQUAD *rgb = GetPalette();
- bool binvert = false;
- if (CompareColors(&rgb[0],&rgb[1])>0) binvert=(head.biBitCount==1);
-
- BYTE* plane = (BYTE*)malloc(pcxHeader.BytesPerLine);
- BYTE* raw = (BYTE*)malloc(head.biWidth);
-
- for(y = head.biHeight-1; y >=0 ; y--) {
-
- for( x = 0; x < head.biWidth; x++) raw[x] = (BYTE)GetPixelIndex(x,y);
-
- if (binvert) for( x = 0; x < head.biWidth; x++) raw[x] = 1-raw[x];
-
- for( x = 0; x < pcxHeader.ColorPlanes; x++ ) {
- PCX_PixelsToPlanes(raw, head.biWidth, plane, x);
- PCX_PackPlanes(plane, pcxHeader.BytesPerLine, buffer);
- }
- }
-
- free(plane);
- free(raw);
-
- hFile->Write(buffer.GetBuffer(false),buffer.Size(),1);
-
- }
-
- } catch (char *message) {
- strncpy(info.szLastError,message,255);
- return false;
- }
- return true;
-}
-////////////////////////////////////////////////////////////////////////////////
-#endif // CXIMAGE_SUPPORT_ENCODE
-////////////////////////////////////////////////////////////////////////////////
-// Convert multi-plane format into 1 pixel per byte
-// from unpacked file data bitplanes[] into pixel row pixels[]
-// image Height rows, with each row having planes image planes each
-// bytesperline bytes
-void CxImagePCX::PCX_PlanesToPixels(BYTE * pixels, BYTE * bitplanes, short bytesperline, short planes, short bitsperpixel)
-{
- int i, j, npixels;
- BYTE * p;
- if (planes > 4) throw "Can't handle more than 4 planes";
- if (bitsperpixel != 1) throw "Can't handle more than 1 bit per pixel";
-
- // Clear the pixel buffer
- npixels = (bytesperline * 8) / bitsperpixel;
- p = pixels;
- while (--npixels >= 0) *p++ = 0;
-
- // Do the format conversion
- for (i = 0; i < planes; i++){
- int pixbit, bits, mask;
- p = pixels;
- pixbit = (1 << i); // pixel bit for this plane
- for (j = 0; j < bytesperline; j++){
- bits = *bitplanes++;
- for (mask = 0X80; mask != 0; mask >>= 1, p++)
- if (bits & mask) *p |= pixbit;
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-// convert packed pixel format into 1 pixel per byte
-// from unpacked file data bitplanes[] into pixel row pixels[]
-// image Height rows, with each row having planes image planes each
-// bytesperline bytes
-void CxImagePCX::PCX_UnpackPixels(BYTE * pixels, BYTE * bitplanes, short bytesperline, short planes, short bitsperpixel)
-{
- register int bits;
- if (planes != 1) throw "Can't handle packed pixels with more than 1 plane.";
-
- if (bitsperpixel == 8){ // 8 bits/pixels, no unpacking needed
- while (bytesperline-- > 0) *pixels++ = *bitplanes++;
- } else if (bitsperpixel == 4){ // 4 bits/pixel, two pixels per byte
- while (bytesperline-- > 0){
- bits = *bitplanes++;
- *pixels++ = (BYTE)((bits >> 4) & 0X0F);
- *pixels++ = (BYTE)((bits) & 0X0F);
- }
- } else if (bitsperpixel == 2){ // 2 bits/pixel, four pixels per byte
- while (bytesperline-- > 0){
- bits = *bitplanes++;
- *pixels++ = (BYTE)((bits >> 6) & 0X03);
- *pixels++ = (BYTE)((bits >> 4) & 0X03);
- *pixels++ = (BYTE)((bits >> 2) & 0X03);
- *pixels++ = (BYTE)((bits) & 0X03);
- }
- } else if (bitsperpixel == 1){ // 1 bits/pixel, 8 pixels per byte
- while (bytesperline-- > 0){
- bits = *bitplanes++;
- *pixels++ = ((bits & 0X80) != 0);
- *pixels++ = ((bits & 0X40) != 0);
- *pixels++ = ((bits & 0X20) != 0);
- *pixels++ = ((bits & 0X10) != 0);
- *pixels++ = ((bits & 0X08) != 0);
- *pixels++ = ((bits & 0X04) != 0);
- *pixels++ = ((bits & 0X02) != 0);
- *pixels++ = ((bits & 0X01) != 0);
- }
- }
-}
-////////////////////////////////////////////////////////////////////////////////
-/* PCX_PackPixels(const long p,BYTE &c, BYTE &n, long &l, CxFile &f)
- * p = current pixel (-1 ends the line -2 ends odd line)
- * c = previous pixel
- * n = number of consecutive pixels
- */
-void CxImagePCX::PCX_PackPixels(const long p,BYTE &c, BYTE &n, CxFile &f)
-{
- if (p!=c && n){
- if (n==1 && c<0xC0){
- f.PutC(c);
- } else {
- f.PutC(0xC0|n);
- f.PutC(c);
- }
- n=0;
- }
- if (n==0x3F) {
- f.PutC(0xFF);
- f.PutC(c);
- n=0;
- }
- if (p==-2) f.PutC(0);
- c=(BYTE)p;
- n++;
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImagePCX::PCX_PackPlanes(BYTE* buff, const long size, CxFile &f)
-{
- BYTE *start,*end;
- BYTE c, previous, count;
-
- start = buff;
- end = buff + size;
- previous = *start++;
- count = 1;
-
- while (start < end) {
- c = *start++;
- if (c == previous && count < 63) {
- ++count;
- continue;
- }
-
- if (count > 1 || (previous & 0xc0) == 0xc0) {
- f.PutC( count | 0xc0 );
- }
- f.PutC(previous);
- previous = c;
- count = 1;
- }
-
- if (count > 1 || (previous & 0xc0) == 0xc0) {
- count |= 0xc0;
- f.PutC(count);
- }
- f.PutC(previous);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImagePCX::PCX_PixelsToPlanes(BYTE* raw, long width, BYTE* buf, long plane)
-{
- int cbit, x, mask;
- unsigned char *cp = buf-1;
-
- mask = 1 << plane;
- cbit = -1;
- for( x = 0; x < width; x++ ) {
- if( cbit < 0 ) {
- cbit = 7;
- *++cp = 0;
- }
- if( raw[x] & mask )
- *cp |= (1<jmpbuf, 1);
-}
-////////////////////////////////////////////////////////////////////////////////
-void CxImagePNG::expand2to4bpp(BYTE* prow)
-{
- BYTE *psrc,*pdst;
- BYTE pos,idx;
- for(long x=head.biWidth-1;x>=0;x--){
- psrc = prow + ((2*x)>>3);
- pdst = prow + ((4*x)>>3);
- pos = (BYTE)(2*(3-x%4));
- idx = (BYTE)((*psrc & (0x03<>pos);
- pos = (BYTE)(4*(1-x%2));
- *pdst &= ~(0x0F<jmpbuf)) {
- /* Free all of the memory associated with the png_ptr and info_ptr */
- if (row_pointers) delete[] row_pointers;
- png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL);
- throw "";
- }
- /* set up the input control */
- //png_init_io(png_ptr, hFile);
-
- // use custom I/O functions
- png_set_read_fn(png_ptr, hFile, (png_rw_ptr)user_read_data);
- png_set_error_fn(png_ptr,info.szLastError,(png_error_ptr)user_error_fn,NULL);
-
- /* read the file information */
- png_read_info(png_ptr, info_ptr);
-
- /* allocate the memory to hold the image using the fields of png_info. */
- png_color_16 my_background={ 0, 192, 192, 192, 0 };
- png_color_16 *image_background;
-
- if (info_ptr->pixel_depth != 32){
- // preserve original background info.
- if (png_get_bKGD(png_ptr, info_ptr, &image_background))
- png_set_background(png_ptr, image_background,PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
- else
- png_set_background(png_ptr, &my_background,PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
-// - we call png_set_bgr() below
-// // safe check
-// if (info_ptr->pixel_depth > 16 ) info_ptr->color_type = COLORTYPE_COLOR;
- }
-
- // hack for images with alpha channel
- if (info_ptr->pixel_depth == 32){
-// info.nBkgndIndex = 0; //enable transparency
- if (png_get_bKGD(png_ptr, info_ptr, &image_background)){
- info.nBkgndColor.rgbRed = (BYTE)image_background->red;
- info.nBkgndColor.rgbGreen = (BYTE)image_background->green;
- info.nBkgndColor.rgbBlue = (BYTE)image_background->blue;
- info.nBkgndColor.rgbReserved = 0; //
- }
- }
-
- /* tell libpng to strip 16 bit depth files down to 8 bits */
- if (info_ptr->bit_depth == 16) png_set_strip_16(png_ptr);
-
- int pixel_depth=info_ptr->pixel_depth;
- if (pixel_depth > 16 ) pixel_depth=24;
- if (pixel_depth == 16 ) pixel_depth=8;
-
- Create(info_ptr->width, info_ptr->height, pixel_depth, CXIMAGE_FORMAT_PNG);
-
- /* get metrics */
- switch (info_ptr->phys_unit_type)
- {
- case PNG_RESOLUTION_UNKNOWN:
- SetXDPI(info_ptr->x_pixels_per_unit);
- SetYDPI(info_ptr->y_pixels_per_unit);
- break;
- case PNG_RESOLUTION_METER:
- SetXDPI((long)floor(info_ptr->x_pixels_per_unit * 254.0 / 10000.0 + 0.5));
- SetYDPI((long)floor(info_ptr->y_pixels_per_unit * 254.0 / 10000.0 + 0.5));
- break;
- }
-
- if (info_ptr->num_palette>0)
- SetPalette((rgb_color*)info_ptr->palette,info_ptr->num_palette);
- else if (info_ptr->bit_depth ==2) { // needed for 2 bpp grayscale PNGs
- SetPaletteColor(0,0,0,0);
- SetPaletteColor(1,85,85,85);
- SetPaletteColor(2,170,170,170);
- SetPaletteColor(3,255,255,255);
- } else SetGrayPalette(); // needed for grayscale PNGs
-
- // simple transparency (the real PGN transparency is more complex)
- if (info_ptr->num_trans!=0){
- //palette transparency
- RGBQUAD* pal=GetPalette();
- if (pal){
- DWORD ip;
- for (ip=0;ipnum_trans);ip++)
- pal[ip].rgbReserved=info_ptr->trans[ip];
- if (info_ptr->num_trans==1 && pal[0].rgbReserved==0){
- info.nBkgndIndex = 0;
- } else {
- info.bAlphaPaletteEnabled=true;
- for (;ipcolor_type == PNG_COLOR_TYPE_RGB_ALPHA || //Alpha channel
- (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA && info_ptr->pixel_depth == 32)){
- if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA){
- png_set_gray_to_rgb(png_ptr);
- png_set_expand(png_ptr);
- }
-#if CXIMAGE_SUPPORT_ALPHA //
- png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
- AlphaCreate();
-#else
- png_set_strip_alpha(png_ptr);
-#endif //CXIMAGE_SUPPORT_ALPHA
- }
-
- // - flip the RGB pixels to BGR (or RGBA to BGRA)
- if (info_ptr->color_type & PNG_COLOR_MASK_COLOR) png_set_bgr(png_ptr);
-
- // - handle cancel
- if (info.nEscape) longjmp(png_ptr->jmpbuf, 1);
-
- //allocate the buffer
- int row_stride = info_ptr->width * ((info_ptr->pixel_depth+7)>>3);
- row_pointers = new BYTE[10+row_stride];
-
- // turn on interlace handling
- number_passes = png_set_interlace_handling(png_ptr);
-
- if (number_passes>1){
- SetCodecOption(1);
- } else {
- SetCodecOption(0);
- }
-
- for (int pass=0; pass< number_passes; pass++) {
- iter.Upset();
- int y=0;
- do {
-
- // - handle cancel
- if (info.nEscape) longjmp(png_ptr->jmpbuf, 1);
-
-#if CXIMAGE_SUPPORT_ALPHA //
- if (!AlphaIsValid())
-#endif // CXIMAGE_SUPPORT_ALPHA
- {
- //recover data from previous scan
- if (info_ptr->interlace_type && pass>0)
- iter.GetRow(row_pointers, info.dwEffWidth);
- //read next row
- png_read_row(png_ptr, row_pointers, NULL);
-// - already done by png_set_bgr()
-// //HACK BY OP && ( for interlace, swap only in the last pass)
-// if (info_ptr->color_type==COLORTYPE_COLOR && pass==(number_passes-1))
-// RGBtoBGR(row_pointers, info.dwEffWidth);
- // expand 2 bpp images only in the last pass
- if (info_ptr->bit_depth==2 && pass==(number_passes-1))
- expand2to4bpp(row_pointers);
- //copy the pixels
- iter.SetRow(row_pointers, info.dwEffWidth);
- //go on
- iter.PrevRow();
- }
-#if CXIMAGE_SUPPORT_ALPHA //
- else { //alpha blend
-
- //compute the correct position of the line
- long ax,ay;
- ay = head.biHeight-1-y;
- BYTE* prow= iter.GetRow(ay);
-
- //recover data from previous scan
- if (info_ptr->interlace_type && pass>0 && pass!=7){
- for(ax=head.biWidth;ax>=0;ax--){
- row_pointers[ax*4]=prow[3*ax];
- row_pointers[ax*4+1]=prow[3*ax+1];
- row_pointers[ax*4+2]=prow[3*ax+2];
- row_pointers[ax*4+3]=AlphaGet(ax,ay);
- }
- }
-
- //read next row
- png_read_row(png_ptr, row_pointers, NULL);
-
- //RGBA -> RGB + A
- for(ax=0;axjmpbuf)){
- /* If we get here, we had a problem reading the file */
- if (info_ptr->palette) free(info_ptr->palette);
- png_destroy_write_struct(&png_ptr, (png_infopp)&info_ptr);
- throw "Error saving PNG file";
- }
-
- int row_stride = info.dwEffWidth;
- /* set up the output control */
- //png_init_io(png_ptr, hFile);
-
- // use custom I/O functions
- png_set_write_fn(png_ptr,hFile,(png_rw_ptr)user_write_data,(png_flush_ptr)user_flush_data);
-
- /* set the file information here */
- info_ptr->width = GetWidth();
- info_ptr->height = GetHeight();
- info_ptr->pixel_depth = (BYTE)GetBpp();
- info_ptr->channels = (GetBpp()>8) ? (BYTE)3: (BYTE)1;
- info_ptr->bit_depth = (BYTE)(GetBpp()/info_ptr->channels);
- info_ptr->color_type = GetColorType();
- info_ptr->compression_type = info_ptr->filter_type = 0;
- info_ptr->valid = 0;
- info_ptr->rowbytes = row_stride;
-
- switch(GetCodecOption(CXIMAGE_FORMAT_PNG)){
- case 1:
- info_ptr->interlace_type = PNG_INTERLACE_ADAM7;
- break;
- default:
- info_ptr->interlace_type = PNG_INTERLACE_NONE;
- }
-
- /* set compression level */
- //png_set_compression_level(png_ptr, Z_BEST_COMPRESSION);
-
- /* set background */
- png_color_16 image_background={ 0, 255, 255, 255, 0 };
- if (info.nBkgndIndex!=-1) {
- image_background.blue = info.nBkgndColor.rgbBlue;
- image_background.green = info.nBkgndColor.rgbGreen;
- image_background.red = info.nBkgndColor.rgbRed;
- }
- png_set_bKGD(png_ptr, info_ptr, &image_background);
-
- /* set metrics */
- png_set_pHYs(png_ptr, info_ptr, head.biXPelsPerMeter, head.biYPelsPerMeter, PNG_RESOLUTION_METER);
-
- /* set the palette if there is one */
- if (GetPalette()){
- png_set_IHDR(png_ptr, info_ptr, info_ptr->width, info_ptr->height, info_ptr->bit_depth,
- PNG_COLOR_TYPE_PALETTE, info_ptr->interlace_type,
- PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
- info_ptr->valid |= PNG_INFO_PLTE;
-
- // simple transparency
- if (info.nBkgndIndex != -1){
- trans[0]=0;
- info_ptr->num_trans = 1;
- info_ptr->valid |= PNG_INFO_tRNS;
- info_ptr->trans = trans;
- // the transparency indexes start from 0
- if (info.nBkgndIndex){
- SwapIndex(0,(BYTE)info.nBkgndIndex);
- // the ghost must set the changed attributes in the body
- if (info.pGhost) info.pGhost->SetTransIndex(0);
- }
- }
-
- int nc = GetNumColors();
-
- /* We not need to write unused colors! */
- /* only for small images */
- if ((nc>2)&&((head.biWidth*head.biHeight)<65536)){
- nc = 0;
- for (DWORD y=0;ync){
- nc=GetPixelIndex(x,y);
- }
- }
- }
- nc++;
- }
-
- if (info.bAlphaPaletteEnabled){
- for(WORD ip=0; ipnum_trans = (WORD)nc;
- info_ptr->valid |= PNG_INFO_tRNS;
- info_ptr->trans = trans;
- }
-
- // copy the palette colors
- info_ptr->palette = new png_color[nc];
- info_ptr->num_palette = (png_uint_16) nc;
- for (int i=0; ipalette[i].red, &info_ptr->palette[i].green, &info_ptr->palette[i].blue);
-
- }
-
-#if CXIMAGE_SUPPORT_ALPHA //
- //Merge the transparent color with the alpha channel
- bool bNeedTempAlpha = false;
- if (head.biBitCount==24 && info.nBkgndIndex>=0){
- if (!AlphaIsValid()){
- bNeedTempAlpha = true;
- AlphaCreate();
- }
- RGBQUAD c,ct=GetTransColor();
- for(long y=0; y < head.biHeight; y++){
- for(long x=0; x < head.biWidth ; x++){
- c=GetPixelColor(x,y,false);
- if (*(long*)&c==*(long*)&ct)
- AlphaSet(x,y,0);
- }}
- }
-#endif // CXIMAGE_SUPPORT_ALPHA //
-
-#if CXIMAGE_SUPPORT_ALPHA //
- if (AlphaIsValid()){
- row_stride = 4 * head.biWidth;
-
- info_ptr->pixel_depth = 32;
- info_ptr->channels = 4;
- info_ptr->bit_depth = 8;
- info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
- info_ptr->rowbytes = row_stride;
-
- /* write the file information */
- png_write_info(png_ptr, info_ptr);
-
- // "10+row_stride" fix heap deallocation problem during debug???
- BYTE *row_pointers = new BYTE[10+row_stride];
-
- //interlace handling
- int num_pass = png_set_interlace_handling(png_ptr);
- for (int pass = 0; pass < num_pass; pass++){
-
- //write image
- iter.Upset();
- long ay=head.biHeight-1;
- RGBQUAD c;
- do {
- for (long ax=head.biWidth-1; ax>=0;ax--){
- c=GetPixelColor(ax,ay);
- row_pointers[ax*4+3]=(BYTE)((AlphaGet(ax,ay)*info.nAlphaMax)/255);
- row_pointers[ax*4+2]=c.rgbBlue;
- row_pointers[ax*4+1]=c.rgbGreen;
- row_pointers[ax*4]=c.rgbRed;
- }
- png_write_row(png_ptr, row_pointers);
- ay--;
- } while(iter.PrevRow());
- }
-
- delete [] row_pointers;
- }
- else
-#endif //CXIMAGE_SUPPORT_ALPHA //