Coverage Report

Created: 2026-02-26 06:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/freeimage-svn/FreeImage/trunk/Source/FreeImage/PixelAccess.cpp
Line
Count
Source
1
// ==========================================================
2
// Pixel access functions
3
//
4
// Design and implementation by
5
// - Floris van den Berg (flvdberg@wxs.nl)
6
// - Hervé Drolon (drolon@infonie.fr)
7
// - Ryan Rubley (ryan@lostreality.org)
8
// - Riley McNiff (rmcniff@marexgroup.com)
9
//
10
// This file is part of FreeImage 3
11
//
12
// COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY
13
// OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
14
// THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE
15
// OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED
16
// CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT
17
// THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
18
// SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL
19
// PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER
20
// THIS DISCLAIMER.
21
//
22
// Use at your own risk!
23
// ==========================================================
24
25
#include "FreeImage.h"
26
#include "Utilities.h"
27
28
// ----------------------------------------------------------
29
30
BYTE * DLL_CALLCONV
31
7.64M
FreeImage_GetScanLine(FIBITMAP *dib, int scanline) {
32
7.64M
  if(!FreeImage_HasPixels(dib)) {
33
0
    return NULL;
34
0
  }
35
7.64M
  return CalculateScanLine(FreeImage_GetBits(dib), FreeImage_GetPitch(dib), scanline);
36
7.64M
}
37
38
BOOL DLL_CALLCONV
39
0
FreeImage_GetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, BYTE *value) {
40
0
  BYTE shift;
41
42
0
  if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP))
43
0
    return FALSE;
44
45
0
  if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) {
46
0
    BYTE *bits = FreeImage_GetScanLine(dib, y);
47
48
0
    switch(FreeImage_GetBPP(dib)) {
49
0
      case 1:
50
0
        *value = (bits[x >> 3] & (0x80 >> (x & 0x07))) != 0;
51
0
        break;
52
0
      case 4:
53
0
        shift = (BYTE)((1 - x % 2) << 2);
54
0
        *value = (bits[x >> 1] & (0x0F << shift)) >> shift;
55
0
        break;
56
0
      case 8:
57
0
        *value = bits[x];
58
0
        break;
59
0
      default:
60
0
        return FALSE;
61
0
    }
62
63
0
    return TRUE;
64
0
  }
65
66
0
  return FALSE;
67
0
}
68
69
BOOL DLL_CALLCONV
70
0
FreeImage_GetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value) {
71
0
  if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP))
72
0
    return FALSE;
73
74
0
  if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) {
75
0
    BYTE *bits = FreeImage_GetScanLine(dib, y);
76
77
0
    switch(FreeImage_GetBPP(dib)) {
78
0
      case 16:
79
0
      {
80
0
        bits += 2*x;
81
0
        WORD *pixel = (WORD *)bits;
82
0
        if((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) {
83
0
          value->rgbBlue    = (BYTE)((((*pixel & FI16_565_BLUE_MASK) >> FI16_565_BLUE_SHIFT) * 0xFF) / 0x1F);
84
0
          value->rgbGreen   = (BYTE)((((*pixel & FI16_565_GREEN_MASK) >> FI16_565_GREEN_SHIFT) * 0xFF) / 0x3F);
85
0
          value->rgbRed   = (BYTE)((((*pixel & FI16_565_RED_MASK) >> FI16_565_RED_SHIFT) * 0xFF) / 0x1F);
86
0
          value->rgbReserved  = 0;
87
0
        } else {
88
0
          value->rgbBlue    = (BYTE)((((*pixel & FI16_555_BLUE_MASK) >> FI16_555_BLUE_SHIFT) * 0xFF) / 0x1F);
89
0
          value->rgbGreen   = (BYTE)((((*pixel & FI16_555_GREEN_MASK) >> FI16_555_GREEN_SHIFT) * 0xFF) / 0x1F);
90
0
          value->rgbRed   = (BYTE)((((*pixel & FI16_555_RED_MASK) >> FI16_555_RED_SHIFT) * 0xFF) / 0x1F);
91
0
          value->rgbReserved  = 0;
92
0
        }
93
0
        break;
94
0
      }
95
0
      case 24:
96
0
        bits += 3*x;
97
0
        value->rgbBlue    = bits[FI_RGBA_BLUE];  // B
98
0
        value->rgbGreen   = bits[FI_RGBA_GREEN];  // G
99
0
        value->rgbRed   = bits[FI_RGBA_RED];  // R
100
0
        value->rgbReserved  = 0;
101
0
        break;
102
0
      case 32:
103
0
        bits += 4*x;
104
0
        value->rgbBlue    = bits[FI_RGBA_BLUE];  // B
105
0
        value->rgbGreen   = bits[FI_RGBA_GREEN];  // G
106
0
        value->rgbRed   = bits[FI_RGBA_RED];  // R
107
0
        value->rgbReserved  = bits[FI_RGBA_ALPHA];  // A
108
0
        break;
109
0
      default:
110
0
        return FALSE;
111
0
    }
112
113
0
    return TRUE;
114
0
  }
115
116
0
  return FALSE;
117
0
}
118
119
BOOL DLL_CALLCONV
120
0
FreeImage_SetPixelIndex(FIBITMAP *dib, unsigned x, unsigned y, BYTE *value) {
121
0
  BYTE shift;
122
123
0
  if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP))
124
0
    return FALSE;
125
126
0
  if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) {
127
0
    BYTE *bits = FreeImage_GetScanLine(dib, y);
128
129
0
    switch(FreeImage_GetBPP(dib)) {
130
0
      case 1:
131
0
        *value ? bits[x >> 3] |= (0x80 >> (x & 0x7)) : bits[x >> 3] &= (0xFF7F >> (x & 0x7));
132
0
        break;
133
0
      case 4:
134
0
        shift = (BYTE)((1 - x % 2) << 2);
135
0
        bits[x >> 1] &= ~(0x0F << shift);
136
0
        bits[x >> 1] |= ((*value & 0x0F) << shift);
137
0
        break;
138
0
      case 8:
139
0
        bits[x] = *value;
140
0
        break;
141
0
      default:
142
0
        return FALSE;
143
0
    }
144
145
0
    return TRUE;
146
0
  }
147
148
0
  return FALSE;
149
0
}
150
151
BOOL DLL_CALLCONV
152
0
FreeImage_SetPixelColor(FIBITMAP *dib, unsigned x, unsigned y, RGBQUAD *value) {
153
0
  if(!FreeImage_HasPixels(dib) || (FreeImage_GetImageType(dib) != FIT_BITMAP))
154
0
    return FALSE;
155
156
0
  if((x < FreeImage_GetWidth(dib)) && (y < FreeImage_GetHeight(dib))) {
157
0
    BYTE *bits = FreeImage_GetScanLine(dib, y);
158
159
0
    switch(FreeImage_GetBPP(dib)) {
160
0
      case 16:
161
0
      {
162
0
        bits += 2*x;
163
0
        WORD *pixel = (WORD *)bits;
164
0
        if((FreeImage_GetRedMask(dib) == FI16_565_RED_MASK) && (FreeImage_GetGreenMask(dib) == FI16_565_GREEN_MASK) && (FreeImage_GetBlueMask(dib) == FI16_565_BLUE_MASK)) {
165
0
          *pixel = ((value->rgbBlue >> 3) << FI16_565_BLUE_SHIFT) |
166
0
            ((value->rgbGreen >> 2) << FI16_565_GREEN_SHIFT) |
167
0
            ((value->rgbRed >> 3) << FI16_565_RED_SHIFT);
168
0
        } else {
169
0
          *pixel = ((value->rgbBlue >> 3) << FI16_555_BLUE_SHIFT) |
170
0
            ((value->rgbGreen >> 3) << FI16_555_GREEN_SHIFT) |
171
0
            ((value->rgbRed >> 3) << FI16_555_RED_SHIFT);
172
0
        }
173
0
        break;
174
0
      }
175
0
      case 24:
176
0
        bits += 3*x;
177
0
        bits[FI_RGBA_BLUE] = value->rgbBlue; // B
178
0
        bits[FI_RGBA_GREEN] = value->rgbGreen;  // G
179
0
        bits[FI_RGBA_RED] = value->rgbRed;  // R
180
0
        break;
181
0
      case 32:
182
0
        bits += 4*x;
183
0
        bits[FI_RGBA_BLUE] = value->rgbBlue;   // B
184
0
        bits[FI_RGBA_GREEN] = value->rgbGreen;    // G
185
0
        bits[FI_RGBA_RED] = value->rgbRed;    // R
186
0
        bits[FI_RGBA_ALPHA] = value->rgbReserved; // A
187
0
        break;
188
0
      default:
189
0
        return FALSE;
190
0
    }
191
192
0
    return TRUE;
193
0
  }
194
195
0
  return FALSE;
196
0
}
197