10596 if (__isExternalAddress(aGCId) |
10596 if (__isExternalAddress(aGCId) |
10597 && __isNonNilObject(aString) |
10597 && __isNonNilObject(aString) |
10598 && __bothSmallInteger(index1, index2) |
10598 && __bothSmallInteger(index1, index2) |
10599 && __bothSmallInteger(x, y)) |
10599 && __bothSmallInteger(x, y)) |
10600 { |
10600 { |
10601 struct gcData *gcData = _GCDATA(aGCId); |
10601 struct gcData *gcData; |
10602 int pX, pY; |
10602 int pX, pY; |
10603 HDC hDC = _getDC(gcData); |
10603 HDC hDC; |
10604 HFONT hOldFont; |
10604 HFONT hOldFont; |
10605 |
10605 |
|
10606 i1 = __intVal(index1) - 1; |
|
10607 i2 = __intVal(index2) - 1; |
|
10608 if ((i1 < 0) || (i2 < i1)) { |
|
10609 RETURN (self); |
|
10610 } |
|
10611 |
|
10612 gcData = _GCDATA(aGCId); |
|
10613 hDC = _getDC(gcData); |
10606 pX = __intVal(x); |
10614 pX = __intVal(x); |
10607 pY = __intVal(y); |
10615 pY = __intVal(y); |
10608 pY -= gcData->fontAscent; |
10616 pY -= gcData->fontAscent; |
10609 |
10617 |
10610 if (opaque == true) { |
10618 if (opaque == true) { |
10630 GcDataGetPen(hDC, gcData); |
10638 GcDataGetPen(hDC, gcData); |
10631 #endif |
10639 #endif |
10632 |
10640 |
10633 cls = __qClass(aString); |
10641 cls = __qClass(aString); |
10634 |
10642 |
10635 i1 = __intVal(index1) - 1; |
10643 cp = __stringVal(aString); |
10636 i2 = __intVal(index2) - 1; |
10644 l = i2 - i1 + 1; |
10637 if (i1 >= 0 && i2 >= i1) { |
10645 if (l > 32758) { |
10638 cp = __stringVal(aString); |
10646 /* Windows (as in XP) limits the string size for TextOut* to 32758 */ |
10639 l = i2 - i1 + 1; |
10647 l = 32758; |
10640 if (l > 32758) { |
10648 } |
10641 /* Windows (as in XP) limits the string size for TextOut* to 32758 */ |
10649 |
10642 l = 32758; |
10650 if (__isStringLike(aString)) { |
10643 } |
10651 n = __stringSize(aString); |
10644 |
|
10645 if (__isStringLike(aString)) { |
|
10646 n = __stringSize(aString); |
|
10647 commonOutChars: |
10652 commonOutChars: |
10648 if (i2 < n) { |
10653 if (i2 < n) { |
10649 cp += i1; |
10654 cp += i1; |
10650 CPRINTF(("string1: %s pos=%d/%d l=%d hDC=%x\n", cp, pX, pY,l,hDC)); |
10655 CPRINTF(("string1: %s pos=%d/%d l=%d hDC=%x\n", cp, pX, pY,l,hDC)); |
10651 if (! TextOutA(hDC, pX, pY, (char *)cp, l)) { |
10656 if (! TextOutA(hDC, pX, pY, (char *)cp, l)) { |
10652 PRINTF(("WinWorkstation [warning]: TextOutA failed. [%d]\n", __LINE__)); |
10657 PRINTF(("WinWorkstation [warning]: TextOutA failed. [%d]\n", __LINE__)); |
10653 PRINTF(("WinWorkstation [warning]: lastError=%d x:%d y:%d len:%d\n", GetLastError(), pX, pY, l)); |
10658 PRINTF(("WinWorkstation [warning]: lastError=%d x:%d y:%d len:%d\n", GetLastError(), pX, pY, l)); |
10654 goto error; |
10659 goto error; |
10655 } |
10660 } |
|
10661 } |
|
10662 goto ret; |
|
10663 } |
|
10664 |
|
10665 nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); |
|
10666 cp += nInstBytes; |
|
10667 n = __byteArraySize(aString) - nInstBytes; |
|
10668 |
|
10669 if (__isBytes(aString)) { |
|
10670 goto commonOutChars; |
|
10671 } |
|
10672 |
|
10673 /* Unicode */ |
|
10674 if (__isWords(aString)) { |
|
10675 n = n / 2; |
|
10676 if (i2 < n) { |
|
10677 WIDECHAR *w_cp = (WIDECHAR *)cp; |
|
10678 w_cp += i1; |
|
10679 if (! TextOutW(hDC, pX, pY, w_cp, l)) { |
|
10680 PRINTF(("WinWorkstation [warning]: TextOutW failed. [%d]\n", __LINE__)); |
|
10681 PRINTF(("WinWorkstation [warning]: lastError=%d x:%d y:%d len:%d\n", GetLastError(), pX, pY, l)); |
10656 } |
10682 } |
10657 goto ret; |
10683 goto ret; |
10658 } |
|
10659 |
|
10660 nInstBytes = __OBJS2BYTES__(__intVal(__ClassInstPtr(cls)->c_ninstvars)); |
|
10661 cp += nInstBytes; |
|
10662 n = __byteArraySize(aString) - nInstBytes; |
|
10663 |
|
10664 if (__isBytes(aString)) { |
|
10665 goto commonOutChars; |
|
10666 } |
|
10667 |
|
10668 /* Unicode */ |
|
10669 if (__isWords(aString)) { |
|
10670 n = n / 2; |
|
10671 if (i2 < n) { |
|
10672 WIDECHAR *w_cp = (WIDECHAR *)cp; |
|
10673 w_cp += i1; |
|
10674 if (! TextOutW(hDC, pX, pY, w_cp, l)) { |
|
10675 PRINTF(("WinWorkstation [warning]: TextOutW failed. [%d]\n", __LINE__)); |
|
10676 PRINTF(("WinWorkstation [warning]: lastError=%d x:%d y:%d len:%d\n", GetLastError(), pX, pY, l)); |
|
10677 } |
|
10678 goto ret; |
|
10679 } |
|
10680 } |
10684 } |
10681 } |
10685 } |
10682 ret:; |
10686 ret:; |
10683 #if 0 |
10687 #if 0 |
10684 GcDataReleasePen(hDC, gcData); |
10688 GcDataReleasePen(hDC, gcData); |