DrawingSurface functions don't support alpha channels
That's not true. They just don't draw the alpha channel (that is the channel isn't
copied, it
is used) so if the surface is transparent then you get the pink haze.

Actually I encountered that exact problem with my custom dialog rendering, so I'm already doing this:
void DrawCharacter(this DrawingSurface*, Character *theCharacter) {
if (theCharacter == null) return;
ViewFrame *frame = Game.GetViewFrame(theCharacter.View, theCharacter.Loop, theCharacter.Frame);
DynamicSprite *sprite;
int graphic = frame.Graphic;
if (frame.Flipped) {
sprite = DynamicSprite.CreateFromExistingSprite(graphic, true);
sprite.Flip(eFlipLeftToRight);
}
if (theCharacter.Scaling != 100) {
int scale = theCharacter.Scaling;
if (sprite == null) sprite = DynamicSprite.CreateFromExistingSprite(graphic, true);
sprite.Resize((Game.SpriteWidth[graphic] * scale) / 100, (Game.SpriteHeight[graphic] * scale) / 100);
}
Region *rat = Region.GetAtRoomXY(theCharacter.x, theCharacter.y);
if ((rat != null) && (rat != region[0]) && (rat.TintEnabled)) {
if (sprite == null) sprite = DynamicSprite.CreateFromExistingSprite(graphic, true);
sprite.Tint(rat.TintRed, rat.TintGreen, rat.TintBlue, rat.TintSaturation, 100);
}
if (sprite != null) graphic = sprite.Graphic;
this.DrawImage(theCharacter.x - (Game.SpriteWidth[graphic] / 2) - GetViewportX(), theCharacter.y - Game.SpriteHeight[graphic] - theCharacter.z - GetViewportY(), graphic, theCharacter.Transparency);
if (sprite != null) sprite.Delete();
}
void DrawObject(this DrawingSurface*, Object *theObject) {
if ((theObject == null) || (!theObject.Graphic)) return;
DynamicSprite *sprite;
int graphic = theObject.Graphic;
if (theObject.View) {
ViewFrame *frame = Game.GetViewFrame(theObject.View, theObject.Loop, theObject.Frame);
if (frame.Flipped) {
sprite = DynamicSprite.CreateFromExistingSprite(frame.Graphic, true);
sprite.Flip(eFlipLeftToRight);
}
}
int scale = GetScalingAt(theObject.X, theObject.Y);
if ((!theObject.IgnoreScaling) && (scale != 100)) {
if (sprite == null) sprite = DynamicSprite.CreateFromExistingSprite(graphic, true);
sprite.Resize((Game.SpriteWidth[graphic] * scale) / 100, (Game.SpriteHeight[graphic] * scale) / 100);
}
Region *rat = Region.GetAtRoomXY(theObject.X, theObject.Y);
if ((rat != null) && (rat != region[0]) && (rat.TintEnabled)) {
if (sprite == null) sprite = DynamicSprite.CreateFromExistingSprite(graphic, true);
sprite.Tint(rat.TintRed, rat.TintGreen, rat.TintBlue, rat.TintSaturation, 100);
}
if (sprite != null) graphic = sprite.Graphic;
this.DrawImage(theObject.X, theObject.Y - Game.SpriteHeight[graphic], graphic, theObject.Transparency);
if (sprite != null) sprite.Delete();
}
function dialog_options_render(DialogOptionsRenderingInfo *info) {
// Clear the area
info.Surface.Clear();
// AGS doesn't currently support alpha channeled DrawingSurface transparency. This should flatten it
DynamicSprite *sprite = DynamicSprite.CreateFromBackground();
DrawingSurface *surface = sprite.GetDrawingSurface();
int i = 0;
while ((i < Game.CharacterCount) || (i < Room.ObjectCount)) {
if ((i < Game.CharacterCount) && (character[i].Room == player.Room)) surface.DrawCharacter(character[i]);
if (i < Room.ObjectCount) {
surface.DrawObject(object[i]);
if (object[i].Graphic) {
int scale = GetScalingAt(object[i].X, object[i].Y);
int ow = (Game.SpriteWidth[object[i].Graphic] * scale) / 100;
int oh = (Game.SpriteHeight[object[i].Graphic] * scale) / 100;
if (object[i].IgnoreScaling) {
ow = Game.SpriteWidth[object[i].Graphic];
oh = Game.SpriteHeight[object[i].Graphic];
}
int ox1 = object[i].X;
int ox2 = ox1 + ow;
int j = 0;
while (j < Game.CharacterCount) {
if (character[j].Room == player.Room) {
ViewFrame *frame = Game.GetViewFrame(character[j].View, character[j].Loop, character[j].Frame);
int cw = (Game.SpriteWidth[frame.Graphic] * character[j].Scaling) / 100;
int cx1 = character[j].x - (cw / 2);
if ((((cx1 + cw) >= ox1) && (cx1 <= ox2)) && (character[j].y > object[i].Baseline)) surface.DrawCharacter(character[j]);
}
j++;
}
}
}
i++;
}
surface.Release();
sprite.Crop(info.X, info.Y, info.Width, info.Height);
info.Surface.DrawImage(0, 0, sprite.Graphic);
sprite.Delete();
i = 1;
int ypos = 0;
// Render all the options that are enabled
// ...
}
Basically I have to take a copy of the background, merge in all the characters and objects, crop the image, and then draw the dialog options on top of that. The reason I can't use a screenshot is because it would catch the mouse cursor as it moves around, and if the text changed (i.e. scrolling, turning an option on/off) it would catch the old text as well.
So basically if you want to get AA text with LA style speech you
could do it by finding the bounding box for the text and applying the same process.
I just didn't know if there was an easier way. I'm already discovering just how much work actually goes into these game things.

Oh and though this does take into account flipped frames, it blatantly ignores z-orders, baselines, scaling, etc. So if those are important to you, you may want to revise the code appropriately.
I've modified the code now so it respects character z-orders, baselines, scaling, and transparency. It respects region tinting but I can't think of a way to use character, object, or ambient tinting.