LMMS
Loading...
Searching...
No Matches
juce_Image.cpp
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 By using JUCE, you agree to the terms of both the JUCE 7 End-User License
11 Agreement and JUCE Privacy Policy.
12
13 End User License Agreement: www.juce.com/juce-7-licence
14 Privacy Policy: www.juce.com/juce-privacy-policy
15
16 Or: You may also use this code under the terms of the GPL v3 (see
17 www.gnu.org/licenses).
18
19 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
20 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
21 DISCLAIMED.
22
23 ==============================================================================
24*/
25
26namespace juce
27{
28
31{
33 jassert (w > 0 && h > 0); // It's illegal to create a zero-sized image!
34}
35
37{
38 listeners.call ([this] (Listener& l) { l.imageDataBeingDeleted (this); });
39}
40
42{
43 listeners.call ([this] (Listener& l) { l.imageDataChanged (this); });
44}
45
50
51//==============================================================================
54
55Image ImageType::convert (const Image& source) const
56{
57 if (source.isNull() || getTypeID() == source.getPixelData()->createType()->getTypeID())
58 return source;
59
61
62 Image newImage (create (src.pixelFormat, src.width, src.height, false));
64
65 if (src.pixelStride == dest.pixelStride && src.pixelFormat == dest.pixelFormat)
66 {
67 for (int y = 0; y < dest.height; ++y)
68 memcpy (dest.getLinePointer (y), src.getLinePointer (y), (size_t) dest.lineStride);
69 }
70 else
71 {
72 for (int y = 0; y < dest.height; ++y)
73 for (int x = 0; x < dest.width; ++x)
74 dest.setPixelColour (x, y, src.getPixelColour (x, y));
75 }
76
77 return newImage;
78}
79
80//==============================================================================
82{
83public:
84 SoftwarePixelData (Image::PixelFormat formatToUse, int w, int h, bool clearImage)
85 : ImagePixelData (formatToUse, w, h),
86 pixelStride (formatToUse == Image::RGB ? 3 : ((formatToUse == Image::ARGB) ? 4 : 1)),
87 lineStride ((pixelStride * jmax (1, w) + 3) & ~3)
88 {
89 imageData.allocate ((size_t) lineStride * (size_t) jmax (1, h), clearImage);
90 }
91
92 std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override
93 {
95 return std::make_unique<LowLevelGraphicsSoftwareRenderer> (Image (*this));
96 }
97
99 {
100 const auto offset = (size_t) x * (size_t) pixelStride + (size_t) y * (size_t) lineStride;
101 bitmap.data = imageData + offset;
102 bitmap.size = (size_t) (height * lineStride) - offset;
103 bitmap.pixelFormat = pixelFormat;
104 bitmap.lineStride = lineStride;
105 bitmap.pixelStride = pixelStride;
106
109 }
110
112 {
113 auto s = new SoftwarePixelData (pixelFormat, width, height, false);
114 memcpy (s->imageData, imageData, (size_t) lineStride * (size_t) height);
115 return *s;
116 }
117
118 std::unique_ptr<ImageType> createType() const override { return std::make_unique<SoftwareImageType>(); }
119
120private:
123
125};
126
129
131{
132 return *new SoftwarePixelData (format, width, height, clearImage);
133}
134
136{
137 return 2;
138}
139
140//==============================================================================
143
145{
146 return 1;
147}
148
149#if JUCE_WINDOWS || JUCE_LINUX || JUCE_BSD
151{
152 return new SoftwarePixelData (format, width, height, clearImage);
153}
154#endif
155
156//==============================================================================
158{
159public:
161 : ImagePixelData (source->pixelFormat, r.getWidth(), r.getHeight()),
162 sourceImage (std::move (source)), area (r)
163 {
164 }
165
166 std::unique_ptr<LowLevelGraphicsContext> createLowLevelContext() override
167 {
168 auto g = sourceImage->createLowLevelContext();
169 g->clipToRectangle (area);
170 g->setOrigin (area.getPosition());
171 return g;
172 }
173
175 {
176 sourceImage->initialiseBitmapData (bitmap, x + area.getX(), y + area.getY(), mode);
177
180 }
181
183 {
184 jassert (getReferenceCount() > 0); // (This method can't be used on an unowned pointer, as it will end up self-deleting)
185 auto type = createType();
186
187 Image newImage (type->create (pixelFormat, area.getWidth(), area.getHeight(), pixelFormat != Image::RGB));
188
189 {
190 Graphics g (newImage);
191 g.drawImageAt (Image (*this), 0, 0);
192 }
193
194 return *newImage.getPixelData();
195 }
196
197 std::unique_ptr<ImageType> createType() const override { return sourceImage->createType(); }
198
199 /* as we always hold a reference to image, don't double count */
200 int getSharedCount() const noexcept override { return getReferenceCount() + sourceImage->getSharedCount() - 1; }
201
202private:
203 friend class Image;
206
208};
209
211{
212 if (area.contains (getBounds()))
213 return *this;
214
215 auto validArea = area.getIntersection (getBounds());
216
217 if (validArea.isEmpty())
218 return {};
219
220 return Image (*new SubsectionPixelData (image, validArea));
221}
222
223
224//==============================================================================
228
230 : image (std::move (instance))
231{
232}
233
234Image::Image (PixelFormat format, int width, int height, bool clearImage)
235 : image (NativeImageType().create (format, width, height, clearImage))
236{
237}
238
239Image::Image (PixelFormat format, int width, int height, bool clearImage, const ImageType& type)
240 : image (type.create (format, width, height, clearImage))
241{
242}
243
245 : image (other.image)
246{
247}
248
249Image& Image::operator= (const Image& other)
250{
251 image = other.image;
252 return *this;
253}
254
256 : image (std::move (other.image))
257{
258}
259
260Image& Image::operator= (Image&& other) noexcept
261{
262 image = std::move (other.image);
263 return *this;
264}
265
267{
268}
269
270int Image::getReferenceCount() const noexcept { return image == nullptr ? 0 : image->getSharedCount(); }
271int Image::getWidth() const noexcept { return image == nullptr ? 0 : image->width; }
272int Image::getHeight() const noexcept { return image == nullptr ? 0 : image->height; }
276bool Image::isRGB() const noexcept { return getFormat() == RGB; }
279
280std::unique_ptr<LowLevelGraphicsContext> Image::createLowLevelContext() const
281{
282 if (image != nullptr)
283 return image->createLowLevelContext();
284
285 return {};
286}
287
289{
290 if (getReferenceCount() > 1)
291 image = image->clone();
292}
293
295{
296 if (image != nullptr)
297 return Image (image->clone());
298
299 return {};
300}
301
302Image Image::rescaled (int newWidth, int newHeight, Graphics::ResamplingQuality quality) const
303{
304 if (image == nullptr || (image->width == newWidth && image->height == newHeight))
305 return *this;
306
307 auto type = image->createType();
308 Image newImage (type->create (image->pixelFormat, newWidth, newHeight, hasAlphaChannel()));
309
310 Graphics g (newImage);
311 g.setImageResamplingQuality (quality);
312 g.drawImageTransformed (*this, AffineTransform::scale ((float) newWidth / (float) image->width,
313 (float) newHeight / (float) image->height), false);
314 return newImage;
315}
316
318{
319 if (image == nullptr || newFormat == image->pixelFormat)
320 return *this;
321
322 auto w = image->width, h = image->height;
323
324 auto type = image->createType();
325 Image newImage (type->create (newFormat, w, h, false));
326
327 if (newFormat == SingleChannel)
328 {
329 if (! hasAlphaChannel())
330 {
331 newImage.clear (getBounds(), Colours::black);
332 }
333 else
334 {
335 const BitmapData destData (newImage, 0, 0, w, h, BitmapData::writeOnly);
336 const BitmapData srcData (*this, 0, 0, w, h);
337
338 for (int y = 0; y < h; ++y)
339 {
340 auto src = reinterpret_cast<const PixelARGB*> (srcData.getLinePointer (y));
341 auto dst = destData.getLinePointer (y);
342
343 for (int x = 0; x < w; ++x)
344 dst[x] = src[x].getAlpha();
345 }
346 }
347 }
348 else if (image->pixelFormat == SingleChannel && newFormat == Image::ARGB)
349 {
350 const BitmapData destData (newImage, 0, 0, w, h, BitmapData::writeOnly);
351 const BitmapData srcData (*this, 0, 0, w, h);
352
353 for (int y = 0; y < h; ++y)
354 {
355 auto src = reinterpret_cast<const PixelAlpha*> (srcData.getLinePointer (y));
356 auto dst = reinterpret_cast<PixelARGB*> (destData.getLinePointer (y));
357
358 for (int x = 0; x < w; ++x)
359 dst[x].set (src[x]);
360 }
361 }
362 else
363 {
364 if (hasAlphaChannel())
365 newImage.clear (getBounds());
366
367 Graphics g (newImage);
368 g.drawImageAt (*this, 0, 0);
369 }
370
371 return newImage;
372}
373
375{
376 return image == nullptr ? nullptr : &(image->userData);
377}
378
379//==============================================================================
381 : width (w), height (h)
382{
383 // The BitmapData class must be given a valid image, and a valid rectangle within it!
384 jassert (im.image != nullptr);
385 jassert (x >= 0 && y >= 0 && w > 0 && h > 0 && x + w <= im.getWidth() && y + h <= im.getHeight());
386
387 im.image->initialiseBitmapData (*this, x, y, mode);
388 jassert (data != nullptr && pixelStride > 0 && lineStride != 0);
389}
390
391Image::BitmapData::BitmapData (const Image& im, int x, int y, int w, int h)
392 : width (w), height (h)
393{
394 // The BitmapData class must be given a valid image, and a valid rectangle within it!
395 jassert (im.image != nullptr);
396 jassert (x >= 0 && y >= 0 && w > 0 && h > 0 && x + w <= im.getWidth() && y + h <= im.getHeight());
397
398 im.image->initialiseBitmapData (*this, x, y, readOnly);
399 jassert (data != nullptr && pixelStride > 0 && lineStride != 0);
400}
401
403 : width (im.getWidth()),
404 height (im.getHeight())
405{
406 // The BitmapData class must be given a valid image!
407 jassert (im.image != nullptr);
408
409 im.image->initialiseBitmapData (*this, 0, 0, mode);
410 jassert (data != nullptr && pixelStride > 0 && lineStride != 0);
411}
412
416
418{
420
421 auto pixel = getPixelPointer (x, y);
422
423 switch (pixelFormat)
424 {
425 case Image::ARGB: return Colour ( ((const PixelARGB*) pixel)->getUnpremultiplied());
426 case Image::RGB: return Colour (*((const PixelRGB*) pixel));
427 case Image::SingleChannel: return Colour (*((const PixelAlpha*) pixel));
429 default: jassertfalse; break;
430 }
431
432 return {};
433}
434
435void Image::BitmapData::setPixelColour (int x, int y, Colour colour) const noexcept
436{
438
439 auto pixel = getPixelPointer (x, y);
440 auto col = colour.getPixelARGB();
441
442 switch (pixelFormat)
443 {
444 case Image::ARGB: ((PixelARGB*) pixel)->set (col); break;
445 case Image::RGB: ((PixelRGB*) pixel)->set (col); break;
446 case Image::SingleChannel: ((PixelAlpha*) pixel)->set (col); break;
448 default: jassertfalse; break;
449 }
450}
451
452//==============================================================================
453void Image::clear (const Rectangle<int>& area, Colour colourToClearTo)
454{
455 if (image != nullptr)
456 {
457 auto g = image->createLowLevelContext();
458 g->setFill (colourToClearTo);
459 g->fillRect (area, true);
460 }
461}
462
463//==============================================================================
464Colour Image::getPixelAt (int x, int y) const
465{
467 {
468 const BitmapData srcData (*this, x, y, 1, 1);
469 return srcData.getPixelColour (0, 0);
470 }
471
472 return {};
473}
474
475void Image::setPixelAt (int x, int y, Colour colour)
476{
478 {
479 const BitmapData destData (*this, x, y, 1, 1, BitmapData::writeOnly);
480 destData.setPixelColour (0, 0, colour);
481 }
482}
483
484void Image::multiplyAlphaAt (int x, int y, float multiplier)
485{
487 && hasAlphaChannel())
488 {
489 const BitmapData destData (*this, x, y, 1, 1, BitmapData::readWrite);
490
491 if (isARGB())
492 reinterpret_cast<PixelARGB*> (destData.data)->multiplyAlpha (multiplier);
493 else
494 *(destData.data) = (uint8) (*(destData.data) * multiplier);
495 }
496}
497
498template <class PixelType>
500{
501 template <class PixelOperation>
502 static void iterate (const Image::BitmapData& data, const PixelOperation& pixelOp)
503 {
504 for (int y = 0; y < data.height; ++y)
505 {
506 auto p = data.getLinePointer (y);
507
508 for (int x = 0; x < data.width; ++x)
509 {
510 pixelOp (*reinterpret_cast<PixelType*> (p));
511 p += data.pixelStride;
512 }
513 }
514 }
515};
516
517template <class PixelOperation>
518static void performPixelOp (const Image::BitmapData& data, const PixelOperation& pixelOp)
519{
520 switch (data.pixelFormat)
521 {
523 case Image::RGB: PixelIterator<PixelRGB> ::iterate (data, pixelOp); break;
526 default: jassertfalse; break;
527 }
528}
529
531{
532 float alpha;
533
534 template <class PixelType>
535 void operator() (PixelType& pixel) const
536 {
537 pixel.multiplyAlpha (alpha);
538 }
539};
540
541void Image::multiplyAllAlphas (float amountToMultiplyBy)
542{
544
545 const BitmapData destData (*this, 0, 0, getWidth(), getHeight(), BitmapData::readWrite);
546 performPixelOp (destData, AlphaMultiplyOp { amountToMultiplyBy });
547}
548
550{
551 template <class PixelType>
552 void operator() (PixelType& pixel) const
553 {
554 pixel.desaturate();
555 }
556};
557
559{
560 if (isARGB() || isRGB())
561 {
562 const BitmapData destData (*this, 0, 0, getWidth(), getHeight(), BitmapData::readWrite);
563 performPixelOp (destData, DesaturateOp());
564 }
565}
566
567void Image::createSolidAreaMask (RectangleList<int>& result, float alphaThreshold) const
568{
569 if (hasAlphaChannel())
570 {
571 auto threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));
572 SparseSet<int> pixelsOnRow;
573
574 const BitmapData srcData (*this, 0, 0, getWidth(), getHeight());
575
576 for (int y = 0; y < srcData.height; ++y)
577 {
578 pixelsOnRow.clear();
579 auto lineData = srcData.getLinePointer (y);
580
581 if (isARGB())
582 {
583 for (int x = 0; x < srcData.width; ++x)
584 {
585 if (reinterpret_cast<const PixelARGB*> (lineData)->getAlpha() >= threshold)
586 pixelsOnRow.addRange (Range<int> (x, x + 1));
587
588 lineData += srcData.pixelStride;
589 }
590 }
591 else
592 {
593 for (int x = 0; x < srcData.width; ++x)
594 {
595 if (*lineData >= threshold)
596 pixelsOnRow.addRange (Range<int> (x, x + 1));
597
598 lineData += srcData.pixelStride;
599 }
600 }
601
602 for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i)
603 {
604 auto range = pixelsOnRow.getRange (i);
605 result.add (Rectangle<int> (range.getStart(), y, range.getLength(), 1));
606 }
607
608 result.consolidate();
609 }
610 }
611 else
612 {
613 result.add (0, 0, getWidth(), getHeight());
614 }
615}
616
617void Image::moveImageSection (int dx, int dy,
618 int sx, int sy,
619 int w, int h)
620{
621 if (dx < 0)
622 {
623 w += dx;
624 sx -= dx;
625 dx = 0;
626 }
627
628 if (dy < 0)
629 {
630 h += dy;
631 sy -= dy;
632 dy = 0;
633 }
634
635 if (sx < 0)
636 {
637 w += sx;
638 dx -= sx;
639 sx = 0;
640 }
641
642 if (sy < 0)
643 {
644 h += sy;
645 dy -= sy;
646 sy = 0;
647 }
648
649 const int minX = jmin (dx, sx);
650 const int minY = jmin (dy, sy);
651
652 w = jmin (w, getWidth() - jmax (sx, dx));
653 h = jmin (h, getHeight() - jmax (sy, dy));
654
655 if (w > 0 && h > 0)
656 {
657 auto maxX = jmax (dx, sx) + w;
658 auto maxY = jmax (dy, sy) + h;
659
660 const BitmapData destData (*this, minX, minY, maxX - minX, maxY - minY, BitmapData::readWrite);
661
662 auto dst = destData.getPixelPointer (dx - minX, dy - minY);
663 auto src = destData.getPixelPointer (sx - minX, sy - minY);
664
665 auto lineSize = (size_t) destData.pixelStride * (size_t) w;
666
667 if (dy > sy)
668 {
669 while (--h >= 0)
670 {
671 const int offset = h * destData.lineStride;
672 memmove (dst + offset, src + offset, lineSize);
673 }
674 }
675 else if (dst != src)
676 {
677 while (--h >= 0)
678 {
679 memmove (dst, src, lineSize);
680 dst += destData.lineStride;
681 src += destData.lineStride;
682 }
683 }
684 }
685}
686
687//==============================================================================
688#if JUCE_ALLOW_STATIC_NULL_VARIABLES
689
690JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations")
692
693const Image Image::null;
694
697
698#endif
699
700} // namespace juce
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
#define nullptr
Definition DistrhoDefines.h:75
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static AffineTransform scale(float factorX, float factorY) noexcept
Definition juce_AffineTransform.cpp:141
Definition juce_Colour.h:38
Definition juce_GraphicsContext.h:45
ResamplingQuality
Definition juce_GraphicsContext.h:462
Definition juce_HeapBlock.h:87
Definition juce_Image.h:310
int pixelStride
Definition juce_Image.h:355
int height
Definition juce_Image.h:356
ReadWriteMode
Definition juce_Image.h:313
@ writeOnly
Definition juce_Image.h:315
@ readOnly
Definition juce_Image.h:314
@ readWrite
Definition juce_Image.h:316
uint8 * getPixelPointer(int x, int y) const noexcept
Definition juce_Image.h:334
int lineStride
Definition juce_Image.h:354
uint8 * getLinePointer(int y) const noexcept
Definition juce_Image.h:328
void setPixelColour(int x, int y, Colour colour) const noexcept
Definition juce_Image.cpp:435
Colour getPixelColour(int x, int y) const noexcept
Definition juce_Image.cpp:417
BitmapData(Image &image, int x, int y, int w, int h, ReadWriteMode mode)
Definition juce_Image.cpp:380
int width
Definition juce_Image.h:356
PixelFormat pixelFormat
Definition juce_Image.h:353
~BitmapData()
Definition juce_Image.cpp:413
uint8 * data
Definition juce_Image.h:351
size_t size
Definition juce_Image.h:352
Definition juce_Image.h:58
int getWidth() const noexcept
Definition juce_Image.cpp:271
bool isRGB() const noexcept
Definition juce_Image.cpp:276
std::unique_ptr< LowLevelGraphicsContext > createLowLevelContext() const
Definition juce_Image.cpp:280
Image() noexcept
Definition juce_Image.cpp:225
void clear(const Rectangle< int > &area, Colour colourToClearTo=Colour(0x00000000))
Definition juce_Image.cpp:453
bool isARGB() const noexcept
Definition juce_Image.cpp:275
void desaturate()
Definition juce_Image.cpp:558
bool hasAlphaChannel() const noexcept
Definition juce_Image.cpp:278
~Image()
Definition juce_Image.cpp:266
Colour getPixelAt(int x, int y) const
Definition juce_Image.cpp:464
PixelFormat getFormat() const noexcept
Definition juce_Image.cpp:274
void moveImageSection(int destX, int destY, int sourceX, int sourceY, int width, int height)
Definition juce_Image.cpp:617
Image getClippedImage(const Rectangle< int > &area) const
Definition juce_Image.cpp:210
void multiplyAllAlphas(float amountToMultiplyBy)
Definition juce_Image.cpp:541
ReferenceCountedObjectPtr< ImagePixelData > image
Definition juce_Image.h:426
int getHeight() const noexcept
Definition juce_Image.cpp:272
Rectangle< int > getBounds() const noexcept
Definition juce_Image.cpp:273
void multiplyAlphaAt(int x, int y, float multiplier)
Definition juce_Image.cpp:484
void setPixelAt(int x, int y, Colour colour)
Definition juce_Image.cpp:475
void createSolidAreaMask(RectangleList< int > &result, float alphaThreshold) const
Definition juce_Image.cpp:567
Image convertedToFormat(PixelFormat newFormat) const
Definition juce_Image.cpp:317
ImagePixelData * getPixelData() const noexcept
Definition juce_Image.h:412
bool isSingleChannel() const noexcept
Definition juce_Image.cpp:277
bool isNull() const noexcept
Definition juce_Image.h:155
Image rescaled(int newWidth, int newHeight, Graphics::ResamplingQuality quality=Graphics::mediumResamplingQuality) const
Definition juce_Image.cpp:302
void duplicateIfShared()
Definition juce_Image.cpp:288
Image createCopy() const
Definition juce_Image.cpp:294
NamedValueSet * getProperties() const
Definition juce_Image.cpp:374
PixelFormat
Definition juce_Image.h:64
@ SingleChannel
Definition juce_Image.h:68
@ UnknownFormat
Definition juce_Image.h:65
@ ARGB
Definition juce_Image.h:67
@ RGB
Definition juce_Image.h:66
int getReferenceCount() const noexcept
Definition juce_Image.cpp:270
ListenerList< Listener > listeners
Definition juce_Image.h:486
~ImagePixelData() override
Definition juce_Image.cpp:36
const int width
Definition juce_Image.h:469
virtual void initialiseBitmapData(Image::BitmapData &, int x, int y, Image::BitmapData::ReadWriteMode)=0
ImagePixelData(Image::PixelFormat, int width, int height)
Definition juce_Image.cpp:29
virtual std::unique_ptr< ImageType > createType() const =0
void sendDataChangeMessage()
Definition juce_Image.cpp:41
ReferenceCountedObjectPtr< ImagePixelData > Ptr
Definition juce_Image.h:451
virtual int getSharedCount() const noexcept
Definition juce_Image.cpp:46
const int height
Definition juce_Image.h:469
const Image::PixelFormat pixelFormat
Definition juce_Image.h:468
Definition juce_Image.h:504
virtual ~ImageType()
Definition juce_Image.cpp:53
virtual ImagePixelData::Ptr create(Image::PixelFormat, int width, int height, bool shouldClearImage) const =0
ImageType()
Definition juce_Image.cpp:52
virtual Image convert(const Image &source) const
Definition juce_Image.cpp:55
virtual int getTypeID() const =0
Definition juce_NamedValueSet.h:35
Definition juce_Image.h:548
ImagePixelData::Ptr create(Image::PixelFormat, int width, int height, bool clearImage) const override
NativeImageType()
Definition juce_Image.cpp:141
~NativeImageType() override
Definition juce_Image.cpp:142
int getTypeID() const override
Definition juce_Image.cpp:144
Definition juce_PixelFormats.h:59
Definition juce_PixelFormats.h:600
Definition juce_PixelFormats.h:354
Definition juce_Range.h:40
Definition juce_Rectangle.h:67
bool contains(ValueType xCoord, ValueType yCoord) const noexcept
Definition juce_Rectangle.h:622
Rectangle getIntersection(Rectangle other) const noexcept
Definition juce_Rectangle.h:664
Definition juce_RectangleList.h:43
int getReferenceCount() const noexcept
Definition juce_ReferenceCountedObject.h:101
Definition juce_ReferenceCountedObject.h:247
ImagePixelData::Ptr create(Image::PixelFormat, int width, int height, bool clearImage) const override
Definition juce_Image.cpp:130
~SoftwareImageType() override
Definition juce_Image.cpp:128
int getTypeID() const override
Definition juce_Image.cpp:135
SoftwareImageType()
Definition juce_Image.cpp:127
Definition juce_Image.cpp:82
const int pixelStride
Definition juce_Image.cpp:122
HeapBlock< uint8 > imageData
Definition juce_Image.cpp:121
SoftwarePixelData(Image::PixelFormat formatToUse, int w, int h, bool clearImage)
Definition juce_Image.cpp:84
std::unique_ptr< ImageType > createType() const override
Definition juce_Image.cpp:118
std::unique_ptr< LowLevelGraphicsContext > createLowLevelContext() override
Definition juce_Image.cpp:92
void initialiseBitmapData(Image::BitmapData &bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override
Definition juce_Image.cpp:98
ImagePixelData::Ptr clone() override
Definition juce_Image.cpp:111
const int lineStride
Definition juce_Image.cpp:122
Definition juce_SparseSet.h:41
Range< Type > getRange(int rangeIndex) const noexcept
Definition juce_SparseSet.h:125
void clear()
Definition juce_SparseSet.h:54
void addRange(Range< Type > range)
Definition juce_SparseSet.h:143
int getNumRanges() const noexcept
Definition juce_SparseSet.h:118
Definition juce_Image.cpp:158
void initialiseBitmapData(Image::BitmapData &bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override
Definition juce_Image.cpp:174
const Rectangle< int > area
Definition juce_Image.cpp:205
std::unique_ptr< ImageType > createType() const override
Definition juce_Image.cpp:197
friend class Image
Definition juce_Image.cpp:203
int getSharedCount() const noexcept override
Definition juce_Image.cpp:200
const ImagePixelData::Ptr sourceImage
Definition juce_Image.cpp:204
std::unique_ptr< LowLevelGraphicsContext > createLowLevelContext() override
Definition juce_Image.cpp:166
SubsectionPixelData(ImagePixelData::Ptr source, Rectangle< int > r)
Definition juce_Image.cpp:160
ImagePixelData::Ptr clone() override
Definition juce_Image.cpp:182
UINT_D64 w
Definition inflate.c:942
int * l
Definition inflate.c:1579
int y
Definition inflate.c:1588
int g
Definition inflate.c:1573
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
unsigned x[BMAX+1]
Definition inflate.c:1586
static int int minY
Definition pugl.h:1627
static int minX
Definition pugl.h:1626
static int int height
Definition pugl.h:1594
static int int int int maxY
Definition pugl.h:1630
static int width
Definition pugl.h:1593
static int int int maxX
Definition pugl.h:1628
JSAMPIMAGE data
Definition jpeglib.h:945
int quality
Definition jpeglib.h:919
#define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
Definition juce_CompilerWarnings.h:181
#define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
Definition juce_CompilerWarnings.h:182
#define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
Definition juce_CompilerWarnings.h:198
#define JUCE_END_IGNORE_WARNINGS_MSVC
Definition juce_CompilerWarnings.h:199
#define JUCE_LEAK_DETECTOR(OwnerClass)
Definition juce_LeakedObjectDetector.h:138
#define jassert(expression)
#define JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(className)
#define jassertfalse
const Colour black
Definition juce_Colours.h:50
Definition carla_juce.cpp:31
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
Type jlimit(Type lowerLimit, Type upperLimit, Type valueToConstrain) noexcept
Definition juce_MathsFunctions.h:262
static void performPixelOp(const Image::BitmapData &data, const PixelOperation &pixelOp)
Definition juce_Image.cpp:518
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
unsigned char uint8
Definition juce_MathsFunctions.h:37
int roundToInt(const FloatType value) noexcept
Definition juce_MathsFunctions.h:465
Definition juce_Uuid.h:141
png_structrp int mode
Definition png.h:1139
Definition juce_Image.cpp:531
float alpha
Definition juce_Image.cpp:532
Definition juce_Image.cpp:550
Definition juce_Image.h:479
Definition juce_Image.cpp:500
static void iterate(const Image::BitmapData &data, const PixelOperation &pixelOp)
Definition juce_Image.cpp:502
#define RGB(r, g, b)
uch * p
Definition crypt.c:594
memcpy(hh, h, RAND_HEAD_LEN)
int r
Definition crypt.c:458
uch h[RAND_HEAD_LEN]
Definition crypt.c:459
int result
Definition process.c:1455
dy
Definition zipinfo.c:2288
_WDL_CSTRING_PREFIX void INT_PTR const char * format
Definition wdlcstring.h:263
#define const
Definition zconf.h:137