mirror of
https://github.com/darlinghq/darling-cocotron.git
synced 2024-11-23 20:19:40 +00:00
- SWRender, private AA quality gstate ivar, fill/blend optimizations, bugfix in surface resize
This commit is contained in:
parent
f057bee1b4
commit
9d8e020688
@ -221,6 +221,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
|
|
||||||
-(void)resetClip;
|
-(void)resetClip;
|
||||||
|
|
||||||
|
-(void)setAntialiasingQuality:(int)value;
|
||||||
-(void)setWordSpacing:(float)spacing;
|
-(void)setWordSpacing:(float)spacing;
|
||||||
-(void)setTextLeading:(float)leading;
|
-(void)setTextLeading:(float)leading;
|
||||||
|
|
||||||
|
@ -908,6 +908,10 @@ static inline KGGraphicsState *currentState(KGContext *self){
|
|||||||
[self deviceClipReset];
|
[self deviceClipReset];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void)setAntialiasingQuality:(int)value {
|
||||||
|
[currentState(self) setAntialiasingQuality:value];
|
||||||
|
}
|
||||||
|
|
||||||
-(void)setWordSpacing:(float)spacing {
|
-(void)setWordSpacing:(float)spacing {
|
||||||
[currentState(self) setWordSpacing:spacing];
|
[currentState(self) setWordSpacing:spacing];
|
||||||
}
|
}
|
||||||
|
@ -62,9 +62,6 @@ typedef void (*KGBlendSpan_RGBAffff)(KGRGBAffff *src,KGRGBAffff *dst,int length)
|
|||||||
|
|
||||||
@class KGSurface,KGContext_builtin;
|
@class KGSurface,KGContext_builtin;
|
||||||
|
|
||||||
typedef void (*KGWriteCoverageSpans)(KGContext_builtin *self,int *x, int *y,int *coverage,int *lengths,int count);
|
|
||||||
|
|
||||||
|
|
||||||
#define KGRasterizer KGContext_builtin
|
#define KGRasterizer KGContext_builtin
|
||||||
|
|
||||||
@interface KGContext_builtin : KGBitmapContext {
|
@interface KGContext_builtin : KGBitmapContext {
|
||||||
@ -73,7 +70,7 @@ typedef void (*KGWriteCoverageSpans)(KGContext_builtin *self,int *x, int *y,int
|
|||||||
KGPaint *m_paint;
|
KGPaint *m_paint;
|
||||||
|
|
||||||
BOOL _useRGBA8888;
|
BOOL _useRGBA8888;
|
||||||
|
CGBlendMode _blendMode;
|
||||||
KGBlendSpan_RGBA8888 _blend_lRGBA8888_PRE;
|
KGBlendSpan_RGBA8888 _blend_lRGBA8888_PRE;
|
||||||
KGBlendSpan_RGBAffff _blend_lRGBAffff_PRE;
|
KGBlendSpan_RGBAffff _blend_lRGBAffff_PRE;
|
||||||
|
|
||||||
@ -81,11 +78,12 @@ typedef void (*KGWriteCoverageSpans)(KGContext_builtin *self,int *x, int *y,int
|
|||||||
|
|
||||||
int _edgeCount;
|
int _edgeCount;
|
||||||
int _edgeCapacity;
|
int _edgeCapacity;
|
||||||
Edge *_edgePool;
|
|
||||||
Edge **_edges;
|
Edge **_edges;
|
||||||
|
Edge **_sortCache;
|
||||||
|
|
||||||
int *_winding;
|
int *_winding;
|
||||||
int *_increase;
|
int *_increase;
|
||||||
|
int *_xIndexSet;
|
||||||
|
|
||||||
int sampleSizeShift;
|
int sampleSizeShift;
|
||||||
int numSamples;
|
int numSamples;
|
||||||
@ -101,14 +99,11 @@ void KGRasterizerDealloc(KGRasterizer *self);
|
|||||||
void KGRasterizerSetViewport(KGRasterizer *self,int vpwidth,int vpheight);
|
void KGRasterizerSetViewport(KGRasterizer *self,int vpwidth,int vpheight);
|
||||||
void KGRasterizerClear(KGRasterizer *self);
|
void KGRasterizerClear(KGRasterizer *self);
|
||||||
void KGRasterizerAddEdge(KGRasterizer *self,const CGPoint v0, const CGPoint v1);
|
void KGRasterizerAddEdge(KGRasterizer *self,const CGPoint v0, const CGPoint v1);
|
||||||
void KGRasterizerSetShouldAntialias(KGRasterizer *self,BOOL antialias);
|
void KGRasterizerSetShouldAntialias(KGRasterizer *self,BOOL antialias,int quality);
|
||||||
void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRule);
|
void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRule);
|
||||||
|
|
||||||
void KGRasterizeSetBlendMode(KGRasterizer *self,CGBlendMode blendMode);
|
void KGRasterizeSetBlendMode(KGRasterizer *self,CGBlendMode blendMode);
|
||||||
void KGRasterizeSetMask(KGRasterizer *self,KGSurface* mask);
|
void KGRasterizeSetMask(KGRasterizer *self,KGSurface* mask);
|
||||||
void KGRasterizeSetPaint(KGRasterizer *self,KGPaint* paint);
|
void KGRasterizeSetPaint(KGRasterizer *self,KGPaint* paint);
|
||||||
//private
|
|
||||||
|
|
||||||
void KGRasterizeWriteCoverageSpan(KGRasterizer *self,int x, int y,int coverage,int lengths);
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -32,9 +32,7 @@
|
|||||||
#import "KGPaint_color.h"
|
#import "KGPaint_color.h"
|
||||||
#import "KGBlending.h"
|
#import "KGBlending.h"
|
||||||
|
|
||||||
#define SAMPLING_RADIUS 0.5
|
#define MAX_SAMPLES COVERAGE_MULTIPLIER
|
||||||
#define MAX_SAMPLES 128
|
|
||||||
#define RI_MAX_EDGES 262144
|
|
||||||
|
|
||||||
@implementation KGContext_builtin
|
@implementation KGContext_builtin
|
||||||
|
|
||||||
@ -93,7 +91,8 @@ BOOL _isAvailable=NO;
|
|||||||
}
|
}
|
||||||
|
|
||||||
-(void)setWidth:(size_t)width height:(size_t)height reallocateOnlyIfRequired:(BOOL)roir {
|
-(void)setWidth:(size_t)width height:(size_t)height reallocateOnlyIfRequired:(BOOL)roir {
|
||||||
|
_width=width;
|
||||||
|
_height=height;
|
||||||
[m_renderingSurface setWidth:width height:height reallocateOnlyIfRequired:roir];
|
[m_renderingSurface setWidth:width height:height reallocateOnlyIfRequired:roir];
|
||||||
KGRasterizerSetViewport(self,KGImageGetWidth(m_renderingSurface),KGImageGetHeight(m_renderingSurface));
|
KGRasterizerSetViewport(self,KGImageGetWidth(m_renderingSurface),KGImageGetHeight(m_renderingSurface));
|
||||||
}
|
}
|
||||||
@ -181,7 +180,7 @@ static KGPaint *paintFromColor(KGColor *color){
|
|||||||
// KGRasterizeSetTileFillColor(context->m_tileFillColor);
|
// KGRasterizeSetTileFillColor(context->m_tileFillColor);
|
||||||
|
|
||||||
|
|
||||||
KGRasterizerSetShouldAntialias(self,gState->_shouldAntialias);
|
KGRasterizerSetShouldAntialias(self,gState->_shouldAntialias,gState->_antialiasingQuality);
|
||||||
|
|
||||||
//CGAffineTransform xform=CGAffineTransformIdentity;//gState->_userSpaceTransform;
|
//CGAffineTransform xform=CGAffineTransformIdentity;//gState->_userSpaceTransform;
|
||||||
CGAffineTransform xform=gState->_userSpaceTransform;
|
CGAffineTransform xform=gState->_userSpaceTransform;
|
||||||
@ -274,7 +273,7 @@ xform=CGAffineTransformConcat(xform,u2d);
|
|||||||
p3 = CGAffineTransformTransformVector2(imageUserToSurface , p3);
|
p3 = CGAffineTransformTransformVector2(imageUserToSurface , p3);
|
||||||
|
|
||||||
|
|
||||||
KGRasterizerSetShouldAntialias(self,gState->_shouldAntialias);
|
KGRasterizerSetShouldAntialias(self,gState->_shouldAntialias,gState->_antialiasingQuality);
|
||||||
|
|
||||||
// KGRasterizeSetTileFillColor(context->m_tileFillColor);
|
// KGRasterizeSetTileFillColor(context->m_tileFillColor);
|
||||||
KGPaint *paint=paintFromColor(gState->_fillColor);
|
KGPaint *paint=paintFromColor(gState->_fillColor);
|
||||||
@ -345,8 +344,9 @@ KGRasterizer *KGRasterizerInit(KGRasterizer *self,KGSurface *renderingSurface) {
|
|||||||
|
|
||||||
self->_edgeCount=0;
|
self->_edgeCount=0;
|
||||||
self->_edgeCapacity=256;
|
self->_edgeCapacity=256;
|
||||||
self->_edgePool=NSZoneMalloc(NULL,self->_edgeCapacity*sizeof(Edge));
|
self->_edges=NSZoneMalloc(NULL,self->_edgeCapacity*sizeof(Edge *));
|
||||||
|
self->_sortCache=NSZoneMalloc(NULL,(self->_edgeCapacity/2 + 1)*sizeof(Edge *));
|
||||||
|
|
||||||
self->samplesX=NSZoneMalloc(NULL,MAX_SAMPLES*sizeof(CGFloat));
|
self->samplesX=NSZoneMalloc(NULL,MAX_SAMPLES*sizeof(CGFloat));
|
||||||
self->samplesY=NSZoneMalloc(NULL,MAX_SAMPLES*sizeof(CGFloat));
|
self->samplesY=NSZoneMalloc(NULL,MAX_SAMPLES*sizeof(CGFloat));
|
||||||
|
|
||||||
@ -354,7 +354,12 @@ KGRasterizer *KGRasterizerInit(KGRasterizer *self,KGSurface *renderingSurface) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void KGRasterizerDealloc(KGRasterizer *self) {
|
void KGRasterizerDealloc(KGRasterizer *self) {
|
||||||
NSZoneFree(NULL,self->_edgePool);
|
int i;
|
||||||
|
for(i=0;i<self->_edgeCount;i++)
|
||||||
|
NSZoneFree(NULL,self->_edges[i]);
|
||||||
|
|
||||||
|
NSZoneFree(NULL,self->_edges);
|
||||||
|
NSZoneFree(NULL,self->_sortCache);
|
||||||
NSZoneFree(NULL,self);
|
NSZoneFree(NULL,self);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -366,51 +371,58 @@ void KGRasterizerSetViewport(KGRasterizer *self,int vpwidth,int vpheight) {
|
|||||||
self->_winding=malloc((vpwidth*MAX_SAMPLES)*sizeof(int));
|
self->_winding=malloc((vpwidth*MAX_SAMPLES)*sizeof(int));
|
||||||
free(self->_increase);
|
free(self->_increase);
|
||||||
self->_increase=malloc(vpwidth*sizeof(int));
|
self->_increase=malloc(vpwidth*sizeof(int));
|
||||||
|
free(self->_xIndexSet);
|
||||||
|
self->_xIndexSet=malloc(vpwidth*sizeof(int));
|
||||||
|
int i;
|
||||||
|
for(i=0;i<vpwidth;i++)
|
||||||
|
self->_xIndexSet[i]=-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGRasterizerClear(KGRasterizer *self) {
|
void KGRasterizerClear(KGRasterizer *self) {
|
||||||
|
int i;
|
||||||
|
for(i=0;i<self->_edgeCount;i++)
|
||||||
|
NSZoneFree(NULL,self->_edges[i]);
|
||||||
|
|
||||||
self->_edgeCount=0;
|
self->_edgeCount=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGRasterizerAddEdge(KGRasterizer *self,const CGPoint v0, const CGPoint v1) {
|
void KGRasterizerAddEdge(KGRasterizer *self,const CGPoint v0, const CGPoint v1) {
|
||||||
|
|
||||||
if(v0.y == v1.y)
|
if(v0.y == v1.y)
|
||||||
return; //skip horizontal edges (they don't affect rasterization since we scan horizontally)
|
return; //skip horizontal edges (they don't affect rasterization since we scan horizontally)
|
||||||
|
|
||||||
if(v0.y<self->_vpy && v1.y<self->_vpy)
|
if((v0.y+0.5f)<self->_vpy && (v1.y+0.5f)<self->_vpy) // ignore below miny
|
||||||
return;
|
return;
|
||||||
|
|
||||||
int MaxY=self->_vpy+self->_vpheight;
|
int MaxY=self->_vpy+self->_vpheight;
|
||||||
|
|
||||||
if(v0.y>=MaxY && v1.y>=MaxY)
|
if((v0.y-0.5f)>=MaxY && (v1.y-0.5f)>=MaxY) // ignore above maxy
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if( self->_edgeCount >= RI_MAX_EDGES )
|
Edge *edge=NSZoneMalloc(NULL,sizeof(Edge));
|
||||||
NSLog(@"too many edges");
|
|
||||||
|
|
||||||
Edge *edge;
|
|
||||||
if(self->_edgeCount+1>=self->_edgeCapacity){
|
if(self->_edgeCount+1>=self->_edgeCapacity){
|
||||||
self->_edgeCapacity*=2;
|
self->_edgeCapacity*=2;
|
||||||
self->_edgePool=NSZoneRealloc(NULL,self->_edgePool,self->_edgeCapacity*sizeof(Edge));
|
self->_edges=NSZoneRealloc(NULL,self->_edges,self->_edgeCapacity*sizeof(Edge *));
|
||||||
|
self->_sortCache=NSZoneRealloc(NULL,self->_sortCache,(self->_edgeCapacity/2 + 1)*sizeof(Edge *));
|
||||||
}
|
}
|
||||||
edge=self->_edgePool+self->_edgeCount;
|
self->_edges[self->_edgeCount]=edge;
|
||||||
self->_edgeCount++;
|
self->_edgeCount++;
|
||||||
|
|
||||||
if(v0.y < v1.y)
|
if(v0.y < v1.y){ //edge is going upward
|
||||||
{ //edge is going upward
|
|
||||||
edge->v0 = v0;
|
edge->v0 = v0;
|
||||||
edge->v1 = v1;
|
edge->v1 = v1;
|
||||||
edge->direction = 1;
|
edge->direction = 1;
|
||||||
}
|
}
|
||||||
else
|
else { //edge is going downward
|
||||||
{ //edge is going downward
|
|
||||||
edge->v0 = v1;
|
edge->v0 = v1;
|
||||||
edge->v1 = v0;
|
edge->v1 = v0;
|
||||||
edge->direction = -1;
|
edge->direction = -1;
|
||||||
}
|
}
|
||||||
edge->normal=CGPointMake(edge->v0.y - edge->v1.y, edge->v1.x - edge->v0.x); //edge normal
|
edge->normal=CGPointMake(edge->v0.y-edge->v1.y , edge->v1.x - edge->v0.x); //edge normal
|
||||||
edge->cnst = Vector2Dot(edge->v0, edge->normal); //distance of v0 from the origin along the edge normal
|
edge->cnst = Vector2Dot(edge->v0, edge->normal); //distance of v0 from the origin along the edge normal
|
||||||
edge->minscany=RI_FLOOR_TO_INT(edge->v0.y-SAMPLING_RADIUS);
|
edge->normal.y=-edge->normal.y;
|
||||||
edge->maxscany=ceil(edge->v1.y+SAMPLING_RADIUS);
|
edge->minscany=RI_FLOOR_TO_INT(edge->v0.y-0.5f);
|
||||||
|
edge->maxscany=ceil(edge->v1.y+0.5f);
|
||||||
edge->next=NULL;
|
edge->next=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -420,7 +432,7 @@ static double radicalInverseBase2(unsigned int i)
|
|||||||
if( i == 0 )
|
if( i == 0 )
|
||||||
return 0.0;
|
return 0.0;
|
||||||
double p = 0.0;
|
double p = 0.0;
|
||||||
double f = 0.5;
|
double f = 0.5f;
|
||||||
double ff = f;
|
double ff = f;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
for(j=0;j<32;j++)
|
for(j=0;j<32;j++)
|
||||||
@ -432,34 +444,44 @@ static double radicalInverseBase2(unsigned int i)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGRasterizerSetShouldAntialias(KGRasterizer *self,BOOL antialias) {
|
void KGRasterizerSetShouldAntialias(KGRasterizer *self,BOOL antialias,int quality) {
|
||||||
|
/* RULES:
|
||||||
|
- samplesY must be in ascending order
|
||||||
|
*/
|
||||||
|
|
||||||
//make a sampling pattern
|
//make a sampling pattern
|
||||||
|
|
||||||
if(!antialias){
|
quality=RI_INT_CLAMP(quality,1,MAX_SAMPLES);
|
||||||
|
|
||||||
|
if(!antialias || quality==1){
|
||||||
self->numSamples=1;
|
self->numSamples=1;
|
||||||
self->samplesX[0] = 0;
|
self->samplesX[0] = 0;
|
||||||
self->samplesY[0] = 0;
|
self->samplesY[0] = 0.5f;
|
||||||
self->samplesWeight = 256;
|
self->samplesWeight = MAX_SAMPLES;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
int shift;
|
||||||
|
int numberOfSamples=1;
|
||||||
|
|
||||||
|
for(shift=0;numberOfSamples<quality;shift++)
|
||||||
|
numberOfSamples<<=1;
|
||||||
/*
|
/*
|
||||||
At this point I am pretty convinced Apple is using a box shaped filter
|
At this point I am pretty convinced Apple is using a box filter
|
||||||
The sampling pattern is different than this
|
The sampling pattern is different than this
|
||||||
*/
|
*/
|
||||||
self->sampleSizeShift=6;
|
self->sampleSizeShift=shift;
|
||||||
self->numSamples = 1<<self->sampleSizeShift; // 64
|
self->numSamples = numberOfSamples;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<self->numSamples;i++){
|
|
||||||
self->samplesX[i] = (CGFloat)radicalInverseBase2(i)-0.5;
|
|
||||||
self->samplesY[i] = ((CGFloat)(i+0.5)) / (CGFloat)self->numSamples-0.5;
|
|
||||||
self->samplesWeight=256/self->numSamples;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
for(i=0;i<numberOfSamples;i++){
|
||||||
|
self->samplesX[i] = (CGFloat)radicalInverseBase2(i)-0.5f;
|
||||||
|
self->samplesY[i] = ((CGFloat)(i+0.5f)) / (CGFloat)numberOfSamples-0.5f;
|
||||||
|
self->samplesWeight=MAX_SAMPLES/numberOfSamples;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sortEdgesByMinY(Edge **edges,int count,Edge **B){
|
static inline void sortEdgesByMinY(Edge **edges,int count,Edge **B){
|
||||||
int h, i, j, k, l, m, n = count;
|
int h, i, j, k, l, m, n = count;
|
||||||
Edge *A;
|
Edge *A;
|
||||||
|
|
||||||
@ -492,7 +514,7 @@ static void sortEdgesByMinY(Edge **edges,int count,Edge **B){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void initEdgeForAET(Edge *edge,CGFloat cminy,CGFloat cmaxy,int xlimit){
|
static inline void initEdgeForAET(Edge *edge,int scany){
|
||||||
//compute edge min and max x-coordinates for this scanline
|
//compute edge min and max x-coordinates for this scanline
|
||||||
|
|
||||||
CGPoint vd = Vector2Subtract(edge->v1,edge->v0);
|
CGPoint vd = Vector2Subtract(edge->v1,edge->v0);
|
||||||
@ -502,22 +524,22 @@ static void initEdgeForAET(Edge *edge,CGFloat cminy,CGFloat cmaxy,int xlimit){
|
|||||||
edge->bminx = RI_MIN(edge->v0.x, edge->v1.x);
|
edge->bminx = RI_MIN(edge->v0.x, edge->v1.x);
|
||||||
edge->bmaxx = RI_MAX(edge->v0.x, edge->v1.x);
|
edge->bmaxx = RI_MAX(edge->v0.x, edge->v1.x);
|
||||||
|
|
||||||
edge->sxPre = (edge->v0.x - edge->v0.y* edge->vdxwl)+ edge->vdxwl*cminy;
|
edge->sxPre = (edge->v0.x - edge->v0.y* edge->vdxwl)+ edge->vdxwl*(scany-1);
|
||||||
edge->exPre = (edge->v0.x - edge->v0.y* edge->vdxwl)+ edge->vdxwl*cmaxy;
|
edge->exPre = (edge->v0.x - edge->v0.y* edge->vdxwl)+ edge->vdxwl*(scany+1);
|
||||||
CGFloat autosx = RI_CLAMP(edge->sxPre, edge->bminx, edge->bmaxx);
|
CGFloat autosx = RI_CLAMP(edge->sxPre, edge->bminx, edge->bmaxx);
|
||||||
CGFloat autoex = RI_CLAMP(edge->exPre, edge->bminx, edge->bmaxx);
|
CGFloat autoex = RI_CLAMP(edge->exPre, edge->bminx, edge->bmaxx);
|
||||||
CGFloat minx=RI_MIN(autosx,autoex);
|
CGFloat minx=RI_MIN(autosx,autoex);
|
||||||
CGFloat maxx=RI_MAX(autosx,autoex);
|
CGFloat maxx=RI_MAX(autosx,autoex);
|
||||||
|
|
||||||
minx-=SAMPLING_RADIUS+0.5f;
|
minx-=0.5f+0.5f;
|
||||||
//0.01 is a safety region to prevent too aggressive optimization due to numerical inaccuracy
|
//0.01 is a safety region to prevent too aggressive optimization due to numerical inaccuracy
|
||||||
maxx+=SAMPLING_RADIUS+0.5f+0.01f;
|
maxx+=0.5f+0.5f+0.01f;
|
||||||
|
|
||||||
edge->minx = minx;
|
edge->minx = minx;
|
||||||
edge->maxx = maxx;
|
edge->maxx = maxx;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void incrementEdgeForAET(Edge *edge,CGFloat cminy,CGFloat cmaxy,int xlimit){
|
static inline void incrementEdgeForAET(Edge *edge){
|
||||||
edge->sxPre+= edge->vdxwl;
|
edge->sxPre+= edge->vdxwl;
|
||||||
edge->exPre+= edge->vdxwl;
|
edge->exPre+= edge->vdxwl;
|
||||||
|
|
||||||
@ -526,63 +548,213 @@ static void incrementEdgeForAET(Edge *edge,CGFloat cminy,CGFloat cmaxy,int xlimi
|
|||||||
CGFloat minx=RI_MIN(autosx,autoex);
|
CGFloat minx=RI_MIN(autosx,autoex);
|
||||||
CGFloat maxx=RI_MAX(autosx,autoex);
|
CGFloat maxx=RI_MAX(autosx,autoex);
|
||||||
|
|
||||||
minx-=SAMPLING_RADIUS+0.5f;
|
minx-=0.5f+0.5f;
|
||||||
//0.01 is a safety region to prevent too aggressive optimization due to numerical inaccuracy
|
//0.01 is a safety region to prevent too aggressive optimization due to numerical inaccuracy
|
||||||
maxx+=SAMPLING_RADIUS+0.5f+0.01f;
|
maxx+=0.5f+0.5f+0.01f;
|
||||||
|
|
||||||
edge->minx = minx;
|
edge->minx = minx;
|
||||||
edge->maxx = maxx;
|
edge->maxx = maxx;
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
static void KGApplyCoverageAndMaskToSpan_lRGBAffff_PRE(KGRGBAffff *dst,int icoverage,CGFloat *mask,KGRGBAffff *src,int length){
|
||||||
int edgeCount=self->_edgeCount;
|
int i;
|
||||||
Edge **edges=NSZoneMalloc(NULL,(edgeCount+(edgeCount/2 + 1))*sizeof(Edge *));
|
|
||||||
Edge **sortTmp=edges+edgeCount;
|
for(i=0;i<length;i++){
|
||||||
|
KGRGBAffff r=src[i];
|
||||||
|
KGRGBAffff d=dst[i];
|
||||||
|
CGFloat coverage=zeroToOneFromCoverage(icoverage);
|
||||||
|
CGFloat cov=mask[i]*coverage;
|
||||||
|
|
||||||
|
dst[i]=KGRGBAffffAdd(KGRGBAffffMultiplyByFloat(r , cov) , KGRGBAffffMultiplyByFloat(d , (1.0f - cov)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ylimit=self->_vpheight;
|
static void KGApplyCoverageToSpan_lRGBAffff_PRE(KGRGBAffff *dst,int icoverage,KGRGBAffff *src,int length){
|
||||||
int xlimit=self->_vpwidth;
|
int i;
|
||||||
|
CGFloat coverage=zeroToOneFromCoverage(icoverage);
|
||||||
int nextAvailableEdge=0;
|
|
||||||
int i;
|
for(i=0;i<length;i++){
|
||||||
|
KGRGBAffff r=src[i];
|
||||||
for(i=0;i<edgeCount;i++)
|
KGRGBAffff d=dst[i];
|
||||||
edges[i]=self->_edgePool+i;
|
|
||||||
|
|
||||||
sortEdgesByMinY(edges,edgeCount,sortTmp);
|
dst[i]=KGRGBAffffAdd(KGRGBAffffMultiplyByFloat(r , coverage) , KGRGBAffffMultiplyByFloat(d , (1.0f - coverage)));
|
||||||
|
}
|
||||||
for(;nextAvailableEdge<edgeCount;nextAvailableEdge++){
|
}
|
||||||
Edge *check=edges[nextAvailableEdge];
|
|
||||||
|
static void KGApplyCoverageAndMaskToSpan_lRGBA8888_PRE(KGRGBA8888 *dst,int icoverage,uint8_t *mask,KGRGBA8888 *src,int length){
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i=0;i<length;i++){
|
||||||
|
KGRGBA8888 r=src[i];
|
||||||
|
KGRGBA8888 d=dst[i];
|
||||||
|
int cov=(mask[i]*icoverage)/255;
|
||||||
|
int oneMinusCov=inverseCoverage(cov);
|
||||||
|
|
||||||
if(check->maxscany>=self->_vpy)
|
dst[i]=KGRGBA8888Add(KGRGBA8888MultiplyByCoverage(r , cov) , KGRGBA8888MultiplyByCoverage(d , oneMinusCov));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void KGApplyCoverageToSpan_lRGBA8888_PRE(KGRGBA8888 *dst,int coverage,KGRGBA8888 *src,int length){
|
||||||
|
int i;
|
||||||
|
int oneMinusCoverage=inverseCoverage(coverage);
|
||||||
|
|
||||||
|
for(i=0;i<length;i++,src++,dst++){
|
||||||
|
KGRGBA8888 r=*src;
|
||||||
|
KGRGBA8888 d=*dst;
|
||||||
|
|
||||||
|
*dst=KGRGBA8888Add(KGRGBA8888MultiplyByCoverage(r , coverage) , KGRGBA8888MultiplyByCoverage(d , oneMinusCoverage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void KGBlendSpanNormal_8888_coverage(KGRGBA8888 *src,KGRGBA8888 *dst,int coverage,int length){
|
||||||
|
// Passes Visual Test
|
||||||
|
int i;
|
||||||
|
int oneMinusCoverage=inverseCoverage(coverage);
|
||||||
|
|
||||||
|
for(i=0;i<length;i++,src++,dst++){
|
||||||
|
KGRGBA8888 s=*src;
|
||||||
|
KGRGBA8888 d=*dst;
|
||||||
|
KGRGBA8888 r;
|
||||||
|
|
||||||
|
r.r=RI_INT_MIN((int)s.r+((int)d.r*(255-s.a))/255,255);
|
||||||
|
r.r=multiplyByCoverage(r.r,coverage);
|
||||||
|
d.r=(d.r*oneMinusCoverage)/256;
|
||||||
|
r.r=RI_INT_MIN((int)r.r+(int)d.r,255);
|
||||||
|
|
||||||
|
r.g=RI_INT_MIN((int)s.g+((int)d.g*(255-s.a))/255,255);
|
||||||
|
r.g=multiplyByCoverage(r.g,coverage);
|
||||||
|
d.g=(d.g*oneMinusCoverage)/256;
|
||||||
|
r.g=RI_INT_MIN((int)r.g+(int)d.g,255);
|
||||||
|
|
||||||
|
r.b=RI_INT_MIN((int)s.b+((int)d.b*(255-s.a))/255,255);
|
||||||
|
r.b=multiplyByCoverage(r.b,coverage);
|
||||||
|
d.b=(d.b*oneMinusCoverage)/256;
|
||||||
|
r.b=RI_INT_MIN((int)r.b+(int)d.b,255);
|
||||||
|
|
||||||
|
r.a=RI_INT_MIN((int)s.a+((int)d.a*(255-s.a))/255,255);
|
||||||
|
r.a=multiplyByCoverage(r.a,coverage);
|
||||||
|
d.a=(d.a*oneMinusCoverage)/256;
|
||||||
|
r.a=RI_INT_MIN((int)r.a+(int)d.a,255);
|
||||||
|
|
||||||
|
*dst=r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void KGBlendSpanCopy_8888_coverage(KGRGBA8888 *src,KGRGBA8888 *dst,int coverage,int length){
|
||||||
|
// Passes Visual Test
|
||||||
|
int i;
|
||||||
|
int oneMinusCoverage=256-coverage;
|
||||||
|
|
||||||
|
for(i=0;i<length;i++,src++,dst++){
|
||||||
|
KGRGBA8888 d=*dst;
|
||||||
|
KGRGBA8888 r=*src;
|
||||||
|
|
||||||
|
r.r=multiplyByCoverage(r.r,coverage);
|
||||||
|
d.r=(d.r*oneMinusCoverage)/256;
|
||||||
|
r.r=RI_INT_MIN((int)r.r+(int)d.r,255);
|
||||||
|
|
||||||
|
r.g=multiplyByCoverage(r.g,coverage);
|
||||||
|
d.g=(d.g*oneMinusCoverage)/256;
|
||||||
|
r.g=RI_INT_MIN((int)r.g+(int)d.g,255);
|
||||||
|
|
||||||
|
r.b=multiplyByCoverage(r.b,coverage);
|
||||||
|
d.b=(d.b*oneMinusCoverage)/256;
|
||||||
|
r.b=RI_INT_MIN((int)r.b+(int)d.b,255);
|
||||||
|
|
||||||
|
r.a=multiplyByCoverage(r.a,coverage);
|
||||||
|
d.a=(d.a*oneMinusCoverage)/256;
|
||||||
|
r.a=RI_INT_MIN((int)r.a+(int)d.a,255);
|
||||||
|
|
||||||
|
*dst=r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void KGRasterizeWriteCoverageSpan(KGRasterizer *self,int x, int y,int coverage,int length) {
|
||||||
|
if(self->_useRGBA8888){
|
||||||
|
KGRGBA8888 dst[length];
|
||||||
|
KGImageReadSpan_lRGBA8888_PRE(self->m_renderingSurface,x,y,dst,length);
|
||||||
|
|
||||||
|
KGRGBA8888 src[length];
|
||||||
|
KGPaintReadSpan_lRGBA8888_PRE(self->m_paint,x,y,src,length);
|
||||||
|
|
||||||
|
switch(self->_blendMode){
|
||||||
|
|
||||||
|
case kCGBlendModeNormal:
|
||||||
|
KGBlendSpanNormal_8888_coverage(src,dst,coverage,length);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kCGBlendModeCopy:
|
||||||
|
KGBlendSpanCopy_8888_coverage(src,dst,coverage,length);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
self->_blend_lRGBA8888_PRE(src,dst,length);
|
||||||
|
|
||||||
|
//apply masking
|
||||||
|
if(!self->m_mask)
|
||||||
|
KGApplyCoverageToSpan_lRGBA8888_PRE(dst,coverage,src,length);
|
||||||
|
else {
|
||||||
|
uint8_t maskSpan[length];
|
||||||
|
|
||||||
|
KGImageReadSpan_A8_MASK(self->m_mask,x,y,maskSpan,length);
|
||||||
|
KGApplyCoverageAndMaskToSpan_lRGBA8888_PRE(dst,coverage,maskSpan,src,length);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//write result to the destination surface
|
||||||
|
KGSurfaceWriteSpan_lRGBA8888_PRE(self->m_renderingSurface,x,y,dst,length);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
KGRGBAffff dst[length];
|
||||||
|
KGImageReadSpan_lRGBAffff_PRE(self->m_renderingSurface,x,y,dst,length);
|
||||||
|
|
||||||
|
KGRGBAffff src[length];
|
||||||
|
KGPaintReadSpan_lRGBAffff_PRE(self->m_paint,x,y,src,length);
|
||||||
|
|
||||||
|
self->_blend_lRGBAffff_PRE(src,dst,length);
|
||||||
|
|
||||||
|
//apply masking
|
||||||
|
if(!self->m_mask)
|
||||||
|
KGApplyCoverageToSpan_lRGBAffff_PRE(dst,coverage,src,length);
|
||||||
|
else {
|
||||||
|
CGFloat maskSpan[length];
|
||||||
|
|
||||||
|
KGImageReadSpan_Af_MASK(self->m_mask,x,y,maskSpan,length);
|
||||||
|
KGApplyCoverageAndMaskToSpan_lRGBAffff_PRE(dst,coverage,maskSpan,src,length);
|
||||||
|
}
|
||||||
|
|
||||||
|
//write result to the destination surface
|
||||||
|
KGSurfaceWriteSpan_lRGBAffff_PRE(self->m_renderingSurface,x,y,dst,length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
||||||
|
int edgeCount=self->_edgeCount;
|
||||||
|
Edge **edges=self->_edges;
|
||||||
|
|
||||||
|
int ylimit=self->_vpy+self->_vpheight;
|
||||||
|
int xlimit=self->_vpx+self->_vpwidth;
|
||||||
|
|
||||||
|
int nextAvailableEdge=0;
|
||||||
|
|
||||||
|
sortEdgesByMinY(edges,edgeCount,self->_sortCache);
|
||||||
|
|
||||||
Edge *activeRoot=NULL;
|
Edge *activeRoot=NULL;
|
||||||
|
|
||||||
CGFloat cminy = (CGFloat)0 - SAMPLING_RADIUS + 0.5f;
|
|
||||||
CGFloat cmaxy = (CGFloat)0 + SAMPLING_RADIUS + 0.5f;
|
|
||||||
int scany;
|
int scany;
|
||||||
|
|
||||||
int *winding=self->_winding;
|
int *winding=self->_winding;
|
||||||
int *increase=self->_increase;
|
int *increase=self->_increase;
|
||||||
|
int *xIndexSet=self->_xIndexSet;
|
||||||
for(scany=0;scany<ylimit;scany++,cminy+=1.0,cmaxy+=1.0){
|
int numberOfSamples=self->numSamples;
|
||||||
|
int shiftNumberOfSamples=self->sampleSizeShift;
|
||||||
|
CGFloat sidePre[numberOfSamples];
|
||||||
|
CGFloat *preEnd=sidePre+numberOfSamples;
|
||||||
|
|
||||||
|
for(scany=self->_vpy;scany<ylimit;scany++){
|
||||||
Edge *edge,*previous=NULL;
|
Edge *edge,*previous=NULL;
|
||||||
|
|
||||||
// remove edges out of range
|
|
||||||
for(edge=activeRoot;edge!=NULL;edge=edge->next){
|
|
||||||
if(edge->maxscany>=scany){
|
|
||||||
incrementEdgeForAET(edge,cminy,cmaxy,xlimit);
|
|
||||||
previous=edge;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if(previous==NULL)
|
|
||||||
activeRoot=edge->next;
|
|
||||||
else
|
|
||||||
previous->next=edge->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// load more available edges
|
// load more available edges
|
||||||
for(;nextAvailableEdge<edgeCount;nextAvailableEdge++){
|
for(;nextAvailableEdge<edgeCount;nextAvailableEdge++){
|
||||||
edge=edges[nextAvailableEdge];
|
edge=edges[nextAvailableEdge];
|
||||||
@ -592,88 +764,111 @@ void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
|||||||
|
|
||||||
edge->next=activeRoot;
|
edge->next=activeRoot;
|
||||||
activeRoot=edge;
|
activeRoot=edge;
|
||||||
initEdgeForAET(edge,cminy,cmaxy,xlimit);
|
initEdgeForAET(edge,scany);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(activeRoot==NULL)
|
int accum=0;
|
||||||
continue;
|
int minx=xlimit,maxx=0;
|
||||||
|
int nextXIndex=0;
|
||||||
int numberOfSamples=self->numSamples;
|
int scanx;
|
||||||
int accum=0;
|
|
||||||
int s;
|
|
||||||
int scanx,minx=xlimit,maxx=0;
|
|
||||||
int xIndexSet[xlimit];
|
|
||||||
int nextXIndex=0;
|
|
||||||
CGFloat sidePre[numberOfSamples];
|
|
||||||
CGFloat *preEnd=sidePre+numberOfSamples;
|
|
||||||
CGFloat pcy=scany+0.5f; // pixel center
|
|
||||||
|
|
||||||
for(scanx=0;scanx<xlimit;scanx++)
|
|
||||||
xIndexSet[scanx]=-1;
|
|
||||||
|
|
||||||
for(edge=activeRoot;edge!=NULL;edge=edge->next){
|
for(edge=activeRoot;edge!=NULL;edge=edge->next){
|
||||||
CGFloat *pre=sidePre;
|
CGFloat *pre=sidePre;
|
||||||
CGFloat *samplesY=self->samplesY;
|
CGFloat *samplesY=self->samplesY;
|
||||||
CGFloat *samplesX=self->samplesX;
|
CGFloat *samplesX=self->samplesX;
|
||||||
CGFloat v0y=edge->v0.y;
|
CGFloat pcy=scany+0.5f;
|
||||||
CGFloat v1y=edge->v1.y;
|
CGFloat v0y=edge->v0.y-pcy;
|
||||||
|
CGFloat v1y=edge->v1.y-pcy;
|
||||||
CGFloat normalX=edge->normal.x;
|
CGFloat normalX=edge->normal.x;
|
||||||
CGFloat normalY=edge->normal.y;
|
CGFloat normalY=edge->normal.y;
|
||||||
|
int deltaStart=0;
|
||||||
|
int deltaEnd=0;
|
||||||
|
|
||||||
s=numberOfSamples;
|
for(;*samplesY<v0y && pre<preEnd;samplesY++,samplesX++){
|
||||||
do {
|
pre++;
|
||||||
CGFloat spy = pcy+*samplesY++;
|
deltaStart++;
|
||||||
if(spy >= v0y && spy < v1y)
|
}
|
||||||
*pre++ = -(spy*normalY + *samplesX++*normalX)-0.5f*normalX;
|
for(;*samplesY<v1y && pre<preEnd;samplesY++,samplesX++)
|
||||||
else {
|
*pre++ = (*samplesY*normalY-*samplesX*normalX);
|
||||||
*pre++=-INT_MAX;
|
for(;pre<preEnd;){
|
||||||
}
|
pre++;
|
||||||
}while(--s>0);
|
deltaEnd++;
|
||||||
|
}
|
||||||
int direction=edge->direction;
|
|
||||||
|
int direction=edge->direction;
|
||||||
|
|
||||||
minx=MIN(minx,edge->minx);
|
minx=MIN(minx,edge->minx);
|
||||||
|
|
||||||
|
scanx=MAX(0,edge->minx);
|
||||||
|
CGFloat pcxnormal=scanx*normalX+0.5f*normalX-(pcy*normalY)-edge->cnst;
|
||||||
|
|
||||||
for(scanx=MAX(0,edge->minx);scanx<xlimit;scanx++){
|
for(;scanx<xlimit;scanx++,pcxnormal+=normalX){
|
||||||
int xIndex=xIndexSet[scanx];
|
int xIndex=xIndexSet[scanx];
|
||||||
int *windptr;
|
int *windptr;
|
||||||
|
int leftOfEdge=deltaStart+deltaEnd;
|
||||||
|
|
||||||
if(xIndex==-1){
|
if(xIndex==-1){
|
||||||
xIndex=nextXIndex++;
|
xIndex=nextXIndex++;
|
||||||
xIndexSet[scanx]=xIndex;
|
xIndexSet[scanx]=xIndex;
|
||||||
|
|
||||||
windptr=winding+(xIndex<<self->sampleSizeShift);
|
pre=sidePre;
|
||||||
s=numberOfSamples;
|
windptr=winding+(xIndex<<shiftNumberOfSamples);
|
||||||
do {
|
int k;
|
||||||
|
for(k=0;k<deltaStart;k++,pre++)
|
||||||
*windptr++=0;
|
*windptr++=0;
|
||||||
}while(--s>0);
|
|
||||||
|
while(pre<(preEnd-deltaEnd)){
|
||||||
|
if(*pre>=pcxnormal)
|
||||||
|
*windptr=direction;
|
||||||
|
else {
|
||||||
|
*windptr=0;
|
||||||
|
leftOfEdge++;
|
||||||
|
}
|
||||||
|
|
||||||
|
windptr++;
|
||||||
|
pre++;
|
||||||
|
}
|
||||||
|
for(k=0;k<deltaEnd;k++)
|
||||||
|
*windptr++=0;
|
||||||
|
|
||||||
increase[xIndex]=0;
|
increase[xIndex]=0;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
pre=sidePre;
|
pre=sidePre+deltaStart;
|
||||||
windptr=winding+(xIndex<<self->sampleSizeShift);
|
windptr=winding+(xIndex<<shiftNumberOfSamples)+deltaStart;
|
||||||
CGFloat pcxnormal=scanx*edge->normal.x-edge->cnst;
|
|
||||||
int rightOfEdge=0;
|
while(pre<(preEnd-deltaEnd)){
|
||||||
|
if(*pre>=pcxnormal)
|
||||||
do{
|
*windptr+=direction;
|
||||||
if(pcxnormal<=*pre){
|
else
|
||||||
*windptr+=direction;
|
leftOfEdge++;
|
||||||
rightOfEdge++;
|
|
||||||
|
windptr++;
|
||||||
|
pre++;
|
||||||
}
|
}
|
||||||
windptr++;
|
|
||||||
pre++;
|
}
|
||||||
}while(pre<preEnd);
|
|
||||||
|
|
||||||
if(rightOfEdge==0 && scanx>edge->maxx)
|
if(leftOfEdge==0){
|
||||||
break;
|
|
||||||
|
|
||||||
if(rightOfEdge==numberOfSamples){
|
|
||||||
increase[xIndex]+=direction;
|
increase[xIndex]+=direction;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(leftOfEdge==numberOfSamples && scanx>edge->maxx)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
maxx=MAX(maxx,scanx);
|
maxx=MAX(maxx,scanx);
|
||||||
|
|
||||||
|
// increment and remove edges out of range
|
||||||
|
if(edge->maxscany>=scany){
|
||||||
|
incrementEdgeForAET(edge);
|
||||||
|
previous=edge;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(previous==NULL)
|
||||||
|
activeRoot=edge->next;
|
||||||
|
else
|
||||||
|
previous->next=edge->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
minx=MAX(0,minx);
|
minx=MAX(0,minx);
|
||||||
maxx=MIN(xlimit,maxx+1);
|
maxx=MIN(xlimit,maxx+1);
|
||||||
@ -681,9 +876,11 @@ void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
|||||||
int xIndex=-1;
|
int xIndex=-1;
|
||||||
|
|
||||||
for(scanx=minx;scanx<maxx;)
|
for(scanx=minx;scanx<maxx;)
|
||||||
if((xIndex=xIndexSet[scanx])!=-1)
|
if((xIndex=xIndexSet[scanx])!=-1){
|
||||||
|
xIndexSet[scanx]=-1;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if(xIndex==-1)
|
if(xIndex==-1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -691,12 +888,12 @@ void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
|||||||
|
|
||||||
int coverage=0;
|
int coverage=0;
|
||||||
|
|
||||||
for(scanx=minx;scanx<maxx;){
|
for(scanx=minx;scanx<maxx;){
|
||||||
int *windptr=winding+(xIndex<<self->sampleSizeShift);
|
int *windptr=winding+(xIndex<<shiftNumberOfSamples);
|
||||||
|
|
||||||
s=numberOfSamples;
|
int s=numberOfSamples;
|
||||||
do {
|
do {
|
||||||
if((*windptr+++accum) & fillRuleMask )
|
if((*windptr+++accum) & fillRuleMask)
|
||||||
coverage +=weight;
|
coverage +=weight;
|
||||||
}while(--s>0);
|
}while(--s>0);
|
||||||
|
|
||||||
@ -704,8 +901,10 @@ void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
|||||||
|
|
||||||
int advance;
|
int advance;
|
||||||
for(advance=scanx+1;advance<maxx;advance++)
|
for(advance=scanx+1;advance<maxx;advance++)
|
||||||
if((xIndex=xIndexSet[advance])!=-1)
|
if((xIndex=xIndexSet[advance])!=-1){
|
||||||
|
xIndexSet[advance]=-1;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if(coverage>0){
|
if(coverage>0){
|
||||||
KGRasterizeWriteCoverageSpan(self,scanx,scany,coverage,(advance-scanx));
|
KGRasterizeWriteCoverageSpan(self,scanx,scany,coverage,(advance-scanx));
|
||||||
@ -715,13 +914,12 @@ void KGRasterizerFill(KGRasterizer *self,VGFillRuleMask fillRuleMask) {
|
|||||||
scanx=advance;
|
scanx=advance;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
NSZoneFree(NULL,edges);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGRasterizeSetBlendMode(KGRasterizer *self,CGBlendMode blendMode) {
|
void KGRasterizeSetBlendMode(KGRasterizer *self,CGBlendMode blendMode) {
|
||||||
RI_ASSERT(blendMode >= kCGBlendModeNormal && blendMode <= kCGBlendModePlusLighter);
|
RI_ASSERT(blendMode >= kCGBlendModeNormal && blendMode <= kCGBlendModePlusLighter);
|
||||||
|
|
||||||
|
self->_blendMode=blendMode;
|
||||||
self->_useRGBA8888=NO;
|
self->_useRGBA8888=NO;
|
||||||
|
|
||||||
switch(blendMode){
|
switch(blendMode){
|
||||||
@ -866,102 +1064,4 @@ void KGRasterizeSetPaint(KGRasterizer *self, KGPaint* paint) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void KGApplyCoverageAndMaskToSpan_lRGBAffff_PRE(KGRGBAffff *dst,int coverage256,CGFloat *mask,KGRGBAffff *result,int length){
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0;i<length;i++){
|
|
||||||
KGRGBAffff r=result[i];
|
|
||||||
KGRGBAffff d=dst[i];
|
|
||||||
CGFloat coverage=(CGFloat)coverage256/256.0;
|
|
||||||
CGFloat cov=mask[i]*coverage;
|
|
||||||
|
|
||||||
result[i]=KGRGBAffffAdd(KGRGBAffffMultiplyByFloat(r , cov) , KGRGBAffffMultiplyByFloat(d , (1.0f - cov)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void KGApplyCoverageToSpan_lRGBAffff_PRE(KGRGBAffff *dst,int coverage256,KGRGBAffff *result,int length){
|
|
||||||
int i;
|
|
||||||
CGFloat coverage=(CGFloat)coverage256/256.0;
|
|
||||||
|
|
||||||
for(i=0;i<length;i++){
|
|
||||||
KGRGBAffff r=result[i];
|
|
||||||
KGRGBAffff d=dst[i];
|
|
||||||
|
|
||||||
result[i]=KGRGBAffffAdd(KGRGBAffffMultiplyByFloat(r , coverage) , KGRGBAffffMultiplyByFloat(d , (1.0f - coverage)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void KGApplyCoverageAndMaskToSpan_lRGBA8888_PRE(KGRGBA8888 *dst,int coverage256,uint8_t *mask,KGRGBA8888 *result,int length){
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for(i=0;i<length;i++){
|
|
||||||
KGRGBA8888 r=result[i];
|
|
||||||
KGRGBA8888 d=dst[i];
|
|
||||||
int cov=(mask[i]*coverage256)/255;
|
|
||||||
int oneMinusCov=(256-cov);
|
|
||||||
|
|
||||||
result[i]=KGRGBA8888Add(KGRGBA8888MultiplyByCoverage256(r , cov) , KGRGBA8888MultiplyByCoverage256(d , oneMinusCov));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void KGApplyCoverageToSpan_lRGBA8888_PRE(KGRGBA8888 *dst,int coverage256,KGRGBA8888 *result,int length){
|
|
||||||
int i;
|
|
||||||
int coverage=coverage256;
|
|
||||||
int oneMinusCoverage=256-coverage256;
|
|
||||||
|
|
||||||
for(i=0;i<length;i++){
|
|
||||||
KGRGBA8888 r=result[i];
|
|
||||||
KGRGBA8888 d=dst[i];
|
|
||||||
|
|
||||||
result[i]=KGRGBA8888Add(KGRGBA8888MultiplyByCoverage256(r , coverage) , KGRGBA8888MultiplyByCoverage256(d , oneMinusCoverage));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void KGRasterizeWriteCoverageSpan(KGRasterizer *self,int x, int y,int coverage,int length) {
|
|
||||||
if(self->_useRGBA8888){
|
|
||||||
KGRGBA8888 dst[length];
|
|
||||||
KGImageReadSpan_lRGBA8888_PRE(self->m_renderingSurface,x,y,dst,length);
|
|
||||||
|
|
||||||
KGRGBA8888 src[length];
|
|
||||||
KGPaintReadSpan_lRGBA8888_PRE(self->m_paint,x,y,src,length);
|
|
||||||
|
|
||||||
self->_blend_lRGBA8888_PRE(src,dst,length);
|
|
||||||
|
|
||||||
//apply masking
|
|
||||||
if(!self->m_mask)
|
|
||||||
KGApplyCoverageToSpan_lRGBA8888_PRE(dst,coverage,src,length);
|
|
||||||
else {
|
|
||||||
uint8_t maskSpan[length];
|
|
||||||
|
|
||||||
KGImageReadSpan_A8_MASK(self->m_mask,x,y,maskSpan,length);
|
|
||||||
KGApplyCoverageAndMaskToSpan_lRGBA8888_PRE(dst,coverage,maskSpan,src,length);
|
|
||||||
}
|
|
||||||
|
|
||||||
//write result to the destination surface
|
|
||||||
KGSurfaceWriteSpan_lRGBA8888_PRE(self->m_renderingSurface,x,y,src,length);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
KGRGBAffff dst[length];
|
|
||||||
KGImageReadSpan_lRGBAffff_PRE(self->m_renderingSurface,x,y,dst,length);
|
|
||||||
|
|
||||||
KGRGBAffff src[length];
|
|
||||||
KGPaintReadSpan_lRGBAffff_PRE(self->m_paint,x,y,src,length);
|
|
||||||
|
|
||||||
self->_blend_lRGBAffff_PRE(src,dst,length);
|
|
||||||
|
|
||||||
//apply masking
|
|
||||||
if(!self->m_mask)
|
|
||||||
KGApplyCoverageToSpan_lRGBAffff_PRE(dst,coverage,src,length);
|
|
||||||
else {
|
|
||||||
CGFloat maskSpan[length];
|
|
||||||
|
|
||||||
KGImageReadSpan_Af_MASK(self->m_mask,x,y,maskSpan,length);
|
|
||||||
KGApplyCoverageAndMaskToSpan_lRGBAffff_PRE(dst,coverage,maskSpan,src,length);
|
|
||||||
}
|
|
||||||
|
|
||||||
//write result to the destination surface
|
|
||||||
KGSurfaceWriteSpan_lRGBAffff_PRE(self->m_renderingSurface,x,y,src,length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -42,6 +42,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
KGColor *_shadowColor;
|
KGColor *_shadowColor;
|
||||||
BOOL _shouldAntialias;
|
BOOL _shouldAntialias;
|
||||||
|
|
||||||
|
int _antialiasingQuality;
|
||||||
float _wordSpacing;
|
float _wordSpacing;
|
||||||
float _textLeading;
|
float _textLeading;
|
||||||
}
|
}
|
||||||
@ -108,7 +109,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
-(void)setShouldAntialias:(BOOL)flag;
|
-(void)setShouldAntialias:(BOOL)flag;
|
||||||
|
|
||||||
// temporary?
|
// temporary?
|
||||||
|
-(void)setAntialiasingQuality:(int)value;
|
||||||
-(void)setWordSpacing:(float)spacing;
|
-(void)setWordSpacing:(float)spacing;
|
||||||
-(void)setTextLeading:(float)leading;
|
-(void)setTextLeading:(float)leading;
|
||||||
|
|
||||||
|
@ -30,6 +30,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
_blendMode=kCGBlendModeNormal;
|
_blendMode=kCGBlendModeNormal;
|
||||||
_interpolationQuality=kCGInterpolationDefault;
|
_interpolationQuality=kCGInterpolationDefault;
|
||||||
_shouldAntialias=NO;
|
_shouldAntialias=NO;
|
||||||
|
_antialiasingQuality=64;
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,6 +299,10 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
|
|
||||||
// temporary
|
// temporary
|
||||||
|
|
||||||
|
-(void)setAntialiasingQuality:(int)value {
|
||||||
|
_antialiasingQuality=value;
|
||||||
|
}
|
||||||
|
|
||||||
-(void)setWordSpacing:(float)spacing {
|
-(void)setWordSpacing:(float)spacing {
|
||||||
_wordSpacing=spacing;
|
_wordSpacing=spacing;
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* -------------------------------------
|
* -------------------------------------
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007 The Khronos Group Inc.
|
* Copyright (c) 2007 The Khronos Group Inc.
|
||||||
* Copyright (c) 2007-2008 Christopher J. W. Lloyd
|
* Copyright (c) 2008 Christopher J. W. Lloyd
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and /or associated documentation files
|
* copy of this software and /or associated documentation files
|
||||||
@ -187,20 +187,38 @@ static inline KGRGBA8888 KGRGBA8888FromKGRGBAffff(KGRGBAffff rgba){
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline KGRGBA8888 KGRGBA8888MultiplyByCoverage256(KGRGBA8888 result,int value){
|
#define COVERAGE_MULTIPLIER 256
|
||||||
result.r=((int)result.r*value)/256;
|
|
||||||
result.g=((int)result.g*value)/256;
|
static inline CGFloat zeroToOneFromCoverage(int coverage){
|
||||||
result.b=((int)result.b*value)/256;
|
return (CGFloat)coverage/(CGFloat)COVERAGE_MULTIPLIER;
|
||||||
result.a=((int)result.a*value)/256;
|
}
|
||||||
|
|
||||||
|
static inline CGFloat coverageFromZeroToOne(CGFloat value){
|
||||||
|
return value*COVERAGE_MULTIPLIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int inverseCoverage(int coverage){
|
||||||
|
return COVERAGE_MULTIPLIER-coverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int multiplyByCoverage(int value,int coverage){
|
||||||
|
return (value*coverage)/COVERAGE_MULTIPLIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline KGRGBA8888 KGRGBA8888MultiplyByCoverage(KGRGBA8888 result,int value){
|
||||||
|
result.r=((int)result.r*value)/COVERAGE_MULTIPLIER;
|
||||||
|
result.g=((int)result.g*value)/COVERAGE_MULTIPLIER;
|
||||||
|
result.b=((int)result.b*value)/COVERAGE_MULTIPLIER;
|
||||||
|
result.a=((int)result.a*value)/COVERAGE_MULTIPLIER;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline KGRGBA8888 KGRGBA8888Add(KGRGBA8888 result,KGRGBA8888 other){
|
static inline KGRGBA8888 KGRGBA8888Add(KGRGBA8888 result,KGRGBA8888 other){
|
||||||
result.r=RI_INT_CLAMP((int)result.r+(int)other.r,0,255);
|
result.r=MIN((int)result.r+(int)other.r,255);
|
||||||
result.g=RI_INT_CLAMP((int)result.g+(int)other.g,0,255);
|
result.g=MIN((int)result.g+(int)other.g,255);
|
||||||
result.b=RI_INT_CLAMP((int)result.b+(int)other.b,0,255);
|
result.b=MIN((int)result.b+(int)other.b,255);
|
||||||
result.a=RI_INT_CLAMP((int)result.a+(int)other.a,0,255);
|
result.a=MIN((int)result.a+(int)other.a,255);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,6 +226,8 @@ static inline KGRGBA8888 KGRGBA8888Add(KGRGBA8888 result,KGRGBA8888 other){
|
|||||||
|
|
||||||
typedef void (*KGImageReadSpan_RGBA8888)(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
typedef void (*KGImageReadSpan_RGBA8888)(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
typedef void (*KGImageReadSpan_RGBAffff)(KGImage *self,int x,int y,KGRGBAffff *span,int length);
|
typedef void (*KGImageReadSpan_RGBAffff)(KGImage *self,int x,int y,KGRGBAffff *span,int length);
|
||||||
|
typedef void (*KGImageReadSpan_A8)(KGImage *self,int x,int y,uint8_t *span,int length);
|
||||||
|
typedef void (*KGImageReadSpan_Af)(KGImage *self,int x,int y,CGFloat *span,int length);
|
||||||
|
|
||||||
@interface KGImage : NSObject <NSCopying> {
|
@interface KGImage : NSObject <NSCopying> {
|
||||||
@public
|
@public
|
||||||
@ -233,7 +253,9 @@ typedef void (*KGImageReadSpan_RGBAffff)(KGImage *self,int x,int y,KGRGBAffff *s
|
|||||||
|
|
||||||
KGImageReadSpan_RGBA8888 _readRGBA8888;
|
KGImageReadSpan_RGBA8888 _readRGBA8888;
|
||||||
KGImageReadSpan_RGBAffff _readRGBAffff;
|
KGImageReadSpan_RGBAffff _readRGBAffff;
|
||||||
|
KGImageReadSpan_RGBA8888 _readA8;
|
||||||
|
KGImageReadSpan_RGBAffff _readAf;
|
||||||
|
|
||||||
VGPixelDecode m_desc;
|
VGPixelDecode m_desc;
|
||||||
BOOL m_ownsData;
|
BOOL m_ownsData;
|
||||||
BOOL m_mipmapsValid;
|
BOOL m_mipmapsValid;
|
||||||
@ -242,7 +264,7 @@ typedef void (*KGImageReadSpan_RGBAffff)(KGImage *self,int x,int y,KGRGBAffff *s
|
|||||||
struct KGSurface **_mipmaps;
|
struct KGSurface **_mipmaps;
|
||||||
}
|
}
|
||||||
|
|
||||||
-initWithWidth:(size_t)width height:(size_t)height bitsPerComponent:(size_t)bitsPerComponent bitsPerPixel:(size_t)bitsPerPixel bytesPerRow:(size_t)bytesPerRow colorSpace:(KGColorSpace *)colorSpace bitmapInfo:(unsigned)bitmapInfo provider:(KGDataProvider *)provider decode:(const CGFloat *)decode interpolate:(BOOL)interpolate renderingIntent:(CGColorRenderingIntent)renderingIntent;
|
-initWithWidth:(size_t)width height:(size_t)height bitsPerComponent:(size_t)bitsPerComponent bitsPerPixel:(size_t)bitsPerPixel bytesPerRow:(size_t)bytesPerRow colorSpace:(KGColorSpace *)colorSpace bitmapInfo:(CGBitmapInfo)bitmapInfo provider:(KGDataProvider *)provider decode:(const CGFloat *)decode interpolate:(BOOL)interpolate renderingIntent:(CGColorRenderingIntent)renderingIntent;
|
||||||
|
|
||||||
-initMaskWithWidth:(size_t)width height:(size_t)height bitsPerComponent:(size_t)bitsPerComponent bitsPerPixel:(size_t)bitsPerPixel bytesPerRow:(size_t)bytesPerRow provider:(KGDataProvider *)provider decode:(const float *)decode interpolate:(BOOL)interpolate ;
|
-initMaskWithWidth:(size_t)width height:(size_t)height bitsPerComponent:(size_t)bitsPerComponent bitsPerPixel:(size_t)bitsPerPixel bytesPerRow:(size_t)bytesPerRow provider:(KGDataProvider *)provider decode:(const float *)decode interpolate:(BOOL)interpolate ;
|
||||||
|
|
||||||
@ -291,6 +313,7 @@ void KGImageRead_G8_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int l
|
|||||||
void KGImageRead_GA88_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
void KGImageRead_GA88_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
void KGImageRead_RGBA8888_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
void KGImageRead_RGBA8888_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
void KGImageRead_ABGR8888_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
void KGImageRead_ABGR8888_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
|
void KGImageRead_G3B5X1R5G2_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
void KGImageRead_RGBA4444_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
void KGImageRead_RGBA4444_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
void KGImageRead_BARG4444_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
void KGImageRead_BARG4444_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
void KGImageRead_RGBA2222_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
void KGImageRead_RGBA2222_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length);
|
||||||
@ -309,12 +332,12 @@ void KGImageReadSpan_Af_MASK(KGImage *self,int x,int y,CGFloat *coverage,int len
|
|||||||
void KGImageReadTileSpanExtendEdge__lRGBA8888_PRE(KGImage *self,int u, int v, KGRGBA8888 *span,int length);
|
void KGImageReadTileSpanExtendEdge__lRGBA8888_PRE(KGImage *self,int u, int v, KGRGBA8888 *span,int length);
|
||||||
void KGImageReadTileSpanExtendEdge__lRGBAffff_PRE(KGImage *self,int u, int v, KGRGBAffff *span,int length);
|
void KGImageReadTileSpanExtendEdge__lRGBAffff_PRE(KGImage *self,int u, int v, KGRGBAffff *span,int length);
|
||||||
|
|
||||||
void KGImageEWAOnMipmaps_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
void KGImageEWAOnMipmaps_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
||||||
void KGImageBicubic_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage);
|
void KGImageBicubic_lRGBA8888_PRE(KGImage *self,int x, int y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage);
|
||||||
void KGImageBicubic_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
void KGImageBicubic_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
||||||
void KGImageBilinear_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage);
|
void KGImageBilinear_lRGBA8888_PRE(KGImage *self,int x, int y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage);
|
||||||
void KGImageBilinear_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
void KGImageBilinear_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
||||||
void KGImagePointSampling_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage);
|
void KGImagePointSampling_lRGBA8888_PRE(KGImage *self,int x, int y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage);
|
||||||
void KGImagePointSampling_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
void KGImagePointSampling_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage);
|
||||||
|
|
||||||
void KGImageReadPatternSpan_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y, KGRGBAffff *span,int length, CGAffineTransform surfaceToImage, CGPatternTiling distortion);
|
void KGImageReadPatternSpan_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y, KGRGBAffff *span,int length, CGAffineTransform surfaceToImage, CGPatternTiling distortion);
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
* -------------------------------------
|
* -------------------------------------
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007 The Khronos Group Inc.
|
* Copyright (c) 2007 The Khronos Group Inc.
|
||||||
* Copyright (c) 2007-2008 Christopher J. W. Lloyd
|
* Copyright (c) 2008 Christopher J. W. Lloyd
|
||||||
*
|
*
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||||
* copy of this software and /or associated documentation files
|
* copy of this software and /or associated documentation files
|
||||||
@ -194,6 +194,19 @@ static BOOL initFunctionsForParameters(KGImage *self,size_t bitsPerComponent,siz
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
switch(bitsPerPixel){
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
if(bitmapInfo==(kCGBitmapByteOrder16Little|kCGImageAlphaNoneSkipFirst)){
|
||||||
|
self->_readRGBA8888=KGImageRead_G3B5X1R5G2_to_RGBA8888;
|
||||||
|
self->_readRGBAffff=KGImageRead_ANY_to_RGBA8888_to_RGBAffff;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
switch(bitsPerPixel){
|
switch(bitsPerPixel){
|
||||||
@ -781,6 +794,27 @@ void KGImageRead_ABGR8888_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// kCGBitmapByteOrder16Little|kCGImageAlphaNoneSkipFirst
|
||||||
|
void KGImageRead_G3B5X1R5G2_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length){
|
||||||
|
RIuint8 *scanline = self->_bytes + y * self->_bytesPerRow;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
scanline+=x*2;
|
||||||
|
for(i=0;i<length;i++){
|
||||||
|
unsigned short low=*scanline++;
|
||||||
|
unsigned short high=*scanline;
|
||||||
|
unsigned short value=low|(high<<8);
|
||||||
|
KGRGBA8888 result;
|
||||||
|
|
||||||
|
result.r = ((value>>10)&0x1F)<<3;
|
||||||
|
result.g = ((value>>5)&0x1F)<<3;
|
||||||
|
result.b = ((value&0x1F)<<3);
|
||||||
|
result.a = 255;
|
||||||
|
scanline++;
|
||||||
|
*span++=result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void KGImageRead_RGBA4444_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length){
|
void KGImageRead_RGBA4444_to_RGBA8888(KGImage *self,int x,int y,KGRGBA8888 *span,int length){
|
||||||
RIuint8 *scanline = self->_bytes + y * self->_bytesPerRow;
|
RIuint8 *scanline = self->_bytes + y * self->_bytesPerRow;
|
||||||
int i;
|
int i;
|
||||||
@ -1038,7 +1072,7 @@ KGImage *KGImageMipMapForLevel(KGImage *self,int level){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KGImageEWAOnMipmaps_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
void KGImageEWAOnMipmaps_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
CGFloat m_pixelFilterRadius = 1.25f;
|
CGFloat m_pixelFilterRadius = 1.25f;
|
||||||
CGFloat m_resamplingFilterRadius = 1.25f;
|
CGFloat m_resamplingFilterRadius = 1.25f;
|
||||||
@ -1188,7 +1222,7 @@ static inline int cubic_8(int v0,int v1,int v2,int v3,int fraction){
|
|||||||
int p = (v3 - v2) - (v0 - v1);
|
int p = (v3 - v2) - (v0 - v1);
|
||||||
int q = (v0 - v1) - p;
|
int q = (v0 - v1) - p;
|
||||||
|
|
||||||
return RI_INT_CLAMP((p * (fraction*fraction*fraction))/(255*255*255) + (q * fraction*fraction)/(255*255) + ((v2 - v0) * fraction)/255 + v1,0,255);
|
return RI_INT_CLAMP((p * (fraction*fraction*fraction))/(256*256*256) + (q * fraction*fraction)/(256*256) + ((v2 - v0) * fraction)/256 + v1,0,255);
|
||||||
}
|
}
|
||||||
|
|
||||||
KGRGBA8888 bicubic_lRGBA8888_PRE(KGRGBA8888 a,KGRGBA8888 b,KGRGBA8888 c,KGRGBA8888 d,int fraction) {
|
KGRGBA8888 bicubic_lRGBA8888_PRE(KGRGBA8888 a,KGRGBA8888 b,KGRGBA8888 c,KGRGBA8888 d,int fraction) {
|
||||||
@ -1199,7 +1233,7 @@ KGRGBA8888 bicubic_lRGBA8888_PRE(KGRGBA8888 a,KGRGBA8888 b,KGRGBA8888 c,KGRGBA88
|
|||||||
cubic_8(a.a, b.a, c.a, d.a, fraction));
|
cubic_8(a.a, b.a, c.a, d.a, fraction));
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGImageBicubic_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage){
|
void KGImageBicubic_lRGBA8888_PRE(KGImage *self,int x, int y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<length;i++,x++){
|
for(i=0;i<length;i++,x++){
|
||||||
@ -1209,10 +1243,10 @@ void KGImageBicubic_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888
|
|||||||
uv.x -= 0.5f;
|
uv.x -= 0.5f;
|
||||||
uv.y -= 0.5f;
|
uv.y -= 0.5f;
|
||||||
int u = RI_FLOOR_TO_INT(uv.x);
|
int u = RI_FLOOR_TO_INT(uv.x);
|
||||||
int ufrac=(uv.x-u)*255;
|
int ufrac=coverageFromZeroToOne(uv.x-u);
|
||||||
|
|
||||||
int v = RI_FLOOR_TO_INT(uv.y);
|
int v = RI_FLOOR_TO_INT(uv.y);
|
||||||
int vfrac=(uv.y-v)*255;
|
int vfrac=coverageFromZeroToOne(uv.y-v);
|
||||||
|
|
||||||
KGRGBA8888 t0,t1,t2,t3;
|
KGRGBA8888 t0,t1,t2,t3;
|
||||||
KGRGBA8888 cspan[4];
|
KGRGBA8888 cspan[4];
|
||||||
@ -1248,7 +1282,7 @@ KGRGBAffff bicubic_lRGBAffff_PRE(KGRGBAffff a,KGRGBAffff b,KGRGBAffff c,KGRGBAff
|
|||||||
cubic_f(a.a, b.a, c.a, d.a, fraction));
|
cubic_f(a.a, b.a, c.a, d.a, fraction));
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGImageBicubic_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
void KGImageBicubic_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<length;i++,x++){
|
for(i=0;i<length;i++,x++){
|
||||||
@ -1282,7 +1316,7 @@ void KGImageBicubic_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGImageBilinear_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage){
|
void KGImageBilinear_lRGBA8888_PRE(KGImage *self,int x, int y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<length;i++,x++){
|
for(i=0;i<length;i++,x++){
|
||||||
@ -1299,16 +1333,18 @@ void KGImageBilinear_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888
|
|||||||
KGRGBA8888 c01c11[2];
|
KGRGBA8888 c01c11[2];
|
||||||
KGImageReadTileSpanExtendEdge__lRGBA8888_PRE(self,u,v+1,c01c11,2);
|
KGImageReadTileSpanExtendEdge__lRGBA8888_PRE(self,u,v+1,c01c11,2);
|
||||||
|
|
||||||
CGFloat fu = uv.x - (CGFloat)u;
|
int fu = coverageFromZeroToOne(uv.x - (CGFloat)u);
|
||||||
CGFloat fv = uv.y - (CGFloat)v;
|
int oneMinusFu=inverseCoverage(fu);
|
||||||
KGRGBA8888 c0 = KGRGBA8888Add(KGRGBA8888MultiplyByCoverage256(c00c01[0],(1.0f - fu)*256),KGRGBA8888MultiplyByCoverage256(c00c01[1],fu*256));
|
int fv = coverageFromZeroToOne(uv.y - (CGFloat)v);
|
||||||
KGRGBA8888 c1 = KGRGBA8888Add(KGRGBA8888MultiplyByCoverage256(c01c11[0],(1.0f - fu)*256),KGRGBA8888MultiplyByCoverage256(c01c11[1],fu*256));
|
int oneMinusFv=inverseCoverage(fv);
|
||||||
span[i]=KGRGBA8888Add(KGRGBA8888MultiplyByCoverage256(c0,(1.0f - fv)*256),KGRGBA8888MultiplyByCoverage256(c1, fv*256));
|
KGRGBA8888 c0 = KGRGBA8888Add(KGRGBA8888MultiplyByCoverage(c00c01[0],oneMinusFu),KGRGBA8888MultiplyByCoverage(c00c01[1],fu));
|
||||||
|
KGRGBA8888 c1 = KGRGBA8888Add(KGRGBA8888MultiplyByCoverage(c01c11[0],oneMinusFu),KGRGBA8888MultiplyByCoverage(c01c11[1],fu));
|
||||||
|
span[i]=KGRGBA8888Add(KGRGBA8888MultiplyByCoverage(c0,oneMinusFv),KGRGBA8888MultiplyByCoverage(c1, fv));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KGImageBilinear_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
void KGImageBilinear_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<length;i++,x++){
|
for(i=0;i<length;i++,x++){
|
||||||
@ -1333,7 +1369,7 @@ void KGImageBilinear_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGImagePointSampling_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage){
|
void KGImagePointSampling_lRGBA8888_PRE(KGImage *self,int x, int y,KGRGBA8888 *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<length;i++,x++){
|
for(i=0;i<length;i++,x++){
|
||||||
@ -1344,7 +1380,7 @@ void KGImagePointSampling_lRGBA8888_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void KGImagePointSampling_lRGBAffff_PRE(KGImage *self,CGFloat x, CGFloat y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
void KGImagePointSampling_lRGBAffff_PRE(KGImage *self,int x, int y,KGRGBAffff *span,int length, CGAffineTransform surfaceToImage){
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0;i<length;i++,x++){
|
for(i=0;i<length;i++,x++){
|
||||||
|
@ -95,18 +95,18 @@ static void bezier(KGGraphicsState *self,double x1,double y1,double x2, double y
|
|||||||
_numberOfPoints=0;
|
_numberOfPoints=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void expandOperatorCapacity(KGMutablePath *self,unsigned delta){
|
static inline void expandOperatorCapacity(KGMutablePath *self,unsigned delta){
|
||||||
if(self->_numberOfElements+delta>self->_capacityOfElements){
|
if(self->_numberOfElements+delta>self->_capacityOfElements){
|
||||||
self->_capacityOfElements=self->_numberOfElements+delta;
|
self->_capacityOfElements=self->_numberOfElements+delta;
|
||||||
self->_capacityOfElements=(self->_capacityOfElements/16+1)*16;
|
self->_capacityOfElements=(self->_capacityOfElements/32+1)*32;
|
||||||
self->_elements=NSZoneRealloc(NULL,self->_elements,self->_capacityOfElements);
|
self->_elements=NSZoneRealloc(NULL,self->_elements,self->_capacityOfElements);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void expandPointCapacity(KGMutablePath *self,unsigned delta){
|
static inline void expandPointCapacity(KGMutablePath *self,unsigned delta){
|
||||||
if(self->_numberOfPoints+delta>self->_capacityOfPoints){
|
if(self->_numberOfPoints+delta>self->_capacityOfPoints){
|
||||||
self->_capacityOfPoints=self->_numberOfPoints+delta;
|
self->_capacityOfPoints=self->_numberOfPoints+delta;
|
||||||
self->_capacityOfPoints=(self->_capacityOfPoints/32+1)*32;
|
self->_capacityOfPoints=(self->_capacityOfPoints/64+1)*64;
|
||||||
self->_points=NSZoneRealloc(NULL,self->_points,self->_capacityOfPoints*sizeof(CGPoint));
|
self->_points=NSZoneRealloc(NULL,self->_points,self->_capacityOfPoints*sizeof(CGPoint));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,14 @@ typedef void (*KGPaintReadSpan_lRGBAffff_PRE_function)(KGPaint *self,int x,int y
|
|||||||
-init;
|
-init;
|
||||||
|
|
||||||
void KGPaintSetSurfaceToPaintMatrix(KGPaint *self,CGAffineTransform surfaceToPaintMatrix);
|
void KGPaintSetSurfaceToPaintMatrix(KGPaint *self,CGAffineTransform surfaceToPaintMatrix);
|
||||||
void KGPaintReadSpan_lRGBA8888_PRE(KGPaint *self,int x,int y,KGRGBA8888 *span,int length);
|
|
||||||
void KGPaintReadSpan_lRGBAffff_PRE(KGPaint *self,int x,int y,KGRGBAffff *span,int length);
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
static inline void KGPaintReadSpan_lRGBA8888_PRE(KGPaint *self,int x,int y,KGRGBA8888 *span,int length) {
|
||||||
|
self->_read_lRGBA8888_PRE(self,x,y,span,length);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void KGPaintReadSpan_lRGBAffff_PRE(KGPaint *self,int x,int y,KGRGBAffff *span,int length) {
|
||||||
|
self->_read_lRGBAffff_PRE(self,x,y,span,length);
|
||||||
|
}
|
||||||
|
@ -39,14 +39,5 @@ void KGPaintSetSurfaceToPaintMatrix(KGPaint *self,CGAffineTransform surfaceToPai
|
|||||||
self->m_surfaceToPaintMatrix = surfaceToPaintMatrix;
|
self->m_surfaceToPaintMatrix = surfaceToPaintMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KGPaintReadSpan_lRGBA8888_PRE(KGPaint *self,int x,int y,KGRGBA8888 *span,int length) {
|
|
||||||
self->_read_lRGBA8888_PRE(self,x,y,span,length);
|
|
||||||
}
|
|
||||||
|
|
||||||
void KGPaintReadSpan_lRGBAffff_PRE(KGPaint *self,int x,int y,KGRGBAffff *span,int length) {
|
|
||||||
self->_read_lRGBAffff_PRE(self,x,y,span,length);
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@
|
|||||||
<integer>5</integer>
|
<integer>5</integer>
|
||||||
<key>IBOpenObjects</key>
|
<key>IBOpenObjects</key>
|
||||||
<array>
|
<array>
|
||||||
<integer>2</integer>
|
|
||||||
<integer>29</integer>
|
<integer>29</integer>
|
||||||
|
<integer>21</integer>
|
||||||
</array>
|
</array>
|
||||||
<key>IBSystem Version</key>
|
<key>IBSystem Version</key>
|
||||||
<string>9D34</string>
|
<string>9D34</string>
|
||||||
|
Binary file not shown.
@ -78,8 +78,9 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
unsigned char *kgData=[_kgContext bytes];
|
unsigned char *kgData=[_kgContext bytes];
|
||||||
|
|
||||||
char *diff=NSZoneMalloc([self zone],[_kgContext bytesPerRow]*[_kgContext pixelsHigh]);
|
char *diff=NSZoneMalloc([self zone],[_kgContext bytesPerRow]*[_kgContext pixelsHigh]);
|
||||||
int i;
|
int i,max=[_kgContext bytesPerRow]*[_kgContext pixelsHigh];
|
||||||
for(i=0;i<[_kgContext bytesPerRow]*[_kgContext pixelsHigh];i++){
|
|
||||||
|
for(i=0;i<max;i++){
|
||||||
int d1=cgData[i];
|
int d1=cgData[i];
|
||||||
int d2=kgData[i];
|
int d2=kgData[i];
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
|
||||||
FE0997430D87095000033630 /* overlay.png in Resources */ = {isa = PBXBuildFile; fileRef = FE0997420D87095000033630 /* overlay.png */; };
|
FE0997430D87095000033630 /* overlay.png in Resources */ = {isa = PBXBuildFile; fileRef = FE0997420D87095000033630 /* overlay.png */; };
|
||||||
|
FE11A3C70DFA3DB900356918 /* libSaturn.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FE11A3C60DFA3DB900356918 /* libSaturn.dylib */; };
|
||||||
FE14EC4B0DBD9BF00070928C /* DemoCGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE14EC490DBD9BF00070928C /* DemoCGContext.m */; };
|
FE14EC4B0DBD9BF00070928C /* DemoCGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE14EC490DBD9BF00070928C /* DemoCGContext.m */; };
|
||||||
FE14EC4C0DBD9BF00070928C /* DemoKGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE14EC4A0DBD9BF00070928C /* DemoKGContext.m */; };
|
FE14EC4C0DBD9BF00070928C /* DemoKGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE14EC4A0DBD9BF00070928C /* DemoKGContext.m */; };
|
||||||
FE14EC960DBDA5420070928C /* DemoContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE14EC950DBDA5420070928C /* DemoContext.m */; };
|
FE14EC960DBDA5420070928C /* DemoContext.m in Sources */ = {isa = PBXBuildFile; fileRef = FE14EC950DBDA5420070928C /* DemoContext.m */; };
|
||||||
@ -100,6 +101,7 @@
|
|||||||
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||||
8D1107320486CEB800E47090 /* SWRender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SWRender.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
8D1107320486CEB800E47090 /* SWRender.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SWRender.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
FE0997420D87095000033630 /* overlay.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = overlay.png; sourceTree = "<group>"; };
|
FE0997420D87095000033630 /* overlay.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = overlay.png; sourceTree = "<group>"; };
|
||||||
|
FE11A3C60DFA3DB900356918 /* libSaturn.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libSaturn.dylib; path = /usr/lib/libSaturn.dylib; sourceTree = "<absolute>"; };
|
||||||
FE1474D20DB44967001B5634 /* KGBlending.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KGBlending.h; path = ../../AppKit/CoreGraphics.subproj/KGBlending.h; sourceTree = "<group>"; };
|
FE1474D20DB44967001B5634 /* KGBlending.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KGBlending.h; path = ../../AppKit/CoreGraphics.subproj/KGBlending.h; sourceTree = "<group>"; };
|
||||||
FE14EC480DBD9BF00070928C /* DemoContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoContext.h; sourceTree = "<group>"; };
|
FE14EC480DBD9BF00070928C /* DemoContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoContext.h; sourceTree = "<group>"; };
|
||||||
FE14EC490DBD9BF00070928C /* DemoCGContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoCGContext.m; sourceTree = "<group>"; };
|
FE14EC490DBD9BF00070928C /* DemoCGContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoCGContext.m; sourceTree = "<group>"; };
|
||||||
@ -239,6 +241,7 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
|
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
|
||||||
|
FE11A3C70DFA3DB900356918 /* libSaturn.dylib in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -273,6 +276,7 @@
|
|||||||
29B97314FDCFA39411CA2CEA /* SWRender */ = {
|
29B97314FDCFA39411CA2CEA /* SWRender */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
FE11A3C60DFA3DB900356918 /* libSaturn.dylib */,
|
||||||
FE21384A0DC2303100CEDC65 /* ImageIO */,
|
FE21384A0DC2303100CEDC65 /* ImageIO */,
|
||||||
FE14EC950DBDA5420070928C /* DemoContext.m */,
|
FE14EC950DBDA5420070928C /* DemoContext.m */,
|
||||||
FE14EC480DBD9BF00070928C /* DemoContext.h */,
|
FE14EC480DBD9BF00070928C /* DemoContext.h */,
|
||||||
@ -614,11 +618,11 @@
|
|||||||
GCC_ENABLE_CPP_EXCEPTIONS = NO;
|
GCC_ENABLE_CPP_EXCEPTIONS = NO;
|
||||||
GCC_ENABLE_CPP_RTTI = NO;
|
GCC_ENABLE_CPP_RTTI = NO;
|
||||||
GCC_ENABLE_SSE3_EXTENSIONS = YES;
|
GCC_ENABLE_SSE3_EXTENSIONS = YES;
|
||||||
GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = NO;
|
GCC_ENABLE_SUPPLEMENTAL_SSE3_INSTRUCTIONS = YES;
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||||
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
|
GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = NO;
|
||||||
GCC_MODEL_TUNING = "";
|
GCC_MODEL_TUNING = "";
|
||||||
GCC_OPTIMIZATION_LEVEL = s;
|
GCC_OPTIMIZATION_LEVEL = 3;
|
||||||
GCC_UNROLL_LOOPS = YES;
|
GCC_UNROLL_LOOPS = YES;
|
||||||
GCC_VERSION = 4.2;
|
GCC_VERSION = 4.2;
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
|
||||||
@ -630,7 +634,7 @@
|
|||||||
GENERATE_PROFILING_CODE = NO;
|
GENERATE_PROFILING_CODE = NO;
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
INSTALL_PATH = "$(HOME)/Applications";
|
INSTALL_PATH = "$(HOME)/Applications";
|
||||||
OTHER_LDFLAGS = "";
|
OTHER_LDFLAGS = "-lgcov";
|
||||||
PRODUCT_NAME = SWRender;
|
PRODUCT_NAME = SWRender;
|
||||||
SDKROOT = "";
|
SDKROOT = "";
|
||||||
WRAPPER_EXTENSION = app;
|
WRAPPER_EXTENSION = app;
|
||||||
|
Loading…
Reference in New Issue
Block a user