* disabled color correction and fiddled some more with the translation

transformation, so getpixel works even better (hopefully 100% now)
  * fixed usage of lineclipped when using native line drawing functions
  * window was one pixel less tall than the intended resolution,
    and clearviewport did not clear the entire offscreen buffer
  - commented out some debugging code

git-svn-id: trunk@8353 -
This commit is contained in:
Jonas Maebe 2007-09-02 14:57:01 +00:00
parent 7e5f13cc45
commit d9691d5c53

View File

@ -105,7 +105,8 @@ const
kEventClassFPCGraph = $46504367; // 'FPCg'
kEventInitGraph = $496E6974; // 'Init'
kEventFlush = $466c7368; // 'Flsh'
kEventCloseGraph = $446f6e65; // 'Done'
kEventCloseGraph = $446f6e65; // 'Done'
kEventQuit = $51756974; // 'Quit'
kEventGraphInited = $49746564 ; // Ited;
kEventGraphClosed = $436c6564 ; // Cled;
@ -113,9 +114,10 @@ const
// initGraphSpec : EventTypeSpec = (eventClass: kEventClassFPCGraph; eventKind: kEventInitGraph);
// flushGraphSpec : EventTypeSpec = (eventClass: kEventClassFPCGraph; eventKind: kEventFlush);
// closeGraphSpec : EventTypeSpec = (eventClass: kEventClassFPCGraph; eventKind: kEventCloseGraph);
allGraphSpec: array[0..2] of EventTypeSpec = ((eventClass: kEventClassFPCGraph; eventKind: kEventInitGraph),
allGraphSpec: array[0..3] of EventTypeSpec = ((eventClass: kEventClassFPCGraph; eventKind: kEventInitGraph),
(eventClass: kEventClassFPCGraph; eventKind: kEventFlush),
(eventClass: kEventClassFPCGraph; eventKind: kEventCloseGraph));
(eventClass: kEventClassFPCGraph; eventKind: kEventCloseGraph),
(eventClass: kEventClassFPCGraph; eventKind: kEventQuit));
GraphInitedSpec: array[0..0] of EventTypeSpec = ((eventClass: kEventClassFPCGraph; eventKind: kEventGraphInited));
GraphClosedSpec: array[0..0] of EventTypeSpec = ((eventClass: kEventClassFPCGraph; eventKind: kEventGraphClosed));
@ -255,7 +257,7 @@ begin
bitmapBytesPerRow := (pixelsWide * 4);// always draw in 24 bit colour (+ 8 bit alpha)
bitmapByteCount := (bitmapBytesPerRow * pixelsHigh);
colorSpace := CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);// 2
colorSpace := CGColorSpaceCreateDeviceRGB;// 2
bitmapData := getmem ( bitmapByteCount );// 3
if (bitmapData = nil) then
exit;
@ -275,7 +277,7 @@ begin
end;
CGColorSpaceRelease( colorSpace );
{ disable anti-aliasing }
CGContextTranslateCTM(CreateBitmapContext,0.5,-0.5);
CGContextTranslateCTM(CreateBitmapContext,0.5,0.5);
end;
@ -361,9 +363,9 @@ function MyDrawEventHandler (myHandler: EventHandlerCallRef;
CGContextDrawImage(myContext,
bounds,
img);
CGImageRelease(img);
updatepending:=false;
LeaveCriticalSection(graphdrawing);
CGImageRelease(img);
end;
@ -426,8 +428,6 @@ begin
LeaveCriticalSection(graphdrawing);
lastcolor:=color;
end
// else
// writeln('color was already set: ',color);
end;
@ -536,7 +536,7 @@ begin
if not ClipCoords(X,Y) then
exit;
p := pbyte(CGBitmapContextGetData(offscreen));
y:=maxy-(y-1);
y:=maxy-y;
inc(p,(y*(maxx+1)+x)*4);
red:=p^;
green:=(p+1)^;
@ -575,7 +575,7 @@ procedure q_clrviewproc;
begin
q_SetColor(CurrentBkColor);
EnterCriticalSection(graphdrawing);
CGContextFillRect(offscreen,CGRectMake(StartXViewPort,StartYViewPort,ViewWidth,ViewHeight));
CGContextFillRect(offscreen,CGRectMake(StartXViewPort,StartYViewPort,ViewWidth+1,ViewHeight+1));
UpdateScreen;
LeaveCriticalSection(graphdrawing);
{ reset coordinates }
@ -625,7 +625,7 @@ begin
y1 := y1 + StartYViewPort;
y2 := y2 + StartYViewPort;
if ClipPixels then
if LineClipped(x1,y2,x2,y2,StartXViewPort,StartYViewPort,
if LineClipped(x1,y1,x2,y2,StartXViewPort,StartYViewPort,
StartXViewPort+ViewWidth, StartYViewPort+ViewHeight) then
exit;
if (CurrentWriteMode = NotPut) then
@ -661,7 +661,7 @@ begin
y1 := y1 + StartYViewPort;
y2 := y2 + StartYViewPort;
if ClipPixels then
if LineClipped(x1,y2,x2,y2,StartXViewPort,StartYViewPort,
if LineClipped(x1,y1,x2,y2,StartXViewPort,StartYViewPort,
StartXViewPort+ViewWidth, StartYViewPort+ViewHeight) then
exit;
if (CurrentWriteMode = NotPut) then
@ -773,13 +773,13 @@ begin
or kWindowNoUpdatesAttribute;
SetRect (contentRect, 0, 0,
MaxX, MaxY);
MaxX+1, MaxY+1);
CreateNewWindow (kDocumentWindowClass, windowAttrs,// 3
contentRect, myMainWindow);
SetRect (contentRect, 0, 50,
MaxX, 50+MaxY);
MaxX+1, 51+MaxY);
SetWindowBounds(myMainWindow,kWindowContentRgn,contentrect);
titleKey := CFSTR('Graph Window'); // 4
@ -792,8 +792,8 @@ begin
begin
top:=0;
left:=0;
bottom:=MaxY;
right:=MaxX;
bottom:=MaxY+1;
right:=MaxX+1;
end;
offscreen:=CreateBitmapContext(MaxX+1,MaxY+1);
@ -835,19 +835,19 @@ begin
ShowWindow (myMainWindow);
{
write('view is active: ',HIViewIsActive(graphHIView,@b));
writeln(', latent: ',b);
writeln('compositing enabled: ',HIViewIsCompositingEnabled(graphHIView));
writeln('visible before: ',HIViewIsVisible(graphHIView));
write('drawing enabled: ',HIViewIsDrawingEnabled(graphHIView));
writeln(', latent: ',b);
write('view is enabled: ',HIViewIsEnabled(graphHIView,@b));
writeln(', latent: ',b);
write('view is active: ',HIViewIsActive(graphHIView,@b));
writeln(', latent: ',b);
writeln('compositing enabled: ',HIViewIsCompositingEnabled(graphHIView));
writeln('visible before: ',HIViewIsVisible(graphHIView));
write('drawing enabled: ',HIViewIsDrawingEnabled(graphHIView));
writeln(', latent: ',b);
write('view is enabled: ',HIViewIsEnabled(graphHIView,@b));
writeln(', latent: ',b);
err := HIViewGetBounds(graphHIView,hiviewbounds);
writeln('err, ',err,' (',hiviewbounds.origin.x:0:2,',',hiviewbounds.origin.y:0:2,'),(',hiviewbounds.size.width:0:2,',',hiviewbounds.size.height:0:2,')');
err := HIViewGetBounds(graphHIView,hiviewbounds);
writeln('err, ',err,' (',hiviewbounds.origin.x:0:2,',',hiviewbounds.origin.y:0:2,'),(',hiviewbounds.size.width:0:2,',',hiviewbounds.size.height:0:2,')');
}
end;
@ -1011,26 +1011,32 @@ var
begin
// writeln('in GraphEventHandler, event: ',FourCharArray(GetEventKind(event)));
newEvent := nil;
if (GetEventKind(event) = kEventInitGraph) then
begin
q_initmodeproc;
if (GetEventParameter(event,FOUR_CHAR_CODE('Src '), typeVoidPtr, nil, sizeof(EventQueueRef), nil, @source) <> noErr) then
runerror(218);
if (CreateEvent(nil, kEventClassFPCGraph, kEventGraphInited, GetCurrentEventTime(), 0, newEvent) <> noErr) then
runerror(218);
end
else if (GetEventKind(event) = kEventCloseGraph) then
begin
q_donegraph;
if (GetEventParameter(event,FOUR_CHAR_CODE('Src '), typeVoidPtr, nil, sizeof(EventQueueRef), nil, @source) <> noErr) then
runerror(218);
if (CreateEvent(nil, kEventClassFPCGraph, kEventGraphClosed, GetCurrentEventTime(), 0, newEvent) <> noErr) then
runerror(218);
end
else if (GetEventKind(event) = kEventFlush) then
begin
HIViewSetNeedsDisplay(graphHIView, true);
end;
case GetEventKind(event) of
kEventInitGraph:
begin
q_initmodeproc;
if (GetEventParameter(event,FOUR_CHAR_CODE('Src '), typeVoidPtr, nil, sizeof(EventQueueRef), nil, @source) <> noErr) then
runerror(218);
if (CreateEvent(nil, kEventClassFPCGraph, kEventGraphInited, GetCurrentEventTime(), 0, newEvent) <> noErr) then
runerror(218);
end;
kEventCloseGraph:
begin
q_donegraph;
if (GetEventParameter(event,FOUR_CHAR_CODE('Src '), typeVoidPtr, nil, sizeof(EventQueueRef), nil, @source) <> noErr) then
runerror(218);
if (CreateEvent(nil, kEventClassFPCGraph, kEventGraphClosed, GetCurrentEventTime(), 0, newEvent) <> noErr) then
runerror(218);
end;
kEventFlush:
begin
HIViewSetNeedsDisplay(graphHIView, true);
end;
kEventQuit:
begin
QuitApplicationEventLoop;
end;
end;
if assigned(newEvent) then
if PostEventToQueue(source,newEvent,kEventPriorityStandard) <> noErr then
runerror(218);
@ -1039,41 +1045,57 @@ begin
end;
var
proctorun: TGraphProgram;
var
proctorun: TGraphProgram;
function wrapper(p: pointer): longint;
(*
var
event : EventRef;
*)
begin
wrapper:=proctorun(nil);
halt(wrapper);
(*
if (CreateEvent(nil, kEventClassFPCGraph, kEventQuit, GetCurrentEventTime(), 0, event) <> noErr) then
exit;
if (PostEventToQueue(MainEventQueue,event,kEventPriorityLow) <> noErr) then
begin
ReleaseEvent(event);
halt(wrapper);
end;
*)
end;
procedure StartGraphProgram(p: TGraphProgram);
var
taskid: mptaskid;
eventRec: eventrecord;
begin
if InstallEventHandler (GetApplicationEventTarget,
NewEventHandlerUPP (@GraphEventHandler),
length(allGraphSpec),
@allGraphSpec,
nil,
nil) <> noErr then
begin
_GraphResult:=grError;
exit;
end;
proctorun:=p;
function wrapper(p: pointer): longint;
begin
halt(proctorun(nil));
end;
{ main program has to be the first one to access the event queue, see }
{ http://lists.apple.com/archives/carbon-dev/2007/Jun/msg00612.html }
eventavail(0,eventRec);
maineventqueue:=GetMainEventQueue;
BeginThread(@wrapper);
RunApplicationEventLoop;
end;
procedure StartGraphProgram(p: TGraphProgram);
var
taskid: mptaskid;
eventRec: eventrecord;
begin
if InstallEventHandler (GetApplicationEventTarget,
NewEventHandlerUPP (@GraphEventHandler),
length(allGraphSpec),
@allGraphSpec,
nil,
nil) <> noErr then
begin
_GraphResult:=grError;
exit;
end;
proctorun:=p;
{ main program has to be the first one to access the event queue, see }
{ http://lists.apple.com/archives/carbon-dev/2007/Jun/msg00612.html }
eventavail(0,eventRec);
maineventqueue:=GetMainEventQueue;
BeginThread(@wrapper);
RunApplicationEventLoop;
end;
initialization
initcriticalsection(graphdrawing);
InitializeGraph;