aboutsummaryrefslogtreecommitdiff
path: root/modules/librender/scaler_scale2x.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/librender/scaler_scale2x.c')
-rw-r--r--modules/librender/scaler_scale2x.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/modules/librender/scaler_scale2x.c b/modules/librender/scaler_scale2x.c
new file mode 100644
index 0000000..992dc3f
--- /dev/null
+++ b/modules/librender/scaler_scale2x.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright © 2001, 2002, 2003, 2004 Andrea Mazzoleni
+ *
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ * Copyright © 2002-2006 Fenix Team (Fenix)
+ * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, 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.
+ *
+ */
+
+/*
+ * You can find an high level description of the effect at :
+ *
+ * http://scale2x.sourceforge.net/scale2x.html
+ *
+ * Alternatively at the previous license terms, you are allowed to use this
+ * code in your program with these conditions:
+ * - the program is not used in commercial activities.
+ * - the whole source code of the program is released with the binary.
+ * - derivative works of the program are allowed.
+ */
+
+/* --------------------------------------------------------------------------- */
+
+#include "librender.h"
+
+/* --------------------------------------------------------------------------- */
+
+static void internal_scale2x_16_def( uint16_t *dst0, uint16_t* dst1, const uint16_t* src0, const uint16_t* src1, const uint16_t* src2, unsigned count )
+{
+ /* first pixel */
+ dst0[0] = src1[0];
+ dst1[0] = src1[0];
+
+ if ( src1[1] == src0[0] && src2[0] != src0[0] )
+ dst0[1] = src0[0];
+ else
+ dst0[1] = src1[0];
+
+ if ( src1[1] == src2[0] && src0[0] != src2[0] )
+ dst1[1] = src2[0];
+ else
+ dst1[1] = src1[0];
+
+ ++src0;
+ ++src1;
+ ++src2;
+
+ dst0 += 2;
+ dst1 += 2;
+
+ /* central pixels */
+ count -= 2;
+ while ( count )
+ {
+ if ( src1[-1] == src0[0] && src2[0] != src0[0] && src1[1] != src0[0] )
+ dst0[0] = src0[0];
+ else
+ dst0[0] = src1[0];
+
+ if ( src1[1] == src0[0] && src2[0] != src0[0] && src1[-1] != src0[0] )
+ dst0[1] = src0[0];
+ else
+ dst0[1] = src1[0];
+
+ if ( src1[-1] == src2[0] && src0[0] != src2[0] && src1[1] != src2[0] )
+ dst1[0] = src2[0];
+ else
+ dst1[0] = src1[0];
+
+ if ( src1[1] == src2[0] && src0[0] != src2[0] && src1[-1] != src2[0] )
+ dst1[1] = src2[0];
+ else
+ dst1[1] = src1[0];
+
+ ++src0;
+ ++src1;
+ ++src2;
+
+ dst0 += 2;
+ dst1 += 2;
+
+ --count;
+ }
+
+ /* last pixel */
+ if ( src1[-1] == src0[0] && src2[0] != src0[0] )
+ dst0[0] = src0[0];
+ else
+ dst0[0] = src1[0];
+
+ if ( src1[-1] == src2[0] && src0[0] != src2[0] )
+ dst1[0] = src2[0];
+ else
+ dst1[0] = src1[0];
+
+ dst0[1] = src1[0];
+ dst1[1] = src1[0];
+}
+
+/* --------------------------------------------------------------------------- */
+
+void scale2x( uint8_t *srcPtr, uint32_t srcPitch, uint8_t *dstPtr, uint32_t dstPitch, int width, int height )
+{
+ uint16_t *dst0 = ( uint16_t * )dstPtr;
+ uint16_t *dst1 = dst0 + ( dstPitch / 2 );
+
+ uint16_t *src0 = ( uint16_t * )srcPtr;
+ uint16_t *src1 = src0 + ( srcPitch / 2 );
+ uint16_t *src2 = src1 + ( srcPitch / 2 );
+
+ int count;
+
+ internal_scale2x_16_def( dst0, dst1, src0, src0, src1, width );
+
+ count = height;
+
+ count -= 2;
+ while ( count )
+ {
+ dst0 += dstPitch;
+ dst1 += dstPitch;
+
+ internal_scale2x_16_def( dst0, dst1, src0, src1, src2, width );
+
+ src0 = src1;
+ src1 = src2;
+ src2 += srcPitch / 2;
+
+ --count;
+ }
+ dst0 += dstPitch;
+ dst1 += dstPitch;
+
+ internal_scale2x_16_def( dst0, dst1, src0, src1, src1, width );
+}
+
+/* --------------------------------------------------------------------------- */
+