Sie sind nicht angemeldet.

1

Samstag, 1. September 2018, 18:18

Parameterrückgabe

In der Doku steht, dass MSG_GO_GET_SIZE die Objektbreite und -höhe in bpaxcxdx zurückgibt. Was bedeutet diese Schreibweise? Ich weiß, dass Breite und Höhe jeweils ein DWord benötigen (int und frac). Heißt das, dass z.B. die Breite mit ihrem Int-Teil in bp und mit dem frac-Teil in ax steht, oder ist es nicht so einfach?

Wilfried

2

Montag, 3. September 2018, 15:12

Hallo Wilfried,
im Prinzip sollte es so einfach sein. Allerdings würde ich ausprobieren ob die Breite in bp & ax oder in cx & dx steht. Auch wo Frac und wo int Teil stehen würde ich durch einen Test verifizieren.
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

3

Montag, 3. September 2018, 17:08

Hallo Rainer,

wäre ja schön, wenn wirklich was mal so einfach wäre. Ich hätte es auch schon ausprobiert, aber leider gibt es (wiedermal) eine Hürde. Bei Übergabe des Empfängerobjekts (optr) mit movdw bxsi, objekt erfolgt stets der Absturz. Bei meinen anderen asm-Prozeduren (da ist der GrafikAttributeManager GOAM das Ziel) hab ich's auch so gemacht und da funktioniert es.

Wilfried

4

Dienstag, 4. September 2018, 17:23

Vielleicht wird bx bzw si benutzt und enthält wichtige Daten? -> vorher push, dann pop?
Oder der Befehl lädt den optr falsch rum in die Register (si, bx vertrauscht) ?
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

5

Mittwoch, 5. September 2018, 12:03

Hallo Rainer,

ich denke, dass ich die Ursache für den KR-09 gefunden habe. Ich habe die asm-Prozedur mit Swat untersucht und zunächst alle Anweisungen (außer push bp und pop bp) auskommentiert -> kein Fehler. Dann habe ich als Erstes die Zeile movdw bxsi, objekt wieder eingefügt -> kein Fehler! Dann auch die anderen Anweisungen eingefügt -> kein Fehler. Bei all diesen Versuchen war ich nach Abarbeitung der eingefügten Zeilen aus Swat ausgestiegen und hatte auch das Target geschlossen. Nach Einfügen der letzten Zeile bin dann im Einzelschrittmodus weitergegangen. Die Prozedur wurde ordentlich abgeschlossen. Und nun kam es: Ich hatte meinen asm-Aufruf in eine Block-Klammer eingeschlossen.

memBlock = OptrToHandle(objekt);
ObjLockObjBlock(memBlock);
@call objekt::MSG_GO_GET_CENTER(&center);

size = ohb(objekt);

MemUnlock(memBlock);

Bei MemUnlock kam dann Illegal Handle. Ich weiß nicht warum, aber der Aufruf von ohb(objekt) nach MemUnlock brachte dann keinen Fehler mehr. Kann es sein, dass der Unlock-Befehl bereits in der asm-Routine gebracht wird und es dann in der GOC-Methode nichts mehr zum Unlocken gibt?

Ich habe die Register bpaxcxdx einzeln ausgelesen (mehrfach). Sie enthalten bei beliebigen Grafik-Objekten immer jeweils dieselben Werte. MSG_GO_GET_SIZE scheint also auch auf asm-Ebene nicht zu funktionieren.

Gruß

Wilfried

6

Mittwoch, 5. September 2018, 15:08


...
@call objekt::MSG_GO_GET_CENTER(&center);
...
MSG_GO_GET_SIZE scheint also auch auf asm-Ebene nicht zu funktionieren.


Watt'n nu? CENTER oder SIZE? :love:
d[ 0_O ]b

7

Mittwoch, 5. September 2018, 17:18

Hallo Jörg,

MSG_GO_GET_POSITION und MSG_GO_GET_CENTER gehen einwandfrei, das Zielobjekt muss aber 'gelockt' werden. MSG_GO_GET_SIZE liefert von GOC aus nur Nullwerte, deshalb habe ich versucht, diese Message auf asm-Ebene zu schicken. Und ich dachte, der Aufruf der Funktion, die dann die asm-Prozedur aufruft, müsste auch gelockt werden. Das war ein falscher Gedanke.

Wilfried

8

Mittwoch, 5. September 2018, 22:24

Hmmm... Was ist denn mit den "get bounds" Funktionen? Liefern die etwas?

@message void MSG_GO_GET_WWF_PARENT_BOUNDS (RectWWFixed *retValue = ss:bp);
/*
* Returns the RectWWFixed that surrounds the children in
* PARENT coordinate system.
*
* Only children in groups are guaranteed to have
* bounds that can be expressed in WWFixed so this
* message can only be sent to children in groups
*
* NOTE: this message handler is not used internally so subclassing
* it will do nothing. It is merely provided as an external interface
*
* PASS
* ss:bp - RectWWFixed
*
* RETURN
* ss:bp - RectWWFixed
*
* DESTROYED:
* ax
*/


@message void MSG_GO_GET_WWF_OBJECT_BOUNDS ( /* XXX */
RectWWFixed *retValue = ss:bp);
/*
* Returns the RectWWFixed that surrounds the children in
* OBJECT coordinate system
*
* NOTE: this message handler is not used internally so subclassing
* it will do nothing. It is merely provided as an external interface
*
* PASS
* ss:bp - RectWWFixed
*
* RETURN
* ss:bp - RectWWFixed
*
* DESTROYED:
* ax
*/

GrGetGStringBounds()
void GrGetGStringBounds(
GStringHandle source, /* GString to be checked */
GStateHandle dest, /* handle of GState to use */
GSControl flags, /* GSControl flags */
Rectangle * bounds); /* returned bounds of GState */
This routine returns the coordinate bounds of the source GString drawn at the current position in the GString. The dest GState will be used if passed; to have no GState restrictions, pass a null handle. The bounds of the smallest containing rectangle will be returned in the structure pointed to by bounds .

Include: gstring.h

GrGetGStringBoundsDWord
void GrGetGStringBoundsDWord(
Handle gstring, /* GString to be checked */
GStateHandle gstate, /* handle of GState to use */
GSControl flags, /* GSControl flags */
RectDWord * bounds); /* returned bounds of GState */
This routine behaves as GrGetGStringBounds() , but has been alterred to work with 32-bit graphics spaces.

This routine returns the coordinate bounds of aGString drawn at the current position in the GString. The gstate GState will be used if passed; to have no GState restrictions, pass a null handle. The bounds of the smallest containing rectangle will be returned in the structure pointed to by bounds .

Include: gstring.h
d[ 0_O ]b

9

Donnerstag, 6. September 2018, 10:29

<<MSG_GO_GET_WWF_PARENT_BOUNDS>> Hab ich probiert. Liefert gerinfügig zu große Werte. Vermutlich wird die Liniendicke einberechnet, vielleicht auch die 'Anfasser'.

<<MSG_GO_GET_WWF_OBJECT_BOUNDS >> Liefert keine Dokument-Koordinaten.

Alle BOUNDS-Sachen liefern irgendwas um das Objekt herum, wie der Begriff ja schon ausdrückt.

Bisher hab ich die Funktion GrObjGetNormalOBJECTDimensions benutzt. Sie liefert korrekte Ergebnisse, aber nur solange das Objekt nicht transformiert (insbes. gedreht) wurde.

Mit MSG_GO_GET_CENTER und MSG_GO_GET_POSITION kann ich mir alle Maße des Objekts (unabhängig von der Liniendicke) verschaffen. Mit einer funktionierenden MSG_GO_GET_SIZE wäre es nur einfacher gewesen.

Thema bewerten