* Fix scaling with alpha channel. Patch from Bernd Kreuss, Mantis #22245

* Demo that demonstrates image scaling/interpolation

git-svn-id: trunk@21639 -
This commit is contained in:
marco 2012-06-18 09:01:41 +00:00
parent d99105143b
commit ee47ad22ff
5 changed files with 149 additions and 78 deletions

1
.gitattributes vendored
View File

@ -2182,6 +2182,7 @@ packages/fcl-image/examples/Makefile svneol=native#text/plain
packages/fcl-image/examples/Makefile.fpc svneol=native#text/plain
packages/fcl-image/examples/drawing.pp svneol=native#text/plain
packages/fcl-image/examples/imgconv.pp svneol=native#text/plain
packages/fcl-image/examples/interpoldemo.pp svneol=native#text/plain
packages/fcl-image/examples/xwdtobmp.pas svneol=native#text/plain
packages/fcl-image/fpmake.pp svneol=native#text/plain
packages/fcl-image/src/bmpcomn.pp svneol=native#text/plain

View File

@ -1,8 +1,8 @@
#
# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/04/25]
# Don't edit, this file is generated by FPCMake Version 2.0.0 [2012/06/18]
#
default: all
MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux
MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-darwin arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux jvm-java jvm-android
BSDs = freebsd netbsd openbsd darwin
UNIXs = linux $(BSDs) solaris qnx haiku aix
LIMIT83fs = go32v2 os2 emx watcom
@ -258,11 +258,13 @@ ifndef BINUTILSPREFIX
ifndef CROSSBINDIR
ifdef CROSSCOMPILE
ifndef DARWIN2DARWIN
ifneq ($(CPU_TARGET),jvm)
BINUTILSPREFIX=$(CPU_TARGET)-$(OS_TARGET)-
endif
endif
endif
endif
endif
UNITSDIR:=$(wildcard $(FPCDIR)/units/$(TARGETSUFFIX))
ifeq ($(UNITSDIR),)
UNITSDIR:=$(wildcard $(FPCDIR)/units/$(OS_TARGET))
@ -293,208 +295,214 @@ FPCFPMAKE=$(FPC)
endif
endif
ifeq ($(FULL_TARGET),i386-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-go32v2)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-win32)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-os2)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-freebsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-beos)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-haiku)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-netbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-solaris)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-qnx)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-netware)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-openbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-wdosx)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-darwin)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-emx)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-watcom)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-netwlibc)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-wince)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-symbian)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-nativent)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),i386-iphonesim)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-freebsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-netbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-amiga)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-atari)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-openbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-palmos)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),m68k-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-netbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-amiga)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-macos)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-darwin)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-morphos)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-wii)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc-aix)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),sparc-netbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),sparc-solaris)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),sparc-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-netbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-solaris)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-openbsd)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-win64)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),x86_64-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-palmos)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-darwin)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-wince)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-gba)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-nds)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),arm-symbian)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc64-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc64-darwin)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc64-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),powerpc64-aix)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),avr-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),armeb-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),armeb-embedded)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),mips-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),mipsel-linux)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),jvm-java)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
ifeq ($(FULL_TARGET),jvm-android)
override TARGET_PROGRAMS+=imgconv drawing xwdtobmp interpoldemo
endif
override INSTALL_FPCPACKAGE=y
ifdef REQUIRE_UNITSDIR
@ -854,6 +862,18 @@ BATCHEXT=.sh
EXEEXT=
SHORTSUFFIX=aix
endif
ifeq ($(OS_TARGET),java)
OEXT=.class
ASMEXT=.j
SHAREDLIBEXT=.jar
SHORTSUFFIX=java
endif
ifeq ($(OS_TARGET),android)
OEXT=.class
ASMEXT=.j
SHAREDLIBEXT=.jar
SHORTSUFFIX=android
endif
ifneq ($(findstring $(OS_SOURCE),$(LIMIT83fs)),)
FPCMADE=fpcmade.$(SHORTSUFFIX)
ZIPSUFFIX=$(SHORTSUFFIX)
@ -1640,6 +1660,22 @@ REQUIRE_PACKAGES_HASH=1
REQUIRE_PACKAGES_FPMKUNIT=1
REQUIRE_PACKAGES_FCL-IMAGE=1
endif
ifeq ($(FULL_TARGET),jvm-java)
REQUIRE_PACKAGES_RTL=1
REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
REQUIRE_PACKAGES_HASH=1
REQUIRE_PACKAGES_FPMKUNIT=1
REQUIRE_PACKAGES_FCL-IMAGE=1
endif
ifeq ($(FULL_TARGET),jvm-android)
REQUIRE_PACKAGES_RTL=1
REQUIRE_PACKAGES_PASZLIB=1
REQUIRE_PACKAGES_FCL-PROCESS=1
REQUIRE_PACKAGES_HASH=1
REQUIRE_PACKAGES_FPMKUNIT=1
REQUIRE_PACKAGES_FCL-IMAGE=1
endif
ifdef REQUIRE_PACKAGES_RTL
PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR))))))
ifneq ($(PACKAGEDIR_RTL),)
@ -1980,17 +2016,12 @@ endif
endif
ifdef CREATESHARED
override FPCOPT+=-Cg
ifeq ($(CPU_TARGET),i386)
override FPCOPT+=-Aas
endif
endif
ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
ifeq ($(CPU_TARGET),x86_64)
override FPCOPT+=-Cg
endif
endif
endif
ifdef LINKSHARED
endif
ifdef OPT

View File

@ -3,7 +3,7 @@
#
[target]
programs=imgconv drawing xwdtobmp
programs=imgconv drawing xwdtobmp interpoldemo
[require]
packages=fcl-image

View File

@ -0,0 +1,39 @@
program interpoldemo;
// Interpolation demo for fcl-image by Bernd Kreuss. Mantis #22245
// Loads original.png (not included) and scales it back to 64x64
{$mode objfpc}{$H+}
uses
Classes,
sysutils,
FPimage,
FPImgCanv,
FPReadPNG,
FPWritePNG;
var
ImOriginal: TFPMemoryImage;
ImScaled: TFPMemoryImage;
CanvScaled: TFPImageCanvas;
Reader: TFPReaderPNG;
Writer: TFPWriterPNG;
begin
ImOriginal := TFPMemoryImage.Create(0, 0);
ImScaled := TFPMemoryImage.Create(64, 64);
Reader := TFPReaderPNG.create;
Writer := TFPWriterPNG.create;
Writer.UseAlpha := True;
ImOriginal.LoadFromFile('original.png', Reader);
CanvScaled := TFPImageCanvas.create(ImScaled);
CanvScaled.StretchDraw(0,0,63,63, ImOriginal);
ImScaled.SaveToFile('scaled.png', Writer);
Reader.Free;
Writer.Free;
ImOriginal.Free;
ImScaled.Free;
end.

View File

@ -179,7 +179,7 @@ begin
begin
sx:=PInteger(xEntry)^;
inc(xEntry,SizeOf(integer));
NewCol:=colBlack;
NewCol:= colTransparent;
for cx:=0 to xSupport-1 do
begin
f:=PSingle(xEntry)^;
@ -198,7 +198,7 @@ begin
for dx:=0 to w-1 do
begin
CurEntry:=yEntry+SizeOf(integer);
NewCol:=colBlack;
NewCol:=colTransparent;
for sy:=0 to ySupport-1 do
begin
f:=PSingle(CurEntry)^;