Coverage Report

Created: 2023-12-08 06:53

/src/freeimage-svn/FreeImage/trunk/Source/FreeImageToolkit/Flip.cpp
Line
Count
Source (jump to first uncovered line)
1
// ==========================================================
2
// Flipping routines
3
//
4
// Design and implementation by
5
// - Floris van den Berg (flvdberg@wxs.nl)
6
// - Hervé Drolon (drolon@infonie.fr)
7
// - Jim Keir (jimkeir@users.sourceforge.net)
8
//
9
// This file is part of FreeImage 3
10
//
11
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
12
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
13
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
14
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
15
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
16
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
17
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
18
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
19
// THIS DISCLAIMER.
20
//
21
// Use at your own risk!
22
// ==========================================================
23
24
#include "FreeImage.h"
25
#include "Utilities.h"
26
27
/**
28
Flip the image horizontally along the vertical axis.
29
@param src Input image to be processed.
30
@return Returns TRUE if successful, FALSE otherwise.
31
*/
32
BOOL DLL_CALLCONV 
33
0
FreeImage_FlipHorizontal(FIBITMAP *src) {
34
0
  if (!FreeImage_HasPixels(src)) return FALSE;
35
36
0
  unsigned line   = FreeImage_GetLine(src);
37
0
  unsigned width  = FreeImage_GetWidth(src);
38
0
  unsigned height = FreeImage_GetHeight(src);
39
40
0
  unsigned bytespp = FreeImage_GetLine(src) / FreeImage_GetWidth(src);
41
42
  // copy between aligned memories
43
0
  BYTE *new_bits = (BYTE*)FreeImage_Aligned_Malloc(line * sizeof(BYTE), FIBITMAP_ALIGNMENT);
44
0
  if (!new_bits) return FALSE;
45
46
  // mirror the buffer
47
48
0
  for (unsigned y = 0; y < height; y++) {
49
0
    BYTE *bits = FreeImage_GetScanLine(src, y);
50
0
    memcpy(new_bits, bits, line);
51
52
0
    switch (FreeImage_GetBPP(src)) {
53
0
      case 1 :
54
0
      {       
55
0
        for(unsigned x = 0; x < width; x++) {
56
          // get pixel at (x, y)
57
0
          BOOL value = (new_bits[x >> 3] & (0x80 >> (x & 0x07))) != 0;
58
          // set pixel at (new_x, y)
59
0
          unsigned new_x = width - 1 - x;
60
0
          value ? bits[new_x >> 3] |= (0x80 >> (new_x & 0x7)) : bits[new_x >> 3] &= (0xff7f >> (new_x & 0x7));
61
0
        }
62
0
      }
63
0
      break;
64
65
0
      case 4 :
66
0
      {
67
0
        for(unsigned c = 0; c < line; c++) {
68
0
          bits[c] = new_bits[line - c - 1];
69
70
0
          BYTE nibble = (bits[c] & 0xF0) >> 4;
71
72
0
          bits[c] = bits[c] << 4;
73
0
          bits[c] |= nibble;
74
0
        }
75
0
      }
76
0
      break;
77
78
0
      case 8:
79
0
      {       
80
0
        BYTE *dst_data = (BYTE*) bits;        
81
0
        BYTE *src_data = (BYTE*) (new_bits + line - bytespp);         
82
0
        for(unsigned c = 0; c < width; c++) {       
83
0
          *dst_data++ = *src_data--;  
84
0
        } 
85
0
      }
86
0
      break;
87
88
0
      case 16:
89
0
      {       
90
0
        WORD *dst_data = (WORD*) bits;        
91
0
        WORD *src_data = (WORD*) (new_bits + line - bytespp);         
92
0
        for(unsigned c = 0; c < width; c++) {       
93
0
          *dst_data++ = *src_data--;  
94
0
        } 
95
0
      }
96
0
      break;
97
98
0
      case 24 :
99
0
      case 32 :
100
0
      case 48:
101
0
      case 64:
102
0
      case 96:
103
0
      case 128:
104
0
      {       
105
0
        BYTE *dst_data = (BYTE*) bits;        
106
0
        BYTE *src_data = (BYTE*) (new_bits + line - bytespp);         
107
0
        for(unsigned c = 0; c < width; c++) {     
108
0
          for(unsigned k = 0; k < bytespp; k++) {
109
0
            *dst_data++ = src_data[k];  
110
0
          }
111
0
          src_data -= bytespp;
112
0
        } 
113
0
      }
114
0
      break;
115
116
0
    }
117
0
  }
118
119
0
  FreeImage_Aligned_Free(new_bits);
120
121
0
  return TRUE;
122
0
}
123
124
125
/**
126
Flip the image vertically along the horizontal axis.
127
@param src Input image to be processed.
128
@return Returns TRUE if successful, FALSE otherwise.
129
*/
130
131
BOOL DLL_CALLCONV 
132
0
FreeImage_FlipVertical(FIBITMAP *src) {
133
0
  BYTE *From, *Mid;
134
135
0
  if (!FreeImage_HasPixels(src)) return FALSE;
136
137
  // swap the buffer
138
  // use size_t in order to handle very large files
139
140
0
  size_t pitch  = FreeImage_GetPitch(src);
141
0
  size_t height = FreeImage_GetHeight(src);
142
143
  // copy between aligned memories
144
0
  Mid = (BYTE*)FreeImage_Aligned_Malloc(pitch * sizeof(BYTE), FIBITMAP_ALIGNMENT);
145
0
  if (!Mid) return FALSE;
146
147
0
  From = FreeImage_GetBits(src);
148
  
149
0
  size_t line_s = 0;
150
0
  size_t line_t = (height-1) * pitch;
151
152
0
  for(size_t y = 0; y < height/2; y++) {
153
154
0
    memcpy(Mid, From + line_s, pitch);
155
0
    memcpy(From + line_s, From + line_t, pitch);
156
0
    memcpy(From + line_t, Mid, pitch);
157
158
0
    line_s += pitch;
159
0
    line_t -= pitch;
160
161
0
  }
162
163
0
  FreeImage_Aligned_Free(Mid);
164
165
0
  return TRUE;
166
0
}
167