1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
silica-viewer/Dependencies/PSDWriter/Shared/PSDWriter.h
Joshua Goins ee81008930 Add experimental PSD exporting
Not everything is working yet, this requires
more PSDWriter modifications.
2022-02-28 12:04:08 -04:00

101 lines
4.1 KiB
Objective-C
Executable file

//
// PSDWriter.h
// PSDWriter
//
// Created by Ben Gotow on 5/23/09.
// Copyright 2009 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#endif
@interface PSDWriter : NSObject
{
CGSize documentSize;
NSMutableArray * layers;
int layerChannelCount;
NSData * flattenedData;
CGContextRef flattenedContext;
BOOL shouldFlipLayerData;
BOOL shouldUnpremultiplyLayerData;
}
/** The PSDLayer objects with layer data, names, etc... Note that when you call
createPSDData, this array is slowly emptied - the PSDWriter removes the individual layers
from memory as it builds the PSD file. */
@property (nonatomic, retain) NSMutableArray *layers;
/** The size of the PSD you're exporting. */
@property (nonatomic, assign) CGSize documentSize;
/** The number of channels in each layer. Defaults to 4, unless layers
are not transparent. At the moment, this setting applies to all layers.*/
@property (nonatomic, assign) int layerChannelCount;
/** Optional. The RGBA data for a flattened "preview" of the PSD. */
@property (nonatomic, retain) NSData * flattenedData;
/** Allows you to automatically vertically flip the image data when it's being
written to PSD. This is important if the source images are coming from OpenGL or
another drawing system with an inverted coordinate system.*/
@property (nonatomic, assign) BOOL shouldFlipLayerData;
/** Allows you to automatically unpremultiply the image data. Premultiplication is
a process by which the R,G, and B values are multiplied by the alpha. Setting this
to YES will cause RGB to be divided by A. You'll know you need to do this if the
image comes out darker than you expect. */
@property (nonatomic, assign) BOOL shouldUnpremultiplyLayerData;
/** Initializes a new PSDWriter for creating a PSD document with the specified size.
@param s The document size*/
- (id)initWithDocumentSize:(CGSize)s;
/** Adds a new layer to the PSD image with the provided properties.
If you are using NSImages and not CGImages, use the following code to convert to CGImageRefs:
NSImage* yourImage;
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)[yourImage TIFFRepresentation], NULL);
CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0, NULL);
If you prefer, you can setup PSDLayers by yourself
and put them in the PSDWriter.layers array, but this method automatically creates the flattenedData,
an image that is a flattened preview of the layered PSD. If you populate the layer objects yourself,
you need to provide the flattened image data yourself.
Note: Having layers partially off the edge of the canvas is not currently supported.
@param image The image to be added. Does not need to be the same size as the document, but it cannot be larger.
@param name The name you'd like to give the layer.
@param opacity The opacity of the layer, from [0-1]
@param offset The offset of the layer within the document. Use this to position layers within the PSD.
*/
- (void)addLayerWithCGImage:(CGImageRef)image andName:(NSString*)name andOpacity:(float)opacity andOffset:(CGPoint)offset;
- (void)addLayerWithCGImage:(CGImageRef)image
andName:(NSString*)name
andOpacity:(float)opacity
andOffset:(CGPoint)offset
andBlendMode: (NSInteger) blendMode
andIsNonBaseLayer:(bool)isNonBase;
/* Generates an NSData object representing a PSD image with the width and height specified by documentSize
and the contents specified by the layers array. Note that this function can be (and really should be)
called on a separate thread.
@return PSD data. Write this data to a file or attach it to an email, etc...
Note: You cannot call this function multiple times. After calling createPSDData and getting the document data,
you should discard the PSDWriter object. This function is destructive and deletes the information you provided
in the layers array to conserve memory as it writes the PSD data.
*/
- (NSData *)createPSDData;
@end
/** A convenience function for getting RGBA NSData from a CGImageRef. */
NSData *CGImageGetData(CGImageRef image, CGRect region);