4#include "Stroika/Frameworks/StroikaPreComp.h"
6#include "Stroika/Foundation/DataExchange/BadFormatException.h"
7#if qStroika_Foundation_Common_Platform_Windows
8#include "Stroika/Foundation/Memory/Platform/Windows/Handle.h"
11#include "Stroika/Frameworks/Led/StandardStyledTextImager.h"
13#include "StyledTextEmbeddedObjects.h"
16using namespace Stroika::Frameworks;
17using namespace Stroika::Frameworks::Led;
19#if qStroika_Frameworks_Led_SupportGDI
23static struct FooBarBlatzRegistryCleanupHack {
24 ~FooBarBlatzRegistryCleanupHack ()
26 delete EmbeddedObjectCreatorRegistry::sThe;
27 EmbeddedObjectCreatorRegistry::sThe =
nullptr;
31#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
32static void MacPictureDrawSegment (StandardMacPictureStyleMarker::PictureHandle pictureHandle, Tablet* tablet,
Color foreColor,
33 Color backColor,
const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType* pixelsDrawn,
34 const Led_Size& imageSize,
const Led_Size& margin = kDefaultEmbeddingMargin)
noexcept;
36static void DIBDrawSegment (
const Led_DIB* dib, Tablet* tablet,
Color foreColor,
Color backColor,
const Led_Rect& drawInto, CoordinateType useBaseLine,
37 DistanceType* pixelsDrawn,
const Led_Size& imageSize,
const Led_Size& margin = kDefaultEmbeddingMargin)
noexcept;
38#if qStroika_Foundation_Common_Platform_MacOS
39static PixMap** MakePixMapFromDIB (
const Led_DIB* dib);
42struct UnsupportedFormat {};
45 using StackBasedHandleLocker = Memory::Platform::Windows::StackBasedHandleLocker;
53EmbeddedObjectCreatorRegistry* EmbeddedObjectCreatorRegistry::sThe =
nullptr;
55void EmbeddedObjectCreatorRegistry::AddStandardTypes ()
57#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
58 AddAssoc (StandardMacPictureStyleMarker::kClipFormat, StandardMacPictureStyleMarker::kEmbeddingTag, &StandardMacPictureStyleMarker::mk,
59 &StandardMacPictureStyleMarker::mk);
60 AddAssoc (StandardDIBStyleMarker::kClipFormat, StandardDIBStyleMarker::kEmbeddingTag, &StandardDIBStyleMarker::mk, &StandardDIBStyleMarker::mk);
63 AddAssoc (StandardURLStyleMarker::kURLDClipFormat, StandardURLStyleMarker::kEmbeddingTag, &StandardURLStyleMarker::mk, &StandardURLStyleMarker::mk);
64#if qStroika_Foundation_Common_Platform_Windows
65 AddAssoc (StandardURLStyleMarker::kWin32URLClipFormat, StandardURLStyleMarker::kEmbeddingTag, &StandardURLStyleMarker::mk,
66 &StandardURLStyleMarker::mk);
69#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
70 AddAssoc (StandardMacPictureWithURLStyleMarker::kClipFormats, StandardMacPictureWithURLStyleMarker::kClipFormatCount,
71 StandardMacPictureWithURLStyleMarker::kEmbeddingTag, &StandardMacPictureWithURLStyleMarker::mk,
72 &StandardMacPictureWithURLStyleMarker::mk);
73 AddAssoc (StandardMacPictureWithURLStyleMarker::kOld1EmbeddingTag, &StandardMacPictureWithURLStyleMarker::mk);
74 AddAssoc (StandardDIBWithURLStyleMarker::kClipFormats, StandardDIBWithURLStyleMarker::kClipFormatCount,
75 StandardDIBWithURLStyleMarker::kEmbeddingTag, &StandardDIBWithURLStyleMarker::mk, &StandardDIBWithURLStyleMarker::mk);
79bool EmbeddedObjectCreatorRegistry::Lookup (
const char* embeddingTag, Assoc* result)
const
83 const vector<EmbeddedObjectCreatorRegistry::Assoc>& types = GetAssocList ();
84 for (
size_t i = 0; i < types.size (); ++i) {
85 EmbeddedObjectCreatorRegistry::Assoc assoc = types[i];
86 if (memcmp (assoc.fEmbeddingTag, embeddingTag, sizeof (assoc.fEmbeddingTag)) == 0) {
99SimpleEmbeddedObjectStyleMarker::CommandNames SimpleEmbeddedObjectStyleMarker::sCommandNames =
100 SimpleEmbeddedObjectStyleMarker::MakeDefaultCommandNames ();
102int SimpleEmbeddedObjectStyleMarker::GetPriority ()
const
104 return eEmbeddedObjectPriority;
107DistanceType SimpleEmbeddedObjectStyleMarker::MeasureSegmentBaseLine (
const StyledTextImager* imager,
const StyleRunElement& runElement,
108 size_t from,
size_t to)
const
111 Require (from + 1 == to);
112 return (MeasureSegmentHeight (imager, runElement, from, to) - 1 * kDefaultEmbeddingMargin.v);
115void SimpleEmbeddedObjectStyleMarker::DidUpdateText (
const MarkerOwner::UpdateInfo& updateInfo)
noexcept
119 size_t newLength = GetLength ();
120 if (newLength == 0) {
121 GetOwner ()->PeekAtTextStore ()->RemoveMarker (
this);
124 else if (newLength == 1) {
125 inherited::DidUpdateText (updateInfo);
128 Assert (GetEnd () > 0);
129 GetOwner ()->PeekAtTextStore ()->SetMarkerStart (
this, GetEnd () - 1);
130 inherited::DidUpdateText (updateInfo);
138bool SimpleEmbeddedObjectStyleMarker::HandleClick (Led_Point ,
unsigned clickCount)
140 if (clickCount == 2) {
141 return HandleOpen ();
146bool SimpleEmbeddedObjectStyleMarker::HandleOpen ()
157vector<SimpleEmbeddedObjectStyleMarker::PrivateCmdNumber> SimpleEmbeddedObjectStyleMarker::GetCmdNumbers ()
const
159 return vector<PrivateCmdNumber> ();
167bool SimpleEmbeddedObjectStyleMarker::IsCmdEnabled (PrivateCmdNumber )
const
177SDKString SimpleEmbeddedObjectStyleMarker::GetCmdText (PrivateCmdNumber cmd)
181 return GetCommandNames ().fOpenCommandName;
196void SimpleEmbeddedObjectStyleMarker::DoCommand (PrivateCmdNumber cmd)
208SimpleEmbeddedObjectStyleMarker::CommandNames SimpleEmbeddedObjectStyleMarker::MakeDefaultCommandNames ()
210 SimpleEmbeddedObjectStyleMarker::CommandNames cmdNames;
211 cmdNames.fOpenCommandName = Led_SDK_TCHAROF (
"Open Embedding");
215#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
221#if qStroika_Foundation_Common_Platform_MacOS
222const Led_ClipFormat StandardMacPictureStyleMarker::kClipFormat = kPICTClipFormat;
223#elif qStroika_Foundation_Common_Platform_Windows
228const Led_ClipFormat StandardMacPictureStyleMarker::kClipFormat =
static_cast<Led_ClipFormat
> (::RegisterClipboardFormat (_T (
"Mac PICT Format")));
230constexpr Led_PrivateEmbeddingTag StandardMacPictureStyleMarker::kEmbeddingTag =
"Pict2";
232#if qStroika_Foundation_Common_Platform_Windows
233const Led_DIB* StandardMacPictureStyleMarker::sUnsupportedFormatPict =
nullptr;
236StandardMacPictureStyleMarker::StandardMacPictureStyleMarker (
const Led_Picture* pictData,
size_t picSize)
237 : SimpleEmbeddedObjectStyleMarker ()
238 , fPictureHandle (nullptr)
239#if qStroika_Foundation_Common_Platform_Windows
244#if qStroika_Foundation_Common_Platform_Windows
247#if qStroika_Foundation_Common_Platform_MacOS
248 fPictureHandle = (PictureHandle)Led_DoNewHandle (picSize);
249#elif qStroika_Foundation_Common_Platform_Windows
250 fPictureSize = picSize;
251 fPictureHandle = ::GlobalAlloc (GMEM_MOVEABLE, picSize);
254 StackBasedHandleLocker locker (GetPictureHandle ());
255 memcpy (locker.GetPointer (), pictData, picSize);
258StandardMacPictureStyleMarker::~StandardMacPictureStyleMarker ()
261#if qStroika_Foundation_Common_Platform_MacOS
262 ::DisposeHandle (Handle (fPictureHandle));
264 ::GlobalFree (fPictureHandle);
268SimpleEmbeddedObjectStyleMarker* StandardMacPictureStyleMarker::mk ([[maybe_unused]]
const char* embeddingTag,
const void* data,
size_t len)
270 Require (memcmp (embeddingTag, kEmbeddingTag,
sizeof (kEmbeddingTag)) == 0);
271 return (
new StandardMacPictureStyleMarker ((Led_Picture*)data, len));
274SimpleEmbeddedObjectStyleMarker* StandardMacPictureStyleMarker::mk (
ReaderFlavorPackage& flavorPackage)
278 length = flavorPackage.ReadFlavorData (kClipFormat, length, buf.data ());
279 return (mk (kEmbeddingTag, buf.data (), length));
282void StandardMacPictureStyleMarker::DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& , Tablet* tablet,
283 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
284 [[maybe_unused]]
const TextLayoutBlock& text,
const Led_Rect& drawInto,
285 const Led_Rect& , CoordinateType useBaseLine, DistanceType* pixelsDrawn)
287 Assert (from + 1 == to);
288 Require (text.PeekAtVirtualText ()[0] == kEmbeddingSentinelChar);
289 StackBasedHandleLocker locker (GetPictureHandle ());
290 MacPictureDrawSegment (GetPictureHandle (), tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
291 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
292 drawInto - Led_Point (0, imager->GetHScrollPos ()), useBaseLine, pixelsDrawn,
293 Led_GetMacPictSize ((Led_Picture*)locker.GetPointer ()));
296void StandardMacPictureStyleMarker::MeasureSegmentWidth ([[maybe_unused]]
const StyledTextImager* imager,
297 [[maybe_unused]]
const StyleRunElement& runElement, [[maybe_unused]]
size_t from,
298 [[maybe_unused]]
size_t to, [[maybe_unused]]
const Led_tChar* text,
299 DistanceType* distanceResults)
const
301 Assert (from + 1 == to);
314 StackBasedHandleLocker locker (GetPictureHandle ());
315 distanceResults[0] = Led_GetMacPictWidth ((Led_Picture*)locker.GetPointer ()) + 2 * kDefaultEmbeddingMargin.h;
318DistanceType StandardMacPictureStyleMarker::MeasureSegmentHeight ([[maybe_unused]]
const StyledTextImager* imager,
319 [[maybe_unused]]
const StyleRunElement& runElement,
320 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to)
const
322 Assert (from + 1 == to);
323 StackBasedHandleLocker locker (GetPictureHandle ());
324 return (Led_GetMacPictHeight ((Led_Picture*)locker.GetPointer ()) + 2 * kDefaultEmbeddingMargin.v);
327void StandardMacPictureStyleMarker::Write (SinkStream& sink)
329 StackBasedHandleLocker locker (GetPictureHandle ());
330 sink.write (locker.GetPointer (), GetPictureByteSize ());
335 StackBasedHandleLocker locker (GetPictureHandle ());
336 flavorPackage.AddFlavorData (kClipFormat, GetPictureByteSize (), (Led_Picture*)locker.GetPointer ());
339const char* StandardMacPictureStyleMarker::GetTag ()
const
341 return kEmbeddingTag;
350#if qStroika_Foundation_Common_Platform_MacOS
353const Led_ClipFormat StandardDIBStyleMarker::kClipFormat =
'DIB ';
354#elif qStroika_Foundation_Common_Platform_Windows
355const Led_ClipFormat StandardDIBStyleMarker::kClipFormat = CF_DIB;
356#elif qStroika_FeatureSupported_XWindows
357const Led_ClipFormat StandardDIBStyleMarker::kClipFormat = 666;
359constexpr Led_PrivateEmbeddingTag StandardDIBStyleMarker::kEmbeddingTag =
"DIB";
361#if qStroika_Foundation_Common_Platform_MacOS
362Led_Picture** StandardDIBStyleMarker::sUnsupportedFormatPict =
nullptr;
365StandardDIBStyleMarker::StandardDIBStyleMarker (
const Led_DIB* pictData)
366 : SimpleEmbeddedObjectStyleMarker ()
369#if qStroika_Foundation_Common_Platform_MacOS
373 fDIBData = Led_CloneDIB (pictData);
376StandardDIBStyleMarker::~StandardDIBStyleMarker ()
382SimpleEmbeddedObjectStyleMarker* StandardDIBStyleMarker::mk ([[maybe_unused]]
const char* embeddingTag,
const void* data,
size_t len)
384 Require (memcmp (embeddingTag, kEmbeddingTag,
sizeof (kEmbeddingTag)) == 0);
390 size_t picSize = Led_GetDIBImageByteCount ((Led_DIB*)data);
394 if (len != picSize) {
404 return (
new StandardDIBStyleMarker ((Led_DIB*)data));
407SimpleEmbeddedObjectStyleMarker* StandardDIBStyleMarker::mk (
ReaderFlavorPackage& flavorPackage)
411 length = flavorPackage.ReadFlavorData (kClipFormat, length, buf.data ());
412 return mk (kEmbeddingTag, buf.data (), length);
415void StandardDIBStyleMarker::DrawSegment (
const StyledTextImager* imager, [[maybe_unused]]
const StyleRunElement& runElement,
416 Tablet* tablet, [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
417 [[maybe_unused]]
const TextLayoutBlock& text,
const Led_Rect& drawInto,
418 const Led_Rect& , CoordinateType useBaseLine, DistanceType* pixelsDrawn)
420 Assert (from + 1 == to);
421 Require (text.PeekAtVirtualText ()[0] == kEmbeddingSentinelChar);
422 DIBDrawSegment (fDIBData, tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
423 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
424 drawInto - Led_Point (0, imager->GetHScrollPos ()), useBaseLine, pixelsDrawn, Led_GetDIBImageSize (fDIBData));
427void StandardDIBStyleMarker::MeasureSegmentWidth (
const StyledTextImager* ,
const StyleRunElement& ,
428 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
429 [[maybe_unused]]
const Led_tChar* text, DistanceType* distanceResults)
const
431 Assert (from + 1 == to);
444 distanceResults[0] = Led_GetDIBImageSize (GetDIBData ()).h + 2 * kDefaultEmbeddingMargin.h;
447DistanceType StandardDIBStyleMarker::MeasureSegmentHeight (
const StyledTextImager* ,
const StyleRunElement& ,
448 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to)
const
450 Assert (from + 1 == to);
451 return (Led_GetDIBImageSize (GetDIBData ()).v + 2 * kDefaultEmbeddingMargin.v);
454void StandardDIBStyleMarker::Write (SinkStream& sink)
456 const Led_DIB* dib = GetDIBData ();
457 size_t dibSize = Led_GetDIBImageByteCount (dib);
458 sink.write (dib, dibSize);
463 const Led_DIB* dib = GetDIBData ();
464 size_t dibSize = Led_GetDIBImageByteCount (dib);
465 flavorPackage.AddFlavorData (kClipFormat, dibSize, dib);
468const char* StandardDIBStyleMarker::GetTag ()
const
470 return kEmbeddingTag;
478#if qStroika_Foundation_Common_Platform_MacOS
479const Led_ClipFormat StandardURLStyleMarker::kURLDClipFormat =
'URLD';
480#elif qStroika_Foundation_Common_Platform_Windows
484const Led_ClipFormat StandardURLStyleMarker::kURLDClipFormat =
static_cast<Led_ClipFormat
> (::RegisterClipboardFormat (_T (
"Netscape Bookmark")));
485const Led_ClipFormat StandardURLStyleMarker::kWin32URLClipFormat =
486 static_cast<Led_ClipFormat
> (::RegisterClipboardFormat (_T (
"UniformResourceLocator")));
487#elif qStroika_FeatureSupported_XWindows
488const Led_ClipFormat StandardURLStyleMarker::kURLDClipFormat =
'URLD';
491constexpr Led_PrivateEmbeddingTag StandardURLStyleMarker::kEmbeddingTag =
"URL";
493StandardURLStyleMarker::StandardURLStyleMarker (
const Led_URLD& urlData)
494 : SimpleEmbeddedObjectStyleMarker ()
499StandardURLStyleMarker::~StandardURLStyleMarker ()
503SimpleEmbeddedObjectStyleMarker* StandardURLStyleMarker::mk ([[maybe_unused]]
const char* embeddingTag,
const void* data,
size_t len)
505 Require (memcmp (embeddingTag, kEmbeddingTag,
sizeof (kEmbeddingTag)) == 0);
506 return (
new StandardURLStyleMarker (Led_URLD (data, len)));
509SimpleEmbeddedObjectStyleMarker* StandardURLStyleMarker::mk (
ReaderFlavorPackage& flavorPackage)
514 if (flavorPackage.GetFlavorAvailable (kURLDClipFormat)) {
515 size_t length = flavorPackage.
GetFlavorSize (kURLDClipFormat);
517 length = flavorPackage.ReadFlavorData (kURLDClipFormat, length, buf.data ());
518 return (mk (kEmbeddingTag, buf.data (), length));
520#if qStroika_Foundation_Common_Platform_Windows
521 if (flavorPackage.GetFlavorAvailable (kWin32URLClipFormat)) {
522 size_t length = flavorPackage.
GetFlavorSize (kWin32URLClipFormat);
524 length = flavorPackage.ReadFlavorData (kWin32URLClipFormat, length, buf.data ());
528 return (mk (kEmbeddingTag, buf.data (), length));
536void StandardURLStyleMarker::DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& runElement, Tablet* tablet,
size_t from,
537 [[maybe_unused]]
size_t to, [[maybe_unused]]
const TextLayoutBlock& text,
const Led_Rect& drawInto,
538 const Led_Rect& , CoordinateType useBaseLine, DistanceType* pixelsDrawn)
543 Led_tString displayText = GetDisplayString ();
544 imager->DrawSegment_ (tablet, fsp, from, from + displayText.length (),
545 TextLayoutBlock_Basic (displayText.c_str (), displayText.c_str () + displayText.length ()), drawInto, useBaseLine, pixelsDrawn);
548void StandardURLStyleMarker::MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& runElement, [[maybe_unused]]
size_t from,
549 [[maybe_unused]]
size_t to, [[maybe_unused]]
const Led_tChar* text, DistanceType* distanceResults)
const
551 Assert (from + 1 == to);
566 Led_tString displayText = GetDisplayString ();
567 if (displayText.empty ()) {
568 distanceResults[0] = 0;
572 imager->MeasureSegmentWidth_ (fsp, from, from + displayText.length (), displayText.c_str (), distRes.data ());
573 distanceResults[0] = distRes[displayText.length () - 1];
577DistanceType StandardURLStyleMarker::MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& runElement,
578 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to)
const
580 Assert (from + 1 == to);
583 Led_tString displayText = GetDisplayString ();
584 return imager->MeasureSegmentHeight_ (fsp, from, from + displayText.length ());
587void StandardURLStyleMarker::Write (SinkStream& sink)
589 sink.write (fURLData.PeekAtURLD (), fURLData.GetURLDLength ());
594 flavorPackage.AddFlavorData (kURLDClipFormat, fURLData.GetURLDLength (), fURLData.PeekAtURLD ());
595#if qStroika_Foundation_Common_Platform_Windows
596 size_t len = fURLData.GetURLLength () + 1;
598 memcpy (hackBuf.data (), fURLData.PeekAtURL (), len - 1);
600 flavorPackage.AddFlavorData (kWin32URLClipFormat, len, hackBuf.data ());
604const char* StandardURLStyleMarker::GetTag ()
const
606 return kEmbeddingTag;
609bool StandardURLStyleMarker::HandleOpen ()
611 Led_URLManager::Get ().Open (fURLData.GetURL ());
616vector<StandardURLStyleMarker::PrivateCmdNumber> StandardURLStyleMarker::GetCmdNumbers ()
const
618 vector<PrivateCmdNumber> x;
619 x.push_back (eOpenCmdNum);
623bool StandardURLStyleMarker::IsCmdEnabled (PrivateCmdNumber cmd)
const
629 return inherited::IsCmdEnabled (cmd);
633const Led_URLD& StandardURLStyleMarker::GetURLData ()
const
638void StandardURLStyleMarker::SetURLData (
const Led_URLD& urlData)
643Led_tString StandardURLStyleMarker::GetDisplayString ()
const
645 string displayText = fURLData.GetTitle ();
646 if (displayText.empty ()) {
647 displayText = fURLData.GetURL ();
653 for (
auto i = displayText.begin (); i != displayText.end (); ++i) {
658 return Led_ANSIString2tString (displayText);
661FontSpecification StandardURLStyleMarker::GetDisplayFont (
const StyleRunElement& runElement)
const
664 if (
dynamic_cast<StandardStyleMarker*
> (runElement.fMarker) !=
nullptr) {
665 StandardStyleMarker* sm =
dynamic_cast<StandardStyleMarker*
> (runElement.fMarker);
666 fsp = sm->fFontSpecification;
669 for (
auto i = runElement.fSupercededMarkers.begin (); i != runElement.fSupercededMarkers.end (); ++i) {
670 StandardStyleMarker* sm =
dynamic_cast<StandardStyleMarker*
> (*i);
672 fsp = sm->fFontSpecification;
677 fsp.SetPointSize (
static_cast<unsigned short> (fsp.GetPointSize () * 1.05));
678 fsp.SetTextColor (Color::kBlue);
679 fsp.SetStyle_Underline (
true);
683#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
689const Led_ClipFormat StandardMacPictureWithURLStyleMarker::kClipFormats[] = {kPICTClipFormat, StandardURLStyleMarker::kURLDClipFormat};
690const size_t StandardMacPictureWithURLStyleMarker::kClipFormatCount =
sizeof (kClipFormats) /
sizeof (kClipFormats[0]);
691constexpr Led_PrivateEmbeddingTag StandardMacPictureWithURLStyleMarker::kEmbeddingTag =
"Pict&URL";
692constexpr Led_PrivateEmbeddingTag StandardMacPictureWithURLStyleMarker::kOld1EmbeddingTag =
"PictWEmbd";
694StandardMacPictureWithURLStyleMarker::StandardMacPictureWithURLStyleMarker (
const Led_Picture* pictData,
size_t picSize,
const Led_URLD& urlData)
695 : SimpleEmbeddedObjectStyleMarker ()
696 , fPictureHandle (nullptr)
698#if qStroika_Foundation_Common_Platform_Windows
705#if qStroika_Foundation_Common_Platform_MacOS
706 fPictureHandle = (StandardMacPictureStyleMarker::PictureHandle)Led_DoNewHandle (picSize);
707#elif qStroika_Foundation_Common_Platform_Windows
708 fPictureSize = picSize;
709 fPictureHandle = ::GlobalAlloc (GMEM_MOVEABLE, picSize);
713 StackBasedHandleLocker locker (GetPictureHandle ());
714 memcpy (locker.GetPointer (), pictData, picSize);
718StandardMacPictureWithURLStyleMarker::~StandardMacPictureWithURLStyleMarker ()
721#if qStroika_Foundation_Common_Platform_MacOS
722 ::DisposeHandle (Handle (fPictureHandle));
723#elif qStroika_Foundation_Common_Platform_Windows
724 ::GlobalFree (fPictureHandle);
728SimpleEmbeddedObjectStyleMarker* StandardMacPictureWithURLStyleMarker::mk (
const char* embeddingTag,
const void* data,
size_t len)
730 Require (memcmp (embeddingTag, kOld1EmbeddingTag,
sizeof (kOld1EmbeddingTag)) == 0 or
731 memcmp (embeddingTag, kEmbeddingTag,
sizeof (kEmbeddingTag)) == 0);
733 if (memcmp (embeddingTag, kOld1EmbeddingTag,
sizeof (kOld1EmbeddingTag)) == 0) {
734 Led_Picture* picBuf = (Led_Picture*)data;
735 size_t picSize = Led_ByteSwapFromMac (picBuf->picSize);
737 if (picSize >= len) {
740 const char* url = ((
char*)data) + picSize;
741 size_t urlSize = len - picSize;
742 Assert (urlSize > 0);
744 return new StandardMacPictureWithURLStyleMarker (picBuf, Led_ByteSwapFromMac (picBuf->picSize), Led_URLD (url, urlSize));
747 if (len < 4 + 1 +
sizeof (Led_Picture)) {
751 uint32_t picSize = *(uint32_t*)data;
752 picSize = BufToUInt32 (&picSize);
754 Led_Picture* picBuf = (Led_Picture*)((
char*)data + 4);
756 if (picSize + 4 >= len) {
759 const char* url = ((
char*)picBuf) + picSize;
760 size_t urlSize = len - 4 - picSize;
761 Assert (urlSize > 0);
763 return new StandardMacPictureWithURLStyleMarker (picBuf, picSize, Led_URLD (url, urlSize));
767SimpleEmbeddedObjectStyleMarker* StandardMacPictureWithURLStyleMarker::mk (
ReaderFlavorPackage& flavorPackage)
769 size_t pictLength = flavorPackage.
GetFlavorSize (kPICTClipFormat);
771 pictLength = flavorPackage.ReadFlavorData (kPICTClipFormat, pictLength, buf1.data ());
772 Led_Picture* picBuf = (Led_Picture*)(
char*)buf1;
774 size_t urlSize = flavorPackage.
GetFlavorSize (StandardURLStyleMarker::kURLDClipFormat);
776 urlSize = flavorPackage.ReadFlavorData (StandardURLStyleMarker::kURLDClipFormat, urlSize, buf2.data ());
777 return new StandardMacPictureWithURLStyleMarker{picBuf, pictLength, Led_URLD{buf2.data (), urlSize}};
780void StandardMacPictureWithURLStyleMarker::DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& ,
781 Tablet* tablet, [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
782 [[maybe_unused]]
const TextLayoutBlock& text,
const Led_Rect& drawInto,
783 const Led_Rect& , CoordinateType useBaseLine, DistanceType* pixelsDrawn)
785 Assert (from + 1 == to);
786 Require (text.PeekAtVirtualText ()[0] == kEmbeddingSentinelChar);
787 StackBasedHandleLocker locker (GetPictureHandle ());
788 MacPictureDrawSegment (GetPictureHandle (), tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
789 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
790 drawInto - Led_Point{0, imager->GetHScrollPos ()}, useBaseLine, pixelsDrawn,
791 Led_GetMacPictSize ((Led_Picture*)locker.GetPointer ()));
794void StandardMacPictureWithURLStyleMarker::MeasureSegmentWidth (
const StyledTextImager* ,
const StyleRunElement& ,
795 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
796 [[maybe_unused]]
const Led_tChar* text, DistanceType* distanceResults)
const
798 Assert (from + 1 == to);
811 StackBasedHandleLocker locker (GetPictureHandle ());
812 distanceResults[0] = Led_GetMacPictWidth ((Led_Picture*)locker.GetPointer ()) + 2 * kDefaultEmbeddingMargin.h;
815DistanceType StandardMacPictureWithURLStyleMarker::MeasureSegmentHeight (
const StyledTextImager* ,
const StyleRunElement& ,
816 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to)
const
818 Assert (from + 1 == to);
819 StackBasedHandleLocker locker (GetPictureHandle ());
820 return (Led_GetMacPictHeight ((Led_Picture*)locker.GetPointer ()) + 2 * kDefaultEmbeddingMargin.v);
823void StandardMacPictureWithURLStyleMarker::Write (SinkStream& sink)
826 uint32_t picSize =
static_cast<uint32_t
> (GetPictureByteSize ());
827 UInt32ToBuf (picSize, &picSize);
828 Assert (
sizeof (picSize) == 4);
829 sink.write (&picSize,
sizeof (picSize));
831 StackBasedHandleLocker locker (GetPictureHandle ());
832 sink.write ((Led_Picture*)locker.GetPointer (), GetPictureByteSize ());
833 sink.write (fURLData.PeekAtURLD (), fURLData.GetURLDLength ());
836void StandardMacPictureWithURLStyleMarker::ExternalizeFlavors (
WriterFlavorPackage& flavorPackage)
838 StackBasedHandleLocker locker (GetPictureHandle ());
839 flavorPackage.AddFlavorData (StandardMacPictureStyleMarker::kClipFormat, GetPictureByteSize (), (Led_Picture*)locker.GetPointer ());
840 flavorPackage.AddFlavorData (StandardURLStyleMarker::kURLDClipFormat, fURLData.GetURLDLength (), fURLData.PeekAtURLD ());
843bool StandardMacPictureWithURLStyleMarker::HandleOpen ()
845 Led_URLManager::Get ().Open (fURLData.GetURL ());
849vector<StandardMacPictureWithURLStyleMarker::PrivateCmdNumber> StandardMacPictureWithURLStyleMarker::GetCmdNumbers ()
const
851 vector<PrivateCmdNumber> x;
852 x.push_back (eOpenCmdNum);
856bool StandardMacPictureWithURLStyleMarker::IsCmdEnabled (PrivateCmdNumber cmd)
const
862 return inherited::IsCmdEnabled (cmd);
866const Led_URLD& StandardMacPictureWithURLStyleMarker::GetURLData ()
const
871void StandardMacPictureWithURLStyleMarker::SetURLData (
const Led_URLD& urlData)
876const char* StandardMacPictureWithURLStyleMarker::GetTag ()
const
878 return kEmbeddingTag;
887const Led_ClipFormat StandardDIBWithURLStyleMarker::kClipFormats[] = {StandardDIBStyleMarker::kClipFormat, StandardURLStyleMarker::kURLDClipFormat};
888const size_t StandardDIBWithURLStyleMarker::kClipFormatCount =
sizeof (kClipFormats) /
sizeof (kClipFormats[0]);
889const Led_PrivateEmbeddingTag StandardDIBWithURLStyleMarker::kEmbeddingTag =
"DIB&URL";
891StandardDIBWithURLStyleMarker::StandardDIBWithURLStyleMarker (
const Led_DIB* dibData,
const Led_URLD& urlData)
892 : SimpleEmbeddedObjectStyleMarker ()
896#if qStroika_Foundation_Common_Platform_MacOS
900 fDIBData = Led_CloneDIB (dibData);
903StandardDIBWithURLStyleMarker::~StandardDIBWithURLStyleMarker ()
909SimpleEmbeddedObjectStyleMarker* StandardDIBWithURLStyleMarker::mk ([[maybe_unused]]
const char* embeddingTag,
const void* data,
size_t len)
911 Require (memcmp (embeddingTag, kEmbeddingTag,
sizeof (kEmbeddingTag)) == 0);
918 uint32_t picSize = *(uint32_t*)data;
919 picSize = BufToUInt32 (&picSize);
921 Led_DIB* picBuf = (Led_DIB*)((
char*)data + 4);
927 if (picSize + 4 >= len) {
930 const char* url = ((
char*)picBuf) + picSize;
931 size_t urlSize = len - 4 - picSize;
932 Assert (urlSize > 0);
934 return new StandardDIBWithURLStyleMarker (picBuf, Led_URLD (url, urlSize));
937SimpleEmbeddedObjectStyleMarker* StandardDIBWithURLStyleMarker::mk (
ReaderFlavorPackage& flavorPackage)
939 size_t length = flavorPackage.
GetFlavorSize (StandardDIBStyleMarker::kClipFormat);
941 length = flavorPackage.ReadFlavorData (StandardDIBStyleMarker::kClipFormat, length, buf.data ());
947 size_t picSize = Led_GetDIBImageByteCount ((Led_DIB*)(
char*)buf);
951 if (length != picSize) {
953 if (length < picSize) {
962 size_t urlSize = flavorPackage.
GetFlavorSize (StandardURLStyleMarker::kURLDClipFormat);
964 urlSize = flavorPackage.ReadFlavorData (StandardURLStyleMarker::kURLDClipFormat, urlSize, buf2.data ());
966 return new StandardDIBWithURLStyleMarker{(
const Led_DIB*)(
char*)buf, Led_URLD{buf2.data (), urlSize}};
969void StandardDIBWithURLStyleMarker::DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& , Tablet* tablet,
970 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
971 [[maybe_unused]]
const TextLayoutBlock& text,
const Led_Rect& drawInto,
972 const Led_Rect& , CoordinateType useBaseLine, DistanceType* pixelsDrawn)
974 Assert (from + 1 == to);
975 Require (text.PeekAtVirtualText ()[0] == kEmbeddingSentinelChar);
976 DIBDrawSegment (fDIBData, tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
977 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
978 drawInto - Led_Point (0, imager->GetHScrollPos ()), useBaseLine, pixelsDrawn, Led_GetDIBImageSize (fDIBData));
981void StandardDIBWithURLStyleMarker::MeasureSegmentWidth (
const StyledTextImager* ,
const StyleRunElement& ,
982 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
983 [[maybe_unused]]
const Led_tChar* text, DistanceType* distanceResults)
const
985 Assert (from + 1 == to);
998 distanceResults[0] = Led_GetDIBImageSize (GetDIBData ()).h + 2 * kDefaultEmbeddingMargin.h;
1001DistanceType StandardDIBWithURLStyleMarker::MeasureSegmentHeight (
const StyledTextImager* ,
const StyleRunElement& ,
1002 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to)
const
1004 Assert (from + 1 == to);
1005 return (Led_GetDIBImageSize (GetDIBData ()).v + 2 * kDefaultEmbeddingMargin.v);
1008void StandardDIBWithURLStyleMarker::Write (SinkStream& sink)
1010 const Led_DIB* dib = GetDIBData ();
1012 uint32_t dibSize =
static_cast<uint32_t
> (Led_GetDIBImageByteCount (dib));
1013 UInt32ToBuf (dibSize, &dibSize);
1014 Assert (
sizeof (dibSize) == 4);
1015 sink.write (&dibSize,
sizeof (dibSize));
1017 sink.write (dib, Led_GetDIBImageByteCount (dib));
1018 sink.write (fURLData.PeekAtURLD (), fURLData.GetURLDLength ());
1021void StandardDIBWithURLStyleMarker::ExternalizeFlavors (
WriterFlavorPackage& flavorPackage)
1023 const Led_DIB* dib = GetDIBData ();
1024 size_t dibSize = Led_GetDIBImageByteCount (dib);
1025 flavorPackage.AddFlavorData (StandardDIBStyleMarker::kClipFormat, dibSize, dib);
1026 flavorPackage.AddFlavorData (StandardURLStyleMarker::kURLDClipFormat, fURLData.GetURLDLength (), fURLData.PeekAtURLD ());
1029bool StandardDIBWithURLStyleMarker::HandleOpen ()
1031 Led_URLManager::Get ().Open (fURLData.GetURL ());
1035vector<StandardDIBWithURLStyleMarker::PrivateCmdNumber> StandardDIBWithURLStyleMarker::GetCmdNumbers ()
const
1037 vector<PrivateCmdNumber> x;
1038 x.push_back (eOpenCmdNum);
1042bool StandardDIBWithURLStyleMarker::IsCmdEnabled (PrivateCmdNumber cmd)
const
1048 return inherited::IsCmdEnabled (cmd);
1052const Led_URLD& StandardDIBWithURLStyleMarker::GetURLData ()
const
1057void StandardDIBWithURLStyleMarker::SetURLData (
const Led_URLD& urlData)
1062const char* StandardDIBWithURLStyleMarker::GetTag ()
const
1064 return kEmbeddingTag;
1072#if qStroika_Foundation_Common_Platform_MacOS
1073Led_Picture** StandardUnknownTypeStyleMarker::sUnknownPict =
nullptr;
1074#elif qStroika_Foundation_Common_Platform_Windows
1075const Led_DIB* StandardUnknownTypeStyleMarker::sUnknownPict =
nullptr;
1077const Led_PrivateEmbeddingTag StandardUnknownTypeStyleMarker::kDefaultEmbeddingTag =
"UnknwnDlf";
1079StandardUnknownTypeStyleMarker::StandardUnknownTypeStyleMarker (Led_ClipFormat format,
const char* embeddingTag,
1080 const void* unknownTypeData,
size_t nBytes,
const Led_DIB* dib)
1081 : SimpleEmbeddedObjectStyleMarker ()
1092 memcpy (fEmbeddingTag, embeddingTag,
sizeof (fEmbeddingTag));
1093#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
1096 fData =
new char[nBytes];
1097 memcpy (fData, unknownTypeData, nBytes);
1099 if (dib !=
nullptr) {
1100#if qCannotAssignRValueAutoPtrToExistingOneInOneStepBug || qTroubleOverloadingXofXRefCTORWithTemplatedMemberCTOR
1101 unique_ptr<Led_DIB> x = unique_ptr<Led_DIB> (Led_CloneDIB (dib));
1104 fDisplayDIB = unique_ptr<Led_DIB> (Led_CloneDIB (dib));
1107 fShownSize = CalcDefaultShownSize ();
1110StandardUnknownTypeStyleMarker::~StandardUnknownTypeStyleMarker ()
1112 delete[] (
char*)fData;
1123void StandardUnknownTypeStyleMarker::SetShownSize (TWIPS_Point size)
1134TWIPS_Point StandardUnknownTypeStyleMarker::CalcDefaultShownSize ()
1136 if (fDisplayDIB.get () !=
nullptr) {
1137 Led_Size pixelSize = Led_GetDIBImageSize (fDisplayDIB.get ());
1138 return TWIPS_Point (Led_CvtScreenPixelsToTWIPSV (pixelSize.v), Led_CvtScreenPixelsToTWIPSH (pixelSize.h));
1140 return CalcStaticDefaultShownSize ();
1143TWIPS_Point StandardUnknownTypeStyleMarker::CalcStaticDefaultShownSize ()
1145#if qStroika_Foundation_Common_Platform_MacOS
1147 StackBasedHandleLocker locker (sUnknownPict);
1148 Led_Size pixelSize = Led_GetMacPictSize (sUnknownPict);
1149#elif qStroika_Foundation_Common_Platform_Windows
1151 Led_Size pixelSize = Led_GetDIBImageSize (sUnknownPict);
1152#elif qStroika_FeatureSupported_XWindows
1153 Led_Size pixelSize = Led_Size (10, 10);
1156 return TWIPS_Point (Led_CvtScreenPixelsToTWIPSV (pixelSize.v), Led_CvtScreenPixelsToTWIPSH (pixelSize.h));
1159void StandardUnknownTypeStyleMarker::DrawSegment (
const StyledTextImager* imager,
const StyleRunElement& , Tablet* tablet,
1160 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
1161 [[maybe_unused]]
const TextLayoutBlock& text,
const Led_Rect& drawInto,
1162 const Led_Rect& , CoordinateType useBaseLine, DistanceType* pixelsDrawn)
1164 Assert (from + 1 == to);
1165 Require (text.PeekAtVirtualText ()[0] == kEmbeddingSentinelChar);
1166 Led_Size shownPixelSize = Led_Size (tablet->CvtFromTWIPSV (fShownSize.v), tablet->CvtFromTWIPSH (fShownSize.h));
1168 if (fDisplayDIB.get () !=
nullptr) {
1169 DIBDrawSegment (fDisplayDIB.get (), tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
1170 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
1171 drawInto - Led_Point (0, imager->GetHScrollPos ()), useBaseLine, pixelsDrawn, shownPixelSize);
1174#if qStroika_Foundation_Common_Platform_MacOS
1175 MacPictureDrawSegment (sUnknownPict, tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
1176 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
1177 drawInto - Led_Point (0, imager->GetHScrollPos ()), useBaseLine, pixelsDrawn, shownPixelSize);
1178#elif qStroika_Foundation_Common_Platform_Windows
1179 DIBDrawSegment (sUnknownPict, tablet, imager->GetEffectiveDefaultTextColor (TextImager::eDefaultTextColor),
1180 imager->GetEffectiveDefaultTextColor (TextImager::eDefaultBackgroundColor),
1181 drawInto - Led_Point (0, imager->GetHScrollPos ()), useBaseLine, pixelsDrawn, shownPixelSize);
1185void StandardUnknownTypeStyleMarker::MeasureSegmentWidth (
const StyledTextImager* imager,
const StyleRunElement& ,
1186 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to,
1187 [[maybe_unused]]
const Led_tChar* text, DistanceType* distanceResults)
const
1189 Assert (from + 1 == to);
1202 if (fDisplayDIB.get () !=
nullptr) {
1203 distanceResults[0] = Led_GetDIBImageSize (fDisplayDIB.get ()).h + 2 * kDefaultEmbeddingMargin.h;
1206 TextInteractor::Tablet_Acquirer tablet_{imager};
1207 Tablet* tablet = tablet_;
1208 distanceResults[0] = tablet->CvtFromTWIPSH (fShownSize.h) + 2 * kDefaultEmbeddingMargin.h;
1211DistanceType StandardUnknownTypeStyleMarker::MeasureSegmentHeight (
const StyledTextImager* imager,
const StyleRunElement& ,
1212 [[maybe_unused]]
size_t from, [[maybe_unused]]
size_t to)
const
1214 Assert (from + 1 == to);
1215 if (fDisplayDIB.get () !=
nullptr) {
1216 return (Led_GetDIBImageSize (fDisplayDIB.get ()).v + 2 * kDefaultEmbeddingMargin.v);
1218 TextInteractor::Tablet_Acquirer tablet_ (imager);
1219 Tablet* tablet = tablet_;
1220 return tablet->CvtFromTWIPSV (fShownSize.v) + 2 * kDefaultEmbeddingMargin.v;
1223void StandardUnknownTypeStyleMarker::Write (SinkStream& sink)
1225 sink.write (fData, fLength);
1228void StandardUnknownTypeStyleMarker::ExternalizeFlavors (
WriterFlavorPackage& flavorPackage)
1230 flavorPackage.AddFlavorData (fFormat, fLength, fData);
1233const char* StandardUnknownTypeStyleMarker::GetTag ()
const
1235 return fEmbeddingTag;
1243void Led::InsertEmbeddingForExistingSentinel (SimpleEmbeddedObjectStyleMarker* embedding, TextStore& textStore,
size_t insertAt,
MarkerOwner* ownerForEmbedding)
1247 TextStore::SimpleUpdater updater (textStore, insertAt, insertAt + 1);
1248 textStore.AddMarker (embedding, insertAt, 1, ownerForEmbedding);
1256void Led::AddEmbedding (SimpleEmbeddedObjectStyleMarker* embedding, TextStore& textStore,
size_t insertAt,
MarkerOwner* ownerForEmbedding)
1260 textStore.Replace (insertAt, insertAt, &kEmbeddingSentinelChar, 1);
1261 InsertEmbeddingForExistingSentinel (embedding, textStore, insertAt, ownerForEmbedding);
1264#if qStroika_Foundation_Common_Platform_MacOS || qStroika_Foundation_Common_Platform_Windows
1270static void MacPictureDrawSegment (StandardMacPictureStyleMarker::PictureHandle pictureHandle, Tablet* tablet,
Color foreColor,
1271 Color backColor,
const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType* pixelsDrawn,
1272 const Led_Size& imageSize,
const Led_Size& margin)
noexcept
1276 StackBasedHandleLocker locker (pictureHandle);
1278#if qStroika_Foundation_Common_Platform_MacOS
1280#elif qStroika_Foundation_Common_Platform_Windows
1281 Tablet* dc = tablet;
1284 Led_Size pictSize = imageSize;
1286 Led_Rect ourBoundsRect = drawInto;
1287 ourBoundsRect.SetRight (ourBoundsRect.GetLeft () + pictSize.h + 2 * margin.h);
1288 CoordinateType embedBottom = useBaseLine;
1289 CoordinateType embedTop = embedBottom - pictSize.v;
1290 Assert (embedTop >= drawInto.top);
1291 Assert (embedBottom <= drawInto.bottom);
1292 Led_Rect innerBoundsRect = Led_Rect (Led_Point (embedTop, drawInto.GetLeft () + margin.h), pictSize);
1294#if qStroika_Foundation_Common_Platform_MacOS
1295 GDI_RGBForeColor (foreColor.GetOSRep ());
1296 GDI_RGBBackColor (backColor.GetOSRep ());
1297#elif qStroika_Foundation_Common_Platform_Windows
1298 dc->SetTextColor (foreColor.GetOSRep ());
1299 dc->SetBkColor (backColor.GetOSRep ());
1301 if (pixelsDrawn !=
nullptr) {
1302 *pixelsDrawn = ourBoundsRect.GetWidth ();
1307static void DIBDrawSegment (
const Led_DIB* dib, Tablet* tablet, [[maybe_unused]]
Color foreColor, [[maybe_unused]]
Color backColor,
1308 const Led_Rect& drawInto, CoordinateType useBaseLine, DistanceType* pixelsDrawn,
const Led_Size& imageSize,
1309 const Led_Size& margin)
noexcept
1314#if qStroika_Foundation_Common_Platform_MacOS
1316#elif qStroika_Foundation_Common_Platform_Windows
1317 Tablet* dc = tablet;
1320 Led_Size dibImageSize = imageSize;
1322 Led_Rect ourBoundsRect = drawInto;
1323 ourBoundsRect.right = ourBoundsRect.left + dibImageSize.h + 2 * margin.h;
1324 CoordinateType embedBottom = useBaseLine;
1325 CoordinateType embedTop = embedBottom - dibImageSize.v;
1326 Assert (embedTop >= drawInto.GetTop ());
1327 Assert (embedBottom <= drawInto.GetBottom ());
1328 Led_Rect innerBoundsRect = Led_Rect (Led_Point (embedTop, drawInto.GetLeft () + margin.h), dibImageSize);
1330 if (pixelsDrawn !=
nullptr) {
1331 *pixelsDrawn = ourBoundsRect.GetWidth ();
1334#if qStroika_Foundation_Common_Platform_MacOS
1336 GDI_RGBForeColor (Color::kBlack.GetOSRep ());
1337 GDI_RGBBackColor (Color::kWhite.GetOSRep ());
1339 GDI_RGBForeColor (foreColor.GetOSRep ());
1340 GDI_RGBBackColor (backColor.GetOSRep ());
1342#elif qStroika_Foundation_Common_Platform_Windows
1343 dc->SetTextColor (foreColor.GetOSRep ());
1344 dc->SetBkColor (backColor.GetOSRep ());
1347#if qStroika_Foundation_Common_Platform_MacOS
1349 Rect rr = AsQDRect (innerBoundsRect);
1353 PixMap** pm = MakePixMapFromDIB (dib);
1354 PixMap* pmPtr = *pm;
1355 GrafPtr destPort = *tablet;
1357 ::CopyBits (
reinterpret_cast<BitMap*
> (pmPtr), GetPortBitMapForCopyBits (destPort), &pmPtr->bounds, &rr, srcCopy,
nullptr);
1359 ::CopyBits (
reinterpret_cast<BitMap*
> (pmPtr), &destPort->portBits, &pmPtr->bounds, &rr, srcCopy,
nullptr);
1361 delete[] (
char*)pmPtr->baseAddr;
1362 ::DisposePixMap (pm);
1367 AssertNotNull (StandardDIBStyleMarker::sUnsupportedFormatPict);
1368 ::DrawPicture (StandardDIBStyleMarker::sUnsupportedFormatPict, &rr);
1370#elif qStroika_Foundation_Common_Platform_Windows
1372 const void* lpBits = Led_GetDIBBitsPointer (dib);
1374 ::StretchDIBits (dc->m_hDC, innerBoundsRect.left, innerBoundsRect.top, innerBoundsRect.GetWidth (), innerBoundsRect.GetHeight (), 0, 0,
1375 dibImageSize.h, dibImageSize.v, lpBits, dib, DIB_RGB_COLORS, SRCCOPY);
1379#if qStroika_Foundation_Common_Platform_MacOS
1380static PixMap** MakePixMapFromDIB (
const Led_DIB* dib)
1384 Led_Size dibImageSize = Led_GetDIBImageSize (dib);
1386 const BITMAPINFOHEADER& hdr = dib->bmiHeader;
1387 const RGBQUAD* srcCLUT = (
const RGBQUAD*)(((
const unsigned char*)dib) + Led_ByteSwapFromWindows (hdr.biSize));
1388 const unsigned char* srcBits = ((
const unsigned char*)srcCLUT) + Led_GetDIBPalletByteCount (dib);
1389 unsigned short bitCount = Led_ByteSwapFromWindows (hdr.biBitCount);
1390 size_t srcRowBytes = (((dibImageSize.h * bitCount + 31) & ~31) >> 3);
1392 if (bitCount != 8 and bitCount != 24) {
1394 throw UnsupportedFormat ();
1397 if (hdr.biCompression != 0) {
1399 throw UnsupportedFormat ();
1407 if (srcCLUT !=
nullptr) {
1408 size_t nColors = Led_ByteSwapFromWindows (hdr.biClrUsed);
1409 if (nColors > (1 << bitCount)) {
1410 throw UnsupportedFormat ();
1414 size_t dstBitCount = bitCount;
1415 if (bitCount == 24) {
1418 size_t dstRowBytes = ((((dstBitCount * dibImageSize.h) + 15) >> 4) << 1);
1419 unsigned char* newImageData =
new unsigned char[dstRowBytes * dibImageSize.v];
1422 PixMap** result = ::NewPixMap ();
1423 if (result ==
nullptr) {
1424 delete[] (
char*)newImageData;
1427 (*result)->bounds.top = 0;
1428 (*result)->bounds.left = 0;
1429 (*result)->bounds.bottom = dibImageSize.v;
1430 (*result)->bounds.right = dibImageSize.h;
1432 (*result)->baseAddr = Ptr (newImageData);
1436 (*result)->rowBytes = 0x8000 | dstRowBytes;
1437 (*result)->cmpCount = 1;
1438 (*result)->cmpSize = 8;
1439 (*result)->pixelType = chunky;
1440 (*result)->pixelSize = 8;
1444 (*result)->rowBytes = 0x8000 | dstRowBytes;
1445 (*result)->cmpCount = 3;
1446 (*result)->cmpSize = 8;
1447 (*result)->pixelType = RGBDirect;
1448 (*result)->pixelSize = 32;
1459 if (srcCLUT !=
nullptr) {
1460 size_t nColors = Led_ByteSwapFromWindows (hdr.biClrUsed);
1462 nColors = 1 << bitCount;
1464 Assert (nColors <= (1 << bitCount));
1466 CTabHandle newCLUT = (CTabHandle)::NewHandle (
sizeof (ColorTable) + (nColors - 1) *
sizeof (ColorSpec));
1467 if (newCLUT ==
nullptr) {
1468 delete[] (
char*)newImageData;
1469 ::DisposePixMap (result);
1472 (*newCLUT)->ctSeed = ::GetCTSeed ();
1473 (*newCLUT)->ctFlags = 0;
1474 (*newCLUT)->ctSize = nColors - 1;
1475 for (
size_t i = 0; i < nColors; ++i) {
1476 (*newCLUT)->ctTable[i].value = i;
1477 (*newCLUT)->ctTable[i].rgb.red = srcCLUT[i].rgbRed << 8;
1478 (*newCLUT)->ctTable[i].rgb.green = srcCLUT[i].rgbGreen << 8;
1479 (*newCLUT)->ctTable[i].rgb.blue = srcCLUT[i].rgbBlue << 8;
1481 if ((*result)->pmTable !=
nullptr) {
1482 ::DisposeCTable ((*result)->pmTable);
1484 (*result)->pmTable = newCLUT;
1485 ::CTabChanged (newCLUT);
1491 bool rowsReversed = (Led_ByteSwapFromWindows (hdr.biHeight) > 0);
1492 for (
size_t row = 0; row < dibImageSize.v; ++row) {
1493 const unsigned char* srcRow = srcBits + (rowsReversed ? (dibImageSize.v - row - 1) : row) * srcRowBytes;
1494 unsigned char* dstRow = newImageData + row * dstRowBytes;
1499 memcpy (dstRow, srcRow, min (srcRowBytes, dstRowBytes));
1503 for (
size_t col = 0; col < dibImageSize.h; ++col) {
1504 const unsigned char* srcCell = srcRow + 3 * col;
1505 unsigned char* dstCell = dstRow + 4 * col;
1506 unsigned char blueComp = *srcCell++;
1507 unsigned char greenComp = *srcCell++;
1508 unsigned char redComp = *srcCell++;
1510 *dstCell++ = redComp;
1511 *dstCell++ = greenComp;
1512 *dstCell++ = blueComp;
1518 memset (dstRow, 0, dstRowBytes);
#define RequireNotNull(p)
Logically halfway between std::array and std::vector; Smart 'direct memory array' - which when needed...
virtual size_t GetFlavorSize(Led_ClipFormat clipFormat) const =0
basic_string< SDKChar > SDKString
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...
void ThrowIfNull(const Private_::ConstVoidStar &p, const HRESULT &hr)
Template specialization for ThrowIfNull (), for thing being thrown HRESULT - really throw HRESULTErro...